mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
build: set XEN_BUILD_EFI earlier
We are going to need the variable XEN_BUILD_EFI earlier.
But a side effect of calculating the value of $(XEN_BUILD_EFI) is to
also to generate "efi/check.o" which is used for further checks.
Thus the whole chain that check for EFI support is moved to
"arch.mk".
Some other changes are made to avoid too much duplication:
- $(efi-check): Used to avoid repeating "efi/check.*". We don't
set it to the path to the source as it would be wrong as soon
as we support out-of-tree build.
- $(LD_PE_check_cmd): As it is called twice, with an updated
$(EFI_LDFLAGS).
$(nr-fixups) is renamed to $(efi-nr-fixups) as the former might be
a bit too generic.
In order to avoid exporting MKRELOC, the variable is added to $(MAKE)
command line. The only modification needed is in target "build", the
modification target "$(TARGET)" will be needed with a following patch
"build: avoid re-executing the main Makefile by introducing build.mk".
We can now revert 24b0ce9a5d, we don't need to override efi-y on
recursion anymore.
Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
1 parent
2a565f9b40
commit
672f2198f4
3 files changed
+50
-42
No files matched your search
+2
-2
@@ -296,7 +296,7 @@ endif # need-config
|
||||
.PHONY: build install uninstall clean distclean MAP
|
||||
build install uninstall debug clean distclean MAP::
|
||||
ifneq ($(XEN_TARGET_ARCH),x86_32)
|
||||
$(MAKE) -f Rules.mk _$@
|
||||
$(MAKE) -f Rules.mk MKRELOC=$(MKRELOC) _$@
|
||||
else
|
||||
echo "*** Xen x86/32 target no longer supported!"
|
||||
endif
|
||||
@@ -404,7 +404,7 @@ $(TARGET): FORCE
|
||||
$(MAKE) -f $(BASEDIR)/Rules.mk -C include
|
||||
$(MAKE) -f $(BASEDIR)/Rules.mk -C arch/$(TARGET_ARCH) include
|
||||
$(MAKE) -f $(BASEDIR)/Rules.mk arch/$(TARGET_ARCH)/include/asm/asm-offsets.h
|
||||
$(MAKE) -f $(BASEDIR)/Rules.mk -C arch/$(TARGET_ARCH) $@
|
||||
$(MAKE) -f $(BASEDIR)/Rules.mk -C arch/$(TARGET_ARCH) MKRELOC=$(MKRELOC) $@
|
||||
|
||||
quiet_cmd_banner = BANNER $@
|
||||
define cmd_banner
|
||||
|
||||
+6
-40
@@ -121,44 +121,8 @@ $(TARGET): $(TARGET)-syms $(efi-y) boot/mkelf32
|
||||
{ echo "No Multiboot2 header found" >&2; false; }
|
||||
mv $(TMP) $(TARGET)
|
||||
|
||||
ifneq ($(efi-y),)
|
||||
|
||||
# Check if the compiler supports the MS ABI.
|
||||
export XEN_BUILD_EFI := $(shell $(CC) $(XEN_CFLAGS) -c efi/check.c -o efi/check.o 2>/dev/null && echo y)
|
||||
CFLAGS-$(XEN_BUILD_EFI) += -DXEN_BUILD_EFI
|
||||
|
||||
# Check if the linker supports PE.
|
||||
EFI_LDFLAGS = $(patsubst -m%,-mi386pep,$(XEN_LDFLAGS)) --subsystem=10
|
||||
XEN_BUILD_PE := $(if $(XEN_BUILD_EFI),$(call ld-option,$(EFI_LDFLAGS) --image-base=0x100000000 -o efi/check.efi efi/check.o))
|
||||
# If the above failed, it may be merely because of the linker not dealing well
|
||||
# with debug info. Try again with stripping it.
|
||||
ifeq ($(CONFIG_DEBUG_INFO)-$(XEN_BUILD_PE),y-n)
|
||||
EFI_LDFLAGS += --strip-debug
|
||||
XEN_BUILD_PE := $(call ld-option,$(EFI_LDFLAGS) --image-base=0x100000000 -o efi/check.efi efi/check.o)
|
||||
endif
|
||||
|
||||
ifeq ($(XEN_BUILD_PE),y)
|
||||
|
||||
# Check if the linker produces fixups in PE by default
|
||||
nr-fixups := $(shell $(OBJDUMP) -p efi/check.efi | grep '^[[:blank:]]*reloc[[:blank:]]*[0-9][[:blank:]].*DIR64$$' | wc -l)
|
||||
ifeq ($(nr-fixups),2)
|
||||
MKRELOC := :
|
||||
relocs-dummy :=
|
||||
else
|
||||
MKRELOC := efi/mkreloc
|
||||
relocs-dummy := efi/relocs-dummy.o
|
||||
# If the linker produced fixups but not precisely two of them, we need to
|
||||
# disable it doing so. But if it didn't produce any fixups, it also wouldn't
|
||||
# recognize the option.
|
||||
ifneq ($(nr-fixups),0)
|
||||
EFI_LDFLAGS += --disable-reloc-section
|
||||
endif
|
||||
endif
|
||||
|
||||
endif # $(XEN_BUILD_PE)
|
||||
|
||||
endif # $(efi-y)
|
||||
|
||||
ALL_OBJS := $(BASEDIR)/arch/x86/boot/built_in.o $(BASEDIR)/arch/x86/efi/built_in.o $(ALL_OBJS)
|
||||
|
||||
ifeq ($(CONFIG_LTO),y)
|
||||
@@ -182,13 +146,13 @@ $(TARGET)-syms: prelink.o xen.lds
|
||||
$(NM) -pa --format=sysv $(@D)/.$(@F).0 \
|
||||
| $(BASEDIR)/tools/symbols $(all_symbols) --sysv --sort \
|
||||
>$(@D)/.$(@F).0.S
|
||||
$(MAKE) -f $(BASEDIR)/Rules.mk efi-y= $(@D)/.$(@F).0.o
|
||||
$(MAKE) -f $(BASEDIR)/Rules.mk $(@D)/.$(@F).0.o
|
||||
$(LD) $(XEN_LDFLAGS) -T xen.lds -N prelink.o $(build_id_linker) \
|
||||
$(@D)/.$(@F).0.o -o $(@D)/.$(@F).1
|
||||
$(NM) -pa --format=sysv $(@D)/.$(@F).1 \
|
||||
| $(BASEDIR)/tools/symbols $(all_symbols) --sysv --sort $(syms-warn-dup-y) \
|
||||
>$(@D)/.$(@F).1.S
|
||||
$(MAKE) -f $(BASEDIR)/Rules.mk efi-y= $(@D)/.$(@F).1.o
|
||||
$(MAKE) -f $(BASEDIR)/Rules.mk $(@D)/.$(@F).1.o
|
||||
$(LD) $(XEN_LDFLAGS) -T xen.lds -N prelink.o $(build_id_linker) \
|
||||
$(@D)/.$(@F).1.o -o $@
|
||||
$(NM) -pa --format=sysv $(@D)/$(@F) \
|
||||
@@ -217,8 +181,10 @@ endif
|
||||
|
||||
$(TARGET).efi: VIRT_BASE = 0x$(shell $(NM) efi/relocs-dummy.o | sed -n 's, A VIRT_START$$,,p')
|
||||
ifeq ($(MKRELOC),:)
|
||||
relocs-dummy :=
|
||||
$(TARGET).efi: ALT_BASE :=
|
||||
else
|
||||
relocs-dummy := efi/relocs-dummy.o
|
||||
$(TARGET).efi: ALT_BASE = 0x$(shell $(NM) efi/relocs-dummy.o | sed -n 's, A ALT_START$$,,p')
|
||||
endif
|
||||
|
||||
@@ -250,14 +216,14 @@ endif
|
||||
$(MKRELOC) $(foreach base,$(VIRT_BASE) $(ALT_BASE),$(@D)/.$(@F).$(base).0) >$(@D)/.$(@F).0r.S
|
||||
$(NM) -pa --format=sysv $(@D)/.$(@F).$(VIRT_BASE).0 \
|
||||
| $(BASEDIR)/tools/symbols $(all_symbols) --sysv --sort >$(@D)/.$(@F).0s.S
|
||||
$(MAKE) -f $(BASEDIR)/Rules.mk efi-y= $(@D)/.$(@F).0r.o $(@D)/.$(@F).0s.o
|
||||
$(MAKE) -f $(BASEDIR)/Rules.mk $(@D)/.$(@F).0r.o $(@D)/.$(@F).0s.o
|
||||
$(foreach base, $(VIRT_BASE) $(ALT_BASE), \
|
||||
$(LD) $(call EFI_LDFLAGS,$(base)) -T efi.lds -N $< \
|
||||
$(@D)/.$(@F).0r.o $(@D)/.$(@F).0s.o $(note_file_option) -o $(@D)/.$(@F).$(base).1 &&) :
|
||||
$(MKRELOC) $(foreach base,$(VIRT_BASE) $(ALT_BASE),$(@D)/.$(@F).$(base).1) >$(@D)/.$(@F).1r.S
|
||||
$(NM) -pa --format=sysv $(@D)/.$(@F).$(VIRT_BASE).1 \
|
||||
| $(BASEDIR)/tools/symbols $(all_symbols) --sysv --sort >$(@D)/.$(@F).1s.S
|
||||
$(MAKE) -f $(BASEDIR)/Rules.mk efi-y= $(@D)/.$(@F).1r.o $(@D)/.$(@F).1s.o
|
||||
$(MAKE) -f $(BASEDIR)/Rules.mk $(@D)/.$(@F).1r.o $(@D)/.$(@F).1s.o
|
||||
$(LD) $(call EFI_LDFLAGS,$(VIRT_BASE)) -T efi.lds -N $< \
|
||||
$(@D)/.$(@F).1r.o $(@D)/.$(@F).1s.o $(note_file_option) -o $@
|
||||
$(NM) -pa --format=sysv $(@D)/$(@F) \
|
||||
|
||||
@@ -60,5 +60,47 @@ ifeq ($(CONFIG_UBSAN),y)
|
||||
$(call cc-option-add,CFLAGS_UBSAN,CC,-fno-sanitize=alignment)
|
||||
endif
|
||||
|
||||
ifneq ($(CONFIG_PV_SHIM_EXCLUSIVE),y)
|
||||
|
||||
efi-check := arch/x86/efi/check
|
||||
|
||||
# Check if the compiler supports the MS ABI.
|
||||
XEN_BUILD_EFI := $(call if-success,$(CC) $(CFLAGS) -c $(efi-check).c -o $(efi-check).o,y)
|
||||
|
||||
# Check if the linker supports PE.
|
||||
EFI_LDFLAGS := $(patsubst -m%,-mi386pep,$(LDFLAGS)) --subsystem=10
|
||||
LD_PE_check_cmd = $(call ld-option,$(EFI_LDFLAGS) --image-base=0x100000000 -o $(efi-check).efi $(efi-check).o)
|
||||
XEN_BUILD_PE := $(LD_PE_check_cmd)
|
||||
|
||||
# If the above failed, it may be merely because of the linker not dealing well
|
||||
# with debug info. Try again with stripping it.
|
||||
ifeq ($(CONFIG_DEBUG_INFO)-$(XEN_BUILD_PE),y-n)
|
||||
EFI_LDFLAGS += --strip-debug
|
||||
XEN_BUILD_PE := $(LD_PE_check_cmd)
|
||||
endif
|
||||
|
||||
ifeq ($(XEN_BUILD_PE),y)
|
||||
|
||||
# Check if the linker produces fixups in PE by default
|
||||
efi-nr-fixups := $(shell $(OBJDUMP) -p $(efi-check).efi | grep '^[[:blank:]]*reloc[[:blank:]]*[0-9][[:blank:]].*DIR64$$' | wc -l)
|
||||
|
||||
ifeq ($(efi-nr-fixups),2)
|
||||
MKRELOC := :
|
||||
else
|
||||
MKRELOC := efi/mkreloc
|
||||
# If the linker produced fixups but not precisely two of them, we need to
|
||||
# disable it doing so. But if it didn't produce any fixups, it also wouldn't
|
||||
# recognize the option.
|
||||
ifneq ($(efi-nr-fixups),0)
|
||||
EFI_LDFLAGS += --disable-reloc-section
|
||||
endif
|
||||
endif
|
||||
|
||||
endif # $(XEN_BUILD_PE)
|
||||
|
||||
export XEN_BUILD_EFI XEN_BUILD_PE
|
||||
export EFI_LDFLAGS
|
||||
endif
|
||||
|
||||
# Set up the assembler include path properly for older toolchains.
|
||||
CFLAGS += -Wa,-I$(BASEDIR)/include
|
||||