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
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
|
# ROMS we want for QEMU with format PCIID:QEMUNAME
%global qemuroms \\\
8086100e:e1000 \\\
10ec8139:rtl8139 \\\
1af41000:virtio \\\
808610d3:e1000e
%if 0%{?fedora}
# Fedora specific roms
%global qemuroms %{qemuroms} \\\
10222000:pcnet \\\
10ec8029:ne2k_pci \\\
80861209:eepro100 \\\
15ad07b0:vmxnet3
%endif
# Enable cross-architecture building on all supported hosts
%global buildarches x86_64 aarch64
# debugging firmwares does not go the same way as a normal program.
# moreover, all architectures providing debuginfo for a single noarch
# package is currently clashing in koji, so don't bother.
%global debug_package %{nil}
# Upstream don't do "releases" :-( So we're going to use the date
# as the version, and a GIT hash as the release. Generate new GIT
# snapshots using the folowing commands:
#
# $ hash=`git log -1 --format='%h'`
# $ date=`git log -1 --format='%cd' --date=short | tr -d -`
# $ git archive --prefix ipxe-${date}-git${hash}/ ${hash} | xz -7e > ipxe-${date}-git${hash}.tar.xz
#
# And then change these two:
%global hash de8a0821
%global date 20240119
Name: ipxe
Version: %{date}
Release: 2.git%{hash}%{?dist}
Summary: A network boot loader
License: BSD-2-Clause AND BSD-3-Clause AND GPL-2.0-only AND (GPL-2.0-only OR MPL-1.1) AND GPL-2.0-or-later AND GPL-2.0-or-later WITH UBDL-exception AND ISC AND MIT
URL: http://ipxe.org/
Source0: %{name}-%{version}-git%{hash}.tar.xz
# Enable IPv6 for qemu's config
# Sent upstream: http://lists.ipxe.org/pipermail/ipxe-devel/2015-November/004494.html
Patch0001: 0001-build-customize-configuration.patch
Patch0002: 0002-Use-spec-compliant-timeouts.patch
%ifarch %{buildarches}
BuildRequires: perl-interpreter
BuildRequires: perl-Getopt-Long
%if 0%{?fedora} >= 33 || 0%{?rhel} >= 9
BuildRequires: perl-FindBin
BuildRequires: perl-lib
%endif
BuildRequires: syslinux
BuildRequires: mtools
BuildRequires: xorriso
BuildRequires: edk2-devel
BuildRequires: xz-devel
BuildRequires: gcc
BuildRequires: binutils-devel
BuildRequires: make
Obsoletes: gpxe <= 1.0.1
%endif
# Define architecture-specific boot image packages
%package bootimg-x86_64
Summary: x86_64 Network boot loader images in bootable USB, CD, floppy and GRUB formats
BuildArch: noarch
Provides: %{name}-bootimgs = %{version}-%{release}
Obsoletes: %{name}-bootimgs < 20200823-9.git4bd064de
Obsoletes: gpxe-bootimgs <= 1.0.1
%package bootimg-aarch64
Summary: AArch64 Network boot loader images in bootable USB and GRUB formats
BuildArch: noarch
%package roms
Summary: Network boot loader roms in .rom format
Requires: %{name}-roms-qemu = %{version}-%{release}
BuildArch: noarch
Obsoletes: gpxe-roms <= 1.0.1
%package roms-qemu
Summary: Network boot loader roms supported by QEMU, .rom format
BuildArch: noarch
Obsoletes: gpxe-roms-qemu <= 1.0.1
%description bootimg-x86_64
iPXE is an open source network bootloader. It provides a direct
replacement for proprietary PXE ROMs, with many extra features such as
DNS, HTTP, iSCSI, etc.
This package contains the iPXE x86_64 boot images in USB, CD, floppy, and PXE
UNDI formats.
%description bootimg-aarch64
iPXE is an open source network bootloader. It provides a direct
replacement for proprietary PXE ROMs, with many extra features such as
DNS, HTTP, iSCSI, etc.
This package contains the iPXE AArch64 boot images in USB and GRUB formats.
%description roms
iPXE is an open source network bootloader. It provides a direct
replacement for proprietary PXE ROMs, with many extra features such as
DNS, HTTP, iSCSI, etc.
This package contains the iPXE roms in .rom format.
%description roms-qemu
iPXE is an open source network bootloader. It provides a direct
replacement for proprietary PXE ROMs, with many extra features such as
DNS, HTTP, iSCSI, etc.
This package contains the iPXE ROMs for devices emulated by QEMU, in
.rom format.
%description
iPXE is an open source network bootloader. It provides a direct
replacement for proprietary PXE ROMs, with many extra features such as
DNS, HTTP, iSCSI, etc.
%prep
%setup -q -n %{name}-%{version}-git%{hash}
%autopatch -p1
# ath9k drivers are too big for an Option ROM, and ipxe devs say it doesn't
# make sense anyways
# http://lists.ipxe.org/pipermail/ipxe-devel/2012-March/001290.html
rm -rf src/drivers/net/ath/ath9k
%build
cd src
make_ipxe() {
make %{?_smp_mflags} \
NO_WERROR=1 V=1 \
"$@"
}
# Define build targets based on host architecture (QEMU-style cross-building)
%ifarch x86_64
build_targets="bin-i386-efi/ipxe.efi bin-x86_64-efi/ipxe.efi bin-x86_64-efi/snponly.efi"
cross_targets="bin-arm64-efi/snponly.efi bin-arm64-efi/ipxe.efi"
%endif
%ifarch aarch64
build_targets="bin-arm64-efi/snponly.efi bin-arm64-efi/ipxe.efi"
cross_targets="bin-i386-efi/ipxe.efi bin-x86_64-efi/ipxe.efi bin-x86_64-efi/snponly.efi"
%endif
# Build native architecture targets
echo "Building native architecture targets..."
make_ipxe $build_targets
# Build cross-architecture targets
echo "Building cross-architecture targets..."
make_ipxe $cross_targets
# Build x86_64 specific traditional boot images (needed on all architectures)
echo "Building x86_64 traditional boot images..."
make_ipxe ISOLINUX_BIN=/usr/share/syslinux/isolinux.bin \
bin/undionly.kpxe bin/ipxe.{dsk,iso,usb,lkrn} \
allroms
# Build x86_64 QEMU ROMs (needed on all architectures)
echo "Building x86_64 QEMU ROMs..."
mkdir bin-combined
for romstr in %{qemuroms}; do
rom=$(echo "$romstr" | cut -d ":" -f 1)
make_ipxe CONFIG=qemu bin/${rom}.rom
make_ipxe CONFIG=qemu bin-x86_64-efi/${rom}.efidrv
vid="0x${rom%%????}"
did="0x${rom#????}"
EfiRom -f "$vid" -i "$did" --pci23 \
-ec bin-x86_64-efi/${rom}.efidrv \
-o bin-combined/${rom}.eficrom
util/catrom.pl \
bin/${rom}.rom \
bin-combined/${rom}.eficrom \
> bin-combined/${rom}.rom
EfiRom -d bin-combined/${rom}.rom
# truncate to at least 256KiB
truncate -s \>256K bin-combined/${rom}.rom
# verify rom fits in 256KiB
test $(stat -c '%s' bin-combined/${rom}.rom) -le $((256 * 1024))
done
%install
# Create architecture-specific directory structure
mkdir -p %{buildroot}/%{_datadir}/%{name}/x86_64/
mkdir -p %{buildroot}/%{_datadir}/%{name}/aarch64/
mkdir -p %{buildroot}/%{_datadir}/%{name}.efi/x86_64/
# Install x86_64 traditional boot images (built on all architectures)
echo "Installing x86_64 boot images..."
pushd src/bin/
cp -a undionly.kpxe ipxe.{iso,usb,dsk,lkrn} %{buildroot}/%{_datadir}/%{name}/x86_64/
popd
# Install x86_64 EFI images
echo "Installing x86_64 EFI images..."
cp -a src/bin-i386-efi/ipxe.efi %{buildroot}/%{_datadir}/%{name}/x86_64/ipxe-i386.efi
cp -a src/bin-x86_64-efi/ipxe.efi %{buildroot}/%{_datadir}/%{name}/x86_64/ipxe-x86_64.efi
cp -a src/bin-x86_64-efi/snponly.efi %{buildroot}/%{_datadir}/%{name}/x86_64/ipxe-snponly-x86_64.efi
# Install aarch64 EFI images
echo "Installing aarch64 EFI images..."
cp -a src/bin-arm64-efi/snponly.efi %{buildroot}/%{_datadir}/%{name}/aarch64/snponly.efi
cp -a src/bin-arm64-efi/ipxe.efi %{buildroot}/%{_datadir}/%{name}/aarch64/ipxe.efi
# Install ROM files (x86_64 specific)
echo "Installing ROM files..."
for img in src/bin/*.rom; do
if [ -e "$img" ]; then
baseimg=$(basename "$img")
cp -a "$img" %{buildroot}/%{_datadir}/%{name}/x86_64/
echo %{_datadir}/%{name}/x86_64/$baseimg >> x86_64.rom.list
fi
done
# Install QEMU ROMs and create symlinks
echo "Installing QEMU ROMs..."
mkdir -p %{buildroot}%{_datadir}/%{name}/x86_64/qemu/
for romstr in %{qemuroms}; do
rom=$(echo "$romstr" | cut -d ":" -f 1)
qemuname=$(echo "$romstr" | cut -d ":" -f 2)
# Remove QEMU ROMs from main ROM list
sed -i -e "/\/x86_64\/${rom}.rom/d" x86_64.rom.list
# Copy ROM files
cp src/bin-combined/${rom}.rom %{buildroot}/%{_datadir}/%{name}.efi/x86_64/
echo %{_datadir}/%{name}.efi/x86_64/${rom}.rom >> x86_64.qemu.rom.list
# Create QEMU symlinks
ln -s ../../ipxe/x86_64/${rom}.rom %{buildroot}%{_datadir}/%{name}/x86_64/qemu/pxe-${qemuname}.rom
ln -s ../../ipxe.efi/x86_64/${rom}.rom %{buildroot}%{_datadir}/%{name}/x86_64/qemu/efi-${qemuname}.rom
done
%files bootimg-x86_64
%dir %{_datadir}/%{name}
%dir %{_datadir}/%{name}/x86_64
%{_datadir}/%{name}/x86_64/ipxe.iso
%{_datadir}/%{name}/x86_64/ipxe.usb
%{_datadir}/%{name}/x86_64/ipxe.dsk
%{_datadir}/%{name}/x86_64/ipxe.lkrn
%{_datadir}/%{name}/x86_64/ipxe-i386.efi
%{_datadir}/%{name}/x86_64/ipxe-x86_64.efi
%{_datadir}/%{name}/x86_64/undionly.kpxe
%{_datadir}/%{name}/x86_64/ipxe-snponly-x86_64.efi
%doc COPYING COPYING.GPLv2 COPYING.UBDL
%files bootimg-aarch64
%dir %{_datadir}/%{name}
%dir %{_datadir}/%{name}/aarch64
%{_datadir}/%{name}/aarch64/ipxe.efi
%{_datadir}/%{name}/aarch64/snponly.efi
%doc COPYING COPYING.GPLv2 COPYING.UBDL
%files roms -f x86_64.rom.list
%dir %{_datadir}/%{name}
%dir %{_datadir}/%{name}/x86_64
%doc COPYING COPYING.GPLv2 COPYING.UBDL
%files roms-qemu -f x86_64.qemu.rom.list
%dir %{_datadir}/%{name}
%dir %{_datadir}/%{name}.efi
%dir %{_datadir}/%{name}.efi/x86_64
%{_datadir}/%{name}/x86_64/qemu
%doc COPYING COPYING.GPLv2 COPYING.UBDL
%changelog
* Thu Jul 18 2024 Fedora Release Engineering <releng@fedoraproject.org> - 20240119-2.gitde8a0821
- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild
* Tue Jan 30 2024 Your Name <your.email@example.com> - 20240119-2.gitde8a0821
- Implement QEMU-style cross-architecture building for iPXE
- Generate both ipxe-bootimg-x86_64 and ipxe-bootimg-aarch64 noarch packages
- Enable building all architectures on any supported build host
* Tue Jan 30 2024 Daniel P. Berrangé <berrange@redhat.com> - 20240119-1.gitde8a0821
- Update to latest git snapshot
* Thu Jan 25 2024 Stid Official <stidofficiel@gmail.com> - 20220210-8.git64113751
- Add support of NFS protocol
* Wed Jan 24 2024 Fedora Release Engineering <releng@fedoraproject.org> - 20220210-7.git64113751
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
* Sat Jan 20 2024 Fedora Release Engineering <releng@fedoraproject.org> - 20220210-6.git64113751
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
* Tue Dec 19 2023 Yaakov Selkowitz <yselkowi@redhat.com> - 20220210-5.git64113751
- Fix build with binutils 2.41
* Thu Jul 20 2023 Fedora Release Engineering <releng@fedoraproject.org> - 20220210-4.git64113751
- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
* Thu Jan 19 2023 Fedora Release Engineering <releng@fedoraproject.org> - 20220210-3.git64113751
- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
* Thu Jul 21 2022 Fedora Release Engineering <releng@fedoraproject.org> - 20220210-2.git64113751
- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild
* Sun Apr 10 2022 Cole Robinson <crobinso@redhat.com> - 20220210-1.git64113751
- Update to newer git snapshot
* Tue Mar 01 2022 Yaakov Selkowitz <yselkowi@redhat.com> - 20200823-9.git4bd064de
- Add aarch64 EFI artifacts (bz 2058680)
* Thu Jan 20 2022 Fedora Release Engineering <releng@fedoraproject.org> - 20200823-8.git4bd064de
- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild
|