forked from gcowan/RapidFit
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathMakefile
144 lines (113 loc) · 6.43 KB
/
Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# $Id: Makefile,v 1.30 2009/11/11 17:18:14 gcowan Exp $
SHELL=/bin/bash
UNAME=$(shell uname -s )
CC=g++ -fdiagnostics-color=always
# Location of compiled "common" libraries from ssh://[email protected]:7999/admorris/common.git
COMMONDIR = common
COMCXXFLAGS = $(shell make -sC $(COMMONDIR) cflags)
COMLIBS = $(shell make -sC $(COMMONDIR) libs)
COMLIBDIR = $(shell make -sC $(COMMONDIR) libdir)
COMLIBFLAGS = -L$(COMLIBDIR) -Wl,--as-needed $(COMLIBS) -Wl,-rpath,$(COMLIBDIR)
# Include Root files as system headers as they're NOT standards complient and we do not want to waste time fixing them!
# ROOT has some broken backwards compatability for OSX so won't claim to be a set of system headers
ROOTCFLAGS = $(shell root-config --cflags)
ROOTLIBS = $(shell root-config --libs)
ROOTLIBDIR = $(shell root-config --libdir)
ROOTGLIBS = $(shell root-config --glibs)
# On some Systems with Mathmore compiled, sometimes things need to be resolved against it... I don't know why
EXTRA_ROOTLIBS=-lTreePlayer -lThread -lMinuit -lMinuit2 -lRooFit -lRooStats -lRooFitCore -lFoam -lMathMore
# Command Line Tools
CXX = $(CC) $(shell if [ "$(shell root-config --arch | grep 32)" = "" ]; then echo ""; else echo "--arch=i386"; fi)
RM = rm -f
CXXFLAGS_BASE_MINIMAL = -D_GNU_SOURCE -D__USE_GNU -fPIC
CXXFLAGS_BASE_WARNINGS = -Werror -Wall -Wextra -Wno-non-virtual-dtor -Wno-reorder -Wshadow -Wmissing-noreturn -Wcast-align
# Compiler Flags
CXXFLAGS_BASE_COMMON = $(CXXFLAGS_BASE_MINIMAL) -D__ROOFIT_NOBANNER $(CXXFLAGS_BASE_WARNINGS)
CXXFLAGS_BASE = $(CXXFLAGS_BASE_COMMON) -O3 -msse2 -msse3 -m3dnow -ftree-vectorize -finline-limit=2000 -fprefetch-loop-arrays -fmerge-all-constants
# Some Useful global variables, makes this file MUCH easier to maintain
SRCEXT = cpp
HDREXT = h
SRCDIR = framework/src
SRCPDFDIR = pdfs/src
INCDIR = framework/include
INCPDFDIR = pdfs/include
INCGSL = $(shell if command -v gsl-config >/dev/null 2>&1; then echo "$(shell gsl-config --cflags)"; else echo ""; fi )
LINKGSL = $(shell if command -v gsl-config >/dev/null 2>&1; then echo "$(shell gsl-config --libs)"; else echo ""; fi )
USE_GSL = $(shell if command -v gsl-config >/dev/null 2>&1; then echo "-D__RAPIDFIT_USE_GSL"; else echo ""; fi )
OBJDIR = framework/build
OBJPDFDIR = pdfs/build
EXEDIR = bin
LIBDIR = lib
SRCDALITZEXT = cc
HDRDALITZEXT = hh
SRCDALITZDIR = pdfs/dalitz/src
INCDALITZDIR = pdfs/dalitz/include
OBJDALITZDIR = pdfs/dalitz/build
# Source Files to be Built ignoring all files in 'unused' and the RapidRun source for ROOT linking
SRCS := $(shell find $(SRCDIR) -name '*.$(SRCEXT)' | grep -v 'unused' )
PDFSRCS := $(shell find $(SRCPDFDIR) -name '*.$(SRCEXT)' | grep -v 'unused' )
DALITZSRCS := $(shell find $(SRCDALITZDIR) -name '*.$(SRCDALITZEXT)' | grep -v 'unused' )
# Absolute Paths of headers ignoring the LinkDef written for ROOT and ignoring unused code
HEADERS := $(shell find $(INCDIR) -name '*.$(HDREXT)' | grep -v 'unused' | grep -v 'LinkDef' )
PDFHEAD := $(shell find $(INCPDFDIR) -name '*.$(HDREXT)' )
DALITZHEAD := $(shell find $(INCDALITZDIR) -name '*.$(HDRDALITZEXT)' )
# Binary Objects to make in the build
OBJS := $(patsubst $(SRCDIR)/%.$(SRCEXT),$(OBJDIR)/%.o,$(SRCS))
PDFOBJS := $(patsubst $(SRCPDFDIR)/%.$(SRCEXT),$(OBJPDFDIR)/%.o,$(PDFSRCS))
DALITZOBJS := $(patsubst $(SRCDALITZDIR)/%.$(SRCDALITZEXT),$(OBJDALITZDIR)/%.o,$(DALITZSRCS))
#################
##Dependencies
LINKFLAGS = -Wl,--no-undefined -Wl,--no-allow-shlib-undefined -lpthread
LIBS=-lstdc++
CXXFLAGS = $(CXXFLAGS_BASE_COMMON) -I$(INCDIR) -I$(INCPDFDIR) -I$(INCDALITZDIR) -I$(INCGSL) $(ROOTCFLAGS) $(COMCXXFLAGS)
#CHECKGCCABI := $(shell expr `gcc -dumpversion | cut -f1 -d.` \>= 5)
#ifeq ("$(CHECKGCCABI)","1")
# CXXFLAGS+= -D_GLIBCXX_USE_CXX11_ABI=0
# LINKFLAGS+= -D_GLIBCXX_USE_CXX11_ABI=0
#endif
LINKFLAGS += $(USE_GSL) $(LINKGSL) $(ROOTLIBS) $(EXTRA_ROOTLIBS) $(COMLIBFLAGS) -Wl,-rpath,$(COMLIBDIR):$(ROOTLIBDIR)
.PHONY : all clean extra lib $(COMMONDIR)
# Default build command when someone asks for 'make'
all : $(EXEDIR)/fitting $(COMMONDIR)
$(COMMONDIR) :
make -C $@
$(OBJDALITZDIR)/%.o : $(SRCDALITZDIR)/%.$(SRCDALITZEXT) $(INCDALITZDIR)/%.$(HDRDALITZEXT)
@echo "Compiling $@"
@$(CXX) $(CXXFLAGS) $(USE_GSL) $(INCGSL) -c $< -o $@
$(OBJPDFDIR)/%.o : $(SRCPDFDIR)/%.$(SRCEXT) $(INCPDFDIR)/%.$(HDREXT) $(DALITZOBJS)
@echo "Compiling $@"
@$(CXX) $(CXXFLAGS) $(USE_GSL) $(INCGSL) -c $< -o $@
$(OBJDIR)/%.o : $(SRCDIR)/%.$(SRCEXT) $(INCDIR)/%.$(HDREXT)
@echo "Compiling $@"
@$(CXX) $(CXXFLAGS) $(USE_GSL) $(INCGSL) -c $< -o $@
# Main Build of RapidFit Binary
$(EXEDIR)/fitting : $(OBJS) $(PDFOBJS) $(DALITZOBJS) $(OBJDIR)/rapidfit_dict.o | $(COMMONDIR)
@echo "Linking $@"
@$(CXX) $(OBJDIR)/*.o $(OBJPDFDIR)/*.o $(OBJDALITZDIR)/*.o -o $@ $(LINKFLAGS)
chmod +t $(EXEDIR)/fitting
# Cleanup
clean :
$(RM) $(EXEDIR)/* $(OBJDIR)/* $(OBJPDFDIR)/* $(OBJDALITZDIR)/* $(LIBDIR)/*
make -C $(COMMONDIR) clean
extra: $(EXEDIR)/Per-Event $(EXEDIR)/lifetime_tool $(EXEDIR)/weighted $(EXEDIR)/ApplyWeights $(EXEDIR)/Compare $(EXEDIR)/tupleDiff $(EXEDIR)/AngularDist $(EXEDIR)/plotDists
# For Compiling RapidFit as a library to use within CINT which makes life easier on the grid... (supposedly)
# make lib
lib: $(LIBDIR)/libRapidRun.so
# This command will generate a C++ file which interfaces the rest of humanity with root...
# It requires the explicit paths of all files, or that you remain in the same working directory at all times during the build process
# We want to place the output dictionary in the Build directory as this is CODE that is NOT to be editted by the $USER!
$(OBJDIR)/rapidfit_dict.cpp: framework/include/RapidRun.h framework/include/LinkDef.h
@echo "Generating $@"
rootcint -f $(OBJDIR)/rapidfit_dict.cpp -c $^
# Compile the class that root has generated for us which is the linker interface to root (i.e. dictionaries & such)
$(OBJDIR)/rapidfit_dict.o: $(OBJDIR)/rapidfit_dict.cpp
@echo "Compiling $@"
@$(CXX) $(CXXFLAGS) -o $@ -I. -c $<
# Class which has a dictionary generated for it, think of this as the equivalent to int main() in a CINT-y Universe
$(OBJDIR)/RapidRun.o: $(SRCDIR)/RapidRun.cpp
@echo "Compiling $@"
@$(CXX) $(CXXFLAGS) -o $@ -c $<
# Finally, Compile RapidFit as a library making use of the existing binaries for other classes
$(LIBDIR)/libRapidRun.so: $(OBJDIR)/RapidRun.o $(OBJS) $(PDFOBJS) $(DALITZOBJS) $(OBJDIR)/rapidfit_dict.o
@echo "Linking $@"
@$(CXX) -shared $(OBJDIR)/*.o $(OBJPDFDIR)/*.o $(OBJDALITZDIR)/*.o -o $@ $(LINKFLAGS)