source: mainline/uspace/Makefile.common@ 5e718d9

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 5e718d9 was 6a97f2e, checked in by Sean Bartell <wingedtachikoma@…>, 13 years ago

uspace/Makefile.common: only generate the intended library

Because libbithenge used libblock.a, Makefile.common was trying to generate
libblock.a from the libbithenge object files. On the other hand, libbithenge
actually doesn't need libblock.a until it's linked into an executable.

  • Property mode set to 100644
File size: 9.9 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# POSIX_COMPAT set to 'y' to use POSIX compatibility layer
47#
48# Optionally, for a binary:
49# STATIC_NEEDED set to 'y' for init binaries, will build statically
50# linked version
51# STATIC_ONLY set to 'y' if binary cannot be linked dynamically
52# (e.g. uses thread-local variables)
53#
54# Optionally, for a libary:
55# SLIBRARY Name with full version, e.g. libfoo.so.0.0
56# LSONAME Soname / name with short version, e.g. libfoo.so.0
57#
58# (x) required variables
59# (/) exactly one of the variables must be defined
60#
61
62ROOT_PATH = $(USPACE_PREFIX)/..
63
64VERSION_DEF = $(ROOT_PATH)/version
65
66COMMON_MAKEFILE = $(ROOT_PATH)/Makefile.common
67COMMON_HEADER = $(ROOT_PATH)/common.h
68
69CONFIG_MAKEFILE = $(ROOT_PATH)/Makefile.config
70CONFIG_HEADER = $(ROOT_PATH)/config.h
71
72-include $(VERSION_DEF)
73-include $(COMMON_MAKEFILE)
74-include $(CONFIG_MAKEFILE)
75
76ifneq ($(BINARY),)
77 JOB = $(BINARY).job
78 OUTPUT = $(BINARY)
79 EXTRA_OUTPUT += $(BINARY).disasm
80 EXTRA_CLEAN += $(BINARY).map
81endif
82
83ifneq ($(LIBRARY),)
84 JOB = $(LIBRARY).job
85 OUTPUT = $(LIBRARY).a
86endif
87
88ifeq ($(CONFIG_BUILD_SHARED_LIBS), y)
89 ifneq ($(SLIBRARY),)
90 LARCHIVE = $(LIBRARY).la
91 LOUTPUT = $(SLIBRARY)
92 EXTRA_OUTPUT += $(LOUTPUT).disasm $(LIBRARY).so $(LSONAME)
93 EXTRA_CLEAN += $(LOUTPUT).map $(LOUTPUT).ldisasm \
94 $(LIBC_PREFIX)/shared/arch/$(UARCH)/_lib.ld \
95 $(LIBRARY).so $(LSONAME)
96 endif
97endif
98
99DEPEND = Makefile.depend
100DEPEND_PREV = $(DEPEND).prev
101
102LIB_PREFIX = $(USPACE_PREFIX)/lib
103
104LIBC_PREFIX = $(LIB_PREFIX)/c
105LIBSOFTFLOAT_PREFIX = $(LIB_PREFIX)/softfloat
106LIBSOFTINT_PREFIX = $(LIB_PREFIX)/softint
107
108LIBPOSIX_PREFIX = $(LIB_PREFIX)/posix
109
110LIBBLOCK_PREFIX = $(LIB_PREFIX)/block
111LIBFS_PREFIX = $(LIB_PREFIX)/fs
112LIBCLUI_PREFIX = $(LIB_PREFIX)/clui
113LIBFMTUTIL_PREFIX = $(LIB_PREFIX)/fmtutil
114
115LIBGRAPH_PREFIX = $(LIB_PREFIX)/graph
116LIBSOFTREND_PREFIX = $(LIB_PREFIX)/softrend
117LIBDRAW_PREFIX = $(LIB_PREFIX)/draw
118LIBGUI_PREFIX = $(LIB_PREFIX)/gui
119
120LIBEXT2_PREFIX = $(LIB_PREFIX)/ext2
121LIBEXT4_PREFIX = $(LIB_PREFIX)/ext4
122
123LIBUSB_PREFIX = $(LIB_PREFIX)/usb
124LIBUSBHOST_PREFIX = $(LIB_PREFIX)/usbhost
125LIBUSBDEV_PREFIX = $(LIB_PREFIX)/usbdev
126LIBUSBHID_PREFIX = $(LIB_PREFIX)/usbhid
127LIBUSBVIRT_PREFIX = $(LIB_PREFIX)/usbvirt
128
129LIBDRV_PREFIX = $(LIB_PREFIX)/drv
130LIBNET_PREFIX = $(LIB_PREFIX)/net
131LIBNIC_PREFIX = $(LIB_PREFIX)/nic
132LIBMINIX_PREFIX = $(LIB_PREFIX)/minix
133
134LIBSCSI_PREFIX = $(LIB_PREFIX)/scsi
135
136LIBBITHENGE_PREFIX = $(LIB_PREFIX)/bithenge
137
138ifeq ($(STATIC_NEEDED),y)
139 STATIC_BUILD = y
140else
141 ifeq ($(STATIC_ONLY),y)
142 STATIC_BUILD = y
143 else
144 ifeq ($(CONFIG_USE_SHARED_LIBS), y)
145 STATIC_BUILD = n
146 else
147 STATIC_BUILD = y
148 endif
149 endif
150endif
151
152# Build static whenever we use libusb because that library uses
153# thread local variables
154ifneq ($(findstring usb, $(LIBS)),)
155 STATIC_BUILD = y
156endif
157
158ifeq ($(STATIC_BUILD),y)
159 BASE_LIBS = $(LIBC_PREFIX)/libc.a $(LIBSOFTINT_PREFIX)/libsoftint.a
160 LINKER_SCRIPT ?= $(LIBC_PREFIX)/arch/$(UARCH)/_link.ld
161else
162 BASE_LIBS = $(LIBC_PREFIX)/libc.so0 $(LIBSOFTINT_PREFIX)/libsofti.so0
163 LFLAGS = -Bdynamic
164 LINKER_SCRIPT ?= $(LIBC_PREFIX)/arch/$(UARCH)/_link-dlexe.ld
165endif
166
167ifeq ($(CONFIG_OPTIMIZE_FOR_SIZE),y)
168 OPTIMIZATION = s
169else
170 OPTIMIZATION = 3
171endif
172
173.PHONY: all clean
174
175all: $(VERSION_DEF) $(COMMON_MAKEFILE) $(CONFIG_MAKEFILE) $(CONFIG_HEADER) $(LIBS) $(OUTPUT) $(LOUTPUT) $(EXTRA_OUTPUT)
176 -[ -f $(DEPEND) ] && cp -a $(DEPEND) $(DEPEND_PREV)
177
178clean:
179 rm -f $(DEPEND) $(DEPEND_PREV) $(JOB) $(OUTPUT) $(LARCHIVE) $(LOUTPUT) $(EXTRA_OUTPUT) $(EXTRA_CLEAN)
180 find . -name '*.o' -follow -exec rm \{\} \;
181 find . -name '*.lo' -follow -exec rm \{\} \;
182
183GCC_CFLAGS = -I$(LIBC_PREFIX)/include -O$(OPTIMIZATION) -imacros $(CONFIG_HEADER) \
184 -fexec-charset=UTF-8 -fwide-exec-charset=UTF-32$(ENDIANESS) \
185 -finput-charset=UTF-8 -ffreestanding -fno-builtin -nostdlib -nostdinc \
186 -Wall -Wextra -Wno-clobbered -Wno-unused-parameter -Wmissing-prototypes \
187 -std=gnu99 -Werror-implicit-function-declaration -Wwrite-strings \
188 -pipe -g -D__$(ENDIANESS)__
189
190ICC_CFLAGS = -I$(LIBC_PREFIX)/include -O$(OPTIMIZATION) -imacros $(CONFIG_HEADER) \
191 -fexec-charset=UTF-8 -fwide-exec-charset=UTF-32$(ENDIANESS) \
192 -finput-charset=UTF-8 -ffreestanding -fno-builtin -nostdlib -nostdinc \
193 -Wall -Wextra -Wno-clobbered -Wno-unused-parameter -Wmissing-prototypes \
194 -Werror-implicit-function-declaration -Wwrite-strings \
195 -pipe -g -D__$(ENDIANESS)__
196
197CLANG_CFLAGS = -I$(LIBC_PREFIX)/include -O$(OPTIMIZATION) -imacros $(CONFIG_HEADER) \
198 -fexec-charset=UTF-8 -fwide-exec-charset=UTF-32$(ENDIANESS) \
199 -finput-charset=UTF-8 -ffreestanding -fno-builtin -nostdlib -nostdinc \
200 -Wall -Wextra -Wno-unused-parameter -Wmissing-prototypes \
201 -Werror-implicit-function-declaration -Wwrite-strings \
202 -pipe -g -arch $(CLANG_ARCH) -D__$(ENDIANESS)__
203
204LIB_CFLAGS = $(CFLAGS) -fPIC -D__IN_SHARED_LIBC__
205LIB_LFLAGS = $(LFLAGS) -shared -soname $(LSONAME) --whole-archive
206
207ifeq ($(CONFIG_DEBUG),y)
208 GCC_CFLAGS += -Werror
209 ICC_CFLAGS += -Werror
210endif
211
212ifeq ($(CONFIG_LINE_DEBUG),y)
213 GCC_CFLAGS += -g
214 ICC_CFLAGS += -g
215 CLANG_CFLAGS += -g
216endif
217
218## Setup platform configuration
219#
220
221-include $(LIBC_PREFIX)/arch/$(UARCH)/Makefile.common
222
223## Compilation options
224#
225
226JOBFILE = $(LIBC_PREFIX)/../../../tools/jobfile.py
227
228ifeq ($(POSIX_COMPAT),y)
229 CFLAGS = -I$(LIBPOSIX_PREFIX)
230 LIBS += $(LIBPOSIX_PREFIX)/libposix.a
231endif
232
233ifeq ($(COMPILER),gcc_cross)
234 CFLAGS += $(GCC_CFLAGS) $(EXTRA_CFLAGS)
235 DEPEND_DEFS = $(DEFS) $(CONFIG_DEFS)
236endif
237
238ifeq ($(COMPILER),gcc_native)
239 CFLAGS += $(GCC_CFLAGS) $(EXTRA_CFLAGS)
240 DEPEND_DEFS = $(DEFS) $(CONFIG_DEFS)
241endif
242
243ifeq ($(COMPILER),icc)
244 CFLAGS += $(ICC_CFLAGS) $(EXTRA_CFLAGS)
245 DEPEND_DEFS = $(DEFS) $(CONFIG_DEFS)
246endif
247
248ifeq ($(COMPILER),clang)
249 CFLAGS += $(CLANG_CFLAGS) $(EXTRA_CFLAGS)
250 DEPEND_DEFS = $(DEFS) $(CONFIG_DEFS)
251endif
252
253-include $(DEPEND)
254
255OBJECTS := $(addsuffix .o,$(basename $(SOURCES)))
256LOBJECTS := $(addsuffix .lo,$(basename $(SOURCES)))
257
258ifneq ($(BINARY),)
259%.disasm: $(BINARY)
260ifeq ($(CONFIG_LINE_DEBUG),y)
261 $(OBJDUMP) -d -S $< > $@
262else
263 $(OBJDUMP) -d $< > $@
264endif
265
266$(BINARY): $(LINKER_SCRIPT) $(OBJECTS) $(LIBS) $(BASE_LIBS)
267 $(LD) -n $(LFLAGS) -T $(LINKER_SCRIPT) -M -Map $(BINARY).map -o $(BINARY) $(OBJECTS) $(LIBS) $(BASE_LIBS)
268ifeq ($(CONFIG_STRIP_BINARIES),y)
269 $(STRIP) $(BINARY)
270endif
271endif
272
273ifneq ($(SLIBRARY),)
274%.disasm: $(LOUTPUT)
275ifeq ($(CONFIG_LINE_DEBUG),y)
276 $(OBJDUMP) -d -S $< > $@
277else
278 $(OBJDUMP) -d $< > $@
279endif
280
281$(LOUTPUT): $(LARCHIVE) $(LIBC_PREFIX)/arch/$(UARCH)/_link-shlib.ld
282 $(LD) -T $(LIBC_PREFIX)/arch/$(UARCH)/_link-shlib.ld $(LIB_LFLAGS) $(LARCHIVE) -o $@ -Map $(LOUTPUT).map
283
284$(LIBRARY).so:
285 ln -s $(SLIBRARY) $@
286
287$(LSONAME):
288 ln -s $(SLIBRARY) $@
289endif
290
291ifneq ($(LIBRARY),)
292$(LIBRARY).a: $(OBJECTS)
293 $(AR) rc $@ $(OBJECTS)
294endif
295
296ifneq ($(SLIBRARY),)
297$(LIBRARY).la: $(LOBJECTS)
298 $(AR) rc $@ $(LOBJECTS)
299endif
300
301%.o: %.S $(DEPEND)
302 $(CC) $(DEFS) $(CFLAGS) -D__ASM__ -c $< -o $@
303ifeq ($(PRECHECK),y)
304 $(JOBFILE) $(JOB) $< $@ as asm/preproc $(DEFS) $(CFLAGS) -D__ASM__
305endif
306
307%.o: %.s $(DEPEND)
308 $(AS) $(AFLAGS) -o $@ $<
309ifeq ($(PRECHECK),y)
310 $(JOBFILE) $(JOB) $< $@ as asm
311endif
312
313%.o: %.c $(DEPEND)
314 $(CC) $(DEFS) $(CFLAGS) -c $< -o $@
315ifeq ($(PRECHECK),y)
316 $(JOBFILE) $(JOB) $< $@ cc core $(DEFS) $(CFLAGS)
317endif
318
319%.lo: %.S $(DEPEND)
320 $(CC) $(DEFS) $(LIB_CFLAGS) -D__ASM__ -c $< -o $@
321ifeq ($(PRECHECK),y)
322 $(JOBFILE) $(JOB) $< $@ as asm/preproc $(DEFS) $(CFLAGS) -D__ASM__
323endif
324
325%.lo: %.s $(DEPEND)
326 $(AS) $(AFLAGS) -o $@ $<
327ifeq ($(PRECHECK),y)
328 $(JOBFILE) $(JOB) $< $@ as asm
329endif
330
331%.lo: %.c $(DEPEND)
332 $(CC) $(DEFS) $(LIB_CFLAGS) -c $< -o $@
333ifeq ($(PRECHECK),y)
334 $(JOBFILE) $(JOB) $< $@ cc core $(DEFS) $(CFLAGS)
335endif
336
337$(DEPEND): $(PRE_DEPEND)
338 makedepend -f - -- $(DEPEND_DEFS) $(CFLAGS) -- $(SOURCES) > $@ 2> /dev/null
339 -[ -f $(DEPEND_PREV) ] && diff -q $(DEPEND_PREV) $@ && mv -f $(DEPEND_PREV) $@
340
341##
342# This explicit dependecy of the output binary on the object files seems to be
343# necessary to prevent parallel build failures (GNU make bug #26893 ???).
344$(OUTPUT): $(OBJECTS)
345
346$(LARCHIVE): $(LOBJECTS)
Note: See TracBrowser for help on using the repository browser.