improve multi-config support

This commit is contained in:
Yuhang Zhao 2023-06-26 11:16:01 +08:00
parent ea37ad2a4b
commit 22059c148e
1 changed files with 100 additions and 34 deletions

View File

@ -55,10 +55,12 @@ function(setup_project)
if(POLICY CMP0141)
cmake_policy(SET CMP0141 NEW)
endif()
if(MSVC)
# Introduced by CMP0141.
if(NOT DEFINED CMAKE_MSVC_DEBUG_INFORMATION_FORMAT)
set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$<$<CONFIG:Debug,RelWithDebInfo>:ProgramDatabase>" PARENT_SCOPE)
endif()
endif()
# The if() command supports path comparisons using PATH_EQUAL operator.
if(POLICY CMP0139)
cmake_policy(SET CMP0139 NEW)
@ -131,10 +133,12 @@ function(setup_project)
if(POLICY CMP0091)
cmake_policy(SET CMP0091 NEW)
endif()
if(MSVC)
# Introduced by CMP0091.
if(NOT DEFINED CMAKE_MSVC_RUNTIME_LIBRARY)
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL" PARENT_SCOPE)
endif()
endif()
# Add correct link flags for PIE (Position Independent Executable).
if(POLICY CMP0083)
cmake_policy(SET CMP0083 NEW)
@ -156,52 +160,108 @@ function(setup_project)
endif()
else()
set(CMAKE_DEBUG_POSTFIX "_debug" PARENT_SCOPE)
endif()
endif()
if(APPLE)
if(NOT DEFINED CMAKE_FRAMEWORK_MULTI_CONFIG_POSTFIX_DEBUG)
set(CMAKE_FRAMEWORK_MULTI_CONFIG_POSTFIX_DEBUG "_debug" PARENT_SCOPE)
endif()
endif()
set(__dir_suffix "")
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(__dir_suffix "64")
endif()
include(GNUInstallDirs)
set(__bin_dir "${CMAKE_INSTALL_BINDIR}${__dir_suffix}")
set(__lib_dir "${CMAKE_INSTALL_LIBDIR}${__dir_suffix}")
set(__ar_dir "${CMAKE_INSTALL_LIBDIR}${__dir_suffix}")
if(DEFINED CMAKE_BUILD_TYPE AND NOT "x${CMAKE_BUILD_TYPE}" STREQUAL "x")
if(NOT DEFINED CMAKE_RUNTIME_OUTPUT_DIRECTORY)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}" PARENT_SCOPE)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${__bin_dir}" PARENT_SCOPE)
endif()
if(NOT DEFINED CMAKE_LIBRARY_OUTPUT_DIRECTORY)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}" PARENT_SCOPE)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${__lib_dir}" PARENT_SCOPE)
endif()
if(NOT DEFINED CMAKE_ARCHIVE_OUTPUT_DIRECTORY)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}" PARENT_SCOPE)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${__ar_dir}" PARENT_SCOPE)
endif()
elseif(DEFINED CMAKE_CONFIGURATION_TYPES AND NOT "x${CMAKE_CONFIGURATION_TYPES}" STREQUAL "x")
foreach(__type ${CMAKE_CONFIGURATION_TYPES})
string(TOUPPER ${__type} __type_upper)
string(TOLOWER ${__type} __type_lower)
set(__bin_var CMAKE_RUNTIME_OUTPUT_DIRECTORY_${__type_upper})
if(NOT DEFINED ${__bin_var})
set(${__bin_var} "${PROJECT_BINARY_DIR}/${__bin_dir}/${__type_lower}" PARENT_SCOPE)
endif()
set(__lib_var CMAKE_LIBRARY_OUTPUT_DIRECTORY_${__type_upper})
if(NOT DEFINED ${__lib_var})
set(${__lib_var} "${PROJECT_BINARY_DIR}/${__lib_dir}/${__type_lower}" PARENT_SCOPE)
endif()
set(__ar_var CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${__type_upper})
if(NOT DEFINED ${__ar_var})
set(${__ar_var} "${PROJECT_BINARY_DIR}/${__ar_dir}/${__type_lower}" PARENT_SCOPE)
endif()
endforeach()
endif()
if(NOT DEFINED CMAKE_INCLUDE_CURRENT_DIR)
set(CMAKE_INCLUDE_CURRENT_DIR ON PARENT_SCOPE)
endif()
if(NOT DEFINED CMAKE_LINK_DEPENDS_NO_SHARED)
set(CMAKE_LINK_DEPENDS_NO_SHARED ON PARENT_SCOPE)
endif()
if(NOT DEFINED CMAKE_POSITION_INDEPENDENT_CODE)
set(CMAKE_POSITION_INDEPENDENT_CODE ON PARENT_SCOPE)
endif()
include(CheckPIESupported)
check_pie_supported() # This function must be called to ensure CMake adds -fPIE to the linker flags.
if(NOT DEFINED CMAKE_VISIBILITY_INLINES_HIDDEN)
set(CMAKE_VISIBILITY_INLINES_HIDDEN ON PARENT_SCOPE)
endif()
if(NOT DEFINED CMAKE_INSTALL_RPATH_USE_LINK_PATH)
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH ON PARENT_SCOPE)
endif()
if(APPLE)
if(NOT DEFINED CMAKE_MACOSX_RPATH)
set(CMAKE_MACOSX_RPATH ON PARENT_SCOPE)
endif()
else()
set(CMAKE_INSTALL_RPATH "$ORIGIN/../${CMAKE_INSTALL_LIBDIR}" PARENT_SCOPE)
if(NOT DEFINED CMAKE_INSTALL_RPATH)
# FIXME: how to detect the actual library installation path?
#set(CMAKE_INSTALL_RPATH "$ORIGIN/../${CMAKE_INSTALL_LIBDIR}" PARENT_SCOPE)
endif()
endif()
if(PROJ_ARGS_QT_PROJECT)
if(NOT DEFINED CMAKE_AUTOUIC)
set(CMAKE_AUTOUIC ON PARENT_SCOPE)
endif()
if(NOT DEFINED CMAKE_AUTOMOC)
set(CMAKE_AUTOMOC ON PARENT_SCOPE)
endif()
if(NOT DEFINED CMAKE_AUTORCC)
set(CMAKE_AUTORCC ON PARENT_SCOPE)
endif()
endif()
if(PROJ_ARGS_QML_IMPORT_DIR)
list(APPEND QML_IMPORT_PATH "${PROJ_ARGS_QML_IMPORT_DIR}")
list(REMOVE_DUPLICATES QML_IMPORT_PATH)
set(QML_IMPORT_PATH ${QML_IMPORT_PATH} CACHE STRING "Qt Creator extra QML import paths" FORCE)
endif()
foreach(__lang ${PROJ_ARGS_LANGUAGES})
if(__lang STREQUAL "C")
string(TOUPPER ${__lang} __lang_upper)
if(__lang_upper STREQUAL "C")
enable_language(C)
if(NOT DEFINED CMAKE_C_STANDARD)
set(CMAKE_C_STANDARD 11 PARENT_SCOPE)
endif()
if(NOT DEFINED CMAKE_C_STANDARD_REQUIRED)
set(CMAKE_C_STANDARD_REQUIRED ON PARENT_SCOPE)
endif()
if(NOT DEFINED CMAKE_C_EXTENSIONS)
set(CMAKE_C_EXTENSIONS OFF PARENT_SCOPE)
endif()
if(NOT DEFINED CMAKE_C_VISIBILITY_PRESET)
set(CMAKE_C_VISIBILITY_PRESET "hidden" PARENT_SCOPE)
endif()
if(MSVC)
if(NOT ("x${CMAKE_C_FLAGS}" STREQUAL "x"))
string(REGEX REPLACE "[-|/]w " " " CMAKE_C_FLAGS ${CMAKE_C_FLAGS})
@ -260,14 +320,20 @@ function(setup_project)
set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} PARENT_SCOPE)
set(CMAKE_C_FLAGS_RELEASE ${CMAKE_C_FLAGS_RELEASE} PARENT_SCOPE)
endif()
elseif(__lang STREQUAL "CXX")
elseif(__lang_upper STREQUAL "CXX")
enable_language(CXX)
if(NOT DEFINED CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 20 PARENT_SCOPE)
endif()
if(NOT DEFINED CMAKE_CXX_STANDARD_REQUIRED)
set(CMAKE_CXX_STANDARD_REQUIRED ON PARENT_SCOPE)
endif()
if(NOT DEFINED CMAKE_CXX_EXTENSIONS)
set(CMAKE_CXX_EXTENSIONS OFF PARENT_SCOPE)
endif()
if(NOT DEFINED CMAKE_CXX_VISIBILITY_PRESET)
set(CMAKE_CXX_VISIBILITY_PRESET "hidden" PARENT_SCOPE)
endif()
if(MSVC)
if(NOT ("x${CMAKE_CXX_FLAGS}" STREQUAL "x"))
string(REGEX REPLACE "[-|/]GR-? " " " CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
@ -348,7 +414,7 @@ function(setup_project)
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} PARENT_SCOPE)
set(CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE} PARENT_SCOPE)
endif()
elseif(__lang STREQUAL "RC")
elseif(__lang_upper STREQUAL "RC")
if(WIN32)
enable_language(RC)
endif()