diff --git a/CMakeLists.txt b/CMakeLists.txt index c4aee1515735da28af650216815659f4e23c4627..2a53905be555fc8d74d3a4ba5511c63a037731e1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,11 +36,15 @@ if(HCANA_BUILTIN_PODD) ) include(PoddCMakeEnv) else() + set(CMAKE_MODULE_PATH + ${PROJECT_SOURCE_DIR}/podd/cmake/Modules + ${CMAKE_MODULE_PATH} + ) # Find Podd and register it as a dependency # This will also automatically set up ROOT find_package(Podd 2.0 REQUIRED) - #include(PoddCMakeEnv) - #config_add_dependency(Podd 2.0) + include(PoddCMakeEnv) + config_add_dependency(Podd 2.0) endif() # Register ROOT dependency - it's in our public interface diff --git a/cmake/modules/PoddCMakeEnv.cmake b/cmake/modules/PoddCMakeEnv.cmake new file mode 100644 index 0000000000000000000000000000000000000000..b0a73fea79cc6be7251968fdf20b6b7eedc4d646 --- /dev/null +++ b/cmake/modules/PoddCMakeEnv.cmake @@ -0,0 +1,278 @@ +# CMake settings and utility functions for Podd projects + +include(CheckCXXCompilerFlag) + +#---------------------------------------------------------------------------- +# Set default build type to RelWithDebInfo +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Build type" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Release" "RelWithDebInfo" "MinSizeRel") +endif() + +#---------------------------------------------------------------------------- +# Build options +option(WITH_DEBUG "Enable support for detailed debug messages" ON) + +#---------------------------------------------------------------------------- +# Project-specific build flags +if(${CMAKE_SYSTEM_NAME} MATCHES Darwin) + set(CMAKE_SHARED_LINKER_FLAGS + "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-undefined,dynamic_lookup") + list(REMOVE_DUPLICATES CMAKE_SHARED_LINKER_FLAGS) +endif() + +#---------------------------------------------------------------------------- +# Useful shorthands +string(TOLOWER ${PROJECT_NAME} PROJECT_NAME_LC) +string(TOUPPER ${PROJECT_NAME} PROJECT_NAME_UC) +if("${CMAKE_PROJECT_NAME}" STREQUAL "${PROJECT_NAME}") + set(MAIN_PROJECT_NAME ${PROJECT_NAME}) + string(TOLOWER ${PROJECT_NAME} MAIN_PROJECT_NAME_LC) +endif() +if(NOT PROJECT_VERSION_PATCH) + set(PROJECT_VERSION_PATCH 0) +endif() +if(NOT PROJECT_VERSION_MINOR) + set(PROJECT_VERSION_MINOR 0) +endif() +if(NOT PROJECT_VERSION_MAJOR) + set(PROJECT_VERSION_MAJOR 0) +endif() +math(EXPR ${PROJECT_NAME_UC}_VERCODE + "${PROJECT_VERSION_MAJOR} * 65536 + ${PROJECT_VERSION_MINOR} * 256 + ${PROJECT_VERSION_PATCH}") + +#============================================================================ +# Remove duplicates from space-separated list of items +function(remove_duplicates _invar _outvar) + separate_arguments(_invar) + list(REMOVE_DUPLICATES _invar) + string(REPLACE ";" " " _invar "${_invar}") + set(${_outvar} "${_invar}" PARENT_SCOPE) +endfunction() + +#---------------------------------------------------------------------------- +# Get list of definitions for given target as list of -DXXX +# (needed for generating ROOT dictionaries) +function(get_target_definitions TARGET DEFINES) + get_target_property(defs ${TARGET} COMPILE_DEFINITIONS) + if(defs) + foreach(d IN LISTS defs) + list(APPEND deflist -D${d}) + endforeach(d) + set(${DEFINES} ${deflist} PARENT_SCOPE) + endif() +endfunction(get_target_definitions) + +#---------------------------------------------------------------------------- +# Set project's CXX level if no "-std=xxx" flag given in CXX_FLAGS +macro(set_cxx_std CXX_FLAGS) + string(REGEX MATCH "(^| +)-std=([^ ]*)" std_flag "${CXX_FLAGS}") + if(NOT CMAKE_MATCH_COUNT GREATER 1) + if(DEFINED ROOT_VERSION AND NOT ${ROOT_VERSION} VERSION_LESS 6) + set(CMAKE_CXX_STANDARD 11) + set(CMAKE_CXX_STANDARD_REQUIRED TRUE) + set(CMAKE_CXX_EXTENSIONS FALSE) + endif() + endif() + unset(std_flag) +endmacro(set_cxx_std) + +#---------------------------------------------------------------------------- +# Set our CXX flags plus "_suggested_flags" without any -IXXX options +macro(set_compiler_flags _suggested_flags) + check_cxx_compiler_flag(-pipe cxx-compiler-supports-pipe) + check_cxx_compiler_flag(-fsigned-char cxx-compiler-supports-fsigned-char) + check_cxx_compiler_flag(-fomit-frame-pointer cxx-compiler-supports-fomit-frame-pointer) + check_cxx_compiler_flag(-mtune=generic cxx-compiler-supports-mtune-generic) + if(APPLE) + check_cxx_compiler_flag(-Qunused-arguments cxx-compiler-supports-Qunused-arguments) + endif() + if(cxx-compiler-supports-pipe) + set(${PROJECT_NAME_UC}_CXX_FLAGS "${${PROJECT_NAME_UC}_CXX_FLAGS} -pipe") + endif() + if(cxx-compiler-supports-fsigned-char) + set(${PROJECT_NAME_UC}_CXX_FLAGS "${${PROJECT_NAME_UC}_CXX_FLAGS} -fsigned-char") + endif() + if(cxx-compiler-supports-mtune-generic) + set(${PROJECT_NAME_UC}_CXX_FLAGS "${${PROJECT_NAME_UC}_CXX_FLAGS} -mtune=generic") + endif() + if(cxx-compiler-supports-Qunused-arguments) + set(${PROJECT_NAME_UC}_CXX_FLAGS "${${PROJECT_NAME_UC}_CXX_FLAGS} -Qunused-arguments") + endif() + set(${PROJECT_NAME_UC}_CXX_FLAGS "${${PROJECT_NAME_UC}_CXX_FLAGS} ${_suggested_flags}") + if(${PROJECT_NAME_UC}_CXX_FLAGS) + remove_duplicates(${${PROJECT_NAME_UC}_CXX_FLAGS} ${PROJECT_NAME_UC}_CXX_FLAGS) + set_cxx_std(${${PROJECT_NAME_UC}_CXX_FLAGS}) + endif() + string(STRIP "${${PROJECT_NAME_UC}_CXX_FLAGS}" ${PROJECT_NAME_UC}_CXX_FLAGS_LIST) + separate_arguments(${PROJECT_NAME_UC}_CXX_FLAGS_LIST) + unset(cxx-compiler-supports-pipe) + unset(cxx-compiler-supports-fsigned-char) + unset(cxx-compiler-supports-fexceptions) + unset(cxx-compiler-supports-mtune-generic) + unset(cxx-compiler-supports-Qunused-arguments) + # Configuration dependent options. Avoid ugly generator expressions + if(cxx-compiler-supports-fomit-frame-pointer) + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -fno-omit-frame-pointer") + endif() + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0") +endmacro(set_compiler_flags) + +#---------------------------------------------------------------------------- +# Set warning flags according to given argument(s) +macro(set_diagnostic_flags) + cmake_parse_arguments(SDF "WALL;WEXTRA;WERROR" "" "" ${ARGN}) + if(SDF_UNPARSED_ARGUMENTS) + message(FATAL_ERROR + "set_diagnostic_flags: Unrecognized arguments: ${SDF_UNPARSED_ARGUMENTS}" + ) + endif() + + if(SDF_WALL OR SDF_WEXTRA) + set(${PROJECT_NAME_UC}_DIAG_FLAGS "${${PROJECT_NAME_UC}_DIAG_FLAGS} -Wall") + endif() + if(SDF_WEXTRA) + set(${PROJECT_NAME_UC}_DIAG_FLAGS + "${${PROJECT_NAME_UC}_DIAG_FLAGS} -Wextra -Wno-missing-field-initializers -Wno-unused-parameter" + ) + endif() + if(SDF_WERROR) + set(${PROJECT_NAME_UC}_DIAG_FLAGS "${${PROJECT_NAME_UC}_DIAG_FLAGS} -Werror") + endif() + if(${ARGC} GREATER 0) + remove_duplicates(${${PROJECT_NAME_UC}_DIAG_FLAGS} ${PROJECT_NAME_UC}_DIAG_FLAGS) + endif() + string(STRIP "${${PROJECT_NAME_UC}_DIAG_FLAGS}" ${PROJECT_NAME_UC}_DIAG_FLAGS_LIST) + separate_arguments(${PROJECT_NAME_UC}_DIAG_FLAGS_LIST) +endmacro(set_diagnostic_flags) + +#---------------------------------------------------------------------------- +# Print build configuration details (build type, project-wde compiler flags) +function(report_build_info) + string(TOUPPER ${CMAKE_BUILD_TYPE} BUILD_TYPE_UC) + message(STATUS "Compiling for ${CMAKE_SYSTEM_NAME} with ${CMAKE_CXX_COMPILER} version ${CMAKE_CXX_COMPILER_VERSION}") + message(STATUS "Build type ${CMAKE_BUILD_TYPE}") + message(STATUS "${PROJECT_NAME_UC}_CXX_FLAGS = ${${PROJECT_NAME_UC}_CXX_FLAGS} ${${PROJECT_NAME_UC}_DIAG_FLAGS}") + message(STATUS "CMAKE_CXX_FLAGS_${BUILD_TYPE_UC} = ${CMAKE_CXX_FLAGS_${BUILD_TYPE_UC}}") +endfunction(report_build_info) + +#---------------------------------------------------------------------------- +# Support for keeping track of dependencies loaded via our FindXXX scripts + +# Dependencies already found +set_property(GLOBAL PROPERTY ${PROJECT_NAME_UC}_DEPENDENCY_LIST "") +# Commands to write to PoddConfig.cmake +set_property(GLOBAL PROPERTY ${PROJECT_NAME_UC}_FIND_DEPENDENCY_COMMANDS "") + +function(config_add_dependency item) + get_property(deplist GLOBAL PROPERTY ${PROJECT_NAME_UC}_DEPENDENCY_LIST) + list(FIND deplist ${item} found) + if(${found} LESS 0) + set_property(GLOBAL APPEND PROPERTY ${PROJECT_NAME_UC}_DEPENDENCY_LIST ${item}) + get_property(commands GLOBAL PROPERTY ${PROJECT_NAME_UC}_FIND_DEPENDENCY_COMMANDS) + list(LENGTH commands ncmd) + if(ncmd EQUAL 0) + set_property(GLOBAL APPEND PROPERTY ${PROJECT_NAME_UC}_FIND_DEPENDENCY_COMMANDS + "include(CMakeFindDependencyMacro)") + endif() + cmake_parse_arguments(CAD "" "" "" ${ARGN}) + set(version) + if(CAD_UNPARSED_ARGUMENTS) + list(GET CAD_UNPARSED_ARGUMENTS 0 version) + endif() + if(version) + set_property(GLOBAL APPEND PROPERTY ${PROJECT_NAME_UC}_FIND_DEPENDENCY_COMMANDS + "find_dependency(${item} ${version})") + else() + set_property(GLOBAL APPEND PROPERTY ${PROJECT_NAME_UC}_FIND_DEPENDENCY_COMMANDS + "find_dependency(${item})") + endif() + endif() +endfunction() + +function(build_root_dictionary dictionary) + + #if(DEFINED ROOT_VERSION AND DEFINED ROOTSYS) + # if(NOT ${ROOT_VERSION} VERSION_LESS 6) + #find_program(ROOTCLING rootcling HINTS "$ENV{ROOTSYS}/bin") + # if(NOT ROOTCLING) + # message(FATAL_ERROR + # "root_generate_dictionary: Cannot find rootcling. Check ROOT installation.") + # endif() + # else() + # find_program(ROOTCINT rootcint HINTS "${ROOTSYS}/bin") + # if(NOT ROOTCINT) + # message(FATAL_ERROR + # "root_generate_dictionary: Cannot find rootcint. Check ROOT installation.") + # endif() + # endif() + #else() + # message(FATAL_ERROR "root_generate_dictionary: ROOT is not set up") + #endif() + + cmake_parse_arguments(RGD "" "PCMNAME" "INCLUDEDIRS;LINKDEF;OPTIONS;TARGETS" ${ARGN}) + + if(NOT RGD_LINKDEF) + message(FATAL_ERROR "root_generate_dictionary: Required argument LINKDEF missing") + endif() + + # Compile definitions and include directories from the given target(s) + set(defines) + set(incdirs) + foreach(tgt IN LISTS RGD_TARGETS) + list(APPEND defines $<TARGET_PROPERTY:${tgt},COMPILE_DEFINITIONS>) + #list(APPEND incdirs $<TARGET_PROPERTY:${tgt},INCLUDE_DIRECTORIES>) + endforeach() + + + + # Add any explicitly specified include directories + list(APPEND incdirs ${RGD_INCLUDEDIRS}) + set(ROOTCLING 1) + + if(ROOTCLING) + # ROOT6 + if(RGD_PCMNAME) + set(pcmname ${RGD_PCMNAME}) + else() + set(pcmname ${dictionary}) + endif() + add_custom_command( + OUTPUT ${dictionary}Dict.cxx lib${pcmname}_rdict.pcm + COMMAND rootcling + ARGS + -f ${dictionary}Dict.cxx + -s lib${pcmname} + ${RGD_OPTIONS} + ${RGD_INCLUDEDIRS} + #INCDIRS "${incdirs}" + #DEFINES "${defines}" + ${RGD_UNPARSED_ARGUMENTS} + ${RGD_LINKDEF} + VERBATIM + DEPENDS ${RGD_UNPARSED_ARGUMENTS} ${RGD_LINKDEF} + ) + set(PCM_FILE ${CMAKE_CURRENT_BINARY_DIR}/lib${pcmname}_rdict.pcm) + install(FILES ${PCM_FILE} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + else() + # ROOT5 + add_custom_command( + OUTPUT ${dictionary}Dict.cxx + COMMAND ${MK_ROOTDICT} + ARGS + ${ROOTCINT} + -f ${dictionary}Dict.cxx + -c ${RGD_OPTIONS} + INCDIRS "${incdirs}" + DEFINES "${defines}" + ${RGD_UNPARSED_ARGUMENTS} + ${RGD_LINKDEF} + VERBATIM + DEPENDS ${RGD_UNPARSED_ARGUMENTS} ${RGD_LINKDEF} + ) + endif() + add_custom_target(${dictionary}_ROOTDICT + DEPENDS ${dictionary}Dict.cxx + ) +endfunction() diff --git a/containers/docker/Makefile b/containers/docker/Makefile index 9e94fa8d988907fbc7e569fde0270b6717810549..c74d224fca207288b4b8013cb249d583c3cfaaa9 100644 --- a/containers/docker/Makefile +++ b/containers/docker/Makefile @@ -89,7 +89,7 @@ tag-alt-version: ## Generate container `{version}` tag login: ## Auto login to AWS-ECR unsing aws-cli docker login $(REG_NAME) -u $(REG_USER) -p $(REG_TOKEN) -release: build-nc publish ## Make a release by building and publishing the `{version}` ans `latest` tagged containers to ECR +release: build publish ## Make a release by building and publishing the `{version}` ans `latest` tagged containers to ECR publish: publish-latest #publish-version ## Publish the `{version}` ans `latest` tagged containers to ECR