Apply cmake-format v0.6.0

This commit is contained in:
Martchus 2019-11-30 17:58:01 +01:00
parent 7376a2bb9b
commit 6376819c07
11 changed files with 562 additions and 668 deletions

View File

@ -121,7 +121,9 @@ use_iconv(AUTO_LINKAGE REQUIRED)
# configure use of native file buffer and its backend implementation if enabled # configure use of native file buffer and its backend implementation if enabled
set(USE_NATIVE_FILE_BUFFER_BY_DEFAULT OFF) set(USE_NATIVE_FILE_BUFFER_BY_DEFAULT OFF)
if (WIN32 OR ANDROID OR (UNIX AND NOT APPLE)) if (WIN32
OR ANDROID
OR (UNIX AND NOT APPLE))
set(USE_NATIVE_FILE_BUFFER_BY_DEFAULT ON) set(USE_NATIVE_FILE_BUFFER_BY_DEFAULT ON)
endif () endif ()
option(USE_NATIVE_FILE_BUFFER "enables use of native file buffer, affects ABI" ${USE_NATIVE_FILE_BUFFER_BY_DEFAULT}) option(USE_NATIVE_FILE_BUFFER "enables use of native file buffer, affects ABI" ${USE_NATIVE_FILE_BUFFER_BY_DEFAULT})
@ -131,32 +133,27 @@ if (USE_NATIVE_FILE_BUFFER)
set(NATIVE_FILE_STREAM_IMPL_FILES io/nativefilestream.cpp tests/iotests.cpp) set(NATIVE_FILE_STREAM_IMPL_FILES io/nativefilestream.cpp tests/iotests.cpp)
# check whether __gnu_cxx::stdio_filebuf is available # check whether __gnu_cxx::stdio_filebuf is available
try_compile(GNU_CXX_STDIO_FILEBUF_AVAILABLE try_compile(
${CMAKE_CURRENT_BINARY_DIR} GNU_CXX_STDIO_FILEBUF_AVAILABLE ${CMAKE_CURRENT_BINARY_DIR} SOURCES
SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/feature_detection/stdio_filebuf.cpp OUTPUT_VARIABLE GNU_CXX_STDIO_FILEBUF_CHECK_LOG)
${CMAKE_CURRENT_SOURCE_DIR}/feature_detection/stdio_filebuf.cpp
OUTPUT_VARIABLE GNU_CXX_STDIO_FILEBUF_CHECK_LOG)
# use __gnu_cxx::stdio_filebuf if available or fallback to boost::iostreams::stream_buffer # use __gnu_cxx::stdio_filebuf if available or fallback to boost::iostreams::stream_buffer
if (GNU_CXX_STDIO_FILEBUF_AVAILABLE AND NOT FORCE_BOOST_IOSTREAMS_FOR_NATIVE_FILE_BUFFER) if (GNU_CXX_STDIO_FILEBUF_AVAILABLE AND NOT FORCE_BOOST_IOSTREAMS_FOR_NATIVE_FILE_BUFFER)
message(STATUS "Using __gnu_cxx::stdio_filebuf for NativeFileStream") message(STATUS "Using __gnu_cxx::stdio_filebuf for NativeFileStream")
foreach (NATIVE_FILE_STREAM_IMPL_FILE ${NATIVE_FILE_STREAM_IMPL_FILES}) foreach (NATIVE_FILE_STREAM_IMPL_FILE ${NATIVE_FILE_STREAM_IMPL_FILES})
set_property(SOURCE ${NATIVE_FILE_STREAM_IMPL_FILE} set_property(
APPEND SOURCE ${NATIVE_FILE_STREAM_IMPL_FILE}
PROPERTY COMPILE_DEFINITIONS ${META_PROJECT_VARNAME}_USE_GNU_CXX_STDIO_FILEBUF) APPEND
PROPERTY COMPILE_DEFINITIONS ${META_PROJECT_VARNAME}_USE_GNU_CXX_STDIO_FILEBUF)
endforeach () endforeach ()
else () else ()
message(STATUS "Using boost::iostreams::stream_buffer<boost::iostreams::file_descriptor_sink> for NativeFileStream") message(STATUS "Using boost::iostreams::stream_buffer<boost::iostreams::file_descriptor_sink> for NativeFileStream")
use_package(TARGET_NAME use_package(TARGET_NAME Boost::iostreams PACKAGE_NAME Boost PACKAGE_ARGS "REQUIRED;COMPONENTS;iostreams")
Boost::iostreams
PACKAGE_NAME
Boost
PACKAGE_ARGS
"REQUIRED;COMPONENTS;iostreams")
foreach (NATIVE_FILE_STREAM_IMPL_FILE ${NATIVE_FILE_STREAM_IMPL_FILES}) foreach (NATIVE_FILE_STREAM_IMPL_FILE ${NATIVE_FILE_STREAM_IMPL_FILES})
set_property(SOURCE ${NATIVE_FILE_STREAM_IMPL_FILE} set_property(
APPEND SOURCE ${NATIVE_FILE_STREAM_IMPL_FILE}
PROPERTY COMPILE_DEFINITIONS ${META_PROJECT_VARNAME}_USE_BOOST_IOSTREAMS) APPEND
PROPERTY COMPILE_DEFINITIONS ${META_PROJECT_VARNAME}_USE_BOOST_IOSTREAMS)
endforeach () endforeach ()
endif () endif ()
else () else ()
@ -182,9 +179,10 @@ endif ()
# configure whether escape codes should be enabled by default # configure whether escape codes should be enabled by default
option(ENABLE_ESCAPE_CODES_BY_DEAULT "enables usage of escape codes by default" ON) option(ENABLE_ESCAPE_CODES_BY_DEAULT "enables usage of escape codes by default" ON)
if (ENABLE_ESCAPE_CODES_BY_DEAULT) if (ENABLE_ESCAPE_CODES_BY_DEAULT)
set_property(SOURCE application/argumentparser.cpp io/ansiescapecodes.cpp tests/argumentparsertests.cpp set_property(
APPEND SOURCE application/argumentparser.cpp io/ansiescapecodes.cpp tests/argumentparsertests.cpp
PROPERTY COMPILE_DEFINITIONS ${META_PROJECT_VARNAME}_ESCAPE_CODES_ENABLED_BY_DEFAULT) APPEND
PROPERTY COMPILE_DEFINITIONS ${META_PROJECT_VARNAME}_ESCAPE_CODES_ENABLED_BY_DEFAULT)
else () else ()
message(STATUS "Disabling use of escape codes by default.") message(STATUS "Disabling use of escape codes by default.")
endif () endif ()
@ -192,9 +190,10 @@ endif ()
# configure use of thread_local # configure use of thread_local
option(ENABLE_THREAD_LOCAL "enables use of Thread-Local Storage" ON) option(ENABLE_THREAD_LOCAL "enables use of Thread-Local Storage" ON)
if (NOT ENABLE_THREAD_LOCAL) if (NOT ENABLE_THREAD_LOCAL)
set_property(SOURCE conversion/stringconversion.cpp set_property(
APPEND SOURCE conversion/stringconversion.cpp
PROPERTY COMPILE_DEFINITIONS ${META_PROJECT_VARNAME}_NO_THREAD_LOCAL) APPEND
PROPERTY COMPILE_DEFINITIONS ${META_PROJECT_VARNAME}_NO_THREAD_LOCAL)
endif () endif ()
# include modules to apply configuration # include modules to apply configuration

View File

