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.
|
|
# 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)
|