From 8c4dfd7a70128ff6d7d2d4e698d1ab0aaa9b86be Mon Sep 17 00:00:00 2001 From: Sam Edwards Date: Sat, 19 Jan 2019 13:22:20 -0700 Subject: [PATCH] CMake: Move compiler flag detection to its own file --- CMakeLists.txt | 107 +----------------------------------- dtool/CompilerFlags.cmake | 113 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+), 106 deletions(-) create mode 100644 dtool/CompilerFlags.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 6a24f41bbf..aec7d85a2b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,121 +10,16 @@ unset(_version) enable_testing() -# Panda3D is now a C++11 project. Newer versions of CMake support this out of -# the box; for older versions we take a shot in the dark: -if(CMAKE_VERSION VERSION_LESS "3.1") - include(CheckCXXCompilerFlag) - check_cxx_compiler_flag("-std=gnu++11" COMPILER_SUPPORTS_CXX11) - if(COMPILER_SUPPORTS_CXX11) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11") - else() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++0x") - endif() -else() - set(CMAKE_CXX_STANDARD 11) -endif() - # Add generic modules to cmake module path, # and add Panda3D specific modules to cmake module path set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/modules/") set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/macros/") -# Set certain CMake flags we expect -set(CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE ON) -set(CMAKE_INCLUDE_CURRENT_DIR ON) - -# Set up the output directory structure, mimicking that of makepanda -set(CMAKE_BINARY_DIR "${CMAKE_BINARY_DIR}/cmake") -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin") -set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib") -set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib") -set(MODULE_DESTINATION "lib") - -# Runtime code assumes that dynamic modules have a "lib" prefix; Windows -# assumes that debug libraries have a _d suffix. -set(CMAKE_SHARED_MODULE_PREFIX "lib") -if(WIN32) - set(CMAKE_DEBUG_POSTFIX "_d") - - # Windows uses libfoo.lib for static libraries and foo.lib/dll for dynamic. - set(CMAKE_STATIC_LIBRARY_PREFIX "lib") - - # On Windows, modules (DLLs) are located in bin; lib is just for .lib files - set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin") - if(BUILD_SHARED_LIBS) - set(MODULE_DESTINATION "bin") - endif() -endif() - -# Set warning levels -if(MSVC) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3") -else() - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") -endif() -if(NOT "x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xMSVC") - set(disable_flags "-Wno-unused-function -Wno-unused-parameter") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${disable_flags}") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${disable_flags} -Wno-reorder") - set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wno-unused-variable") - set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -Wno-unused-variable") - set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} -Wno-unused-variable") - - if(MSVC) - # Clang behaving as MSVC - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-command-line-argument") - set(CMAKE_CXX_FLAGS - "${CMAKE_CXX_FLAGS} -Wno-microsoft-template -Wno-unused-command-line-argument") - endif() -endif() -if(WIN32) - add_definitions(-D_CRT_SECURE_NO_WARNINGS) -endif() - -# CMake will often pass -rdynamic when linking executables as a convenience for -# projects that might forget when to use ENABLE_EXPORTS. This is preposterous, -# since it prevents the linker from removing symbols unneeded by the executable -# and stops us from identifying cases where ENABLE_EXPORTS is needed. -set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "") -set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "") - -# As long as we're figuring out compiler flags, figure out the flags for -# turning C++ exception support on and off -include(CheckCXXCompilerFlag) -if(MSVC) - set(cxx_exceptions_on "/EHsc") - set(cxx_exceptions_off "/D_HAS_EXCEPTIONS=0") -else() - check_cxx_compiler_flag("-fno-exceptions" COMPILER_SUPPORTS_FEXCEPTIONS) - if(COMPILER_SUPPORTS_FEXCEPTIONS) - set(cxx_exceptions_on "-fexceptions") - set(cxx_exceptions_off "-fno-exceptions") - else() - set(cxx_exceptions_on) - set(cxx_exceptions_off) - endif() -endif() -set(cxx_exceptions_property "$>") -add_compile_options( - "$<${cxx_exceptions_property}:${cxx_exceptions_on}>" - "$<$:${cxx_exceptions_off}>") - -# We should use -fvisibility=hidden everywhere, as it makes sure we think -# about what symbols really should be exposed externally. For more info, see: -# https://gcc.gnu.org/wiki/Visibility -if(NOT MSVC) - check_cxx_compiler_flag("-fvisibility=hidden" COMPILER_SUPPORTS_FVISIBILITY_HIDDEN) - if(COMPILER_SUPPORTS_FVISIBILITY_HIDDEN) - add_compile_options("-fvisibility=hidden") - endif() -endif() - # Include global modules needed for configure scripts include(PackageConfig) # Defines package_option # Configure Panda3D +include(dtool/CompilerFlags.cmake) include(dtool/PandaVersion.cmake) include(dtool/Package.cmake) include(dtool/Config.cmake) diff --git a/dtool/CompilerFlags.cmake b/dtool/CompilerFlags.cmake new file mode 100644 index 0000000000..dd7cfd8d6f --- /dev/null +++ b/dtool/CompilerFlags.cmake @@ -0,0 +1,113 @@ +# +# CompilerFlags.cmake +# +# This file sets up various compiler flags (warning levels, turning off options +# we don't need, etc.) It must be included directly from the root +# CMakeLists.txt, due to its use of set(...) +# + +include(CheckCXXCompilerFlag) + +# Panda3D is now a C++11 project. Newer versions of CMake support this out of +# the box; for older versions we take a shot in the dark: +if(CMAKE_VERSION VERSION_LESS "3.1") + check_cxx_compiler_flag("-std=gnu++11" COMPILER_SUPPORTS_CXX11) + if(COMPILER_SUPPORTS_CXX11) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11") + else() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++0x") + endif() +else() + set(CMAKE_CXX_STANDARD 11) +endif() + +# Set certain CMake flags we expect +set(CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE ON) +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +# Set up the output directory structure, mimicking that of makepanda +set(CMAKE_BINARY_DIR "${CMAKE_BINARY_DIR}/cmake") +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin") +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib") +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib") +set(MODULE_DESTINATION "lib") + +# Runtime code assumes that dynamic modules have a "lib" prefix; Windows +# assumes that debug libraries have a _d suffix. +set(CMAKE_SHARED_MODULE_PREFIX "lib") +if(WIN32) + set(CMAKE_DEBUG_POSTFIX "_d") + + # Windows uses libfoo.lib for static libraries and foo.lib/dll for dynamic. + set(CMAKE_STATIC_LIBRARY_PREFIX "lib") + + # On Windows, modules (DLLs) are located in bin; lib is just for .lib files + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin") + if(BUILD_SHARED_LIBS) + set(MODULE_DESTINATION "bin") + endif() +endif() + +# Set warning levels +if(MSVC) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3") +else() + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") +endif() +if(NOT "x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xMSVC") + set(disable_flags "-Wno-unused-function -Wno-unused-parameter") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${disable_flags}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${disable_flags} -Wno-reorder") + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wno-unused-variable") + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -Wno-unused-variable") + set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} -Wno-unused-variable") + + if(MSVC) + # Clang behaving as MSVC + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-command-line-argument") + set(CMAKE_CXX_FLAGS + "${CMAKE_CXX_FLAGS} -Wno-microsoft-template -Wno-unused-command-line-argument") + endif() +endif() +if(WIN32) + add_definitions(-D_CRT_SECURE_NO_WARNINGS) +endif() + +# CMake will often pass -rdynamic when linking executables as a convenience for +# projects that might forget when to use ENABLE_EXPORTS. This is preposterous, +# since it prevents the linker from removing symbols unneeded by the executable +# and stops us from identifying cases where ENABLE_EXPORTS is needed. +set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "") +set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "") + +# As long as we're figuring out compiler flags, figure out the flags for +# turning C++ exception support on and off +if(MSVC) + set(cxx_exceptions_on "/EHsc") + set(cxx_exceptions_off "/D_HAS_EXCEPTIONS=0") +else() + check_cxx_compiler_flag("-fno-exceptions" COMPILER_SUPPORTS_FEXCEPTIONS) + if(COMPILER_SUPPORTS_FEXCEPTIONS) + set(cxx_exceptions_on "-fexceptions") + set(cxx_exceptions_off "-fno-exceptions") + else() + set(cxx_exceptions_on) + set(cxx_exceptions_off) + endif() +endif() +set(cxx_exceptions_property "$>") +add_compile_options( + "$<${cxx_exceptions_property}:${cxx_exceptions_on}>" + "$<$:${cxx_exceptions_off}>") + +# We should use -fvisibility=hidden everywhere, as it makes sure we think +# about what symbols really should be exposed externally. For more info, see: +# https://gcc.gnu.org/wiki/Visibility +if(NOT MSVC) + check_cxx_compiler_flag("-fvisibility=hidden" COMPILER_SUPPORTS_FVISIBILITY_HIDDEN) + if(COMPILER_SUPPORTS_FVISIBILITY_HIDDEN) + add_compile_options("-fvisibility=hidden") + endif() +endif()