@ -10,7 +10,7 @@ if (NOT "${META_PROJECT_TYPE}" STREQUAL "application")
message( message(
FATAL_ERROR FATAL_ERROR
"The AppTarget CMake module is intended to be used for building application projects only (and not for libraries)." "The AppTarget CMake module is intended to be used for building application projects only (and not for libraries)."
) )
endif () endif ()
# set the windows extension to "exe", this is required by the Windows-specific WindowsResources module # set the windows extension to "exe", this is required by the Windows-specific WindowsResources module
@ -41,52 +41,54 @@ if (ANDROID)
else () else ()
add_executable(${META_TARGET_NAME} ${GUI_TYPE} ${ALL_FILES}) add_executable(${META_TARGET_NAME} ${GUI_TYPE} ${ALL_FILES})
endif () endif ()
target_link_libraries(${META_TARGET_NAME} target_link_libraries(
PUBLIC ${META_ADDITIONAL_LINK_FLAGS} "${PUBLIC_LIBRARIES}" ${META_TARGET_NAME}
PRIVATE "${PRIVATE_LIBRARIES}") PUBLIC ${META_ADDITIONAL_LINK_FLAGS} "${PUBLIC_LIBRARIES}"
target_include_directories(${META_TARGET_NAME} PRIVATE "${PRIVATE_LIBRARIES}")
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> ${PUBLIC_INCLUDE_DIRS} target_include_directories(
PRIVATE "${PRIVATE_INCLUDE_DIRS}") ${META_TARGET_NAME}
target_compile_definitions(${META_TARGET_NAME} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> ${PUBLIC_INCLUDE_DIRS}
PUBLIC PRIVATE "${PRIVATE_INCLUDE_DIRS}")
"${META_PUBLIC_COMPILE_DEFINITIONS}" target_compile_definitions(${META_TARGET_NAME} PUBLIC "${META_PUBLIC_COMPILE_DEFINITIONS}" PRIVATE
PRIVATE
"${META_PRIVATE_COMPILE_DEFINITIONS}") "${META_PRIVATE_COMPILE_DEFINITIONS}")
target_compile_options(${META_TARGET_NAME} PUBLIC "${META_PUBLIC_COMPILE_OPTIONS}" PRIVATE "${META_PRIVATE_COMPILE_OPTIONS}") target_compile_options(
set_target_properties(${META_TARGET_NAME} ${META_TARGET_NAME}
PROPERTIES CXX_STANDARD PUBLIC "${META_PUBLIC_COMPILE_OPTIONS}"
"${META_CXX_STANDARD}" PRIVATE "${META_PRIVATE_COMPILE_OPTIONS}")
LINK_SEARCH_START_STATIC set_target_properties(
${STATIC_LINKAGE} ${META_TARGET_NAME}
LINK_SEARCH_END_STATIC PROPERTIES CXX_STANDARD
${STATIC_LINKAGE} "${META_CXX_STANDARD}"
AUTOGEN_TARGET_DEPENDS LINK_SEARCH_START_STATIC
"${AUTOGEN_DEPS}") ${STATIC_LINKAGE}
LINK_SEARCH_END_STATIC
${STATIC_LINKAGE}
AUTOGEN_TARGET_DEPENDS
"${AUTOGEN_DEPS}")
if ("${GUI_TYPE}" STREQUAL "MACOSX_BUNDLE") if ("${GUI_TYPE}" STREQUAL "MACOSX_BUNDLE")
set_target_properties(${META_TARGET_NAME} set_target_properties(
PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME ${META_TARGET_NAME}
${META_TARGET_NAME} PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME
MACOSX_BUNDLE_GUI_IDENTIFIER ${META_TARGET_NAME}
${META_TARGET_NAME} MACOSX_BUNDLE_GUI_IDENTIFIER
MACOSX_BUNDLE_BUNDLE_VERSION ${META_TARGET_NAME}
${META_APP_VERSION} MACOSX_BUNDLE_BUNDLE_VERSION
MACOSX_BUNDLE_LONG_VERSION_STRING ${META_APP_VERSION}
${META_APP_VERSION} MACOSX_BUNDLE_LONG_VERSION_STRING
MACOSX_BUNDLE_SHORT_VERSION_STRING ${META_APP_VERSION}
${META_APP_VERSION}) MACOSX_BUNDLE_SHORT_VERSION_STRING
${META_APP_VERSION})
find_program(PNG2ICNS_BIN png2icns) find_program(PNG2ICNS_BIN png2icns)
if (PNG2ICNS_BIN AND EXISTS "${PNG_ICON_PATH}") if (PNG2ICNS_BIN AND EXISTS "${PNG_ICON_PATH}")
set(RESOURCES_DIR "${CMAKE_CURRENT_BINARY_DIR}/${META_TARGET_NAME}.app/Contents/Resources") set(RESOURCES_DIR "${CMAKE_CURRENT_BINARY_DIR}/${META_TARGET_NAME}.app/Contents/Resources")
set(MACOSX_ICON_PATH "${RESOURCES_DIR}/${META_PROJECT_NAME}.icns") set(MACOSX_ICON_PATH "${RESOURCES_DIR}/${META_PROJECT_NAME}.icns")
add_custom_command(OUTPUT "${MACOSX_ICON_PATH}" add_custom_command(
COMMAND "${CMAKE_COMMAND}" OUTPUT "${MACOSX_ICON_PATH}"
-E COMMAND "${CMAKE_COMMAND}" -E make_directory "${RESOURCES_DIR}"
make_directory COMMAND ${PNG2ICNS_BIN} "${MACOSX_ICON_PATH}" "${PNG_ICON_PATH}"
"${RESOURCES_DIR}" DEPENDS "${PNG_ICON_PATH}")
COMMAND ${PNG2ICNS_BIN} "${MACOSX_ICON_PATH}" "${PNG_ICON_PATH}"
DEPENDS "${PNG_ICON_PATH}")
message(STATUS "Generating macOS icon from \"${PNG_ICON_PATH}\" via ${PNG2ICNS_BIN}.") message(STATUS "Generating macOS icon from \"${PNG_ICON_PATH}\" via ${PNG2ICNS_BIN}.")
set_target_properties(${META_TARGET_NAME} PROPERTIES MACOSX_BUNDLE_ICON_FILE ${META_PROJECT_NAME}.icns) set_target_properties(${META_TARGET_NAME} PROPERTIES MACOSX_BUNDLE_ICON_FILE ${META_PROJECT_NAME}.icns)
target_sources(${META_TARGET_NAME} PRIVATE "${MACOSX_ICON_PATH}") target_sources(${META_TARGET_NAME} PRIVATE "${MACOSX_ICON_PATH}")
@ -97,25 +99,26 @@ endif ()
if (NOT META_NO_INSTALL_TARGETS AND ENABLE_INSTALL_TARGETS) if (NOT META_NO_INSTALL_TARGETS AND ENABLE_INSTALL_TARGETS)
# add install target for binary # add install target for binary
if (APPLE) if (APPLE)
set(BUNDLE_INSTALL_DESTINATION bin CACHE STRING "specifies the install destination for bundles") set(BUNDLE_INSTALL_DESTINATION
install(TARGETS ${META_TARGET_NAME} bin
RUNTIME DESTINATION bin CACHE STRING "specifies the install destination for bundles")
BUNDLE DESTINATION "${BUNDLE_INSTALL_DESTINATION}" COMPONENT binary) install(
TARGETS ${META_TARGET_NAME}
RUNTIME DESTINATION bin
BUNDLE DESTINATION "${BUNDLE_INSTALL_DESTINATION}" COMPONENT binary)
elseif (ANDROID) elseif (ANDROID)
install(TARGETS ${META_TARGET_NAME} install(
RUNTIME DESTINATION bin COMPONENT binary TARGETS ${META_TARGET_NAME}
LIBRARY DESTINATION lib${SELECTED_LIB_SUFFIX} COMPONENT binary RUNTIME DESTINATION bin COMPONENT binary
ARCHIVE DESTINATION lib${SELECTED_LIB_SUFFIX} COMPONENT binary) LIBRARY DESTINATION lib${SELECTED_LIB_SUFFIX} COMPONENT binary
ARCHIVE DESTINATION lib${SELECTED_LIB_SUFFIX} COMPONENT binary)
else () else ()
install(TARGETS ${META_TARGET_NAME} RUNTIME DESTINATION bin COMPONENT binary) install(TARGETS ${META_TARGET_NAME} RUNTIME DESTINATION bin COMPONENT binary)
endif () endif ()
if (NOT TARGET install-binary) if (NOT TARGET install-binary)
add_custom_target(install-binary add_custom_target(install-binary COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=binary -P
COMMAND "${CMAKE_COMMAND}" "${CMAKE_BINARY_DIR}/cmake_install.cmake")
-DCMAKE_INSTALL_COMPONENT=binary
-P
"${CMAKE_BINARY_DIR}/cmake_install.cmake")
endif () endif ()
add_dependencies(install-binary ${META_TARGET_NAME}) add_dependencies(install-binary ${META_TARGET_NAME})
@ -128,37 +131,34 @@ if (NOT META_NO_INSTALL_TARGETS AND ENABLE_INSTALL_TARGETS)
# add install target for desktop entries and icons # add install target for desktop entries and icons
foreach (DESKTOP_FILE ${DESKTOP_FILES}) foreach (DESKTOP_FILE ${DESKTOP_FILES})
install(FILES "${DESKTOP_FILE}" DESTINATION "share/applications" COMPONENT desktop) install(
FILES "${DESKTOP_FILE}"
DESTINATION "share/applications"
COMPONENT desktop)
endforeach () endforeach ()
foreach (ICON_FILE ${ICON_FILES}) foreach (ICON_FILE ${ICON_FILES})
install(FILES "${ICON_FILE}" DESTINATION "share/icons/hicolor/scalable/apps" COMPONENT desktop) install(
FILES "${ICON_FILE}"
DESTINATION "share/icons/hicolor/scalable/apps"
COMPONENT desktop)
endforeach () endforeach ()
if (NOT TARGET install-desktop) if (NOT TARGET install-desktop)
add_custom_target(install-desktop add_custom_target(install-desktop COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=desktop -P
COMMAND "${CMAKE_COMMAND}" "${CMAKE_BINARY_DIR}/cmake_install.cmake")
-DCMAKE_INSTALL_COMPONENT=desktop
-P
"${CMAKE_BINARY_DIR}/cmake_install.cmake")
endif () endif ()
add_dependencies(install-desktop ${META_TARGET_NAME}) add_dependencies(install-desktop ${META_TARGET_NAME})
if (NOT TARGET install-appimage) if (NOT TARGET install-appimage)
add_custom_target(install-appimage add_custom_target(install-appimage COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=appimage -P
COMMAND "${CMAKE_COMMAND}" "${CMAKE_BINARY_DIR}/cmake_install.cmake")
-DCMAKE_INSTALL_COMPONENT=appimage
-P
"${CMAKE_BINARY_DIR}/cmake_install.cmake")
endif () endif ()
add_dependencies(install-appimage ${META_TARGET_NAME}) add_dependencies(install-appimage ${META_TARGET_NAME})
# add install target for stripped binaries # add install target for stripped binaries
if (NOT TARGET install-binary-strip) if (NOT TARGET install-binary-strip)
add_custom_target(install-binary-strip add_custom_target(
COMMAND "${CMAKE_COMMAND}" install-binary-strip COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_DO_STRIP=1 -DCMAKE_INSTALL_COMPONENT=binary -P
-DCMAKE_INSTALL_DO_STRIP=1 "${CMAKE_BINARY_DIR}/cmake_install.cmake")
-DCMAKE_INSTALL_COMPONENT=binary
-P
"${CMAKE_BINARY_DIR}/cmake_install.cmake")
endif () endif ()
add_dependencies(install-binary-strip ${META_TARGET_NAME}) add_dependencies(install-binary-strip ${META_TARGET_NAME})
@ -181,14 +181,17 @@ endif ()
# add target for launching application with wine ensuring the WINEPATH is set correctly so wine is able to find all required # add target for launching application with wine ensuring the WINEPATH is set correctly so wine is able to find all required
# *.dll files requires script from c++utilities, hence the sources of c++utilities must be present # *.dll files requires script from c++utilities, hence the sources of c++utilities must be present
if (MINGW AND CMAKE_CROSSCOMPILING AND CPP_UTILITIES_SOURCE_DIR) if (MINGW
AND CMAKE_CROSSCOMPILING
AND CPP_UTILITIES_SOURCE_DIR)
if (NOT TARGET ${META_PROJECT_NAME}_run) if (NOT TARGET ${META_PROJECT_NAME}_run)
if (CMAKE_FIND_ROOT_PATH) if (CMAKE_FIND_ROOT_PATH)
list(APPEND RUNTIME_LIBRARY_PATH "${CMAKE_FIND_ROOT_PATH}/bin") list(APPEND RUNTIME_LIBRARY_PATH "${CMAKE_FIND_ROOT_PATH}/bin")
endif () endif ()
add_custom_target(${META_PROJECT_NAME}_run add_custom_target(
COMMAND "${CPP_UTILITIES_SOURCE_DIR}/scripts/wine.sh" ${META_PROJECT_NAME}_run
"${CMAKE_CURRENT_BINARY_DIR}/${META_PROJECT_NAME}.${WINDOWS_EXT}" ${RUNTIME_LIBRARY_PATH}) COMMAND "${CPP_UTILITIES_SOURCE_DIR}/scripts/wine.sh"
"${CMAKE_CURRENT_BINARY_DIR}/${META_PROJECT_NAME}.${WINDOWS_EXT}" ${RUNTIME_LIBRARY_PATH})
add_dependencies(${META_PROJECT_NAME}_run ${META_PROJECT_NAME}) add_dependencies(${META_PROJECT_NAME}_run ${META_PROJECT_NAME})
endif () endif ()
endif () endif ()
@ -213,12 +216,10 @@ function (add_custom_desktop_file)
DESKTOP_FILE_ADDITIONAL_ENTRIES) DESKTOP_FILE_ADDITIONAL_ENTRIES)
set(MULTI_VALUE_ARGS) set(MULTI_VALUE_ARGS)
set(OPTIONAL_ARGS) set(OPTIONAL_ARGS)
cmake_parse_arguments(ARGS cmake_parse_arguments(ARGS "${OPTIONAL_ARGS}" "${ONE_VALUE_ARGS}" "${MULTI_VALUE_ARGS}" ${ARGN})
"${OPTIONAL_ARGS}" if (NOT ARGS_FILE_NAME
"${ONE_VALUE_ARGS}" OR NOT ARGS_DESKTOP_FILE_APP_NAME
"${MULTI_VALUE_ARGS}" OR NOT ARGS_DESKTOP_FILE_CMD)
${ARGN})
if (NOT ARGS_FILE_NAME OR NOT ARGS_DESKTOP_FILE_APP_NAME OR NOT ARGS_DESKTOP_FILE_CMD)
message(FATAL_ERROR "Not all mandatory arguments specified.") message(FATAL_ERROR "Not all mandatory arguments specified.")
endif () endif ()
if (NOT ARGS_DESKTOP_FILE_GENERIC_NAME) if (NOT ARGS_DESKTOP_FILE_GENERIC_NAME)
@ -228,9 +229,10 @@ function (add_custom_desktop_file)
# create desktop file from template # create desktop file from template
configure_file("${APP_DESKTOP_TEMPLATE_FILE}" "${CMAKE_CURRENT_BINARY_DIR}/resources/${ARGS_FILE_NAME}.desktop") configure_file("${APP_DESKTOP_TEMPLATE_FILE}" "${CMAKE_CURRENT_BINARY_DIR}/resources/${ARGS_FILE_NAME}.desktop")
# add install for the desktop file # add install for the desktop file
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/resources/${ARGS_FILE_NAME}.desktop" install(
DESTINATION "share/applications" FILES "${CMAKE_CURRENT_BINARY_DIR}/resources/${ARGS_FILE_NAME}.desktop"
COMPONENT desktop) DESTINATION "share/applications"
COMPONENT desktop)
endfunction () endfunction ()
# define function to add *.desktop file and meta info from project meta data # define function to add *.desktop file and meta info from project meta data
@ -241,29 +243,29 @@ function (add_desktop_file)
list(GET META_APP_ACTION_${ACTION_VAR} 0 ACTION_ID) list(GET META_APP_ACTION_${ACTION_VAR} 0 ACTION_ID)
list(GET META_APP_ACTION_${ACTION_VAR} 1 ACTION_NAME) list(GET META_APP_ACTION_${ACTION_VAR} 1 ACTION_NAME)
list(GET META_APP_ACTION_${ACTION_VAR} 2 ACTION_ARGS) list(GET META_APP_ACTION_${ACTION_VAR} 2 ACTION_ARGS)
set( set(DESKTOP_FILE_ADDITIONAL_ENTRIES
DESKTOP_FILE_ADDITIONAL_ENTRIES
"${DESKTOP_FILE_ADDITIONAL_ENTRIES}\n[Desktop Action ${ACTION_ID}]\nName=${ACTION_NAME}\nExec=${META_TARGET_NAME} ${ACTION_ARGS}" "${DESKTOP_FILE_ADDITIONAL_ENTRIES}\n[Desktop Action ${ACTION_ID}]\nName=${ACTION_NAME}\nExec=${META_TARGET_NAME} ${ACTION_ARGS}"
) )
endforeach () endforeach ()
# create desktop file # create desktop file
add_custom_desktop_file(FILE_NAME add_custom_desktop_file(
"${META_ID}" FILE_NAME
DESKTOP_FILE_APP_NAME "${META_ID}"
"${META_APP_NAME}" DESKTOP_FILE_APP_NAME
DESKTOP_FILE_GENERIC_NAME "${META_APP_NAME}"
"${META_GENERIC_NAME}" DESKTOP_FILE_GENERIC_NAME
DESKTOP_FILE_DESCRIPTION "${META_GENERIC_NAME}"
"${META_APP_DESCRIPTION}" DESKTOP_FILE_DESCRIPTION
DESKTOP_FILE_CATEGORIES "${META_APP_DESCRIPTION}"
"${META_APP_CATEGORIES}" DESKTOP_FILE_CATEGORIES
DESKTOP_FILE_CMD "${META_APP_CATEGORIES}"
"${META_TARGET_NAME}" DESKTOP_FILE_CMD
DESKTOP_FILE_ICON "${META_TARGET_NAME}"
"${META_PROJECT_NAME}" DESKTOP_FILE_ICON
DESKTOP_FILE_ADDITIONAL_ENTRIES "${META_PROJECT_NAME}"
"${DESKTOP_FILE_ADDITIONAL_ENTRIES}") DESKTOP_FILE_ADDITIONAL_ENTRIES
"${DESKTOP_FILE_ADDITIONAL_ENTRIES}")
# read body for appstream desktop file from resources # read body for appstream desktop file from resources
set(META_APP_APPDATA_BODY_FILE "${CMAKE_CURRENT_SOURCE_DIR}/resources/body.appdata.xml") set(META_APP_APPDATA_BODY_FILE "${CMAKE_CURRENT_SOURCE_DIR}/resources/body.appdata.xml")
@ -272,18 +274,15 @@ function (add_desktop_file)
configure_file("${META_APP_APPDATA_BODY_FILE}" "${META_APP_APPDATA_SUBSTITUTED_BODY_FILE}" @ONLY) configure_file("${META_APP_APPDATA_BODY_FILE}" "${META_APP_APPDATA_SUBSTITUTED_BODY_FILE}" @ONLY)
file(READ "${META_APP_APPDATA_SUBSTITUTED_BODY_FILE}" META_APP_APPDATA_BODY) file(READ "${META_APP_APPDATA_SUBSTITUTED_BODY_FILE}" META_APP_APPDATA_BODY)
# add indentation of two additional spaces # add indentation of two additional spaces
string(REGEX string(REGEX REPLACE "\n([^$])" "\n \\1" META_APP_APPDATA_BODY "${META_APP_APPDATA_BODY}")
REPLACE "\n([^$])"
"\n \\1"
META_APP_APPDATA_BODY
"${META_APP_APPDATA_BODY}")
endif () endif ()
# create appstream desktop file from template # create appstream desktop file from template
configure_file("${APP_APPSTREAM_TEMPLATE_FILE}" "${CMAKE_CURRENT_BINARY_DIR}/resources/${META_ID}.appdata.xml" @ONLY) configure_file("${APP_APPSTREAM_TEMPLATE_FILE}" "${CMAKE_CURRENT_BINARY_DIR}/resources/${META_ID}.appdata.xml" @ONLY)
# add install for the appstream file # add install for the appstream file
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/resources/${META_ID}.appdata.xml" install(
DESTINATION "share/metainfo" FILES "${CMAKE_CURRENT_BINARY_DIR}/resources/${META_ID}.appdata.xml"
COMPONENT appimage) DESTINATION "share/metainfo"
COMPONENT appimage)
endfunction () endfunction ()
set(TARGET_CONFIG_DONE YES) set(TARGET_CONFIG_DONE YES)

View File

