-
Notifications
You must be signed in to change notification settings - Fork 1
/
Makefile
136 lines (104 loc) · 3.71 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
# Debug flags
DEBUGFLAGS := -D_DEBUG -g
# Compile flags
CXXFLAGS := -Wall -Wextra -O3 -Werror -std=c++11 -pedantic -pthread -fPIC -Wno-strict-aliasing
LDFLAGS := -lpthread -lm -fPIC -L.
# Source dir
SRCDIR = src
# Install prefix
PREFIX := /usr/local
# library name
LIB_NAME = transputation
# Get Unix name
UNAME != uname
UNAME ?= $(shell uname)
# set prefixes
INC_PREFIX = $(PREFIX)/include
LIB_PREFIX = $(PREFIX)/lib
# Make GNU make compatible with BSD make
.ALLSRC ?= $^
.TARGET ?= $@
# dylib for macOS otherwise so
DYLIB_SUFFIX != test $(UNAME) = Darwin && echo dylib || echo so
DYLIB_SUFFIX ?= $(shell test $(UNAME) = Darwin && echo dylib || echo so)
# just for completeness the suffix for static libraries
STLIB_SUFFIX := a
# set the install command
INSTALL ?= install
# nicer output
STATUS_ != test `tput colors` -gt 0 && \
echo "printf \" [1;36m%-9s[0m [1m%s[0m\\\\n\"" || \
echo "printf \" %-9s%s\\\\n\""
STATUS_ ?= $(shell test `tput colors` -gt 0 && \
echo "printf \" [1;36m%-9s[0m [1m%s[0m\\\\n\"" || \
echo "printf \" %-9s%s\\\\n\"")
STATUS = @$(STATUS_)
# how to detect main files
MAIN = "main([^)]"
# header files
HEADERS != find . -name '*.h'
HEADERS ?= $(shell find . -name '*.h')
# source files
CSRCS != grep -RlL --include="*.c" $(MAIN) $(SRCDIR)/* || echo ""
CSRCS ?= $(shell grep -RlL --include="*.c" $(MAIN) $(SRCDIR)/* )
CCSRCS != grep -RlL --include="*.cc" $(MAIN) $(SRCDIR)/* || echo ""
CCSRCS ?= $(shell grep -RlL --include="*.cc" $(MAIN) $(SRCDIR)/* )
CPPSRCS != grep -RlL --include="*.cpp" $(MAIN) $(SRCDIR)/* || echo ""
CPPSRCS ?= $(shell grep -RlL --include="*.cpp" $(MAIN) $(SRCDIR)/* )
# targets sources
TARGET_SRCS != grep -Rl --include="*.cc" --include="*.cpp" --include="*.c" \
$(MAIN) $(SRCDIR)/* || echo ""
TARGET_SRCS ?= $(shell grep -Rl --include="*.cc" --include="*.cpp" \
--include="*.c" $(MAIN) $(SRCDIR)/* )
# object files
OBJS := $(CSRCS:.c=.o) $(CCSRCS:.cc=.o) $(CPPSRCS:.cpp=.o)
TARGET_OBJS := $(TARGET_SRCS:.cc=.o)
# targets
TARGETS = $(TARGET_SRCS:.cc=)
LIB_TARGETS != test $(LIB_NAME) && \
echo $(SRCDIR)/lib$(LIB_NAME).a $(SRCDIR)/lib$(LIB_NAME).$(DYLIB_SUFFIX) \
|| echo ""
LIB_TARGETS ?= $(shell test $(LIB_NAME) && \
echo $(SRCDIR)/lib$(LIB_NAME).a $(SRCDIR)/lib$(LIB_NAME).$(DYLIB_SUFFIX))
# enable debug options when DEBUG is set
_DEBUGFLAGS != test $(DEBUG) && echo $(DEBUGFLAGS) || echo ""
_DEBUGFLAGS := $(shell test $(DEBUG) && echo $(DEBUGFLAGS))
CXXFLAGS += $(_DEBUGFLAGS)
.SUFFIXES: .cc .c .cpp .o .a .dylib .so
.PHONY: all clean test
all: $(TARGETS) $(LIB_TARGETS)
@echo done.
.c.o:
$(CC) $(INC) -c $(CFLAGS) -o $(.TARGET) $(.ALLSRC)
.cc.o:
$(CXX) $(INC) -c $(CXXFLAGS) -o $(.TARGET) $(.ALLSRC)
.cpp.o:
$(CXX) $(INC) -c $(CXXFLAGS) -o $(.TARGET) $(.ALLSRC)
$(SRCDIR)/lib$(LIB_NAME).dylib: $(OBJS)
$(CXX) -dynamiclib -o $(.TARGET) $(OBJS)
$(SRCDIR)/lib$(LIB_NAME).so: $(OBJS)
$(CXX) -shared -o $(.TARGET) $(LDFLAGS) $(OBJS)
$(SRCDIR)/lib$(LIB_NAME).a: $(OBJS)
$(AR) rcs $(.TARGET) $(OBJS)
$(TARGETS): $(TARGET_OBJS) $(OBJS)
$(CXX) $(INC) -o $(.TARGET) $(.TARGET).o $(OBJS) $(LDFLAGS)
clean:
rm -f $(OBJS) $(TARGETS) $(TARGETS:=.o) $(LIB_TARGETS)
test: $(TARGETS)
for test in tests/*; do\
$$test || exit 1;\
done
install: $(LIB_TARGETS)
for file in `find $(SRCDIR) -name '*.h'`; do\
target=$(INC_PREFIX)/$(LIB_NAME)/`echo $${file} | sed 's#$(SRCDIR)/*##g'`;\
install -d -m644 `dirname $${target}`;\
install -c -m644 $${file} $${target};\
done
for file in $(LIB_TARGETS); do\
target=$(LIB_PREFIX)/`echo $${file} | sed 's#$(SRCDIR)/*##g'`;\
install -c -m644 $${file} $${target};\
done
uninstall:
test $(INC_PREFIX) && test $(LIB_NAME) && rm -rf $(INC_PREFIX)/$(LIB_NAME)
test $(LIB_PREFIX) && test $(LIB_NAME) &&\
rm -rf $(LIB_PREFIX)/lib$(LIB_NAME).*