Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
gaoqiong
pybind11
Commits
9fb50c56
Commit
9fb50c56
authored
May 27, 2016
by
Dean Moldovan
Browse files
Add LTO and strip to pybind11_add_module
parent
24ddf4b3
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
51 additions
and
71 deletions
+51
-71
CMakeLists.txt
CMakeLists.txt
+49
-2
example/CMakeLists.txt
example/CMakeLists.txt
+2
-69
No files found.
CMakeLists.txt
View file @
9fb50c56
...
@@ -59,14 +59,14 @@ function(pybind11_add_module target_name)
...
@@ -59,14 +59,14 @@ function(pybind11_add_module target_name)
# missing symbols, but that's perfectly fine -- they will be resolved at
# missing symbols, but that's perfectly fine -- they will be resolved at
# import time.
# import time.
if
(
MSVC
)
if
(
MSVC
)
target_link_libraries
(
${
target_name
}
${
PYTHON_LIBRARIES
}
)
target_link_libraries
(
${
target_name
}
PRIVATE
${
PYTHON_LIBRARIES
}
)
elseif
(
APPLE
)
elseif
(
APPLE
)
# Make sure OS X does not have any issues with missing symbols
# Make sure OS X does not have any issues with missing symbols
target_link_libraries
(
${
target_name
}
PRIVATE
"-undefined dynamic_lookup"
)
target_link_libraries
(
${
target_name
}
PRIVATE
"-undefined dynamic_lookup"
)
endif
()
endif
()
# Make sure C++11/14 are enabled
if
(
NOT MSVC
)
if
(
NOT MSVC
)
# Make sure C++11/14 are enabled
check_cxx_compiler_flag
(
"-std=c++14"
HAS_CPP14_FLAG
)
check_cxx_compiler_flag
(
"-std=c++14"
HAS_CPP14_FLAG
)
check_cxx_compiler_flag
(
"-std=c++11"
HAS_CPP11_FLAG
)
check_cxx_compiler_flag
(
"-std=c++11"
HAS_CPP11_FLAG
)
...
@@ -78,11 +78,58 @@ function(pybind11_add_module target_name)
...
@@ -78,11 +78,58 @@ function(pybind11_add_module target_name)
message
(
FATAL_ERROR
"Unsupported compiler -- pybind11 requires C++11 support!"
)
message
(
FATAL_ERROR
"Unsupported compiler -- pybind11 requires C++11 support!"
)
endif
()
endif
()
# Enable link time optimization and set the default symbol
# visibility to hidden (very important to obtain small binaries)
string
(
TOUPPER
"
${
CMAKE_BUILD_TYPE
}
"
U_CMAKE_BUILD_TYPE
)
string
(
TOUPPER
"
${
CMAKE_BUILD_TYPE
}
"
U_CMAKE_BUILD_TYPE
)
if
(
NOT
${
U_CMAKE_BUILD_TYPE
}
MATCHES DEBUG
)
if
(
NOT
${
U_CMAKE_BUILD_TYPE
}
MATCHES DEBUG
)
# Check for Link Time Optimization support (GCC/Clang)
check_cxx_compiler_flag
(
"-flto"
HAS_LTO_FLAG
)
if
(
HAS_LTO_FLAG
)
target_compile_options
(
${
target_name
}
PRIVATE -flto
)
endif
()
# Intel equivalent to LTO is called IPO
if
(
CMAKE_CXX_COMPILER_ID MATCHES
"Intel"
)
check_cxx_compiler_flag
(
"-ipo"
HAS_IPO_FLAG
)
if
(
HAS_IPO_FLAG
)
target_compile_options
(
${
target_name
}
PRIVATE -ipo
)
endif
()
endif
()
# Default symbol visibility
# Default symbol visibility
target_compile_options
(
${
target_name
}
PRIVATE
"-fvisibility=hidden"
)
target_compile_options
(
${
target_name
}
PRIVATE
"-fvisibility=hidden"
)
# Strip unnecessary sections of the binary on Linux/Mac OS
if
(
CMAKE_STRIP
)
if
(
APPLE
)
add_custom_command
(
TARGET
${
target_name
}
POST_BUILD
COMMAND
${
CMAKE_STRIP
}
-u -r $<TARGET_FILE:
${
target_name
}
>
)
else
()
add_custom_command
(
TARGET
${
target_name
}
POST_BUILD
COMMAND
${
CMAKE_STRIP
}
$<TARGET_FILE:
${
target_name
}
>
)
endif
()
endif
()
endif
()
elseif
(
MSVC
)
# /MP enables multithreaded builds (relevant when there are many files), /bigobj is
# needed for bigger binding projects due to the limit to 64k addressable sections
target_compile_options
(
${
target_name
}
PRIVATE /MP /bigobj
)
# Enforce link time code generation on MSVC, except in debug mode
target_compile_options
(
${
target_name
}
PRIVATE $<$<NOT:$<CONFIG:Debug>>:/GL>
)
# Fancy generator expressions don't work with linker flags, for reasons unknown
set_property
(
TARGET
${
target_name
}
APPEND_STRING PROPERTY LINK_FLAGS_RELEASE /LTCG
)
set_property
(
TARGET
${
target_name
}
APPEND_STRING PROPERTY LINK_FLAGS_MINSIZEREL /LTCG
)
set_property
(
TARGET
${
target_name
}
APPEND_STRING PROPERTY LINK_FLAGS_RELWITHDEBINFO /LTCG
)
endif
()
endif
()
endfunction
()
# Compile with compiler warnings turned on
function
(
pybind11_turn_on_warnings target_name
)
if
(
MSVC
)
target_compile_options
(
${
target_name
}
PRIVATE /W4
)
else
()
target_compile_options
(
${
target_name
}
PRIVATE -Wall -Wextra
)
endif
()
endif
()
endfunction
()
endfunction
()
...
...
example/CMakeLists.txt
View file @
9fb50c56
include
(
CheckCXXCompilerFlag
)
# Set a default build configuration if none is specified. 'MinSizeRel' produces the smallest binaries
# Set a default build configuration if none is specified. 'MinSizeRel' produces the smallest binaries
if
(
NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES
)
if
(
NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES
)
message
(
STATUS
"Setting build type to 'MinSizeRel' as none was specified."
)
message
(
STATUS
"Setting build type to 'MinSizeRel' as none was specified."
)
...
@@ -7,39 +5,6 @@ if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
...
@@ -7,39 +5,6 @@ if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
set_property
(
CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
"Debug"
"Release"
set_property
(
CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
"Debug"
"Release"
"MinSizeRel"
"RelWithDebInfo"
)
"MinSizeRel"
"RelWithDebInfo"
)
endif
()
endif
()
string
(
TOUPPER
"
${
CMAKE_BUILD_TYPE
}
"
U_CMAKE_BUILD_TYPE
)
if
(
CMAKE_CXX_COMPILER_ID MATCHES
"Clang"
OR CMAKE_CXX_COMPILER_ID MATCHES
"GNU"
OR CMAKE_CXX_COMPILER_ID MATCHES
"Intel"
)
# Enable link time optimization and set the default symbol
# visibility to hidden (very important to obtain small binaries)
if
(
NOT
${
U_CMAKE_BUILD_TYPE
}
MATCHES DEBUG
)
# Check for Link Time Optimization support
# (GCC/Clang)
CHECK_CXX_COMPILER_FLAG
(
"-flto"
HAS_LTO_FLAG
)
if
(
HAS_LTO_FLAG
)
set
(
CMAKE_CXX_FLAGS
"
${
CMAKE_CXX_FLAGS
}
-flto"
)
endif
()
# Intel equivalent to LTO is called IPO
if
(
CMAKE_CXX_COMPILER_ID MATCHES
"Intel"
)
CHECK_CXX_COMPILER_FLAG
(
"-ipo"
HAS_IPO_FLAG
)
if
(
HAS_IPO_FLAG
)
set
(
CMAKE_CXX_FLAGS
"
${
CMAKE_CXX_FLAGS
}
-ipo"
)
endif
()
endif
()
endif
()
endif
()
# Compile with compiler warnings turned on
if
(
MSVC
)
if
(
CMAKE_CXX_FLAGS MATCHES
"/W[0-4]"
)
string
(
REGEX REPLACE
"/W[0-4]"
"/W4"
CMAKE_CXX_FLAGS
"
${
CMAKE_CXX_FLAGS
}
"
)
else
()
set
(
CMAKE_CXX_FLAGS
"
${
CMAKE_CXX_FLAGS
}
/W4"
)
endif
()
elseif
(
"
${
CMAKE_CXX_COMPILER_ID
}
"
MATCHES
"Clang"
OR
"
${
CMAKE_CXX_COMPILER_ID
}
"
MATCHES
"GNU"
)
set
(
CMAKE_CXX_FLAGS
"
${
CMAKE_CXX_FLAGS
}
-Wall -Wextra"
)
endif
()
set
(
PYBIND11_EXAMPLES
set
(
PYBIND11_EXAMPLES
example1.cpp
example1.cpp
...
@@ -74,6 +39,8 @@ endif()
...
@@ -74,6 +39,8 @@ endif()
# Create the binding library
# Create the binding library
pybind11_add_module
(
example example.cpp
${
PYBIND11_EXAMPLES
}
)
pybind11_add_module
(
example example.cpp
${
PYBIND11_EXAMPLES
}
)
pybind11_turn_on_warnings
(
example
)
if
(
EIGEN3_FOUND
)
if
(
EIGEN3_FOUND
)
target_include_directories
(
example PRIVATE
${
EIGEN3_INCLUDE_DIR
}
)
target_include_directories
(
example PRIVATE
${
EIGEN3_INCLUDE_DIR
}
)
target_compile_definitions
(
example PRIVATE -DPYBIND11_TEST_EIGEN
)
target_compile_definitions
(
example PRIVATE -DPYBIND11_TEST_EIGEN
)
...
@@ -90,40 +57,6 @@ foreach(CompilerFlag ${CompilerFlags})
...
@@ -90,40 +57,6 @@ foreach(CompilerFlag ${CompilerFlags})
set_target_properties
(
example PROPERTIES
${
CompilerFlag
}
${
PROJECT_SOURCE_DIR
}
/example
)
set_target_properties
(
example PROPERTIES
${
CompilerFlag
}
${
PROJECT_SOURCE_DIR
}
/example
)
endforeach
()
endforeach
()
if
(
WIN32
)
if
(
MSVC
)
# /MP enables multithreaded builds (relevant when there are many files), /bigobj is
# needed for bigger binding projects due to the limit to 64k addressable sections
set_property
(
TARGET example APPEND PROPERTY COMPILE_OPTIONS /MP /bigobj
)
# Enforce size-based optimization and link time code generation on MSVC
# (~30% smaller binaries in experiments); do nothing in debug mode.
set_property
(
TARGET example APPEND PROPERTY COMPILE_OPTIONS
"$<$<CONFIG:Release>:/Os>"
"$<$<CONFIG:Release>:/GL>"
"$<$<CONFIG:MinSizeRel>:/Os>"
"$<$<CONFIG:MinSizeRel>:/GL>"
"$<$<CONFIG:RelWithDebInfo>:/Os>"
"$<$<CONFIG:RelWithDebInfo>:/GL>"
)
set_property
(
TARGET example APPEND_STRING PROPERTY LINK_FLAGS_RELEASE
"/LTCG "
)
set_property
(
TARGET example APPEND_STRING PROPERTY LINK_FLAGS_MINSIZEREL
"/LTCG "
)
set_property
(
TARGET example APPEND_STRING PROPERTY LINK_FLAGS_RELWITHDEBINFO
"/LTCG "
)
endif
()
elseif
(
UNIX
)
# Optimize for a small binary size
if
(
NOT
${
U_CMAKE_BUILD_TYPE
}
MATCHES DEBUG
)
set_target_properties
(
example PROPERTIES COMPILE_FLAGS
"-Os"
)
endif
()
# Strip unnecessary sections of the binary on Linux/Mac OS
if
(
APPLE
)
if
(
NOT
${
U_CMAKE_BUILD_TYPE
}
MATCHES DEBUG
)
add_custom_command
(
TARGET example POST_BUILD COMMAND strip -u -r $<TARGET_FILE:example>
)
endif
()
else
()
if
(
NOT
${
U_CMAKE_BUILD_TYPE
}
MATCHES DEBUG
)
add_custom_command
(
TARGET example POST_BUILD COMMAND strip $<TARGET_FILE:example>
)
endif
()
endif
()
endif
()
set
(
RUN_TEST
${
PYTHON_EXECUTABLE
}
${
CMAKE_CURRENT_SOURCE_DIR
}
/run_test.py
)
set
(
RUN_TEST
${
PYTHON_EXECUTABLE
}
${
CMAKE_CURRENT_SOURCE_DIR
}
/run_test.py
)
if
(
MSVC OR CMAKE_CXX_COMPILER_ID MATCHES
"Intel"
)
if
(
MSVC OR CMAKE_CXX_COMPILER_ID MATCHES
"Intel"
)
set
(
RUN_TEST
${
RUN_TEST
}
--relaxed
)
set
(
RUN_TEST
${
RUN_TEST
}
--relaxed
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment