diff mbox series

[XEN,v6,05/31] build: factorise generation of the linker scripts

Message ID 20210701141011.785641-6-anthony.perard@citrix.com (mailing list archive)
State New, archived
Headers show
Series xen: Build system improvements | expand

Commit Message

Anthony PERARD July 1, 2021, 2:09 p.m. UTC
In Arm and X86 makefile, generating the linker script is the same, so
we can simply have both call the same macro.

We need to add *.lds files into extra-y so that Rules.mk can find the
.*.cmd dependency file and load it.

Change made to the command line:
- Use cpp_flags macro which simply filter -Wa,% options from $(a_flags).
- Added -D__LINKER__ even it is only used by Arm's lds.

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---

Notes:
    v6:
    - CPP already used instead of CC -E
    - -Ui386 already removed
    - cpp_flags is now a macro
    - rebased
    
    v5:
    - rename cc_lds_S to cpp_lds_S as the binary runned is now CPP
    - Use new cpp_flags instead of the open-coded filter of a_flags.
    
    v4:
    - fix rebuild by adding FORCE as dependency
    - Use $(CPP)
    - remove -Ui386
    - avoid using "define" for cmd_cc_lds_S, as adding '; \' on each line is
      still mandatory for if_changed (or cmd) macro to work.

 xen/Rules.mk          | 4 ++++
 xen/arch/arm/Makefile | 6 ++++--
 xen/arch/x86/Makefile | 6 ++++--
 3 files changed, 12 insertions(+), 4 deletions(-)

Comments

Jan Beulich July 7, 2021, 2:25 p.m. UTC | #1
On 01.07.2021 16:09, Anthony PERARD wrote:
> In Arm and X86 makefile, generating the linker script is the same, so
> we can simply have both call the same macro.
> 
> We need to add *.lds files into extra-y so that Rules.mk can find the
> .*.cmd dependency file and load it.
> 
> Change made to the command line:
> - Use cpp_flags macro which simply filter -Wa,% options from $(a_flags).
> - Added -D__LINKER__ even it is only used by Arm's lds.

I'm not really happy about this, not the least because the symbol's name
doesn't fit its purpose (we're not linking, but producing a linker script
at that stage), but well ...

> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>

Reviewed-by: Jan Beulich <jbeulich@suse.com>

Jan
Anthony PERARD July 12, 2021, 11:02 a.m. UTC | #2
On Wed, Jul 07, 2021 at 04:25:33PM +0200, Jan Beulich wrote:
> On 01.07.2021 16:09, Anthony PERARD wrote:
> > In Arm and X86 makefile, generating the linker script is the same, so
> > we can simply have both call the same macro.
> > 
> > We need to add *.lds files into extra-y so that Rules.mk can find the
> > .*.cmd dependency file and load it.
> > 
> > Change made to the command line:
> > - Use cpp_flags macro which simply filter -Wa,% options from $(a_flags).
> > - Added -D__LINKER__ even it is only used by Arm's lds.
> 
> I'm not really happy about this, not the least because the symbol's name
> doesn't fit its purpose (we're not linking, but producing a linker script
> at that stage), but well ...

Also, the leading "__" is probably a bad idea as I think it's reserved?

I'll look at adding creating a patch which would rename that to
LINKER_SCRIPT which seems more appropriate.

> > Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
> 
> Reviewed-by: Jan Beulich <jbeulich@suse.com>

Thanks,
Jan Beulich July 13, 2021, 7:28 a.m. UTC | #3
On 12.07.2021 13:02, Anthony PERARD wrote:
> On Wed, Jul 07, 2021 at 04:25:33PM +0200, Jan Beulich wrote:
>> On 01.07.2021 16:09, Anthony PERARD wrote:
>>> In Arm and X86 makefile, generating the linker script is the same, so
>>> we can simply have both call the same macro.
>>>
>>> We need to add *.lds files into extra-y so that Rules.mk can find the
>>> .*.cmd dependency file and load it.
>>>
>>> Change made to the command line:
>>> - Use cpp_flags macro which simply filter -Wa,% options from $(a_flags).
>>> - Added -D__LINKER__ even it is only used by Arm's lds.
>>
>> I'm not really happy about this, not the least because the symbol's name
>> doesn't fit its purpose (we're not linking, but producing a linker script
>> at that stage), but well ...
> 
> Also, the leading "__" is probably a bad idea as I think it's reserved?

