Spurious recompile with defconfig
Subsystems (2)
When compiling aic7xxx in 2.5.53 with defconfig the kernel always recompiles because dependency for reg_print.c is not
per default in the aic7xxx Makefile.
Simple correction is to make PRETTY_PRINT dependend on BUILD_FIRMWARE.
Sam
===== drivers/scsi/aic7xxx/Kconfig.aic79xx 1.5 vs edited =====
drivers/scsi/aic7xxx/Kconfig.aic79xx +1 -1
@@ -87,7 +87,7 @@ config AIC79XX_REG_PRETTY_PRINT bool "Decode registers during diagnostics" - depends on SCSI_AIC79XX + depends on SCSI_AIC79XX && SCSI_AIC7XXX_BUILD_FIRMWARE default y help Compile in register value tables for the output of expanded register
===== drivers/scsi/aic7xxx/Kconfig.aic7xxx 1.6 vs edited =====
drivers/scsi/aic7xxx/Kconfig.aic7xxx +1 -1
@@ -92,7 +92,7 @@ config AIC7XXX_REG_PRETTY_PRINT bool "Decode registers during diagnostics" - depends on SCSI_AIC7XXX + depends on SCSI_AIC7XXX && SCSI_AIC7XXX_BUILD_FIRMWARE default y help Compile in register value tables for the output of expanded register
Quoted 4 lines
When compiling aic7xxx in 2.5.53 with defconfig the kernel always recompiles because dependency for
reg_print.cis not
per default in the aic7xxxMakefile.
Simple correction is to makePRETTY_PRINTdependend onBUILD_FIRMWARE.
There must be some other problem in the Makefile. You can turn on reg pretty printing without having to build the firmware as there is a "shipped" version of that file. I'll see if I can figure out why the re-build is occurring.
--
Justin
Quoted 9 lines
Quoted 4 lines
When compiling aic7xxx in 2.5.53 with defconfig the kernel always recompiles because dependency for
reg_print.cis not
per default in the aic7xxxMakefile.
Simple correction is to makePRETTY_PRINTdependend onBUILD_FIRMWARE.There must be some other problem in the
Makefile. You can turn on reg pretty printing without having to build the firmware as there is a "shipped" version of that file. I'll see if I can figure out why the re-build is occurring.
The real problem here is that make choses the wrong path for getting to reg_print.o and, since "intermediate files" were used, those files are removed once the target is made (See "Chained Rules" in the gmake info file). From the "make -d" output, for some reason make decides that:
.o <- .s <- .c <- .c_shipped
is better than
.o <- .c <- .c_shipped
I can't see, from a cursory investigation of the 2.5.X Makefiles why this happens, but it is certainly anoying. The info pages indicate that the removal can be avoided by listing these files as prerequisites to .SECONDARY, but I could only get that to work by leaving the prerequisites empty (all files are marked secondary). Of course this is just a workaround for incorrect behavior. Perhaps someone with more knowledge of the 2.5.X build system could look into this? That way we can restore the original (and correct) behvior of the driver's Kconfig files.
--
Justin
Quoted 6 lines · Justin T. Gibbs
The real problem here is that make choses the wrong path for getting to reg_print.o and, since "intermediate files" were used, those files are removed once the target is made (See "Chained Rules" in the gmake info file). From the "make -d" output, for some reason make decides that:
Quoted 8 lines
.o <- .s <- .c <- .c_shippedis better than
.o <- .c <- .c_shippedI can't see, from a cursory investigation of the 2.5.X Makefiles why this happens, but it is certainly anoying.
Seems the pattern rule involving _shipped was fooling make somehow. I listed the dependencies explicit (reg_print.c_shipped -> reg_print.c) explicit and it worked.
Did a little more makefile tricks while I was there.
aicasm is too overloaded, it would have been better to have separate tools for some of this.
Please forward to Linus if you find it OK.
Sam
===== drivers/scsi/aic7xxx/Makefile 1.18 vs edited =====
drivers/scsi/aic7xxx/Makefile +24 -26
@@ -43,41 +43,39 @@ # Dependencies for generated files need to be listed explicitly $(obj)/aic7xxx_core.o: $(obj)/aic7xxx_seq.h +$(obj)/aic7xxx_reg_print.c: $(src)/aic7xxx_reg_print.c_shipped + $(obj)/aic79xx_core.o: $(obj)/aic79xx_seq.h +$(obj)/aic79xx_reg_print.c: $(src)/aic79xx_reg_print.c_shipped $(addprefix $(obj)/,$(aic7xxx-y)): $(obj)/aic7xxx_reg.h $(addprefix $(obj)/,$(aic79xx-y)): $(obj)/aic79xx_reg.h -ifeq ($(CONFIG_AIC7XXX_BUILD_FIRMWARE),y) -aic7xxx_gen = $(obj)/aic7xxx_seq.h $(obj)/aic7xxx_reg.h -ifeq ($(CONFIG_AIC7XXX_REG_PRETTY_PRINT),y) -aic7xxx_gen += $(obj)/aic7xxx_reg_print.c -aic7xxx_asm_cmd = $(obj)/aicasm/aicasm -I$(src) -r $(obj)/aic7xxx_reg.h \ - -p $(obj)/aic7xxx_reg_print.c -i aic7xxx_osm.h \ - -o $(obj)/aic7xxx_seq.h $(src)/aic7xxx.seq -else -aic7xxx_asm_cmd = $(obj)/aicasm/aicasm -I$(src) -r $(obj)/aic7xxx_reg.h \ - -o $(obj)/aic7xxx_seq.h $(src)/aic7xxx.seq -endif +aic7xxx-gen-$(CONFIG_AIC7XXX_BUILD_FIRMWARE) := $(obj)/aic7xxx_seq.h \ + $(obj)/aic7xxx_reg.h +aic7xxx-gen-$(CONFIG_AIC7XXX_REG_PRETTY_PRINT) += $(obj)/aic7xxx_reg_print.c + +aicasm-7xxx-flags-$(CONFIG_AIC7XXX_REG_PRETTY_PRINT) := \ + -p $(obj)/aic7xxx_reg_print.c -i aic7xxx_osm.h -$(aic7xxx_gen): $(src)/aic7xxx.seq $(src)/aic7xxx.reg $(obj)/aicasm/aicasm - $(aic7xxx_asm_cmd) +ifneq ($(CONFIG_AIC7XXX_REG_PRETTY_PRINT)$(CONFIG_AIC7XXX_BUILD_FIRMWARE),) +$(aic7xxx-gen-y): $(src)/aic7xxx.seq $(src)/aic7xxx.reg $(obj)/aicasm/aicasm + $(obj)/aicasm/aicasm -I$(src) -r $(obj)/aic7xxx_reg.h \ + $(aicasm-7xxx-flags-y) -o $(obj)/aic7xxx_seq.h $< endif -ifeq ($(CONFIG_AIC79XX_BUILD_FIRMWARE),y) -aic79xx_gen = $(obj)/aic79xx_seq.h $(obj)/aic79xx_reg.h -ifeq ($(CONFIG_AIC79XX_REG_PRETTY_PRINT),y) -aic79xx_gen += $(obj)/aic79xx_reg_print.c -aic79xx_asm_cmd = $(obj)/aicasm/aicasm -I$(src) -r $(obj)/aic79xx_reg.h \ - -p $(obj)/aic79xx_reg_print.c -i aic79xx_osm.h \ - -o $(obj)/aic79xx_seq.h $(src)/aic79xx.seq -else -aic79xx_asm_cmd = $(obj)/aicasm/aicasm -I$(src) -r $(obj)/aic79xx_reg.h \ - -o $(obj)/aic79xx_seq.h $(src)/aic79xx.seq +aic79xx-gen-$(CONFIG_AIC79XX_BUILD_FIRMWARE) := $(obj)/aic79xx_seq.h \ + $(obj)/aic79xx_reg.h +aic79xx-gen-$(CONFIG_AIC79XX_REG_PRETTY_PRINT) += $(obj)/aic79xx_reg_print.c + +aicasm-79xx-flags-$(CONFIG_AIC79XX_REG_PRETTY_PRINT) := \ + -p $(obj)/aic79xx_reg_print.c -i aic79xx_osm.h + +ifneq ($(CONFIG_AIC79XX_REG_PRETTY_PRINT)$(CONFIG_AIC79XX_BUILD_FIRMWARE),) +$(aic79xx-gen-y): $(src)/aic79xx.seq $(src)/aic79xx.reg $(obj)/aicasm/aicasm + $(obj)/aicasm/aicasm -I$(src) -r $(obj)/aic79xx_reg.h + $(aicasm-79xx-flags-y) -o $(obj)/aic79xx_seq.h $< endif -$(aic79xx_gen): $(src)/aic79xx.seq $(src)/aic79xx.reg $(obj)/aicasm/aicasm - $(aic79xx_asm_cmd) -endif $(obj)/aicasm/aicasm: $(src)/aicasm/*.[chyl] $(MAKE) -C $(src)/aicasm