source: mainline/uspace/Makefile.common@ 89e2aac

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 89e2aac was 9780584, checked in by Jakub Jermar <jakub@…>, 8 years ago

Use -ffunction-sections and —gc-sections

This change results in vast reduction of binary image sizes. For example, the
amd64 ISO image was 38MiB before this change and is only 25MiB after the change.

Unfortunately the ia64 linker ignores —gc-sections for some reason so it cannot
be turned on globally.

  • Property mode set to 100644
File size: 12.4 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
102DEPEND = Makefile.depend
103DEPEND_PREV = $(DEPEND).prev
104
105LIB_PREFIX = $(USPACE_PREFIX)/lib
106
107LIBC_PREFIX = $(LIB_PREFIX)/c
108LIBC_INCLUDES_FLAGS = \
109 -I$(LIBC_PREFIX)/include \
110 -I$(LIBC_PREFIX)/arch/$(UARCH)/include \
111 -I$(ROOT_PATH)/abi/include
112LIBSOFTFLOAT_PREFIX = $(LIB_PREFIX)/softfloat
113LIBSOFTINT_PREFIX = $(LIB_PREFIX)/softint
114
115LIBMATH_PREFIX = $(LIB_PREFIX)/math
116LIBMATH_INCLUDES_FLAGS = \
117 -I$(LIBMATH_PREFIX)/include \
118 -I$(LIBMATH_PREFIX)/arch/$(UARCH)/include
119
120LIBPOSIX_PREFIX = $(LIB_PREFIX)/posix
121
122LIBCRYPTO_PREFIX = $(LIB_PREFIX)/crypto
123LIBBLOCK_PREFIX = $(LIB_PREFIX)/block
124LIBFDISK_PREFIX = $(LIB_PREFIX)/fdisk
125LIBLABEL_PREFIX = $(LIB_PREFIX)/label
126LIBFS_PREFIX = $(LIB_PREFIX)/fs
127LIBCLUI_PREFIX = $(LIB_PREFIX)/clui
128LIBFMTUTIL_PREFIX = $(LIB_PREFIX)/fmtutil
129
130LIBGRAPH_PREFIX = $(LIB_PREFIX)/graph
131LIBSOFTREND_PREFIX = $(LIB_PREFIX)/softrend
132LIBDRAW_PREFIX = $(LIB_PREFIX)/draw
133LIBGUI_PREFIX = $(LIB_PREFIX)/gui
134
135LIBEXT4_PREFIX = $(LIB_PREFIX)/ext4
136
137LIBUSB_PREFIX = $(LIB_PREFIX)/usb
138LIBUSBHOST_PREFIX = $(LIB_PREFIX)/usbhost
139LIBUSBDEV_PREFIX = $(LIB_PREFIX)/usbdev
140LIBUSBHID_PREFIX = $(LIB_PREFIX)/usbhid
141LIBUSBVIRT_PREFIX = $(LIB_PREFIX)/usbvirt
142
143LIBDRV_PREFIX = $(LIB_PREFIX)/drv
144LIBHOUND_PREFIX = $(LIB_PREFIX)/hound
145LIBPCM_PREFIX = $(LIB_PREFIX)/pcm
146LIBNIC_PREFIX = $(LIB_PREFIX)/nic
147LIBIEEE80211_PREFIX = $(LIB_PREFIX)/ieee80211
148LIBMINIX_PREFIX = $(LIB_PREFIX)/minix
149LIBCOMPRESS_PREFIX = $(LIB_PREFIX)/compress
150LIBDLTEST_PREFIX = $(LIB_PREFIX)/dltest
151
152LIBSCSI_PREFIX = $(LIB_PREFIX)/scsi
153LIBTRACKMOD_PREFIX = $(LIB_PREFIX)/trackmod
154
155LIBBITHENGE_PREFIX = $(LIB_PREFIX)/bithenge
156
157LIBHTTP_PREFIX = $(LIB_PREFIX)/http
158LIBURI_PREFIX = $(LIB_PREFIX)/uri
159
160LIBNETTL_PREFIX = $(LIB_PREFIX)/nettl
161
162AFLAGS = --fatal-warnings
163LFLAGS = --fatal-warnings
164
165ifeq ($(STATIC_NEEDED),y)
166 STATIC_BUILD = y
167else
168 ifeq ($(STATIC_ONLY),y)
169 STATIC_BUILD = y
170 else
171 ifeq ($(CONFIG_USE_SHARED_LIBS),y)
172 STATIC_BUILD = n
173 else
174 STATIC_BUILD = y
175 endif
176 endif
177endif
178
179ifeq ($(STATIC_BUILD),y)
180 BASE_LIBS = $(LIBC_PREFIX)/libc.a $(LIBSOFTINT_PREFIX)/libsoftint.a
181 ifeq ($(MATH),y)
182 BASE_LIBS += $(LIBMATH_PREFIX)/libmath.a
183 endif
184else
185 BASE_LIBS = $(LIBC_PREFIX)/libc.so.0 $(LIBSOFTINT_PREFIX)/libsoftint.so.0
186 LINK_DYNAMIC = y
187 ifeq ($(MATH),y)
188 BASE_LIBS += $(LIBMATH_PREFIX)/libmath.so.0
189 endif
190endif
191
192ifeq ($(LINK_DYNAMIC),y)
193 LFLAGS += -Bdynamic
194 LINKER_SCRIPT ?= $(LIBC_PREFIX)/arch/$(UARCH)/_link-dlexe.ld
195else
196 LINKER_SCRIPT ?= $(LIBC_PREFIX)/arch/$(UARCH)/_link.ld
197endif
198
199ifeq ($(MATH),y)
200 INCLUDES_FLAGS = $(LIBC_INCLUDES_FLAGS) $(LIBMATH_INCLUDES_FLAGS)
201else
202 INCLUDES_FLAGS = $(LIBC_INCLUDES_FLAGS)
203endif
204
205ifeq ($(CONFIG_OPTIMIZE_FOR_SIZE),y)
206 OPTIMIZATION = s
207else
208 OPTIMIZATION = 3
209endif
210
211# PCUT-based unit tests
212ifneq ($(TEST_SOURCES),)
213 TEST_OUTPUT = $(TEST_BINARY)
214 TEST_CFLAGS = -I$(LIB_PREFIX)/pcut/include -D__helenos__
215 TEST_OUTPUT_LIBS = $(LIB_PREFIX)/pcut/libpcut.a
216 EXTRA_CLEAN += $(TEST_OUTPUT) $(TEST_OUTPUT).map
217ifneq ($(LIBRARY),)
218 TEST_OUTPUT_LIBS += $(OUTPUT)
219endif
220 TEST_OUTPUT_LIBS += $(TEST_LIBS)
221endif
222
223.PHONY: all clean
224
225all: $(VERSION_DEF) $(COMMON_MAKEFILE) $(CONFIG_MAKEFILE) $(CONFIG_HEADER) $(LIBS) $(OUTPUT) $(LOUTPUT) $(EXTRA_OUTPUT)
226 -[ -f $(DEPEND) ] && cp -a $(DEPEND) $(DEPEND_PREV)
227
228all-test: $(TEST_OUTPUT)
229
230clean:
231 rm -f $(DEPEND) $(DEPEND_PREV) $(JOB) $(OUTPUT) $(LARCHIVE) $(LOUTPUT) $(EXTRA_OUTPUT) $(EXTRA_CLEAN)
232 find . -name '*.o' -follow -exec rm \{\} \;
233 find . -name '*.lo' -follow -exec rm \{\} \;
234
235GCC_CFLAGS = $(INCLUDES_FLAGS) -O$(OPTIMIZATION) -imacros $(CONFIG_HEADER) \
236 -fexec-charset=UTF-8 -fwide-exec-charset=UTF-32$(ENDIANESS) \
237 -finput-charset=UTF-8 -ffreestanding -fno-builtin -ffunction-sections \
238 -nostdlib -nostdinc -Wall -Wextra -Wno-clobbered -Wno-unused-parameter \
239 -Wmissing-prototypes -std=gnu99 -Werror-implicit-function-declaration \
240 -Wwrite-strings -pipe -ggdb -D__$(ENDIANESS)__
241
242ICC_CFLAGS = $(INCLUDES_FLAGS) -O$(OPTIMIZATION) -imacros $(CONFIG_HEADER) \
243 -fexec-charset=UTF-8 -fwide-exec-charset=UTF-32$(ENDIANESS) \
244 -finput-charset=UTF-8 -ffreestanding -fno-builtin -nostdlib -nostdinc \
245 -Wall -Wextra -Wno-clobbered -Wno-unused-parameter -Wmissing-prototypes \
246 -Werror-implicit-function-declaration -Wwrite-strings \
247 -pipe -g -D__$(ENDIANESS)__
248
249# clang does not support following options but I am not sure whether
250# something won't break because of that:
251# -fexec-charset=UTF-8 -fwide-exec-charset=UTF-32$(ENDIANESS) -finput-charset=UTF-8
252CLANG_CFLAGS = $(INCLUDES_FLAGS) -O$(OPTIMIZATION) -imacros $(CONFIG_HEADER) \
253 -ffreestanding -fno-builtin -nostdlib -nostdinc \
254 -Wall -Wextra -Wno-unused-parameter -Wmissing-prototypes \
255 -std=gnu99 -Werror-implicit-function-declaration -Wwrite-strings \
256 -integrated-as -pipe -g -target $(CLANG_TARGET) -D__$(ENDIANESS)__
257
258LIB_CFLAGS = $(CFLAGS) -fPIC
259LIB_LFLAGS = $(LFLAGS) -shared -soname $(LSONAME) --whole-archive
260
261ifeq ($(CONFIG_DEBUG),y)
262 GCC_CFLAGS += -Werror
263 ICC_CFLAGS += -Werror
264endif
265
266ifeq ($(CONFIG_LINE_DEBUG),y)
267 GCC_CFLAGS += -ggdb
268 ICC_CFLAGS += -g
269 CLANG_CFLAGS += -g
270endif
271
272# Prepare for POSIX before including platform specific stuff
273ifeq ($(POSIX_COMPAT),y)
274 CFLAGS = -I$(LIBPOSIX_PREFIX)/include/posix -I$(LIBPOSIX_PREFIX)/include/
275 BASE_LIBS = $(LIBPOSIX_PREFIX)/libposixaslibc.a $(LIBPOSIX_PREFIX)/libc4posix.a $(LIBSOFTINT_PREFIX)/libsoftint.a
276endif
277
278## Setup platform configuration
279#
280
281-include $(LIBC_PREFIX)/arch/$(UARCH)/Makefile.common
282
283## Compilation options
284#
285
286JOBFILE = $(LIBC_PREFIX)/../../../tools/jobfile.py
287
288ifeq ($(COMPILER),gcc_cross)
289 CFLAGS += $(GCC_CFLAGS)
290 DEPEND_DEFS = $(DEFS) $(CONFIG_DEFS)
291endif
292
293ifeq ($(COMPILER),gcc_helenos)
294 CFLAGS += $(GCC_CFLAGS)
295 DEPEND_DEFS = $(DEFS) $(CONFIG_DEFS)
296endif
297
298ifeq ($(COMPILER),gcc_native)
299 CFLAGS += $(GCC_CFLAGS)
300 DEPEND_DEFS = $(DEFS) $(CONFIG_DEFS)
301endif
302
303ifeq ($(COMPILER),icc)
304 CFLAGS += $(ICC_CFLAGS)
305 DEPEND_DEFS = $(DEFS) $(CONFIG_DEFS)
306endif
307
308ifeq ($(COMPILER),clang)
309 CFLAGS += $(CLANG_CFLAGS)
310 DEPEND_DEFS = $(DEFS) $(CONFIG_DEFS)
311endif
312
313ifneq ($(MAKECMDGOALS),clean)
314-include $(DEPEND)
315endif
316
317OBJECTS := $(addsuffix .o,$(basename $(SOURCES)))
318LOBJECTS := $(addsuffix .lo,$(basename $(SOURCES)))
319TEST_OBJECTS := $(addsuffix .test.o,$(basename $(TEST_SOURCES)))
320
321ifneq ($(BINARY),)
322%.disasm: $(BINARY)
323ifeq ($(CONFIG_LINE_DEBUG),y)
324 $(OBJDUMP) -d -S $< > $@
325else
326 $(OBJDUMP) -d $< > $@
327endif
328
329$(BINARY): $(LINKER_SCRIPT) $(OBJECTS) $(LIBS) $(BASE_LIBS)
330 $(LD) -n $(LFLAGS) -T $(LINKER_SCRIPT) -M -Map $(BINARY).map -o $(BINARY) $(OBJECTS) $(LIBS) $(BASE_LIBS)
331ifeq ($(CONFIG_STRIP_BINARIES),y)
332 $(STRIP) $(BINARY)
333endif
334endif
335
336ifneq ($(SLIBRARY),)
337%.disasm: $(LOUTPUT)
338ifeq ($(CONFIG_LINE_DEBUG),y)
339 $(OBJDUMP) -d -S $< > $@
340else
341 $(OBJDUMP) -d $< > $@
342endif
343
344$(LOUTPUT): $(LARCHIVE) $(LIBC_PREFIX)/arch/$(UARCH)/_link-shlib.ld
345 $(LD) -T $(LIBC_PREFIX)/arch/$(UARCH)/_link-shlib.ld $(LIB_LFLAGS) $(LARCHIVE) -o $@ -Map $(LOUTPUT).map
346
347$(LIBRARY).so:
348 ln -s $(SLIBRARY) $@
349
350$(LSONAME):
351 ln -s $(SLIBRARY) $@
352endif
353
354ifneq ($(LIBRARY),)
355$(LIBRARY).a: $(OBJECTS)
356 $(AR) rc $@ $(OBJECTS)
357endif
358
359ifneq ($(LARCHIVE),)
360$(LARCHIVE): $(LOBJECTS)
361 $(AR) rc $@ $(LOBJECTS)
362endif
363
364ifneq ($(TEST_OUTPUT),)
365$(TEST_OUTPUT): $(LINKER_SCRIPT) $(TEST_OBJECTS) $(TEST_OUTPUT_LIBS)
366 $(LD) -n $(LFLAGS) -T $(LINKER_SCRIPT) -M -Map $(TEST_OUTPUT).map -o $@ $(TEST_OBJECTS) $(TEST_OUTPUT_LIBS) $(LIBS) $(BASE_LIBS)
367ifeq ($(CONFIG_STRIP_BINARIES),y)
368 $(STRIP) $(TEST_OUTPUT)
369endif
370endif
371
372%.o: %.S $(DEPEND)
373 $(GCC) $(DEFS) $(GCC_CFLAGS) $(EXTRA_CFLAGS) -D__ASM__ -c $< -o $@
374ifeq ($(PRECHECK),y)
375 $(JOBFILE) $(JOB) $< $@ as asm/preproc $(DEFS) $(CFLAGS) $(EXTRA_CFLAGS) -D__ASM__
376endif
377
378%.o: %.s $(DEPEND)
379 $(AS) $(AFLAGS) -o $@ $<
380ifeq ($(PRECHECK),y)
381 $(JOBFILE) $(JOB) $< $@ as asm
382endif
383
384%.o: %.c $(DEPEND)
385 $(CC) $(DEFS) $(CFLAGS) $(EXTRA_CFLAGS) -c $< -o $@
386ifeq ($(PRECHECK),y)
387 $(JOBFILE) $(JOB) $< $@ cc core $(DEFS) $(CFLAGS) $(EXTRA_CFLAGS)
388endif
389
390%.test.o: %.c $(DEPEND)
391 $(CC) $(DEFS) $(CFLAGS) $(EXTRA_CFLAGS) $(TEST_CFLAGS) -c $< -o $@
392ifeq ($(PRECHECK),y)
393 $(JOBFILE) $(JOB) $< $@ cc core $(DEFS) $(CFLAGS) $(EXTRA_CFLAGS) $(TEST_CFLAGS)
394endif
395
396%.lo: %.S $(DEPEND)
397 $(CC) $(DEFS) $(LIB_CFLAGS) $(EXTRA_CFLAGS) -D__ASM__ -c $< -o $@
398ifeq ($(PRECHECK),y)
399 $(JOBFILE) $(JOB) $< $@ as asm/preproc $(DEFS) $(LIB_CFLAGS) $(EXTRA_CFLAGS) -D__ASM__
400endif
401
402%.lo: %.s $(DEPEND)
403 $(AS) $(AFLAGS) -o $@ $<
404ifeq ($(PRECHECK),y)
405 $(JOBFILE) $(JOB) $< $@ as asm
406endif
407
408%.lo: %.c $(DEPEND)
409 $(CC) $(DEFS) $(LIB_CFLAGS) $(EXTRA_CFLAGS) -c $< -o $@
410ifeq ($(PRECHECK),y)
411 $(JOBFILE) $(JOB) $< $@ cc core $(DEFS) $(LIB_CFLAGS) $(EXTRA_CFLAGS)
412endif
413
414$(DEPEND): $(PRE_DEPEND)
415 makedepend -f - -- $(DEPEND_DEFS) $(CFLAGS) $(EXTRA_CFLAGS) -- $(SOURCES) > $@ 2> /dev/null
416 makedepend -f - -o.test.o -- $(DEPEND_DEFS) $(CFLAGS) $(EXTRA_CFLAGS) $(TEST_CFLAGS) -- $(TEST_SOURCES) >> $@ 2> /dev/null
417 -[ -f $(DEPEND_PREV) ] && diff -q $(DEPEND_PREV) $@ && mv -f $(DEPEND_PREV) $@
418
419##
420# This explicit dependecy of the output binary on the object files seems to be
421# necessary to prevent parallel build failures (GNU make bug #26893 ???).
422$(OUTPUT): $(OBJECTS)
423
424$(LARCHIVE): $(LOBJECTS)
Note: See TracBrowser for help on using the repository browser.