File: Makefile

package info (click to toggle)
refind 0.12.0-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 8,460 kB
  • sloc: ansic: 51,316; sh: 1,566; python: 592; makefile: 316; perl: 5
file content (205 lines) | stat: -rw-r--r-- 7,214 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
# Makefile for rEFInd

# This program is licensed under the terms of the GNU GPL, version 3,
# or (at your option) any later version.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.

include Make.common

SHELL=/bin/bash
LOADER_DIR=refind
FS_DIR=filesystems
LIBEG_DIR=libeg
MOK_DIR=mok
GPTSYNC_DIR=gptsync
EFILIB_DIR=EfiLib
# Two possible locations for TianoCore toolkit:
# TIANOBASE is used with "tiano" targets and
# EDK2BASE is used with "edk2" targets
export TIANOBASE=/usr/local/UDK2014/MyWorkSpace
export EDK2BASE=/usr/local/edk2-vUDK2018
# NOTE: Below is overridden for "tiano" targets
-include $(EDK2BASE)/Conf/target.txt
THISDIR=$(shell pwd)
EDK2_BUILDLOC=$(EDK2BASE)/Build/Refind/$(TARGET)_$(TOOL_CHAIN_TAG)/$(UC_ARCH)
EDK2_PROGRAM_BASENAMES=refind gptsync
EDK2_PROGRAMS=$(EDK2_PROGRAM_BASENAMES:=.efi)
EDK2_DRIVER_BASENAMES=btrfs ext4 ext2 hfs iso9660 reiserfs
EDK2_DRIVERS=$(EDK2_DRIVER_BASENAMES:=.efi)
EDK2_ALL_BASENAMES=$(EDK2_PROGRAM_BASENAMES) $(EDK2_DRIVER_BASENAMES)
EDK2_ALL_FILES=$(EDK2_ALL_BASENAMES:=.efi)

