diff options
author | Bjoern B. Brandenburg <bbb@cs.unc.edu> | 2010-11-06 14:34:18 -0400 |
---|---|---|
committer | Bjoern B. Brandenburg <bbb@cs.unc.edu> | 2010-11-09 16:35:32 -0500 |
commit | 35b88760be5b5dbda859f4697702efc0b3cd2663 (patch) | |
tree | c8dd81078242dc41f4f5e765b52e59e944996873 /Makefile | |
parent | b8c51805f5c71d1921ac7315125723b1e175ca5e (diff) |
refactor: switch back from SCons to make
We originally switched from make to scons because
1) our makefiles were not very good;
2) SCons promised to make maintaining the build system simpler.
Unfortunately, SCons has become more and more difficult to deal with
as we moved to supporting several architecture and cross compilation,
to the extend that we ended up re-creating make functionality in SCons.
So let's switch back to make using a "clean" Makefile.
Thanks a lot to Andrea Bastoni and Chris Kenna for feedback on
previous iterations of these patches.
Diffstat (limited to 'Makefile')
-rw-r--r-- | Makefile | 183 |
1 files changed, 171 insertions, 12 deletions
@@ -1,17 +1,176 @@ | |||
1 | .PHONY: all-32 all-64 all-sparc clean purge | 1 | # figure out what kind of host we are running on |
2 | host-arch := $(shell uname -m | \ | ||
3 | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/) | ||
2 | 4 | ||
3 | all-32: | 5 | # ############################################################################## |
4 | echo "Legacy warning: Building is done with scons." | 6 | # User variables |
5 | ARCH=x86 scons | ||
6 | all-64: | ||
7 | ARCH=x86_64 scons | ||
8 | 7 | ||
9 | all-sparc: | 8 | # user variables can be specified in the environment or in a .config file |
10 | ARCH=sparc64 scons | 9 | -include .config |
10 | |||
11 | # ARCH -- what architecture are we compiling for? | ||
12 | ARCH ?= ${host-arch} | ||
13 | |||
14 | # LITMUS_KERNEL -- where to find the litmus kernel? | ||
15 | LITMUS_KERNEL ?= ../litmus2010 | ||
16 | |||
17 | |||
18 | # ############################################################################## | ||
19 | # Internal configuration. | ||
20 | |||
21 | # compiler flags | ||
22 | flags-debug = -Wall -g -Wdeclaration-after-statement | ||
23 | flags-api = -D_XOPEN_SOURCE=600 -D_GNU_SOURCE | ||
24 | flags-link-rt = -static | ||
25 | |||
26 | # architecture-specific flags | ||
27 | flags-i386 = -m32 | ||
28 | flags-x86_64 = -m64 | ||
29 | flags-sparc64 = -mcpu=v9 -m64 | ||
30 | # default: none | ||
31 | |||
32 | # name of the directory that has the arch headers in the Linux source | ||
33 | include-i386 = x86 | ||
34 | include-x86_64 = x86 | ||
35 | include-sparc64 = sparc | ||
36 | # default: the arch name | ||
37 | include-${ARCH} ?= ${ARCH} | ||
38 | |||
39 | # where to find header files | ||
40 | headers = -Iinclude \ | ||
41 | -I${LITMUS_KERNEL}/include/ \ | ||
42 | -I${LITMUS_KERNEL}/arch/${include-${ARCH}}/include | ||
43 | |||
44 | # combine options | ||
45 | CPPFLAGS = ${flags-api} ${flags-${ARCH}} ${headers} | ||
46 | CFLAGS = ${flags-debug} | ||
47 | LDFLAGS = ${flags-${ARCH}} | ||
48 | |||
49 | # how to link against liblitmus | ||
50 | liblitmus-flags = -L. -llitmus | ||
51 | |||
52 | # Force gcc instead of cc, but let the user specify a more specific version if | ||
53 | # desired. | ||
54 | ifeq (${CC},cc) | ||
55 | CC = gcc | ||
56 | endif | ||
57 | |||
58 | # incorporate cross-compiler (if any) | ||
59 | CC := ${CROSS_COMPILE}${CC} | ||
60 | LD := ${CROSS_COMPILE}${LD} | ||
61 | AR := ${CROSS_COMPILE}${AR} | ||
62 | |||
63 | # ############################################################################## | ||
64 | # Targets | ||
65 | |||
66 | all = lib ${rt-apps} | ||
67 | rt-apps = cycles base_task rt_launch rtspin release_ts measure_syscall \ | ||
68 | base_mt_task runtests | ||
69 | |||
70 | .PHONY: all lib clean dump-config | ||
71 | |||
72 | all: ${all} | ||
73 | |||
74 | dump-config: | ||
75 | @echo Build configuration: | ||
76 | @printf "%-15s= %-20s\n" \ | ||
77 | ARCH ${ARCH} \ | ||
78 | LITMUS_KERNEL "${LITMUS_KERNEL}" \ | ||
79 | CROSS_COMPILE "${CROSS_COMPILE}" \ | ||
80 | headers "${headers}" \ | ||
81 | CFLAGS "${CFLAGS}" \ | ||
82 | LDFLAGS "${LDFLAGS}" \ | ||
83 | CPPFLAGS "${CPPFLAGS}" \ | ||
84 | CC "${CC}" \ | ||
85 | CPP "${CPP}" \ | ||
86 | LD "${LD}" \ | ||
87 | AR "${AR}" \ | ||
88 | obj-all "${obj-all}" | ||
11 | 89 | ||
12 | clean: | 90 | clean: |
13 | echo "Legacy warning: Building is now done with scons." | 91 | rm -f ${rt-apps} |
14 | scons -c | 92 | rm -f *.o *.d *.a test_catalog.inc |
93 | |||
94 | |||
95 | # ############################################################################## | ||
96 | # liblitmus | ||
97 | |||
98 | lib: liblitmus.a | ||
99 | |||
100 | # all .c file in src/ are linked into liblitmus | ||
101 | vpath %.c src/ | ||
102 | obj-lib = $(patsubst src/%.c,%.o,$(wildcard src/*.c)) | ||
103 | |||
104 | liblitmus.a: ${obj-lib} | ||
105 | ${AR} rcs $@ $+ | ||
106 | |||
107 | # ############################################################################## | ||
108 | # Tests suite. | ||
109 | |||
110 | # tests are found in tests/ | ||
111 | vpath %.c tests/ | ||
112 | |||
113 | src-runtests = $(wildcard tests/*.c) | ||
114 | obj-runtests = $(patsubst tests/%.c,%.o,${src-runtests}) | ||
115 | |||
116 | # generate list of tests automatically | ||
117 | test_catalog.inc: $(filter-out tests/runner.c,${src-runtests}) | ||
118 | tests/make_catalog.py $+ > $@ | ||
119 | |||
120 | .SECONDARY: test_catalog.inc | ||
121 | |||
122 | tests/runner.c: test_catalog.inc | ||
123 | |||
124 | |||
125 | # ############################################################################## | ||
126 | # Tools that link with liblitmus | ||
127 | |||
128 | # these source files are found in bin/ | ||
129 | vpath %.c bin/ | ||
130 | |||
131 | obj-cycles = cycles.o | ||
132 | |||
133 | obj-base_task = base_task.o | ||
134 | |||
135 | obj-base_mt_task = base_mt_task.o | ||
136 | ldf-base_mt_task = -pthread | ||
137 | |||
138 | obj-rt_launch = rt_launch.o common.o | ||
139 | |||
140 | obj-rtspin = rtspin.o common.o | ||
141 | lib-rtspin = -lrt | ||
142 | |||
143 | obj-release_ts = release_ts.o | ||
144 | |||
145 | obj-measure_syscall = null_call.o | ||
146 | lib-measure_syscall = -lm | ||
147 | |||
148 | # ############################################################################## | ||
149 | # Build everything that depends on liblitmus. | ||
150 | |||
151 | .SECONDEXPANSION: | ||
152 | ${rt-apps}: $${obj-$$@} liblitmus.a | ||
153 | $(CC) -o $@ $(LDFLAGS) ${ldf-$@} $(filter-out liblitmus.a,$+) $(LOADLIBS) $(LDLIBS) ${lib-$@} ${liblitmus-flags} | ||
154 | |||
155 | # ############################################################################## | ||
156 | # Dependency resolution. | ||
157 | |||
158 | vpath %.c bin/ src/ tests/ | ||
159 | |||
160 | obj-all = ${sort ${foreach target,${all},${obj-${target}}}} | ||
161 | |||
162 | # rule to generate dependency files (straight from make manual) | ||
163 | %.d: %.c | ||
164 | @set -e; rm -f $@; \ | ||
165 | $(CC) -MM $(CPPFLAGS) $< > $@.$$$$; \ | ||
166 | sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \ | ||
167 | rm -f $@.$$$$ | ||
168 | |||
169 | ifeq ($(MAKECMDGOALS),) | ||
170 | MAKECMDGOALS += all | ||
171 | endif | ||
172 | |||
173 | ifneq ($(filter-out dump-config clean,$(MAKECMDGOALS)),) | ||
174 | -include ${obj-all:.o=.d} | ||
175 | endif | ||
15 | 176 | ||
16 | purge: clean | ||
17 | rm -rf .sconf_temp .sconsign.dblite | ||