source: trunk/Mars/CMakeLists.txt@ 19311

Last change on this file since 19311 was 19308, checked in by tbretz, 6 years ago
Create a version of dohtml.C with the correct paths.
File size: 12.6 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#IF(EXISTS "$ENV{ROOTSYS}/ROOTConfig.cmake")
110IF(DEFINED ENV{CMAKE_PREFIX_PATH}) # -- This is if compiled with cmake --
111 # You need to tell CMake where to find the ROOT installation. This can be done in a number of ways:
112 # - ROOT built with classic configure/make use the provided $ROOTSYS/etc/cmake/FindROOT.cmake
113 # - ROOT built with CMake. Add in CMAKE_PREFIX_PATH the installation prefix for ROOT
114 LIST(APPEND CMAKE_PREFIX_PATH $ENV{ROOTSYS})
115 #---Locate the ROOT package and defines a number of variables (e.g. ROOT_INCLUDE_DIRS)
116 FIND_PACKAGE(ROOT REQUIRED COMPONENTS Gui Minuit ASImage HistPainter)
117 #---Define useful ROOT functions and macros (e.g. ROOT_GENERATE_DICTIONARY)
118 INCLUDE(${ROOT_USE_FILE})
119ELSE()
120 # You need to tell CMake where to find the ROOT installation. This can be done in a number of ways:
121 # - ROOT built with classic configure/make use the provided $ROOTSYS/etc/cmake/FindROOT.cmake
122 # - ROOT built with CMake. Add in CMAKE_PREFIX_PATH the installation prefix for ROOT
123 SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "$ENV{ROOTSYS}/etc/cmake")
124 #---Locate the ROOT package and defines a number of variables (e.g. ROOT_INCLUDE_DIRS)
125 FIND_PACKAGE(ROOT REQUIRED COMPONENTS Gui Minuit ASImage HistPainter)
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.