# The "all" target builds with the TianoCore library if possible, but falls
# back on the more easily-installed GNU-EFI library if TianoCore isn't
# installed at $(EDK2BASE) or $(TIANOBASE)
all:
ifneq ($(wildcard $(EDK2BASE)/*),)
	@echo "Found $(EDK2BASE); building with TianoCore EDK2"
	+make edk2
else ifneq ($(wildcard $(TIANOBASE)/*),)
	@echo "Found $(TIANOBASE); building with TianoCore UDK2014"
	+make tiano
else
	@echo "Did not find $(EDK2BASE) or $(TIANOBASE); building with GNU-EFI"
	+make gnuefi
endif

# The "fs" target, like "all," attempts to build with TianoCore but falls
# back to GNU-EFI.
fs:
ifneq ($(wildcard $(EDK2BASE)/*),)
	@echo "Found $(EDK2BASE); building with TianoCore EDK2"
	+make fs_edk2
else ifneq ($(wildcard $(TIANOBASE)/*),)
	@echo "Found $(TIANOBASE); building with TianoCore UDK2014"
	+make fs_tiano
else
	@echo "Did not find $(EDK2BASE) or $(TIANOBASE); building with GNU-EFI"
	+make fs_gnuefi
endif

# Likewise for GPTsync....
gptsync:
ifneq ($(wildcard $(EDK2BASE)/*),)
	@echo "Found $(EDK2BASE); building with TianoCore EDK2"
	+make gptsync_edk2
else ifneq ($(wildcard $(TIANOBASE)/*),)
	@echo "Found $(TIANOBASE); building with TianoCore UDK2014"
	+make gptsync_tiano
else
	@echo "Did not find $(EDK2BASE) or $(TIANOBASE); building with GNU-EFI"
	+make gptsync_gnuefi
endif

###########################################################################
#
# GNU-EFI build rules; should work with any CPU architecture and GNU-EFI
# version 3.0u or later, but cross-compiling requires adding odd
# components and is untested....
#
###########################################################################

gnuefi:
	+make MAKEWITH=GNUEFI -C $(LIBEG_DIR)
	+make MAKEWITH=GNUEFI -C $(MOK_DIR)
	+make MAKEWITH=GNUEFI -C $(EFILIB_DIR)
	+make MAKEWITH=GNUEFI -C $(LOADER_DIR)
	+make MAKEWITH=GNUEFI -C $(GPTSYNC_DIR) gnuefi

all_gnuefi: gnuefi fs_gnuefi

gptsync_gnuefi:
	+make MAKEWITH=GNUEFI -C $(GPTSYNC_DIR) gnuefi

fs_gnuefi:
	+make MAKEWITH=GNUEFI -C $(FS_DIR) all_gnuefi

###########################################################################
#
# Old-style TianoCore build rules; useful only with UDK2014 development
# kit....
#
###########################################################################

# Don't build gptsync under TianoCore/AARCH64 by default because it errors out
# when using a cross-compiler on an x86-64 system. Because gptsync is pretty
# useless on ARM64, skipping it is no big deal....
tiano:
	-include $(TIANOBASE)/Conf/target.txt
	+make MAKEWITH=TIANO AR_TARGET=EfiLib -C $(EFILIB_DIR) -f Make.tiano
	+make MAKEWITH=TIANO AR_TARGET=libeg -C $(LIBEG_DIR) -f Make.tiano
	+make MAKEWITH=TIANO AR_TARGET=mok -C $(MOK_DIR) -f Make.tiano
	+make MAKEWITH=TIANO BUILDME=refind DLL_TARGET=refind -C $(LOADER_DIR) -f Make.tiano
ifneq ($(ARCH),aarch64)
	+make MAKEWITH=TIANO -C $(GPTSYNC_DIR) -f Make.tiano
endif
#	+make MAKEWITH=TIANO -C $(FS_DIR)

all_tiano: tiano fs_tiano

gptsync_tiano:
	-include $(TIANOBASE)/Conf/target.txt
	+make MAKEWITH=TIANO -C $(GPTSYNC_DIR) -f Make.tiano

fs_tiano:
	-include $(TIANOBASE)/Conf/target.txt
	+make MAKEWITH=TIANO -C $(FS_DIR)

###########################################################################
#
# New-style build rules for use with TianoCore via its own "build" tool.
# Works with UDK2014 and late-March EDK2; but UDK2014 builds fail with
# AARCH64 unless .inf files are modified to eliminate references to
# CompilerIntrinsicsLib....
#
# NOTE: Unlike other build rules, these build everything (rEFInd, gptsync,
# and filesystem drivers), even if only one component is requested; but
# only the requested components are copied to their final destinations.
# This is done because of the heavy overhead in building just one
# component in the TianoCore "build" tool.
#
###########################################################################

# Build process for TianoCore using TianoCore-standard build process rather
# than my own custom Makefiles (except this top-level one)
edk2: build_edk2
	cp $(EDK2_BUILDLOC)/refind.efi ./refind/refind_$(FILENAME_CODE).efi
	cp $(EDK2_BUILDLOC)/gptsync.efi ./gptsync/gptsync_$(FILENAME_CODE).efi

all_edk2: build_edk2 fs_edk2
	cp $(EDK2_BUILDLOC)/refind.efi ./refind/refind_$(FILENAME_CODE).efi
	cp $(EDK2_BUILDLOC)/gptsync.efi ./gptsync/gptsync_$(FILENAME_CODE).efi

gptsync_edk2: build_edk2
	cp $(EDK2_BUILDLOC)/gptsync.efi ./gptsync/gptsync_$(FILENAME_CODE).efi

fs_edk2: build_edk2
	for BASENAME in $(EDK2_DRIVER_BASENAMES) ; do \
		echo "Copying $$BASENAME""_$(FILENAME_CODE).efi" ; \
		cp "$(EDK2_BUILDLOC)/$$BASENAME.efi" ./drivers_$(FILENAME_CODE)/$$BASENAME\_$(FILENAME_CODE).efi ; \
	done

build_edk2: $(EDK2BASE)/RefindPkg
	cd $(EDK2BASE) && \
	. ./edksetup.sh BaseTools && \
	build -a $(UC_ARCH) -p RefindPkg/RefindPkg.dsc
	mkdir -p ./drivers_$(FILENAME_CODE)

$(EDK2BASE)/RefindPkg:
	ln -s $(THISDIR) $(EDK2BASE)/RefindPkg

###########################################################################
#
# Build rules that are not dependent on the toolkit....
#
###########################################################################

# NOTE: This "clean" rule cleans intermediate components for all three
# build styles (tiano, edk2, and gnuefi).
clean:
	make -C $(LIBEG_DIR) clean
	make -C $(MOK_DIR) clean
	make -C $(LOADER_DIR) clean
	make -C $(EFILIB_DIR) clean
	make -C $(FS_DIR) clean
	make -C $(GPTSYNC_DIR) clean
	rm -f include/*~
	rm -rf $(EDK2BASE)/Build/Refind
	rm -rf drivers_$(FILENAME_CODE)/*
	[ ! -L $(EDK2BASE)/RefindPkg ] || rm -v $(EDK2BASE)/RefindPkg

# NOTE TO DISTRIBUTION MAINTAINERS:
# The "install" target installs the program directly to the ESP
# and it modifies the *CURRENT COMPUTER's* NVRAM. Thus, you should
# *NOT* use this target as part of the build process for your
# binary packages (RPMs, Debian packages, etc.). (Gentoo could
# use it in an ebuild, though....) You COULD, however, copy the
# files to a directory somewhere (/usr/share/refind or whatever)
# and then call refind-install as part of the binary package
# installation process.

install:
	./refind-install

# DO NOT DELETE