Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Makefile: make the handling of firmware selection a little saner
Clean up the handling of firmware selection inside the Makefiles.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
  • Loading branch information
H. Peter Anvin committed Feb 10, 2016
1 parent f2f897a commit c7e6d51
Show file tree
Hide file tree
Showing 10 changed files with 63 additions and 67 deletions.
55 changes: 28 additions & 27 deletions Makefile
Expand Up @@ -86,9 +86,8 @@ endif
# creating. Which means that we always need a *real* target, such as
# 'all', appended to the make goals.
#
firmware = $(all_firmware)
real-target := $(filter-out $(firmware), $(MAKECMDGOALS))
real-firmware := $(filter $(firmware), $(MAKECMDGOALS))
real-target := $(filter-out $(all_firmware), $(MAKECMDGOALS))
real-firmware := $(filter $(all_firmware), $(MAKECMDGOALS))

ifeq ($(real-target),)
real-target = all
Expand All @@ -101,7 +100,7 @@ endif
.PHONY: $(filter-out $(private-targets), $(MAKECMDGOALS))
$(filter-out $(private-targets), $(MAKECMDGOALS)):
$(MAKE) -C $(OBJDIR) -f $(CURDIR)/Makefile SRC="$(topdir)" \
OBJ=$(OBJDIR) objdir=$(OBJDIR) EFI_BUILD=$(EFI_BUILD) \
OBJ=$(OBJDIR) objdir=$(OBJDIR) $(BUILDOPTS) \
$(MAKECMDGOALS)

unittest:
Expand All @@ -111,7 +110,7 @@ unittest:

regression:
$(MAKE) -C tests SRC="$(topdir)/tests" OBJ="$(topdir)/tests" \
objdir=$(OBJDIR) EFI_BUILD=$(EFI_BUILD) \
objdir=$(OBJDIR) $(BUILDOPTS) \
-f $(topdir)/tests/Makefile all

test: unittest regression
Expand All @@ -137,7 +136,7 @@ include $(MAKEDIR)/syslinux.mk
# directories.
#

