bd34963002
CMAKE_SHARED_LIBRARY_<lang>_FLAGS has flags on various platforms for a variety of purposes that are correlated with shared libraries but not exclusive to them. Refactor generation of these flags to use new purpose-specific platform variables CMAKE_<lang>_COMPILE_OPTIONS_DLL CMAKE_<lang>_COMPILE_OPTIONS_PIC CMAKE_<lang>_COMPILE_OPTIONS_PIE Activate the DLL flags specifically for shared libraries. Add a new POSITION_INDEPENDENT_CODE target property to activate PIC/PIE flags, and default to true for shared libraries to preserve default behavior. Initialize the new property from CMAKE_POSITION_INDEPENDENT_CODE to allow easy global configuration in projects. Although the default behavior is unchanged by this refactoring, the new approach ignores CMAKE_SHARED_LIBRARY_<lang>_FLAGS completely. We must leave it set in case projects reference the value. Furthermore, if a project modifies CMAKE_SHARED_LIBRARY_<lang>_FLAGS it expects the new value to be used. Add policy CMP0018 to handle compatibility with projects that modify this platform variable. Add a PositionIndependentCode test on platforms where we can get meaningful results.
38 lines
888 B
CMake
38 lines
888 B
CMake
|
|
set(CMAKE_POSITION_INDEPENDENT_CODE True)
|
|
|
|
add_executable(test_target_executable_global
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/../pic_main.cpp"
|
|
)
|
|
|
|
add_library(test_target_shared_library_global
|
|
SHARED "${CMAKE_CURRENT_SOURCE_DIR}/../pic_lib.cpp"
|
|
)
|
|
set_target_properties(test_target_shared_library_global
|
|
PROPERTIES DEFINE_SYMBOL PIC_TEST_BUILD_DLL
|
|
)
|
|
|
|
add_library(test_target_static_library_global
|
|
STATIC "${CMAKE_CURRENT_SOURCE_DIR}/../pic_lib.cpp"
|
|
)
|
|
set_target_properties(test_target_static_library_global
|
|
PROPERTIES COMPILE_DEFINITIONS PIC_TEST_STATIC_BUILD
|
|
)
|
|
|
|
|
|
file(READ
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/../pic_test.h"
|
|
PIC_HEADER_CONTENT
|
|
)
|
|
|
|
check_cxx_source_compiles(
|
|
"
|
|
${PIC_HEADER_CONTENT}
|
|
int main(int,char**) { return 0; }\n"
|
|
PIC_TRY_COMPILE_RESULT
|
|
)
|
|
|
|
if (NOT PIC_TRY_COMPILE_RESULT)
|
|
message(SEND_ERROR "TRY_COMPILE with content requiring __PIC__ failed. ${OUTPUT}")
|
|
endif()
|