96 lines
3.4 KiB
CMake
96 lines
3.4 KiB
CMake
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
|
|
$<INSTALL_INTERFACE:include> $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
|
|
$<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/include>)
|
|
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
|
|
# $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/${Name}_autogen/include>
|
|
# )
|
|
# 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()
|
|
|
|
endfunction()
|