summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Janssen <medhefgo@web.de>2021-11-08 13:04:45 +0100
committerLuca Boccassi <luca.boccassi@gmail.com>2021-11-10 18:25:19 +0000
commit9cf75222f2003f274ae6daa4ae9aa8acec1059ea (patch)
tree2e1b87052c4cff14eb907228ca5c1edb38ab8e69
parentfe63d890fd18d728604060e1c207356ace28a85e (diff)
downloadsystemd-9cf75222f2003f274ae6daa4ae9aa8acec1059ea.tar.gz
meson: Rework gnu-efi detection
Moving all of the gnu-efi detection into src/boot/efi/meson.build makes more sense than having it partially split. And thanks to subdir_done() we can simplify the code a lot. Fixes: #21258
-rw-r--r--meson.build56
-rw-r--r--src/boot/efi/meson.build557
2 files changed, 284 insertions, 329 deletions
diff --git a/meson.build b/meson.build
index cf10dd82c8..0c4e5a711b 100644
--- a/meson.build
+++ b/meson.build
@@ -1641,39 +1641,8 @@ conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
#####################################################################
-if get_option('efi')
- efi_arch = host_machine.cpu_family()
-
- if efi_arch == 'x86'
- EFI_MACHINE_TYPE_NAME = 'ia32'
- gnu_efi_arch = 'ia32'
- elif efi_arch == 'x86_64'
- EFI_MACHINE_TYPE_NAME = 'x64'
- gnu_efi_arch = 'x86_64'
- elif efi_arch == 'arm'
- EFI_MACHINE_TYPE_NAME = 'arm'
- gnu_efi_arch = 'arm'
- elif efi_arch == 'aarch64'
- EFI_MACHINE_TYPE_NAME = 'aa64'
- gnu_efi_arch = 'aarch64'
- elif efi_arch == 'riscv64'
- EFI_MACHINE_TYPE_NAME = 'riscv64'
- gnu_efi_arch = 'riscv64'
- else
- EFI_MACHINE_TYPE_NAME = ''
- gnu_efi_arch = ''
- endif
-
- have = true
- conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
-else
- have = false
-endif
-conf.set10('ENABLE_EFI', have)
-
subdir('src/fundamental')
subdir('src/boot/efi')
-conf.set10('HAVE_GNU_EFI', have_gnu_efi)
############################################################
@@ -3887,19 +3856,14 @@ summary({
# CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
# LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
-if conf.get('ENABLE_EFI') == 1
- summary({'EFI arch' : efi_arch},
+if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_GNU_EFI') == 1
+ summary({
+ 'EFI machine type' : efi_arch[0],
+ 'EFI CC' : '@0@'.format(' '.join(efi_cc)),
+ 'EFI lds' : efi_lds,
+ 'EFI crt0' : efi_crt0,
+ 'EFI include directory' : efi_incdir},
section : 'Extensible Firmware Interface')
-
- if have_gnu_efi
- summary({
- 'EFI machine type' : EFI_MACHINE_TYPE_NAME,
- 'EFI CC' : '@0@'.format(' '.join(efi_cc)),
- 'EFI lds' : efi_lds,
- 'EFI crt0' : efi_crt0,
- 'EFI include directory' : efi_incdir},
- section : 'Extensible Firmware Interface')
- endif
endif
found = []
@@ -3947,11 +3911,11 @@ foreach tuple : [
# components
['backlight'],
['binfmt'],
- ['bpf-framework', conf.get('BPF_FRAMEWORK') == 1],
+ ['bpf-framework'],
['coredump'],
['environment.d'],
['efi'],
- ['gnu-efi', have_gnu_efi],
+ ['gnu-efi'],
['firstboot'],
['hibernate'],
['homed'],
@@ -4008,7 +3972,7 @@ foreach tuple : [
['debug hashmap'],
['debug mmap cache'],
['debug siphash'],
- ['valgrind', conf.get('VALGRIND') == 1],
+ ['valgrind'],
['trace logging', conf.get('LOG_TRACE') == 1],
['install tests', install_tests],
['link-udev-shared', get_option('link-udev-shared')],
diff --git a/src/boot/efi/meson.build b/src/boot/efi/meson.build
index cdf31c7fd8..9ffc839289 100644
--- a/src/boot/efi/meson.build
+++ b/src/boot/efi/meson.build
@@ -1,5 +1,102 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
+conf.set10('ENABLE_EFI', get_option('efi'))
+conf.set10('HAVE_GNU_EFI', false)
+
+if not get_option('efi') or get_option('gnu-efi') == 'false'
+ if get_option('gnu-efi') == 'true'
+ error('gnu-efi support requested, but general efi support is disabled')
+ endif
+ subdir_done()
+endif
+
+efi_arch = {
+ # host_cc_arch: [efi_arch (see Table 3-2 in UEFI spec), gnu_efi_inc_arch]
+ 'x86': ['ia32', 'ia32'],
+ 'x86_64': ['x64', 'x86_64'],
+ 'arm': ['arm', 'arm'],
+ 'aarch64': ['aa64', 'aarch64'],
+ 'riscv64': ['riscv64', 'riscv64'],
+}.get(host_machine.cpu_family(), [])
+
+efi_incdir = get_option('efi-includedir')
+if efi_arch.length() > 0 and not cc.has_header('@0@/@1@/efibind.h'.format(efi_incdir, efi_arch[1]))
+ efi_arch = []
+endif
+
+if efi_arch.length() == 0
+ if get_option('gnu-efi') == 'true'
+ error('gnu-efi support requested, but headers not found or efi arch is unkown')
+ endif
+ warning('gnu-efi headers not found or efi arch is unkown, disabling gnu-efi support')
+ subdir_done()
+endif
+
+if not cc.has_header_symbol('efi.h', 'EFI_IMAGE_MACHINE_X64',
+ include_directories: include_directories(efi_incdir, efi_incdir / efi_arch[1]))
+
+ if get_option('gnu-efi') == 'true'
+ error('gnu-efi support requested, but found headers are too old (3.0.5+ required)')
+ endif
+ warning('gnu-efi headers are too old (3.0.5+ required), disabling gnu-efi support')
+ subdir_done()
+endif
+
+objcopy = find_program('objcopy')
+efi_cc = get_option('efi-cc')
+if efi_cc.length() == 0
+ efi_cc = cc.cmd_array()
+endif
+
+efi_ld = find_program(get_option('efi-ld'))
+efi_ld_name = efi_ld.path().split('/')[-1]
+if efi_ld_name == 'lld' or efi_ld_name == 'ld.lld'
+ # LLVM/LLD does not support PE/COFF relocations
+ # https://lists.llvm.org/pipermail/llvm-dev/2021-March/149234.html
+ error('LLVM/lld does not support PE/COFF relocations. Use different linker for EFI image.')
+endif
+
+efi_libdir = ''
+foreach dir : [get_option('efi-libdir'),
+ '/usr/lib/gnuefi' / efi_arch[0],
+ run_command('realpath', '-e',
+ '/usr/lib' / run_command(efi_cc, '-print-multi-os-directory').stdout().strip()).stdout().strip()]
+ if run_command(test, '-d', dir).returncode() == 0
+ efi_libdir = dir
+ break
+ endif
+endforeach
+if efi_libdir == ''
+ if get_option('gnu-efi') == 'true'
+ error('gnu-efi support requested, but efi-libdir was not found')
+ endif
+ warning('efi-libdir was not found, disabling gnu-efi support')
+ subdir_done()
+endif
+
+efi_lds = ''
+foreach location : [ # New locations first introduced with gnu-efi 3.0.11
+ [efi_libdir / 'efi.lds',
+ efi_libdir / 'crt0.o'],
+ # Older locations...
+ [efi_libdir / 'gnuefi' / 'elf_@0@_efi.lds'.format(efi_arch[1]),
+ efi_libdir / 'gnuefi' / 'crt0-efi-@0@.o'.format(efi_arch[1])],
+ [efi_libdir / 'elf_@0@_efi.lds'.format(efi_arch[1]),
+ efi_libdir / 'crt0-efi-@0@.o'.format(efi_arch[1])]]
+ if run_command(test, '-f', location[0], '-a', '-f', location[1]).returncode() == 0
+ efi_lds = location[0]
+ efi_crt0 = location[1]
+ break
+ endif
+endforeach
+if efi_lds == ''
+ if get_option('gnu-efi') == 'true'
+ error('gnu-efi support requested, but cannot find efi.lds')
+ endif
+ warning('efi.lds was not found, disabling gnu-efi support')
+ subdir_done()
+endif
+
efi_headers = files('''
console.h
cpio.h
@@ -39,312 +136,206 @@ systemd_boot_sources = '''
'''.split()
stub_sources = '''
+ cpio.c
initrd.c
splash.c
stub.c
- cpio.c
'''.split()
-if efi_arch in ['x86', 'x86_64']
+if efi_arch[1] in ['ia32', 'x86_64']
stub_sources += 'linux_x86.c'
else
stub_sources += 'linux.c'
endif
-if conf.get('ENABLE_EFI') == 1 and get_option('gnu-efi') != 'false'
- efi_cc = get_option('efi-cc')
- if efi_cc.length() == 0
- efi_cc = cc.cmd_array()
+conf.set10('HAVE_GNU_EFI', true)
+conf.set_quoted('EFI_MACHINE_TYPE_NAME', efi_arch[0])
+
+efi_conf = configuration_data()
+efi_conf.set_quoted('EFI_MACHINE_TYPE_NAME', efi_arch[0])
+efi_conf.set10('ENABLE_TPM', get_option('tpm'))
+
+foreach ctype : ['color-normal', 'color-entry', 'color-highlight', 'color-edit']
+ c = get_option('efi-' + ctype).split(',')
+ efi_conf.set(ctype.underscorify().to_upper(), 'EFI_TEXT_ATTR(@0@, @1@)'.format(
+ 'EFI_' + c[0].strip().underscorify().to_upper(),
+ 'EFI_' + c[1].strip().underscorify().to_upper()))
+endforeach
+
+if get_option('sbat-distro') != ''
+ efi_conf.set_quoted('SBAT_PROJECT', meson.project_name())
+ efi_conf.set_quoted('PROJECT_VERSION', meson.project_version())
+ efi_conf.set('PROJECT_URL', conf.get('PROJECT_URL'))
+ if get_option('sbat-distro-generation') < 1
+ error('SBAT Distro Generation must be a positive integer')
endif
-
- efi_ld = find_program(get_option('efi-ld'), required: true)
- efi_ld_name = efi_ld.path().split('/')[-1]
- if efi_ld_name == 'lld' or efi_ld_name == 'ld.lld'
- # LLVM/LLD does not support PE/COFF relocations
- # https://lists.llvm.org/pipermail/llvm-dev/2021-March/149234.html
- error('LLVM/lld does not support PE/COFF relocations. Use different linker for EFI image.')
- endif
-
- efi_incdir = get_option('efi-includedir')
-
- gnu_efi_path_arch = ''
- foreach name : [gnu_efi_arch, EFI_MACHINE_TYPE_NAME]
- if (gnu_efi_path_arch == '' and name != '' and
- cc.has_header('@0@/@1@/efibind.h'.format(efi_incdir, name)))
- gnu_efi_path_arch = name
+ efi_conf.set('SBAT_DISTRO_GENERATION', get_option('sbat-distro-generation'))
+ foreach sbatvar : [['sbat-distro', 'ID'],
+ ['sbat-distro-summary', 'NAME'],
+ ['sbat-distro-url', 'BUG_REPORT_URL']]
+ value = get_option(sbatvar[0])
+ if (value == '' and not meson.is_cross_build()) or value == 'auto'
+ cmd = 'if [ -e /etc/os-release ]; then . /etc/os-release; else . /usr/lib/os-release; fi; echo $@0@'.format(sbatvar[1])
+ value = run_command(sh, '-c', cmd).stdout().strip()
+ message('@0@ (from @1@): @2@'.format(sbatvar[0], sbatvar[1], value))
endif
- endforeach
-
- if gnu_efi_path_arch != '' and EFI_MACHINE_TYPE_NAME == ''
- error('gnu-efi is available, but EFI_MACHINE_TYPE_NAME is unknown')
- endif
-
- efi_libdir = get_option('efi-libdir')
- if efi_libdir == ''
- # New location first introduced with gnu-efi 3.0.11
- efi_libdir = '/usr/lib/gnuefi' / EFI_MACHINE_TYPE_NAME
- cmd = run_command(test, '-e', efi_libdir)
-
- if cmd.returncode() != 0
- # Fall back to the old approach
- cmd = run_command(efi_cc + ['-print-multi-os-directory'])
- if cmd.returncode() == 0
- path = '/usr/lib' / cmd.stdout().strip()
- cmd = run_command(env, 'realpath', '-e', path)
- if cmd.returncode() == 0
- efi_libdir = cmd.stdout().strip()
- endif
- endif
- endif
- endif
-
- have_gnu_efi = gnu_efi_path_arch != '' and efi_libdir != ''
-
- if have_gnu_efi and not cc.has_header_symbol('efi.h', 'EFI_IMAGE_MACHINE_X64',
- include_directories: include_directories(efi_incdir, efi_incdir / gnu_efi_path_arch))
- have_gnu_efi = false
- if get_option('gnu-efi') == 'true'
- error('gnu-efi support requested, but found headers are too old (3.0.5+ required)')
+ if value == ''
+ error('Required @0@ option not set and autodetection failed'.format(sbatvar[0]))
endif
- endif
-else
- have_gnu_efi = false
-endif
-
-if get_option('gnu-efi') == 'true' and not have_gnu_efi
- error('gnu-efi support requested, but headers were not found')
-endif
-
-if have_gnu_efi
- efi_conf = configuration_data()
- efi_conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
- efi_conf.set10('ENABLE_TPM', get_option('tpm'))
-
- foreach ctype : ['color-normal', 'color-entry', 'color-highlight', 'color-edit']
- c = get_option('efi-' + ctype).split(',')
- fg = 'EFI_' + c[0].strip().underscorify().to_upper()
- bg = 'EFI_BACKGROUND_' + c[1].strip().underscorify().to_upper()
- efi_conf.set(ctype.underscorify().to_upper(), '(' + fg + '|' + bg + ')')
+ efi_conf.set_quoted(sbatvar[0].underscorify().to_upper(), value)
endforeach
- if get_option('sbat-distro') != ''
- efi_conf.set_quoted('SBAT_PROJECT', meson.project_name())
- efi_conf.set_quoted('PROJECT_VERSION', meson.project_version())
- efi_conf.set('PROJECT_URL', conf.get('PROJECT_URL'))
- if get_option('sbat-distro-generation') < 1
- error('SBAT Distro Generation must be a positive integer')
- endif
- efi_conf.set('SBAT_DISTRO_GENERATION', get_option('sbat-distro-generation'))
- sbatvars = [['sbat-distro', 'ID'],
- ['sbat-distro-summary', 'NAME'],
- ['sbat-distro-url', 'BUG_REPORT_URL']]
- foreach sbatvar : sbatvars
- value = get_option(sbatvar[0])
- if (value == '' and not meson.is_cross_build()) or value == 'auto'
- cmd = 'if [ -e /etc/os-release ]; then . /etc/os-release; else . /usr/lib/os-release; fi; echo $@0@'.format(sbatvar[1])
- value = run_command(sh, '-c', cmd).stdout().strip()
- message('@0@ (from @1@): @2@'.format(sbatvar[0], sbatvar[1], value))
- endif
- if value == ''
- error('Required @0@ option not set and autodetection failed'.format(sbatvar[0]))
- endif
- efi_conf.set_quoted(sbatvar[0].underscorify().to_upper(), value)
- endforeach
-
- pkgname = get_option('sbat-distro-pkgname')
- if pkgname == ''
- pkgname = meson.project_name()
- endif
- efi_conf.set_quoted('SBAT_DISTRO_PKGNAME', pkgname)
-
- pkgver = get_option('sbat-distro-version')
- if pkgver == ''
- efi_conf.set('SBAT_DISTRO_VERSION', 'GIT_VERSION')
- else
- efi_conf.set_quoted('SBAT_DISTRO_VERSION', pkgver)
- endif
+ pkgname = get_option('sbat-distro-pkgname')
+ if pkgname == ''
+ pkgname = meson.project_name()
endif
+ efi_conf.set_quoted('SBAT_DISTRO_PKGNAME', pkgname)
- efi_config_h = configure_file(
- output : 'efi_config.h',
- configuration : efi_conf)
-
- objcopy = find_program('objcopy')
-
- efi_location_map = [
- # New locations first introduced with gnu-efi 3.0.11
- [efi_libdir / 'efi.lds',
- efi_libdir / 'crt0.o'],
- # Older locations...
- [efi_libdir / 'gnuefi' / 'elf_@0@_efi.lds'.format(gnu_efi_path_arch),
- efi_libdir / 'gnuefi' / 'crt0-efi-@0@.o'.format(gnu_efi_path_arch)],
- [efi_libdir / 'elf_@0@_efi.lds'.format(gnu_efi_path_arch),
- efi_libdir / 'crt0-efi-@0@.o'.format(gnu_efi_path_arch)]]
- efi_lds = ''
- foreach location : efi_location_map
- if efi_lds == ''
- cmd = run_command(test, '-f', location[0])
- if cmd.returncode() == 0
- efi_lds = location[0]
- efi_crt0 = location[1]
- endif
- endif
- endforeach
- if efi_lds == ''
- if get_option('gnu-efi') == 'true'
- error('gnu-efi support requested, but cannot find efi.lds')
- else
- have_gnu_efi = false
- endif
+ pkgver = get_option('sbat-distro-version')
+ if pkgver == ''
+ efi_conf.set('SBAT_DISTRO_VERSION', 'GIT_VERSION')
+ else
+ efi_conf.set_quoted('SBAT_DISTRO_VERSION', pkgver)
endif
endif
-if have_gnu_efi
- compile_args = cc.get_supported_arguments(
- basic_disabled_warnings +
- possible_common_cc_flags + [
- '-fno-stack-protector',
- '-fno-strict-aliasing',
- '-fpic',
- '-fwide-exec-charset=UCS2',
- '-Wall',
- '-Wextra',
- '-Wsign-compare',
- ]
- ) + [
- '-nostdlib',
- '-std=gnu99',
- '-ffreestanding',
- '-fshort-wchar',
- '-isystem', efi_incdir,
- '-isystem', efi_incdir / gnu_efi_path_arch,
- '-I', fundamental_path,
- '-DSD_BOOT',
- '-DGNU_EFI_USE_MS_ABI',
- '-include', efi_config_h,
- '-include', version_h,
+efi_config_h = configure_file(
+ output : 'efi_config.h',
+ configuration : efi_conf)
+
+compile_args = cc.get_supported_arguments(
+ basic_disabled_warnings +
+ possible_common_cc_flags + [
+ '-fno-stack-protector',
+ '-fno-strict-aliasing',
+ '-fpic',
+ '-fwide-exec-charset=UCS2',
+ '-Wall',
+ '-Wextra',
+ '-Wsign-compare',
]
+) + [
+ '-nostdlib',
+ '-std=gnu99',
+ '-ffreestanding',
+ '-fshort-wchar',
+ '-isystem', efi_incdir,
+ '-isystem', efi_incdir / efi_arch[1],
+ '-I', fundamental_path,
+ '-DSD_BOOT',
+ '-DGNU_EFI_USE_MS_ABI',
+ '-include', efi_config_h,
+ '-include', version_h,
+]
+
+compile_args += cc.get_supported_arguments({
+ 'ia32': ['-mno-sse', '-mno-mmx'],
+ 'x86_64': ['-mno-red-zone', '-mno-sse', '-mno-mmx'],
+ 'arm': ['-mgeneral-regs-only', '-mfpu=none'],
+}.get(efi_arch[1], []))
+
+# We are putting the efi_cc command line together ourselves, so make sure to pull any
+# relevant compiler flags from meson/CFLAGS as povided by the user or distro.
+
+if get_option('werror')
+ compile_args += ['-Werror']
+endif
+if get_option('debug')
+ compile_args += ['-ggdb', '-DEFI_DEBUG']
+endif
+if get_option('optimization') != '0'
+ compile_args += ['-O' + get_option('optimization')]
+endif
+if get_option('b_ndebug') == 'true' or (
+ get_option('b_ndebug') == 'if-release' and get_option('buildtype') in ['plain', 'release'])
+ compile_args += ['-DNDEBUG']
+endif
- if efi_arch == 'x86_64'
- compile_args += ['-mno-red-zone',
- '-mno-sse',
- '-mno-mmx']
- elif efi_arch == 'x86'
- compile_args += ['-mno-sse',
- '-mno-mmx']
- elif efi_arch == 'arm'
- compile_args += cc.get_supported_arguments([
- '-mgeneral-regs-only',
- '-mfpu=none'
- ])
+foreach arg : get_option('c_args')
+ if arg in ['-Werror', '-g', '-ggdb', '-O1', '-O2', '-O3', '-Og', '-Os', '-DNDEBUG']
+ message('Using "@0@" from c_args for EFI compiler'.format(arg))
+ compile_args += arg
endif
+endforeach
+
+efi_ldflags = ['-T', efi_lds,
+ '-shared',
+ '-Bsymbolic',
+ '-nostdlib',
+ '--no-undefined',
+ '--warn-common',
+ '--fatal-warnings',
+ '-znocombreloc',
+ '--build-id=sha1',
+ '-L', efi_libdir,
+ efi_crt0]
+if efi_arch[1] in ['aarch64', 'arm', 'riscv64']
+ # Aarch64, ARM32 and 64bit RISC-V don't have an EFI capable objcopy.
+ # Use 'binary' instead, and add required symbols manually.
+ efi_ldflags += ['--defsym=EFI_SUBSYSTEM=0xa']
+ efi_format = ['-O', 'binary']
+else
+ efi_format = ['--target=efi-app-@0@'.format(efi_arch[1])]
+endif
- # We are putting the efi_cc command line together ourselves, so make sure to pull any
- # relevant compiler flags from meson/CFLAGS as povided by the user or distro.
-
- if get_option('werror')
- compile_args += ['-Werror']
- endif
- if get_option('debug')
- compile_args += ['-ggdb', '-DEFI_DEBUG']
- endif
- if get_option('optimization') != '0'
- compile_args += ['-O' + get_option('optimization')]
- endif
- if get_option('b_ndebug') == 'true' or (
- get_option('b_ndebug') == 'if-release' and ['plain', 'release'].contains(get_option('buildtype')))
- compile_args += ['-DNDEBUG']
+systemd_boot_objects = []
+stub_objects = []
+foreach file : fundamental_source_paths + common_sources + systemd_boot_sources + stub_sources
+ o_file = custom_target(file.split('/')[-1] + '.o',
+ input : file,
+ output : file.split('/')[-1] + '.o',
+ command : [efi_cc, '-c', '@INPUT@', '-o', '@OUTPUT@', compile_args],
+ depend_files : efi_headers + fundamental_headers)
+ if (fundamental_source_paths + common_sources + systemd_boot_sources).contains(file)
+ systemd_boot_objects += o_file
endif
-
- foreach arg : get_option('c_args')
- if arg in ['-Werror', '-g', '-ggdb', '-O1', '-O2', '-O3', '-Og', '-Os', '-DNDEBUG']
- message('Using "@0@" from c_args for EFI compiler'.format(arg))
- compile_args += arg
- endif
- endforeach
-
- efi_ldflags = ['-T', efi_lds,
- '-shared',
- '-Bsymbolic',
- '-nostdlib',
- '--no-undefined',
- '--warn-common',
- '--fatal-warnings',
- '-znocombreloc',
- '--build-id=sha1',
- '-L', efi_libdir,
- efi_crt0]
- if ['aarch64', 'arm', 'riscv64'].contains(efi_arch)
- # Aarch64, ARM32 and 64bit RISC-V don't have an EFI capable objcopy.
- # Use 'binary' instead, and add required symbols manually.
- efi_ldflags += ['--defsym=EFI_SUBSYSTEM=0xa']
- efi_format = ['-O', 'binary']
- else
- efi_format = ['--target=efi-app-@0@'.format(gnu_efi_arch)]
+ if (fundamental_source_paths + common_sources + stub_sources).contains(file)
+ stub_objects += o_file
endif
-
- systemd_boot_objects = []
- stub_objects = []
- foreach file : fundamental_source_paths + common_sources + systemd_boot_sources + stub_sources
- o_file = custom_target(file.split('/')[-1] + '.o',
- input : file,
- output : file.split('/')[-1] + '.o',
- command : efi_cc + ['-c', '@INPUT@', '-o', '@OUTPUT@']
- + compile_args,
- depend_files : efi_headers + fundamental_headers)
- if (fundamental_source_paths + common_sources + systemd_boot_sources).contains(file)
- systemd_boot_objects += o_file
- endif
- if (fundamental_source_paths + common_sources + stub_sources).contains(file)
- stub_objects += o_file
- endif
- endforeach
-
- libgcc_file_name = run_command(efi_cc + ['-print-libgcc-file-name']).stdout().strip()
- systemd_boot_efi_name = 'systemd-boot@0@.efi'.format(EFI_MACHINE_TYPE_NAME)
- stub_elf_name = 'linux@0@.elf.stub'.format(EFI_MACHINE_TYPE_NAME)
- stub_efi_name = 'linux@0@.efi.stub'.format(EFI_MACHINE_TYPE_NAME)
-
- efi_stubs = []
- foreach tuple : [['systemd_boot.so', systemd_boot_efi_name, systemd_boot_objects, false],
- [stub_elf_name, stub_efi_name, stub_objects, true]]
- so = custom_target(
- tuple[0],
- input : tuple[2],
- output : tuple[0],
- command : [efi_ld, '-o', '@OUTPUT@',
- efi_ldflags, tuple[2],
- '-lefi', '-lgnuefi', libgcc_file_name],
- install : tuple[3],
- install_dir : bootlibdir)
-
- stub = custom_target(
- tuple[1],
- input : so,
- output : tuple[1],
- command : [objcopy,
- '-j', '.data',
- '-j', '.dynamic',
- '-j', '.dynsym',
- '-j', '.osrel',
- '-j', '.rel*',
- '-j', '.sbat',
- '-j', '.sdata',
- '-j', '.sdmagic',
- '-j', '.text',
- efi_format,
- '@INPUT@', '@OUTPUT@'],
- install : true,
- install_dir : bootlibdir)
-
- efi_stubs += [[so, stub]]
- endforeach
-
- ############################################################
-
- test_efi_disk_img = custom_target(
- 'test-efi-disk.img',
- input : [efi_stubs[0][0], efi_stubs[1][1]],
- output : 'test-efi-disk.img',
- command : [test_efi_create_disk_sh, '@OUTPUT@','@INPUT@', splash_bmp])
-endif
+endforeach
+
+libgcc_file_name = run_command(efi_cc + ['-print-libgcc-file-name']).stdout().strip()
+systemd_boot_efi_name = 'systemd-boot@0@.efi'.format(efi_arch[0])
+stub_elf_name = 'linux@0@.elf.stub'.format(efi_arch[0])
+stub_efi_name = 'linux@0@.efi.stub'.format(efi_arch[0])
+
+efi_stubs = []
+foreach tuple : [['systemd_boot.so', systemd_boot_efi_name, systemd_boot_objects, false],
+ [stub_elf_name, stub_efi_name, stub_objects, true]]
+ so = custom_target(
+ tuple[0],
+ input : tuple[2],
+ output : tuple[0],
+ command : [efi_ld, '-o', '@OUTPUT@', efi_ldflags, tuple[2], '-lefi', '-lgnuefi', libgcc_file_name],
+ install : tuple[3],
+ install_dir : bootlibdir)
+
+ stub = custom_target(
+ tuple[1],
+ input : so,
+ output : tuple[1],
+ command : [objcopy,
+ '-j', '.data',
+ '-j', '.dynamic',
+ '-j', '.dynsym',
+ '-j', '.osrel',
+ '-j', '.rel*',
+ '-j', '.sbat',
+ '-j', '.sdata',
+ '-j', '.sdmagic',
+ '-j', '.text',
+ efi_format,
+ '@INPUT@', '@OUTPUT@'],
+ install : true,
+ install_dir : bootlibdir)
+
+ efi_stubs += [[so, stub]]
+endforeach
+
+############################################################
+
+test_efi_disk_img = custom_target(
+ 'test-efi-disk.img',
+ input : [efi_stubs[0][0], efi_stubs[1][1]],
+ output : 'test-efi-disk.img',
+ command : [test_efi_create_disk_sh, '@OUTPUT@','@INPUT@', splash_bmp])