BaseTools: Add support for out-of-tree builds

Main EDK2 build supports out-of-tree builds but BaseTools make process
still creates tools and object files in-tree. In order to make
out-of-tree build support complete move the generated tools and
interim obj files to $WORKSPACE location as well.

This patch also changes the location of BaseTools for in-tree builds
(default behavior when WORKSPACE is not provided before calling
edksetup) to $WORKSPACE/BaseTools/Build/... It may potentially break
external workflows that invoke tools from the default location outside
of the build tool.

Signed-off-by: Oleksandr Tymoshenko <ovt@google.com>
This commit is contained in:
Oleksandr Tymoshenko 2025-10-25 00:18:59 +00:00 committed by mergify[bot]
parent f39883ea11
commit 3fe1d56cc9
11 changed files with 116 additions and 64 deletions

View file

@ -13,6 +13,12 @@ else
MAKEROOT := .
endif
ifneq ($(WORKSPACE),)
BUILDROOT=$(WORKSPACE)/BaseTools/Build/Source/C
else
BUILDROOT=$(abspath $(MAKEROOT))
endif
include Makefiles/header.makefile
export PYTHON_COMMAND
@ -38,28 +44,29 @@ APPLICATIONS = \
SUBDIRS := $(LIBRARIES) $(APPLICATIONS)
$(LIBRARIES): $(MAKEROOT)/libs
$(APPLICATIONS): $(LIBRARIES) $(MAKEROOT)/bin
$(LIBRARIES): $(BUILDROOT)/libs
$(APPLICATIONS): $(LIBRARIES) $(BUILDROOT)/bin
.PHONY: outputdirs
makerootdir:
-$(MD) $(MAKEROOT)
-$(MD) $(BUILDROOT)
.PHONY: subdirs $(SUBDIRS)
subdirs: $(SUBDIRS)
$(SUBDIRS):
$(MAKE) -C $@
-$(MD) $(BUILDROOT)/$@
$(MAKE) OBJDIR=$(BUILDROOT)/$@ BUILDROOT=$(BUILDROOT) -C $@
.PHONY: $(patsubst %,%-clean,$(sort $(SUBDIRS)))
$(patsubst %,%-clean,$(sort $(SUBDIRS))):
-$(MAKE) -C $(@:-clean=) clean
-$(MAKE) OBJDIR=$(BUILDROOT)/$(@:-clean=) BUILDROOT=$(BUILDROOT) -C $(@:-clean=) clean
clean: $(patsubst %,%-clean,$(sort $(SUBDIRS)))
clean: localClean
localClean:
$(RM) $(MAKEROOT)/bin/*
-$(RD) $(MAKEROOT)/libs $(MAKEROOT)/bin
$(RM) $(BUILDROOT)/bin/*
-$(RD) $(BUILDROOT)/libs $(BUILDROOT)/bin
include Makefiles/footer.makefile

View file

@ -6,16 +6,19 @@
#
MAKEROOT ?= ../..
BUILDROOT ?= $(MAKEROOT)
OBJDIR ?= .
OBJECTS := $(addprefix $(OBJDIR)/,$(OBJECTS))
include $(MAKEROOT)/Makefiles/header.makefile
APPLICATION = $(MAKEROOT)/bin/$(APPNAME)
APPLICATION = $(BUILDROOT)/bin/$(APPNAME)
.PHONY:all
all: $(MAKEROOT)/bin $(APPLICATION)
all: $(BUILDROOT)/bin $(APPLICATION)
$(APPLICATION): $(OBJECTS)
$(LINKER) -o $(APPLICATION) $(LDFLAGS) $(OBJECTS) -L$(MAKEROOT)/libs $(LIBS)
$(LINKER) -o $(APPLICATION) $(LDFLAGS) $(OBJECTS) -L$(BUILDROOT)/libs $(LIBS)
ifeq (Windows, $(findstring Windows,$(OS)))
$(CP) $(APPLICATION).exe $(BIN_PATH)
endif

View file

@ -7,24 +7,37 @@
DEPFILES = $(OBJECTS:%.o=%.d)
$(MAKEROOT)/libs-$(HOST_ARCH):
$(MD) $(MAKEROOT)/libs-$(HOST_ARCH)
$(BUILDROOT)/libs-$(HOST_ARCH):
$(MD) $(BUILDROOT)/libs-$(HOST_ARCH)
.PHONY: install
install: $(MAKEROOT)/libs-$(HOST_ARCH) $(LIBRARY)
$(CP) $(LIBRARY) $(MAKEROOT)/libs-$(HOST_ARCH)
install: $(BUILDROOT)/libs-$(HOST_ARCH) $(LIBRARY)
$(CP) $(LIBRARY) $(BUILDROOT)/libs-$(HOST_ARCH)
$(LIBRARY): $(OBJECTS)
$(AR) crs $@ $^
%.o : %.c
$(OBJDIR)/%.o : %.c
@$(MD) $(@D)
$(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o $@
%.o : %.cpp
$(OBJDIR)/%.o : %.cpp
@$(MD) $(@D)
$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@
$(OBJECTS): | $(OBJDIR)
$(OBJDIR)/%.d : %.c
@set -e; rm -f $@; \
$(MD) $(@D); \
$(CC) -M $(CPPFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
.PHONY: clean
clean:
$(RM) $(OBJECTS) $(LIBRARY) $(DEPFILES)
ifneq ($(MAKECMDGOALS), clean)
-include $(DEPFILES)
endif

View file

@ -206,11 +206,16 @@ LDFLAGS += $(EXTRA_LDFLAGS)
all:
$(MAKEROOT)/libs:
$(MD) $(MAKEROOT)/libs
$(BUILDROOT)/libs:
$(MD) $(BUILDROOT)/libs
$(MAKEROOT)/bin:
$(MD) $(MAKEROOT)/bin
$(BUILDROOT)/bin:
$(MD) $(BUILDROOT)/bin
ifeq (Windows, $(findstring Windows,$(OS)))
$(MD) $(BIN_PATH)
endif
ifdef OBJDIR
$(OBJDIR):
$(MD) $(OBJDIR)
endif

View file

@ -5,10 +5,14 @@
# SPDX-License-Identifier: BSD-2-Clause-Patent
#
BUILDROOT ?= $(MAKEROOT)
OBJDIR ?= .
OBJECTS := $(addprefix $(OBJDIR)/,$(OBJECTS))
include $(MAKEROOT)/Makefiles/header.makefile
LIBRARY = $(MAKEROOT)/libs/lib$(LIBNAME).a
LIBRARY = $(BUILDROOT)/libs/lib$(LIBNAME).a
all: $(MAKEROOT)/libs $(LIBRARY)
all: $(BUILDROOT)/libs $(LIBRARY)
include $(MAKEROOT)/Makefiles/footer.makefile

View file

@ -8,14 +8,16 @@
MAKEROOT ?= ..
APPNAME = VfrCompile
BUILDROOT ?= $(MAKEROOT)
OBJDIR ?= $(abspath .)
LIBS = -lCommon
TOOL_INCLUDE = -I Pccts/h
#OBJECTS = VfrSyntax.o VfrServices.o DLGLexer.o EfiVfrParser.o ATokenBuffer.o DLexerBase.o AParser.o
OBJECTS = AParser.o DLexerBase.o ATokenBuffer.o EfiVfrParser.o VfrLexer.o VfrSyntax.o \
VfrFormPkg.o VfrError.o VfrUtilityLib.o VfrCompiler.o
OBJECTS := $(addprefix $(OBJDIR)/,$(OBJECTS))
CLANG := $(findstring clang,$(shell $(CC) --version))
ifneq ($(CLANG),)
VFR_CPPFLAGS = -Wno-deprecated-register -std=c++14 -DPCCTS_USE_NAMESPACE_STD $(CPPFLAGS)
@ -30,22 +32,18 @@ VFR_LFLAGS = $(EXTRA_LDFLAGS)
LINKER = $(CXX)
EXTRA_CLEAN_OBJECTS = EfiVfrParser.cpp EfiVfrParser.h VfrParser.dlg VfrTokens.h VfrLexer.cpp VfrLexer.h VfrSyntax.cpp tokens.h
MAKEROOT ?= ../..
include $(MAKEROOT)/Makefiles/header.makefile
APPLICATION = $(MAKEROOT)/bin/$(APPNAME)
APPLICATION = $(BUILDROOT)/bin/$(APPNAME)
BIN_DIR=.
BIN_DIR=$(OBJDIR)
export BIN_DIR
.PHONY:all
all: $(MAKEROOT)/bin $(APPLICATION)
all: $(BUILDROOT)/bin $(APPLICATION)
$(APPLICATION): $(OBJECTS)
$(LINKER) -o $(APPLICATION) $(VFR_LFLAGS) $(OBJECTS) -L$(MAKEROOT)/libs $(LIBS)
$(LINKER) -o $(APPLICATION) $(VFR_LFLAGS) $(OBJECTS) -L$(BUILDROOT)/libs $(LIBS)
ifeq (Windows, $(findstring Windows,$(OS)))
$(CP) $(APPLICATION).exe $(BIN_PATH)
endif
@ -54,35 +52,42 @@ VfrCompiler.o: ../Include/Common/BuildVersion.h
include $(MAKEROOT)/Makefiles/footer.makefile
VfrSyntax.cpp EfiVfrParser.cpp EfiVfrParser.h VfrParser.dlg VfrTokens.h: Pccts/antlr/antlr VfrSyntax.g
Pccts/antlr/antlr -CC -e3 -ck 3 -k 2 -fl VfrParser.dlg -ft VfrTokens.h -o . VfrSyntax.g
GEN_SYNTAX_FILES := $(addprefix $(OBJDIR)/,VfrSyntax.cpp EfiVfrParser.cpp EfiVfrParser.h VfrParser.dlg VfrTokens.h)
$(GEN_SYNTAX_FILES): $(OBJDIR)/antlr VfrSyntax.g
$(OBJDIR)/antlr -CC -e3 -ck 3 -k 2 -fl VfrParser.dlg -ft VfrTokens.h -o $(OBJDIR) VfrSyntax.g
VfrLexer.cpp VfrLexer.h: Pccts/dlg/dlg VfrParser.dlg
Pccts/dlg/dlg -C2 -i -CC -cl VfrLexer -o . VfrParser.dlg
GEN_LEXER_FILES := $(addprefix $(OBJDIR)/,VfrLexer.cpp VfrLexer.h)
$(GEN_LEXER_FILES): $(OBJDIR)/dlg $(OBJDIR)/VfrParser.dlg
$(OBJDIR)/dlg -C2 -i -CC -cl VfrLexer -o $(OBJDIR) $(OBJDIR)/VfrParser.dlg
Pccts/antlr/antlr:
$(MAKE) -C Pccts/antlr
EXTRA_CLEAN_OBJECTS = $(GEN_SYNTAX_FILES) $(GEN_LEXER_FILES)
Pccts/dlg/dlg:
$(MAKE) -C Pccts/dlg
$(OBJDIR)/Pccts/antlr $(OBJDIR)/Pccts/dlg:
$(MD) $@
ATokenBuffer.o: Pccts/h/ATokenBuffer.cpp
$(OBJDIR)/antlr: | $(OBJDIR)/Pccts/antlr
$(MAKE) OBJDIR=$(OBJDIR)/Pccts/antlr -C Pccts/antlr
$(OBJDIR)/dlg: | $(OBJDIR)/Pccts/dlg
$(MAKE) OBJDIR=$(OBJDIR)/Pccts/dlg -C Pccts/dlg
$(OBJDIR)/ATokenBuffer.o: Pccts/h/ATokenBuffer.cpp
$(CXX) -c $(VFR_CPPFLAGS) $(INC) $(VFR_CXXFLAGS) $? -o $@
DLexerBase.o: Pccts/h/DLexerBase.cpp
$(OBJDIR)/DLexerBase.o: Pccts/h/DLexerBase.cpp
$(CXX) -c $(VFR_CPPFLAGS) $(INC) $(VFR_CXXFLAGS) $? -o $@
AParser.o: Pccts/h/AParser.cpp
$(OBJDIR)/AParser.o: Pccts/h/AParser.cpp
$(CXX) -c $(VFR_CPPFLAGS) $(INC) $(VFR_CXXFLAGS) $? -o $@
VfrSyntax.o: VfrSyntax.cpp
$(OBJDIR)/VfrSyntax.o: $(OBJDIR)/VfrSyntax.cpp
$(CXX) -c $(VFR_CPPFLAGS) $(INC) $(VFR_CXXFLAGS) $? -o $@
clean: localClean
localClean:
$(MAKE) -C Pccts/antlr clean
$(MAKE) -C Pccts/dlg clean
$(MAKE) OBJDIR=$(OBJDIR)/Pccts/antlr -C Pccts/antlr clean
$(MAKE) OBJDIR=$(OBJDIR)/Pccts/dlg -C Pccts/dlg clean
$(RM) $(EXTRA_CLEAN_OBJECTS)
ifeq (Windows, $(findstring Windows,$(OS)))
$(RM) $(BIN_PATH)/$(APPNAME).exe

View file

@ -184,6 +184,7 @@ CPPFLAGS=
#CFLAGS= -O -I. -I$(SET) -I$(PCCTS_H) -DUSER_ZZSYN -woff 3262
OBJ=antlr.o scan.o err.o bits.o build.o fset2.o fset.o gen.o \
globals.o hash.o lex.o main.o misc.o set.o pred.o egman.o mrhoist.o fcache.o
OBJ := $(addprefix $(OBJDIR)/,$(OBJ))
$(BIN_DIR)/antlr : $(OBJ) $(SRC)
$(CC) $(CFLAGS) -o $(BIN_DIR)/antlr $(OBJ)
@ -201,17 +202,17 @@ SRC=antlr.c scan.c err.c bits.c build.c fset2.c fset.c gen.c globals.c \
#antlr.c stdpccts.h parser.dlg tokens.h err.c : antlr.g
# $(ANTLR) -gh antlr.g
antlr.o : antlr.c mode.h tokens.h
$(OBJDIR)/antlr.o : antlr.c mode.h tokens.h
scan.o : scan.c mode.h tokens.h
$(OBJDIR)/scan.o : scan.c mode.h tokens.h
#scan.c mode.h: parser.dlg
# $(DLG) -C2 parser.dlg scan.c
set.o : $(SET)/set.c
$(CC) $(CFLAGS) -c -o set.o $(SET)/set.c
$(OBJDIR)/set.o : $(SET)/set.c
$(CC) $(CFLAGS) -c -o $@ $<
%.o : %.c
$(OBJDIR)/%.o : %.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
#
@ -220,7 +221,7 @@ set.o : $(SET)/set.c
#clean up all the intermediate files
clean:
$(RM) $(BIN_DIR)$(SEP)antlr *.$(OBJ_EXT) core
$(RM) $(BIN_DIR)$(SEP)antlr $(OBJDIR)$(SEP)*.$(OBJ_EXT) core
#remove everything in clean plus the PCCTS files generated
scrub:

View file

@ -137,6 +137,7 @@ OBJ_EXT=o
OUT_OBJ = -o
OBJ = dlg_p.o dlg_a.o main.o err.o set.o support.o output.o \
relabel.o automata.o
OBJ := $(addprefix $(OBJDIR)/,$(OBJ))
$(BIN_DIR)/dlg : $(OBJ) $(SRC)
$(CC) $(CFLAGS) -o $(BIN_DIR)/dlg $(OBJ)
@ -150,19 +151,19 @@ SRC = dlg_p.c dlg_a.c main.c err.c $(SET)/set.c support.c output.c \
#dlg_a.c mode.h : parser.dlg
# $(DLG) -C2 parser.dlg dlg_a.c
dlg_p.$(OBJ_EXT) : dlg_p.c dlg.h tokens.h mode.h
$(CC) $(CFLAGS) -c dlg_p.c
$(OBJDIR)/dlg_p.$(OBJ_EXT) : dlg_p.c dlg.h tokens.h mode.h
$(CC) $(CFLAGS) -o $@ -c dlg_p.c
dlg_a.$(OBJ_EXT) : dlg_a.c dlg.h tokens.h mode.h
$(CC) $(CFLAGS) -c dlg_a.c
$(OBJDIR)/dlg_a.$(OBJ_EXT) : dlg_a.c dlg.h tokens.h mode.h
$(CC) $(CFLAGS) -o $@ -c dlg_a.c
main.$(OBJ_EXT) : main.c dlg.h
$(CC) $(CFLAGS) -c main.c
$(OBJDIR)/main.$(OBJ_EXT) : main.c dlg.h
$(CC) $(CFLAGS) -o $@ -c main.c
set.$(OBJ_EXT) : $(SET)/set.c
$(CC) -c $(CFLAGS) $(SET)/set.c
$(OBJDIR)/set.$(OBJ_EXT) : $(SET)/set.c
$(CC) -c $(CFLAGS) -o $@ $(SET)/set.c
%.o : %.c
$(OBJDIR)/%.o : %.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
lint:
@ -170,4 +171,4 @@ lint:
#clean up all the intermediate files
clean:
$(RM) $(BIN_DIR)$(SEP)dlg *.$(OBJ_EXT) core
$(RM) $(BIN_DIR)$(SEP)dlg $(OBJDIR)$(SEP)*.$(OBJ_EXT) core

View file

@ -2942,7 +2942,8 @@ class DscBuildData(PlatformBuildClassObject):
else:
AppSuffix = '.exe' if sys.platform == "win32" else ''
MakeApp = MakeApp + PcdGccMakefile
MakeApp = MakeApp + 'APPFILE = %s%s%s%s\n' % (self.OutputPath, os.sep, PcdValueInitName, AppSuffix) + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s/%s.o %s.o\n' % (self.OutputPath, PcdValueInitName, os.path.join(self.OutputPath, PcdValueCommonName)) + \
MakeApp = MakeApp + 'OBJDIR = %s\n' % self.OutputPath
MakeApp = MakeApp + 'APPFILE = %s%s%s%s\n' % (self.OutputPath, os.sep, PcdValueInitName, AppSuffix) + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s.o %s.o\n' % (PcdValueInitName, PcdValueCommonName) + \
'include $(MAKEROOT)/Makefiles/app.makefile\n' + 'TOOL_INCLUDE +='
IncSearchList = []