@ -26,18 +26,18 @@ if (NOT META_PROJECT_VARNAME_UPPER)
string(TOUPPER ${META_PROJECT_VARNAME} META_PROJECT_VARNAME_UPPER) string(TOUPPER ${META_PROJECT_VARNAME} META_PROJECT_VARNAME_UPPER)
endif () endif ()
if (NOT META_PROJECT_VARNAME_LOWER) if (NOT META_PROJECT_VARNAME_LOWER)
string(REGEX string(REGEX REPLACE "_+" "" META_PROJECT_VARNAME_LOWER "${META_PROJECT_VARNAME}")
REPLACE "_+"
""
META_PROJECT_VARNAME_LOWER
"${META_PROJECT_VARNAME}")
string(TOLOWER "${META_PROJECT_VARNAME_LOWER}" META_PROJECT_VARNAME_LOWER) string(TOLOWER "${META_PROJECT_VARNAME_LOWER}" META_PROJECT_VARNAME_LOWER)
endif () endif ()
# allow setting a configuration name to allow installing multiple differently configured versions within the same prefix # allow setting a configuration name to allow installing multiple differently configured versions within the same prefix
# (intended to be used for installing Qt 5 and Qt 6 version or shared and static version within the same prefix) # (intended to be used for installing Qt 5 and Qt 6 version or shared and static version within the same prefix)
set(${META_PROJECT_VARNAME_UPPER}_CONFIGURATION_NAME "" CACHE STRING "sets the configuration name for ${META_PROJECT_NAME}") set(${META_PROJECT_VARNAME_UPPER}_CONFIGURATION_NAME
set(CONFIGURATION_NAME "" CACHE STRING "sets the configuration name for all projects within the current build") ""
CACHE STRING "sets the configuration name for ${META_PROJECT_NAME}")
set(CONFIGURATION_NAME
""
CACHE STRING "sets the configuration name for all projects within the current build")
if (${META_PROJECT_VARNAME_UPPER}_CONFIGURATION_NAME STREQUAL "none") if (${META_PROJECT_VARNAME_UPPER}_CONFIGURATION_NAME STREQUAL "none")
set(META_CONFIG_NAME "") set(META_CONFIG_NAME "")
elseif (${META_PROJECT_VARNAME_UPPER}_CONFIGURATION_NAME) elseif (${META_PROJECT_VARNAME_UPPER}_CONFIGURATION_NAME)
@ -56,7 +56,9 @@ endif ()
set(${META_PROJECT_VARNAME_UPPER}_CONFIGURATION_TARGET_SUFFIX set(${META_PROJECT_VARNAME_UPPER}_CONFIGURATION_TARGET_SUFFIX
"" ""
CACHE STRING "sets a target suffix for ${META_PROJECT_NAME}") CACHE STRING "sets a target suffix for ${META_PROJECT_NAME}")
set(CONFIGURATION_TARGET_SUFFIX "" CACHE STRING "sets the target suffix for all projects within the current build") set(CONFIGURATION_TARGET_SUFFIX
""
CACHE STRING "sets the target suffix for all projects within the current build")
if (${META_PROJECT_VARNAME_UPPER}_CONFIGURATION_TARGET_SUFFIX STREQUAL "none") if (${META_PROJECT_VARNAME_UPPER}_CONFIGURATION_TARGET_SUFFIX STREQUAL "none")
set(TARGET_SUFFIX "") set(TARGET_SUFFIX "")
elseif (${META_PROJECT_VARNAME_UPPER}_CONFIGURATION_TARGET_SUFFIX) elseif (${META_PROJECT_VARNAME_UPPER}_CONFIGURATION_TARGET_SUFFIX)
@ -124,17 +126,25 @@ if (NOT META_PROJECT_LICENSE)
message( message(
WARNING WARNING
"Unable to detect license of ${META_PROJECT_NAME}. Set META_PROJECT_LICENSE manually to silence this warning." "Unable to detect license of ${META_PROJECT_NAME}. Set META_PROJECT_LICENSE manually to silence this warning."
) )
endif () endif ()
endif () endif ()
# provide variables for other projects built as part of the same subdirs project to access files from this project # provide variables for other projects built as part of the same subdirs project to access files from this project
get_directory_property(HAS_PARENT PARENT_DIRECTORY) get_directory_property(HAS_PARENT PARENT_DIRECTORY)
if (HAS_PARENT) if (HAS_PARENT)
set(${META_PROJECT_VARNAME_UPPER}_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}" PARENT_SCOPE) set(${META_PROJECT_VARNAME_UPPER}_SOURCE_DIR
set(${META_PROJECT_VARNAME_UPPER}_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}" PARENT_SCOPE) "${CMAKE_CURRENT_SOURCE_DIR}"
set(${META_PROJECT_NAME}_DIR "${CMAKE_CURRENT_BINARY_DIR}" PARENT_SCOPE) PARENT_SCOPE)
set(RUNTIME_LIBRARY_PATH "${CMAKE_CURRENT_BINARY_DIR}" ${RUNTIME_LIBRARY_PATH} PARENT_SCOPE) set(${META_PROJECT_VARNAME_UPPER}_BINARY_DIR
"${CMAKE_CURRENT_BINARY_DIR}"
PARENT_SCOPE)
set(${META_PROJECT_NAME}_DIR
"${CMAKE_CURRENT_BINARY_DIR}"
PARENT_SCOPE)
set(RUNTIME_LIBRARY_PATH
"${CMAKE_CURRENT_BINARY_DIR}" ${RUNTIME_LIBRARY_PATH}
PARENT_SCOPE)
endif () endif ()
# determine version # determine version
@ -145,26 +155,16 @@ option(
ON) ON)
if (APPEND_GIT_REVISION) if (APPEND_GIT_REVISION)
find_program(GIT_BIN git) find_program(GIT_BIN git)
execute_process(COMMAND ${GIT_BIN} execute_process(
rev-list COMMAND ${GIT_BIN} rev-list --count HEAD
--count WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
HEAD OUTPUT_VARIABLE META_GIT_REV_COUNT)
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" execute_process(
OUTPUT_VARIABLE META_GIT_REV_COUNT) COMMAND ${GIT_BIN} rev-parse --short HEAD
execute_process(COMMAND ${GIT_BIN} WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
rev-parse OUTPUT_VARIABLE META_GIT_LAST_COMMIT_ID)
--short string(REPLACE "\n" "" META_GIT_REV_COUNT "${META_GIT_REV_COUNT}")
HEAD string(REPLACE "\n" "" META_GIT_LAST_COMMIT_ID "${META_GIT_LAST_COMMIT_ID}")
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
OUTPUT_VARIABLE META_GIT_LAST_COMMIT_ID)
string(REPLACE "\n"
""
META_GIT_REV_COUNT
"${META_GIT_REV_COUNT}")
string(REPLACE "\n"
""
META_GIT_LAST_COMMIT_ID
"${META_GIT_LAST_COMMIT_ID}")
if (META_GIT_REV_COUNT AND META_GIT_LAST_COMMIT_ID) if (META_GIT_REV_COUNT AND META_GIT_LAST_COMMIT_ID)
set(META_APP_VERSION ${META_APP_VERSION}-${META_GIT_REV_COUNT}.${META_GIT_LAST_COMMIT_ID}) set(META_APP_VERSION ${META_APP_VERSION}-${META_GIT_REV_COUNT}.${META_GIT_LAST_COMMIT_ID})
endif () endif ()
@ -176,16 +176,17 @@ set(TARGET_EXECUTABLE "${CMAKE_INSTALL_PREFIX}/bin/${META_TARGET_NAME}")
# create header for feature detection # create header for feature detection
if (META_FEATURES_FOR_COMPILER_DETECTION_HEADER) if (META_FEATURES_FOR_COMPILER_DETECTION_HEADER)
include(WriteCompilerDetectionHeader) include(WriteCompilerDetectionHeader)
write_compiler_detection_header(FILE write_compiler_detection_header(
"${CMAKE_CURRENT_BINARY_DIR}/resources/features.h" FILE
PREFIX "${CMAKE_CURRENT_BINARY_DIR}/resources/features.h"
"${META_PROJECT_VARNAME_UPPER}" PREFIX
COMPILERS "${META_PROJECT_VARNAME_UPPER}"
GNU COMPILERS
Clang GNU
AppleClang Clang
FEATURES AppleClang
${META_FEATURES_FOR_COMPILER_DETECTION_HEADER}) FEATURES
${META_FEATURES_FOR_COMPILER_DETECTION_HEADER})
endif () endif ()
# disable new ABI (can't catch ios_base::failure with new ABI) # disable new ABI (can't catch ios_base::failure with new ABI)
@ -211,7 +212,12 @@ if (LOGGING_ENABLED)
endif () endif ()
# determine whether the project is a header-only library # determine whether the project is a header-only library
if (SRC_FILES OR GUI_SRC_FILES OR WIDGETS_SRC_FILES OR WIDGETS_UI_FILES OR QML_SRC_FILES OR RES_FILES) if (SRC_FILES
OR GUI_SRC_FILES
OR WIDGETS_SRC_FILES
OR WIDGETS_UI_FILES
OR QML_SRC_FILES
OR RES_FILES)
set(META_HEADER_ONLY_LIB NO) set(META_HEADER_ONLY_LIB NO)
else () else ()
set(META_HEADER_ONLY_LIB YES) set(META_HEADER_ONLY_LIB YES)
@ -225,7 +231,10 @@ endif ()
include(3rdParty) include(3rdParty)
# options for enabling/disabling Qt GUI (if available) # options for enabling/disabling Qt GUI (if available)
if (WIDGETS_HEADER_FILES OR WIDGETS_SRC_FILES OR WIDGETS_UI_FILES OR META_HAS_WIDGETS_GUI) if (WIDGETS_HEADER_FILES
OR WIDGETS_SRC_FILES
OR WIDGETS_UI_FILES
OR META_HAS_WIDGETS_GUI)
if (META_GUI_OPTIONAL) if (META_GUI_OPTIONAL)
option(WIDGETS_GUI "enables/disables building the Qt Widgets GUI: yes (default) or no" ON) option(WIDGETS_GUI "enables/disables building the Qt Widgets GUI: yes (default) or no" ON)
else () else ()
@ -234,7 +243,9 @@ if (WIDGETS_HEADER_FILES OR WIDGETS_SRC_FILES OR WIDGETS_UI_FILES OR META_HAS_WI
else () else ()
set(WIDGETS_GUI OFF) set(WIDGETS_GUI OFF)
endif () endif ()
if (QML_HEADER_FILES OR QML_SRC_FILES OR META_HAS_QUICK_GUI) if (QML_HEADER_FILES
OR QML_SRC_FILES
OR META_HAS_QUICK_GUI)
if (META_GUI_OPTIONAL) if (META_GUI_OPTIONAL)
option(QUICK_GUI "enables/disables building the Qt Quick GUI: yes (default) or no" ON) option(QUICK_GUI "enables/disables building the Qt Quick GUI: yes (default) or no" ON)
else () else ()
@ -286,11 +297,7 @@ set(FORMATABLE_FILES
${EXCLUDED_FILES}) ${EXCLUDED_FILES})
# only format C/C++ files (and not eg. QML files) # only format C/C++ files (and not eg. QML files)
if (FORMATABLE_FILES) if (FORMATABLE_FILES)
list(FILTER list(FILTER FORMATABLE_FILES INCLUDE REGEX ".*\\.(c|cpp|h|hpp)")
FORMATABLE_FILES
INCLUDE
REGEX
".*\\.(c|cpp|h|hpp)")
endif () endif ()
# determine source files which might be passed to cmake-format # determine source files which might be passed to cmake-format
@ -298,13 +305,10 @@ set(FORMATABLE_FILES_CMAKE ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt ${CMAKE_MO
# add command for symlinking clang-{format,tidy} rules so the tools can find it # add command for symlinking clang-{format,tidy} rules so the tools can find it
if (EXISTS "${CLANG_FORMAT_RULES}") if (EXISTS "${CLANG_FORMAT_RULES}")
add_custom_command(OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/.clang-format" add_custom_command(
COMMAND "${CMAKE_COMMAND}" OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/.clang-format"
-E COMMAND "${CMAKE_COMMAND}" -E create_symlink "${CLANG_FORMAT_RULES}" "${CMAKE_CURRENT_SOURCE_DIR}/.clang-format"
create_symlink COMMENT "Linking coding style from ${CLANG_FORMAT_RULES}")
"${CLANG_FORMAT_RULES}"
"${CMAKE_CURRENT_SOURCE_DIR}/.clang-format"
COMMENT "Linking coding style from ${CLANG_FORMAT_RULES}")
else () else ()
message(WARNING "Format rules for clang-format not found.") message(WARNING "Format rules for clang-format not found.")
endif () endif ()
@ -316,60 +320,53 @@ if (NOT META_NO_TIDY)
endif () endif ()
# add target for tidying with clang-format # add target for tidying with clang-format
if (NOT META_NO_TIDY AND CLANG_FORMAT_ENABLED AND FORMATABLE_FILES AND EXISTS "${CLANG_FORMAT_RULES}") if (NOT META_NO_TIDY
AND CLANG_FORMAT_ENABLED
AND FORMATABLE_FILES
AND EXISTS "${CLANG_FORMAT_RULES}")
find_program(CLANG_FORMAT_BIN clang-format) find_program(CLANG_FORMAT_BIN clang-format)
if (NOT CLANG_FORMAT_BIN) if (NOT CLANG_FORMAT_BIN)
message(FATAL_ERROR "Unable to add tidy target; clang-format not found") message(FATAL_ERROR "Unable to add tidy target; clang-format not found")
endif () endif ()
add_custom_target("${META_TARGET_NAME}_tidy" add_custom_target(
COMMAND "${CLANG_FORMAT_BIN}" "${META_TARGET_NAME}_tidy"
-style=file COMMAND "${CLANG_FORMAT_BIN}" -style=file -i ${FORMATABLE_FILES}
-i WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
${FORMATABLE_FILES} COMMENT "Tidying ${META_PROJECT_NAME} sources using clang-format"
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" DEPENDS "${FORMATABLE_FILES};${CMAKE_CURRENT_SOURCE_DIR}/.clang-format")
COMMENT "Tidying ${META_PROJECT_NAME} sources using clang-format"
DEPENDS "${FORMATABLE_FILES};${CMAKE_CURRENT_SOURCE_DIR}/.clang-format")
if (NOT TARGET tidy) if (NOT TARGET tidy)
add_custom_target(tidy) add_custom_target(tidy)
endif () endif ()
add_dependencies(tidy "${META_TARGET_NAME}_tidy") add_dependencies(tidy "${META_TARGET_NAME}_tidy")
# also add a test to verify whether sources are tidy # also add a test to verify whether sources are tidy
add_test(NAME "${META_TARGET_NAME}_tidy_test" add_test(
COMMAND "${CLANG_FORMAT_BIN}" NAME "${META_TARGET_NAME}_tidy_test"
-output-replacements-xml COMMAND "${CLANG_FORMAT_BIN}" -output-replacements-xml -style=file ${FORMATABLE_FILES}
-style=file WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
${FORMATABLE_FILES}
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
list(APPEND CHECK_TARGET_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/.clang-format") list(APPEND CHECK_TARGET_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/.clang-format")
set_tests_properties("${META_TARGET_NAME}_tidy_test" set_tests_properties(
PROPERTIES FAIL_REGULAR_EXPRESSION "${META_TARGET_NAME}_tidy_test" PROPERTIES FAIL_REGULAR_EXPRESSION "<replacement.*>.*</replacement>" REQUIRED_FILES
"<replacement.*>.*</replacement>" "${CMAKE_CURRENT_SOURCE_DIR}/.clang-format")
REQUIRED_FILES
"${CMAKE_CURRENT_SOURCE_DIR}/.clang-format")
endif () endif ()
# add target for tidying with cmake-format # add target for tidying with cmake-format
if (NOT META_NO_TIDY AND CMAKE_FORMAT_ENABLED AND FORMATABLE_FILES_CMAKE) if (NOT META_NO_TIDY
AND CMAKE_FORMAT_ENABLED
AND FORMATABLE_FILES_CMAKE)
find_program(CMAKE_FORMAT_BIN cmake-format) find_program(CMAKE_FORMAT_BIN cmake-format)
if (NOT CMAKE_FORMAT_BIN) if (NOT CMAKE_FORMAT_BIN)
message(FATAL_ERROR "Unable to add tidy target; cmake-format not found") message(FATAL_ERROR "Unable to add tidy target; cmake-format not found")
endif () endif ()
if (NOT META_CMAKE_FORMAT_OPTIONS) if (NOT META_CMAKE_FORMAT_OPTIONS)
set(META_CMAKE_FORMAT_OPTIONS set(META_CMAKE_FORMAT_OPTIONS --tab-size=4 --separate-ctrl-name-with-space=True --line-width=125 --autosort=False)
--tab-size=4
--separate-ctrl-name-with-space=True
--line-width=125
--autosort=False)
endif () endif ()
add_custom_target("${META_TARGET_NAME}_cmake_tidy" add_custom_target(
COMMAND "${CMAKE_FORMAT_BIN}" "${META_TARGET_NAME}_cmake_tidy"
--in-place COMMAND "${CMAKE_FORMAT_BIN}" --in-place ${META_CMAKE_FORMAT_OPTIONS} ${FORMATABLE_FILES_CMAKE}
${META_CMAKE_FORMAT_OPTIONS} WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
${FORMATABLE_FILES_CMAKE} COMMENT "Tidying ${META_PROJECT_NAME} sources using cmake-format"
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" DEPENDS "${FORMATABLE_FILES_CMAKE}")
COMMENT "Tidying ${META_PROJECT_NAME} sources using cmake-format"
DEPENDS "${FORMATABLE_FILES_CMAKE}")
if (NOT TARGET tidy) if (NOT TARGET tidy)
add_custom_target(tidy) add_custom_target(tidy)
endif () endif ()
@ -429,27 +426,23 @@ if (NOT META_NO_STATIC_ANALYSIS AND FORMATABLE_FILES)
set(SYMBOLIC_OUTPUT_FILE "${FILE}.clang-tidy-output") set(SYMBOLIC_OUTPUT_FILE "${FILE}.clang-tidy-output")
list(APPEND CLANG_TIDY_SYMBOLIC_OUTPUT_FILES "${SYMBOLIC_OUTPUT_FILE}") list(APPEND CLANG_TIDY_SYMBOLIC_OUTPUT_FILES "${SYMBOLIC_OUTPUT_FILE}")
add_custom_command(OUTPUT "${SYMBOLIC_OUTPUT_FILE}" add_custom_command(
COMMAND "${CLANG_TIDY_BIN}" OUTPUT "${SYMBOLIC_OUTPUT_FILE}"
${FILE} COMMAND "${CLANG_TIDY_BIN}" ${FILE} -- ${CLANG_TIDY_CXX_FLAGS}
-- WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
${CLANG_TIDY_CXX_FLAGS} COMMENT "Linting ${FILE} using clang-tidy"
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" DEPENDS "${FILE}" COMMAND_EXPAND_LISTS
COMMENT "Linting ${FILE} using clang-tidy" VERBATIM)
DEPENDS "${FILE}" COMMAND_EXPAND_LISTS
VERBATIM)
endforeach () endforeach ()
# mark all symbolic output files actually as symbolic # mark all symbolic output files actually as symbolic
set_source_files_properties(${CLANG_TIDY_SYMBOLIC_OUTPUT_FILES} set_source_files_properties(${CLANG_TIDY_SYMBOLIC_OUTPUT_FILES} PROPERTIES SYMBOLIC YES)
PROPERTIES
SYMBOLIC
YES)
# add targets # add targets
add_custom_target("${META_TARGET_NAME}_static_check" add_custom_target(
DEPENDS ${CLANG_TIDY_SYMBOLIC_OUTPUT_FILES} "${META_TARGET_NAME}_static_check"
COMMENT "Linting ${META_TARGET_NAME} sources using clang-tidy") DEPENDS ${CLANG_TIDY_SYMBOLIC_OUTPUT_FILES}
COMMENT "Linting ${META_TARGET_NAME} sources using clang-tidy")
if (NOT TARGET static-check) if (NOT TARGET static-check)
add_custom_target(static-check) add_custom_target(static-check)
endif () endif ()
@ -460,10 +453,11 @@ endif ()
# add autotools-style check target # add autotools-style check target
if (NOT TARGET check) if (NOT TARGET check)
set(CMAKE_CTEST_COMMAND ${CMAKE_CTEST_COMMAND} -V) set(CMAKE_CTEST_COMMAND ${CMAKE_CTEST_COMMAND} -V)
add_custom_target(check add_custom_target(
COMMAND ${CMAKE_CTEST_COMMAND} check
WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMAND ${CMAKE_CTEST_COMMAND}
DEPENDS "${CHECK_TARGET_DEPENDS}") WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
DEPENDS "${CHECK_TARGET_DEPENDS}")
endif () endif ()
# enable source code based coverage analysis using clang # enable source code based coverage analysis using clang
@ -492,23 +486,29 @@ endif ()
if (NOT META_NO_INSTALL_TARGETS AND ENABLE_INSTALL_TARGETS) if (NOT META_NO_INSTALL_TARGETS AND ENABLE_INSTALL_TARGETS)
foreach (EXTRA_FILE ${EXTRA_FILES}) foreach (EXTRA_FILE ${EXTRA_FILES})
get_filename_component(EXTRA_DIR ${EXTRA_FILE} DIRECTORY) get_filename_component(EXTRA_DIR ${EXTRA_FILE} DIRECTORY)
install(FILES ${EXTRA_FILE} DESTINATION "${META_DATA_DIR}/${EXTRA_DIR}" COMPONENT extra-files) install(
FILES ${EXTRA_FILE}
DESTINATION "${META_DATA_DIR}/${EXTRA_DIR}"
COMPONENT extra-files)
endforeach () endforeach ()
if (NOT TARGET install-extra-files) if (NOT TARGET install-extra-files)
add_custom_target(install-extra-files add_custom_target(install-extra-files COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=extra-files -P
COMMAND "${CMAKE_COMMAND}" "${CMAKE_BINARY_DIR}/cmake_install.cmake")
-DCMAKE_INSTALL_COMPONENT=extra-files
-P
"${CMAKE_BINARY_DIR}/cmake_install.cmake")
endif () endif ()
endif () endif ()
# determine library directory suffix - Applications might be built as libraries under some platforms (eg. Android). Hence # determine library directory suffix - Applications might be built as libraries under some platforms (eg. Android). Hence
# this is part of BasicConfig and not LibraryConfig. # this is part of BasicConfig and not LibraryConfig.
set(LIB_SUFFIX "" CACHE STRING "specifies the general suffix for the library directory") set(LIB_SUFFIX
""
CACHE STRING "specifies the general suffix for the library directory")
set(SELECTED_LIB_SUFFIX "${LIB_SUFFIX}") set(SELECTED_LIB_SUFFIX "${LIB_SUFFIX}")
set(LIB_SUFFIX_32 "" CACHE STRING "specifies the suffix for the library directory to be used when building 32-bit library") set(LIB_SUFFIX_32
set(LIB_SUFFIX_64 "" CACHE STRING "specifies the suffix for the library directory to be used when building 64-bit library") ""
CACHE STRING "specifies the suffix for the library directory to be used when building 32-bit library")
set(LIB_SUFFIX_64
""
CACHE STRING "specifies the suffix for the library directory to be used when building 64-bit library")
if (LIB_SUFFIX_64 AND CMAKE_SIZEOF_VOID_P MATCHES "8") if (LIB_SUFFIX_64 AND CMAKE_SIZEOF_VOID_P MATCHES "8")
set(SELECTED_LIB_SUFFIX "${LIB_SUFFIX_64}") set(SELECTED_LIB_SUFFIX "${LIB_SUFFIX_64}")
elseif (LIB_SUFFIX_32 AND CMAKE_SIZEOF_VOID_P MATCHES "4") elseif (LIB_SUFFIX_32 AND CMAKE_SIZEOF_VOID_P MATCHES "4")
@ -535,7 +535,9 @@ function (append_user_defined_additional_libraries)
endif () endif ()
if (LIB_COUNT LESS_EQUAL 0) if (LIB_COUNT LESS_EQUAL 0)
# just add the addiitional libs to PRIVATE_LIBRARIES if there are no libs yet anyways # just add the addiitional libs to PRIVATE_LIBRARIES if there are no libs yet anyways
set(PRIVATE_LIBRARIES "${USER_DEFINED_ADDITIONAL_LIBRARIES}" PARENT_SCOPE) set(PRIVATE_LIBRARIES
"${USER_DEFINED_ADDITIONAL_LIBRARIES}"
PARENT_SCOPE)
endif () endif ()
math(EXPR LAST_LIB_INDEX "${LIB_COUNT} - 1") math(EXPR LAST_LIB_INDEX "${LIB_COUNT} - 1")
list(GET ${LIBS} ${LAST_LIB_INDEX} LAST_LIB) list(GET ${LIBS} ${LAST_LIB_INDEX} LAST_LIB)
@ -544,13 +546,18 @@ function (append_user_defined_additional_libraries)
if (TARGET "${LAST_LIB}") if (TARGET "${LAST_LIB}")
# note: Otherwise the INTERFACE_LINK_LIBRARIES of the last target might still come after the # note: Otherwise the INTERFACE_LINK_LIBRARIES of the last target might still come after the
# USER_DEFINED_ADDITIONAL_LIBRARIES on the linker line. # USER_DEFINED_ADDITIONAL_LIBRARIES on the linker line.
set_property(TARGET "${LAST_LIB}" APPEND PROPERTY INTERFACE_LINK_LIBRARIES ${USER_DEFINED_ADDITIONAL_LIBRARIES}) set_property(
TARGET "${LAST_LIB}"
APPEND
PROPERTY INTERFACE_LINK_LIBRARIES ${USER_DEFINED_ADDITIONAL_LIBRARIES})
return() return()
endif () endif ()
# fall back to simply append the library to PRIVATE_LIBRARIES # fall back to simply append the library to PRIVATE_LIBRARIES
set(PRIVATE_LIBRARIES "${USER_DEFINED_ADDITIONAL_LIBRARIES}" PARENT_SCOPE) set(PRIVATE_LIBRARIES
"${USER_DEFINED_ADDITIONAL_LIBRARIES}"
PARENT_SCOPE)
endfunction () endfunction ()
set(BASIC_PROJECT_CONFIG_DONE YES) set(BASIC_PROJECT_CONFIG_DONE YES)

View File

@ -26,11 +26,7 @@ endif ()
get_target_property(INTERFACE_LINK_LIBRARIES_LIST "${META_TARGET_NAME}" INTERFACE_LINK_LIBRARIES) get_target_property(INTERFACE_LINK_LIBRARIES_LIST "${META_TARGET_NAME}" INTERFACE_LINK_LIBRARIES)
# make list with link-time dependency versions and display names # make list with link-time dependency versions and display names
foreach (DEPENDENCY foreach (DEPENDENCY IN LISTS LINK_LIBRARIES_LIST INTERFACE_LINK_LIBRARIES_LIST)
IN
LISTS
LINK_LIBRARIES_LIST
INTERFACE_LINK_LIBRARIES_LIST)
# skip non-targets and already processed dependencies # skip non-targets and already processed dependencies
if (NOT TARGET "${DEPENDENCY}" OR "${DEPENDENCY}" IN_LIST PROCESSED_DEPENDENCIES) if (NOT TARGET "${DEPENDENCY}" OR "${DEPENDENCY}" IN_LIST PROCESSED_DEPENDENCIES)
continue() continue()
@ -73,11 +69,7 @@ endforeach ()
# format "DEPENCENCY_VERSIONS_ARRAY" # format "DEPENCENCY_VERSIONS_ARRAY"
if (DEPENCENCY_VERSIONS) if (DEPENCENCY_VERSIONS)
include(ListToString) include(ListToString)
list_to_string("," list_to_string("," " \\\n \"" "\"" "${DEPENCENCY_VERSIONS}" DEPENCENCY_VERSIONS_ARRAY)
" \\\n \""
"\""
"${DEPENCENCY_VERSIONS}"
DEPENCENCY_VERSIONS_ARRAY)
endif () endif ()
# add configuration header # add configuration header
@ -85,10 +77,7 @@ configure_file("${CONFIG_H_TEMPLATE_FILE}" "${CMAKE_CURRENT_BINARY_DIR}/resource
# ensure generated include files can be included via #include "resources/config.h" # ensure generated include files can be included via #include "resources/config.h"
if (NOT META_HEADER_ONLY_LIB) if (NOT META_HEADER_ONLY_LIB)
foreach (TARGET_NAME foreach (TARGET_NAME ${META_TARGET_NAME} ${META_TARGET_NAME}_tests ${META_TARGET_NAME}_testlib)
${META_TARGET_NAME}
${META_TARGET_NAME}_tests
${META_TARGET_NAME}_testlib)
if (TARGET ${TARGET_NAME}) if (TARGET ${TARGET_NAME})
target_include_directories(${TARGET_NAME} PRIVATE "${CMAKE_CURRENT_BINARY_DIR}") target_include_directories(${TARGET_NAME} PRIVATE "${CMAKE_CURRENT_BINARY_DIR}")
endif () endif ()

View File

@ -32,8 +32,12 @@ if (NOT DOXYGEN_BIN)
endif () endif ()
# load cached configuration and other variables # load cached configuration and other variables
set(DOXY_LANGUAGE "English" CACHE STRING "specifies the language of the API documentation generated with Doxygen") set(DOXY_LANGUAGE
set(DOXY_CUSTOM_CONFIG "" CACHE STRING "specifies extra options for Doxygen") "English"
CACHE STRING "specifies the language of the API documentation generated with Doxygen")
set(DOXY_CUSTOM_CONFIG
""
CACHE STRING "specifies extra options for Doxygen")
set(DOXY_NUMBER "${META_APP_VERSION}") set(DOXY_NUMBER "${META_APP_VERSION}")
set(DOXY_INPUT_FILES set(DOXY_INPUT_FILES
${HEADER_FILES} ${HEADER_FILES}
@ -52,11 +56,7 @@ set(DOXY_MAIN_PAGE_FILE "${DOXY_PATH_PREFIX}${DOXY_MAIN_PAGE_FILE}")
# convert DOXY_INPUT_FILES to whitespace-separated list # convert DOXY_INPUT_FILES to whitespace-separated list
include(ListToString) include(ListToString)
list_to_string(" " list_to_string(" " "\"${DOXY_PATH_PREFIX}" "\"" "${DOXY_INPUT_FILES}" DOXY_INPUT_FILES_WHITESPACE_SEPARATED)
"\"${DOXY_PATH_PREFIX}"
"\""
"${DOXY_INPUT_FILES}"
DOXY_INPUT_FILES_WHITESPACE_SEPARATED)
# generate Doxygen configuration # generate Doxygen configuration
configure_file("${DOXYGEN_TEMPLATE_FILE}" "${CMAKE_CURRENT_BINARY_DIR}/doxygen.config") configure_file("${DOXYGEN_TEMPLATE_FILE}" "${CMAKE_CURRENT_BINARY_DIR}/doxygen.config")
@ -70,13 +70,14 @@ add_dependencies(apidoc "${META_TARGET_NAME}_apidoc")
# add install target for API documentation # add install target for API documentation
if (NOT META_NO_INSTALL_TARGETS AND ENABLE_INSTALL_TARGETS) if (NOT META_NO_INSTALL_TARGETS AND ENABLE_INSTALL_TARGETS)
install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/api-doc" DESTINATION "${META_DATA_DIR}" COMPONENT api-doc OPTIONAL) install(
DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/api-doc"
DESTINATION "${META_DATA_DIR}"
COMPONENT api-doc
OPTIONAL)
if (NOT TARGET install-api-doc) if (NOT TARGET install-api-doc)
add_custom_target(install-api-doc add_custom_target(install-api-doc COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=api-doc -P
COMMAND "${CMAKE_COMMAND}" "${CMAKE_BINARY_DIR}/cmake_install.cmake")
-DCMAKE_INSTALL_COMPONENT=api-doc
-P
"${CMAKE_BINARY_DIR}/cmake_install.cmake")
endif () endif ()
endif () endif ()

View File

@ -11,11 +11,13 @@ endif ()
if (("${META_PROJECT_TYPE}" STREQUAL "plugin") OR ("${META_PROJECT_TYPE}" STREQUAL "qtplugin")) if (("${META_PROJECT_TYPE}" STREQUAL "plugin") OR ("${META_PROJECT_TYPE}" STREQUAL "qtplugin"))
set(META_IS_PLUGIN YES) set(META_IS_PLUGIN YES)
endif () endif ()
if ((NOT "${META_PROJECT_TYPE}" STREQUAL "library") AND (NOT "${META_PROJECT_TYPE}" STREQUAL "") AND NOT META_IS_PLUGIN) if ((NOT "${META_PROJECT_TYPE}" STREQUAL "library")
AND (NOT "${META_PROJECT_TYPE}" STREQUAL "")
AND NOT META_IS_PLUGIN)
message( message(
FATAL_ERROR FATAL_ERROR
"The LibraryTarget CMake module is intended to be used for building library projects only (and not for applications)." "The LibraryTarget CMake module is intended to be used for building library projects only (and not for applications)."
) )
endif () endif ()
# include packages for configure_package_config_file, write_basic_package_version_file and find_template_file # include packages for configure_package_config_file, write_basic_package_version_file and find_template_file
@ -53,10 +55,10 @@ if ("${META_PROJECT_NAME}" STREQUAL "c++utilities")
else () else ()
set(GENERAL_GLOBAL_H_INCLUDE_PATH "<c++utilities/application/global.h>") set(GENERAL_GLOBAL_H_INCLUDE_PATH "<c++utilities/application/global.h>")
endif () endif ()
configure_file("${GLOBAL_H_TEMPLATE_FILE}" configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/global.h" # simply add this to source to ease inclusion "${GLOBAL_H_TEMPLATE_FILE}" "${CMAKE_CURRENT_SOURCE_DIR}/global.h" # simply add this to source to ease inclusion
NEWLINE_STYLE UNIX # since this goes to sources ensure consistency NEWLINE_STYLE UNIX # since this goes to sources ensure consistency
) )
list(APPEND HEADER_FILES global.h) list(APPEND HEADER_FILES global.h)
# add header to check library version # add header to check library version
@ -115,46 +117,45 @@ append_user_defined_additional_libraries()
# add library to be created, set libs to link against, set version and C++ standard # add library to be created, set libs to link against, set version and C++ standard
if (META_HEADER_ONLY_LIB) if (META_HEADER_ONLY_LIB)
add_library(${META_TARGET_NAME} INTERFACE) add_library(${META_TARGET_NAME} INTERFACE)
target_link_libraries(${META_TARGET_NAME} target_link_libraries(${META_TARGET_NAME} INTERFACE ${META_ADDITIONAL_LINK_FLAGS} "${PUBLIC_LIBRARIES}"
INTERFACE ${META_ADDITIONAL_LINK_FLAGS} "${PUBLIC_LIBRARIES}" "${PRIVATE_LIBRARIES}") "${PRIVATE_LIBRARIES}")
target_include_directories(${META_TARGET_NAME} target_include_directories(
INTERFACE $<BUILD_INTERFACE:${TARGET_INCLUDE_DIRECTORY_BUILD_INTERFACE}> ${META_TARGET_NAME} INTERFACE $<BUILD_INTERFACE:${TARGET_INCLUDE_DIRECTORY_BUILD_INTERFACE}>
$<INSTALL_INTERFACE:${HEADER_INSTALL_DESTINATION}> ${PUBLIC_INCLUDE_DIRS}) $<INSTALL_INTERFACE:${HEADER_INSTALL_DESTINATION}> ${PUBLIC_INCLUDE_DIRS})
target_compile_definitions(${META_TARGET_NAME} target_compile_definitions(${META_TARGET_NAME} INTERFACE "${META_PUBLIC_COMPILE_DEFINITIONS}"
INTERFACE
"${META_PUBLIC_COMPILE_DEFINITIONS}"
"${META_PRIVATE_COMPILE_DEFINITIONS}") "${META_PRIVATE_COMPILE_DEFINITIONS}")
target_compile_options(${META_TARGET_NAME} INTERFACE "${META_PUBLIC_COMPILE_OPTIONS}" "${META_PRIVATE_COMPILE_OPTIONS}") target_compile_options(${META_TARGET_NAME} INTERFACE "${META_PUBLIC_COMPILE_OPTIONS}" "${META_PRIVATE_COMPILE_OPTIONS}")
else () else ()
add_library(${META_TARGET_NAME} ${META_LIBRARY_TYPE} ${ALL_FILES}) add_library(${META_TARGET_NAME} ${META_LIBRARY_TYPE} ${ALL_FILES})
target_link_libraries(${META_TARGET_NAME} target_link_libraries(
PUBLIC ${META_ADDITIONAL_LINK_FLAGS} "${PUBLIC_LIBRARIES}" ${META_TARGET_NAME}
PRIVATE "${PRIVATE_LIBRARIES}") PUBLIC ${META_ADDITIONAL_LINK_FLAGS} "${PUBLIC_LIBRARIES}"
target_include_directories(${META_TARGET_NAME} PRIVATE "${PRIVATE_LIBRARIES}")
PUBLIC $<BUILD_INTERFACE:${TARGET_INCLUDE_DIRECTORY_BUILD_INTERFACE}> target_include_directories(
$<INSTALL_INTERFACE:${HEADER_INSTALL_DESTINATION}> ${PUBLIC_INCLUDE_DIRS} ${META_TARGET_NAME}
PRIVATE "${PRIVATE_INCLUDE_DIRS}") PUBLIC $<BUILD_INTERFACE:${TARGET_INCLUDE_DIRECTORY_BUILD_INTERFACE}>
target_compile_definitions(${META_TARGET_NAME} $<INSTALL_INTERFACE:${HEADER_INSTALL_DESTINATION}> ${PUBLIC_INCLUDE_DIRS}
PUBLIC PRIVATE "${PRIVATE_INCLUDE_DIRS}")
"${META_PUBLIC_COMPILE_DEFINITIONS}" target_compile_definitions(${META_TARGET_NAME} PUBLIC "${META_PUBLIC_COMPILE_DEFINITIONS}" PRIVATE
PRIVATE
"${META_PRIVATE_COMPILE_DEFINITIONS}") "${META_PRIVATE_COMPILE_DEFINITIONS}")
target_compile_options(${META_TARGET_NAME} target_compile_options(
PUBLIC "${META_PUBLIC_LIB_COMPILE_OPTIONS}" ${META_TARGET_NAME}
PRIVATE "${META_PRIVATE_LIB_COMPILE_OPTIONS}") PUBLIC "${META_PUBLIC_LIB_COMPILE_OPTIONS}"
set_target_properties(${META_TARGET_NAME} PRIVATE "${META_PRIVATE_LIB_COMPILE_OPTIONS}")
PROPERTIES VERSION set_target_properties(
"${META_VERSION_MAJOR}.${META_VERSION_MINOR}.${META_VERSION_PATCH}" ${META_TARGET_NAME}
SOVERSION PROPERTIES VERSION
"${META_SOVERSION}" "${META_VERSION_MAJOR}.${META_VERSION_MINOR}.${META_VERSION_PATCH}"
CXX_STANDARD SOVERSION
"${META_CXX_STANDARD}" "${META_SOVERSION}"
LINK_SEARCH_START_STATIC CXX_STANDARD
${STATIC_LINKAGE} "${META_CXX_STANDARD}"
LINK_SEARCH_END_STATIC LINK_SEARCH_START_STATIC
${STATIC_LINKAGE} ${STATIC_LINKAGE}
AUTOGEN_TARGET_DEPENDS LINK_SEARCH_END_STATIC
"${AUTOGEN_DEPS}") ${STATIC_LINKAGE}
AUTOGEN_TARGET_DEPENDS
"${AUTOGEN_DEPS}")
if (META_PLUGIN_CATEGORY) if (META_PLUGIN_CATEGORY)
set_target_properties(${META_TARGET_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${META_PLUGIN_CATEGORY}") set_target_properties(${META_TARGET_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${META_PLUGIN_CATEGORY}")
endif () endif ()
@ -181,34 +182,33 @@ if (META_HEADER_ONLY_LIB)
"// not belonging to a real target, only for header-only lib files showing up in Qt Creator") "// not belonging to a real target, only for header-only lib files showing up in Qt Creator")
add_library(${META_TARGET_NAME}_interface_sources_for_qtcreator EXCLUDE_FROM_ALL add_library(${META_TARGET_NAME}_interface_sources_for_qtcreator EXCLUDE_FROM_ALL
"${CMAKE_CURRENT_BINARY_DIR}/headeronly.cpp" ${HEADER_FILES}) "${CMAKE_CURRENT_BINARY_DIR}/headeronly.cpp" ${HEADER_FILES})
target_include_directories(${META_TARGET_NAME}_interface_sources_for_qtcreator target_include_directories(
INTERFACE $<BUILD_INTERFACE:${TARGET_INCLUDE_DIRECTORY_BUILD_INTERFACE}> ${META_TARGET_NAME}_interface_sources_for_qtcreator
$<INSTALL_INTERFACE:${HEADER_INSTALL_DESTINATION}> ${PUBLIC_INCLUDE_DIRS}) INTERFACE $<BUILD_INTERFACE:${TARGET_INCLUDE_DIRECTORY_BUILD_INTERFACE}>
target_compile_definitions(${META_TARGET_NAME}_interface_sources_for_qtcreator $<INSTALL_INTERFACE:${HEADER_INSTALL_DESTINATION}> ${PUBLIC_INCLUDE_DIRS})
INTERFACE target_compile_definitions(${META_TARGET_NAME}_interface_sources_for_qtcreator INTERFACE
"${META_PUBLIC_LIB_COMPILE_DEFINITIONS}" "${META_PUBLIC_LIB_COMPILE_DEFINITIONS}" "${META_PRIVATE_LIB_COMPILE_DEFINITIONS}")
"${META_PRIVATE_LIB_COMPILE_DEFINITIONS}")
target_compile_options(${META_TARGET_NAME}_interface_sources_for_qtcreator target_compile_options(${META_TARGET_NAME}_interface_sources_for_qtcreator
INTERFACE "${META_PUBLIC_LIB_COMPILE_OPTIONS}" "${META_PRIVATE_LIB_COMPILE_OPTIONS}") INTERFACE "${META_PUBLIC_LIB_COMPILE_OPTIONS}" "${META_PRIVATE_LIB_COMPILE_OPTIONS}")
set_target_properties(${META_TARGET_NAME}_interface_sources_for_qtcreator set_target_properties(
PROPERTIES VERSION ${META_TARGET_NAME}_interface_sources_for_qtcreator
"${META_VERSION_MAJOR}.${META_VERSION_MINOR}.${META_VERSION_PATCH}" PROPERTIES VERSION
SOVERSION "${META_VERSION_MAJOR}.${META_VERSION_MINOR}.${META_VERSION_PATCH}"
"${META_SOVERSION}" SOVERSION
CXX_STANDARD "${META_SOVERSION}"
"${META_CXX_STANDARD}" CXX_STANDARD
AUTOGEN_TARGET_DEPENDS "${META_CXX_STANDARD}"
"${AUTOGEN_DEPS}") AUTOGEN_TARGET_DEPENDS
"${AUTOGEN_DEPS}")
endif () endif ()
# generate CMake code to configure additional arguments for required CMake-packages # generate CMake code to configure additional arguments for required CMake-packages
set(ADDITIONAL_ARGUMENTS_FOR_REQUIRED_CMAKE_PACKAGES) set(ADDITIONAL_ARGUMENTS_FOR_REQUIRED_CMAKE_PACKAGES)
foreach (INTERFACE_REQUIRED_PACKAGE ${INTERFACE_REQUIRED_PACKAGES}) foreach (INTERFACE_REQUIRED_PACKAGE ${INTERFACE_REQUIRED_PACKAGES})
if (PACKAGE_ARGS_${INTERFACE_REQUIRED_PACKAGE}) if (PACKAGE_ARGS_${INTERFACE_REQUIRED_PACKAGE})
set( set(ADDITIONAL_ARGUMENTS_FOR_REQUIRED_CMAKE_PACKAGES
ADDITIONAL_ARGUMENTS_FOR_REQUIRED_CMAKE_PACKAGES
"${ADDITIONAL_ARGUMENTS_FOR_REQUIRED_CMAKE_PACKAGES}set(${META_PROJECT_VARNAME_UPPER}_FIND_PACKAGE_ARGS_${INTERFACE_REQUIRED_PACKAGE} \"${PACKAGE_ARGS_${INTERFACE_REQUIRED_PACKAGE}}\")\n" "${ADDITIONAL_ARGUMENTS_FOR_REQUIRED_CMAKE_PACKAGES}set(${META_PROJECT_VARNAME_UPPER}_FIND_PACKAGE_ARGS_${INTERFACE_REQUIRED_PACKAGE} \"${PACKAGE_ARGS_${INTERFACE_REQUIRED_PACKAGE}}\")\n"
) )
endif () endif ()
endforeach () endforeach ()
@ -216,14 +216,10 @@ endforeach ()
set(TARGET_TO_PKG_CONFIG_MODULE_NAME_MAPPING set(TARGET_TO_PKG_CONFIG_MODULE_NAME_MAPPING
"set(PKG_CONFIG_${META_TARGET_NAME} \"${META_PROJECT_NAME}${META_CONFIG_SUFFIX}\")") "set(PKG_CONFIG_${META_TARGET_NAME} \"${META_PROJECT_NAME}${META_CONFIG_SUFFIX}\")")
foreach (INTERFACE_REQUIRED_PKG_CONFIG_MODULE ${INTERFACE_REQUIRED_PKG_CONFIG_MODULES}) foreach (INTERFACE_REQUIRED_PKG_CONFIG_MODULE ${INTERFACE_REQUIRED_PKG_CONFIG_MODULES})
string(REPLACE "::" string(REPLACE "::" "_" INTERFACE_REQUIRED_PKG_CONFIG_MODULE_VARNAME "${INTERFACE_REQUIRED_PKG_CONFIG_MODULE}")
"_" set(TARGET_TO_PKG_CONFIG_MODULE_NAME_MAPPING
INTERFACE_REQUIRED_PKG_CONFIG_MODULE_VARNAME
"${INTERFACE_REQUIRED_PKG_CONFIG_MODULE}")
set(
TARGET_TO_PKG_CONFIG_MODULE_NAME_MAPPING
"${TARGET_TO_PKG_CONFIG_MODULE_NAME_MAPPING}\nset(PKG_CONFIG_${INTERFACE_REQUIRED_PKG_CONFIG_MODULE_VARNAME} \"${PKG_CONFIG_${INTERFACE_REQUIRED_PKG_CONFIG_MODULE_VARNAME}}\")" "${TARGET_TO_PKG_CONFIG_MODULE_NAME_MAPPING}\nset(PKG_CONFIG_${INTERFACE_REQUIRED_PKG_CONFIG_MODULE_VARNAME} \"${PKG_CONFIG_${INTERFACE_REQUIRED_PKG_CONFIG_MODULE_VARNAME}}\")"
) )
endforeach () endforeach ()
# create the CMake package config file from template # create the CMake package config file from template
@ -241,31 +237,29 @@ if (META_CONFIG_SUFFIX)
endif () endif ()
find_template_file("Config.cmake" CPP_UTILITIES CONFIG_TEMPLATE_FILE) find_template_file("Config.cmake" CPP_UTILITIES CONFIG_TEMPLATE_FILE)
foreach (CONFIG_TARGET ${CONFIG_TARGETS}) foreach (CONFIG_TARGET ${CONFIG_TARGETS})
configure_package_config_file("${CONFIG_TEMPLATE_FILE}" configure_package_config_file(
"${CONFIG_TARGET}" "${CONFIG_TEMPLATE_FILE}"
INSTALL_DESTINATION "${CONFIG_TARGET}"
"${CMAKE_CONFIG_INSTALL_DESTINATION}" INSTALL_DESTINATION
PATH_VARS "${CMAKE_CONFIG_INSTALL_DESTINATION}"
CMAKE_MODULE_INSTALL_DESTINATION PATH_VARS
CMAKE_CONFIG_INSTALL_DESTINATION CMAKE_MODULE_INSTALL_DESTINATION
HEADER_INSTALL_DESTINATION CMAKE_CONFIG_INSTALL_DESTINATION
BIN_INSTALL_DESTINATION HEADER_INSTALL_DESTINATION
LIB_INSTALL_DESTINATION) BIN_INSTALL_DESTINATION
LIB_INSTALL_DESTINATION)
endforeach () endforeach ()
list(APPEND CMAKE_CONFIG_FILES "${CMAKE_CURRENT_BINARY_DIR}/${META_PROJECT_NAME}${META_CONFIG_SUFFIX}Config.cmake" list(APPEND CMAKE_CONFIG_FILES "${CMAKE_CURRENT_BINARY_DIR}/${META_PROJECT_NAME}${META_CONFIG_SUFFIX}Config.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/${META_PROJECT_NAME}${META_CONFIG_SUFFIX}ConfigVersion.cmake") "${CMAKE_CURRENT_BINARY_DIR}/${META_PROJECT_NAME}${META_CONFIG_SUFFIX}ConfigVersion.cmake")
# write the CMake version config file # write the CMake version config file
write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/${META_PROJECT_NAME}${META_CONFIG_SUFFIX}ConfigVersion.cmake write_basic_package_version_file(
VERSION "${META_VERSION_MAJOR}.${META_VERSION_MINOR}.${META_VERSION_PATCH}" ${CMAKE_CURRENT_BINARY_DIR}/${META_PROJECT_NAME}${META_CONFIG_SUFFIX}ConfigVersion.cmake
COMPATIBILITY SameMajorVersion) VERSION "${META_VERSION_MAJOR}.${META_VERSION_MINOR}.${META_VERSION_PATCH}"
COMPATIBILITY SameMajorVersion)
# compute dependencies for pkg-config file # compute dependencies for pkg-config file
macro (compute_dependencies_for_package_config macro (compute_dependencies_for_package_config DEPENDS OUTPUT_VAR_PKGS OUTPUT_VAR_LIBS UNSET)
DEPENDS
OUTPUT_VAR_PKGS
OUTPUT_VAR_LIBS
UNSET)
if (UNSET) if (UNSET)
unset(${OUTPUT_VAR_PKGS}) unset(${OUTPUT_VAR_PKGS})
unset(${OUTPUT_VAR_LIBS}) unset(${OUTPUT_VAR_LIBS})
@ -281,10 +275,7 @@ macro (compute_dependencies_for_package_config
continue() continue()
endif () endif ()
# find the name of the pkg-config package for the depencency # find the name of the pkg-config package for the depencency
string(REPLACE "::" string(REPLACE "::" "_" DEPENDENCY_VARNAME "${DEPENDENCY}")
"_"
DEPENDENCY_VARNAME
"${DEPENDENCY}")
if (PKG_CONFIG_${DEPENDENCY_VARNAME}) if (PKG_CONFIG_${DEPENDENCY_VARNAME})
# add pkg-config modules for the dependency # add pkg-config modules for the dependency
foreach (PKG_CONFIG_MODULE ${PKG_CONFIG_${DEPENDENCY_VARNAME}}) foreach (PKG_CONFIG_MODULE ${PKG_CONFIG_${DEPENDENCY_VARNAME}})
@ -305,9 +296,7 @@ macro (compute_dependencies_for_package_config
endif () endif ()
endforeach () endforeach ()
compute_dependencies_for_package_config("${DEPENDENCY_VARNAME}_INTERFACE_LINK_LIBRARIES_TARGETS" compute_dependencies_for_package_config("${DEPENDENCY_VARNAME}_INTERFACE_LINK_LIBRARIES_TARGETS"
"${OUTPUT_VAR_PKGS}" "${OUTPUT_VAR_PKGS}" "${OUTPUT_VAR_LIBS}" NO)
"${OUTPUT_VAR_LIBS}"
NO)
if (${DEPENDENCY_VARNAME}_INTERFACE_LINK_LIBRARIES_EXISTING) if (${DEPENDENCY_VARNAME}_INTERFACE_LINK_LIBRARIES_EXISTING)
continue() continue()
endif () endif ()
@ -326,10 +315,7 @@ macro (compute_dependencies_for_package_config
# location # location
string(FIND "${${DEPENDENCY_VARNAME}_IMPORTED_LOCATION_${META_CURRENT_CONFIGURATION}}" string(FIND "${${DEPENDENCY_VARNAME}_IMPORTED_LOCATION_${META_CURRENT_CONFIGURATION}}"
"${CMAKE_CURRENT_BINARY_DIR}" BINARY_DIR_INDEX) "${CMAKE_CURRENT_BINARY_DIR}" BINARY_DIR_INDEX)
if (NOT if (NOT BINARY_DIR_INDEX EQUAL 0
BINARY_DIR_INDEX
EQUAL
0
AND EXISTS "${${DEPENDENCY_VARNAME}_IMPORTED_LOCATION_${META_CURRENT_CONFIGURATION}}") AND EXISTS "${${DEPENDENCY_VARNAME}_IMPORTED_LOCATION_${META_CURRENT_CONFIGURATION}}")
set(${OUTPUT_VAR_LIBS} set(${OUTPUT_VAR_LIBS}
"${${OUTPUT_VAR_LIBS}} ${${DEPENDENCY_VARNAME}_IMPORTED_LOCATION_${META_CURRENT_CONFIGURATION}}") "${${OUTPUT_VAR_LIBS}} ${${DEPENDENCY_VARNAME}_IMPORTED_LOCATION_${META_CURRENT_CONFIGURATION}}")
@ -356,23 +342,15 @@ macro (compute_dependencies_for_package_config
get_target_property("${DEPENDENCY_VARNAME}_IMPORTED_LINK_INTERFACE_LIBRARIES" "${DEPENDENCY}" get_target_property("${DEPENDENCY_VARNAME}_IMPORTED_LINK_INTERFACE_LIBRARIES" "${DEPENDENCY}"
"IMPORTED_LINK_INTERFACE_LIBRARIES") "IMPORTED_LINK_INTERFACE_LIBRARIES")
compute_dependencies_for_package_config("${DEPENDENCY_VARNAME}_IMPORTED_LINK_INTERFACE_LIBRARIES" compute_dependencies_for_package_config("${DEPENDENCY_VARNAME}_IMPORTED_LINK_INTERFACE_LIBRARIES"
"${OUTPUT_VAR_PKGS}" "${OUTPUT_VAR_PKGS}" "${OUTPUT_VAR_LIBS}" NO)
"${OUTPUT_VAR_LIBS}"
NO)
else () else ()
# add raw dependency # add raw dependency
set(${OUTPUT_VAR_LIBS} "${${OUTPUT_VAR_LIBS}} ${DEPENDENCY}") set(${OUTPUT_VAR_LIBS} "${${OUTPUT_VAR_LIBS}} ${DEPENDENCY}")
endif () endif ()
endforeach () endforeach ()
endmacro () endmacro ()
compute_dependencies_for_package_config(META_PUBLIC_LIB_DEPENDS compute_dependencies_for_package_config(META_PUBLIC_LIB_DEPENDS META_PUBLIC_PC_PKGS META_PUBLIC_LIB_DEPENDS_FOR_PC YES)
META_PUBLIC_PC_PKGS compute_dependencies_for_package_config(META_PRIVATE_LIB_DEPENDS META_PRIVATE_PC_PKGS META_PRIVATE_LIB_DEPENDS_FOR_PC YES)
META_PUBLIC_LIB_DEPENDS_FOR_PC
YES)
compute_dependencies_for_package_config(META_PRIVATE_LIB_DEPENDS
META_PRIVATE_PC_PKGS
META_PRIVATE_LIB_DEPENDS_FOR_PC
YES)
if (NOT META_HEADER_ONLY_LIB) if (NOT META_HEADER_ONLY_LIB)
set(META_PUBLIC_LIB_DEPENDS_FOR_PC " -l${META_TARGET_NAME}${META_PUBLIC_LIB_DEPENDS_FOR_PC}") set(META_PUBLIC_LIB_DEPENDS_FOR_PC " -l${META_TARGET_NAME}${META_PUBLIC_LIB_DEPENDS_FOR_PC}")
endif () endif ()
@ -394,44 +372,38 @@ set(PC_FILES "${CMAKE_CURRENT_BINARY_DIR}/${META_PROJECT_NAME_FOR_PC}.pc")
# add install targets # add install targets
if (NOT META_NO_INSTALL_TARGETS AND ENABLE_INSTALL_TARGETS) if (NOT META_NO_INSTALL_TARGETS AND ENABLE_INSTALL_TARGETS)
# add install target for the CMake config files # add install target for the CMake config files
install(FILES ${CMAKE_CONFIG_FILES} DESTINATION "${META_DATA_DIR}/cmake" COMPONENT cmake-config) install(
FILES ${CMAKE_CONFIG_FILES}
DESTINATION "${META_DATA_DIR}/cmake"
COMPONENT cmake-config)
if (NOT TARGET install-cmake-config) if (NOT TARGET install-cmake-config)
add_custom_target(install-cmake-config add_custom_target(install-cmake-config COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=cmake-config -P
COMMAND "${CMAKE_COMMAND}" "${CMAKE_BINARY_DIR}/cmake_install.cmake")
-DCMAKE_INSTALL_COMPONENT=cmake-config
-P
"${CMAKE_BINARY_DIR}/cmake_install.cmake")
endif () endif ()
# add install target for pkg-config file # add install target for pkg-config file
if (PC_FILES) if (PC_FILES)
install(FILES ${PC_FILES} DESTINATION "lib${SELECTED_LIB_SUFFIX}/pkgconfig" COMPONENT pkg-config) install(
FILES ${PC_FILES}
DESTINATION "lib${SELECTED_LIB_SUFFIX}/pkgconfig"
COMPONENT pkg-config)
endif () endif ()
if (NOT TARGET install-pkg-config) if (NOT TARGET install-pkg-config)
add_custom_target(install-pkg-config add_custom_target(install-pkg-config COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=pkg-config -P
COMMAND "${CMAKE_COMMAND}" "${CMAKE_BINARY_DIR}/cmake_install.cmake")
-DCMAKE_INSTALL_COMPONENT=pkg-config
-P
"${CMAKE_BINARY_DIR}/cmake_install.cmake")
endif () endif ()
# add install target for libs # add install target for libs
if (NOT TARGET install-binary) if (NOT TARGET install-binary)
add_custom_target(install-binary add_custom_target(install-binary COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=binary -P
COMMAND "${CMAKE_COMMAND}" "${CMAKE_BINARY_DIR}/cmake_install.cmake")
-DCMAKE_INSTALL_COMPONENT=binary
-P
"${CMAKE_BINARY_DIR}/cmake_install.cmake")
endif () endif ()
# add install target for stripped libs # add install target for stripped libs
if (NOT TARGET install-binary-strip) if (NOT TARGET install-binary-strip)
add_custom_target(install-binary-strip add_custom_target(
COMMAND "${CMAKE_COMMAND}" install-binary-strip COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_DO_STRIP=1 -DCMAKE_INSTALL_COMPONENT=binary -P
-DCMAKE_INSTALL_DO_STRIP=1 "${CMAKE_BINARY_DIR}/cmake_install.cmake")
-DCMAKE_INSTALL_COMPONENT=binary
-P
"${CMAKE_BINARY_DIR}/cmake_install.cmake")
endif () endif ()
# determine install dir for Qt plugins # determine install dir for Qt plugins
@ -451,7 +423,7 @@ if (NOT META_NO_INSTALL_TARGETS AND ENABLE_INSTALL_TARGETS)
message( message(
WARNING WARNING
"According to qmake the Qt plugin directory is \"${QT_INSTALL_PLUGINS}\". However, that path is not within the install prefix \"${CMAKE_INSTALL_PREFIX}\" and therefore ignored." "According to qmake the Qt plugin directory is \"${QT_INSTALL_PLUGINS}\". However, that path is not within the install prefix \"${CMAKE_INSTALL_PREFIX}\" and therefore ignored."
) )
endif () endif ()
endif () endif ()
if (NOT LIBRARY_DESTINATION) if (NOT LIBRARY_DESTINATION)
@ -459,7 +431,7 @@ if (NOT META_NO_INSTALL_TARGETS AND ENABLE_INSTALL_TARGETS)
message( message(
WARNING WARNING
"Unable to detect appropriate install directory for Qt plugins (assuming \"${LIBRARY_DESTINATION}\"). Set QT_PLUGIN_DIR to specify the directory to install Qt plugins to manually." "Unable to detect appropriate install directory for Qt plugins (assuming \"${LIBRARY_DESTINATION}\"). Set QT_PLUGIN_DIR to specify the directory to install Qt plugins to manually."
) )
endif () endif ()
endif () endif ()
if (META_PLUGIN_CATEGORY) if (META_PLUGIN_CATEGORY)
@ -472,83 +444,80 @@ if (NOT META_NO_INSTALL_TARGETS AND ENABLE_INSTALL_TARGETS)
# add install targets and export targets # add install targets and export targets
set(TARGETS_TO_EXPORT "${META_TARGET_NAME}") set(TARGETS_TO_EXPORT "${META_TARGET_NAME}")
foreach (BUNDLED_TARGET ${BUNDLED_TARGETS}) foreach (BUNDLED_TARGET ${BUNDLED_TARGETS})
if (NOT if (NOT ${BUNDLED_TARGET} IN_LIST LIBRARIES OR (NOT BUILD_SHARED_LIBS AND ${BUNDLED_TARGET} IN_LIST PRIVATE_LIBRARIES
${BUNDLED_TARGET} ))
IN_LIST
LIBRARIES
OR (NOT BUILD_SHARED_LIBS AND ${BUNDLED_TARGET} IN_LIST PRIVATE_LIBRARIES))
list(APPEND TARGETS_TO_EXPORT ${BUNDLED_TARGET}) list(APPEND TARGETS_TO_EXPORT ${BUNDLED_TARGET})
endif () endif ()
endforeach () endforeach ()
install(TARGETS ${TARGETS_TO_EXPORT} install(
EXPORT "${META_PROJECT_NAME}${META_CONFIG_SUFFIX}Targets" TARGETS ${TARGETS_TO_EXPORT}
RUNTIME DESTINATION bin COMPONENT binary EXPORT "${META_PROJECT_NAME}${META_CONFIG_SUFFIX}Targets"
LIBRARY DESTINATION ${LIBRARY_DESTINATION} COMPONENT binary RUNTIME DESTINATION bin COMPONENT binary
ARCHIVE DESTINATION ${LIBRARY_DESTINATION} COMPONENT binary) LIBRARY DESTINATION ${LIBRARY_DESTINATION} COMPONENT binary
ARCHIVE DESTINATION ${LIBRARY_DESTINATION} COMPONENT binary)
add_dependencies(install-binary "${META_TARGET_NAME}") add_dependencies(install-binary "${META_TARGET_NAME}")
add_dependencies(install-binary-strip "${META_TARGET_NAME}") add_dependencies(install-binary-strip "${META_TARGET_NAME}")
install(EXPORT ${META_PROJECT_NAME}${META_CONFIG_SUFFIX}Targets install(
DESTINATION "${META_DATA_DIR}/cmake" EXPORT ${META_PROJECT_NAME}${META_CONFIG_SUFFIX}Targets
EXPORT_LINK_INTERFACE_LIBRARIES DESTINATION "${META_DATA_DIR}/cmake"
COMPONENT cmake-config) EXPORT_LINK_INTERFACE_LIBRARIES
COMPONENT cmake-config)
# add install target for header files # add install target for header files
if (NOT META_IS_PLUGIN) if (NOT META_IS_PLUGIN)
foreach (HEADER_FILE ${HEADER_FILES} ${ADDITIONAL_HEADER_FILES}) foreach (HEADER_FILE ${HEADER_FILES} ${ADDITIONAL_HEADER_FILES})
get_filename_component(HEADER_DIR "${HEADER_FILE}" DIRECTORY) get_filename_component(HEADER_DIR "${HEADER_FILE}" DIRECTORY)
install(FILES "${HEADER_FILE}" install(
DESTINATION "${INCLUDE_SUBDIR}/${META_PROJECT_NAME}/${HEADER_DIR}" FILES "${HEADER_FILE}"
COMPONENT header) DESTINATION "${INCLUDE_SUBDIR}/${META_PROJECT_NAME}/${HEADER_DIR}"
COMPONENT header)
endforeach () endforeach ()
install(FILES "${VERSION_HEADER_FILE}" DESTINATION "${INCLUDE_SUBDIR}/${META_PROJECT_NAME}" COMPONENT header) install(
FILES "${VERSION_HEADER_FILE}"
DESTINATION "${INCLUDE_SUBDIR}/${META_PROJECT_NAME}"
COMPONENT header)
if (NOT TARGET install-header) if (NOT TARGET install-header)
add_custom_target(install-header add_custom_target(install-header COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=header -P
COMMAND "${CMAKE_COMMAND}" "${CMAKE_BINARY_DIR}/cmake_install.cmake")
-DCMAKE_INSTALL_COMPONENT=header
-P
"${CMAKE_BINARY_DIR}/cmake_install.cmake")
endif () endif ()
endif () endif ()
# add install target for CMake modules # add install target for CMake modules
foreach (CMAKE_MODULE_FILE ${CMAKE_MODULE_FILES}) foreach (CMAKE_MODULE_FILE ${CMAKE_MODULE_FILES})
get_filename_component(CMAKE_MODULE_DIR ${CMAKE_MODULE_FILE} DIRECTORY) get_filename_component(CMAKE_MODULE_DIR ${CMAKE_MODULE_FILE} DIRECTORY)
install(FILES ${CMAKE_MODULE_FILE} DESTINATION ${META_DATA_DIR}/${CMAKE_MODULE_DIR} COMPONENT cmake-modules) install(
FILES ${CMAKE_MODULE_FILE}
DESTINATION ${META_DATA_DIR}/${CMAKE_MODULE_DIR}
COMPONENT cmake-modules)
endforeach () endforeach ()
if (NOT TARGET install-cmake-modules) if (NOT TARGET install-cmake-modules)
add_custom_target(install-cmake-modules add_custom_target(install-cmake-modules COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=cmake-modules -P
COMMAND "${CMAKE_COMMAND}" "${CMAKE_BINARY_DIR}/cmake_install.cmake")
-DCMAKE_INSTALL_COMPONENT=cmake-modules
-P
"${CMAKE_BINARY_DIR}/cmake_install.cmake")
endif () endif ()
# add install target for CMake templates # add install target for CMake templates
foreach (CMAKE_TEMPLATE_FILE ${CMAKE_TEMPLATE_FILES}) foreach (CMAKE_TEMPLATE_FILE ${CMAKE_TEMPLATE_FILES})
get_filename_component(CMAKE_TEMPLATE_DIR ${CMAKE_TEMPLATE_FILE} DIRECTORY) get_filename_component(CMAKE_TEMPLATE_DIR ${CMAKE_TEMPLATE_FILE} DIRECTORY)
install(FILES ${CMAKE_TEMPLATE_FILE} DESTINATION ${META_DATA_DIR}/${CMAKE_TEMPLATE_DIR} COMPONENT cmake-templates) install(
FILES ${CMAKE_TEMPLATE_FILE}
DESTINATION ${META_DATA_DIR}/${CMAKE_TEMPLATE_DIR}
COMPONENT cmake-templates)
endforeach () endforeach ()
if (NOT TARGET install-cmake-templates) if (NOT TARGET install-cmake-templates)
add_custom_target(install-cmake-templates add_custom_target(install-cmake-templates COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=cmake-templates -P
COMMAND "${CMAKE_COMMAND}" "${CMAKE_BINARY_DIR}/cmake_install.cmake")
-DCMAKE_INSTALL_COMPONENT=cmake-templates
-P
"${CMAKE_BINARY_DIR}/cmake_install.cmake")
endif () endif ()
# add install target for all the cmake stuff # add install target for all the cmake stuff
if (NOT TARGET install-cmake-stuff) if (NOT TARGET install-cmake-stuff)
add_custom_target(install-cmake-stuff) add_custom_target(install-cmake-stuff)
add_dependencies(install-cmake-stuff add_dependencies(install-cmake-stuff install-cmake-config install-cmake-modules install-cmake-templates)
install-cmake-config
install-cmake-modules
install-cmake-templates)
endif () endif ()
# add targets to ease creating mingw-w64 packages under Arch Linux # add targets to ease creating mingw-w64 packages under Arch Linux
if (MINGW) if (MINGW)
option(ENABLE_TARGETS_FOR_MINGW_CROSS_PACKAGING "enable targets to ease creating mingw-w64 packages under Arch Linux" option(ENABLE_TARGETS_FOR_MINGW_CROSS_PACKAGING
OFF) "enable targets to ease creating mingw-w64 packages under Arch Linux" OFF)
else () else ()
set(ENABLE_TARGETS_FOR_MINGW_CROSS_PACKAGING OFF) set(ENABLE_TARGETS_FOR_MINGW_CROSS_PACKAGING OFF)
endif () endif ()
@ -556,19 +525,11 @@ if (NOT META_NO_INSTALL_TARGETS AND ENABLE_INSTALL_TARGETS)
if (NOT TARGET install-mingw-w64) if (NOT TARGET install-mingw-w64)
add_custom_target(install-mingw-w64) add_custom_target(install-mingw-w64)
endif () endif ()
add_dependencies(install-mingw-w64 add_dependencies(install-mingw-w64 install-binary install-header install-cmake-stuff install-pkg-config)
install-binary
install-header
install-cmake-stuff
install-pkg-config)
if (NOT TARGET install-mingw-w64-strip) if (NOT TARGET install-mingw-w64-strip)
add_custom_target(install-mingw-w64-strip) add_custom_target(install-mingw-w64-strip)
endif () endif ()
add_dependencies(install-mingw-w64-strip add_dependencies(install-mingw-w64-strip install-binary-strip install-header install-cmake-stuff install-pkg-config)
install-binary-strip
install-header
install-cmake-stuff
install-pkg-config)
if (LOCALIZATION_TARGET) if (LOCALIZATION_TARGET)
add_dependencies(install-mingw-w64 ${LOCALIZATION_TARGET}) add_dependencies(install-mingw-w64 ${LOCALIZATION_TARGET})
add_dependencies(install-mingw-w64-strip ${LOCALIZATION_TARGET}) add_dependencies(install-mingw-w64-strip ${LOCALIZATION_TARGET})
@ -588,9 +549,10 @@ if (NOT META_NO_INSTALL_TARGETS AND ENABLE_INSTALL_TARGETS)
add_dependencies(install-mingw-w64-strip install-${META_TARGET_NAME}-mingw-w64-importlib-strip) add_dependencies(install-mingw-w64-strip install-${META_TARGET_NAME}-mingw-w64-importlib-strip)
endif () endif ()
if (BUILD_STATIC_LIBS AND NOT META_HEADER_ONLY_LIB) if (BUILD_STATIC_LIBS AND NOT META_HEADER_ONLY_LIB)
add_custom_target(install-${META_TARGET_NAME}-mingw-w64-staticlib-strip add_custom_target(
COMMAND "${STRIP_BINARY_PATH}" -g install-${META_TARGET_NAME}-mingw-w64-staticlib-strip
"\$\{DESTDIR\}\$\{DESTDIR:+/\}${CMAKE_INSTALL_PREFIX}/lib/lib${META_TARGET_NAME}.a") COMMAND "${STRIP_BINARY_PATH}" -g
"\$\{DESTDIR\}\$\{DESTDIR:+/\}${CMAKE_INSTALL_PREFIX}/lib/lib${META_TARGET_NAME}.a")
add_dependencies(install-${META_TARGET_NAME}-mingw-w64-staticlib-strip install-binary-strip) add_dependencies(install-${META_TARGET_NAME}-mingw-w64-staticlib-strip install-binary-strip)
add_dependencies(install-mingw-w64-strip install-${META_TARGET_NAME}-mingw-w64-staticlib-strip) add_dependencies(install-mingw-w64-strip install-${META_TARGET_NAME}-mingw-w64-staticlib-strip)
endif () endif ()

View File

@ -4,12 +4,7 @@ if (DEFINED LIST_TO_STRING_LOADED)
endif () endif ()
set(LIST_TO_STRING_LOADED ON) set(LIST_TO_STRING_LOADED ON)
function (list_to_string function (list_to_string separator prefix suffix input_list output_string_var)
separator
prefix
suffix
input_list
output_string_var)
set(res "") set(res "")
# get list length # get list length
list(LENGTH input_list list_length) list(LENGTH input_list list_length)
@ -31,5 +26,7 @@ function (list_to_string
endif () endif ()
endforeach () endforeach ()
endif () endif ()
set(${output_string_var} "${res}" PARENT_SCOPE) set(${output_string_var}
"${res}"
PARENT_SCOPE)
endfunction () endfunction ()

View File

@ -20,15 +20,13 @@ if (BASH_COMPLETION_ENABLED)
# add install target bash completion # add install target bash completion
if (NOT META_NO_INSTALL_TARGETS AND ENABLE_INSTALL_TARGETS) if (NOT META_NO_INSTALL_TARGETS AND ENABLE_INSTALL_TARGETS)
install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bash-completion/completions" install(
DESTINATION "share/bash-completion" DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bash-completion/completions"
COMPONENT bash-completion) DESTINATION "share/bash-completion"
COMPONENT bash-completion)
if (NOT TARGET install-bash-completion) if (NOT TARGET install-bash-completion)
add_custom_target(install-bash-completion add_custom_target(install-bash-completion COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=bash-completion
COMMAND "${CMAKE_COMMAND}" -P "${CMAKE_BINARY_DIR}/cmake_install.cmake")
-DCMAKE_INSTALL_COMPONENT=bash-completion
-P
"${CMAKE_BINARY_DIR}/cmake_install.cmake")
endif () endif ()
endif () endif ()

View File

@ -4,21 +4,24 @@ if (DEFINED TEMPLATE_FINDER_LOADED)
endif () endif ()
set(TEMPLATE_FINDER_LOADED YES) set(TEMPLATE_FINDER_LOADED YES)
function (find_template_file function (find_template_file FILE_NAME PROJECT_VAR_NAME OUTPUT_VAR)
FILE_NAME
PROJECT_VAR_NAME
OUTPUT_VAR)
if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/cmake/templates/${FILE_NAME}.in") if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/cmake/templates/${FILE_NAME}.in")
# check own source directory # check own source directory
set(${OUTPUT_VAR} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/templates/${FILE_NAME}.in" PARENT_SCOPE) set(${OUTPUT_VAR}
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/templates/${FILE_NAME}.in"
PARENT_SCOPE)
message(STATUS "Using template for ${FILE_NAME} from own (${META_PROJECT_NAME}) source directory.") message(STATUS "Using template for ${FILE_NAME} from own (${META_PROJECT_NAME}) source directory.")
elseif (EXISTS "${${PROJECT_VAR_NAME}_SOURCE_DIR}/cmake/templates/${FILE_NAME}.in") elseif (EXISTS "${${PROJECT_VAR_NAME}_SOURCE_DIR}/cmake/templates/${FILE_NAME}.in")
# check sources of project # check sources of project
set(${OUTPUT_VAR} "${${PROJECT_VAR_NAME}_SOURCE_DIR}/cmake/templates/${FILE_NAME}.in" PARENT_SCOPE) set(${OUTPUT_VAR}
"${${PROJECT_VAR_NAME}_SOURCE_DIR}/cmake/templates/${FILE_NAME}.in"
PARENT_SCOPE)
message(STATUS "Using template for ${FILE_NAME} from ${PROJECT_VAR_NAME} source directory.") message(STATUS "Using template for ${FILE_NAME} from ${PROJECT_VAR_NAME} source directory.")
elseif (EXISTS "${${PROJECT_VAR_NAME}_CONFIG_DIRS}/templates/${FILE_NAME}.in") elseif (EXISTS "${${PROJECT_VAR_NAME}_CONFIG_DIRS}/templates/${FILE_NAME}.in")
# check installed version of project # check installed version of project
set(${OUTPUT_VAR} "${${PROJECT_VAR_NAME}_CONFIG_DIRS}/templates/${FILE_NAME}.in" PARENT_SCOPE) set(${OUTPUT_VAR}
"${${PROJECT_VAR_NAME}_CONFIG_DIRS}/templates/${FILE_NAME}.in"
PARENT_SCOPE)
message(STATUS "Using template for ${FILE_NAME} from ${PROJECT_VAR_NAME} installation.") message(STATUS "Using template for ${FILE_NAME} from ${PROJECT_VAR_NAME} installation.")
else () else ()
message(FATAL_ERROR "Template for ${FILE_NAME} file can not be located.") message(FATAL_ERROR "Template for ${FILE_NAME} file can not be located.")

View File

@ -10,8 +10,12 @@ option(EXCLUDE_TESTS_FROM_ALL "specifies whether to exclude tests from the \"all
# find and link against cppunit if required (used by all my projects, so it is required by default) # find and link against cppunit if required (used by all my projects, so it is required by default)
if (NOT META_NO_CPP_UNIT) if (NOT META_NO_CPP_UNIT)
# make cppunit library/include dir configurable # make cppunit library/include dir configurable
set(CPP_UNIT_LIB NOTFOUND CACHE FILEPATH "cppunit lib" FORCE) set(CPP_UNIT_LIB
set(CPP_UNIT_INCLUDE_DIR NOTFOUND CACHE FILEPATH "cppunit include dir" FORCE) NOTFOUND
CACHE FILEPATH "cppunit lib" FORCE)
set(CPP_UNIT_INCLUDE_DIR
NOTFOUND
CACHE FILEPATH "cppunit include dir" FORCE)
# set default for minimum version (only checked when using pkg-config) # set default for minimum version (only checked when using pkg-config)
if (NOT META_REQUIRED_CPP_UNIT_VERSION) if (NOT META_REQUIRED_CPP_UNIT_VERSION)
@ -23,8 +27,9 @@ if (NOT META_NO_CPP_UNIT)
include(FindPkgConfig) include(FindPkgConfig)
pkg_search_module(CPP_UNIT_CONFIG_${META_PROJECT_NAME} cppunit>=${META_REQUIRED_CPP_UNIT_VERSION}) pkg_search_module(CPP_UNIT_CONFIG_${META_PROJECT_NAME} cppunit>=${META_REQUIRED_CPP_UNIT_VERSION})
if (CPP_UNIT_CONFIG_${META_PROJECT_NAME}_FOUND) if (CPP_UNIT_CONFIG_${META_PROJECT_NAME}_FOUND)
set(CPP_UNIT_LIB "${CPP_UNIT_CONFIG_${META_PROJECT_NAME}_LDFLAGS_OTHER}" set(CPP_UNIT_LIB
"${CPP_UNIT_CONFIG_${META_PROJECT_NAME}_LIBRARIES}" CACHE FILEPATH "cppunit lib" FORCE) "${CPP_UNIT_CONFIG_${META_PROJECT_NAME}_LDFLAGS_OTHER}" "${CPP_UNIT_CONFIG_${META_PROJECT_NAME}_LIBRARIES}"
CACHE FILEPATH "cppunit lib" FORCE)
set(CPP_UNIT_INCLUDE_DIR set(CPP_UNIT_INCLUDE_DIR
${CPP_UNIT_CONFIG_${META_PROJECT_NAME}_INCLUDE_DIRS} ${CPP_UNIT_CONFIG_${META_PROJECT_NAME}_INCLUDE_DIRS}
CACHE FILEPATH "cppunit include dir" FORCE) CACHE FILEPATH "cppunit include dir" FORCE)
@ -32,7 +37,9 @@ if (NOT META_NO_CPP_UNIT)
else () else ()
# fall back to find_library # fall back to find_library
find_library(DETECTED_CPP_UNIT_LIB cppunit) find_library(DETECTED_CPP_UNIT_LIB cppunit)
set(CPP_UNIT_LIB "${DETECTED_CPP_UNIT_LIB}" CACHE FILEPATH "cppunit lib" FORCE) set(CPP_UNIT_LIB
"${DETECTED_CPP_UNIT_LIB}"
CACHE FILEPATH "cppunit lib" FORCE)
endif () endif ()
endif () endif ()
@ -48,7 +55,7 @@ if (NOT META_NO_CPP_UNIT)
message( message(
WARNING WARNING
"Cppunit not detected via pkg-config so the version couldn't be checked. Required version for ${META_PROJECT_NAME} is ${META_REQUIRED_CPP_UNIT_VERSION}." "Cppunit not detected via pkg-config so the version couldn't be checked. Required version for ${META_PROJECT_NAME} is ${META_REQUIRED_CPP_UNIT_VERSION}."
) )
endif () endif ()
if (CPP_UNIT_INCLUDE_DIR) if (CPP_UNIT_INCLUDE_DIR)
@ -62,7 +69,7 @@ if (META_ADD_DEFAULT_CPP_UNIT_TEST_APPLICATION)
message( message(
FATAL_ERROR FATAL_ERROR
"Project ${META_PROJECT_NAME} has META_ADD_DEFAULT_CPP_UNIT_TEST_APPLICATION and META_NO_CPP_UNIT enabled at the same time." "Project ${META_PROJECT_NAME} has META_ADD_DEFAULT_CPP_UNIT_TEST_APPLICATION and META_NO_CPP_UNIT enabled at the same time."
) )
endif () endif ()
set(DEFAULT_CPP_UNIT_TEST_APPLICATION_SRC "${CMAKE_CURRENT_BINARY_DIR}/cppunit.cpp") set(DEFAULT_CPP_UNIT_TEST_APPLICATION_SRC "${CMAKE_CURRENT_BINARY_DIR}/cppunit.cpp")
@ -100,39 +107,34 @@ if (META_PROJECT_IS_APPLICATION)
# using functions directly from the tests might be required -> also create a 'testlib' and link tests against it # using functions directly from the tests might be required -> also create a 'testlib' and link tests against it
if (LINK_TESTS_AGAINST_APP_TARGET) if (LINK_TESTS_AGAINST_APP_TARGET)
# create target for the 'testlib' # create target for the 'testlib'
set(TESTLIB_FILES set(TESTLIB_FILES ${HEADER_FILES} ${SRC_FILES} ${WIDGETS_FILES} ${QML_FILES} ${RES_FILES} ${QM_FILES})
${HEADER_FILES}
${SRC_FILES}
${WIDGETS_FILES}
${QML_FILES}
${RES_FILES}
${QM_FILES})
list(REMOVE_ITEM TESTLIB_FILES main.h main.cpp) list(REMOVE_ITEM TESTLIB_FILES main.h main.cpp)
add_library(${META_TARGET_NAME}_testlib SHARED ${TESTLIB_FILES}) add_library(${META_TARGET_NAME}_testlib SHARED ${TESTLIB_FILES})
target_link_libraries(${META_TARGET_NAME}_testlib target_link_libraries(
PUBLIC ${META_ADDITIONAL_LINK_FLAGS} "${PUBLIC_LIBRARIES}" ${META_TARGET_NAME}_testlib
PRIVATE "${PRIVATE_LIBRARIES}") PUBLIC ${META_ADDITIONAL_LINK_FLAGS} "${PUBLIC_LIBRARIES}"
target_include_directories(${META_TARGET_NAME}_testlib PRIVATE "${PRIVATE_LIBRARIES}")
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> target_include_directories(
$<INSTALL_INTERFACE:${HEADER_INSTALL_DESTINATION}> ${PUBLIC_INCLUDE_DIRS} ${META_TARGET_NAME}_testlib
PRIVATE "${PRIVATE_INCLUDE_DIRS}") PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> $<INSTALL_INTERFACE:${HEADER_INSTALL_DESTINATION}>
target_compile_definitions(${META_TARGET_NAME}_testlib ${PUBLIC_INCLUDE_DIRS}
PUBLIC PRIVATE "${PRIVATE_INCLUDE_DIRS}")
"${META_PUBLIC_COMPILE_DEFINITIONS}" target_compile_definitions(${META_TARGET_NAME}_testlib PUBLIC "${META_PUBLIC_COMPILE_DEFINITIONS}" PRIVATE
PRIVATE
"${META_PRIVATE_COMPILE_DEFINITIONS}") "${META_PRIVATE_COMPILE_DEFINITIONS}")
target_compile_options(${META_TARGET_NAME}_testlib target_compile_options(
PUBLIC "${META_PUBLIC_COMPILE_OPTIONS}" ${META_TARGET_NAME}_testlib
PRIVATE "${META_PRIVATE_COMPILE_OPTIONS}") PUBLIC "${META_PUBLIC_COMPILE_OPTIONS}"
set_target_properties(${META_TARGET_NAME}_testlib PRIVATE "${META_PRIVATE_COMPILE_OPTIONS}")
PROPERTIES CXX_STANDARD set_target_properties(
"${META_CXX_STANDARD}" ${META_TARGET_NAME}_testlib
LINK_SEARCH_START_STATIC PROPERTIES CXX_STANDARD
${STATIC_LINKAGE} "${META_CXX_STANDARD}"
LINK_SEARCH_END_STATIC LINK_SEARCH_START_STATIC
${STATIC_LINKAGE} ${STATIC_LINKAGE}
AUTOGEN_TARGET_DEPENDS LINK_SEARCH_END_STATIC
"${AUTOGEN_DEPS}") ${STATIC_LINKAGE}
AUTOGEN_TARGET_DEPENDS
"${AUTOGEN_DEPS}")
if (CPP_UNIT_CONFIG_${META_PROJECT_NAME}_FOUND) if (CPP_UNIT_CONFIG_${META_PROJECT_NAME}_FOUND)
target_include_directories(${META_TARGET_NAME}_testlib target_include_directories(${META_TARGET_NAME}_testlib
PRIVATE "${CPP_UNIT_CONFIG_${META_PROJECT_NAME}_INCLUDE_DIRS}") PRIVATE "${CPP_UNIT_CONFIG_${META_PROJECT_NAME}_INCLUDE_DIRS}")
@ -147,28 +149,23 @@ if (META_PROJECT_IS_APPLICATION)
endif () endif ()
# configure test target # configure test target
target_link_libraries(${META_TARGET_NAME}_tests target_link_libraries(
PUBLIC ${META_ADDITIONAL_LINK_FLAGS} ${META_ADDITIONAL_LINK_FLAGS_TEST_TARGET} "${PUBLIC_LIBRARIES}" ${META_TARGET_NAME}_tests
PRIVATE "${TEST_LIBRARIES}" "${PRIVATE_LIBRARIES}") PUBLIC ${META_ADDITIONAL_LINK_FLAGS} ${META_ADDITIONAL_LINK_FLAGS_TEST_TARGET} "${PUBLIC_LIBRARIES}"
target_include_directories(${META_TARGET_NAME}_tests PRIVATE "${TEST_LIBRARIES}" "${PRIVATE_LIBRARIES}")
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> target_include_directories(
$<INSTALL_INTERFACE:${HEADER_INSTALL_DESTINATION}> ${PUBLIC_INCLUDE_DIRS} ${META_TARGET_NAME}_tests
PRIVATE ${TEST_INCLUDE_DIRS} "${PRIVATE_INCLUDE_DIRS}") PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> $<INSTALL_INTERFACE:${HEADER_INSTALL_DESTINATION}>
target_compile_definitions(${META_TARGET_NAME}_tests ${PUBLIC_INCLUDE_DIRS}
PUBLIC PRIVATE ${TEST_INCLUDE_DIRS} "${PRIVATE_INCLUDE_DIRS}")
"${META_PUBLIC_COMPILE_DEFINITIONS}" target_compile_definitions(${META_TARGET_NAME}_tests PUBLIC "${META_PUBLIC_COMPILE_DEFINITIONS}" PRIVATE
PRIVATE
"${META_PRIVATE_COMPILE_DEFINITIONS}") "${META_PRIVATE_COMPILE_DEFINITIONS}")
target_compile_options(${META_TARGET_NAME}_tests target_compile_options(
PUBLIC "${META_PUBLIC_COMPILE_OPTIONS}" ${META_TARGET_NAME}_tests
PRIVATE "${META_PRIVATE_COMPILE_OPTIONS}") PUBLIC "${META_PUBLIC_COMPILE_OPTIONS}"
set_target_properties(${META_TARGET_NAME}_tests PRIVATE "${META_PRIVATE_COMPILE_OPTIONS}")
PROPERTIES CXX_STANDARD set_target_properties(${META_TARGET_NAME}_tests PROPERTIES CXX_STANDARD "${META_CXX_STANDARD}" LINK_SEARCH_START_STATIC
"${META_CXX_STANDARD}" ${STATIC_LINKAGE} LINK_SEARCH_END_STATIC ${STATIC_LINKAGE})
LINK_SEARCH_START_STATIC
${STATIC_LINKAGE}
LINK_SEARCH_END_STATIC
${STATIC_LINKAGE})
# make the test recognized by ctest # make the test recognized by ctest
unset(RUN_TESTS_APPLICATION_ARG) unset(RUN_TESTS_APPLICATION_ARG)
@ -177,12 +174,8 @@ if (META_PROJECT_TYPE STREQUAL "application")
endif () endif ()
if (NOT META_TEST_TARGET_IS_MANUAL) if (NOT META_TEST_TARGET_IS_MANUAL)
add_test(NAME ${META_PROJECT_NAME}_run_tests add_test(NAME ${META_PROJECT_NAME}_run_tests
COMMAND ${META_TARGET_NAME}_tests COMMAND ${META_TARGET_NAME}_tests -p "${CMAKE_CURRENT_SOURCE_DIR}/testfiles" -w
-p "${CMAKE_CURRENT_BINARY_DIR}/testworkingdir" ${RUN_TESTS_APPLICATION_ARGS})
"${CMAKE_CURRENT_SOURCE_DIR}/testfiles"
-w
"${CMAKE_CURRENT_BINARY_DIR}/testworkingdir"
${RUN_TESTS_APPLICATION_ARGS})
endif () endif ()
# enable source code based coverage analysis using clang # enable source code based coverage analysis using clang
@ -211,17 +204,11 @@ if (CLANG_SOURCE_BASED_COVERAGE_AVAILABLE)
# add command to execute tests generating raw profiling data # add command to execute tests generating raw profiling data
add_custom_command( add_custom_command(
OUTPUT "${LLVM_PROFILE_RAW_FILE}" "${LLVM_PROFILE_RAW_LIST_FILE}" OUTPUT "${LLVM_PROFILE_RAW_FILE}" "${LLVM_PROFILE_RAW_LIST_FILE}"
COMMAND "${CMAKE_COMMAND}" COMMAND
-E "${CMAKE_COMMAND}" -E env "LLVM_PROFILE_FILE=${LLVM_PROFILE_RAW_FILE}"
env "LLVM_PROFILE_LIST_FILE=${LLVM_PROFILE_RAW_LIST_FILE}" $<TARGET_FILE:${META_TARGET_NAME}_tests> -p
"LLVM_PROFILE_FILE=${LLVM_PROFILE_RAW_FILE}" "${CMAKE_CURRENT_SOURCE_DIR}/testfiles" -w "${CMAKE_CURRENT_BINARY_DIR}/testworkingdir"
"LLVM_PROFILE_LIST_FILE=${LLVM_PROFILE_RAW_LIST_FILE}" ${RUN_TESTS_APPLICATION_ARGS}
$<TARGET_FILE:${META_TARGET_NAME}_tests>
-p
"${CMAKE_CURRENT_SOURCE_DIR}/testfiles"
-w
"${CMAKE_CURRENT_BINARY_DIR}/testworkingdir"
${RUN_TESTS_APPLICATION_ARGS}
COMMENT "Executing ${META_TARGET_NAME}_tests to generate raw profiling data for source-based coverage report" COMMENT "Executing ${META_TARGET_NAME}_tests to generate raw profiling data for source-based coverage report"
DEPENDS "${META_TARGET_NAME}_tests") DEPENDS "${META_TARGET_NAME}_tests")
@ -230,26 +217,17 @@ if (CLANG_SOURCE_BASED_COVERAGE_AVAILABLE)
find_program(LLVM_COV_BIN llvm-cov) find_program(LLVM_COV_BIN llvm-cov)
if (LLVM_PROFDATA_BIN AND LLVM_COV_BIN) if (LLVM_PROFDATA_BIN AND LLVM_COV_BIN)
# merge profiling data # merge profiling data
add_custom_command(OUTPUT "${LLVM_PROFILE_DATA_FILE}" add_custom_command(
COMMAND cat OUTPUT "${LLVM_PROFILE_DATA_FILE}"
"${LLVM_PROFILE_RAW_LIST_FILE}" COMMAND
| cat "${LLVM_PROFILE_RAW_LIST_FILE}" | xargs "${LLVM_PROFDATA_BIN}" merge -o "${LLVM_PROFILE_DATA_FILE}"
xargs -sparse "${LLVM_PROFILE_RAW_FILE}"
"${LLVM_PROFDATA_BIN}" COMMENT "Generating profiling data for source-based coverage report"
merge DEPENDS "${LLVM_PROFILE_RAW_FILE}" "${LLVM_PROFILE_RAW_LIST_FILE}")
-o
"${LLVM_PROFILE_DATA_FILE}"
-sparse
"${LLVM_PROFILE_RAW_FILE}"
COMMENT "Generating profiling data for source-based coverage report"
DEPENDS "${LLVM_PROFILE_RAW_FILE}" "${LLVM_PROFILE_RAW_LIST_FILE}")
# determine llvm-cov version # determine llvm-cov version
execute_process(COMMAND "${LLVM_COV_BIN}" -version OUTPUT_VARIABLE LLVM_COV_VERSION) execute_process(COMMAND "${LLVM_COV_BIN}" -version OUTPUT_VARIABLE LLVM_COV_VERSION)
string(REGEX MATCH string(REGEX MATCH "LLVM version ([0-9](.[0-9])*)" LLVM_COV_VERSION "${LLVM_COV_VERSION}")
"LLVM version ([0-9](.[0-9])*)"
LLVM_COV_VERSION
"${LLVM_COV_VERSION}")
if (CMAKE_MATCH_1) if (CMAKE_MATCH_1)
set(LLVM_COV_VERSION "${CMAKE_MATCH_1}") set(LLVM_COV_VERSION "${CMAKE_MATCH_1}")
else () else ()
@ -272,48 +250,27 @@ if (CLANG_SOURCE_BASED_COVERAGE_AVAILABLE)
# function-level) # function-level)
list(APPEND LLVM_COV_ADDITIONAL_OPTIONS -show-functions) list(APPEND LLVM_COV_ADDITIONAL_OPTIONS -show-functions)
endif () endif ()
add_custom_command(OUTPUT "${COVERAGE_REPORT_FILE}" add_custom_command(
COMMAND "${LLVM_COV_BIN}" OUTPUT "${COVERAGE_REPORT_FILE}"
report COMMAND
-format=text "${LLVM_COV_BIN}" report -format=text -stats -instr-profile "${LLVM_PROFILE_DATA_FILE}"
-stats ${LLVM_COV_ADDITIONAL_OPTIONS} ${LLVM_COV_TARGET_FILE} ${HEADER_FILES} ${SRC_FILES} ${WIDGETS_HEADER_FILES}
-instr-profile ${WIDGETS_SOURCE_FILES} ${QML_HEADER_FILES} ${QML_SOURCE_FILES} > "${COVERAGE_REPORT_FILE}"
"${LLVM_PROFILE_DATA_FILE}" COMMENT "Generating coverage report (statistics per function)"
${LLVM_COV_ADDITIONAL_OPTIONS} DEPENDS "${LLVM_PROFILE_DATA_FILE}"
${LLVM_COV_TARGET_FILE} WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
${HEADER_FILES}
${SRC_FILES}
${WIDGETS_HEADER_FILES}
${WIDGETS_SOURCE_FILES}
${QML_HEADER_FILES}
${QML_SOURCE_FILES}
>
"${COVERAGE_REPORT_FILE}"
COMMENT "Generating coverage report (statistics per function)"
DEPENDS "${LLVM_PROFILE_DATA_FILE}"
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
# generate coverage report with statistics per file (only possible with LLVM 5 if source files are specified) # generate coverage report with statistics per file (only possible with LLVM 5 if source files are specified)
if (LLVM_COV_VERSION GREATER_EQUAL 5.0.0) if (LLVM_COV_VERSION GREATER_EQUAL 5.0.0)
add_custom_command(OUTPUT "${COVERAGE_PER_FILE_REPORT_FILE}" add_custom_command(
COMMAND "${LLVM_COV_BIN}" OUTPUT "${COVERAGE_PER_FILE_REPORT_FILE}"
report COMMAND
-format=text "${LLVM_COV_BIN}" report -format=text -stats -instr-profile "${LLVM_PROFILE_DATA_FILE}"
-stats ${LLVM_COV_TARGET_FILE} ${HEADER_FILES} ${SRC_FILES} ${WIDGETS_HEADER_FILES} ${WIDGETS_SOURCE_FILES}
-instr-profile ${QML_HEADER_FILES} ${QML_SOURCE_FILES} > "${COVERAGE_PER_FILE_REPORT_FILE}"
"${LLVM_PROFILE_DATA_FILE}" COMMENT "Generating coverage report (statistics per file)"
${LLVM_COV_TARGET_FILE} DEPENDS "${LLVM_PROFILE_DATA_FILE}"
${HEADER_FILES} WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
${SRC_FILES}
${WIDGETS_HEADER_FILES}
${WIDGETS_SOURCE_FILES}
${QML_HEADER_FILES}
${QML_SOURCE_FILES}
>
"${COVERAGE_PER_FILE_REPORT_FILE}"
COMMENT "Generating coverage report (statistics per file)"
DEPENDS "${LLVM_PROFILE_DATA_FILE}"
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
list(APPEND COVERAGE_REPORT_FILES "${COVERAGE_PER_FILE_REPORT_FILE}") list(APPEND COVERAGE_REPORT_FILES "${COVERAGE_PER_FILE_REPORT_FILE}")
endif () endif ()
@ -331,42 +288,31 @@ if (CLANG_SOURCE_BASED_COVERAGE_AVAILABLE)
if (NOT EXISTS "${OVERALL_COVERAGE_AKW_SCRIPT}") if (NOT EXISTS "${OVERALL_COVERAGE_AKW_SCRIPT}")
set(OVERALL_COVERAGE_AKW_SCRIPT "${CPP_UTILITIES_CONFIG_DIRS}/tests/calculateoverallcoverage.awk") set(OVERALL_COVERAGE_AKW_SCRIPT "${CPP_UTILITIES_CONFIG_DIRS}/tests/calculateoverallcoverage.awk")
endif () endif ()
add_custom_command(OUTPUT "${COVERAGE_OVERALL_REPORT_FILE}" add_custom_command(
COMMAND awk OUTPUT "${COVERAGE_OVERALL_REPORT_FILE}"
-f COMMAND awk -f "${OVERALL_COVERAGE_AKW_SCRIPT}" "${COVERAGE_REPORT_FILE}" > "${COVERAGE_OVERALL_REPORT_FILE}"
"${OVERALL_COVERAGE_AKW_SCRIPT}" COMMENT "Generating coverage report (overall figures)"
"${COVERAGE_REPORT_FILE}" DEPENDS "${OVERALL_COVERAGE_AKW_SCRIPT}" "${COVERAGE_REPORT_FILE}")
>
"${COVERAGE_OVERALL_REPORT_FILE}"
COMMENT "Generating coverage report (overall figures)"
DEPENDS "${OVERALL_COVERAGE_AKW_SCRIPT}" "${COVERAGE_REPORT_FILE}")
add_custom_target("${META_TARGET_NAME}_tests_coverage_overall_summary" DEPENDS "${COVERAGE_OVERALL_REPORT_FILE}") add_custom_target("${META_TARGET_NAME}_tests_coverage_overall_summary" DEPENDS "${COVERAGE_OVERALL_REPORT_FILE}")
# generate HTML document showing covered/uncovered code # generate HTML document showing covered/uncovered code
add_custom_command(OUTPUT "${COVERAGE_HTML_REPORT_FILE}" add_custom_command(
COMMAND "${LLVM_COV_BIN}" OUTPUT "${COVERAGE_HTML_REPORT_FILE}"
show COMMAND
-project-title="${META_APP_NAME}" "${LLVM_COV_BIN}" show -project-title="${META_APP_NAME}" -format=html -instr-profile
-format=html "${LLVM_PROFILE_DATA_FILE}" ${LLVM_COV_TARGET_FILE} ${HEADER_FILES} ${SRC_FILES} ${WIDGETS_FILES}
-instr-profile ${QML_FILES} > "${COVERAGE_HTML_REPORT_FILE}"
"${LLVM_PROFILE_DATA_FILE}" COMMENT "Generating HTML document showing covered/uncovered code"
${LLVM_COV_TARGET_FILE} DEPENDS "${LLVM_PROFILE_DATA_FILE}"
${HEADER_FILES} WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
${SRC_FILES}
${WIDGETS_FILES}
${QML_FILES}
>
"${COVERAGE_HTML_REPORT_FILE}"
COMMENT "Generating HTML document showing covered/uncovered code"
DEPENDS "${LLVM_PROFILE_DATA_FILE}"
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
add_custom_target("${META_TARGET_NAME}_tests_coverage_html" DEPENDS "${COVERAGE_HTML_REPORT_FILE}") add_custom_target("${META_TARGET_NAME}_tests_coverage_html" DEPENDS "${COVERAGE_HTML_REPORT_FILE}")
# create target for all coverage docs # create target for all coverage docs
add_custom_target("${META_TARGET_NAME}_tests_coverage" add_custom_target(
DEPENDS ${COVERAGE_REPORT_FILES} "${META_TARGET_NAME}_tests_coverage"
DEPENDS "${COVERAGE_OVERALL_REPORT_FILE}" DEPENDS ${COVERAGE_REPORT_FILES}
DEPENDS "${COVERAGE_HTML_REPORT_FILE}") DEPENDS "${COVERAGE_OVERALL_REPORT_FILE}"
DEPENDS "${COVERAGE_HTML_REPORT_FILE}")
# add targets to global coverage target # add targets to global coverage target
if (NOT TARGET coverage) if (NOT TARGET coverage)
@ -376,7 +322,7 @@ if (CLANG_SOURCE_BASED_COVERAGE_AVAILABLE)
else () else ()
message( message(
FATAL_ERROR "Unable to generate target for coverage report because llvm-profdata and llvm-cov are not available." FATAL_ERROR "Unable to generate target for coverage report because llvm-profdata and llvm-cov are not available."
) )
endif () endif ()
endif () endif ()

View File

@ -38,19 +38,12 @@ if (WINDOWS_ICON_ENABLED)
if (EXISTS "${PNG_ICON_PATH}") if (EXISTS "${PNG_ICON_PATH}")
set(WINDOWS_ICON_PATH "${CMAKE_CURRENT_BINARY_DIR}/resources/${META_PROJECT_NAME}.ico") set(WINDOWS_ICON_PATH "${CMAKE_CURRENT_BINARY_DIR}/resources/${META_PROJECT_NAME}.ico")
set(WINDOWS_ICON_RC_ENTRY "IDI_ICON1 ICON DISCARDABLE \"${WINDOWS_ICON_PATH}\"") set(WINDOWS_ICON_RC_ENTRY "IDI_ICON1 ICON DISCARDABLE \"${WINDOWS_ICON_PATH}\"")
add_custom_command(OUTPUT "${WINDOWS_ICON_PATH}" add_custom_command(
COMMAND ${FFMPEG_BIN} OUTPUT "${WINDOWS_ICON_PATH}"
-y COMMAND
-i ${FFMPEG_BIN} -y -i "${PNG_ICON_PATH}" -vf crop=${PNG_ICON_CROP},scale=64:64 "${WINDOWS_ICON_PATH}"
"${PNG_ICON_PATH}" DEPENDS "${PNG_ICON_PATH}")
-vf set_source_files_properties("${WINDOWS_RC_FILE}" PROPERTIES OBJECT_DEPENDS "${WINDOWS_ICON_PATH}")
crop=${PNG_ICON_CROP},scale=64:64
"${WINDOWS_ICON_PATH}"
DEPENDS "${PNG_ICON_PATH}")
set_source_files_properties("${WINDOWS_RC_FILE}"
PROPERTIES
OBJECT_DEPENDS
"${WINDOWS_ICON_PATH}")
message(STATUS "Generating Windows icon from \"${PNG_ICON_PATH}\" via ${FFMPEG_BIN}.") message(STATUS "Generating Windows icon from \"${PNG_ICON_PATH}\" via ${FFMPEG_BIN}.")
elseif (NOT USING_DEFAULT_PNG_ICON_PATH) elseif (NOT USING_DEFAULT_PNG_ICON_PATH)
message(FATAL_ERROR "The specified PNG_ICON_PATH \"${PNG_ICON_PATH}\" is invalid.") message(FATAL_ERROR "The specified PNG_ICON_PATH \"${PNG_ICON_PATH}\" is invalid.")