source: trunk/Mars/CMakeLists.txt @ 19324

Last change on this file since 19324 was 19324, checked in by tbretz, 8 months ago
Now this version works for 5.34 with a classical compilation, 6.x compiled with cmake and 6.x downloaded as binary distirbution.
File size: 12.2 KB
Line 
1# *********************************
2# ************ cmake **************
3# *********************************
4CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
5CMAKE_POLICY(SET CMP0043 NEW)
6CMAKE_POLICY(SET CMP0048 NEW)
7
8# Enable debug symbols by default
9# must be done before project() statement
10SET(CMAKE_BUILD_TYPE_INIT Release)
11# (you can also set it on the command line: -D CMAKE_BUILD_TYPE=Release)
12
13# Enable CLANG as default compilers, to change this use
14# cmake -DCMAKE_C_COMPILER=cc -DCMAKE_CXX_COMPILER=c++
15# Note that if compilers are switched on the fly,
16# the cache is deleted
17IF(NOT DEFINED CMAKE_C_COMPILER)
18        FIND_PROGRAM(CMAKE_C_COMPILER   NAMES $ENV{CC}  clang   gcc cc  PATHS ENV PATH NO_DEFAULT_PATH DOC "C Compiler")
19ENDIF()
20IF(NOT DEFINED CMAKE_CXX_COMPILER)
21        FIND_PROGRAM(CMAKE_CXX_COMPILER NAMES $ENV{CXX} clang++ g++ c++ PATHS ENV PATH NO_DEFAULT_PATH DOC "C++ Compiler")
22ENDIF()
23
24#SET(CMAKE_VERBOSE_MAKEFILE ON)
25
26# To check for an include file you do this:
27#CHECK_INCLUDE_FILE("stdint.h"        HAVE_STDINT_H)
28# To check the size of a primitive type:
29#CHECK_TYPE_SIZE("int"   SIZEOF_INT)
30
31
32
33# *********************************
34# ************ Project ************
35# *********************************
36
37STRING(TIMESTAMP VERSION %y.%U.%w.%H UTC)
38
39MESSAGE(STATUS "Mars V${VERSION}")
40
41PROJECT(mars VERSION ${VERSION})
42
43INCLUDE(GNUInstallDirs)
44
45# ======== For config.h.in =========
46SET(PACKAGE_MAINTAINER "Thomas Bretz")
47SET(PACKAGE_BUGREPORT  "tbretz@physik.rwth-aachen.de")
48SET(PACKAGE_URL        "https://www.fact-project.org")
49
50
51
52# *********************************
53# ********* Requirements **********
54# *********************************
55
56# Inlclude the main source AND build dir itself
57#SET(CMAKE_INCLUDE_CURRENT_DIR ON)
58SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
59
60# =========== help2man ============
61FIND_PROGRAM(HELP2MAN_EXECUTABLE help2man)
62
63# =========== pkg-config ============
64FIND_PACKAGE(PkgConfig)
65FIND_PACKAGE(PackageHandleStandardArgs)
66
67
68# ============= libnova ==============
69
70PKG_CHECK_MODULES(Nova QUIET Nova)
71
72# Try to locate the package in the default path
73# and in the path provided by pkg-config
74FIND_PATH(NOVA_INCLUDE_DIR NAMES libnova/libnova.h PATHS ${NOVA_INCLUDE_DIRS})
75FIND_LIBRARY(NOVA_LIBRARY NAMES nova PATHS ${NOVA_LIBRARY_DIRS})
76
77# Check if NOVA_LIBARARY and NOVA_INCLUDE_DIR is set
78# Print a message otherwise
79FIND_PACKAGE_HANDLE_STANDARD_ARGS(Nova DEFAULT_MSG NOVA_LIBRARY NOVA_INCLUDE_DIR)
80
81# Mark those variables to be displayed as 'advanced' in the GUI
82MARK_AS_ADVANCED(NOVA_LIBRARY NOVA_INCLUDE_DIR)
83
84# handle success
85FIND_PACKAGE_MESSAGE(NovaInc "Found Nova headers in ${NOVA_INCLUDE_DIR}" "[${NOVA_LIBRARY}][${NOVA_INCLUDE_DIR}]")
86
87
88# ============== libz ================
89
90FIND_PACKAGE(ZLIB REQUIRED)
91
92
93# =========== Enable C++11 ===========
94
95SET(CMAKE_CXX_STANDARD 11)
96SET(CMAKE_CXX_FLAGS
97        "${CMAKE_CXX_FLAGS} -Wall -Winit-self -Wpointer-arith \
98         -Wcast-align -Wformat -Woverloaded-virtual \
99         -Wnon-virtual-dtor -Wshadow -fPIC") # -Wextra
100
101SET(CMAKE_CXX_FLAGS
102        "${CMAKE_CXX_FLAGS} \
103         -DMARSVER=\\\"1.0\\\" -D_REENTRANT -D__MARS__ -D__LINUX__ \
104         -DPACKAGE_VERSION=\\\"1.0\\\" -DREVISION=\\\"1.0\\\" \
105         -DPACKAGE_NAME=\\\"MARS\\\" -DHAVE_ZLIB")
106
107# --------- ROOT -------------
108
109# You need to tell CMake where to find the ROOT installation. This can be done in a number of ways:
110#   - ROOT built with classic configure/make use the provided $ROOTSYS/etc/cmake/FindROOT.cmake
111#   - ROOT built with CMake. Add in CMAKE_PREFIX_PATH the installation prefix for ROOT
112SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "$ENV{ROOTSYS}/etc/cmake")
113
114#---Locate the ROOT package and defines a number of variables (e.g. ROOT_INCLUDE_DIRS)
115FIND_PACKAGE(ROOT REQUIRED COMPONENTS Gui Minuit ASImage HistPainter)
116
117IF(NOT DEFINED ROOT_CONFIG_EXECUTABLE)
118   FIND_PACKAGE_MESSAGE(RootFound "Found ROOT: ${ROOT_INCLUDE_DIRS}" "[${ROOT_INCLUDE_DIRS}][${ROOT_LIBRARY_DIR}]")
119ENDIF()
120
121#---Define useful ROOT functions and macros (e.g. ROOT_GENERATE_DICTIONARY)
122IF(DEFINED ROOT_USE_FILE)
123   FIND_PACKAGE_MESSAGE(RootInclude "Setup ROOT: ${ROOT_USE_FILE}" "[${ROOT_USE_FILE}]")
124   INCLUDE(${ROOT_USE_FILE})
125ELSE()
126   # From RootUseFile.cmake (root 6)
127   INCLUDE_DIRECTORIES(${ROOT_INCLUDE_DIRS})
128   LINK_DIRECTORIES(${ROOT_LIBRARY_DIR})
129   ADD_DEFINITIONS(${ROOT_DEFINITIONS})
130   SET(CMAKE_CXX_FLAGS     "${CMAKE_CXX_FLAGS} ${ROOT_CXX_FLAGS}")
131   SET(CMAKE_C_FLAGS       "${CMAKE_C_FLAGS} ${ROOT_C_FLAGS}")
132   SET(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${ROOT_fortran_FLAGS}")
133ENDIF()
134
135# -lGui -lCore -lCint -lRIO -lNet -lHist -lGraf -lGraf3d -lGpad -lTree
136# -lRint -lPostscript -lMatrix -lPhysics -lMathCore -lThread
137# -lASImage -lMinuit -lHistPainter -lThread
138
139#MESSAGE("INCL_DIRS: ${ROOT_INCLUDE_DIRS}")
140#MESSAGE("LIBS:      ${ROOT_LIBRARIES}")
141#MESSAGE("DEFS:      ${ROOT_DEFINITIONS}")
142#MESSAGE("CXXFLAGS:  ${ROOT_CXX_FLAGS}")
143#MESSAGE("CXFLAGS:   ${ROOT_CC_FLAGS}")
144#MESSAGE("FOUND:     ${ROOT_FOUND}")
145#MESSAGE("FILE:      ${ROOT_USE_FILE}")
146#MESSAGE("DIR:       ${CMAKE_CURRENT_SOURCE_DIR}")
147#ROOT_<library>_LIBRARY PATH    Full path for each of the ROOT libraries listed in COMPONENTS
148#ROOT_<command>_CMD     PATH    Full path for each ROOT executable (rootcling, root, hadd, etc.)
149#ROOT_<option>_FOUND    BOOL    True for each enabled build option (e.g. cocoa, python, xrootd, etc.)
150
151# function ROOT_GENERATE_DICTIONARY( dictionary
152#                                    header1 header2 ...
153#                                    LINKDEF linkdef1 ...
154#                                    OPTIONS opt1...)
155
156CONFIGURE_FILE("${PROJECT_SOURCE_DIR}/cmake/root.rc.in"     "${PROJECT_BINARY_DIR}/.rootrc")
157CONFIGURE_FILE("${PROJECT_SOURCE_DIR}/cmake/rootlogon.C.in" "${PROJECT_BINARY_DIR}/rootlogon.C")
158CONFIGURE_FILE("${PROJECT_SOURCE_DIR}/cmake/dohtml.C.in"    "${PROJECT_BINARY_DIR}/dohtml.C")
159
160# -------------------------------------------------------
161
162FILE(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/dictionary)
163
164MACRO(SRCFILES subdir)
165
166        MESSAGE(STATUS "Reading source list from ${DIR}/Makefile")
167
168        EXECUTE_PROCESS(COMMAND
169                ${PROJECT_SOURCE_DIR}/Makefile.extract.sh ${subdir}
170                WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/${subdir}
171                OUTPUT_VARIABLE _HEADERS)
172
173        SEPARATE_ARGUMENTS(_HEADERS)
174
175        LIST(GET       _HEADERS 0 _CINT)
176        LIST(REMOVE_AT _HEADERS 0)
177
178        SET(_SRCLIST ${_HEADERS})
179
180        STRING(REPLACE "${subdir}/" " "    _HEADERS ${_HEADERS}) # Remove directory
181        STRING(REPLACE ".cc"        ".h"   _HEADERS ${_HEADERS}) # change extension
182        STRING(REPLACE ".cxx"       ".hxx" _HEADERS ${_HEADERS}) # special for files in mmc
183
184        SEPARATE_ARGUMENTS(_HEADERS)
185
186        # - This adds the rule how the dictionary is created
187        ROOT_GENERATE_DICTIONARY(dictionary/${_CINT} ${_HEADERS} ${_CINT}Incl.h LINKDEF ${subdir}/${_CINT}LinkDef.h OPTIONS -p  -D__MARS__ -DHAVE_ZLIB)
188        # - This makes sure that it is compiled
189        TARGET_SOURCES(mars PRIVATE dictionary/${_CINT}.cxx ${_SRCLIST})
190
191        INSTALL(DIRECTORY ${subdir}/ DESTINATION "include" FILES_MATCHING PATTERN "*.h")
192
193ENDMACRO()
194
195# -------------------------------------------------------
196
197#SET(DIRECTORIES mmc)
198
199SET(DIRECTORIES
200        manalysis
201        mastro
202        mbadpixels
203        mbase
204        mcalib
205        mcamera
206        mcorsika
207        mdata
208        mdrs
209        melectronics
210        mextralgo
211        mfbase
212        mfileio
213        mfilter
214        mgeom
215        mgui
216        mhbase
217        mhcalib
218        mhflux
219        mhft
220        mhist
221        mhvstime
222        mimage
223        mjobs
224        mjoptim
225        mjtrain
226        mmain
227        mmc
228        mmovie
229        mmuon
230        mpedestal
231        mpointing
232        mranforest
233        mraw
234        mreport
235        msignal
236        msim
237        msimcamera
238        msimreflector
239        msql
240        mtools
241        mtrigger
242)
243
244INCLUDE_DIRECTORIES(${DIRECTORIES} mcore .)
245
246ROOT_GENERATE_DICTIONARY(dictionary/Core
247           mcore/factofits.h
248           mcore/factfits.h
249           mcore/DrsCalib.h
250           mcore/PixelMap.h
251           mcore/Interpolator2D.h
252           mcore/nova.h
253           mcore/Prediction.h
254           MIncl.h
255        LINKDEF MLinkDef.h
256        OPTIONS -p -D__MARS__ -DHAVE_ZLIB)
257
258ADD_LIBRARY(mars SHARED dictionary/Core.cxx) # CMAKE_POSITION_INDEPENDENT_CODE
259TARGET_LINK_LIBRARIES(mars
260        ZLIB::ZLIB
261        ${NOVA_LIBRARY}
262        ${ROOT_LIBRARIES})
263
264ADD_EXECUTABLE(showplot showplot.cc)
265ADD_EXECUTABLE(showlog  showplot.cc)
266ADD_EXECUTABLE(ceres    ceres.cc)
267TARGET_LINK_LIBRARIES(showplot mars ${ROOT_LIBRARIES})
268TARGET_LINK_LIBRARIES(showlog  mars ${ROOT_LIBRARIES})
269TARGET_LINK_LIBRARIES(ceres    mars ${ROOT_LIBRARIES})
270
271
272FOREACH(DIR ${DIRECTORIES})
273        SRCFILES(${DIR})
274ENDFOREACH()
275
276# rootlogon.C finds the shared object only if the libmars.so is in the same directory than the dictionary files
277# there is a way to create a map file with rootcling - but I haven#t yet fugured out how. Note that a link is not enough
278#ADD_CUSTOM_COMMAND(TARGET mars POST_BUILD
279#       COMMAND cp -f ${PROJECT_BINARY_DIR}/libmars.so ${PROJECT_BINARY_DIR}/dictionary/libmars.so
280#       COMMENT "Copying libmars.so to ${PROJECT_BINARY_DIR}/dictionary")
281
282#---Create a shared library with geneated dictionary
283#ADD_LIBRARY(Event SHARED Event.cxx G__Event.cxx)
284#TARGET_LINK_LIBRARIES(Event ${ROOT_LIBRARIES})
285
286#---Create  a main program using the library
287#ADD_EXECUTABLE(Main MainEvent.cxx)
288#TARGET_LINK_LIBRARIES(Main Event)
289
290
291# *********************************
292# ************ Packaging **********
293# *********************************
294
295#SET(PKG_SHARE    "${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME}")
296#SET(PKG_APPS     "${CMAKE_INSTALL_DATAROOTDIR}/applications")
297#SET(PKG_PIXMAPS  "${CMAKE_INSTALL_DATAROOTDIR}/pixmaps")
298
299# ====== Installation targets =====
300
301#INSTALL(TARGETS  mars           DESTINATION "${CMAKE_INSTALL_BINDIR}")
302INSTALL(TARGETS   mars         DESTINATION ".")
303INSTALL(TARGETS   showplot     DESTINATION ".")
304INSTALL(TARGETS   showlog      DESTINATION ".")
305INSTALL(TARGETS   ceres        DESTINATION ".")
306INSTALL(FILES     .rootrc      DESTINATION ".")
307INSTALL(DIRECTORY lib          DESTINATION ".")
308INSTALL(DIRECTORY macros       DESTINATION "." FILES_MATCHING PATTERN "*.C")
309INSTALL(DIRECTORY fact         DESTINATION "." FILES_MATCHING PATTERN "*.C")
310INSTALL(DIRECTORY datacenter   DESTINATION ".")
311INSTALL(DIRECTORY scripts      DESTINATION ".")
312INSTALL(DIRECTORY resources    DESTINATION "." FILES_MATCHING PATTERN "*.rc" PATTERN "*.txt")
313INSTALL(DIRECTORY resmc        DESTINATION "." FILES_MATCHING PATTERN "*" )
314INSTALL(DIRECTORY mcore/       DESTINATION "include" FILES_MATCHING PATTERN "*.h")
315
316
317# ======== General packaging ======
318# https://cmake.org/cmake/help/latest/module/CPack.html
319
320INCLUDE(InstallRequiredSystemLibraries)
321
322# SET(CPACK_STRIP_FILES ON) # Strip debug sysmbold from files
323
324SET(CPACK_PACKAGE_VERSION       "${mars_VERSION}")
325SET(CPACK_PACKAGE_CONTACT       "${PACKAGE_BUGREPORT}")
326SET(CPACK_PACKAGE_MAINTAINER    "${PACKAGE_MAINTAINER}")
327#SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/COPYING")
328#SET(CPACK_PACKAGE_VENDOR "Me, myself, and I")
329
330
331SET(CPACK_SOURCE_IGNORE_FILES "/old/;/build/;/[.].*/;/autom4te[.]cache/;.*~;.log$")
332
333# Maybe the text displayed in synaptic?
334#SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README")
335SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "MARS - Environment")
336#CPACK_RESOURCE_FILE_README     ReadMe file to be embedded in the installer.
337
338SET(CPACK_GENERATOR        TBZ2) # TGZ DEB
339#SET(CPACK_SOURCE_GENERATOR TBZ2) # TGZ
340#SET(CPACK_PROJECT_CONFIG_FILE ${CMAKE_SOURCE_DIR}/cmake/Package.txt)
341#SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/Copyright.txt")
342
343
344# ======== Debian packaging =======
345# https://cmake.org/cmake/help/latest/module/CPackDeb.html
346# https://www.debian.org/doc/debian-policy
347
348#SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libao4 (>=1.0), libsfm-system2.3v5 (>=2.3), libsfml-graphicsv2.3v5 (>=2.3), libsfml-audio2.3v5 (>=2.3), libsfm-window2.3v5 (>2.3)")
349SET(CPACK_DEBIAN_PACKAGE_SHLIBDEPS 1) # generate better (atomatic?) dependecies
350SET(CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS_POLICY ">=")
351SET(CPACK_DEBIAN_PACKAGE_CONTROL_STRICT_PERMISSION TRUE)
352SET(CPACK_DEBIAN_PACKAGE_SECTION utils)
353SET(CPACK_DEBIAN_PACKAGE_HOMEPAGE "${PACKAGE_URL}")
354SET(CPACK_DEBIAN_PACKAGE_DESCRIPTION
355"${CPACK_PACKAGE_DESCRIPTION_SUMMARY}
356 This package contains the MARS Analysis Environment.")
357#indent the long description with spaces
358
359#CPACK_INSTALL_CMAKE_PROJECTS
360#List of four values that specify what project to install. Build directory, Project Name, Project Component, Directory.
361
362INCLUDE(CPack)
Note: See TracBrowser for help on using the repository browser.