Newer
Older
dd4hep_make_unique_list( pkg_incs VALUES ${LOCAL_INCLUDE_DIRS} ${ARG_INCLUDE_DIRS} )
dd4hep_make_unique_list( pkg_libs VALUES ${LOCAL_LINK_LIBRARIES} ${ARG_LINK_LIBRARIES} )
dd4hep_make_unique_list( pkg_defs VALUES ${LOCAL_DEFINITIONS} ${ARG_DEFINITIONS} )
file ( GLOB sources ${ARG_SOURCES} )
list ( APPEND sources ${optional_sources} )
if ( NOT "${ARG_GENERATED}" STREQUAL "" )
#
# root-cint produces warnings of type 'unused-function' disable them on generated files
foreach ( f in ${ARG_GENERATED} )
Marko Petric
committed
set_source_files_properties( ${f} PROPERTIES COMPILE_FLAGS "-Wno-unused-function -Wno-overlength-strings" GENERATED TRUE )
endforeach()
list ( APPEND sources ${ARG_GENERATED} )
#
if ( NOT "${sources}" STREQUAL "" )
dd4hep_make_unique_list ( sources VALUES ${sources} )
dd4hep_debug( "${tag} ${sources}")
#
dd4hep_include_directories( "${pkg_incs}" )
add_definitions ( ${pkg_defs} )
#
add_library ( ${binary} SHARED ${sources} )
target_link_libraries ( ${binary} ${pkg_libs} )
if ( "${${pkg}_VERSION}" STREQUAL "" OR "${${pkg}_SOVERSION}" STREQUAL "" )
dd4hep_fatal ( "BAD Package versions: VERSION[${pkg}_VERSION] ${${pkg}_VERSION} SOVERSION[${pkg}_SOVERSION] ${${pkg}_SOVERSION} " )
##dd4hep_print ( "set_target_properties ( ${binary} PROPERTIES VERSION ${${pkg}_VERSION} SOVERSION ${${pkg}_SOVERSION})")
set_target_properties ( ${binary} PROPERTIES VERSION ${${pkg}_VERSION} SOVERSION ${${pkg}_SOVERSION})
#
if ( NOT ${ARG_NOINSTALL} )
install ( TARGETS ${binary}
LIBRARY DESTINATION lib
RUNTIME DESTINATION bin)
endif()
dd4hep_print ( "|++> ${tag} Skipped. No sources to be compiled [Use constraint]" )
endif()
endif()
set ( ${building} ${building_binary} PARENT_SCOPE )
endfunction(dd4hep_add_library)
#---------------------------------------------------------------------------------------------------
# dd4hep_add_regular_library
#
# Arguments -> See function dd4hep_add_library
#
# \author M.Frank
# \version 1.0
#
#---------------------------------------------------------------------------------------------------
function( dd4hep_add_regular_library library )
dd4hep_package_properties( pkg PKG enabled )
set ( tag "Package library[${pkg}] -> ${library}" )
dd4hep_skipmsg ( "${tag} DISBALED -- package is not built!" )
else()
dd4hep_add_library( ${library} building ${ARGN} PRINT ${tag} )
dd4hep_debug ( "add_package_library -> ${library} ${PKG}_LIBRARIES:${pkg_libs}" )
else()
dd4hep_fatal ( "Package library[${pkg}] -> ${binary} Cannot be built! This is an ERROR condition." )
endif()
endif()
endfunction(dd4hep_add_regular_library)
#---------------------------------------------------------------------------------------------------
# dd4hep_add_package_library
#
# Package libraries are automatically added to the package's link libraries.
# Package plugins and plugins depending on a package automically link against
# these libraries.
#
# Arguments -> See function dd4hep_add_library
#
# \author M.Frank
# \version 1.0
#
#---------------------------------------------------------------------------------------------------
function( dd4hep_add_package_library library )
dd4hep_package_properties( pkg PKG enabled )
set ( tag "Package library[${pkg}] -> ${library}" )
dd4hep_skipmsg ( "${tag} DISBALED -- package is not built!" )
dd4hep_add_library( ${library} building ${ARGN} PRINT ${tag} )
get_property(pkg_libs GLOBAL PROPERTY PROPERTY ${PKG}_LIBRARIES )
dd4hep_make_unique_list ( pkg_libs VALUES ${pkg_libs} ${library} )
set_property(GLOBAL PROPERTY ${PKG}_LIBRARIES ${pkg_libs} )
# Test and print if correct
get_property(pkg_libs GLOBAL PROPERTY PROPERTY ${PKG}_LIBRARIES )
dd4hep_debug ( "add_package_library -> ${library} ${PKG}_LIBRARIES:${pkg_libs}" )
else()
dd4hep_fatal ( "Package library[${pkg}] -> ${binary} Cannot be built! This is an ERROR condition." )
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
endif()
endfunction(dd4hep_add_package_library)
#---------------------------------------------------------------------------------------------------
#
# dd4hep_add_plugin
#
# Arguments
# ---------
# binary -> plugin name
# SOURCES -> list of source files. Will be expanded to absolute names
#
# The following variables EXTEND the package defaults
# INCLUDE_DIRS -> Additional include directories need to compile the binary
# LINK_LIBRARIES -> Additional libraries needed to link the binary
# USES -> Required package dependencies
# OPTIONAL -> Optional package dependency
# if required e.g. [LCIO REQUIRED SOURCES aaa.cpp] the plugin will NOT be built
# else e.g. [LCIO SOURCES aaa.cpp] the plugin will be built, but
# the source files will be omitted.
# DEFINITIONS -> Optional compiler definitions to compile the sources
#
# \author M.Frank
# \version 1.0
#
#---------------------------------------------------------------------------------------------------
function( dd4hep_add_plugin binary )
dd4hep_package_properties( pkg PKG enabled )
set ( tag "Plugin[${pkg}] -> ${binary}" )
dd4hep_skipmsg ( "${tag} DISBALED -- package is not built!" )
cmake_parse_arguments(ARG "NOINSTALL" "" "SOURCES;GENERATED;LINK_LIBRARIES;INCLUDE_DIRS;USES;OPTIONAL;DEFINITIONS" ${ARGN})
if ( ${ARG_NOINSTALL} )
set(NOINSTALL NOINSTALL)
endif()
get_property(pkg_lib GLOBAL PROPERTY ${PKG}_LIBRARIES )
dd4hep_add_library( ${binary} building
PRINT ${tag}
SOURCES ${ARG_SOURCES}
GENERATED ${ARG_GENERATED}
LINK_LIBRARIES ${ARG_LINK_LIBRARIES} ${pkg_lib}
INCLUDE_DIRS ${ARG_INCLUDE_DIRS}
USES ${ARG_USES}
OPTIONAL "${ARG_OPTIONAL}"
DEFINITIONS ${ARG_DEFINITIONS}
${NOINSTALL}
)
#
# Generate ROOTMAP if the plugin will be built:
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
endif()
endfunction(dd4hep_add_plugin)
#---------------------------------------------------------------------------------------------------
# dd4hep_add_executable
#
# Arguments
# ---------
# binary -> plugin name
# SOURCES -> list of source files. Will be expanded to absolute names
#
# The following variables EXTEND the package defaults
# INCLUDE_DIRS -> Additional include directories need to compile the binary
# LINK_LIBRARIES -> Additional libraries needed to link the binary
# USES -> Required package dependencies
# OPTIONAL -> Optional package dependency
# if required e.g. [LCIO REQUIRED SOURCES aaa.cpp] the plugin will NOT be built
# else e.g. [LCIO SOURCES aaa.cpp] the plugin will be built, but
# the source files will be omitted.
# DEFINITIONS -> Optional compiler definitions to compile the sources
#
# \author M.Frank
# \version 1.0
#
#---------------------------------------------------------------------------------------------------
function ( dd4hep_add_executable binary )
Markus Frank
committed
#set ( DD4HEP_DEBUG_CMAKE "ON" )
set ( tag "Executable[${pkg}] -> ${binary}" )
dd4hep_skipmsg ( "${tag} DISBALED -- package is not built!" )
cmake_parse_arguments ( ARG "" "" "SOURCES;GENERATED;LINK_LIBRARIES;INCLUDE_DIRS;USES;OPTIONAL" ${ARGN})
dd4hep_debug( "+------------------------------------------- <<<< EXECUTABLE ${pkg}:${binary} >>>> Version: ${${pkg}_VERSION}" )
if ( NOT "${ARG_OPTIONAL}" STREQUAL "" )
dd4hep_handle_optional_sources ( ${tag} "${ARG_OPTIONAL}" optional_missing optional_uses optional_sources )
endif()
#
if ( NOT "${optional_missing}" STREQUAL "" )
dd4hep_print ( "|++> ${tag} SKIPPED. Missing optional dependencies: ${optional_missing}" )
else()
set ( uses ${ARG_USES} ${optional_uses} )
dd4hep_use_package ( ${tag} PACKAGE LOCAL
USES "${uses}"
OPTIONAL "${ARG_OPTIONAL}" )
if ( "${LOCAL_MISSING}" STREQUAL "" )
dd4hep_debug ( "${tag} Executable uses: ${ARG_USES} -- ${uses}" )
dd4hep_debug ( "${tag} Executable optional: ${ARG_OPTIONAL}" )
#
get_property ( pkg_library GLOBAL PROPERTY ${PKG}_LIBRARIES )
#
# Sources may also be supplied without argument tag:
if( "${ARG_SOURCES}" STREQUAL "")
set ( ARG_SOURCES ${ARG_UNPARSED_ARGUMENTS} )
endif()
# Prepare flags for cint generated sources:
foreach ( f in ${ARG_GENERATED} )
Marko Petric
committed
set_source_files_properties( ${f} PROPERTIES COMPILE_FLAGS "-Wno-unused-function -Wno-overlength-strings" GENERATED TRUE )
set ( sources ${ARG_GENERATED} ${ARG_SOURCES} ${optional_sources} )
if( NOT "${sources}" STREQUAL "")
set (incs ${LOCAL_INCLUDE_DIRS} ${ARG_INCLUDE_DIRS} )
set (libs ${pkg_library} ${LOCAL_LINK_LIBRARIES} ${ARG_LINK_LIBRARIES} )
dd4hep_make_unique_list ( incs VALUES ${incs} )
dd4hep_make_unique_list ( libs VALUES ${libs} )
dd4hep_make_unique_list ( sources VALUES ${sources} )
#
dd4hep_debug ( "${tag} Libs:${libs}" )
dd4hep_include_directories( "${incs}" )
add_executable( ${binary} ${sources} )
target_link_libraries( ${binary} ${libs} )
#
# Install the binary to the destination directory
install(TARGETS ${binary}
LIBRARY DESTINATION lib
RUNTIME DESTINATION bin )
else()
dd4hep_print ( "|++> ${tag} SKIPPED. No sources to build [Use constraint]" )
dd4hep_fatal ( "${tag} SKIPPED. Missing dependencies: ${LOCAL_MISSING}" )
endif()
endif()
endif()
endfunction(dd4hep_add_executable)
#---------------------------------------------------------------------------------------------------
# dd4hep_add_dictionary
#
#
# \author M.Frank
# \version 1.0
#
#---------------------------------------------------------------------------------------------------
function( dd4hep_add_dictionary dictionary )
set ( tag "Dictionary[${pkg}] -> ${dictionary}" )
dd4hep_skipmsg ( "${tag} DISBALED -- package is not built!" )
cmake_parse_arguments(ARG "" "" "SOURCES;EXCLUDE;LINKDEF;OPTIONS;OPTIONAL;INCLUDES;OUTPUT" ${ARGN} )
dd4hep_print ( "|++> ${tag} Building dictionary ..." )
if("${ARG_LINKDEF}" STREQUAL "")
set(ARG_LINKDEF "${CMAKE_SOURCE_DIR}/DDCore/include/ROOT/LinkDef.h")
endif()
#
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
if ( NOT "${ARG_OPTIONAL}" STREQUAL "" )
dd4hep_handle_optional_sources ( ${tag} "${ARG_OPTIONAL}" optional_missing optional_uses optional_sources )
endif()
#
if ( NOT "${optional_missing}" STREQUAL "" )
dd4hep_print ( "|++> ${tag} SKIPPED. Missing optional dependencies: ${optional_missing}" )
else()
set ( uses ${ARG_USES} ${optional_uses} )
dd4hep_use_package ( ${tag} PACKAGE LOCAL
USES "${uses}"
OPTIONAL "${ARG_OPTIONAL}" )
endif()
if ( NOT "${LOCAL_MISSING}" STREQUAL "" )
dd4hep_print ( "|++> ${tag} skipped. Missing dependency: ${missing} --> FATAL ERROR. Build should fail!" )
endif()
#
get_property(incs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY PACKAGE_INCLUDE_DIRS)
get_property(defs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY COMPILE_DEFINITIONS)
get_property(opts DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY COMPILE_OPTIONS)
dd4hep_make_unique_list( incs VALUES ${LOCAL_INCLUDE_DIRS} ${incs} )
dd4hep_make_unique_list( defs VALUES ${LOCAL_DEFINITIONS} ${defs} )
#
file( GLOB headers ${ARG_SOURCES} )
file( GLOB excl_headers ${ARG_EXCLUDE} )
foreach( f ${excl_headers} )
list( REMOVE_ITEM headers ${f} )
endforeach()
#
set ( inc_dirs -I${CMAKE_CURRENT_SOURCE_DIR}/include )
foreach ( inc ${ARG_INCLUDES} )
set ( inc_dirs ${inc_dirs} -I${inc} )
endforeach()
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
foreach ( inc ${incs} )
file ( GLOB inc ${inc} )
set ( inc_dirs ${inc_dirs} -I${inc} )
endforeach()
#
file ( GLOB linkdefs ${ARG_LINKDEF} )
#
set ( comp_defs )
foreach ( def ${defs} )
set ( comp_defs ${comp_defs} -D${def} )
endforeach()
#
dd4hep_make_unique_list ( sources VALUES ${headers} )
dd4hep_make_unique_list ( linkdefs VALUES ${linkdefs} )
dd4hep_make_unique_list ( inc_dirs VALUES ${inc_dirs} )
dd4hep_make_unique_list ( comp_defs VALUES ${comp_defs} )
#
dd4hep_debug ( "${tag} Linkdef: '${linkdefs}'" )
dd4hep_debug ( "${tag} Compile: '${comp_defs};${inc_dirs}'" )
dd4hep_debug ( "${tag} Files: '${headers}'" )
dd4hep_debug ( "${tag} Unparsed:'${ARG_UNPARSED_ARGUMENTS}'" )
dd4hep_debug ( "${tag} Sources: '${CMAKE_CURRENT_SOURCE_DIR}'" )
#
set ( output_dir ${CMAKE_CURRENT_BINARY_DIR}/../lib )
if ( NOT "${ARG_OUTPUT}" STREQUAL "" )
set ( output_dir ${ARG_OUTPUT} )
endif()
Marko Petric
committed
add_custom_command(OUTPUT ${dictionary}.cxx
COMMAND ${ROOT_rootcling_CMD} -cint -f ${dictionary}.cxx
-s ${output_dir}/${dictionary} -inlineInputHeader -c -p ${ARG_OPTIONS} ${comp_defs} -std=c++${CMAKE_CXX_STANDARD} ${inc_dirs} ${headers} ${linkdefs}
Marko Petric
committed
DEPENDS ${headers} ${linkdefs} )
# Install the binary to the destination directory
install(FILES ${output_dir}/${dictionary}_rdict.pcm DESTINATION lib)
endfunction()
#---------------------------------------------------------------------------------------------------
#
# \author M.Frank
# \version 1.0
#
#---------------------------------------------------------------------------------------------------
macro( dd4hep_enable_tests )
cmake_parse_arguments(MACRO_ARG "" "" "" ${ARGV} )
if (BUILD_TESTING)
set ( BUILDNAME "${CMAKE_SYSTEM}-${CMAKE_CXX_COMPILER}-${CMAKE_BUILD_TYPE}" CACHE STRING "set build string for cdash")
dd4hep_list_to_string( _dir_entries PREFIX "DIRS:" ENTRIES ${MACRO_ARG_UNPARSED_ARGUMENTS} )
dd4hep_print ( "|++> Enable CTest environment....BUILD:${BUILD_TESTING} ${_dir_entries}" )
include(CTest)
enable_testing ()
if ( NOT "${MACRO_ARG_UNPARSED_ARGUMENTS}" STREQUAL "" )
foreach ( _dir ${MACRO_ARG_UNPARSED_ARGUMENTS} )
add_subdirectory ( ${_dir} )
endforeach()
endif()
endif()
endmacro( dd4hep_enable_tests )
#---------------------------------------------------------------------------------------------------
macro ( dd4hep_configure_scripts _pkg )
cmake_parse_arguments(MACRO_ARG "DEFAULT_SETUP;WITH_TESTS" "RUN_SCRIPT" "" ${ARGV} )
# PackageName is a variable required by existing LC build scripts.
# Set it here and unset it at the end of the scope...
set( PackageName ${_pkg} )
dd4hep_list_to_string( _dir_entries PREFIX "DIRS:" ENTRIES ${MACRO_ARG_UNPARSED_ARGUMENTS} )
dd4hep_print ( "|++> Setting up test environment for ${PackageName}: Testing:${BUILD_TESTING} Setup:${MACRO_ARG_DEFAULT_SETUP} With Tests(${MACRO_ARG_WITH_TESTS}): ${_dir_entries}" )
if ( (NOT "${MACRO_ARG_DEFAULT_SETUP}" STREQUAL "") OR (NOT "${_pkg}" STREQUAL "") )
configure_file( ${DD4hep_DIR}/cmake/run_test_package.sh ${EXECUTABLE_OUTPUT_PATH}/run_test_${_pkg}.sh @ONLY)
INSTALL(PROGRAMS ${EXECUTABLE_OUTPUT_PATH}/run_test_${_pkg}.sh DESTINATION bin )
#---- configure run environment ---------------
configure_file( ${DD4hep_DIR}/cmake/thisdd4hep_package.sh.in ${EXECUTABLE_OUTPUT_PATH}/this${_pkg}.sh @ONLY)
install(PROGRAMS ${EXECUTABLE_OUTPUT_PATH}/this${_pkg}.sh DESTINATION bin )
#--- install target-------------------------------------
if ( IS_DIRECTORY scripts )
dd4hep_install_dir ( compact scripts DESTINATION examples/${_pkg} )
endif()
if ( IS_DIRECTORY compact )
dd4hep_install_dir ( compact DESTINATION examples/${_pkg} )
endif()
endif()
dd4hep_enable_tests ( ${MACRO_ARG_UPARSED_ARGUMENTS} )
unset( PackageName )
endmacro( dd4hep_configure_scripts )
#---------------------------------------------------------------------------------------------------
# dd4hep_add_test_reg
#
# Add test with regular expression output parsing.
# BUILD_EXEC: Add and build executable with the same name as the test (Default NONE)
# OUTPUT Output file of the test (Default: empty)
# COMMAND Command to execute
# EXEC_ARGS Arguments to the command
# REGEX_PASS Regular expression to indicate that the test succeeded
# REGEX_FAIL Regular expression to indicate that the test failed
#
# \author M.Frank
# \version 1.0
#
#---------------------------------------------------------------------------------------------------
function ( dd4hep_add_test_reg test_name )
cmake_parse_arguments(ARG "BUILD_EXEC" "OUTPUT" "COMMAND;DEPENDS;EXEC_ARGS;REGEX_PASS;REGEX_PASSED;REGEX_FAIL;REGEX_FAILED;REQUIRES" ${ARGN} )
#foreach(opt ${ARG_REQUIRES} )
# dd4hep_unpack_package_opts ( USE ${opt} )
# dd4hep_find_package( ${USE_NAME} pkg_found
# ARGS ${USE_REQUIRED} ${USE_COMPONENT} ${USE_COMPONENTS}
# TYPE ${USE_TYPE} )
# set( missing ${missing} ${USE_NAME} )
# unset ( use_test )
# endif()
#endforeach()
dd4hep_print ( "*** Will not build/execute test ${test_name}. Missing dependencies: ${missing} ")
#dd4hep_print ( "Building executable: ${test_name} SOURCES src/${test_name}.cc")
dd4hep_add_executable ( ${test_name} SOURCES src/${test_name}.cc )
endif()
set ( cmd ${ARG_COMMAND} )
if ( "${cmd}" STREQUAL "" )
set ( cmd ${CMAKE_INSTALL_PREFIX}/bin/run_test.sh ${test_name} )
endif()
set ( passed ${ARG_REGEX_PASS} ${ARG_REGEX_PASSED} )
if ( "${passed}" STREQUAL "NONE" )
unset ( passed )
elseif ( "${passed}" STREQUAL "" )
set ( passed "TEST_PASSED" )
endif()
set ( failed ${ARG_REGEX_FAIL} ${ARG_REGEX_FAILED} )
if ( "${failed}" STREQUAL "NONE" )
unset ( failed )
endif()
set ( output ${ARG_OUTPUT} )
set ( args ${ARG_EXEC_ARGS} )
if ( "${args}" STREQUAL "" )
set ( args ${test_name} )
endif()
add_test(NAME t_${test_name} COMMAND ${cmd} ${output} ${args} ${output} )
if ( NOT "${passed}" STREQUAL "" )
set_tests_properties( t_${test_name} PROPERTIES PASS_REGULAR_EXPRESSION "${passed}" )
endif()
if ( NOT "${failed}" STREQUAL "" )
set_tests_properties( t_${test_name} PROPERTIES FAIL_REGULAR_EXPRESSION "${failed}" )
endif()
# Set test dependencies if present
foreach ( _dep ${ARG_DEPENDS} )
set_tests_properties( t_${test_name} PROPERTIES DEPENDS t_${_dep} )
endforeach()
endif()
endfunction()
#---------------------------------------------------------------------------------------------------
# fill_dd4hep_library_path
#
#
# \author M.Petric
# \version 1.0
#
#---------------------------------------------------------------------------------------------------
function ( fill_dd4hep_library_path )
string(REGEX REPLACE "/lib/libCore.*" "" ROOT_ROOT ${ROOT_Core_LIBRARY})
SET( ENV{DD4HEP_LIBRARY_PATH} ${ROOT_ROOT}/lib:${Boost_LIBRARY_DIRS} )
if ( ${DD4HEP_USE_GEANT4} )
string(REGEX REPLACE "/lib/Geant4.*" "" Geant4_ROOT ${Geant4_DIR})
SET( ENV{DD4HEP_LIBRARY_PATH} ${Geant4_ROOT}/lib:$ENV{DD4HEP_LIBRARY_PATH} )
endif()
if(${DD4HEP_USE_LCIO})
SET( ENV{DD4HEP_LIBRARY_PATH} ${LCIO_DIR}/lib:$ENV{DD4HEP_LIBRARY_PATH} )
endif()
SET( ENV{DD4HEP_LIBRARY_PATH} ${CLHEP_ROOT_DIR}/lib:$ENV{DD4HEP_LIBRARY_PATH} )
if(${DD4HEP_USE_XERCESC})
SET( ENV{DD4HEP_LIBRARY_PATH} ${XERCESC_ROOT_DIR}/lib:$ENV{DD4HEP_LIBRARY_PATH} )
endif()
SET( ENV{DD4HEP_LIBRARY_PATH} ${CMAKE_BINARY_DIR}/lib:$ENV{DD4HEP_LIBRARY_PATH} )
endfunction()