source: mainline/uspace/Makefile.common@ eca820c

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since eca820c was eca820c, checked in by jzr <zarevucky.jiri@…>, 8 years ago

Revert change to the way startup file is referenced.

The path is not actually referenced in the output object itself.
It is only visible in the map generated by the linker, which
does not matter for reproducibility. Also, it would be infeasible
to provide reproducible map files with a proper HelenOS-targeted
toolchain. Coastline breakage begone!

  • Property mode set to 100644
File size: 11.7 KB
Line 
1#
2# Copyright (c) 2005 Martin Decky
3# Copyright (c) 2007 Jakub Jermar
4# All rights reserved.
5#
6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted provided that the following conditions
8# are met:
9#
10# - Redistributions of source code must retain the above copyright
11# notice, this list of conditions and the following disclaimer.
12# - Redistributions in binary form must reproduce the above copyright
13# notice, this list of conditions and the following disclaimer in the
14# documentation and/or other materials provided with the distribution.
15# - The name of the author may not be used to endorse or promote products
16# derived from this software without specific prior written permission.
17#
18# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28#
29
30# Individual makefiles set:
31#
32# USPACE_PREFIX (*) relative path to uspace/ directory
33# SOURCES (*) list of source files
34# LIBS libraries to link with
35# DEFS compiler defines
36# EXTRA_CFLAGS additional flags to pass to C compiler
37# LINKER_SCRIPT linker script
38# PRE_DEPEND targets required for dependency check
39#
40# BINARY (/) binary output name (like appname)
41# LIBRARY (/) library output name (like libname)
42#
43# EXTRA_OUTPUT additional output targets
44# EXTRA_CLEAN additional cleanup targets
45#
46# MATH set to 'y' to use the math library
47# POSIX_COMPAT set to 'y' to use POSIX compatibility layer
48#
49# Optionally, for a binary:
50# STATIC_NEEDED set to 'y' for init binaries, will build statically
51# linked version
52# STATIC_ONLY set to 'y' if binary cannot be linked dynamically
53# (e.g. uses thread-local variables)
54#
55# Optionally, for a libary:
56# SLIBRARY Name with full version, e.g. libfoo.so.0.0
57# LSONAME Soname / name with short version, e.g. libfoo.so.0
58#
59# (x) required variables
60# (/) exactly one of the variables must be defined
61#
62
63ROOT_PATH = $(USPACE_PREFIX)/..
64
65VERSION_DEF = $(ROOT_PATH)/version
66
67COMMON_MAKEFILE = $(ROOT_PATH)/Makefile.common
68COMMON_HEADER = $(ROOT_PATH)/common.h
69
70CONFIG_MAKEFILE = $(ROOT_PATH)/Makefile.config
71CONFIG_HEADER = $(ROOT_PATH)/config.h
72
73-include $(VERSION_DEF)
74-include $(COMMON_MAKEFILE)
75-include $(CONFIG_MAKEFILE)
76
77ifneq ($(BINARY),)
78 JOB = $(BINARY).job
79 OUTPUT = $(BINARY)
80 TEST_BINARY = test-$(BINARY)
81 EXTRA_OUTPUT += $(BINARY).disasm
82 EXTRA_CLEAN += $(BINARY).map
83endif
84
85ifneq ($(LIBRARY),)
86 JOB = $(LIBRARY).job
87 OUTPUT = $(LIBRARY).a
88 TEST_BINARY = test-$(LIBRARY)
89endif
90
91ifeq ($(CONFIG_BUILD_SHARED_LIBS),y)
92 ifneq ($(SLIBRARY),)
93 LARCHIVE = $(LIBRARY).la
94 LOUTPUT = $(SLIBRARY)
95 EXTRA_OUTPUT += $(LOUTPUT).disasm $(LIBRARY).so $(LSONAME)
96 EXTRA_CLEAN += $(LOUTPUT).map $(LOUTPUT).ldisasm \
97 $(LIBC_PREFIX)/shared/arch/$(UARCH)/_lib.ld \
98 $(LIBRARY).so $(LSONAME)
99 endif
100endif
101
102LIB_PREFIX = $(USPACE_PREFIX)/lib
103
104LIBC_PREFIX = $(LIB_PREFIX)/c
105LIBC_INCLUDES_FLAGS = \
106 -I$(LIBC_PREFIX)/include \
107 -I$(LIBC_PREFIX)/arch/$(UARCH)/include \
108 -I$(ROOT_PATH)/abi/include
109LIBSOFTFLOAT_PREFIX = $(LIB_PREFIX)/softfloat
110LIBSOFTINT_PREFIX = $(LIB_PREFIX)/softint
111
112LIBMATH_PREFIX = $(LIB_PREFIX)/math
113LIBMATH_INCLUDES_FLAGS = \
114 -I$(LIBMATH_PREFIX)/include \
115 -I$(LIBMATH_PREFIX)/arch/$(UARCH)/include
116
117LIBPOSIX_PREFIX = $(LIB_PREFIX)/posix
118
119LIBCRYPTO_PREFIX = $(LIB_PREFIX)/crypto
120LIBBLOCK_PREFIX = $(LIB_PREFIX)/block
121LIBFDISK_PREFIX = $(LIB_PREFIX)/fdisk
122LIBLABEL_PREFIX = $(LIB_PREFIX)/label
123LIBFS_PREFIX = $(LIB_PREFIX)/fs
124LIBCLUI_PREFIX = $(LIB_PREFIX)/clui
125LIBFMTUTIL_PREFIX = $(LIB_PREFIX)/fmtutil
126
127LIBGRAPH_PREFIX = $(LIB_PREFIX)/graph
128LIBSOFTREND_PREFIX = $(LIB_PREFIX)/softrend
129LIBDRAW_PREFIX = $(LIB_PREFIX)/draw
130LIBGUI_PREFIX = $(LIB_PREFIX)/gui
131
132LIBEXT4_PREFIX = $(LIB_PREFIX)/ext4
133
134LIBUSB_PREFIX = $(LIB_PREFIX)/usb
135LIBUSBHOST_PREFIX = $(LIB_PREFIX)/usbhost
136LIBUSBDEV_PREFIX = $(LIB_PREFIX)/usbdev
137LIBUSBHID_PREFIX = $(LIB_PREFIX)/usbhid
138LIBUSBVIRT_PREFIX = $(LIB_PREFIX)/usbvirt
139
140LIBDRV_PREFIX = $(LIB_PREFIX)/drv
141LIBHOUND_PREFIX = $(LIB_PREFIX)/hound
142LIBPCM_PREFIX = $(LIB_PREFIX)/pcm
143LIBNIC_PREFIX = $(LIB_PREFIX)/nic
144LIBIEEE80211_PREFIX = $(LIB_PREFIX)/ieee80211
145LIBMINIX_PREFIX = $(LIB_PREFIX)/minix
146LIBCOMPRESS_PREFIX = $(LIB_PREFIX)/compress
147LIBDLTEST_PREFIX = $(LIB_PREFIX)/dltest
148
149LIBSCSI_PREFIX = $(LIB_PREFIX)/scsi
150LIBTRACKMOD_PREFIX = $(LIB_PREFIX)/trackmod
151
152LIBBITHENGE_PREFIX = $(LIB_PREFIX)/bithenge
153
154LIBHTTP_PREFIX = $(LIB_PREFIX)/http
155LIBURI_PREFIX = $(LIB_PREFIX)/uri
156
157LIBNETTL_PREFIX = $(LIB_PREFIX)/nettl
158
159AFLAGS =
160LFLAGS = --fatal-warnings --warn-common
161
162# FIXME: This condition is a workaround for issues #692 and #693.
163ifneq ($(KARCH),ia64)
164ifneq ($(KARCH),mips32)
165 AFLAGS += --fatal-warnings
166endif
167endif
168
169ifeq ($(STATIC_NEEDED),y)
170 STATIC_BUILD = y
171else
172 ifeq ($(STATIC_ONLY),y)
173 STATIC_BUILD = y
174 else
175 ifeq ($(CONFIG_USE_SHARED_LIBS),y)
176 STATIC_BUILD = n
177 else
178 STATIC_BUILD = y
179 endif
180 endif
181endif
182
183ifeq ($(STATIC_BUILD),y)
184 BASE_LIBS = $(LIBC_PREFIX)/libc.a $(LIBSOFTINT_PREFIX)/libsoftint.a
185 ifeq ($(MATH),y)
186 BASE_LIBS += $(LIBMATH_PREFIX)/libmath.a
187 endif
188else
189 BASE_LIBS = $(LIBC_PREFIX)/libc.so.0 $(LIBSOFTINT_PREFIX)/libsoftint.so.0
190 LINK_DYNAMIC = y
191 ifeq ($(MATH),y)
192 BASE_LIBS += $(LIBMATH_PREFIX)/libmath.so.0
193 endif
194endif
195
196ifeq ($(LINK_DYNAMIC),y)
197 LFLAGS += -Bdynamic
198 LINKER_SCRIPT ?= $(LIBC_PREFIX)/arch/$(UARCH)/_link-dlexe.ld
199else
200 LINKER_SCRIPT ?= $(LIBC_PREFIX)/arch/$(UARCH)/_link.ld
201endif
202
203ifeq ($(MATH),y)
204 INCLUDES_FLAGS = $(LIBC_INCLUDES_FLAGS) $(LIBMATH_INCLUDES_FLAGS)
205else
206 INCLUDES_FLAGS = $(LIBC_INCLUDES_FLAGS)
207endif
208
209# PCUT-based unit tests
210ifneq ($(TEST_SOURCES),)
211 TEST_OUTPUT = $(TEST_BINARY)
212 TEST_DISASM = $(TEST_BINARY).disasm
213 TEST_CFLAGS = -I$(LIB_PREFIX)/pcut/include -D__helenos__
214 TEST_OUTPUT_LIBS = $(LIB_PREFIX)/pcut/libpcut.a
215 EXTRA_CLEAN += $(TEST_OUTPUT) $(TEST_OUTPUT).map $(TEST_DISASM)
216ifneq ($(LIBRARY),)
217 TEST_OUTPUT_LIBS += $(OUTPUT)
218endif
219 TEST_OUTPUT_LIBS += $(TEST_LIBS)
220endif
221
222.PHONY: all clean depend
223
224all: $(VERSION_DEF) $(COMMON_MAKEFILE) $(CONFIG_MAKEFILE) $(CONFIG_HEADER) $(LIBS) $(OUTPUT) $(LOUTPUT) $(EXTRA_OUTPUT)
225
226all-test: $(TEST_OUTPUT) $(TEST_DISASM)
227
228clean:
229 rm -f $(JOB) $(OUTPUT) $(LARCHIVE) $(LOUTPUT) $(EXTRA_OUTPUT) $(EXTRA_CLEAN)
230 find . -name '*.o' -follow -exec rm \{\} \;
231 find . -name '*.lo' -follow -exec rm \{\} \;
232 find . -name '*.d' -follow -exec rm \{\} \;
233
234COMMON_CFLAGS = $(INCLUDES_FLAGS) -O$(OPTIMIZATION) -imacros $(CONFIG_HEADER) \
235 -ffreestanding -fno-builtin -nostdlib -nostdinc -fexec-charset=UTF-8 \
236 -finput-charset=UTF-8 -D__$(ENDIANESS)__ -fno-common \
237 -fdebug-prefix-map=$(realpath $(ROOT_PATH))=.
238
239GCC_CFLAGS = -ffunction-sections -Wall -Wextra -Wno-clobbered \
240 -Wno-unused-parameter -Wmissing-prototypes -std=gnu99 \
241 -Werror-implicit-function-declaration \
242 -Wwrite-strings -pipe
243
244# -Wno-missing-prototypes is there because it warns about main().
245# This should be fixed elsewhere.
246CLANG_CFLAGS = -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wno-typedef-redefinition \
247 -Wno-missing-prototypes -Wno-unused-command-line-argument \
248 -std=gnu99 -Werror-implicit-function-declaration -Wwrite-strings \
249 -pipe -fno-stack-protector -fno-PIC
250
251ifeq ($(CONFIG_DEBUG),y)
252 COMMON_CFLAGS += -Werror
253endif
254
255ifeq ($(CONFIG_LINE_DEBUG),y)
256 GCC_CFLAGS += -ggdb
257 CLANG_CFLAGS += -g
258endif
259
260# Prepare for POSIX before including platform specific stuff
261ifeq ($(POSIX_COMPAT),y)
262 CFLAGS += -I$(LIBPOSIX_PREFIX)/include/posix -I$(LIBPOSIX_PREFIX)/include/
263 BASE_LIBS = $(LIBPOSIX_PREFIX)/libposixaslibc.a $(LIBPOSIX_PREFIX)/libc4posix.a $(LIBSOFTINT_PREFIX)/libsoftint.a
264endif
265
266## Setup platform configuration
267#
268
269-include $(LIBC_PREFIX)/arch/$(UARCH)/Makefile.common
270
271## Compilation options
272#
273
274JOBFILE = $(LIBC_PREFIX)/../../../tools/jobfile.py
275
276ifeq ($(COMPILER),clang)
277 CFLAGS += $(COMMON_CFLAGS) $(CLANG_CFLAGS)
278else
279 CFLAGS += $(COMMON_CFLAGS) $(GCC_CFLAGS)
280endif
281
282LIB_CFLAGS = $(CFLAGS) -fPIC
283LIB_LFLAGS = $(LFLAGS) -shared -soname $(LSONAME) --whole-archive
284
285AS_CFLAGS := $(addprefix -Xassembler ,$(AFLAGS))
286LD_CFLAGS := $(addprefix -Xlinker ,$(LFLAGS))
287
288OBJECTS := $(addsuffix .o,$(basename $(SOURCES)))
289LOBJECTS := $(addsuffix .lo,$(basename $(SOURCES)))
290TEST_OBJECTS := $(addsuffix .test.o,$(basename $(TEST_SOURCES)))
291DEPENDS := $(addsuffix .d,$(basename $(SOURCES))) $(addsuffix .test.d,$(basename $(TEST_SOURCES)))
292
293-include $(DEPENDS)
294
295ifneq ($(BINARY),)
296$(BINARY).disasm: $(BINARY)
297ifeq ($(CONFIG_LINE_DEBUG),y)
298 $(OBJDUMP) -d -S $< > $@
299else
300 $(OBJDUMP) -d $< > $@
301endif
302
303$(BINARY): $(LINKER_SCRIPT) $(OBJECTS) $(LIBS) $(BASE_LIBS)
304 $(LD) -n $(LFLAGS) -T $(LINKER_SCRIPT) -M -Map $(BINARY).map -o $(BINARY) $(OBJECTS) $(LIBS) $(BASE_LIBS)
305ifeq ($(CONFIG_STRIP_BINARIES),y)
306 $(STRIP) $(BINARY)
307endif
308endif
309
310ifneq ($(SLIBRARY),)
311$(LOUTPUT).disasm: $(LOUTPUT)
312ifeq ($(CONFIG_LINE_DEBUG),y)
313 $(OBJDUMP) -d -S $< > $@
314else
315 $(OBJDUMP) -d $< > $@
316endif
317
318$(LOUTPUT): $(LARCHIVE) $(LIBC_PREFIX)/arch/$(UARCH)/_link-shlib.ld
319 $(LD) -T $(LIBC_PREFIX)/arch/$(UARCH)/_link-shlib.ld $(LIB_LFLAGS) $(LARCHIVE) -o $@ -Map $(LOUTPUT).map
320
321$(LIBRARY).so:
322 ln -s $(SLIBRARY) $@
323
324$(LSONAME):
325 ln -s $(SLIBRARY) $@
326endif
327
328ifneq ($(LIBRARY),)
329$(LIBRARY).a: $(OBJECTS)
330 $(AR) rc $@ $(OBJECTS)
331endif
332
333ifneq ($(LARCHIVE),)
334$(LARCHIVE): $(LOBJECTS)
335 $(AR) rc $@ $(LOBJECTS)
336endif
337
338ifneq ($(TEST_OUTPUT),)
339$(TEST_OUTPUT): $(LINKER_SCRIPT) $(TEST_OBJECTS) $(TEST_OUTPUT_LIBS)
340 $(LD) -n $(LFLAGS) -T $(LINKER_SCRIPT) -M -Map $(TEST_OUTPUT).map -o $@ $(TEST_OBJECTS) $(TEST_OUTPUT_LIBS) $(LIBS) $(BASE_LIBS)
341ifeq ($(CONFIG_STRIP_BINARIES),y)
342 $(STRIP) $(TEST_OUTPUT)
343endif
344$(TEST_BINARY).disasm: $(TEST_BINARY)
345ifeq ($(CONFIG_LINE_DEBUG),y)
346 $(OBJDUMP) -d -S $< > $@
347else
348 $(OBJDUMP) -d $< > $@
349endif
350endif
351
352%.o: %.S | depend
353 $(CC) -MD $(DEFS) $(CFLAGS) $(EXTRA_CFLAGS) $(AS_CFLAGS) -D__ASM__ -c $< -o $@
354ifeq ($(PRECHECK),y)
355 $(JOBFILE) $(JOB) $< $@ as asm/preproc $(DEFS) $(CFLAGS) $(EXTRA_CFLAGS) -D__ASM__
356endif
357
358%.o: %.s | depend
359 $(CC) -MD $(DEFS) $(CFLAGS) $(EXTRA_CFLAGS) $(AS_CFLAGS) -D__ASM__ -c $< -o $@
360ifeq ($(PRECHECK),y)
361 $(JOBFILE) $(JOB) $< $@ as asm
362endif
363
364%.o: %.c | depend
365 $(CC) -MD $(DEFS) $(CFLAGS) $(EXTRA_CFLAGS) -c $< -o $@
366ifeq ($(PRECHECK),y)
367 $(JOBFILE) $(JOB) $< $@ cc core $(DEFS) $(CFLAGS) $(EXTRA_CFLAGS)
368endif
369
370%.test.o: %.c | depend
371 $(CC) -MD $(DEFS) $(CFLAGS) $(EXTRA_CFLAGS) $(TEST_CFLAGS) -c $< -o $@
372ifeq ($(PRECHECK),y)
373 $(JOBFILE) $(JOB) $< $@ cc core $(DEFS) $(CFLAGS) $(EXTRA_CFLAGS) $(TEST_CFLAGS)
374endif
375
376%.lo: %.S | depend
377 $(CC) -MD $(DEFS) $(LIB_CFLAGS) $(EXTRA_CFLAGS) $(AS_CFLAGS) -D__ASM__ -c $< -o $@
378ifeq ($(PRECHECK),y)
379 $(JOBFILE) $(JOB) $< $@ as asm/preproc $(DEFS) $(LIB_CFLAGS) $(EXTRA_CFLAGS) -D__ASM__
380endif
381
382%.lo: %.s | depend
383 $(CC) -MD $(DEFS) $(LIB_CFLAGS) $(EXTRA_CFLAGS) $(AS_CFLAGS) -D__ASM__ -c $< -o $@
384ifeq ($(PRECHECK),y)
385 $(JOBFILE) $(JOB) $< $@ as asm
386endif
387
388%.lo: %.c | depend
389 $(CC) -MD $(DEFS) $(LIB_CFLAGS) $(EXTRA_CFLAGS) -c $< -o $@
390ifeq ($(PRECHECK),y)
391 $(JOBFILE) $(JOB) $< $@ cc core $(DEFS) $(LIB_CFLAGS) $(EXTRA_CFLAGS)
392endif
393
394depend: $(PRE_DEPEND)
395
396##
397# This explicit dependecy of the output binary on the object files seems to be
398# necessary to prevent parallel build failures (GNU make bug #26893 ???).
399$(OUTPUT): $(OBJECTS)
400
401$(LARCHIVE): $(LOBJECTS)
Note: See TracBrowser for help on using the repository browser.