Patchwork more buildsystem refactoring

login
register
about
Submitter Patrick Georgi
Date 2010-03-16 11:40:52
Message ID <4B9F6E44.2020707@georgi-clan.de>
Download mbox | patch
Permalink /patch/1070/
State Accepted
Headers show

Comments

Patrick Georgi - 2010-03-16 11:40:52
Hi,

attached patch changes several things in the buildsystem:
- Single instance of the CC build rule in Makefile, instantiated as
necessary

- Remove manual static.o and option_table.o rules, they're now covered
by those instances of the CC build rule

- Normalize object file paths, so it can be $(obj)/option_table.o
instead of $(obj)/arch/i386/../../option_table.o now

- Add -pipe to compiler flags. It might be detrimental on rare scenarios
(building with extremly high disk bandwidth, eg. RAM disk), but it
significantly helps on win32 (which seems to cache less aggressively
than most unix-alikes)

- Silence stderr on hostname and domainname invocations (cosmetic fix
for cygwin)

- Test for -Wa,--divide functionality of the target compiler (taken from
abuild). It might be possible to remove most patches in crossgcc with that.

- Report build of failover.inc and romstage.inc


Signed-off-by: Patrick Georgi <patrick.georgi@coresystems.de
Peter Stuge - 2010-03-16 11:57:46
Patrick Georgi wrote:
> - Single instance of the CC build rule in Makefile, instantiated as
> necessary

Haha, wow, that really looks, interesting.. Not at all saying there's
any better way.


> - Report build of failover.inc and romstage.inc

Are these built into assembly files? Are those files named .S?
What does .inc mean?


> Signed-off-by: Patrick Georgi <patrick.georgi@coresystems.de

Acked-by: Peter Stuge <peter@stuge.se>
Patrick Georgi - 2010-03-16 12:02:02
Am 16.03.2010 12:57, schrieb Peter Stuge:
> Haha, wow, that really looks, interesting.. Not at all saying there's
> any better way.
Main advantage: a single rule that covers gcc invocations

Main disadvantage: Three levels of variable expansion ($, $$, $$$$)

Given that few people need to touch this, I considered the trade-off to
be okay.

>> - Report build of failover.inc and romstage.inc
> 
> Are these built into assembly files? Are those files named .S?
> What does .inc mean?
Maybe they really should be called .S, as that's what they are. We use
.inc by convention for assembly files that are supposed to be _inc_luded
into some larger form (mostly by crt0_includes.h)

>> Signed-off-by: Patrick Georgi <patrick.georgi@coresystems.de
> 
> Acked-by: Peter Stuge <peter@stuge.se>
Thanks, r5224


Patrick
Marc Jones - 2010-03-16 19:47:52
On Tue, Mar 16, 2010 at 5:40 AM, Patrick Georgi <patrick@georgi-clan.de> wrote:
> Hi,
>
> attached patch changes several things in the buildsystem:
> - Single instance of the CC build rule in Makefile, instantiated as
> necessary
>
> - Remove manual static.o and option_table.o rules, they're now covered
> by those instances of the CC build rule
>
> - Normalize object file paths, so it can be $(obj)/option_table.o
> instead of $(obj)/arch/i386/../../option_table.o now
>
> - Add -pipe to compiler flags. It might be detrimental on rare scenarios
> (building with extremly high disk bandwidth, eg. RAM disk), but it
> significantly helps on win32 (which seems to cache less aggressively
> than most unix-alikes)
>
> - Silence stderr on hostname and domainname invocations (cosmetic fix
> for cygwin)
>
> - Test for -Wa,--divide functionality of the target compiler (taken from
> abuild). It might be possible to remove most patches in crossgcc with that.
>

Can crossgcc benefit from the -pipe flag too?

Marc

Patch

Index: src/arch/i386/Makefile.inc
===================================================================
--- src/arch/i386/Makefile.inc	(revision 5223)
+++ src/arch/i386/Makefile.inc	(working copy)
@@ -42,7 +42,7 @@ 
 #######################################################################
 # i386 specific tools
 
