source: trunk/Mars/CMakeLists.txt@ 19240

Last change on this file since 19240 was 19224, checked in by tbretz, 6 years ago
As a default use 'clang', 'gcc' and 'cc'
File size: 10.5 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# =========== help2man ============
57FIND_PROGRAM(HELP2MAN_EXECUTABLE help2man)
58
59# =========== pkg-config ============
60FIND_PACKAGE(PkgConfig)
61FIND_PACKAGE(PackageHandleStandardArgs)
62
63
64# ============= libnova ==============
65
66PKG_CHECK_MODULES(Nova Nova)
67
68# Try to locate the package in the default path
69# and in the path provided by pkg-config
70FIND_PATH(NOVA_INCLUDE_DIR NAMES libnova/libnova.h PATHS ${NOVA_INCLUDE_DIRS})
71FIND_LIBRARY(NOVA_LIBRARY NAMES nova PATHS ${NOVA_LIBRARY_DIRS})
72
73# Check if NOVA_LIBARARY and NOVA_INCLUDE_DIR is set
74# Print a message otherwise
75FIND_PACKAGE_HANDLE_STANDARD_ARGS(Nova DEFAULT_MSG NOVA_LIBRARY NOVA_INCLUDE_DIR)
76
77# Mark those variables to be displayed as 'advanced' in the GUI
78MARK_AS_ADVANCED(NOVA_LIBRARY NOVA_INCLUDE_DIR)
79
80# handle success
81IF(NOVA_FOUND AND NOT NOVA_FIND_QUIETLY)
82 MESSAGE(STATUS "Found Nova ${NOVA_LIBRARY} in ${NOVA_INCLUDE_DIR}")
83ENDIF()
84
85
86# ============== libz ================
87
88FIND_PACKAGE(ZLIB REQUIRED)
89
90
91# =========== Enable C++11 ===========
92
93SET(CMAKE_CXX_STANDARD 11)
94SET(CMAKE_CXX_FLAGS
95 "${CMAKE_CXX_FLAGS} -Wall -Winit-self -Wpointer-arith \
96 -Wcast-align -Wformat -Woverloaded-virtual \
97 -Wnon-virtual-dtor -Wshadow -fPIC") # -Wextra
98
99SET(CMAKE_CXX_FLAGS
100 "${CMAKE_CXX_FLAGS} \
101 -DMARSVER=\\\"1.0\\\" -D_REENTRANT -D__MARS__ -D__LINUX__ \
102 -DPACKAGE_VERSION=\\\"1.0\\\" -DREVISION=\\\"1.0\\\" \
103 -DPACKAGE_NAME=\\\"MARS\\\" -DHAVE_ZLIB")
104
105
106# --------- config.h -------------
107
108#CONFIGURE_FILE("${PROJECT_SOURCE_DIR}/config.h.in" "${PROJECT_BINARY_DIR}/config.h")
109#INCLUDE_DIRECTORIES("${PROJECT_BINARY_DIR}")
110
111SET(CMAKE_MODULE_PATH $ENV{ROOTSYS}/etc/cmake ${CMAKE_MODULE_PATH})
112
113
114# You need to tell CMake where to find the ROOT installation. This can be done in a number of ways:
115# - ROOT built with classic configure/make use the provided $ROOTSYS/etc/cmake/FindROOT.cmake
116# - ROOT built with CMake. Add in CMAKE_PREFIX_PATH the installation prefix for ROOT
117#LIST(APPEND CMAKE_PREFIX_PATH $ENV{ROOTSYS})
118
119#---Locate the ROOT package and defines a number of variables (e.g. ROOT_INCLUDE_DIRS)
120
121# -lGui -lCore -lCint -lRIO -lNet -lHist -lGraf -lGraf3d -lGpad -lTree
122# -lRint -lPostscript -lMatrix -lPhysics -lMathCore -lThread
123# -lASImage -lMinuit -lHistPainter -lThread
124
125FIND_PACKAGE(ROOT REQUIRED COMPONENTS Gui Minuit)
126
127
128#MESSAGE("INCL_DIRS: ${ROOT_INCLUDE_DIRS}")
129#MESSAGE("LIBS: ${ROOT_LIBRARIES}")
130#MESSAGE("DEFS: ${ROOT_DEFINITIONS}")
131#MESSAGE("CXXFLAGS: ${ROOT_CXX_FLAGS}")
132#MESSAGE("CXFLAGS: ${ROOT_CC_FLAGS}")
133#MESSAGE("FOUND: ${ROOT_FOUND}")
134#MESSAGE("FILE: ${ROOT_USE_FILE}")
135#MESSAGE("DIR: ${CMAKE_CURRENT_SOURCE_DIR}")
136#ROOT_<library>_LIBRARY PATH Full path for each of the ROOT libraries listed in COMPONENTS
137#ROOT_<command>_CMD PATH Full path for each ROOT executable (rootcling, root, hadd, etc.)
138#ROOT_<option>_FOUND BOOL True for each enabled build option (e.g. cocoa, python, xrootd, etc.)
139
140#---Define useful ROOT functions and macros (e.g. ROOT_GENERATE_DICTIONARY)
141#INCLUDE(${ROOT_USE_FILE})
142
143# function ROOT_GENERATE_DICTIONARY( dictionary
144# header1 header2 ...
145# LINKDEF linkdef1 ...
146# OPTIONS opt1...)
147
148# -------------------------------------------------------
149
150FILE(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/dictionary)
151
152MACRO(SRCFILES subdir)
153
154 EXECUTE_PROCESS(COMMAND
155 ${PROJECT_SOURCE_DIR}/Makefile.extract.sh ${subdir}
156 WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/${subdir}
157 OUTPUT_VARIABLE _HEADERS)
158
159 SEPARATE_ARGUMENTS(_HEADERS)
160
161 LIST(GET _HEADERS 0 _CINT)
162 LIST(REMOVE_AT _HEADERS 0)
163
164 SET(_SRCLIST ${_HEADERS})
165
166 STRING(REPLACE "${subdir}/" " " _HEADERS ${_HEADERS}) # Remove directory
167 STRING(REPLACE ".cc" ".h" _HEADERS ${_HEADERS}) # change extension
168 STRING(REPLACE ".cxx" ".hxx" _HEADERS ${_HEADERS}) # special for files in mmc
169
170 SEPARATE_ARGUMENTS(_HEADERS)
171
172 ROOT_GENERATE_DICTIONARY(dictionary/${_CINT} ${_HEADERS} ${_CINT}Incl.h LINKDEF ${_CINT}LinkDef.h OPTIONS -p)
173 TARGET_SOURCES(mars PRIVATE dictionary/${_CINT}.cxx ${_SRCLIST})
174
175 INSTALL(DIRECTORY ${subdir}/ DESTINATION "include" FILES_MATCHING PATTERN "*.h")
176
177ENDMACRO()
178
179# -------------------------------------------------------
180
181#SET(DIRECTORIES mmc)
182
183SET(DIRECTORIES
184 manalysis
185 mastro
186 mbadpixels
187 mbase
188 mcalib
189 mcamera
190 mcorsika
191 mdata
192 mdrs
193 melectronics
194 mextralgo
195 mfbase
196 mfileio
197 mfilter
198 mgeom
199 mgui
200 mhbase
201 mhcalib
202 mhflux
203 mhft
204 mhist
205 mhvstime
206 mimage
207 mjobs
208 mjoptim
209 mjtrain
210 mmain
211 mmc
212 mmovie
213 mmuon
214 mpedestal
215 mpointing
216 mranforest
217 mraw
218 mreport
219 msignal
220 msim
221 msimcamera
222 msimreflector
223 msql
224 mtools
225 mtrigger
226)
227
228INCLUDE_DIRECTORIES(${ROOT_INCLUDE_DIRS} ${DIRECTORIES} mcore .)
229
230ROOT_GENERATE_DICTIONARY(dictionary/MARS
231 factofits.h
232 factfits.h
233 DrsCalib.h
234 PixelMap.h
235 Interpolator2D.h
236 nova.h
237 Prediction.h
238 MIncl.h
239 LINKDEF MLinkDef.h
240 OPTIONS -p -D__MARS__ -DHAVE_ZLIB)
241
242ADD_LIBRARY(mars SHARED dictionary/MARS.cxx) # CMAKE_POSITION_INDEPENDENT_CODE
243TARGET_LINK_LIBRARIES(mars
244 ZLIB::ZLIB
245 ${NOVA_LIBRARY}
246 ${ROOT_LIBRARIES})
247
248
249FOREACH(DIR ${DIRECTORIES})
250 MESSAGE(STATUS "Reading source list from ${DIR}/Makefile")
251 SRCFILES(${DIR})
252ENDFOREACH()
253
254ADD_CUSTOM_COMMAND(TARGET mars POST_BUILD
255 COMMAND ln -sf ${PROJECT_BINARY_DIR}/libmars.so ${PROJECT_SOURCE_DIR}/
256 COMMENT "Creating symlink for libmars.so to ${PROJECT_BINARY_DIR}")
257
258#---Create a shared library with geneated dictionary
259#ADD_LIBRARY(Event SHARED Event.cxx G__Event.cxx)
260#TARGET_LINK_LIBRARIES(Event ${ROOT_LIBRARIES})
261
262#---Create a main program using the library
263#ADD_EXECUTABLE(Main MainEvent.cxx)
264#TARGET_LINK_LIBRARIES(Main Event)
265
266
267# *********************************
268# ************ Packaging **********
269# *********************************
270
271#SET(PKG_SHARE "${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME}")
272#SET(PKG_APPS "${CMAKE_INSTALL_DATAROOTDIR}/applications")
273#SET(PKG_PIXMAPS "${CMAKE_INSTALL_DATAROOTDIR}/pixmaps")
274
275# ====== Installation targets =====
276
277#INSTALL(TARGETS mars DESTINATION "${CMAKE_INSTALL_BINDIR}")
278INSTALL(TARGETS mars DESTINATION ".")
279INSTALL(FILES .rootrc DESTINATION ".")
280INSTALL(FILES marslogo.xpm DESTINATION ".")
281INSTALL(DIRECTORY macros DESTINATION "." FILES_MATCHING PATTERN "*.C")
282INSTALL(DIRECTORY fact DESTINATION "." FILES_MATCHING PATTERN "*.C")
283INSTALL(DIRECTORY datacenter DESTINATION ".")
284INSTALL(DIRECTORY scripts DESTINATION ".")
285INSTALL(DIRECTORY resources DESTINATION "." FILES_MATCHING PATTERN "*.rc" PATTERN "*.txt")
286INSTALL(DIRECTORY resmc DESTINATION "." FILES_MATCHING PATTERN "*" )
287INSTALL(DIRECTORY mcore/ DESTINATION "include" FILES_MATCHING PATTERN "*.h")
288
289
290# ======== General packaging ======
291# https://cmake.org/cmake/help/latest/module/CPack.html
292
293INCLUDE(InstallRequiredSystemLibraries)
294
295# SET(CPACK_STRIP_FILES ON) # Strip debug sysmbold from files
296
297SET(CPACK_PACKAGE_VERSION "${mars_VERSION}")
298SET(CPACK_PACKAGE_CONTACT "${PACKAGE_BUGREPORT}")
299SET(CPACK_PACKAGE_MAINTAINER "${PACKAGE_MAINTAINER}")
300#SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/COPYING")
301#SET(CPACK_PACKAGE_VENDOR "Me, myself, and I")
302
303
304SET(CPACK_SOURCE_IGNORE_FILES "/old/;/build/;/[.].*/;/autom4te[.]cache/;.*~;.log$")
305
306# Maybe the text displayed in synaptic?
307#SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README")
308SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "MARS - Environment")
309#CPACK_RESOURCE_FILE_README ReadMe file to be embedded in the installer.
310
311SET(CPACK_GENERATOR TBZ2) # TGZ DEB
312#SET(CPACK_SOURCE_GENERATOR TBZ2) # TGZ
313#SET(CPACK_PROJECT_CONFIG_FILE ${CMAKE_SOURCE_DIR}/cmake/Package.txt)
314#SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/Copyright.txt")
315
316
317# ======== Debian packaging =======
318# https://cmake.org/cmake/help/latest/module/CPackDeb.html
319# https://www.debian.org/doc/debian-policy
320
321#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)")
322SET(CPACK_DEBIAN_PACKAGE_SHLIBDEPS 1) # generate better (atomatic?) dependecies
323SET(CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS_POLICY ">=")
324SET(CPACK_DEBIAN_PACKAGE_CONTROL_STRICT_PERMISSION TRUE)
325SET(CPACK_DEBIAN_PACKAGE_SECTION utils)
326SET(CPACK_DEBIAN_PACKAGE_HOMEPAGE "${PACKAGE_URL}")
327SET(CPACK_DEBIAN_PACKAGE_DESCRIPTION
328"${CPACK_PACKAGE_DESCRIPTION_SUMMARY}
329 This package contains the MARS Analysis Environment.")
330#indent the long description with spaces
331
332#CPACK_INSTALL_CMAKE_PROJECTS
333#List of four values that specify what project to install. Build directory, Project Name, Project Component, Directory.
334
335INCLUDE(CPack)
Note: See TracBrowser for help on using the repository browser.