diff --git a/utils.cmake b/utils.cmake index 44afaa6..05374c4 100644 --- a/utils.cmake +++ b/utils.cmake @@ -55,9 +55,11 @@ function(setup_project) if(POLICY CMP0141) cmake_policy(SET CMP0141 NEW) endif() - # Introduced by CMP0141. - if(NOT DEFINED CMAKE_MSVC_DEBUG_INFORMATION_FORMAT) - set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$<$:ProgramDatabase>" PARENT_SCOPE) + if(MSVC) + # Introduced by CMP0141. + if(NOT DEFINED CMAKE_MSVC_DEBUG_INFORMATION_FORMAT) + set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$<$:ProgramDatabase>" PARENT_SCOPE) + endif() endif() # The if() command supports path comparisons using PATH_EQUAL operator. if(POLICY CMP0139) @@ -131,9 +133,11 @@ function(setup_project) if(POLICY CMP0091) cmake_policy(SET CMP0091 NEW) endif() - # Introduced by CMP0091. - if(NOT DEFINED CMAKE_MSVC_RUNTIME_LIBRARY) - set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>DLL" PARENT_SCOPE) + if(MSVC) + # Introduced by CMP0091. + if(NOT DEFINED CMAKE_MSVC_RUNTIME_LIBRARY) + set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>DLL" PARENT_SCOPE) + endif() endif() # Add correct link flags for PIE (Position Independent Executable). if(POLICY CMP0083) @@ -156,37 +160,86 @@ function(setup_project) endif() else() set(CMAKE_DEBUG_POSTFIX "_debug" PARENT_SCOPE) - if(APPLE) - set(CMAKE_FRAMEWORK_MULTI_CONFIG_POSTFIX_DEBUG "_debug" PARENT_SCOPE) - endif() 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) - if(NOT DEFINED CMAKE_RUNTIME_OUTPUT_DIRECTORY) - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}" PARENT_SCOPE) + 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}/${__bin_dir}" PARENT_SCOPE) + endif() + if(NOT DEFINED CMAKE_LIBRARY_OUTPUT_DIRECTORY) + 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}/${__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_LIBRARY_OUTPUT_DIRECTORY) - set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}" PARENT_SCOPE) + if(NOT DEFINED CMAKE_INCLUDE_CURRENT_DIR) + set(CMAKE_INCLUDE_CURRENT_DIR ON PARENT_SCOPE) endif() - if(NOT DEFINED CMAKE_ARCHIVE_OUTPUT_DIRECTORY) - set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}" PARENT_SCOPE) + 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() - set(CMAKE_INCLUDE_CURRENT_DIR ON PARENT_SCOPE) - set(CMAKE_LINK_DEPENDS_NO_SHARED ON PARENT_SCOPE) - set(CMAKE_POSITION_INDEPENDENT_CODE ON PARENT_SCOPE) include(CheckPIESupported) check_pie_supported() # This function must be called to ensure CMake adds -fPIE to the linker flags. - set(CMAKE_VISIBILITY_INLINES_HIDDEN ON PARENT_SCOPE) - set(CMAKE_INSTALL_RPATH_USE_LINK_PATH ON PARENT_SCOPE) + 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) - set(CMAKE_MACOSX_RPATH ON PARENT_SCOPE) + 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) - set(CMAKE_AUTOUIC ON PARENT_SCOPE) - set(CMAKE_AUTOMOC ON PARENT_SCOPE) - set(CMAKE_AUTORCC ON PARENT_SCOPE) + 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}") @@ -194,14 +247,21 @@ function(setup_project) 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() - set(CMAKE_C_STANDARD_REQUIRED ON PARENT_SCOPE) - set(CMAKE_C_EXTENSIONS OFF PARENT_SCOPE) - set(CMAKE_C_VISIBILITY_PRESET "hidden" PARENT_SCOPE) + 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() - set(CMAKE_CXX_STANDARD_REQUIRED ON PARENT_SCOPE) - set(CMAKE_CXX_EXTENSIONS OFF PARENT_SCOPE) - set(CMAKE_CXX_VISIBILITY_PRESET "hidden" PARENT_SCOPE) + 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()