-$(obj)/option_table.h $(obj)/option_table.c $(obj)/arch/i386/../../option_table.c: $(obj)/build_opt_tbl $(top)/src/mainboard/$(MAINBOARDDIR)/cmos.layout
+$(obj)/option_table.h $(obj)/option_table.c: $(obj)/build_opt_tbl $(top)/src/mainboard/$(MAINBOARDDIR)/cmos.layout
 	@printf "    OPTION     $(subst $(obj)/,,$(@))\n"
 	$(obj)/build_opt_tbl --config $(top)/src/mainboard/$(MAINBOARDDIR)/cmos.layout --header $(obj)/option_table.h --option $(obj)/option_table.c
 
@@ -183,9 +183,11 @@ 
 ROMCCFLAGS ?= -mcpu=p2 -O2
 
 $(obj)/mainboard/$(MAINBOARDDIR)/failover.inc: $(obj)/romcc $(src)/arch/i386/lib/failover.c
+	printf "    ROMCC      failover.inc\n"
 	$(obj)/romcc $(ROMCCFLAGS) --label-prefix=failover $(INCLUDES) $(src)/arch/i386/lib/failover.c -o $@
 
 $(obj)/mainboard/$(MAINBOARDDIR)/romstage.inc: $(src)/mainboard/$(MAINBOARDDIR)/romstage.c $(obj)/romcc $(OPTION_TABLE_H) $(obj)/build.h
+	printf "    ROMCC      romstage.inc\n"
 	$(obj)/romcc $(ROMCCFLAGS) -include $(obj)/build.h $(INCLUDES) $< -o $@
 
 else
@@ -194,6 +196,7 @@ 
 	$(CC) $(CFLAGS) $(CPPFLAGS) $(DEBUG_CFLAGS) -I$(src) -I. -c -S  $(src)/mainboard/$(MAINBOARDDIR)/ap_romstage.c -o $@
 
 $(obj)/mainboard/$(MAINBOARDDIR)/romstage.inc: $(src)/mainboard/$(MAINBOARDDIR)/romstage.c $(OPTION_TABLE_H) $(obj)/build.h
+	printf "    GEN        romstage.inc\n"
 	$(CC) $(CFLAGS) $(CPPFLAGS) $(DEBUG_CFLAGS) -include $(obj)/build.h -I$(src) -I. -c -S $< -o $@.tmp1
 	sed -e 's/\.rodata/.rom.data/g' -e 's/\.text/.section .rom.text/g' $@.tmp1 > $@.tmp
 	mv $@.tmp $@
Index: util/xcompile/xcompile
===================================================================
--- util/xcompile/xcompile	(revision 5223)
+++ util/xcompile/xcompile	(working copy)
@@ -75,6 +75,7 @@ 
 fi
 
 CC="${GCCPREFIX}gcc"
+testcc "$CC" "$CFLAGS-Wa,--divide " && CFLAGS="$CFLAGS-Wa,--divide "
 testcc "$CC" "$CFLAGS-fno-stack-protector " && CFLAGS="$CFLAGS-fno-stack-protector "
 testcc "$CC" "$CFLAGS-Wl,--build-id=none " && CFLAGS="$CFLAGS-Wl,--build-id=none "
 
Index: Makefile
===================================================================
--- Makefile	(revision 5223)
+++ Makefile	(working copy)
@@ -142,14 +142,6 @@ 
 	mkdir -p $(obj)/mainboard/$(MAINBOARDDIR)
 	(cd $(obj)/mainboard/$(MAINBOARDDIR) ; PYTHONPATH=$(top)/util/sconfig export PYTHONPATH; python config.py  $(MAINBOARDDIR) $(top) $(obj)/mainboard/$(MAINBOARDDIR))
 
-$(obj)/mainboard/$(MAINBOARDDIR)/static.o: $(obj)/mainboard/$(MAINBOARDDIR)/static.c
-	@printf "    CC         $(subst $(obj)/,,$(@))\n"
-	$(CC) $(CFLAGS) -c -o $@ $<
-
-$(obj)/arch/i386/../../option_table.o: $(obj)/arch/i386/../../option_table.c
-	@printf "    CC         $(subst $(obj)/,,$(@))\n"
-	$(CC) $(CFLAGS) -c -o $@ $<
-
 objs:=$(obj)/mainboard/$(MAINBOARDDIR)/static.o
 initobjs:=
 drivers:=
