LSFramework/CMake/CMake.1.6.0/CMakeMacros.cmake
2022-06-23 13:44:39 +02:00

807 lines
32 KiB
CMake

include (CMakeParseArguments)
#/////////////////////////////////////////////////////////////////////////////////////////////////
####################################
#set_output_dir
# Description:
# Change the output directory of the project to given folder
# for all configurations
#
# Syntax:
# set_output_dir(foldername)
####################################
macro (set_output_dir DIR)
foreach (CONFIG ${CMAKE_CONFIGURATION_TYPES})
# make configuration variable upper case for CMAKE macros
string(TOUPPER ${CONFIG} CONFIGUPPERCASE)
# set directories
set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_${CONFIGUPPERCASE} ${DIR})
set( CMAKE_LIBRARY_OUTPUT_DIRECTORY_${CONFIGUPPERCASE} ${DIR})
set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${CONFIGUPPERCASE} ${DIR})
set( CMAKE_PDB_OUTPUT_DIRECTORY_${CONFIGUPPERCASE} ${DIR})
endforeach (CONFIG ${CMAKE_CONFIGURATION_TYPES})
endmacro (set_output_dir)
#/////////////////////////////////////////////////////////////////////////////////////////////////
function(TSEP_TRANSLATE)
# define file lists for all languages
foreach(arg IN LISTS ARGN)
set(TRANSLATION_FILES_ORIG
${TRANSLATION_FILES_ORIG}
resources/${PROJECT_NAME}_${arg}_generated.ts
)
set(TRANSLATION_FILES
${TRANSLATION_FILES}
resources/${PROJECT_NAME}_${arg}.ts
)
set(TRANSLATION_RESOURCE_LIST
${TRANSLATION_RESOURCE_LIST}
"<file>${PROJECT_NAME}_${arg}.qm</file>"
)
if(NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/resources/${PROJECT_NAME}_${arg}.ts)
configure_file(${TSEP_PROJECT_CMAKE}/Templates/Translation.Template.ts ${CMAKE_CURRENT_LIST_DIR}/resources/${PROJECT_NAME}_${arg}.ts COPYONLY)
endif()
endforeach()
# replace all ";" from the resource list
string(REPLACE ";" "\n " TRANSLATION_RESOURCE_STRING "${TRANSLATION_RESOURCE_LIST}")
if (WIN32)
# copy project specific *translations.qrc to the resources folder
configure_file(${TSEP_PROJECT_CMAKE}/Templates/Translations.Template.qrc ${CMAKE_CURRENT_LIST_DIR}/resources/${PROJECT_NAME}_translations.qrc @ONLY)
endif()
# call qt translation functions
qt5_create_translation(ORIG_TRANSLATIONS ${CMAKE_CURRENT_LIST_DIR} ${TRANSLATION_FILES_ORIG})
qt5_add_translation(QM_FILES ${TRANSLATION_FILES})
configure_file(resources/${PROJECT_NAME}_translations.qrc ${CMAKE_BINARY_DIR}/${PROJECT_NAME} COPYONLY)
# define TSEP_TRANSLATION_FILES in parent scope so it can be added to the project by add_executable or add_library
set(TSEP_TRANSLATION_FILES_LOCAL ${TRANSLATION_FILES} ${TRANSLATION_FILES_ORIG} ${CMAKE_BINARY_DIR}/${PROJECT_NAME}/${PROJECT_NAME}_translations.qrc)
set(TSEP_TRANSLATION_FILES ${TSEP_TRANSLATION_FILES_LOCAL} PARENT_SCOPE)
# Group the files in the solution
source_group("Translation Files" FILES ${TSEP_TRANSLATION_FILES_LOCAL})
endfunction()
#/////////////////////////////////////////////////////////////////////////////////////////////////
function(TSEP_SETUP_DLL_VERSION ComponentDescription)
#------------------------------------------------------------------------------
# Windows Version Description with Resource Files
if(WIN32)
add_definitions(-DVER_COMPANYNAME_STR="${TSEP_COMPANY_LONGNAME}")
add_definitions(-DVER_FILEVERSION_STR="${TSEP_PRODUCT_VERSION}")
add_definitions(-DVER_FILEVERSION=${TSEP_PRODUCT_VERSION})
add_definitions(-DVER_FILEDESCRIPTION_STR="${ComponentDescription}")
add_definitions(-DVER_LEGALCOPYRIGHT_STR="${TSEP_COPYRIGHT_STRING}")
add_definitions(-DVER_PRODUCTNAME_STR="${TSEP_PROJECT}")
set(AUTOMATED_VERSION_FILES
${TSEP_DLL_VERSION_RC}
)
source_group("Automated Version Files" FILES ${AUTOMATED_VERSION_FILES})
else()
# define entry point for shared library to print the version information
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,-e,tsep_version_entry_point" PARENT_SCOPE)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wl,-e,tsep_version_entry_point" PARENT_SCOPE)
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wl,-e,tsep_version_entry_point" PARENT_SCOPE)
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wl,-e,tsep_version_entry_point" PARENT_SCOPE)
endif()
add_definitions(-DTSEP_VERSION="${TSEP_VERSION}")
add_definitions(-DTSEP_VERSION_MAJOR=${TSEP_VERSION_MAJOR})
add_definitions(-DTSEP_VERSION_MINOR=${TSEP_VERSION_MINOR})
add_definitions(-DTSEP_VERSION_PATCH=${TSEP_VERSION_PATCH})
add_definitions(-DTSEP_PRODUCT_NAME="${TSEP_PRODUCT_NAME}")
add_definitions(-DTSEP_COPYRIGHT="${TSEP_COPYRIGHT_STRING}")
add_definitions(-DTSEP_COMPANY_NAME="${TSEP_COMPANY_LONGNAME}")
endfunction()
#/////////////////////////////////////////////////////////////////////////////////////////////////
function(TSEP_SETUP_APP_VERSION ComponentDescription)
#------------------------------------------------------------------------------
# Windows Version Description with Resource Files
if(WIN32)
add_definitions(-DVER_COMPANYNAME_STR="${TSEP_COMPANY_LONGNAME}")
add_definitions(-DVER_FILEVERSION_STR="${TSEP_PRODUCT_VERSION}")
add_definitions(-DVER_FILEVERSION=${TSEP_PRODUCT_VERSION})
add_definitions(-DVER_FILEDESCRIPTION_STR="${ComponentDescription}")
add_definitions(-DVER_LEGALCOPYRIGHT_STR="${TSEP_COPYRIGHT_STRING}")
add_definitions(-DVER_PRODUCTNAME_STR="${TSEP_PROJECT}")
set(AUTOMATED_VERSION_FILES
${TSEP_APP_VERSION_RC}
)
source_group("Automated Version Files" FILES ${AUTOMATED_VERSION_FILES})
endif()
add_definitions(-DTSEP_VERSION="${TSEP_VERSION}")
add_definitions(-DTSEP_VERSION_MAJOR=${TSEP_VERSION_MAJOR})
add_definitions(-DTSEP_VERSION_MINOR=${TSEP_VERSION_MINOR})
add_definitions(-DTSEP_VERSION_PATCH=${TSEP_VERSION_PATCH})
endfunction()
#/////////////////////////////////////////////////////////////////////////////////////////////////
function(TSEP_ADD_EXPORT_FILE )
message(" Generating import cmake file for project / " ${PROJECT_NAME})
set(TEMP_PRODUCT_NAME "Tsep.")
string(APPEND TEMP_PRODUCT_NAME ${TSEP_PRODUCT_NAME})
set(TEMP_PROJECT_COLON_NAME "")
string(REPLACE "." "::" TEMP_PROJECT_COLON_NAME ${TEMP_PRODUCT_NAME})
set(TEMP_PROJECT_SIMPLE_NAME "")
string(REPLACE "." "" TEMP_PROJECT_SIMPLE_NAME ${TEMP_PRODUCT_NAME})
set(TEMP_PROJECT_DOT_NAME ${TEMP_PRODUCT_NAME})
string(TOUPPER ${TSEP_PRODUCT_NAME} TEMP_CMAKE_PROJECT_NAME)
#message("Colon " ${TEMP_PROJECT_COLON_NAME})
#message("Dot " ${TEMP_PROJECT_DOT_NAME})
#message("Simple " ${TEMP_PROJECT_SIMPLE_NAME})
# Copy the nuspec template file and configure it for the product
configure_file( ${TSEP_PROJECT_CMAKE}/Templates/CMakeLists.Import.Template ${TSEP_EXPORT_DIR}/${TEMP_PROJECT_SIMPLE_NAME}Config.cmake @ONLY )
endfunction()
#/////////////////////////////////////////////////////////////////////////////////////////////////
macro(TSEP_ADD_EXPORT_HEADER HeaderList)
message(" Generating custom action to export header files for project / " ${PROJECT_NAME})
set_target_properties(${PROJECT_NAME} PROPERTIES PUBLIC_HEADER "${HeaderList}")
endmacro()
#/////////////////////////////////////////////////////////////////////////////////////////////////
macro(TSEP_ADD_PROJECT_NEXUS_UPLOAD)
# Lower case for configuration flag
string( TOLOWER ${TSEP_UPDATE_IN_NEXUS} TSEP_UPDATE_IN_NEXUS_LOWER )
# Add a new target if Nexus upload is requested
if( TSEP_UPDATE_IN_NEXUS_LOWER STREQUAL "true" )
message(" Generating Nexus upload project for product / " ${TSEP_PRODUCT_NAME})
# Copy the nuspec template file and configure it for the product
configure_file( ${TSEP_PROJECT_CMAKE}/Templates/CMake.nuspec.Template ${TSEP_EXPORT_DIR}/${TSEP_PRODUCT_NAME}.nuspec )
# Copy the template nexus upload cmake file
file(MAKE_DIRECTORY NEXUS_UPLOAD)
file(COPY ${TSEP_PROJECT_CMAKE}/Templates/CMakeLists.Nexus.Template.cmake DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/NEXUS_UPLOAD )
file(RENAME ${CMAKE_CURRENT_SOURCE_DIR}/NEXUS_UPLOAD/CMakeLists.Nexus.Template.cmake ${CMAKE_CURRENT_SOURCE_DIR}/NEXUS_UPLOAD/CMakeLists.txt )
# Create a new project for the nexus upload
add_subdirectory ( "NEXUS_UPLOAD" "${CMAKE_CURRENT_BINARY_DIR}/NEXUS_UPLOAD" )
endif()
endmacro()
#/////////////////////////////////////////////////////////////////////////////////////////////////
macro(TSEP_THIRDPARTY_NEXUS_UPLOAD)
# Lower case for configuration flag
string( TOLOWER ${TSEP_UPDATE_IN_NEXUS} TSEP_UPDATE_IN_NEXUS_LOWER )
# Add a new target if Nexus upload is requested
if( TSEP_UPDATE_IN_NEXUS_LOWER STREQUAL "true" )
message(" Executing Nexus upload for third party product / " ${TSEP_PRODUCT_NAME})
# Create package
execute_process( WORKING_DIRECTORY ${TSEP_EXPORT_DIR}
COMMAND ${TSEP_NUGET_APPLICATION} pack ${TSEP_EXPORT_DIR}/${TSEP_PRODUCT_NAME}.nuspec -outputdirectory ${TSEP_EXPORT_DIR} -BasePath ${TSEP_EXPORT_DIR} -verbosity detailed
)
execute_process( WORKING_DIRECTORY ${TSEP_EXPORT_DIR}
COMMAND ${TSEP_NUGET_APPLICATION} push *.nupkg ${TSEP_NEXUS_GUID} -source ${TSEP_NEXUS_URL}/Development/ -verbosity detailed
)
endif()
endmacro()
#/////////////////////////////////////////////////////////////////////////////////////////////////
macro(TSEP_ADD_PROJECT_CODE_ANALYZER)
# Visual Studio
if(WIN32)
message(" Generating Visual Studio Code Analyzer project for product / " ${TSEP_PRODUCT_NAME})
# Copy the template Nexus upload CMake file
file(MAKE_DIRECTORY VS_CODE_ANALYZER)
file(COPY ${TSEP_PROJECT_CMAKE}/Templates/CMakeLists.VS_CodeAnalyzer.Template.cmake DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/VS_CODE_ANALYZER )
file(RENAME ${CMAKE_CURRENT_SOURCE_DIR}/VS_CODE_ANALYZER/CMakeLists.VS_CodeAnalyzer.Template.cmake ${CMAKE_CURRENT_SOURCE_DIR}/VS_CODE_ANALYZER/CMakeLists.txt )
# Create a new project for the Visual Studio CodeAnalyzer
add_subdirectory ( "VS_CODE_ANALYZER" "${CMAKE_CURRENT_BINARY_DIR}/VS_CODE_ANALYZER" )
endif()
endmacro()
#/////////////////////////////////////////////////////////////////////////////////////////////////
MACRO(TSEP_GET_HEADER_DIRECTORIES return_list target_dir)
FILE(GLOB_RECURSE new_list ${target_dir}/*.h)
SET(dir_list "")
FOREACH(file_path ${new_list})
GET_FILENAME_COMPONENT(dir_path ${file_path} PATH)
SET(dir_list ${dir_list} ${dir_path})
ENDFOREACH()
LIST(REMOVE_DUPLICATES dir_list)
SET(${return_list} ${dir_list})
ENDMACRO()
#/////////////////////////////////////////////////////////////////////////////////////////////////
macro(TSEP_ADD_OS_SPECIFIC_SETTINGS)
IF (WIN32)
target_link_libraries(${PROJECT_NAME} PUBLIC Iphlpapi.lib)
target_link_libraries(${PROJECT_NAME} PUBLIC Shlwapi.lib)
target_link_libraries(${PROJECT_NAME} PUBLIC Ws2_32.lib)
ENDIF()
IF (LINUX)
target_link_libraries(${PROJECT_NAME} PUBLIC dl)
target_link_libraries(${PROJECT_NAME} PUBLIC pthread)
target_link_libraries(${PROJECT_NAME} PUBLIC rt)
target_link_libraries(${PROJECT_NAME} PUBLIC stdc++fs)
ENDIF()
set_target_properties(${PROJECT_NAME} PROPERTIES DEBUG_POSTFIX d)
endmacro()
#/////////////////////////////////////////////////////////////////////////////////////////////////
macro(TSEP_CREATE_LINK_FOR_DIRECTORY directory_for_search)
if(WIN32)
#- Get all files from the given directory
file(GLOB FILES_TO_LINK ${directory_for_search}/bin/*.dll ${directory_for_search}/bin/*.exe)
#- Loop over all files
foreach(file_and_path_to_link ${FILES_TO_LINK})
#- Get the file name from the complete path
get_filename_component(file_to_link ${file_and_path_to_link} NAME)
#- convert the path into an operating system depending format
file(TO_NATIVE_PATH ${file_and_path_to_link} native_file_and_path_to_link)
#- create the link
if(EXISTS "${PROJECT_BINARY_DIR}/Debug/bin/${file_to_link}")
file(REMOVE "${PROJECT_BINARY_DIR}/Debug/bin/${file_to_link}")
endif()
execute_process( WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/Debug/bin
COMMAND cmd.exe /c mklink "${file_to_link}" "${native_file_and_path_to_link}"
OUTPUT_QUIET)
#- create the link
if(EXISTS "${PROJECT_BINARY_DIR}/Release/bin/${file_to_link}")
file(REMOVE "${PROJECT_BINARY_DIR}/Release/bin/${file_to_link}")
endif()
execute_process( WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/Release/bin
COMMAND cmd.exe /c mklink "${file_to_link}" "${native_file_and_path_to_link}"
OUTPUT_QUIET)
endforeach()
endif()
endmacro()
#//////////////////////////////////////////////////////////////////////
macro(TSEP_USE_GOOGLE_TESTING)
message(" Enabling the Google Test Framework ")
enable_testing()
if(WIN32)
set(GTEST_ROOT ${TSEP_PROJECT_GOOGLE.TEST}/${TSEP_CMAKE_GENERATOR}) # <- Working hand-in-hand with the google export!
endif()
find_package(GTest REQUIRED)
if(WIN32)
TSEP_CREATE_LINK_FOR_DIRECTORY(${TSEP_PROJECT_GOOGLE.TEST}/${TSEP_CMAKE_GENERATOR})
endif()
endmacro()
#/////////////////////////////////////////////////////////////////////////////////////////////////
macro(TSEP_CREATE_EXPORT)
#- Only for developer build
if(NOT TSEP_PRODUCT_BUILD)
message(" Generating custom action to export files for project / " ${PROJECT_NAME})
install(TARGETS ${PROJECT_NAME}
EXPORT ${MAIN_PROJECT_NAME}Config
RUNTIME DESTINATION bin/${TSEP_CMAKE_GENERATOR}
LIBRARY DESTINATION bin/${TSEP_CMAKE_GENERATOR}
ARCHIVE DESTINATION bin/${TSEP_CMAKE_GENERATOR}
PUBLIC_HEADER DESTINATION inc
)
if (WIN32 AND NOT ${ARGC})
install (FILES $<TARGET_PDB_FILE:${PROJECT_NAME}> DESTINATION bin/${TSEP_CMAKE_GENERATOR} OPTIONAL)
endif()
install(EXPORT ${MAIN_PROJECT_NAME}Config
DESTINATION bin/${TSEP_CMAKE_GENERATOR}/cmake
NAMESPACE Tsep::
)
endif()
endmacro()
#/////////////////////////////////////////////////////////////////////////////////////////////////
macro(TSEP_PROVIDE_UNITTEST_FILES TestFileList)
message(" Generating custom action to provide the test file in the tmp directory / " ${PROJECT_NAME})
if (WIN32)
file(TO_NATIVE_PATH $ENV{TMP}/${PROJECT_NAME} DEST_DIR)
else()
file(TO_NATIVE_PATH /tmp/${PROJECT_NAME} DEST_DIR)
endif()
#- Add pre-link step to the copy the source files
add_custom_command(TARGET ${PROJECT_NAME}
DEPENDS ${TestFileList}
COMMENT "Provide Unit Test Files..."
POST_BUILD
VERBATIM
WORKING_DIRECTORY
COMMAND_EXPAND_LISTS
COMMAND ${CMAKE_COMMAND} -E remove_directory ${DEST_DIR}
COMMAND ${CMAKE_COMMAND} -E make_directory ${DEST_DIR}
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${TestFileList} ${DEST_DIR}
)
endmacro()
#/////////////////////////////////////////////////////////////////////////////////////////////////
macro(TSEP_PROVIDE_APPLICATION_DATA_FILES ApplicationName AppDataFileList)
message(" Generating custom action to provide the application data file in the application data directory / " ${ApplicationName})
# Calculate the length of the loop
list(LENGTH ${AppDataFileList} len1)
math(EXPR len2 "${len1} / 2")
# Loop over the array
foreach(val RANGE 0 ${len2} 2)
# Calculate the next idx
math(EXPR valN "${val} + 1")
# Get the items
list(GET ${AppDataFileList} ${val} SubFolder)
list(GET ${AppDataFileList} ${valN} FileName)
# Do copy
if("${SubFolder}" STREQUAL "")
TSEP_PROVIDE_APPLICATION_DATA_FILES_IN_ROOTFOLDER(${ApplicationName} ${FileName})
else()
TSEP_PROVIDE_APPLICATION_DATA_FILES_IN_SUBFOLDER(${ApplicationName} ${SubFolder} ${FileName})
endif()
# message(STATUS "${val1} ${val2}")
endforeach()
endmacro()
#/////////////////////////////////////////////////////////////////////////////////////////////////
macro(TSEP_PROVIDE_APPLICATION_DATA_FILES_IN_ROOTFOLDER ApplicationName AppDataFile)
message(" Generating custom action to provide the application data file -> ${AppDataFile}")
if (WIN32)
file(TO_NATIVE_PATH $ENV{PROGRAMDATA}/Tsep/${ApplicationName} DEST_DIR)
else()
file(TO_NATIVE_PATH $ENV{HOME}/.local/share DEST_DIR)
endif()
#- Add pre-link step to the copy the source files
add_custom_command(TARGET ${PROJECT_NAME}
DEPENDS ${AppDataFileList}
POST_BUILD
VERBATIM
WORKING_DIRECTORY
COMMAND_EXPAND_LISTS
COMMAND ${CMAKE_COMMAND} -E make_directory ${DEST_DIR}
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${AppDataFile} ${DEST_DIR}
)
endmacro()
#/////////////////////////////////////////////////////////////////////////////////////////////////
macro(TSEP_PROVIDE_APPLICATION_DATA_FILES_IN_SUBFOLDER ApplicationName SubFolder AppDataFile)
message(" Generating custom action to provide the application data file in folder ${SubFolder} -> ${AppDataFile}")
if (WIN32)
file(TO_NATIVE_PATH $ENV{PROGRAMDATA}/Tsep/${ApplicationName}/${SubFolder} DEST_DIR)
else()
file(TO_NATIVE_PATH $ENV{HOME}/.local/share/${SubFolder} DEST_DIR)
endif()
#- Add pre-link step to the copy the source files
add_custom_command(TARGET ${PROJECT_NAME}
DEPENDS ${AppDataFileList}
POST_BUILD
VERBATIM
WORKING_DIRECTORY
COMMAND_EXPAND_LISTS
COMMAND ${CMAKE_COMMAND} -E make_directory ${DEST_DIR}
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${AppDataFile} ${DEST_DIR}
)
endmacro()
#/////////////////////////////////////////////////////////////////////////////////////////////////
function(TSEP_GENERATE_DEPENDENCY_LINKS)
message(" Generating executable links for all dependencies")
# Generate the link only if we are in developer mode
if(NOT TSEP_PRODUCT_BUILD)
# Debug ----------------------------------------------------------------------------------------
TSEP_GENERATE_DEPENDENCY_LINKS_FOR_CONFIGURATION(Debug)
TSEP_GENERATE_ADDED_DEPENDENCY_LINKS_FOR_CONFIGURATION(Debug)
# Release ----------------------------------------------------------------------------------------
TSEP_GENERATE_DEPENDENCY_LINKS_FOR_CONFIGURATION(Release)
TSEP_GENERATE_ADDED_DEPENDENCY_LINKS_FOR_CONFIGURATION(Release)
endif()
endfunction()
#/////////////////////////////////////////////////////////////////////////////////////////////////
function(TSEP_GENERATE_DEPENDENCY_LINKS_FOR_CONFIGURATION)
get_target_property(ExecutableLinks ${PROJECT_NAME} LINK_LIBRARIES)
set (CONTAINS_QT_PROJECT_GLOBAL FALSE)
# For all files --------------------------------------------------------------------------------
foreach (Executable ${ExecutableLinks})
set (CONTAINS_QT_PROJECT FALSE)
set (CONTAINS_SSL_PROJECT FALSE)
set (CONTAINS_CRYPTO_PROJECT FALSE)
set (CONTAINS_TSEP_PROJECT FALSE)
string(FIND ${Executable} "Tsep::" TsepExecutable)
if (TsepExecutable GREATER -1)
set (CONTAINS_TSEP_PROJECT TRUE)
endif()
if(WIN32)
string(FIND ${Executable} "Qt5::" QtExecutable)
if (QtExecutable GREATER -1)
set (CONTAINS_QT_PROJECT TRUE)
set (CONTAINS_QT_PROJECT_GLOBAL TRUE)
endif()
string(FIND ${Executable} "OpenSSL::SSL" OpenSslExecutable)
if (OpenSslExecutable GREATER -1)
set (CONTAINS_SSL_PROJECT TRUE)
endif()
string(FIND ${Executable} "OpenSSL::Crypto" OpenSslExecutable)
if (OpenSslExecutable GREATER -1)
set (CONTAINS_CRYPTO_PROJECT TRUE)
endif()
endif()
if(CONTAINS_TSEP_PROJECT OR CONTAINS_QT_PROJECT OR CONTAINS_SSL_PROJECT OR CONTAINS_CRYPTO_PROJECT)
# at the moment not needed for linux
if(WIN32)
if(CONTAINS_SSL_PROJECT)
set(LinkFile ${OPENSSL_ROOT_DIR}/bin/libssl-1_1-x64.dll)
elseif(CONTAINS_CRYPTO_PROJECT)
set(LinkFile ${OPENSSL_ROOT_DIR}/bin/libcrypto-1_1-x64.dll)
elseif (${ARGV0} STREQUAL Debug)
get_target_property(LinkFile ${Executable} LOCATION_DEBUG)
else()
get_target_property(LinkFile ${Executable} LOCATION_RELEASE)
endif()
#- Get the file name from the complete path
get_filename_component(LinkFileName ${LinkFile} NAME)
#- convert the path into an operating system depending format
file(TO_NATIVE_PATH ${LinkFile} LinkFileNative)
#- remove the file if it exists
if(EXISTS "${PROJECT_BINARY_DIR}/${ARGV0}/bin/${LinkFileName}")
file(REMOVE "${PROJECT_BINARY_DIR}/${ARGV0}/bin/${LinkFileName}")
endif()
#- convert the path into an operating system depending format
file(TO_NATIVE_PATH ${LinkFileName} LinkFileNameNative)
execute_process( WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/${ARGV0}/bin
COMMAND cmd.exe /c mklink "${LinkFileNameNative}" "${LinkFileNative}"
OUTPUT_QUIET)
endif()
endif()
endforeach()
# Qt platforms and iconengines have special destination folders
if(${CONTAINS_QT_PROJECT_GLOBAL})
set(PLATFORMS_DIR ${Qt5_DIR}/../../../plugins/platforms)
file(TO_NATIVE_PATH ${PLATFORMS_DIR} NATIVE_PLATFORMS_DIR)
execute_process(WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/${ARGV0}/bin
COMMAND cmd.exe /c mklink /D platforms "${NATIVE_PLATFORMS_DIR}"
OUTPUT_QUIET)
set(ICONENGINES_DIR ${Qt5_DIR}/../../../plugins/iconengines)
file(TO_NATIVE_PATH ${ICONENGINES_DIR} NATIVE_ICONENGINES_DIR)
execute_process(WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/${ARGV0}/bin
COMMAND cmd.exe /c mklink /D iconengines "${NATIVE_ICONENGINES_DIR}"
OUTPUT_QUIET)
endif()
endfunction()
#/////////////////////////////////////////////////////////////////////////////////////////////////
# creates dependency links for dynamically loaded libraries under windows and extends the rpath under linux
function(TSEP_GENERATE_ADDED_DEPENDENCY_LINKS_FOR_CONFIGURATION)
get_target_property(ExecutableLinks ${PROJECT_NAME} MANUALLY_ADDED_DEPENDENCIES)
# For all files --------------------------------------------------------------------------------
foreach (Executable ${ExecutableLinks})
set (CONTAINS_TSEP_PROJECT FALSE)
string(FIND ${Executable} "Tsep::" TsepExecutable)
if (TsepExecutable GREATER -1)
set (CONTAINS_TSEP_PROJECT TRUE)
endif()
if(CONTAINS_TSEP_PROJECT)
if (${ARGV0} STREQUAL Debug)
get_target_property(LinkFile ${Executable} LOCATION_DEBUG)
else()
get_target_property(LinkFile ${Executable} LOCATION_RELEASE)
endif()
if(WIN32)
#- Get the file name from the complete path
get_filename_component(LinkFileName ${LinkFile} NAME)
#- convert the path into an operating system depending format
file(TO_NATIVE_PATH ${LinkFile} LinkFileNative)
#- create the link
#- remove the file if it exists
if(EXISTS "${PROJECT_BINARY_DIR}/${ARGV0}/bin/${LinkFileName}")
file(REMOVE "${PROJECT_BINARY_DIR}/${ARGV0}/bin/${LinkFileName}")
endif()
#- convert the path into an operating system depending format
file(TO_NATIVE_PATH ${LinkFileName} LinkFileNameNative)
execute_process( WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/${ARGV0}/bin
COMMAND cmd.exe /c mklink "${LinkFileNameNative}" "${LinkFileNative}"
OUTPUT_QUIET)
else()
#- Get the path of the file
get_filename_component(LinkDirectoryName ${LinkFile} DIRECTORY)
get_target_property(OLD_RPATH ${PROJECT_NAME} BUILD_RPATH)
if (${OLD_PATH})
set_property(TARGET ${PROJECT_NAME} PROPERTY BUILD_RPATH "${OLD_RPATH};${LinkDirectoryName}")
else()
set_property(TARGET ${PROJECT_NAME} PROPERTY BUILD_RPATH "$ORIGIN;${LinkDirectoryName}")
endif()
endif()
endif()
endforeach()
endfunction()
#/////////////////////////////////////////////////////////////////////////////////////////////////
function(TSEP_GENERATE_CUSTOM_DEPENDENCY_LINK)
message(" Generating executable links for all dependencies")
# Debug ----------------------------------------------------------------------------------------
TSEP_GENERATE_CUSTOM_DEPENDENCY_LINK_FOR_CONFIGURATION(Debug ${ARGV0} ${ARGV1})
# Release ----------------------------------------------------------------------------------------
TSEP_GENERATE_CUSTOM_DEPENDENCY_LINK_FOR_CONFIGURATION(Release ${ARGV0} ${ARGV1})
endfunction()
#/////////////////////////////////////////////////////////////////////////////////////////////////
function(TSEP_GENERATE_CUSTOM_DEPENDENCY_LINK_FOR_CONFIGURATION)
#- Get the file name from the complete path
set(LinkFile ${ARGV1})
get_filename_component(LinkFileName ${LinkFile} NAME)
if(${ARGC} GREATER 2)
set(LinkFileName ${ARGV2}/${LinkFileName})
file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/${ARGV0}/bin/${ARGV2})
endif()
#- convert the path into an operating system depending format
file(TO_NATIVE_PATH ${LinkFile} LinkFileNative)
#- create the link
if(WIN32)
#- remove the file if it exists
if(EXISTS "${PROJECT_BINARY_DIR}/${ARGV0}/bin/${LinkFileName}")
file(REMOVE "${PROJECT_BINARY_DIR}/${ARGV0}/bin/${LinkFileName}")
endif()
#- convert the path into an operating system depending format
file(TO_NATIVE_PATH ${LinkFileName} LinkFileNameNative)
execute_process( WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/${ARGV0}/bin
COMMAND cmd.exe /c mklink "${LinkFileNameNative}" "${LinkFileNative}"
OUTPUT_QUIET)
else()
file(COPY ${LinkFile} DESTINATION ${PROJECT_BINARY_DIR}/bin/)
endif()
endfunction()
#/////////////////////////////////////////////////////////////////////////////////////////////////
function(TSEP_GENERATE_CUSTOM_DEPENDENCY_TARGET_LINK)
message(" Generating executable links for all dependencies")
# Debug ----------------------------------------------------------------------------------------
TSEP_GENERATE_CUSTOM_DEPENDENCY_TARGET_LINK_FOR_CONFIGURATION(Debug ${ARGV0} ${ARGV1})
# Release ----------------------------------------------------------------------------------------
TSEP_GENERATE_CUSTOM_DEPENDENCY_TARGET_LINK_FOR_CONFIGURATION(Release ${ARGV0} ${ARGV1})
endfunction()
#/////////////////////////////////////////////////////////////////////////////////////////////////
function(TSEP_GENERATE_CUSTOM_DEPENDENCY_TARGET_LINK_FOR_CONFIGURATION)
#- Get the file name from the complete path
set(Executable ${ARGV1})
if (${ARGV0} STREQUAL Debug)
get_target_property(LinkFile ${Executable} LOCATION_DEBUG)
else()
get_target_property(LinkFile ${Executable} LOCATION_RELEASE)
endif()
get_filename_component(LinkFileName ${LinkFile} NAME)
if(${ARGC} GREATER 2)
set(LinkFileName ${ARGV2}/${LinkFileName})
file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/${ARGV0}/bin/${ARGV2})
endif()
#- create the link
if(WIN32)
#- convert the path into an operating system depending format
file(TO_NATIVE_PATH ${LinkFile} LinkFileNative)
#- remove the file if it exists
if(EXISTS "${PROJECT_BINARY_DIR}/${ARGV0}/bin/${LinkFileName}")
file(REMOVE "${PROJECT_BINARY_DIR}/${ARGV0}/bin/${LinkFileName}")
endif()
#- convert the path into an operating system depending format
file(TO_NATIVE_PATH ${LinkFileName} LinkFileNameNative)
execute_process( WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/${ARGV0}/bin
COMMAND cmd.exe /c mklink "${LinkFileNameNative}" "${LinkFileNative}"
OUTPUT_QUIET)
else()
message("${LinkFile} -> ${PROJECT_BINARY_DIR}/bin/${LinkFileName}")
file(COPY ${LinkFile} DESTINATION ${PROJECT_BINARY_DIR}/bin/)
endif()
endfunction()
#/////////////////////////////////////////////////////////////////////////////////////////////////
function(TSEP_USE_CODE_ANALYSIS ProjectName)
if (WIN32)
#- generate the poperty file only if it not exists
if(NOT EXISTS "${PROJECT_BINARY_DIR}/${TSEP_VS_PROP_FILE}")
message(" Create VS property sheet for code analysing for project / " ${ProjectName})
set(TsepConfigPropFile ${TSEP_PROJECT_CMAKE}/${TSEP_CA_RULESET_DIR}/${TSEP_VS_PROP_FILE})
file(TO_NATIVE_PATH ${TsepConfigPropFile} TsepConfigPropFileNative)
set(TsepCAFile ${TSEP_PROJECT_CMAKE}/${TSEP_CA_RULESET_DIR}/${TSEP_CA_RULESET_FILE})
file(TO_NATIVE_PATH ${TsepCAFile} TsepCAFileNative)
# Copy the nuspec template file and configure it for the product
configure_file(${TsepConfigPropFileNative} ${PROJECT_BINARY_DIR}/${TSEP_VS_PROP_FILE} @ONLY )
endif()
#- set the property
set_target_properties(${ProjectName} PROPERTIES VS_USER_PROPS ../${TSEP_VS_PROP_FILE})
endif()
endfunction()
#/////////////////////////////////////////////////////////////////////////////////////////////////
function(TSEP_ADD_AUTOBUILD_UNITTEST UnitExecutableName)
get_property(local_prop GLOBAL PROPERTY TSEP_AUTOBUILD_UNITTEST)
set(local_prop "${local_prop};${UnitExecutableName}")
set_property(GLOBAL PROPERTY TSEP_AUTOBUILD_UNITTEST ${local_prop})
#message("list " ${local_prop})
endfunction()
#/////////////////////////////////////////////////////////////////////////////////////////////////
function(TSEP_ADD_AUTOBUILD MainProjectName)
IF (INTIME)
set(TSEP_AUTOBUILD_DIR "${PROJECT_BINARY_DIR}/../../AutoBuild/INtime")
elseif (WIN32)
set(TSEP_AUTOBUILD_DIR "${PROJECT_BINARY_DIR}/../../AutoBuild/Windows")
elseif (LINUX)
set(TSEP_AUTOBUILD_DIR "${PROJECT_BINARY_DIR}/../AutoBuild/linux")
endif()
set(TSEP_AUTOBUILD_PROJECT ${MainProjectName})
get_property(local_prop GLOBAL PROPERTY TSEP_AUTOBUILD_UNITTEST)
message("-------------------------------------------------------")
message(" Auto Build Solution name : " ${TSEP_AUTOBUILD_PROJECT})
# Create the auto build directory
message(" Prepare auto build dir : " ${TSEP_AUTOBUILD_DIR})
if(EXISTS ${TSEP_AUTOBUILD_DIR})
file(REMOVE_RECURSE ${TSEP_AUTOBUILD_DIR})
endif()
file(MAKE_DIRECTORY ${TSEP_AUTOBUILD_DIR})
file(MAKE_DIRECTORY ${TSEP_AUTOBUILD_DIR}/scripts)
# Copy the files for the build, os dependend
IF (INTIME)
configure_file(${TSEP_PROJECT_CMAKE}/AutoBuild/BuildVs2017INtimeProject.cmd ${TSEP_AUTOBUILD_DIR}/scripts COPYONLY)
foreach (TSEP_AUTOBUILD_UNIT_EXE ${local_prop})
if("${TSEP_AUTOBUILD_USED_UNITTEST}" STREQUAL "")
set(TSEP_AUTOBUILD_USED_UNITTEST "${TSEP_AUTOBUILD_UNIT_EXE}")
else()
set(TSEP_AUTOBUILD_USED_UNITTEST "${TSEP_AUTOBUILD_USED_UNITTEST},${TSEP_AUTOBUILD_UNIT_EXE}")
endif()
endforeach()
message(" Auto Build Unittest : " ${TSEP_AUTOBUILD_USED_UNITTEST})
configure_file(${TSEP_PROJECT_CMAKE}/AutoBuild/BuildAllVS2017INtime.cmd ${TSEP_AUTOBUILD_DIR}/BuildAll.cmd @ONLY)
elseif (WIN32)
set(TSEP_AUTOBUILD_USED_UNITTEST "")
configure_file(${TSEP_PROJECT_CMAKE}/AutoBuild/BuildVS2017Project.cmd ${TSEP_AUTOBUILD_DIR}/scripts COPYONLY)
foreach (TSEP_AUTOBUILD_UNIT_EXE ${local_prop})
if("${TSEP_AUTOBUILD_USED_UNITTEST}" STREQUAL "")
set(TSEP_AUTOBUILD_USED_UNITTEST "${TSEP_AUTOBUILD_UNIT_EXE}")
else()
set(TSEP_AUTOBUILD_USED_UNITTEST "${TSEP_AUTOBUILD_USED_UNITTEST},${TSEP_AUTOBUILD_UNIT_EXE}")
endif()
endforeach()
message(" Auto Build Unittest : " ${TSEP_AUTOBUILD_USED_UNITTEST})
configure_file(${TSEP_PROJECT_CMAKE}/AutoBuild/BuildAllVS2017.cmd ${TSEP_AUTOBUILD_DIR}/BuildAll.cmd @ONLY)
elseif (LINUX)
configure_file(${TSEP_PROJECT_CMAKE}/AutoBuild/BuildLinuxProject.sh ${TSEP_AUTOBUILD_DIR}/scripts COPYONLY)
configure_file(${TSEP_PROJECT_CMAKE}/AutoBuild/RunUnitTest.sh ${TSEP_AUTOBUILD_DIR}/scripts COPYONLY)
foreach (TSEP_AUTOBUILD_UNIT_EXE ${local_prop})
if("${TSEP_AUTOBUILD_USED_UNITTEST}" STREQUAL "")
set(TSEP_AUTOBUILD_USED_UNITTEST "${TSEP_AUTOBUILD_UNIT_EXE}")
else()
set(TSEP_AUTOBUILD_USED_UNITTEST "${TSEP_AUTOBUILD_USED_UNITTEST},${TSEP_AUTOBUILD_UNIT_EXE}")
endif()
endforeach()
message(" Auto Build Unittest : " ${TSEP_AUTOBUILD_USED_UNITTEST})
configure_file(${TSEP_PROJECT_CMAKE}/AutoBuild/BuildAllLinux.sh ${TSEP_AUTOBUILD_DIR}/BuildAll.sh @ONLY)
endif()
endfunction()