+# -*- mode: cmake -*-
+
# AliRoot Build System Utility Macro and Function definitions
#
# Author: Johny Jose (johny.jose@cern.ch)
# Port of previous Makefile build to cmake
-cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
+cmake_minimum_required(VERSION 2.8.4 FATAL_ERROR)
macro(ALICE_DevFlagsOutput)
message(STATUS "SHLIB : ${SHLIB}")
message(STATUS "SYSLIBS : ${SYSLIBS}")
message(STATUS "CINTFLAGS : ${CINTFLAGS}")
+ message(STATUS "CMAKE_Fortran_FLAGS : ${CMAKE_Fortran_FLAGS}")
+ message(STATUS "CMAKE_CXX_FLAGS : ${CMAKE_CXX_FLAGS}")
+ message(STATUS "CMAKE_C_FLAGS : ${CMAKE_C_FLAGS}")
+ message(STATUS "CMAKE_SHARED_LINKER_FLAGS : ${CMAKE_SHARED_LINKER_FLAGS}")
+ message(STATUS "CMAKE_MODULE_LINKER_FLAGS : ${CMAKE_MODULE_LINKER_FLAGS}")
+ message(STATUS "CMAKE_EXE_LINKER_FLAGS : ${CMAKE_EXE_LINKER_FLAGS}")
endif(ALICEDEV STREQUAL "YES")
endmacro(ALICE_DevFlagsOutput)
function(ALICE_CleanOutput _output input)
- string(REGEX REPLACE "\n" " " clean ${input})
+ string(REGEX REPLACE "\n" " " clean "${input}")
set(${_output} ${clean} PARENT_SCOPE)
endfunction(ALICE_CleanOutput)
set(corrected)
foreach(path ${value})
set(external)
- string(REGEX MATCH "^/" external ${path})
+ string(REGEX MATCH "^/" external "${path}")
if(NOT external)
list(APPEND corrected "${CMAKE_SOURCE_DIR}/${path}" )
else()
- list(APPEND corrected ${path})
+ list(APPEND corrected "${path}")
endif(NOT external)
endforeach(path)
set(${_output} ${corrected} PARENT_SCOPE)
foreach(arg ${input})
set(item ${arg})
if(prefix)
- string(REGEX MATCH "^${prefix}" pre ${arg})
+ string(REGEX MATCH "^${prefix}" pre "${arg}")
endif(prefix)
if(suffix)
- string(REGEX MATCH "${suffix}$" suf ${arg})
+ string(REGEX MATCH "${suffix}$" suf "${arg}")
endif(suffix)
if(NOT pre)
set(item "${prefix}${item}")
set(format)
foreach(arg ${input})
set(item ${arg})
- string(REGEX MATCH "^(/|-)" preformatted ${item})
+ string(REGEX MATCH "^(/|-)" preformatted "${item}")
if(NOT preformatted)
set(item "-l${item}")
endif(NOT preformatted)
macro(ALICE_ConfigureCompiler)
- if(ALIDEBUG STREQUAL "YES")
- set(ALICE_TARGET ${ALICE_TARGET}DEBUG)
- message("Befor ${CXXFLAGS}")
- string(REGEX MATCHALL "-O[^ ]*" FFLAGS ${FFLAGS})
- string(REGEX MATCHALL "-O[^ ]*" CXXFLAGS ${CXXFLAGS})
- message("After ${CXXFLAGS}")
- string(REGEX MATCHALL "-O[^ ]*" CFLAGS ${CFLAGS})
- string(REGEX MATCHALL "-O[^ ]*" SOFLAGS ${SOFLAGS})
- string(REGEX MATCHALL "-O[^ ]*" LDFLAGS ${LDFLAGS})
- set(FFLAGS "-g ${FFLAGS}")
- set(CXXFLAGS "-g ${CXXFLAGS}")
- set(CFLAGS "-g ${CFLAGS}")
- set(SOFLAGS "-g ${SOFLAGS}")
- set(LDFLAGS "-g ${LDFLAGS}")
- endif(ALIDEBUG STREQUAL "YES")
-
if(ALIPROFILE STREQUAL "YES")
set(ALICE_TARGET ${ALICE_TARGET}PROF)
set(FFLAGS "-pg ${FFLAGS}")
ALICE_RootConfig(RLFLAGS --ldflags)
set(CXXFLAGS "${CXXFLAGS} ${RCFLAGS}")
+ string(REPLACE "-std=c++11" " " RCFLAGS "${RCFLAGS}")
set(CFLAGS "${CFLAGS} ${RCFLAGS}")
set(SOFLAGS "${SOFLAGS} ${RLFLAGS}")
set(LDFLAGS "${LDFLAGS} ${RLFLAGS}")
set(PSHLIBS)
set(PDS)
+ set(saveEINCLUDE)
+
endmacro(ALICE_ResetPackage)
function(ALICE_SetPackageVariable _var ext setvalue unsetvalue )
endfunction(ALICE_SetPackageVariable)
macro(ALICE_BuildPackage)
+ # message(STATUS " ${PACKAGE}")
list(APPEND EINCLUDE STEER)
+ # Needed for PAR files - we need to do this before path
+ # expansion so that the PAR files do not contain references to
+ # specific directories but depend solely on ALICE_ROOT
+ string(REPLACE ";" " " saveEINCLUDE "${EINCLUDE}")
+ # set(saveEINCLUDE "${EINCLUDE}")
+ # message(STATUS "saveEINCLUDE=${saveEINCLUDE} EINCLUDE=${EINCLUDE}")
ALICE_SetPackageVariable(PFFLAGS "FFLAGS" "${PACKFFLAGS}" "${FFLAGS}")
ALICE_SetPackageVariable(PCFLAGS "CFLAGS" "${PACKCFLAGS}" "${CFLAGS}")
ALICE_SetPackageVariable(PEDEFINE "EDEFINE" "${EDEFINE}" "${EDEFINE}")
ALICE_SetPackageVariable(PEXPORT "EXPORT" "${EXPORT}" "${EXPORT}")
+# message(${CMAKE_INCLUDE_EXPORT_DIRECTORY})
ALICE_SetPackageVariable(PEXPORTDEST "EXPORTDEST" "${CMAKE_INCLUDE_EXPORT_DIRECTORY}" "${CMAKE_INCLUDE_EXPORT_DIRECTORY}")
ALICE_SetPackageVariable(PINC "INC" "${EINCLUDE};${MODULE}" "${EINCLUDE};${MODULE}")
ALICE_SetPackageVariable(PELIBS "ELIBS" "${ELIBS}" "${ELIBS}")
list(APPEND PMALIBS ${PACKAGE}-static)
list(APPEND ALLALIBS ${PACKAGE}-static)
list(APPEND BINLIBS ${PACKAGE})
+ # Do not link against other libraries when creating a library
+ # set(PELIBS)
else()
list(APPEND ALLEXECS ${PACKAGE})
endif(lib)
set(${MODULE}LIBS "${PMLIBS}" PARENT_SCOPE)
set(${MODULE}INC "${EINCLUDE}" PARENT_SCOPE)
list(APPEND INCLUDEFILES ${PEXPORTDEST})
- ALICE_CopyHeaders()
if(WITHDICT)
- ALICE_SetPackageVariable(PDS "DS" "G__${PACKAGE}.cxx" "G__${PACKAGE}.cxx")
+ # Replace dots in file name with underscores, or rootcint will
+ # write invalid code (namespace names with dots in them)
+ string(REPLACE "." "_" ESC_PACKAGE ${PACKAGE})
+ ALICE_SetPackageVariable(PDS "DS" "G__${ESC_PACKAGE}.cxx" "G__${ESC_PACKAGE}.cxx")
ALICE_GenerateDictionary()
else()
if(lib)
ALICE_BuildExecutable()
endif(lib)
endif(PS OR PCS OR PFS)
- ALICE_CheckModule()
+ ALICE_CopyHeaders()
+ ALICE_BuildPAR()
endmacro(ALICE_BuildPackage)
macro(ALICE_BuildModule)
-
- add_definitions(-D_MODULE="${MODULE}")
+ # message(STATUS "${MODULE}")
+ execute_process(COMMAND ${CMAKE_COMMAND} -E echo_append "-- ${MODULE}:")
+ add_definitions(-D_MODULE_="${MODULE}")
foreach(PACKAGEFILE ${PACKAGES})
set(lib)
set(bin)
- string(REGEX MATCH "CMakelib" lib ${PACKAGEFILE})
- string(REGEX MATCH "CMakebin" bin ${PACKAGEFILE})
+ string(REGEX MATCH "CMakelib" lib "${PACKAGEFILE}")
+ string(REGEX MATCH "CMakebin" bin "${PACKAGEFILE}")
get_filename_component(PACKAGE ${PACKAGEFILE} NAME)
- string(REGEX REPLACE "^CMake(lib|bin)(.*)\\.pkg" "\\2" PACKAGE ${PACKAGE})
+ string(REGEX REPLACE "^CMake(lib|bin)(.*)\\.pkg" "\\2" PACKAGE "${PACKAGE}")
+ execute_process(COMMAND ${CMAKE_COMMAND} -E echo_append " ${PACKAGE}")
if(ALICEDEV)
message("Adding package ${PACKAGE} in ${MODULE}")
endif(ALICEDEV)
get_property(EXCLUDEPACKAGE TARGET ${PACKAGE} PROPERTY EXCLUDE_FROM_ALL)
if(NOT EXCLUDEPACKAGE)
install(TARGETS ${PACKAGE}
- RUNTIME DESTINATION bin
- LIBRARY DESTINATION lib
- ARCHIVE DESTINATION bin)
+ RUNTIME DESTINATION bin/tgt_${ALICE_TARGET}
+ LIBRARY DESTINATION lib/tgt_${ALICE_TARGET}
+ ARCHIVE DESTINATION bin/tgt_${ALICE_TARGET})
endif(NOT EXCLUDEPACKAGE)
endforeach(PACKAGEFILE)
-
+ ALICE_CheckModule()
+ execute_process(COMMAND ${CMAKE_COMMAND} -E echo " done")
endmacro(ALICE_BuildModule)
macro(ALICE_GenerateDictionary)
separate_arguments(DCINTHDRS)
separate_arguments(DDH)
# Format neccesary arguments
+ set(ROOT6_ALPHA "5.99.1")
+ string(REGEX REPLACE "/0*" "." ROOT_DOTVERSION ${ROOT_VERSION})
+ if(ROOT_DOTVERSION VERSION_GREATER ROOT6_ALPHA)
+ # For current ROOT6-alpha - without proper PCM support - we need to
+ # give the _full_ path for all include paths, so that libCling can
+ # later attach those to the internal include path of the interpreter
+ # and so that the interpreter can parse the header files.
+ #
+ # THIS SHOULD BE A TEMPORARY HACK!
+ ALICE_Format(DINC "-I${PROJECT_SOURCE_DIR}/" ""
+ "${DINC};${CMAKE_INCLUDE_EXPORT_DIRECTORY}")
+ else()
ALICE_Format(DINC "-I" "" "${DINC};${CMAKE_INCLUDE_EXPORT_DIRECTORY}")
+ endif(ROOT_DOTVERSION VERSION_GREATER ROOT6_ALPHA)
set_source_files_properties(${PDS} PROPERTIES GENERATED TRUE)
+ set_source_files_properties(${PDS} PROPERTIES COMPILE_FLAGS "-w")
add_custom_command(OUTPUT ${PDS}
COMMAND cd ${PROJECT_SOURCE_DIR} && ${ROOTCINT} -f ${CMAKE_CURRENT_BINARY_DIR}/${PDS} -c -D_MODULE=\\\"${MODULE}\\\" ${DEDEFINE} ${DCINTFLAGS} ${DINC} ${DCINTHDRS} ${DDH}
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
macro(ALICE_BuildLibrary)
- ALICE_DevFlagsOutput()
set(CMAKE_CXX_FLAGS "${PEDEFINE} ${PCXXFLAGS}")
set(CMAKE_C_FLAGS "${PEDEFINE} ${PCFLAGS}")
- set(CMAKE_Fortran_FLAGS ${PEDEFINE} ${PFFLAGS})
+ set(CMAKE_Fortran_FLAGS "${PEDEFINE} ${PFFLAGS}")
set(CMAKE_SHARED_LINKER_FLAGS ${PSOFLAGS})
set(CMAKE_MODULE_LINKER_FLAGS ${PLDFLAGS})
+ ALICE_DevFlagsOutput()
separate_arguments(PINC)
ALICE_Format(PELIBSDIR "-L" "" "${PELIBSDIR}")
ALICE_CheckLibraries(PBLIBS "${PBLIBS}")
- ALICE_CheckLibraries(PELIBS "${PELIBS}")
ALICE_CorrectPaths(EINCLUDE "${EINCLUDE}")
ALICE_CorrectPaths(PINC "${PINC}")
include_directories(${PINC})
include_directories(${EINCLUDE})
include_directories(${CMAKE_INCLUDE_EXPORT_DIRECTORY})
+ include_directories(${CMAKE_SOURCE_DIR})
add_library(${PACKAGE} SHARED ${PCS} ${PFS} ${PS} ${PDS})
+ set_target_properties(${PACKAGE} PROPERTIES SUFFIX .so)
if(PELIBS OR SHLIB)
set_property(TARGET ${PACKAGE} PROPERTY EXCLUDE_FROM_ALL TRUE)
endif(NOT RESULT STREQUAL "-1")
+ set_target_properties(${PACKAGE} PROPERTIES INSTALL_NAME_DIR ${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
+
endmacro(ALICE_BuildLibrary)
macro(ALICE_BuildExecutable)
- ALICE_DevFlagsOutput()
set(CMAKE_CXX_FLAGS "${PEDEFINE} ${PCXXFLAGS} ${EXEFLAGS}")
set(CMAKE_C_FLAGS "${PEDEFINE} ${PCFLAGS} ${EXEFLAGS}")
set(CMAKE_Fortran_FLAGS "${PEDEFINE} ${PFFLAGS} ${EXEFLAGS}")
set(CMAKE_SHARED_LINKER_FLAGS ${PSOFLAGS})
set(CMAKE_MODULE_LINKER_FLAGS ${PLDFLAGS})
+ set(CMAKE_EXE_LINKER_FLAGS ${PLDFLAGS})
+ ALICE_DevFlagsOutput()
separate_arguments(PINC)
separate_arguments(EINCLUDE)
separate_arguments(PBLIBS)
separate_arguments(PELIBS)
separate_arguments(SHLIB)
-
+
ALICE_Format(PELIBSDIR "-L" "" "${PELIBSDIR}")
ALICE_CheckLibraries(PBLIBS "${PBLIBS}")
- #ALICE_CheckLibraries(PELIBS "${PELIBS}")
ALICE_CorrectPaths(EINCLUDE "${EINCLUDE}")
ALICE_CorrectPaths(PINC "${PINC}")
add_dependencies(${PACKAGE}-static libAliMDC root-static-libs)
target_link_libraries(${PACKAGE}-static ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libAliMDC.a ${ROOTLIBDIR}/libRoot.a ${ROOTLIBDIR}/libfreetype.a ${ROOTLIBDIR}/libpcre.a -pthread -ldl -lcurses)
- install(TARGETS ${PACKAGE}-static RUNTIME DESTINATION bin COMPONENT MDC)
- install(FILES ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libAliMDC.a ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libAliMDC.a ${ROOTLIBDIR}/libRoot.a ${ROOTLIBDIR}/libfreetype.a ${ROOTLIBDIR}/libpcre.a DESTINATION lib COMPONENT MDC)
+ install(TARGETS ${PACKAGE}-static RUNTIME DESTINATION bin/tgt_${ALICE_TARGET} COMPONENT MDC)
+ install(FILES ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libAliMDC.a ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libAliMDC.a ${ROOTLIBDIR}/libRoot.a ${ROOTLIBDIR}/libfreetype.a ${ROOTLIBDIR}/libpcre.a DESTINATION lib/tgt_${ALICE_TARGET} COMPONENT MDC)
install(FILES ${PROJECT_SOURCE_DIR}/RAW/mdc.h DESTINATION include COMPONENT MDC)
set(CPACK_RPM_PACKAGE_SUMMARY "AliMDC static libraries")
set(CPACK_RPM_PACKAGE_NAME "alimdc")
set(CPACK_RPM_PACKAGE_VERSION "${ALIMDCVERSION}")
set(CPACK_RPM_PACKAGE_RELEASE "${ALIMDCRELEASE}")
- set(CPACK_RPM_PACKAGE_LICENSE "Copyright: CERN ALICE Off-line Group")
+ set(CPACK_RPM_PACKAGE_LICENSE "License: CERN ALICE Off-line Group")
set(CPACK_RPM_PACKAGE_VENDOR "ALICE Core Off-line Group")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "AliMDC static libraries")
set(CPACK_RPM_PACKAGE_GROUP "Applications/Alice")
macro(ALICE_CopyHeaders)
- if(NOT EXPORT )
- set(HEADERS)
- else()
+ if(EXPORT )
set(HEADERS ${EXPORT})
- endif(NOT EXPORT)
- foreach(header ${HEADERS})
- configure_file(${header} ${PEXPORTDEST} COPYONLY)
+ set(_headersdep)
+ foreach(header ${HEADERS})
+ get_filename_component( header_name ${header} NAME )
+ add_custom_command(OUTPUT ${PEXPORTDEST}/${header_name}
+ COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/${MODULE}/${header} ${PEXPORTDEST}/${header_name}
+ DEPENDS ${CMAKE_SOURCE_DIR}/${MODULE}/${header})
+ list(APPEND _headersdep ${PEXPORTDEST}/${header_name})
install(FILES ${header} DESTINATION include)
- endforeach(header)
+ endforeach(header)
+ add_custom_target(${PACKAGE}-headers DEPENDS ${_headersdep})
+ add_dependencies(${PACKAGE} ${PACKAGE}-headers)
+ endif(EXPORT)
endmacro(ALICE_CopyHeaders)
macro(ALICE_GenerateLinkDef)
-
- file (WRITE ${PDAL} "//--------------------------------------------------------------------------------\n")
- file (APPEND ${PDAL} "// This is an automatically generated Root Dictionary Linkdef file for ${PACKAGE}\n")
- file (APPEND ${PDAL} "// !!! DO NOT EDIT THIS FILE !!!\n")
- file (APPEND ${PDAL} "#ifdef __CINT__\n")
- file (APPEND ${PDAL} "#pragma link off all globals;\n")
- file (APPEND ${PDAL} "#pragma link off all classes;\n")
- file (APPEND ${PDAL} "#pragma link off all functions;\n")
+ set(PCLASSES)
foreach (class ${PCINTCLASSES})
get_filename_component(classname ${class} NAME)
- file(APPEND ${PDAL} "#pragma link C++ class ${classname}+;\n")
+ # set(PCLASSES ${PCLASSES} "\\n#pragma link C++ class ${classname}+;")
+ set(PCLASSES ${PCLASSES} "${classname}")
endforeach(class)
- file (APPEND ${PDAL} "#endif\n")
+
+ add_custom_command(OUTPUT ${PDAL}
+ COMMAND sh ${CMAKE_SOURCE_DIR}/cmake/GenerateLinkDef.sh ${PCLASSES} > ${PDAL}
+ DEPENDS ${PCINTHDRS} ${CMAKE_SOURCE_DIR}/cmake/GenerateLinkDef.sh)
endmacro(ALICE_GenerateLinkDef)
+macro(ALICE_BuildPAR)
+
+ if(EXISTS ${CMAKE_SOURCE_DIR}/${MODULE}/PROOF-INF.${PACKAGE})
+ set(PARSRCS)
+ foreach(file ${SRCS} ${HDRS} ${FSRCS} ${DHDR})
+ get_filename_component(srcdir ${file} PATH)
+ add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE}/${file}-par
+ COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE}/${srcdir}
+ COMMAND cp -pR ${file} ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE}/${file}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} )
+ list(APPEND PARSRCS ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE}/${file}-par)
+ endforeach(file ${SRCS} ${HDRS} ${FSRCS} ${DHDR})
+
+ # message(STATUS "saveEINCLUDE=${saveEINCLUDE}")
+ add_custom_target(${PACKAGE}.par
+ COMMAND sed -e 's,include ..ROOTSYS./\\\(etc\\|test\\\)/Makefile.arch,include Makefile.arch,\; s/PACKAGE = .*/PACKAGE = ${PACKAGE}/\; s,SRCS *=.*,SRCS = ${SRCS},\;' < Makefile | sed -e 's,HDRS *=.*,HDRS = ${HDRS},\; s,FSRCS *=.*,FSRCS = ${FSRCS},\; s,DHDR *=.*,DHDR = ${DHDR},\; s,EINCLUDE *:=.*,EINCLUDE := ${saveEINCLUDE},' > ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE}/Makefile
+ COMMAND cp -pR `root-config --etcdir`/Makefile.arch ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE}/Makefile.arch
+ COMMAND cp -pR PROOF-INF.${PACKAGE} ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE}/PROOF-INF
+# COMMAND cp -pR lib${PACKAGE}.pkg ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE}
+ COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_CURRENT_BINARY_DIR} tar --exclude=.svn -czhf ${CMAKE_BINARY_DIR}/${PACKAGE}.par ${PACKAGE}
+ COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE}
+ COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --red --bold "${PACKAGE}.par has been created in ${CMAKE_BINARY_DIR}"
+ DEPENDS ${PARSRCS}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} )
+
+
+ add_dependencies(${PACKAGE}.par ${SRCS} ${FSRCS} ${HDRS} ${DHDR})
+ add_dependencies(par-all ${PACKAGE}.par)
+ add_dependencies(${MODULE}-par-all ${PACKAGE}.par)
+
+ add_custom_target(test-${PACKAGE}.par
+ COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --red --bold "The file ${PACKAGE}.par is now being tested, in case of an error check in par-tmp/${PACKAGE}."
+ COMMAND ${CMAKE_COMMAND} -E make_directory par-tmp
+ COMMAND ${CMAKE_COMMAND} -E chdir par-tmp tar xfz ../${PACKAGE}.par && ${CMAKE_COMMAND} -E chdir par-tmp/${PACKAGE} PROOF-INF/BUILD.sh
+ COMMAND ${CMAKE_COMMAND} -E remove_directory par-tmp
+ COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --green --bold "${PACKAGE}.par testing succeeded"
+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
+
+ add_dependencies(test-${PACKAGE}.par ${PACKAGE}.par)
+ add_dependencies(test-par-all test-${PACKAGE}.par)
+ add_dependencies(test-${MODULE}-par-all test-${PACKAGE}.par)
+
+ endif(EXISTS ${CMAKE_SOURCE_DIR}/${MODULE}/PROOF-INF.${PACKAGE})
+ # endif(EXISTS ${ALICE_ROOT}/${MODULE}/PROOF-INF.${PACKAGE})
+
+endmacro(ALICE_BuildPAR)