@@ -168,11 +160,11 @@ 
 	$(if $(strip $(3)), \
 		$(foreach type,$(2), \
 			$(eval $(type)s+= \
-				$$(patsubst util/%, \
+				$$(abspath $$(patsubst util/%, \
 					$(obj)/util/%, \
 					$$(patsubst src/%, \
 						$(obj)/%, \
-						$$(addprefix $(dir $(1)),$$($(type)-y))))))) \
+						$$(addprefix $(dir $(1)),$$($(type)-y)))))))) \
 	$(eval subdirs+=$$(subst $(PWD)/,,$$(abspath $$(addprefix $(dir $(1)),$$(subdirs-y)))))
 
 # For each path in $(subdirs) call includemakefiles, passing $(1) as $(3)
@@ -213,62 +205,36 @@ 
 	$(CC) $$(CFLAGS) $$(if $$(subst dsdt,,$$(basename $$(notdir $$@))), -DAmlCode=AmlCode_$$(basename $$(notdir $$@))) -c -o $$@ $$(basename $$@).c
 endef
 
-define objs_c_template
-$(obj)/$(1)%.o: $(1)%.c $(obj)/config.h
-	@printf "    CC         $$(subst $$(obj)/,,$$(@))\n"
-	$(CC) $$(CFLAGS) -c -o $$@ $$<
+# macro to define template macros that are used by use_template macro
+define create_cc_template
+# $1 obj class (objs, initobjs, ...)
+# $2 source suffix (c, S)
+# $3 .o infix ("" ".initobj", ...)
+# $4 additional compiler flags
+de$(EMPTY)fine $(1)_$(2)_template
+$(obj)/$$(1)%$(3).o: $$(1)%.$(2) $(obj)/config.h
+	printf "    CC         $$$$(subst $$$$(obj)/,,$$$$(@))\n"
+	$(CC) $(4) $$$$(CFLAGS) -c -o $$$$@ $$$$<
 
-$(obj)/$(1)%.o: src/$(1)%.c $(obj)/config.h
-	@printf "    CC         $$(subst $$(obj)/,,$$(@))\n"
-	$(CC) $$(CFLAGS) -c -o $$@ $$<
-endef
+$(obj)/$$(1)%$(3).o: src/$$(1)%.$(2) $(obj)/config.h
+	printf "    CC         $$$$(subst $$$$(obj)/,,$$$$(@))\n"
+	$(CC) $(4) $$$$(CFLAGS) -c -o $$$$@ $$$$<
 
-define objs_S_template
-$(obj)/$(1)%.o: $(1)%.S $(obj)/config.h
-	@printf "    CC         $$(subst $$(obj)/,,$$(@))\n"
-	$(CC) -DASSEMBLY $$(CFLAGS) -c -o $$@ $$<
-
-$(obj)/$(1)%.o: src/$(1)%.S $(obj)/config.h
-	@printf "    CC         $$(subst $$(obj)/,,$$(@))\n"
-	$(CC) -DASSEMBLY $$(CFLAGS) -c -o $$@ $$<
+$(obj)/$$(1)%$(3).o: obj/$$(1)%.$(2) $(obj)/config.h
+	printf "    CC         $$$$(subst $$$$(obj)/,,$$$$(@))\n"
+	$(CC) $(4) $$$$(CFLAGS) -c -o $$$$@ $$$$<
+en$(EMPTY)def
 endef
 
-define initobjs_c_template
-$(obj)/$(1)%.initobj.o: src/$(1)%.c $(obj)/config.h
-	@printf "    CC         $$(subst $$(obj)/,,$$(@))\n"
-	$(CC) $$(CFLAGS) -c -o $$@ $$<
-endef
+$(eval $(call create_cc_template,objs,c))
+$(eval $(call create_cc_template,objs,S,,-DASSEMBLY))
+$(eval $(call create_cc_template,initobjs,c,.initobj))
+$(eval $(call create_cc_template,initobjs,S,.initobj,-DASSEMBLY))
+$(eval $(call create_cc_template,drivers,c,.driver))
+$(eval $(call create_cc_template,drivers,S,.driver,-DASSEMBLY))
+$(eval $(call create_cc_template,smmobjs,c,.smmobj))
+$(eval $(call create_cc_template,smmobjs,S,.smmobj))
 
