1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
|
macro(add_mad_library _name _source_files _header_files _dep_mad_comp _include_dir)
if (NOT ${_source_files}) # no sources given? use add_mad_hdr_library
message (FATAL_ERROR "add_mad_library: no sources given; probably want add_mad_hdr_library instead")
endif()
add_library(MAD${_name}-obj OBJECT ${${_source_files}} ${${_header_files}})
# make library target(s)
# if building shared library, build static as well using the same objects
add_library(MAD${_name} $<TARGET_OBJECTS:MAD${_name}-obj>)
add_library(${_name} ALIAS MAD${_name})
add_dependencies(madness-libraries ${_name})
if(BUILD_SHARED_LIBS)
if (NOT DEFINED CMAKE_POSITION_INDEPENDENT_CODE)
set_target_properties(MAD${_name}-obj PROPERTIES POSITION_INDEPENDENT_CODE TRUE) # this is the default anyway, but produce a warning just in case
message(WARNING "building shared libraries, setting default for POSITION_INDEPENDENT_CODE to true (set CMAKE_POSITION_INDEPENDENT_CODE to change the default)")
endif()
endif(BUILD_SHARED_LIBS)
# Pass the private MAD${_name} compile flags to MAD${_name}-obj
target_compile_definitions(MAD${_name}-obj PRIVATE
$<TARGET_PROPERTY:MAD${_name},COMPILE_DEFINITIONS>)
target_include_directories(MAD${_name}-obj PRIVATE
$<TARGET_PROPERTY:MAD${_name},INCLUDE_DIRECTORIES>)
target_compile_options(MAD${_name}-obj PRIVATE
$<TARGET_PROPERTY:MAD${_name},COMPILE_OPTIONS>)
# target-common setup
add_custom_target(install-madness-${_name}
COMMAND ${CMAKE_COMMAND} -DCOMPONENT=${_name} -P ${PROJECT_BINARY_DIR}/cmake_install.cmake
COMMENT "Installing ${_name} library components"
USES_TERMINAL)
add_dependencies(install-madness-${_name} install-madness-common)
add_dependencies(install-madness-libraries install-madness-${_name})
foreach(_dep ${_dep_mad_comp})
if(TARGET install-madness-${_dep})
add_dependencies(install-madness-${_name} install-madness-${_dep})
endif()
endforeach()
# configure each target
set(targetname MAD${_name})
target_include_directories(${targetname} PUBLIC
$<INSTALL_INTERFACE:${MADNESS_INSTALL_INCLUDEDIR}>)
set_target_properties(${targetname} PROPERTIES PUBLIC_HEADER "${${_header_files}}")
# Add library to the list of installed components
install(TARGETS ${targetname} EXPORT madness
COMPONENT ${_name}
PUBLIC_HEADER DESTINATION "${MADNESS_INSTALL_INCLUDEDIR}/${_include_dir}"
LIBRARY DESTINATION "${MADNESS_INSTALL_LIBDIR}"
ARCHIVE DESTINATION "${MADNESS_INSTALL_LIBDIR}"
INCLUDES DESTINATION "${MADNESS_INSTALL_INCLUDEDIR}")
# Create a target to install the component
add_dependencies(install-madness-${_name} ${targetname})
set(LINK_FLAGS "")
foreach(_dep ${_dep_mad_comp})
if (${_dep}_is_mad_hdr_lib)
set(deptargetname MAD${_dep})
else(${_dep}_is_mad_hdr_lib)
set(deptargetname MAD${_dep})
endif(${_dep}_is_mad_hdr_lib)
if(TARGET ${deptargetname})
target_compile_definitions(${targetname} PUBLIC
$<TARGET_PROPERTY:${deptargetname},INTERFACE_COMPILE_DEFINITIONS>)
target_include_directories(${targetname} PUBLIC
$<TARGET_PROPERTY:${deptargetname},INTERFACE_INCLUDE_DIRECTORIES>)
target_compile_options(${targetname} PUBLIC
$<TARGET_PROPERTY:${deptargetname},INTERFACE_COMPILE_OPTIONS>)
if (${_dep}_is_mad_hdr_lib)
target_link_libraries(${targetname} INTERFACE ${_dep})
else()
target_link_libraries(${targetname} PUBLIC ${deptargetname})
endif()
# import LINK_FLAGS from dependent
get_property(deptargetname_LINK_FLAGS_SET TARGET ${deptargetname} PROPERTY LINK_FLAGS SET)
if (deptargetname_LINK_FLAGS_SET)
get_property(deptargetname_LINK_FLAGS TARGET ${deptargetname} PROPERTY LINK_FLAGS)
set(LINK_FLAGS "${LINK_FLAGS} ${deptargetname_LINK_FLAGS}")
endif ()
endif()
endforeach(_dep ${_dep_mad_comp})
set_target_properties(${targetname} PROPERTIES LINK_FLAGS "${LINK_FLAGS}")
target_compile_features(${targetname} INTERFACE "cxx_std_${CMAKE_CXX_STANDARD}")
endmacro()
macro(add_mad_hdr_library _name _header_files _dep_mad_comp _include_dir)
message (STATUS "in add_mad_hdr_library(${_name})")
# make INTERFACE library
add_library(MAD${_name} INTERFACE)
# Add target dependencies
add_library(${_name} ALIAS MAD${_name})
add_dependencies(libraries-madness MAD${_name})
target_include_directories(MAD${_name} INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>
$<INSTALL_INTERFACE:${MADNESS_INSTALL_INCLUDEDIR}>
)
# Add library to the list of installed components
install(TARGETS MAD${_name} EXPORT madness
COMPONENT ${_name})
# Create a target to install the component
add_custom_target(install-madness-${_name}
COMMAND ${CMAKE_COMMAND} -DCOMPONENT=${_name} -P ${PROJECT_BINARY_DIR}/cmake_install.cmake
COMMENT "Installing ${_name} library components"
USES_TERMINAL)
add_dependencies(install-madness-${_name} MAD${_name})
add_dependencies(install-madness-libraries install-madness-${_name})
foreach(_dep ${_dep_mad_comp})
if(TARGET install-madness-${_dep})
add_dependencies(install-madness-${_name} install-madness-${_dep})
endif()
if(TARGET ${_dep})
target_compile_definitions(MAD${_name} PUBLIC
$<TARGET_PROPERTY:${_dep},INTERFACE_COMPILE_DEFINITIONS>)
target_include_directories(MAD${_name} PUBLIC
$<TARGET_PROPERTY:${_dep},INTERFACE_INCLUDE_DIRECTORIES>)
target_compile_options(MAD${_name} PUBLIC
$<TARGET_PROPERTY:${_dep},INTERFACE_COMPILE_OPTIONS>)
if (${_dep}_is_mad_hdr_lib)
target_link_libraries(MAD${_name} INTERFACE ${_dep})
else()
target_link_libraries(MAD${_name} PUBLIC ${_dep})
endif()
endif()
endforeach()
target_compile_features(MAD${_name} INTERFACE "cxx_std_${CMAKE_CXX_STANDARD}")
set(${_name}_is_mad_hdr_lib TRUE)
endmacro()
|