AusweisApp2/cmake/Helper.cmake

344 lines
8.5 KiB
CMake
Raw Normal View History

2017-07-03 09:30:10 +02:00
INCLUDE(CheckCXXCompilerFlag)
INCLUDE(CMakeParseArguments)
FUNCTION(ADD_FLAG)
SET(options NOQUOTES)
SET(oneValueArgs)
SET(multiValueArgs LINK VAR)
cmake_parse_arguments(_PARAM "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
IF(NOT _PARAM_VAR)
SET(_PARAM_VAR CMAKE_CXX_FLAGS)
ENDIF()
IF(_PARAM_LINK)
SET(CMAKE_REQUIRED_LIBRARIES ${_PARAM_LINK})
ENDIF()
FOREACH(flag ${_PARAM_UNPARSED_ARGUMENTS})
STRING(REPLACE "-" "_" flagname ${flag})
STRING(REPLACE " " "_" flagname ${flagname})
CHECK_CXX_COMPILER_FLAG(${flag} ${flagname})
IF(${flagname})
FOREACH(var ${_PARAM_VAR})
IF(_PARAM_NOQUOTES)
SET(${var} ${${var}} ${flag} PARENT_SCOPE)
ELSE()
SET(${var} "${${var}} ${flag}" PARENT_SCOPE)
ENDIF()
ENDFOREACH()
RETURN()
ENDIF()
ENDFOREACH()
ENDFUNCTION()
FUNCTION(GET_FILE_MATCHER _result_remove _result_keep)
IF(NOT ${CMAKE_BUILD_TYPE} STREQUAL "DEBUG")
LIST(APPEND matcher_remove "_debug")
ENDIF()
IF(NOT ANDROID)
LIST(APPEND matcher_remove "_android")
ELSE()
LIST(APPEND matcher_keep "_android")
ENDIF()
IF(NOT IOS)
LIST(APPEND matcher_remove "_ios")
ELSE()
LIST(APPEND matcher_keep "_ios")
ENDIF()
IF(NOT MAC)
LIST(APPEND matcher_remove "_osx")
ELSE()
LIST(APPEND matcher_keep "_osx")
ENDIF()
IF(NOT WIN32)
LIST(APPEND matcher_remove "_win")
ELSE()
LIST(APPEND matcher_keep "_win")
ENDIF()
IF(NOT LINUX)
LIST(APPEND matcher_remove "_linux")
ELSE()
LIST(APPEND matcher_keep "_linux")
ENDIF()
IF(NOT BSD)
LIST(APPEND matcher_remove "_bsd")
ELSE()
LIST(APPEND matcher_keep "_bsd")
ENDIF()
SET(${_result_remove} ${matcher_remove} PARENT_SCOPE)
SET(${_result_keep} ${matcher_keep} PARENT_SCOPE)
ENDFUNCTION()
FUNCTION(GET_FILE_EXTENSIONS _result)
set(options)
set(oneValueArgs)
set(multiValueArgs PATH)
cmake_parse_arguments(_PARAM "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
SET(FILE_EXTENSIONS *.cpp)
IF(IOS)
LIST(APPEND FILE_EXTENSIONS *.m *.mm)
ENDIF()
IF(_PARAM_PATH)
FOREACH(path ${_PARAM_PATH})
FOREACH(ext ${FILE_EXTENSIONS})
LIST(APPEND tmpExt "${path}/${ext}")
ENDFOREACH()
ENDFOREACH()
LIST(APPEND FILE_EXTENSIONS ${tmpExt})
ENDIF()
SET(${_result} ${FILE_EXTENSIONS} PARENT_SCOPE)
ENDFUNCTION()
FUNCTION(ADD_PLATFORM_LIBRARY _name)
set(options)
set(oneValueArgs)
set(multiValueArgs PATH)
cmake_parse_arguments(_PARAM "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
GET_FILE_EXTENSIONS(FILE_EXTENSIONS PATH ${_PARAM_PATH})
FILE(GLOB_RECURSE FILES ${FILE_EXTENSIONS})
GET_FILE_MATCHER(matcher_remove matcher_keep)
FOREACH(file ${FILES})
SET(keep FALSE)
FOREACH(match ${matcher_keep})
IF("${file}" MATCHES ${match})
SET(keep TRUE)
BREAK()
ENDIF()
ENDFOREACH()
IF(NOT keep)
FOREACH(match ${matcher_remove})
IF("${file}" MATCHES ${match})
LIST(REMOVE_ITEM FILES "${file}")
BREAK()
ELSEIF("${file}" MATCHES "_generic")
LIST(REMOVE_ITEM FILES "${file}")
LIST(APPEND GENERICS "${file}")
BREAK()
ENDIF()
ENDFOREACH()
ENDIF()
ENDFOREACH()
FOREACH(generic ${GENERICS})
STRING(FIND "${generic}" "generic" position REVERSE)
STRING(SUBSTRING "${generic}" 0 ${position} generic_basename)
STRING(REPLACE "${CMAKE_SOURCE_DIR}" "" generic_basename "${generic_basename}")
SET(found FALSE)
FOREACH(file ${FILES})
IF("${file}" MATCHES "${generic_basename}" AND NOT "${file}" MATCHES ".h$")
SET(found TRUE)
BREAK()
ENDIF()
ENDFOREACH()
IF(NOT found)
LIST(APPEND FILES "${generic}")
ENDIF()
ENDFOREACH()
ADD_LIBRARY(${_name} ${FILES})
TARGET_INCLUDE_DIRECTORIES(${_name} INTERFACE "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>")
ENDFUNCTION()
# This FUNCTION is a workaround for a "bug" in cmake to use OBJECT LIBRARIES with IMPORTED TARGETS like Qt
# http://www.cmake.org/Bug/view.php?id=14778
FUNCTION(ADD_OBJECT_LIBRARY TargetName Files)
ADD_LIBRARY(${TargetName} OBJECT ${Files})
FOREACH(MODULE ${ARGN})
TARGET_INCLUDE_DIRECTORIES(${TargetName} PRIVATE $<TARGET_PROPERTY:${MODULE},INTERFACE_INCLUDE_DIRECTORIES>)
TARGET_COMPILE_DEFINITIONS(${TargetName} PRIVATE $<TARGET_PROPERTY:${MODULE},INTERFACE_COMPILE_DEFINITIONS>)
ENDFOREACH()
IF(Qt5_POSITION_INDEPENDENT_CODE)
SET_TARGET_PROPERTIES(${TargetName} PROPERTIES POSITION_INDEPENDENT_CODE ON)
ENDIF()
ENDFUNCTION()
FUNCTION(GET_QUOTED_STRING _dest _str _filename)
IF(CMAKE_GENERATOR STREQUAL Xcode AND CMAKE_VERSION VERSION_LESS "3.5")
SET(tmp_var \\\\"${_str}\\\\")
ELSEIF(NOT "${_filename}" MATCHES ".rc$")
SET(tmp_var \\"${_str}\\")
ELSE()
SET(tmp_var ${_str})
ENDIF()
SET(${_dest} ${tmp_var} PARENT_SCOPE)
ENDFUNCTION()
FUNCTION(ADD_STRING_DEFINITION _str _def)
IF(ARGN)
FOREACH(arg ${ARGN})
IF (${arg} MATCHES "^AusweisApp")
SET(ARG_TYPE TARGET)
ELSE()
SET(ARG_TYPE SOURCE)
ENDIF()
IF(NOT "${_str}" STREQUAL "")
GET_QUOTED_STRING(tmp_var ${_str} ${arg})
SET(tmp_var =\"${tmp_var}\")
ENDIF()
SET_PROPERTY(${ARG_TYPE} ${arg} APPEND_STRING PROPERTY COMPILE_FLAGS " -D${_def}${tmp_var}")
ENDFOREACH()
ELSE()
IF(NOT "${_str}" STREQUAL "")
GET_QUOTED_STRING(tmp_var ${_str} ${arg})
SET(tmp_var =${tmp_var})
ENDIF()
ADD_DEFINITIONS(-D${_def}${tmp_var})
ENDIF()
ENDFUNCTION()
FUNCTION(ADD_DEFINITION _def)
ADD_STRING_DEFINITION("" ${_def} ${ARGN})
ENDFUNCTION()
FUNCTION(SUBDIRLIST _result _currentdir)
FILE(GLOB children RELATIVE ${_currentdir} ${_currentdir}/*)
SET(dirlist "")
FOREACH(child ${children})
IF(IS_DIRECTORY ${_currentdir}/${child})
LIST(APPEND dirlist ${child})
ENDIF()
ENDFOREACH()
SET(${_result} ${dirlist} PARENT_SCOPE)
ENDFUNCTION()
FUNCTION(DIRLIST_OF_FILES _result _files)
FILE(GLOB_RECURSE children ${_files})
SET(dirlist "")
FOREACH(child ${children})
GET_FILENAME_COMPONENT(dir ${child} DIRECTORY)
LIST(APPEND dirlist ${dir})
ENDFOREACH()
LIST(REMOVE_DUPLICATES dirlist)
SET(${_result} ${dirlist} PARENT_SCOPE)
ENDFUNCTION()
IF("${CMAKE_SYSTEM_NAME}" MATCHES "BSD")
SET(BSD true)
ENDIF()
IF(APPLE AND NOT IOS)
SET(MAC true)
ENDIF()
IF(UNIX AND NOT ANDROID AND NOT APPLE AND NOT CYGWIN AND NOT BSD)
SET(LINUX true)
ENDIF()
2017-07-03 09:33:28 +02:00
IF((WIN32 AND NOT WINDOWS_STORE) OR LINUX OR MAC OR CYGWIN OR BSD)
2017-07-03 09:30:10 +02:00
SET(DESKTOP true)
ENDIF()
FUNCTION(FILE_SIZE _outSize _file)
IF(LINUX)
SET(SIZE_COMMAND stat -c "%s" "${_file}")
ELSEIF(MAC)
SET(SIZE_COMMAND stat -f "%z" "${_file}")
ELSE()
RETURN()
ENDIF()
EXECUTE_PROCESS(COMMAND ${SIZE_COMMAND}
OUTPUT_VARIABLE SIZE_OUTPUT
RESULT_VARIABLE SIZE_RESULT
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
IF(${SIZE_RESULT} EQUAL 0)
SET(${_outSize} ${SIZE_OUTPUT} PARENT_SCOPE)
ENDIF()
ENDFUNCTION()
IF(NOT COMMAND FIND_HOST_PACKAGE)
MACRO(FIND_HOST_PACKAGE)
FIND_PACKAGE(${ARGN})
ENDMACRO()
ENDIF()
FUNCTION(FETCH_TARGET_LOCATION _destination _target)
GET_TARGET_PROPERTY(tmp "${_target}" IMPORTED_LOCATION_${CMAKE_BUILD_TYPE})
IF(NOT tmp)
IF("${CMAKE_BUILD_TYPE}" STREQUAL "DEBUG")
GET_TARGET_PROPERTY(tmp "${_target}" IMPORTED_LOCATION_RELEASE)
ELSEIF("${CMAKE_BUILD_TYPE}" STREQUAL "RELEASE")
GET_TARGET_PROPERTY(tmp "${_target}" IMPORTED_LOCATION_DEBUG)
ENDIF()
ENDIF()
IF(NOT tmp)
GET_TARGET_PROPERTY(tmp "${_target}" IMPORTED_LOCATION)
ENDIF()
SET(${_destination} ${tmp} PARENT_SCOPE)
ENDFUNCTION()
FUNCTION(map_set_value _map _key _value)
SET(${_map}_${_key} "${_value}" PARENT_SCOPE)
ENDFUNCTION()
FUNCTION(map_get_value _var _map _key)
SET(${_var} ${${_map}_${_key}} PARENT_SCOPE)
ENDFUNCTION()
IF(WIN32)
IF(WIN_SIGN_SUBJECT_NAME OR (WIN_SIGN_KEYSTORE AND WIN_SIGN_KEYSTORE_PSW))
FIND_PROGRAM(SIGNTOOL_CMD signtool.exe)
IF(SIGNTOOL_CMD)
OPTION(WIN_TIMESTAMP "Timestamp the MSI/Files" ON)
IF(NOT WIN_SIGN_HASHALGO)
SET(WIN_SIGN_HASHALGO SHA256)
ENDIF()
SET(SIGNTOOL_PARAMS sign /v /fd ${WIN_SIGN_HASHALGO} /d AusweisApp2 /du https://www.ausweisapp.bund.de)
IF(WIN_SIGN_SUBJECT_NAME)
SET(SIGNTOOL_PARAMS ${SIGNTOOL_PARAMS} /n ${WIN_SIGN_SUBJECT_NAME})
MESSAGE(STATUS "Files will be signed using: ${WIN_SIGN_SUBJECT_NAME}")
ELSE()
SET(SIGNTOOL_PARAMS ${SIGNTOOL_PARAMS} /f ${WIN_SIGN_KEYSTORE} /p ${WIN_SIGN_KEYSTORE_PSW})
MESSAGE(STATUS "Files will be signed using: ${WIN_SIGN_KEYSTORE}")
ENDIF()
IF(WIN_TIMESTAMP)
IF(NOT WIN_TIMESTAMP_URL)
SET(WIN_TIMESTAMP_URL http://timestamp.digicert.com)
ENDIF()
SET(SIGNTOOL_PARAMS ${SIGNTOOL_PARAMS} /tr ${WIN_TIMESTAMP_URL} /td ${WIN_SIGN_HASHALGO})
ENDIF()
ELSE()
MESSAGE(STATUS "Could NOT find signtool.exe to sign files")
ENDIF()
ENDIF()
ENDIF()