Commit 1ffdd437 authored by Sam Ravnborg's avatar Sam Ravnborg Committed by Linus Torvalds

[PATCH] be more flexible about creating library archives

New makefile variable introduced: lib-y

The lib-y syntax allows you to do the usual tricks such as:

	lib-$(CONFIG_SMP) += percpu_counter.o

A built-in.o is always present in a directory that list .o files in
either obj-* or lib-*.

In contrast, lib.a is made only when lib-y is defined.

I also updated lib/Makefile, so that crc32.o is now always built-in
if selected. 
parent 046511a4
...@@ -288,7 +288,9 @@ init-y := $(patsubst %/, %/built-in.o, $(init-y)) ...@@ -288,7 +288,9 @@ init-y := $(patsubst %/, %/built-in.o, $(init-y))
core-y := $(patsubst %/, %/built-in.o, $(core-y)) core-y := $(patsubst %/, %/built-in.o, $(core-y))
drivers-y := $(patsubst %/, %/built-in.o, $(drivers-y)) drivers-y := $(patsubst %/, %/built-in.o, $(drivers-y))
net-y := $(patsubst %/, %/built-in.o, $(net-y)) net-y := $(patsubst %/, %/built-in.o, $(net-y))
libs-y := $(patsubst %/, %/lib.a, $(libs-y)) libs-y1 := $(patsubst %/, %/lib.a, $(libs-y))
libs-y2 := $(patsubst %/, %/built-in.o, $(libs-y))
libs-y := $(libs-y1) $(libs-y2)
ifdef include_config ifdef include_config
......
...@@ -2,12 +2,11 @@ ...@@ -2,12 +2,11 @@
# Makefile for i386-specific library files.. # Makefile for i386-specific library files..
# #
L_TARGET = lib.a
obj-y = checksum.o delay.o \ lib-y = checksum.o delay.o \
usercopy.o getuser.o \ usercopy.o getuser.o \
memcpy.o strstr.o memcpy.o strstr.o
obj-$(CONFIG_X86_USE_3DNOW) += mmx.o lib-$(CONFIG_X86_USE_3DNOW) += mmx.o
obj-$(CONFIG_HAVE_DEC_LOCK) += dec_and_lock.o lib-$(CONFIG_HAVE_DEC_LOCK) += dec_and_lock.o
obj-$(CONFIG_DEBUG_IOVIRT) += iodebug.o lib-$(CONFIG_DEBUG_IOVIRT) += iodebug.o
...@@ -6,18 +6,17 @@ ...@@ -6,18 +6,17 @@
# unless it's something special (ie not a .c file). # unless it's something special (ie not a .c file).
# #
L_TARGET := lib.a
obj-y := errno.o ctype.o string.o vsprintf.o cmdline.o \ lib-y := errno.o ctype.o string.o vsprintf.o cmdline.o \
bust_spinlocks.o rbtree.o radix-tree.o dump_stack.o \ bust_spinlocks.o rbtree.o radix-tree.o dump_stack.o \
kobject.o idr.o kobject.o idr.o
obj-$(CONFIG_RWSEM_GENERIC_SPINLOCK) += rwsem-spinlock.o lib-$(CONFIG_RWSEM_GENERIC_SPINLOCK) += rwsem-spinlock.o
obj-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.o lib-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.o
obj-$(CONFIG_SMP) += percpu_counter.o lib-$(CONFIG_SMP) += percpu_counter.o
ifneq ($(CONFIG_HAVE_DEC_LOCK),y) ifneq ($(CONFIG_HAVE_DEC_LOCK),y)
obj-y += dec_and_lock.o lib-y += dec_and_lock.o
endif endif
obj-$(CONFIG_CRC32) += crc32.o obj-$(CONFIG_CRC32) += crc32.o
......
...@@ -32,9 +32,7 @@ $(warning kbuild: $(obj)/Makefile - Usage of O_TARGET := $(O_TARGET) is obsolete ...@@ -32,9 +32,7 @@ $(warning kbuild: $(obj)/Makefile - Usage of O_TARGET := $(O_TARGET) is obsolete
endif endif
ifdef L_TARGET ifdef L_TARGET
ifneq ($(L_TARGET),lib.a) $(error kbuild: $(obj)/Makefile - Use of L_TARGET is replaced by lib-y in 2.5. Please fix!)
$(warning kbuild: $(obj)/Makefile - L_TARGET := $(L_TARGET) target shall be renamed to lib.a. Please fix!)
endif
endif endif
ifdef list-multi ifdef list-multi
...@@ -47,21 +45,19 @@ endif ...@@ -47,21 +45,19 @@ endif
# =========================================================================== # ===========================================================================
# If a Makefile does not define a L_TARGET, link an object called "built-in.o" ifneq ($(strip $(lib-y) $(lib-m) $(lib-n) $(lib-)),)
lib-target := $(obj)/lib.a
ifdef L_TARGET
L_TARGET := $(obj)/$(L_TARGET)
else
ifneq ($(strip $(obj-y) $(obj-m) $(obj-n) $(obj-)),)
O_TARGET := $(obj)/built-in.o
endif endif
ifneq ($(strip $(obj-y) $(obj-m) $(obj-n) $(obj-) $(lib-target)),)
builtin-target := $(obj)/built-in.o
endif endif
# We keep a list of all modules in $(MODVERDIR) # We keep a list of all modules in $(MODVERDIR)
touch-module = @echo $(@:.o=.ko) > $(MODVERDIR)/$(@F:.o=.mod) touch-module = @echo $(@:.o=.ko) > $(MODVERDIR)/$(@F:.o=.mod)
__build: $(if $(KBUILD_BUILTIN),$(O_TARGET) $(L_TARGET) $(extra-y)) \ __build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \
$(if $(KBUILD_MODULES),$(obj-m)) \ $(if $(KBUILD_MODULES),$(obj-m)) \
$(subdir-ym) $(always) $(subdir-ym) $(always)
@: @:
...@@ -203,7 +199,8 @@ cmd_as_o_S = $(CC) $(a_flags) -c -o $@ $< ...@@ -203,7 +199,8 @@ cmd_as_o_S = $(CC) $(a_flags) -c -o $@ $<
%.o: %.S FORCE %.o: %.S FORCE
$(call if_changed_dep,as_o_S) $(call if_changed_dep,as_o_S)
targets += $(real-objs-y) $(real-objs-m) $(extra-y) $(MAKECMDGOALS) $(always) targets += $(real-objs-y) $(real-objs-m) $(lib-y)
targets += $(extra-y) $(MAKECMDGOALS) $(always)
# Build the compiled-in targets # Build the compiled-in targets
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
...@@ -214,30 +211,30 @@ $(sort $(subdir-obj-y)): $(subdir-ym) ; ...@@ -214,30 +211,30 @@ $(sort $(subdir-obj-y)): $(subdir-ym) ;
# #
# Rule to compile a set of .o files into one .o file # Rule to compile a set of .o files into one .o file
# #
ifdef O_TARGET ifdef builtin-target
quiet_cmd_link_o_target = LD $@ quiet_cmd_link_o_target = LD $@
# If the list of objects to link is empty, just create an empty O_TARGET # If the list of objects to link is empty, just create an empty built-in.o
cmd_link_o_target = $(if $(strip $(obj-y)),\ cmd_link_o_target = $(if $(strip $(obj-y)),\
$(LD) $(ld_flags) -r -o $@ $(filter $(obj-y), $^),\ $(LD) $(ld_flags) -r -o $@ $(filter $(obj-y), $^),\
rm -f $@; $(AR) rcs $@) rm -f $@; $(AR) rcs $@)
$(O_TARGET): $(obj-y) FORCE $(builtin-target): $(obj-y) FORCE
$(call if_changed,link_o_target) $(call if_changed,link_o_target)
targets += $(O_TARGET) targets += $(builtin-target)
endif # O_TARGET endif # builtin-target
# #
# Rule to compile a set of .o files into one .a file # Rule to compile a set of .o files into one .a file
# #
ifdef L_TARGET ifdef lib-target
quiet_cmd_link_l_target = AR $@ quiet_cmd_link_l_target = AR $@
cmd_link_l_target = rm -f $@; $(AR) $(EXTRA_ARFLAGS) rcs $@ $(obj-y) cmd_link_l_target = rm -f $@; $(AR) $(EXTRA_ARFLAGS) rcs $@ $(lib-y)
$(L_TARGET): $(obj-y) FORCE $(lib-target): $(lib-y) FORCE
$(call if_changed,link_l_target) $(call if_changed,link_l_target)
targets += $(L_TARGET) targets += $(lib-target)
endif endif
# #
......
...@@ -18,6 +18,12 @@ extra-y += $(EXTRA_TARGETS) ...@@ -18,6 +18,12 @@ extra-y += $(EXTRA_TARGETS)
obj-m := $(filter-out $(obj-y),$(obj-m)) obj-m := $(filter-out $(obj-y),$(obj-m))
# Libraries are always collected in one lib file.
# Filter out objects already built-in
lib-y := $(filter-out $(obj-y), $(sort $(lib-y) $(lib-m)))
# Handle objects in subdirs # Handle objects in subdirs
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# o if we encounter foo/ in $(obj-y), replace it by foo/built-in.o # o if we encounter foo/ in $(obj-y), replace it by foo/built-in.o
...@@ -91,6 +97,7 @@ always := $(addprefix $(obj)/,$(always)) ...@@ -91,6 +97,7 @@ always := $(addprefix $(obj)/,$(always))
targets := $(addprefix $(obj)/,$(targets)) targets := $(addprefix $(obj)/,$(targets))
obj-y := $(addprefix $(obj)/,$(obj-y)) obj-y := $(addprefix $(obj)/,$(obj-y))
obj-m := $(addprefix $(obj)/,$(obj-m)) obj-m := $(addprefix $(obj)/,$(obj-m))
lib-y := $(addprefix $(obj)/,$(lib-y))
subdir-obj-y := $(addprefix $(obj)/,$(subdir-obj-y)) subdir-obj-y := $(addprefix $(obj)/,$(subdir-obj-y))
real-objs-y := $(addprefix $(obj)/,$(real-objs-y)) real-objs-y := $(addprefix $(obj)/,$(real-objs-y))
real-objs-m := $(addprefix $(obj)/,$(real-objs-m)) real-objs-m := $(addprefix $(obj)/,$(real-objs-m))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment