set(COMMON_CXX_FEATURES cxx_alias_templates cxx_nullptr cxx_override) function(common_target_properties Name) get_target_property(__type ${Name} TYPE) set(__visibility PUBLIC) if(__type STREQUAL INTERFACE_LIBRARY) set(__interface 1) set(__visibility INTERFACE) endif() target_compile_features( ${Name} ${__visibility} ${COMMON_CXX_FEATURES}) get_target_property(_targetType ${Name} TYPE) if(_targetType STREQUAL "EXECUTABLE" AND CMAKE_CXX_COMPILE_OPTIONS_PIE) target_compile_options(${Name} PUBLIC "${CMAKE_CXX_COMPILE_OPTIONS_PIE}") endif() target_include_directories( ${Name} PUBLIC $ $ $ $) if(APPLE) target_compile_definitions( ${Name} ${__visibility} Darwin) endif() if(NOT __interface) if(TARGET Qt5::Core) if(_targetType STREQUAL "EXECUTABLE") target_compile_options(${Name} PUBLIC "${Qt5Core_EXECUTABLE_COMPILE_FLAGS}") endif() set_target_properties(${Name} PROPERTIES AUTOMOC TRUE AUTORCC TRUE) endif() if(TARGET Qt5::Widgets) set_target_properties(${Name} PROPERTIES AUTOUIC TRUE) # if(CMAKE_VERSION VERSION_LESS 3.7.99) # target_include_directories( # ${Name} # PUBLIC # $ # ) # endif() endif() if(CMAKE_CXX_COMPILER_IS_GCC AND NOT APPLE) set_target_properties(${Name} PROPERTIES LINK_FLAGS "-Wl,--no-as-needed") endif() endif() # LTO only for executables (not libraries) in Release build type get_target_property(target_type ${Name} TYPE) if(target_type STREQUAL "EXECUTABLE" AND CMAKE_BUILD_TYPE STREQUAL "Release") check_cxx_compiler_flag(-flto CXX_HAS_LTO_FLAG) check_cxx_compiler_flag(-fno-fat-lto-objects CXX_HAS_NO_FAT_LTO_FLAG) if(CMAKE_CXX_COMPILER_IS_GCC AND CXX_HAS_LTO_FLAG) find_program( CMAKE_GCC_AR NAMES "${_CMAKE_TOOLCHAIN_PREFIX}gcc-ar${_CMAKE_TOOLCHAIN_SUFFIX}" "${_CMAKE_TOOLCHAIN_PREFIX}gcc-ar" HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) find_program( CMAKE_GCC_NM NAMES "${_CMAKE_TOOLCHAIN_PREFIX}gcc-nm${_CMAKE_TOOLCHAIN_SUFFIX}" "${_CMAKE_TOOLCHAIN_PREFIX}gcc-nm" HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) find_program( CMAKE_GCC_RANLIB NAMES "${_CMAKE_TOOLCHAIN_PREFIX}gcc-ranlib${_CMAKE_TOOLCHAIN_SUFFIX}" "${_CMAKE_TOOLCHAIN_PREFIX}gcc-ranlib" HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) if(CMAKE_GCC_AR AND CMAKE_GCC_NM AND CMAKE_GCC_RANLIB) set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -flto") if(CXX_HAS_NO_FAT_LTO_FLAG) set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fno-fat-lto-objects") endif() set(CMAKE_AR "${CMAKE_GCC_AR}") set(CMAKE_NM "${CMAKE_GCC_NM}") set(CMAKE_RANLIB "${CMAKE_GCC_RANLIB}") else() message( WARNING "GCC indicates LTO support, but binutils wrappers could not be found. Disabling LTO." ) endif() else() check_enable_compiler_flag(-flto) check_enable_compiler_flag(-fno-fat-lto-objects) endif() endif() if(CMAKE_BUILD_TYPE STREQUAL Profile) target_compile_definitions( ${Name} ${__visibility} PROFILE) elseif(CMAKE_BUILD_TYPE STREQUAL Debug) target_compile_definitions( ${Name} ${__visibility} DEBUG) elseif(CMAKE_BUILD_TYPE STREQUAL Release) target_compile_definitions( ${Name} ${__visibility} RELEASE) elseif(CMAKE_BUILD_TYPE STREQUAL None) target_compile_definitions( ${Name} ${__visibility} ANALYSIS) endif() target_compile_definitions( ${Name} ${__visibility} "TARGET_LSB_ID_${LSB_DISTRIBUTOR_ID}" "TARGET_LSB_CODENAME_${LSB_CODENAME}") endfunction()