I guess that's intentional in this case, matching in particular
__ASSEMBLY__.

Jan
diff mbox series

Patch

diff --git a/xen/Rules.mk b/xen/Rules.mk
index 4adc90eec80d..f05b2d3f0399 100644
--- a/xen/Rules.mk
+++ b/xen/Rules.mk
@@ -255,6 +255,10 @@  cmd_cpp_s_S = $(CPP) $(call cpp_flags,$(a_flags)) -MQ $@ -o $@ $<
 %.s: %.S FORCE
 	$(call if_changed,cpp_s_S)
 
+# Linker scripts, .lds.S -> .lds
+quiet_cmd_cpp_lds_S = LDS     $@
+cmd_cpp_lds_S = $(CPP) -P $(call cpp_flags,$(a_flags)) -D__LINKER__ -MQ $@ -o $@ $<
+
 # Add intermediate targets:
 # When building objects with specific suffix patterns, add intermediate
 # targets that the final targets are derived from.
diff --git a/xen/arch/arm/Makefile b/xen/arch/arm/Makefile
index 3d3b97b5b440..0edd9dee6f49 100644
--- a/xen/arch/arm/Makefile
+++ b/xen/arch/arm/Makefile
@@ -66,6 +66,8 @@  obj-y += vpsci.o
 obj-y += vuart.o
 extra-y += $(TARGET_SUBARCH)/head.o
 
+extra-y += xen.lds
+
 #obj-bin-y += ....o
 
 ifneq ($(CONFIG_DTB_FILE),"")
@@ -133,8 +135,8 @@  $(TARGET)-syms: prelink.o xen.lds
 .PHONY: include
 include:
 
-xen.lds: xen.lds.S
-	$(CPP) -P $(a_flags) -D__LINKER__ -MQ $@ -o $@ $<
+xen.lds: xen.lds.S FORCE
+	$(call if_changed,cpp_lds_S)
 
 dtb.o: $(patsubst "%",%,$(CONFIG_DTB_FILE))
 
diff --git a/xen/arch/x86/Makefile b/xen/arch/x86/Makefile
index 2ec883456e48..08a4ec1944d3 100644
--- a/xen/arch/x86/Makefile
+++ b/xen/arch/x86/Makefile
@@ -79,6 +79,7 @@  obj-y += sysctl.o
 endif
 
 extra-y += asm-macros.i
+extra-y += xen.lds
 
 ifneq ($(CONFIG_HVM),y)
 x86_emulate.o: CFLAGS-y += -Wno-unused-label
@@ -240,6 +241,7 @@  endif
 note_file_option ?= $(note_file)
 
 ifeq ($(XEN_BUILD_PE),y)
+extra-y += efi.lds
 $(TARGET).efi: prelink.o $(note_file) efi.lds efi/relocs-dummy.o efi/mkreloc
 ifeq ($(CONFIG_DEBUG_INFO),y)
 	$(if $(filter --strip-debug,$(EFI_LDFLAGS)),echo,:) "Will strip debug info from $(@F)"
@@ -292,8 +294,8 @@  $(BASEDIR)/include/asm-x86/asm-macros.h: asm-macros.i Makefile
 	$(call move-if-changed,$@.new,$@)
 
 efi.lds: AFLAGS-y += -DEFI
-xen.lds efi.lds: xen.lds.S
-	$(CPP) -P $(filter-out -Wa$(comma)%,$(a_flags)) -MQ $@ -o $@ $<
+xen.lds efi.lds: xen.lds.S FORCE
+	$(call if_changed,cpp_lds_S)
 
 boot/mkelf32: boot/mkelf32.c
 	$(HOSTCC) $(HOSTCFLAGS) -o $@ $<