You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
201 lines
7.5 KiB
201 lines
7.5 KiB
# File: macros.cmake
|
|
# Authors: Igor N. Bongartz
|
|
# Erstellt: 2015-06-11
|
|
# Version: 2015-06-11
|
|
#
|
|
# This file contains several macros which are used in this project. Notice that several are copied straight from web ressources.
|
|
|
|
function(set_version major minor)
|
|
execute_process(
|
|
COMMAND git describe
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
|
OUTPUT_VARIABLE GIT_VERSION
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
)
|
|
set(patch "")
|
|
if (GIT_VERSION MATCHES "([0-9]+)\.([0-9]+)(-?.*)")
|
|
set(major ${CMAKE_MATCH_1})
|
|
set(minor ${CMAKE_MATCH_2})
|
|
if (CMAKE_MATCH_3 MATCHES "-([0-9]+)-(g[0-9a-f]+)")
|
|
set(patch_full "${CMAKE_MATCH_1}-${CMAKE_MATCH_2}")
|
|
set(patch "${CMAKE_MATCH_1}")
|
|
endif()
|
|
else()
|
|
message(STATUS "Could not parse version from git, using default ${major}.${minor}")
|
|
endif()
|
|
|
|
set(PROJECT_VERSION_MAJOR ${major} PARENT_SCOPE)
|
|
set(PROJECT_VERSION_MINOR ${minor} PARENT_SCOPE)
|
|
set(PROJECT_VERSION_PATCH ${patch} PARENT_SCOPE)
|
|
if(patch)
|
|
set(PROJECT_VERSION_FULL "${major}.${minor}.${patch_full}" PARENT_SCOPE)
|
|
set(PROJECT_VERSION "${major}.${minor}.${patch}" PARENT_SCOPE)
|
|
else()
|
|
set(PROJECT_VERSION_FULL "${major}.${minor}" PARENT_SCOPE)
|
|
set(PROJECT_VERSION "${major}.${minor}" PARENT_SCOPE)
|
|
endif()
|
|
endfunction(set_version)
|
|
|
|
function(add_imported_library_interface name include)
|
|
add_library(${name} INTERFACE IMPORTED)
|
|
set_target_properties(${name} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${include}")
|
|
endfunction(add_imported_library_interface)
|
|
|
|
function(add_imported_library name type lib include)
|
|
# Workaround from https://cmake.org/Bug/view.php?id=15052
|
|
file(MAKE_DIRECTORY "${include}")
|
|
if("${lib}" STREQUAL "")
|
|
if("${type}" STREQUAL "SHARED")
|
|
add_library(${name} INTERFACE IMPORTED)
|
|
set_target_properties(${name} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${include}")
|
|
endif()
|
|
else()
|
|
set(lib_list "${lib}")
|
|
list(LENGTH lib_list NumFiles)
|
|
if(NumFiles GREATER 1)
|
|
add_library(${name}_${type} INTERFACE IMPORTED GLOBAL)
|
|
set(shortnames "${ARGN}")
|
|
set(libs "")
|
|
math(EXPR range "${NumFiles}-1")
|
|
foreach(index RANGE ${range})
|
|
list(GET lib_list ${index} l)
|
|
list(GET shortnames ${index} shortname)
|
|
add_imported_library("${name}_${shortname}" ${type} ${l} ${include})
|
|
list(APPEND libs "${name}_${shortname}_${type}")
|
|
# only from cmake 3.3 https://github.com/ceph/ceph/pull/7128
|
|
#add_dependencies(${name}_${type} ${name}_${shortname}_${type})
|
|
endforeach()
|
|
set_target_properties(${name}_${type} PROPERTIES INTERFACE_LINK_LIBRARIES "${libs}")
|
|
set_target_properties(${name}_${type} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${include}")
|
|
else()
|
|
add_library(${name}_${type} ${type} IMPORTED GLOBAL)
|
|
set_target_properties(${name}_${type} PROPERTIES IMPORTED_LOCATION "${lib}")
|
|
set_target_properties(${name}_${type} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${include}")
|
|
if(WIN32)
|
|
string(REPLACE "dll" "lib" IMPLIB ${lib})
|
|
set_target_properties(${name}_${type} PROPERTIES IMPORTED_IMPLIB "${IMPLIB}")
|
|
endif()
|
|
endif()
|
|
endif()
|
|
endfunction(add_imported_library)
|
|
|
|
function(export_option name)
|
|
list(APPEND EXPORTED_OPTIONS "${name}")
|
|
set(EXPORTED_OPTIONS "${EXPORTED_OPTIONS}" PARENT_SCOPE)
|
|
endfunction(export_option)
|
|
|
|
function(_export_target_add_exec output TARGET)
|
|
set(${output} "${${output}}
|
|
add_executable(${TARGET} IMPORTED)" PARENT_SCOPE)
|
|
endfunction(_export_target_add_exec)
|
|
function(_export_target_add_lib output TARGET TYPE)
|
|
set(${output} "${${output}}
|
|
add_library(${TARGET} ${TYPE} IMPORTED)" PARENT_SCOPE)
|
|
endfunction(_export_target_add_lib)
|
|
function(_export_target_start output TARGET)
|
|
set(${output} "${${output}}
|
|
|
|
if(NOT TARGET ${TARGET})" PARENT_SCOPE)
|
|
endfunction(_export_target_start)
|
|
function(_export_target_end output)
|
|
set(${output} "${${output}}
|
|
endif()" PARENT_SCOPE)
|
|
endfunction(_export_target_end)
|
|
|
|
macro(_export_target_set_prop output TARGET REQUIRED PROPERTY)
|
|
get_target_property(VALUE ${TARGET} ${PROPERTY})
|
|
set(extra_args ${ARGN})
|
|
list(GET extra_args 0 NEWPROPERTY)
|
|
if(NOT NEWPROPERTY)
|
|
set(NEWPROPERTY ${PROPERTY})
|
|
endif()
|
|
if(VALUE)
|
|
set(${output} "${${output}}
|
|
set_target_properties(${TARGET} PROPERTIES ${NEWPROPERTY} \"${VALUE}\")")
|
|
elseif(${REQUIRED})
|
|
message(STATUS "Did not find ${PROPERTY} of ${TARGET} for export.")
|
|
endif()
|
|
endmacro(_export_target_set_prop)
|
|
|
|
macro(export_target output target)
|
|
if(TARGET ${target})
|
|
get_target_property(TYPE ${target} TYPE)
|
|
_export_target_start(${output} ${target})
|
|
if(TYPE STREQUAL "EXECUTABLE")
|
|
_export_target_add_exec(${output} ${target})
|
|
_export_target_set_prop(${output} ${target} TRUE IMPORTED_LOCATION)
|
|
elseif(TYPE STREQUAL "SHARED_LIBRARY")
|
|
_export_target_add_lib(${output} ${target} SHARED)
|
|
_export_target_set_prop(${output} ${target} TRUE IMPORTED_LOCATION)
|
|
_export_target_set_prop(${output} ${target} FALSE INTERFACE_INCLUDE_DIRECTORIES)
|
|
_export_target_set_prop(${output} ${target} FALSE LINK_INTERFACE_LIBRARIES)
|
|
elseif(TYPE STREQUAL "STATIC_LIBRARY")
|
|
_export_target_add_lib(${output} ${target} STATIC)
|
|
_export_target_set_prop(${output} ${target} TRUE IMPORTED_LOCATION)
|
|
_export_target_set_prop(${output} ${target} FALSE INTERFACE_INCLUDE_DIRECTORIES)
|
|
_export_target_set_prop(${output} ${target} FALSE LINK_INTERFACE_LIBRARIES IMPORTED_LINK_INTERFACE_LIBRARIES)
|
|
elseif(TYPE STREQUAL "INTERFACE_LIBRARY")
|
|
_export_target_add_lib(${output} ${target} INTERFACE)
|
|
_export_target_set_prop(${output} ${target} TRUE INTERFACE_INCLUDE_DIRECTORIES)
|
|
_export_target_set_prop(${output} ${target} FALSE INTERFACE_LINK_LIBRARIES)
|
|
else()
|
|
message(STATUS "Unknown type ${TYPE}")
|
|
endif()
|
|
if(NOT "${ARGN}" STREQUAL "")
|
|
set(${output} "${${output}}
|
|
set_target_properties(${target} PROPERTIES IMPORTED_LINK_INTERFACE_LIBRARIES \"${ARGN}\")")
|
|
endif()
|
|
_export_target_end(${output})
|
|
endif()
|
|
endmacro(export_target)
|
|
|
|
macro(export_target_recursive output target RECURSE_ON)
|
|
export_target(${output} ${target})
|
|
get_target_property(deps ${target} ${RECURSE_ON})
|
|
foreach(d ${deps})
|
|
export_target(${output} ${d})
|
|
endforeach()
|
|
endmacro(export_target_recursive)
|
|
|
|
macro(load_library group name version)
|
|
string(TOUPPER ${name} LIBNAME)
|
|
set(CMAKE_FIND_LIBRARY_SUFFIXES "${DYNAMIC_EXT};${STATIC_EXT}")
|
|
set(Boost_USE_STATIC_LIBS OFF)
|
|
find_package(${name} ${version} ${ARGN} QUIET)
|
|
if(${name}_FOUND OR ${LIBNAME}_FOUND)
|
|
if (${name}_FOUND)
|
|
set(LIBNAME ${name})
|
|
endif()
|
|
|
|
if(LIBNAME MATCHES "Boost")
|
|
add_imported_library(${LIBNAME} SHARED "${${LIBNAME}_LIBRARIES}" "${${LIBNAME}_INCLUDE_DIR}" "${BOOST_COMPONENTS}")
|
|
else()
|
|
add_imported_library(${LIBNAME} SHARED "${${LIBNAME}_LIBRARY}" "${${LIBNAME}_INCLUDE_DIR}")
|
|
endif()
|
|
|
|
unset(${LIBNAME}_FOUND CACHE)
|
|
unset(${LIBNAME}_INCLUDE_DIR CACHE)
|
|
unset(${LIBNAME}_LIBRARY CACHE)
|
|
|
|
set(CMAKE_FIND_LIBRARY_SUFFIXES "${STATIC_EXT};${DYNAMIC_EXT}")
|
|
set(Boost_USE_STATIC_LIBS ON)
|
|
if (ARGN)
|
|
list(REMOVE_ITEM ARGN "REQUIRED")
|
|
endif()
|
|
find_package(${name} ${version} ${ARGN} QUIET)
|
|
if(${LIBNAME}_FOUND)
|
|
if(LIBNAME MATCHES "Boost")
|
|
add_imported_library(${LIBNAME} STATIC "${${LIBNAME}_LIBRARIES}" "${${LIBNAME}_INCLUDE_DIR}" "${BOOST_COMPONENTS}")
|
|
else()
|
|
add_imported_library(${LIBNAME} STATIC "${${LIBNAME}_LIBRARY}" "${${LIBNAME}_INCLUDE_DIR}")
|
|
endif()
|
|
endif()
|
|
|
|
unset(${LIBNAME}_LIBRARY CACHE)
|
|
endif()
|
|
endmacro(load_library)
|
|
|
|
macro(get_include_dir var name)
|
|
get_target_property(INCLUDE_DIR ${name} INTERFACE_INCLUDE_DIRECTORIES)
|
|
set(${var} ${${var}}:${INCLUDE_DIR})
|
|
endmacro(get_include_dir)
|