-define initobjs_S_template
-$(obj)/$(1)%.initobj.o: src/$(1)%.S $(obj)/config.h
-	@printf "    CC         $$(subst $$(obj)/,,$$(@))\n"
-	$(CC) -DASSEMBLY $$(CFLAGS) -c -o $$@ $$<
-endef
-
-define drivers_c_template
-$(obj)/$(1)%.driver.o: src/$(1)%.c $(obj)/config.h
-	@printf "    CC         $$(subst $$(obj)/,,$$(@))\n"
-	$(CC) $$(CFLAGS) -c -o $$@ $$<
-endef
-
-define drivers_S_template
-$(obj)/$(1)%.driver.o: src/$(1)%.S
-	@printf "    CC         $$(subst $$(obj)/,,$$(@))\n"
-	$(CC) -DASSEMBLY $$(CFLAGS) -c -o $$@ $$<
-endef
-
-define smmobjs_c_template
-$(obj)/$(1)%.smmobj.o: src/$(1)%.c
-	@printf "    CC         $$(subst $$(obj)/,,$$(@))\n"
-	$(CC) $$(CFLAGS) -c -o $$@ $$<
-endef
-
-define smmobjs_S_template
-$(obj)/$(1)%.smmobj.o: src/$(1)%.S
-	@printf "    CC         $$(subst $$(obj)/,,$$(@))\n"
-	$(CC) $$(CFLAGS) -c -o $$@ $$<
-endef
-
 usetemplate=$(foreach d,$(sort $(dir $($(1)))),$(eval $(call $(1)_$(2)_template,$(subst $(obj)/,,$(d)))))
 usetemplate=$(foreach d,$(sort $(dir $($(1)))),$(eval $(call $(1)_$(2)_template,$(subst $(obj)/,,$(d)))))
 $(eval $(call usetemplate,objs,asl))
@@ -298,7 +264,7 @@ 
 INCLUDES += -I$(top)/util/x86emu/include
 INCLUDES += -include $(obj)/config.h
 
-CFLAGS = $(INCLUDES) -Os -nostdinc
+CFLAGS = $(INCLUDES) -Os -nostdinc -pipe
 CFLAGS += -nostdlib -Wall -Wundef -Wstrict-prototypes -Wmissing-prototypes
 CFLAGS += -Wwrite-strings -Wredundant-decls -Wno-trigraphs 
 CFLAGS += -Wstrict-aliasing -Wshadow
@@ -337,8 +303,8 @@ 
 	printf "#define COREBOOT_LINKER \"$(shell LANG= $(LD) --version | head -n1)\"\n" >> $(obj)/build.ht
 	printf "#define COREBOOT_COMPILE_TIME \"`LANG= date +%T`\"\n" >> $(obj)/build.ht
 	printf "#define COREBOOT_COMPILE_BY \"$(subst \,@,$(shell PATH=$$PATH:/usr/ucb whoami))\"\n" >> $(obj)/build.ht
-	printf "#define COREBOOT_COMPILE_HOST \"$(shell hostname -s)\"\n" >> $(obj)/build.ht
-	printf "#define COREBOOT_COMPILE_DOMAIN \"$(shell test `uname -s` = "Linux" && dnsdomainname || domainname)\"\n" >> $(obj)/build.ht
+	printf "#define COREBOOT_COMPILE_HOST \"$(shell hostname -s 2>/dev/null)\"\n" >> $(obj)/build.ht
+	printf "#define COREBOOT_COMPILE_DOMAIN \"$(shell test `uname -s` = "Linux" && dnsdomainname || domainname 2>/dev/null)\"\n" >> $(obj)/build.ht
 	printf "#endif\n" >> $(obj)/build.ht
 	mv $(obj)/build.ht $(obj)/build.h