Skip to content

Commit

Permalink
Wip/11221 modernize cmake (#25)
Browse files Browse the repository at this point in the history
This provides ChimeraTK::<project-name> as cmake imported target.
Variables <project_name>_INCLUDE_DIRS, <project_name>LIBRARY_DIRS, <project_name>_LIBRARIES, <project_name>_CXX_FLAGS, <project_name>_LINKER_FLAGS are provided for compatibility but are generated from cmake-exports where possible and cmake imported targets should be preferred.

* provide function for option array conversion
to be used with target_compile_options etc + FindPackage results, where
findPackage results are of incorrect/old format

* FindDOOCS:
 - DOOCS components as imported targets
 - clean up no longer needed tweaks
 - add timinglib as component
 - make use of log levels and respect QUIET argument

* add_dependency: fail on wrong add_dependency usage
this was unseen since it worked in most cases but in general does not
in particular was causing trouble with imports from cppext
second arg must be version number

* pkgconfig exports
 - generated from cmake-exports
 - make linker flags come before libs, order is required e.g. for --no-as-needed flag
 - remove duplicates in output

* FindGccAtomic
- do not put absolute lib path in output since it was causing trouble with yocto builds. Should be in system lib
paths anyway. Also, make GccAtomic variable output name more consistent.
  • Loading branch information
d-rothe authored and andreasebner committed Apr 24, 2023
1 parent 68985aa commit 219a2ea
Show file tree
Hide file tree
Showing 7 changed files with 504 additions and 123 deletions.
218 changes: 157 additions & 61 deletions cmake/Modules/FindDOOCS.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,23 @@
#
# By default, only the client API is included. If the component "server" is specified, also the
# server library will be used. If the component "zmq" is specified, the DOOCSdzmq library will be used as well.
# Currently support components: api, server, zmq, dapi, ddaq, daqreader, daqsndlib, timinglib
#
# returns:
# DOOCS_FOUND : true or false, depending on whether the package was found
# DOOCS_VERSION : the package version
# DOOCS_LIBRARIES : list of libraries to link against
# DOOCS_DIR : doocs library dir
#
# Also returns following for compatibility, however imported targets should be preferred for usage:
# DOOCS_INCLUDE_DIRS : path to the include directory
# DOOCS_LIBRARY_DIRS : path to the library directory
# DOOCS_LIBRARIES : list of libraries to link against
# DOOCS_CXX_FLAGS : Flags needed to be passed to the c++ compiler
# DOOCS_LINK_FLAGS : Flags needed to be passed to the linker
#
# @author Martin Hierholzer, DESY
# For each component <c>, an imported target DOOCS::<c> is returned.
# We support calling find_package(DOOCS COMPONENTS <cs>) several times, for adding in different components <cs>.
# DOOCS_LIBRARIES will be updated to include all requested components as imported targets.
#
#######################################################################################################################

Expand All @@ -32,80 +38,170 @@

SET(DOOCS_FOUND 0)

list(PREPEND DOOCS_FIND_COMPONENTS doocsapi)
# if set, include the --no-as-needed linker flag which helps if inner dependencies between libs are not properly
# set inside the library binaries
set(DOOCS_noAsNeededFlag 1)

if (";${DOOCS_FIND_COMPONENTS};" MATCHES ";zmq;")
list(APPEND DOOCS_FIND_COMPONENTS doocsdzmq)
list(REMOVE_ITEM DOOCS_FIND_COMPONENTS zmq)
endif()
# note, helper functions and variables should also be prefixed with DOOCS_, since everything is exported to
# project calling find_package(DOOCS)

if (";${DOOCS_FIND_COMPONENTS};" MATCHES ";dapi;")
list(APPEND DOOCS_FIND_COMPONENTS doocsdapi)
list(REMOVE_ITEM DOOCS_FIND_COMPONENTS dapi)
endif()
function (DOOCS_addToPkgConfPath newPath)
if (NOT (":$ENV{PKG_CONFIG_PATH}:" MATCHES ":${newPath}:"))
set(ENV{PKG_CONFIG_PATH} $ENV{PKG_CONFIG_PATH}:${newPath})
endif()
endfunction()

if (";${DOOCS_FIND_COMPONENTS};" MATCHES ";server;")
list(APPEND DOOCS_FIND_COMPONENTS serverlib)
list(REMOVE_ITEM DOOCS_FIND_COMPONENTS server)
if(DOOCS_DIR)
DOOCS_addToPkgConfPath(${DOOCS_DIR}/pkgconfig)
endif()

set(DOOCS_FIND_COMPONENTS_DDAQ false)
if (";${DOOCS_FIND_COMPONENTS};" MATCHES ";ddaq;")
# This library seems not yet to come with a pkg-config module
list(REMOVE_ITEM DOOCS_FIND_COMPONENTS ddaq)
set(DOOCS_FIND_COMPONENTS_DDAQ true)
DOOCS_addToPkgConfPath(/export/doocs/lib/pkgconfig)
if (NOT DOOCS_FIND_QUIETLY)
message("FindDOOCS: Using PKG_CONFIG_PATH=$ENV{PKG_CONFIG_PATH}")
endif()

if (";${DOOCS_FIND_COMPONENTS};" MATCHES ";daqreader;")
list(APPEND DOOCS_FIND_COMPONENTS daqreaderlib)
list(REMOVE_ITEM DOOCS_FIND_COMPONENTS daqreader)
endif()

# For newer cmake versions, the following foreach() can be replaced by this:
# list(TRANSFORM DOOCS_FIND_COMPONENTS PREPEND "doocs-")
foreach(component ${DOOCS_FIND_COMPONENTS})
list(APPEND DOOCS_FIND_COMPONENTS_TRANSFORMED "doocs-${component}")
endforeach()
set(DOOCS_FIND_COMPONENTS ${DOOCS_FIND_COMPONENTS_TRANSFORMED})

include(FindPkgConfig)

if(DEFINED DOOCS_DIR)
set(ENV{PKG_CONFIG_PATH} $ENV{PKG_CONFIG_PATH}:${DOOCS_DIR}/pkgconfig)
# We add the always - required API component
if (NOT (";${DOOCS_FIND_COMPONENTS};" MATCHES ";api;"))
list(PREPEND DOOCS_FIND_COMPONENTS "api")
endif()
set(ENV{PKG_CONFIG_PATH} $ENV{PKG_CONFIG_PATH}:/export/doocs/lib/pkgconfig)
message("Using PKG_CONFIG_PATH=$ENV{PKG_CONFIG_PATH}")

# WORK AROUND FOR BROKEN DOOCS PKG CONFIG FILES: Search for libgul14 which is required by DOOCS libraries
list(APPEND DOOCS_FIND_COMPONENTS libgul14)
# END OF WORK AROUND

pkg_check_modules(DOOCS REQUIRED ${DOOCS_FIND_COMPONENTS})
function(expandDoocsComponentName longName shortName)
if (";${shortName};" MATCHES ";api;")
set(${longName} "doocs-doocsapi" PARENT_SCOPE)
elseif (";${shortName};" MATCHES ";zmq;")
set(${longName} "doocs-doocsdzmq" PARENT_SCOPE)
elseif (";${shortName};" MATCHES ";dapi;")
set(${longName} "doocs-doocsdapi" PARENT_SCOPE)
elseif (";${shortName};" MATCHES ";server;")
set(${longName} "doocs-serverlib" PARENT_SCOPE)
elseif (";${shortName};" MATCHES ";ddaq;")
set(${longName} "doocs-doocsddaq" PARENT_SCOPE)
elseif (";${shortName};" MATCHES ";daqreader;")
set(${longName} "doocs-daqreaderlib" PARENT_SCOPE)
elseif (";${shortName};" MATCHES ";daqsndlib;")
set(${longName} "doocs-daqsndlib" PARENT_SCOPE)
elseif (";${shortName};" MATCHES ";timinglib;")
# we define it as alias to doocs-doocsapi and check additional requirements
set(${longName} "doocs-doocsapi" PARENT_SCOPE)
else()
set(${longName} "${shortName}" PARENT_SCOPE)
endif()
endfunction()

string(REPLACE ";" " " DOOCS_CFLAGS "${DOOCS_CFLAGS}")
string(REPLACE ";" " " DOOCS_LDFLAGS "${DOOCS_LDFLAGS}")

include(FindPkgConfig)
# thread libraries are required by DOOCS but seem not to be added through pkgconfig...
find_package(Threads REQUIRED)

set(DOOCS_DIR "${DOOCS_doocs-doocsapi_LIBDIR}")
set(DOOCS_VERSION "${DOOCS_doocs-doocsapi_VERSION}")
# We expect that find_package will be called more than once, with different components.
# Since imported targets cannot be replaced, the only clean solution is to define an imported component per pkgconfig component.
# pkg_check_modules can be called more than once, with different components.
# We define DOOCS_FIND_COMPONENTS_ALL to collect all asked-for components
foreach(component ${DOOCS_FIND_COMPONENTS})
expandDoocsComponentName(componentLongName ${component})
if (NOT ";${DOOCS_FIND_COMPONENTS_ALL};" MATCHES ";${componentLongName};")
list(APPEND DOOCS_FIND_COMPONENTS_ALL ${componentLongName})
# IMPORTED_TARGET means also imported target PkgConfig::DOOCS will be defined. GLOBAL so we can alias.
pkg_check_modules(DOOCS_${component} REQUIRED IMPORTED_TARGET GLOBAL ${componentLongName})
if (DOOCS_${component}_FOUND)
set(importedTarget PkgConfig::DOOCS_${component})
if (NOT DOOCS_FIND_QUIETLY)
message(STATUS "FindDOOCS: imported target is ${importedTarget}. Defining alias DOOCS::${component}")
endif()
add_library(DOOCS::${component} ALIAS ${importedTarget})
set(DOOCS_LIBRARIES ${DOOCS_LIBRARIES} "DOOCS::${component}")

if (${component} STREQUAL "api")
# add Threads lib only if not yet in
get_target_property(doocsLinkLibs ${importedTarget} INTERFACE_LINK_LIBRARIES)
if (NOT (";${doocsLinkLibs};" MATCHES ";Threads::Threads;"))
set_target_properties(${importedTarget} PROPERTIES INTERFACE_LINK_LIBRARIES "${doocsLinkLibs};Threads::Threads" )
endif()
if(DOOCS_noAsNeededFlag)
get_target_property(doocsLinkFlags ${importedTarget} INTERFACE_LINK_OPTIONS)
string(REGEX REPLACE ".*-NOTFOUND" "" doocsLinkFlags "${doocsLinkFlags}")
set_target_properties(${importedTarget} PROPERTIES INTERFACE_LINK_OPTIONS "-Wl,--no-as-needed;${doocsLinkFlags}")
endif()
else()
# since we did some changes on DOOCS::api, add that as implicit dependency of the other components
# This makes sure projects not explicitly linking to DOOCS::api have the changes
get_target_property(doocsLinkLibs ${importedTarget} INTERFACE_LINK_LIBRARIES)
string(REGEX REPLACE ".*-NOTFOUND" "" doocsLinkLibs "${doocsLinkLibs}")
set_target_properties(${importedTarget} PROPERTIES INTERFACE_LINK_LIBRARIES "DOOCS::api;${doocsLinkLibs}")
endif()

# print some info about targets
get_target_property(doocsIncDirs ${importedTarget} INTERFACE_INCLUDE_DIRECTORIES)
message(VERBOSE " include dirs: ${doocsIncDirs}")
get_target_property(doocsCxxFlags ${importedTarget} INTERFACE_COMPILE_OPTIONS)
message(VERBOSE " compile options: ${doocsCxxFlags}")
get_target_property(doocsLinkFlags ${importedTarget} INTERFACE_LINK_OPTIONS)
message(VERBOSE " link options: ${doocsLinkFlags}")
get_target_property(doocsLinkLibs ${importedTarget} INTERFACE_LINK_LIBRARIES)
message(VERBOSE " link libs: ${doocsLinkLibs}")
get_target_property(doocsLinkDirs ${importedTarget} INTERFACE_LINK_DIRECTORIES)
message(VERBOSE " link dirs: ${doocsLinkDirs}")

else()
message(FATAL_ERROR "DOOCS component ${component} not found!")
endif()
endif()
if(${component} STREQUAL "timinglib")
# Find doocs/TimingWord.h from dev-doocs-doocstiminglib
# which unfortunately does not provide pkgconfig
find_path(DOOCS_timingLib_INCLUDE_DIRS doocs/TimingWord.h REQUIRED PATHS ${DOOCS_api_INCLUDE_DIRS})
if (NOT DOOCS_timingLib_INCLUDE_DIRS)
message(FATAL_ERROR "FindDOOCS: Failed to find TimingWord.h")
set(DOOCS_timingLib_FOUND FALSE)
else()
if (NOT DOOCS_FIND_QUIETLY)
message(STATUS "FindDOOCS: Found timinglib, include dirs: ${DOOCS_timingLib_INCLUDE_DIRS}")
endif()
set(DOOCS_timingLib_FOUND TRUE)
# include dir is always same as for api component, so alias is sufficient
add_library(DOOCS::${component} ALIAS PkgConfig::DOOCS_api)
endif()
endif()
endforeach()
#message(DEBUG "complete list of searched components: ${DOOCS_FIND_COMPONENTS_ALL}")

# append to list (arg) to space-separated list, only include not yet existing elements
macro(DOOCS_appendListToList list arg)
foreach(DOOCS_appendListToList_arg ${arg})
string(FIND " ${${list}} " " ${DOOCS_appendListToList_arg} " DOOCS_appendListToList_pos)
if (${DOOCS_appendListToList_pos} EQUAL -1)
string(APPEND ${list} " ${DOOCS_appendListToList_arg}")
# strip leading spaces since they might cause problems
string(REGEX REPLACE "^[ \t]+" "" ${list} "${${list}}")
endif()
endforeach()
endmacro()

# note, pkg_check_modules output variables <prefix>_VERSION and <prefix>_LIBDIR are different,
# depending on length of given module list!
set(DOOCS_DIR "${DOOCS_api_LIBDIR}")
set(DOOCS_VERSION "${DOOCS_api_VERSION}")

set(DOOCS_LIBRARIES ${DOOCS_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})

# following lines are compatibiliy layer, required only if using project does not make use of imported targets
# here we should gather from all components
set(DOOCS_CFLAGS "")
set(DOOCS_LDFLAGS "")
if(DOOCS_noAsNeededFlag)
set(DOOCS_LDFLAGS "-Wl,--no-as-needed")
endif()
set(DOOCS_INCLUDE_DIRS "")
set(DOOCS_LIBRARY_DIRS "")
foreach(component api zmq server ddaq daqreader daqsndlib)
DOOCS_appendListToList(DOOCS_CFLAGS "${DOOCS_${component}_CFLAGS}")
DOOCS_appendListToList(DOOCS_LDFLAGS "${DOOCS_${component}_LDFLAGS}")
DOOCS_appendListToList(DOOCS_INCLUDE_DIRS "${DOOCS_${component}_INCLUDE_DIRS}")
DOOCS_appendListToList(DOOCS_LIBRARY_DIRS "${DOOCS_${component}_LIBRARY_DIRS}")
endforeach()
set(DOOCS_CXX_FLAGS ${DOOCS_CFLAGS})
set(DOOCS_LIBRARIES ${DOOCS_LDFLAGS} ${CMAKE_THREAD_LIBS_INIT} tinemt)
set(DOOCS_LINKER_FLAGS "-Wl,--no-as-needed")
set(DOOCS_LINKER_FLAGS ${DOOCS_LDFLAGS})
set(DOOCS_LINK_FLAGS ${DOOCS_LINKER_FLAGS})

set(COMPONENT_DIRS "")
if(DOOCS_FIND_COMPONENTS_DDAQ)
message("Searching for libDOOCSddaq.so")
FIND_PATH(DOOCS_DIR_ddaq libDOOCSddaq.so
${DOOCS_DIR}
)
set(DOOCS_LIBRARIES ${DOOCS_LIBRARIES} DOOCSddaq timinginfo daqevstat DAQFSM TTF2XML xerces-c BM TTF2evutl DAQsvrutil)
set(COMPONENT_DIRS ${COMPONENT_DIRS} DOOCS_DIR_ddaq)
endif()

# use a macro provided by CMake to check if all the listed arguments are valid and set DOOCS_FOUND accordingly
include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(DOOCS REQUIRED_VARS DOOCS_DIR ${COMPONENT_DIRS} VERSION_VAR DOOCS_VERSION )

FIND_PACKAGE_HANDLE_STANDARD_ARGS(DOOCS REQUIRED_VARS DOOCS_DIR VERSION_VAR DOOCS_VERSION )
9 changes: 7 additions & 2 deletions cmake/Modules/FindGccAtomic.cmake
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# This scripts finds gcc's built-in atomic shared library (libatomic.so).
# It is required to link against this library on gcc when using 16 byte atomics, even when running on x86_64/amd64.

FIND_LIBRARY(GCCLIBATOMIC_LIBRARY NAMES atomic atomic.so.1 libatomic.so.1
FIND_LIBRARY(GccAtomic_LIBRARY NAMES atomic atomic.so.1 libatomic.so.1
HINTS
$ENV{HOME}/local/lib64
$ENV{HOME}/local/lib
Expand All @@ -15,5 +15,10 @@ FIND_LIBRARY(GCCLIBATOMIC_LIBRARY NAMES atomic atomic.so.1 libatomic.so.1
/lib
)

# we don't want to export the full path since this introduces problems with yocto cross-compilation
# so replace by simple lib name
if (GccAtomic_LIBRARY)
set(GccAtomic_LIBRARY "atomic")
endif()
include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(GCCLIBATOMIC DEFAULT_MSG GCCLIBATOMIC_LIBRARY)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(GccAtomic DEFAULT_MSG GccAtomic_LIBRARY)
91 changes: 65 additions & 26 deletions cmake/PROJECT_NAMEConfig.cmake.in.in
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,14 @@
# @PROJECT_NAME@_CXX_FLAGS : additional C++ compiler flags
# @PROJECT_NAME@_LINKER_FLAGS : additional linker flags
#
# Note for exporting project:
# If @PROJECT_NAME@ sets PROVIDES_EXPORTED_TARGETS, we also generate target EXPORTS. In this case the its CMakeLists.txt
# must also have
# install(TARGETS EXPORT ${PROJECT_NAME}Targets)
# before. The target will be named ChimeraTK::${PROJECT_NAME} .
# We keep above mentioned return variables for compatibility, but finally, when all projects use imported targets,
# all execept _FOUND and _VERSION will be superfluous.
#
# @author Martin Killenberg, DESY
#
#######################################################################################################################
Expand All @@ -27,42 +35,73 @@
#
#######################################################################################################################

# The library itself must be "searched" using the FIND_LIBRARY command in the known install directory, to set
# the variable properly
FIND_LIBRARY(@PROJECT_NAME@_LIBRARY @PROJECT_NAME@
@CMAKE_INSTALL_PREFIX@/lib
NO_DEFAULT_PATH
)
# In case of packages with components, loading dependencies can cause trouble if required component list are differ.
# E.g. if Boost is required from the project, and also required from the dependency, but with less components,
# and the dependency is resolved later, then Boost_LIBRARIES content will be different than expected.
# To protect against this, save state and restore it later.
# Since imported targets are never unloaded, the loaded dependency should still work.
set(Boost_LIBRARIES_savedState_@PROJECT_NAME@ ${Boost_LIBRARIES})

# this code loads public dependencies
@@PROJECT_NAME@_PUBLIC_DEPENDENCIES_L@
set(Boost_LIBRARIES ${Boost_LIBRARIES_savedState_@PROJECT_NAME@})

# Since this file is already part of the installation to be found, the configuration can be hard-coded at
# installation time
set(@PROJECT_NAME@_VERSION "@@PROJECT_NAME@_SOVERSION@")
set(@PROJECT_NAME@_INCLUDE_DIRS @@PROJECT_NAME@_INCLUDE_DIRS@)
set(@PROJECT_NAME@_LIBRARY_DIRS @@PROJECT_NAME@_LIBRARY_DIRS@)
if(@@PROJECT_NAME@_HAS_LIBRARY@)
set(@PROJECT_NAME@_LIBRARIES ${@PROJECT_NAME@_LIBRARY} @@PROJECT_NAME@_LIBRARIES@)
else()
set(@PROJECT_NAME@_LIBRARIES @@PROJECT_NAME@_LIBRARIES@)
endif()
set(@PROJECT_NAME@_CXX_FLAGS "@@PROJECT_NAME@_CXX_FLAGS@")
set(@PROJECT_NAME@_LINKER_FLAGS "@@PROJECT_NAME@_LINKER_FLAGS@ @@PROJECT_NAME@_LINK_FLAGS@")
set(@PROJECT_NAME@_LINK_FLAGS "@@PROJECT_NAME@_LINKER_FLAGS@ @@PROJECT_NAME@_LINK_FLAGS@")
set(@PROJECT_NAME@_PREFIX "@CMAKE_INSTALL_PREFIX@")

# Use a macro provided by CMake to check if all the listed arguments are valid and set @PROJECT_NAME@_FOUND accordingly.
# This is mainly important to check the version.
set(@PROJECT_NAME@_FOUND 0)
include(FindPackageHandleStandardArgs)

# The FOUND_VAR option in FIND_PACKAGE_HANDLE_STANDARD_ARGS was introduced in cmake-2.8.11, but Ubuntu 12.04 has cmake-2.8.7 only.
# Thus we use a work around here for older cmake versions.
if("${CMAKE_VERSION}" VERSION_LESS 2.8.11)
# The old version always provides a variable with upper case project name, so we just copy that
FIND_PACKAGE_HANDLE_STANDARD_ARGS(@PROJECT_NAME@ REQUIRED_VARS @PROJECT_NAME@_PREFIX VERSION_VAR @PROJECT_NAME@_VERSION)
STRING(TOUPPER "@PROJECT_NAME@" PROJECT_NAME_UPPERCASE)
set(@PROJECT_NAME@_FOUND ${${PROJECT_NAME_UPPERCASE}_FOUND})
FIND_PACKAGE_HANDLE_STANDARD_ARGS(@PROJECT_NAME@ REQUIRED_VARS @PROJECT_NAME@_PREFIX VERSION_VAR @PROJECT_NAME@_VERSION FOUND_VAR @PROJECT_NAME@_FOUND)

# switch for exported target. We don't do this automatically, because the calling CMakeLists.txt
# first must be edited so that it properly defines PUBLIC set of compile and link options
if(@PROVIDES_EXPORTED_TARGETS@)

@PACKAGE_INIT@

# include cmake's auto-generated exports file
include("${CMAKE_CURRENT_LIST_DIR}/@[email protected]")
# this will set ${PROJECT_NAME}_FOUND if required components are missing
check_required_components(@PROJECT_NAME@)

else()
FIND_PACKAGE_HANDLE_STANDARD_ARGS(@PROJECT_NAME@ REQUIRED_VARS @PROJECT_NAME@_PREFIX VERSION_VAR @PROJECT_NAME@_VERSION FOUND_VAR @PROJECT_NAME@_FOUND)
endif()
if(@@PROJECT_NAME@_HAS_LIBRARY@)
# has true compiled library as output
# The library itself must be "searched" using the FIND_LIBRARY command in the known install directory, to set
# the variable properly
FIND_LIBRARY(@PROJECT_NAME@_LIBRARY @PROJECT_NAME@
@CMAKE_INSTALL_PREFIX@/lib
NO_DEFAULT_PATH
)
if(NOT @PROJECT_NAME@_LIBRARY)
set(@PROJECT_NAME@_FOUND FALSE)
message(SEND_ERROR "FIND_LIBRARY returned error: ${@PROJECT_NAME@_LIBRARY}")
else()
# prepend it to lib list
set(@PROJECT_NAME@_LIBRARIES ${@PROJECT_NAME@_LIBRARY} ${@PROJECT_NAME@_LIBRARIES})
endif()
endif()
endif()

# Compatibility layer definitions.
# The following variables are generated automatically for projects supporting cmake-exports.
# Otherwise, values must be provided as inputs to create_cmake_config_files.
# The types of generated lists are precisely as in old DeviceAccess config
# inc dirs, lib dirs, libs are ";" separated
# cxx flags, link flags are " " separated
# ";" separated
set(@PROJECT_NAME@_INCLUDE_DIRS @@PROJECT_NAME@_INCLUDE_DIRS@)
# ";" separated
set(@PROJECT_NAME@_LIBRARY_DIRS @@PROJECT_NAME@_LIBRARY_DIRS@)
# ";" separated
set(@PROJECT_NAME@_LIBRARIES ${@PROJECT_NAME@_LIBRARIES} @@PROJECT_NAME@_LIBRARIES@)
# " " separated
set(@PROJECT_NAME@_CXX_FLAGS "@@PROJECT_NAME@_CXX_FLAGS@")
# " " separated
set(@PROJECT_NAME@_LINKER_FLAGS "@@PROJECT_NAME@_LINKER_FLAGS@ @@PROJECT_NAME@_LINK_FLAGS@")
# " " separated
set(@PROJECT_NAME@_LINK_FLAGS "@@PROJECT_NAME@_LINKER_FLAGS@ @@PROJECT_NAME@_LINK_FLAGS@")
Loading

0 comments on commit 219a2ea

Please sign in to comment.