-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathmakefile
162 lines (125 loc) · 4.76 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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
MSTDIR = ../Mosaist
MSTINCL = $(MSTDIR)/include
MSTSRC = $(MSTDIR)/src
MSTOBJS = $(MSTDIR)/objs
MSTLIB = $(MSTDIR)/lib
SASADIR = ../freesasa-2.0.3
SASAINCL = $(SASADIR)/src
SASASRC = $(SASADIR)/src
SASAOBJS = $(SASADIR)/src
SASALIB = $(SASADIR)/src
CC = g++
CFLAGS = -std=c++11 -g -gdwarf-3 -O -fPIC -I$(MSTINCL) -I$(SASAINCL) -I$(INCL)
MPICC = mpic++
MPIFLAGS = -std=c++0x -O
OUT = .
INCL = $(OUT)/inc
SRC = $(OUT)/src
LIB = $(OUT)/lib
OBJS = $(OUT)/objs
TEST = $(OUT)/tests
TESTFILES = $(OUT)/testfiles
SCRIPTS = $(OUT)/scripts
PROGS = $(OUT)/programs
HELPPROGS = $(OUT)/helperprograms
BIN = $(OUT)/bin
SENTINEL = .dir_sentinel
SRCDIR := $(OUT)/src
INCDIR := $(OUT)/include
BUILDDIR := $(OUT)/objs
SRCEXT := cpp
DEPEXT := d
OBJEXT := o
LIBFLAGS := -L$(MSTLIB) -lmst -lmstcondeg -lmstfuser -lmstoptim -lmstfasst -lmstmagic -ldtermen -L$(SASALIB) -lfreesasa
INCDEP :=
SOURCES := $(shell find $(SRCDIR) -not -path '*/\.*' -type f -name *.$(SRCEXT))
OBJECTS := $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(SOURCES:.$(SRCEXT)=.$(OBJEXT)))
PROGRAMS := $(patsubst $(PROGS)/%.$(SRCEXT),$(BIN)/%,$(shell find $(PROGS) -not -path '*/\.*' -type f -name *.$(SRCEXT)))
TESTPROGS := $(patsubst $(TEST)/%.$(SRCEXT),$(BIN)/%,$(shell find $(TEST) -not -path '*/\.*' -type f -name *.$(SRCEXT)))
HELPERPROGRAMS := $(patsubst $(HELPPROGS)/%.$(SRCEXT),$(BIN)/%,$(shell find $(HELPPROGS) -not -path '*/\.*' -type f -name *.$(SRCEXT)))
# Filter out python
SOURCES := $(filter-out $(SRCDIR)/python.cpp, $(SOURCES))
OBJECTS := $(filter-out $(BUILDDIR)/python.o, $(OBJECTS))
##############
# Main Targets
##############
.PHONY: all
all: $(PROGRAMS) $(TESTPROGS) $(HELPERPROGRAMS)
.PHONY: test
test: $(TESTPROGS)
.PHONY: remake
remake: cleaner all
.PHONY: clean
clean:
rm -rf $(BUILDDIR)
rm -rf $(BIN)
rm -rf $(OUT)/lib
######################
# Boost Python
######################
PYTHON_SUFFIX = $(shell $(pythonExec) -c "import sys; print(''.join(map(str,sys.version_info[0:2])));")
uname := $(shell uname -s)
PYTHON_SUFFIX = $(shell $(pythonExec) -c "import sys; print(''.join(map(str,sys.version_info[0:2])));")
ifeq ($(uname),Linux)
# TODO verify that this works on Linux
pythonExec := python3
PYLIB_PATH = $(shell $(pythonExec)-config --exec-prefix)/lib64
PYLIB = -L$(PYLIB_PATH) $(LIBFLAGS) -L$(LIB) -ldl -lboost_python$(PYTHON_SUFFIX) -lpeptide_design $(LDLIBS)
else # MacOS
# Requires python 3.8
pythonExec := python3.8
PYLIB_PATH = $(shell $(pythonExec) -c "import sysconfig; print(sysconfig.get_config_var('LIBDIR'));")
PYLIB = -L$(PYLIB_PATH) $(LIBFLAGS) -L$(LIB) -ldl -framework CoreFoundation -undefined dynamic_lookup -lboost_python$(PYTHON_SUFFIX) -lpeptide_design $(LDLIBS)
endif
PY_INCLUDES = $(shell $(pythonExec)-config --includes)
PY_SITE_INCLUDE_PARENT = $(shell $(pythonExec)-config --exec-prefix)
PYFLAGS = $(PY_INCLUDES) -I$(PY_SITE_INCLUDE_PARENT)/include -O3 -fPIC -std=c++11 -I$(INCL) -I$(MSTINCL)
# make the boost.python shared object
python: $(OUT)/lib/peptide_design.so
$(BUILDDIR)/python.o: $(SRCDIR)/python.cpp # $(OBJECTS)
$(CC) $(PYFLAGS) -c -o $@ $<
$(OUT)/lib/peptide_design.so: $(BUILDDIR)/python.o $(OBJECTS) lib
$(CC) -shared -o $@ $< $(PYLIB) -Wl,-rpath,$(PYLIB_PATH)
.PHONY: lib
lib: $(OUT)/lib/libpeptide_design.a
$(OUT)/lib/libpeptide_design.a: directories $(OBJECTS)
# Remove the Python.o file (it will need to be rebuilt anyway)
# rm -f $(BUILDDIR)/python.o
ar rs $(OUT)/lib/libpeptide_design.a $(OBJECTS) $(MSTOBJS)/*.o
######################
# Make the Directories
######################
directories: $(BIN)/$(SENTINEL) $(BUILDDIR)/$(SENTINEL) $(OUT)/lib/$(SENTINEL)
touch $@
$(BIN)/$(SENTINEL):
mkdir -p $(BIN)
touch $(BIN)/$(SENTINEL)
$(BUILDDIR)/$(SENTINEL):
mkdir -p $(BUILDDIR)
touch $(BUILDDIR)/$(SENTINEL)
$(OUT)/lib/$(SENTINEL):
mkdir -p $(OUT)/lib
touch $(OUT)/lib/$(SENTINEL)
#######################
# Building Source Files
#######################
-include $(OBJECTS:.$(OBJEXT)=.$(DEPEXT))
$(BIN)/%: $(PROGS)/%.$(SRCEXT) $(OBJECTS)
$(CC) $(CFLAGS) $^ $(LIBFLAGS) -o $@
$(BIN)/%: $(TEST)/%.$(SRCEXT) $(OBJECTS)
$(CC) $(CFLAGS) $^ $(LIBFLAGS) -o $@
$(BIN)/%: $(HELPPROGS)/%.$(SRCEXT) $(OBJECTS)
$(CC) $(CFLAGS) $^ $(LIBFLAGS) -o $@
$(BUILDDIR)/%.$(OBJEXT): $(SRCDIR)/%.$(SRCEXT) directories
@mkdir -p $(dir $@)
$(CC) $(CFLAGS) -c -o $@ $<
@$(CC) $(CFLAGS) $(INCDEP) -MM $(SRCDIR)/$*.$(SRCEXT) > $(BUILDDIR)/$*.$(DEPEXT)
@cp -f $(BUILDDIR)/$*.$(DEPEXT) $(BUILDDIR)/$*.$(DEPEXT).tmp
@sed -e 's|.*:|$(BUILDDIR)/$*.$(OBJEXT):|' < $(BUILDDIR)/$*.$(DEPEXT).tmp > $(BUILDDIR)/$*.$(DEPEXT)
@sed -e 's/.*://' -e 's/\\$$//' < $(BUILDDIR)/$*.$(DEPEXT).tmp | fmt -1 | sed -e 's/^ *//' -e 's/$$/:/' >> $(BUILDDIR)/$*.$(DEPEXT)
@rm -f $(BUILDDIR)/$*.$(DEPEXT).tmp
#######
# Debug
#######
.PHONY: print-%
print-% : ; @echo $* = $($*)