ifndef EFI_BUILD
ifeq ($(FWCLASS),BIOS)
MODULES = memdisk/memdisk \
com32/menu/*.c32 com32/modules/*.c32 com32/mboot/*.c32 \
com32/hdt/*.c32 com32/rosh/*.c32 com32/gfxboot/*.c32 \
Expand All @@ -153,6 +152,8 @@ MODULES = com32/menu/*.c32 com32/modules/*.c32 com32/mboot/*.c32 \
com32/cmenu/libmenu/*.c32 com32/elflink/ldlinux/$(LDLINUX)
endif

export FIRMWARE FWCLASS ARCH BITS

# List of module objects that should be installed for all derivatives
INSTALLABLE_MODULES = $(MODULES)

Expand All @@ -175,7 +176,7 @@ BOBJECTS = $(BTARGET) \
# files that depend only on the B phase, but may have to be regenerated
# for "make installer".

ifdef EFI_BUILD
ifeq ($(FWCLASS),EFI)

BSUBDIRS = codepage com32 lzo core mbr sample efi txt
ISUBDIRS =
Expand Down Expand Up @@ -218,11 +219,11 @@ EXTBOOTINSTALL = $(INSTALLABLE_MODULES)
NETINSTALLABLE = core/pxelinux.0 core/lpxelinux.0 \
$(INSTALLABLE_MODULES)

endif # ifdef EFI_BUILD
endif # ifeq ($(FWCLASS),EFI)

.PHONY: subdirs $(BSUBDIRS) $(ISUBDIRS) test

ifeq ($(HAVE_FIRMWARE),)
ifeq ($(FIRMWARE),)

firmware = $(all_firmware)

Expand Down Expand Up @@ -254,27 +255,27 @@ endif
bios:
@mkdir -p $(OBJ)/bios
$(MAKE) -C $(OBJ)/bios -f $(SRC)/Makefile SRC="$(SRC)" \
objdir=$(OBJ)/bios OBJ=$(OBJ)/bios HAVE_FIRMWARE=1 \
FIRMWARE=BIOS \
objdir=$(OBJ)/bios OBJ=$(OBJ)/bios \
FIRMWARE=BIOS FWCLASS=BIOS \
ARCH=i386 LDLINUX=ldlinux.c32 $(MAKECMDGOALS)

efi32:
@mkdir -p $(OBJ)/efi32
$(MAKE) -C $(OBJ)/efi32 -f $(SRC)/Makefile SRC="$(SRC)" \
objdir=$(OBJ)/efi32 OBJ=$(OBJ)/efi32 HAVE_FIRMWARE=1 \
ARCH=i386 BITS=32 EFI_BUILD=1 LDLINUX=ldlinux.e32 \
FIRMWARE=EFI32 \
objdir=$(OBJ)/efi32 OBJ=$(OBJ)/efi32 \
ARCH=i386 BITS=32 LDLINUX=ldlinux.e32 \
FIRMWARE=EFI32 FWCLASS=EFI \
$(MAKECMDGOALS)

efi64:
@mkdir -p $(OBJ)/efi64
$(MAKE) -C $(OBJ)/efi64 -f $(SRC)/Makefile SRC="$(SRC)" \
objdir=$(OBJ)/efi64 OBJ=$(OBJ)/efi64 HAVE_FIRMWARE=1 \
ARCH=x86_64 BITS=64 EFI_BUILD=1 LDLINUX=ldlinux.e64 \
FIRMWARE=EFI64 \
objdir=$(OBJ)/efi64 OBJ=$(OBJ)/efi64 \
ARCH=x86_64 BITS=64 LDLINUX=ldlinux.e64 \
FIRMWARE=EFI64 FWCLASS=EFI \
$(MAKECMDGOALS)

else # ifeq($(HAVE_FIRMWARE),)
else # FIRMWARE

all: all-local subdirs

Expand All @@ -284,17 +285,17 @@ subdirs: $(BSUBDIRS) $(ISUBDIRS)

$(sort $(ISUBDIRS) $(BSUBDIRS)):
@mkdir -p $@
$(MAKE) -C $@ SRC="$(SRC)/$@" OBJ="$(OBJ)/$@" EFI_BUILD=$(EFI_BUILD) \
$(MAKE) -C $@ SRC="$(SRC)/$@" OBJ="$(OBJ)/$@" \
-f $(SRC)/$@/Makefile $(MAKECMDGOALS)

$(ITARGET):
@mkdir -p $@
$(MAKE) -C $@ SRC="$(SRC)/$@" OBJ="$(OBJ)/$@" EFI_BUILD=$(EFI_BUILD) \
$(MAKE) -C $@ SRC="$(SRC)/$@" OBJ="$(OBJ)/$@" \
-f $(SRC)/$@/Makefile $(MAKECMDGOALS)

$(BINFILES):
@mkdir -p $@
$(MAKE) -C $@ SRC="$(SRC)/$@" OBJ="$(OBJ)/$@" EFI_BUILD=$(EFI_BUILD) \
$(MAKE) -C $@ SRC="$(SRC)/$@" OBJ="$(OBJ)/$@" \
-f $(SRC)/$@/Makefile $(MAKECMDGOALS)

#
Expand All @@ -308,15 +309,15 @@ efi: core
installer: installer-local
set -e; for i in $(ISUBDIRS); \
do $(MAKE) -C $$i SRC="$(SRC)/$$i" OBJ="$(OBJ)/$$i" \
EFI_BUILD=$(EFI_BUILD) -f $(SRC)/$$i/Makefile all; done
-f $(SRC)/$$i/Makefile all; done


installer-local: $(ITARGET) $(BINFILES)

strip: strip-local
set -e; for i in $(ISUBDIRS); \
do $(MAKE) -C $$i SRC="$(SRC)/$$i" OBJ="$(OBJ)/$$i" \
EFI_BUILD=$(EFI_BUILD) -f $(SRC)/$$i/Makefile strip; done
-f $(SRC)/$$i/Makefile strip; done
-ls -l $(BOBJECTS) $(IOBJECTS)

strip-local:
Expand All @@ -341,7 +342,7 @@ local-install: installer
: mkdir -m 755 -p $(INSTALLROOT)$(MANDIR)/man8
: install -m 644 -c man/*.8 $(INSTALLROOT)$(MANDIR)/man8

ifndef EFI_BUILD
ifneq ($(FWCLASS),EFI)
install: local-install
set -e ; for i in $(INSTALLSUBDIRS) ; \
do $(MAKE) -C $$i SRC="$(SRC)/$$i" OBJ="$(OBJ)/$$i" \
Expand All @@ -352,12 +353,12 @@ install:
set -e ; for i in $(INSTALLSUBDIRS) ; \
do $(MAKE) -C $$i SRC="$(SRC)/$$i" OBJ="$(OBJ)/$$i" \
BITS="$(BITS)" AUXDIR="$(AUXDIR)/efi$(BITS)" \
EFI_BUILD=$(EFI_BUILD) -f $(SRC)/$$i/Makefile $@; done
-f $(SRC)/$$i/Makefile $@; done
-install -m 644 $(INSTALLABLE_MODULES) $(INSTALLROOT)$(AUXDIR)/efi$(BITS)
install -m 644 com32/elflink/ldlinux/$(LDLINUX) $(INSTALLROOT)$(AUXDIR)/efi$(BITS)
endif

ifdef EFI_BUILD
ifeq ($(FWCLASS),EFI)
netinstall:
mkdir -p $(INSTALLROOT)$(TFTPBOOT)/efi$(BITS)
install -m 644 $(NETINSTALLABLE) $(INSTALLROOT)$(TFTPBOOT)/efi$(BITS)
Expand Down Expand Up @@ -396,7 +397,7 @@ dist: local-dist local-tidy $(BESUBDIRS) $(IESUBDIRS) $(BSUBDIRS) $(ISUBDIRS)
klibc:
$(MAKE) clean
$(MAKE) CC=klcc ITARGET= ISUBDIRS='linux extlinux' BSUBDIRS=
endif # ifeq ($(HAVE_FIRMWARE),)
endif # ifeq ($(FIRMWARE),)

endif # ifeq ($(topdir),)

Expand Down
2 changes: 1 addition & 1 deletion com32/Makefile
Expand Up @@ -6,7 +6,7 @@ subdirs: $(SUBDIRS)
$(SUBDIRS):
@mkdir -p $(OBJ)/$@
$(MAKE) -C $(OBJ)/$@ SRC="$(SRC)"/$@ OBJ="$(OBJ)"/$@/ \
EFI_BUILD=$(EFI_BUILD) -f $(SRC)/$@/Makefile $(MAKECMDGOALS)
-f $(SRC)/$@/Makefile $(MAKECMDGOALS)

all tidy dist clean spotless install: subdirs

Expand Down
2 changes: 1 addition & 1 deletion com32/elflink/ldlinux/Makefile
Expand Up @@ -22,7 +22,7 @@ OBJS = ldlinux.o cli.o readconfig.o refstr.o colors.o getadv.o adv.o \

BTARGET = $(LDLINUX)

ifdef EFI_BUILD
ifeq ($(FWCLASS),EFI)
%.e$(BITS): %.elf
$(OBJCOPY) --strip-debug --strip-unneeded $< $@
SONAME = $(patsubst %.elf,%.e$(BITS),$(@F))
Expand Down
2 changes: 1 addition & 1 deletion com32/lib/Makefile
Expand Up @@ -22,7 +22,7 @@ LIBJPG_OBJS = \
jpeg/rgb24.o jpeg/bgr24.o jpeg/yuv420p.o jpeg/grey.o \
jpeg/rgba32.o jpeg/bgra32.o

ifdef EFI_BUILD
ifeq ($(FWCLASS),EFI)
I915VESA_OBJ =
else
I915VESA_OBJ = sys/vesa/i915resolution.o
Expand Down
53 changes: 25 additions & 28 deletions core/Makefile
@@ -1,7 +1,7 @@
## -----------------------------------------------------------------------
##
## Copyright 1998-2009 H. Peter Anvin - All Rights Reserved
## Copyright 2009-2014 Intel Corporation; author: H. Peter Anvin
## Copyright 2009-2016 Intel Corporation; author: H. Peter Anvin
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
Expand Down Expand Up @@ -77,18 +77,20 @@ FILTER_OBJS = %rawcon.o %plaincon.o %pxelinux-c.o %ldlinux-c.o \
$(subst $(OBJ)/,,$(LPXELINUX_OBJS)) \
$(subst $(OBJ)/,,$(PXELINUX_OBJS))

ifdef EFI_BUILD
ifeq ($(FWCLASS),EFI)
# EFI is single-threaded, and doesn't use the LZO assembly decoder
FILTER_OBJS += $(subst $(SRC)/,, \
$(patsubst %.S,%.o, $(sort $(wildcard $(SRC)/lzo/*.S))) \
$(patsubst %.c,%.o, $(sort $(wildcard $(SRC)/thread/*.c))) \
$(patsubst %.S,%.o, $(sort $(wildcard $(SRC)/thread/*.S))))
$(patsubst %.S,%.o, $(sort $(wildcard $(SRC)/thread/*.S)))) \
$(patsubst %.asm,%.o, $(sort $(wildcard $(SRC)/*.asm))) \
$(patsubst %.c,%.o, $(sort $(wildcard $(SRC)/bios*.c)))
endif

COBJS = $(filter-out $(FILTER_OBJS),$(COBJ))
SOBJS = $(filter-out $(FILTER_OBJS),$(SOBJ))

ifdef EFI_BUILD
ifeq ($(FWCLASS),EFI)
COBJS += $(subst $(SRC)/,,$(CORE_PXE_CSRC:%.c=%.o) fs/pxe/ftp.o fs/pxe/ftp_readdir.o \
fs/pxe/http.o fs/pxe/http_readdir.o)
endif
Expand Down Expand Up @@ -116,20 +118,7 @@ ifndef DATE
DATE := $(shell sh $(SRC)/../gen-id.sh $(VERSION) $(HEXDATE))
endif

# Set up the NASM and LD options for the architecture
NASM_ELF = "unknown"
LD_PIE = "unknown"
ifeq ($(ARCH),i386)
NASM_ELF = elf
LD_PIE = -pie
endif
ifeq ($(ARCH),x86_64)
NASM_ELF = elf64
#LD_PIE = --pic-executable
LD_PIE =
endif

ifdef EFI_BUILD
ifeq ($(FWCLASS),EFI)
all: makeoutputdirs $(filter-out %bios.o,$(COBJS) $(SOBJS)) codepage.o
else
all: makeoutputdirs $(BTARGET)
Expand All @@ -141,14 +130,14 @@ makeoutputdirs:
kwdhash.gen: keywords genhash.pl
$(PERL) $(SRC)/genhash.pl < $(SRC)/keywords > $(OBJ)/kwdhash.gen

.PRECIOUS: %.elf
ifeq ($(FWCLASS),BIOS)

.PRECIOUS: %.elf
%.raw: %.elf
$(OBJCOPY) -O binary -S $< $(@:.bin=.raw)

# GNU make 3.82 gets confused by the first form
.PRECIOUS: $(OBJ)/%.raw

# GNU make 3.82 gets confused by plain %.raw; make 4.0 requires it
.PRECIOUS: $(OBJ)/%.raw %.raw
%.bin: %.raw $(PREPCORE)
$(PREPCORE) $< $@

Expand All @@ -161,10 +150,16 @@ kwdhash.gen: keywords genhash.pl

AUXLIBS = libisolinux.a libisolinux-debug.a libldlinux.a \
libpxelinux.a liblpxelinux.a

LDSCRIPT = $(SRC)/$(ARCH)/syslinux.ld

NASM_ELF = elf

%.elf: %.o $(LIBDEP) $(LDSCRIPT) $(AUXLIBS)
$(LD) $(LDFLAGS) -Bsymbolic $(LD_PIE) -E --hash-style=gnu -T $(LDSCRIPT) -M -o $@ $< \
$(LD) $(LDFLAGS) -pie -Bsymbolic \
-T $(LDSCRIPT) \
--unresolved-symbols=report-all \
-E --hash-style=gnu -M -o $@ $< \
--start-group $(LIBS) $(subst $(*F).elf,lib$(*F).a,$@) --end-group \
> $(@:.elf=.map)
$(OBJDUMP) -h $@ > $(@:.elf=.sec)
Expand Down Expand Up @@ -195,11 +190,6 @@ libldlinux.a: plaincon.o localboot.o ldlinux-c.o
$(AR) cq $@ $^
$(RANLIB) $@

$(LIB): $(LIBOBJS)
rm -f $@
$(AR) cq $@ $^
$(RANLIB) $@

pxelinux.o: pxelinux.asm kwdhash.gen ../version.gen
$(NASM) -f $(NASM_ELF) $(NASMOPT) -DDATE_STR="'$(DATE)'" \
-DHEXDATE="$(HEXDATE)" \
Expand Down Expand Up @@ -228,6 +218,13 @@ ldlinux.bss: ldlinux.bin
ldlinux.sys: ldlinux.bin
dd if=$< of=$@ bs=512 skip=2

endif # BIOS

$(LIB): $(LIBOBJS)
rm -f $@
$(AR) cq $@ $^
$(RANLIB) $@

codepage.cp: $(OBJ)/../codepage/$(CODEPAGE).cp
cp -f $< $@

Expand Down
4 changes: 1 addition & 3 deletions mk/com32.mk
Expand Up @@ -48,7 +48,7 @@ GCCOPT += $(call gcc_ok,-falign-jumps=0,-malign-jumps=0)
GCCOPT += $(call gcc_ok,-falign-labels=0,-malign-labels=0)
GCCOPT += $(call gcc_ok,-falign-loops=0,-malign-loops=0)

ifdef EFI_BUILD
ifeq ($(FWCLASS),EFI)
GCCOPT += -mno-red-zone
else
GCCOPT += -mregparm=3 -DREGPARM=3
Expand Down Expand Up @@ -119,5 +119,3 @@ C_LNXLIBS = $(com32)/libutil/libutil_lnx.a

%.c32: %.elf
$(OBJCOPY) --strip-debug --strip-unneeded $< $@
##$(OBJCOPY) -O binary $< $@
##$(RELOCS) $< >> $@ || ( rm -f $@ ; false )
2 changes: 1 addition & 1 deletion mk/elf.mk
Expand Up @@ -60,7 +60,7 @@ CFLAGS = $(GCCOPT) $(GCCWARN) -W -Wall \
-I$(com32)/libutil/include -I$(com32)/include \
-I$(com32)/include/sys $(GPLINCLUDE) -I$(core)/include \
-I$(objdir) -DLDLINUX=\"$(LDLINUX)\"
ifdef EFI_BUILD
ifeq ($(FWCLASS),EFI)
GCCOPT += -mno-red-zone
else
GCCOPT += -mregparm=3 -DREGPARM=3
Expand Down
2 changes: 1 addition & 1 deletion mk/embedded.mk
Expand Up @@ -38,7 +38,7 @@ GCCOPT += $(call gcc_ok,-ffreestanding,)
GCCOPT += $(call gcc_ok,-fno-stack-protector,)
GCCOPT += $(call gcc_ok,-fwrapv,)
GCCOPT += $(call gcc_ok,-freg-struct-return,)
ifdef EFI_BUILD
ifeq ($(FWCLASS),EFI)
GCCOPT += -Os -fomit-frame-pointer -msoft-float -mno-red-zone
else
GCCOPT += -Os -fomit-frame-pointer -mregparm=3 -DREGPARM=3 -msoft-float
Expand Down
2 changes: 1 addition & 1 deletion mk/lib.mk
Expand Up @@ -54,7 +54,7 @@ WARNFLAGS = $(GCCWARN) -Wpointer-arith -Wwrite-strings -Wstrict-prototypes -Winl

CFLAGS = $(OPTFLAGS) $(REQFLAGS) $(WARNFLAGS) $(LIBFLAGS)

ifdef EFI_BUILD
ifeq ($(FWCLASS),EFI)
CFLAGS += -mno-red-zone
else
CFLAGS += -mregparm=3 -DREGPARM=3
Expand Down
6 changes: 3 additions & 3 deletions tests/Makefile
Expand Up @@ -39,15 +39,15 @@ QEMU = qemu-system-i386

all: syslinux-tests pxelinux-tests
syslinux-tests:
$(MAKE) SRC="$(SRC)" OBJ="$(OBJ)" objdir="$(objdir)" EFI_BUILD=$(EFI_BUILD) \
$(MAKE) SRC="$(SRC)" OBJ="$(OBJ)" objdir="$(objdir)" \
INITIAL="$(INITIAL)" INSTALL_DIR="$(SYSLINUX_INSTALL_DIR)" \
CONFIG_FILE="$(SYSLINUX_CONFIG_FILE)" \
DERIVATIVE=SYSLINUX
@sudo $(SRC)/build-syslinux stop $(SYSLINUX_MOUNT_DIR) \
$(SYSLINUX_LOOPDEV) test.cfg

pxelinux-tests:
$(MAKE) SRC="$(SRC)" OBJ="$(OBJ)" objdir="$(objdir)" EFI_BUILD=$(EFI_BUILD) \
$(MAKE) SRC="$(SRC)" OBJ="$(OBJ)" objdir="$(objdir)" \
INITIAL="$(INITIAL)" INSTALL_DIR="$(PXELINUX_INSTALL_DIR)" \
CONFIG_FILE="$(PXELINUX_CONFIG_FILE)" \
DERIVATIVE=PXELINUX
Expand All @@ -71,7 +71,7 @@ SUBDIRS = linux com32
subdirs: $(SUBDIRS)
$(SUBDIRS):
mkdir -p $(OBJ)/$@
$(MAKE) -C $(OBJ)/$@ SRC="$(SRC)"/$@ OBJ="$(OBJ)"/$@/ EFI_BUILD=$(EFI_BUILD) \
$(MAKE) -C $(OBJ)/$@ SRC="$(SRC)"/$@ OBJ="$(OBJ)"/$@/ \
-f $(SRC)/$@/Makefile objdir="$(objdir)/tests" \
INSTALL_DIR="$(INSTALL_DIR)" CONFIG_FILE="$(CONFIG_FILE)" \
DERIVATIVE="$(DERIVATIVE)"
Expand Down

0 comments on commit c7e6d51

Please sign in to comment.