mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-11-29 18:33:00 +00:00
658 lines
16 KiB
Meson
658 lines
16 KiB
Meson
# Build settings based on the upstream Xcode project.
|
||
# See: https://github.com/apple-oss-distributions/cctools/blob/main/cctools.xcodeproj/project.pbxproj
|
||
|
||
# Project settings
|
||
project(
|
||
'cctools',
|
||
'c',
|
||
version : '@version@',
|
||
default_options : {
|
||
'c_args': [
|
||
'-DCCTB_MACOS=YES',
|
||
'-DCCTB_PROJECT=cctools',
|
||
'-DCCTB_PROJVERS=cctools-@version@',
|
||
'-DCCTB_VERSION=@version@',
|
||
'-DCURRENT_PROJECT_VERSION="@version@"',
|
||
'-DCODEDIRECTORY_SUPPORT',
|
||
'-DLTO_SUPPORT',
|
||
],
|
||
},
|
||
)
|
||
|
||
fs = import('fs')
|
||
|
||
# Options
|
||
target_prefix = get_option('target_prefix')
|
||
|
||
|
||
# Dependencies
|
||
cc = meson.get_compiler('c')
|
||
|
||
libcodedirectory = cc.find_library('codedirectory')
|
||
libprunetrie = cc.find_library('prunetrie')
|
||
|
||
|
||
# Feature tests
|
||
# Add compatibility header for Darwin SDKs that don’t define `utimensat`.
|
||
utimensat_test = '''
|
||
#include <fcntl.h>
|
||
#include <sys/stat.h>
|
||
int main(int argc, char* argv[]) {
|
||
utimensat(AT_FDCWD, NULL, NULL, 0);
|
||
return 0;
|
||
}
|
||
'''
|
||
if host_machine.system() == 'darwin' and not cc.compiles(utimensat_test, name : 'supports utimensat')
|
||
add_project_arguments('-include', 'compat.h', language : 'c')
|
||
add_project_link_arguments('-undefined', 'dynamic_lookup', language : 'c')
|
||
endif
|
||
|
||
|
||
incdirs = include_directories('include')
|
||
|
||
# Static libraries
|
||
libstuff = static_library(
|
||
'stuff',
|
||
c_args : [
|
||
'-DCPU_TYPE_RISCV32=24', # Per src/abstraction/MachOFileAbstraction.hpp from ld64
|
||
],
|
||
include_directories : [incdirs, 'include/stuff'],
|
||
sources : [
|
||
'libstuff/SymLoc.c',
|
||
'libstuff/align.c',
|
||
'libstuff/allocate.c',
|
||
'libstuff/apple_version.c',
|
||
'libstuff/arch.c',
|
||
'libstuff/arch_usage.c',
|
||
'libstuff/args.c',
|
||
'libstuff/best_arch.c',
|
||
'libstuff/breakout.c',
|
||
'libstuff/bytesex.c',
|
||
'libstuff/checkout.c',
|
||
'libstuff/code_directory.c',
|
||
'libstuff/coff_bytesex.c',
|
||
'libstuff/crc32.c',
|
||
'libstuff/depinfo.c',
|
||
'libstuff/diagnostics.c',
|
||
'libstuff/dylib_roots.c',
|
||
'libstuff/dylib_table.c',
|
||
'libstuff/errors.c',
|
||
'libstuff/execute.c',
|
||
'libstuff/fatal_arch.c',
|
||
'libstuff/fatals.c',
|
||
'libstuff/get_arch_from_host.c',
|
||
'libstuff/get_toc_byte_sex.c',
|
||
'libstuff/guess_short_name.c',
|
||
'libstuff/hash_string.c',
|
||
'libstuff/hppa.c',
|
||
'libstuff/llvm.c',
|
||
'libstuff/lto.c',
|
||
'libstuff/macosx_deployment_target.c',
|
||
'libstuff/ofile.c',
|
||
'libstuff/ofile_error.c',
|
||
'libstuff/ofile_get_word.c',
|
||
'libstuff/print.c',
|
||
'libstuff/reloc.c',
|
||
'libstuff/rnd.c',
|
||
'libstuff/seg_addr_table.c',
|
||
'libstuff/set_arch_flag_name.c',
|
||
'libstuff/swap_headers.c',
|
||
'libstuff/symbol_list.c',
|
||
'libstuff/unix_standard_mode.c',
|
||
'libstuff/version_number.c',
|
||
'libstuff/vm_flush_cache.c',
|
||
'libstuff/write64.c',
|
||
'libstuff/writeout.c',
|
||
'libstuff/xcode.c',
|
||
],
|
||
)
|
||
|
||
libstuff_otool = static_library(
|
||
'stuff_otool',
|
||
c_args : [
|
||
'-DCPU_TYPE_RISCV32=24', # Per src/abstraction/MachOFileAbstraction.hpp from ld64
|
||
],
|
||
include_directories : [incdirs, 'include/stuff', 'otool'],
|
||
sources : [
|
||
'libstuff/SymLoc.c',
|
||
'libstuff/align.c',
|
||
'libstuff/allocate.c',
|
||
'libstuff/apple_version.c',
|
||
'libstuff/arch.c',
|
||
'libstuff/arch_usage.c',
|
||
'libstuff/args.c',
|
||
'libstuff/best_arch.c',
|
||
'libstuff/breakout.c',
|
||
'libstuff/bytesex.c',
|
||
'libstuff/checkout.c',
|
||
'libstuff/code_directory.c',
|
||
'libstuff/coff_bytesex.c',
|
||
'libstuff/crc32.c',
|
||
'libstuff/depinfo.c',
|
||
'libstuff/diagnostics.c',
|
||
'libstuff/dylib_roots.c',
|
||
'libstuff/dylib_table.c',
|
||
'libstuff/errors.c',
|
||
'libstuff/execute.c',
|
||
'libstuff/fatal_arch.c',
|
||
'libstuff/fatals.c',
|
||
'libstuff/get_arch_from_host.c',
|
||
'libstuff/get_toc_byte_sex.c',
|
||
'libstuff/guess_short_name.c',
|
||
'libstuff/hash_string.c',
|
||
'libstuff/hppa.c',
|
||
'libstuff/llvm.c',
|
||
'libstuff/lto.c',
|
||
'libstuff/macosx_deployment_target.c',
|
||
'libstuff/ofile.c',
|
||
'libstuff/ofile_error.c',
|
||
'libstuff/ofile_get_word.c',
|
||
'libstuff/print.c',
|
||
'libstuff/reloc.c',
|
||
'libstuff/rnd.c',
|
||
'libstuff/seg_addr_table.c',
|
||
'libstuff/set_arch_flag_name.c',
|
||
'libstuff/swap_headers.c',
|
||
'libstuff/symbol_list.c',
|
||
'libstuff/unix_standard_mode.c',
|
||
'libstuff/version_number.c',
|
||
'libstuff/vm_flush_cache.c',
|
||
'libstuff/write64.c',
|
||
'libstuff/writeout.c',
|
||
'libstuff/xcode.c',
|
||
],
|
||
)
|
||
|
||
|
||
# Binaries
|
||
ar = executable(
|
||
f'@target_prefix@ar',
|
||
include_directories : incdirs,
|
||
install : true,
|
||
link_with : [libstuff],
|
||
sources : [
|
||
'ar/append.c',
|
||
'ar/ar.c',
|
||
'ar/archive.c',
|
||
'ar/contents.c',
|
||
'ar/delete.c',
|
||
'ar/extract.c',
|
||
'ar/misc.c',
|
||
'ar/move.c',
|
||
'ar/print.c',
|
||
'ar/replace.c',
|
||
],
|
||
)
|
||
install_man(
|
||
'ar/ar.1',
|
||
'ar/ar.5',
|
||
)
|
||
|
||
as = executable(
|
||
f'@target_prefix@gas',
|
||
include_directories : incdirs,
|
||
install : true,
|
||
link_with : [libstuff],
|
||
sources : ['as/driver.c'],
|
||
)
|
||
|
||
as_common = files(
|
||
'as/app.c',
|
||
'as/as.c',
|
||
'as/atof-generic.c',
|
||
'as/atof-ieee.c',
|
||
'as/dwarf2dbg.c',
|
||
'as/expr.c',
|
||
'as/fixes.c',
|
||
'as/flonum-const.c',
|
||
'as/flonum-copy.c',
|
||
'as/flonum-mult.c',
|
||
'as/frags.c',
|
||
'as/hash.c',
|
||
'as/hex-value.c',
|
||
'as/input-file.c',
|
||
'as/input-scrub.c',
|
||
'as/layout.c',
|
||
'as/messages.c',
|
||
'as/obstack.c',
|
||
'as/read.c',
|
||
'as/sections.c',
|
||
'as/symbols.c',
|
||
'as/write_object.c',
|
||
'as/xmalloc.c',
|
||
)
|
||
|
||
as_arm = executable(
|
||
'as-arm',
|
||
c_args : [
|
||
'-DARM',
|
||
'-DNeXT_MOD',
|
||
],
|
||
include_directories : [
|
||
incdirs,
|
||
'as',
|
||
'include/gnu',
|
||
],
|
||
install : true,
|
||
install_dir : 'libexec/as/arm',
|
||
link_with : [libstuff],
|
||
sources : [as_common, 'as/arm.c'],
|
||
)
|
||
|
||
as_i386 = executable(
|
||
'as-i386',
|
||
c_args : [
|
||
'-DI386',
|
||
'-Di486',
|
||
'-Di586',
|
||
'-Di686',
|
||
'-DNeXT_MOD',
|
||
],
|
||
include_directories : [
|
||
incdirs,
|
||
'as',
|
||
'include/gnu',
|
||
],
|
||
install : true,
|
||
install_dir : 'libexec/as/i386',
|
||
link_with : [libstuff],
|
||
sources : [as_common, 'as/i386.c'],
|
||
)
|
||
|
||
as_x86_64 = executable(
|
||
'as-x86_64',
|
||
c_args : [
|
||
'-DI386',
|
||
'-Di486',
|
||
'-Di586',
|
||
'-Di686',
|
||
'-DARCH64',
|
||
'-DNeXT_MOD',
|
||
],
|
||
include_directories : [
|
||
incdirs,
|
||
'as',
|
||
'include/gnu'
|
||
],
|
||
install : true,
|
||
install_dir : 'libexec/as/x86_64',
|
||
link_with : [libstuff],
|
||
sources : [as_common, 'as/i386.c'],
|
||
)
|
||
|
||
# # ld # excluded because ld64 is built separately
|
||
|
||
bitcode_strip = executable(
|
||
f'@target_prefix@bitcode_strip',
|
||
dependencies : [libcodedirectory],
|
||
include_directories : incdirs,
|
||
install : true,
|
||
link_with : [libstuff],
|
||
sources : ['misc/bitcode_strip.c'],
|
||
)
|
||
install_man('man/bitcode_strip.1')
|
||
|
||
check_dylib = executable(
|
||
f'@target_prefix@check_dylib',
|
||
include_directories : incdirs,
|
||
install : true,
|
||
link_with : [libstuff],
|
||
sources : ['misc/check_dylib.c'],
|
||
)
|
||
install_man('man/check_dylib.1')
|
||
|
||
checksyms = executable(
|
||
f'@target_prefix@checksyms',
|
||
include_directories : incdirs,
|
||
install : true,
|
||
link_with : [libstuff],
|
||
sources : ['misc/checksyms.c'],
|
||
)
|
||
install_man('man/checksyms.1')
|
||
|
||
cmpdylib = executable(
|
||
f'@target_prefix@cmpdylib',
|
||
include_directories : incdirs,
|
||
install : true,
|
||
link_with : [libstuff],
|
||
sources : ['misc/cmpdylib.c'],
|
||
)
|
||
install_man('man/cmpdylib.1')
|
||
|
||
codesign_allocate = executable(
|
||
f'@target_prefix@codesign_allocate',
|
||
dependencies : [libcodedirectory],
|
||
include_directories : incdirs,
|
||
install : true,
|
||
link_with : [libstuff],
|
||
sources : ['misc/codesign_allocate.c'],
|
||
)
|
||
install_man('man/codesign_allocate.1')
|
||
|
||
ctf_insert = executable(
|
||
f'@target_prefix@ctf_insert',
|
||
dependencies : [libcodedirectory],
|
||
include_directories : [incdirs, 'include/stuff'],
|
||
install : true,
|
||
link_with : [libstuff],
|
||
sources : ['misc/ctf_insert.c'],
|
||
)
|
||
install_man('man/ctf_insert.1')
|
||
|
||
depinfo = executable(
|
||
f'@target_prefix@depinfo',
|
||
include_directories : incdirs,
|
||
install : true,
|
||
link_with : [libstuff],
|
||
sources : ['misc/depinfo.c'],
|
||
)
|
||
install_man('man/depinfo.1')
|
||
|
||
diagtest = executable(
|
||
f'@target_prefix@diagtest',
|
||
include_directories : incdirs,
|
||
install : true,
|
||
link_with : [libstuff],
|
||
sources : ['misc/diagtest.c'],
|
||
)
|
||
install_man('man/diagtest.1')
|
||
|
||
gprof = executable(
|
||
f'@target_prefix@gprof',
|
||
include_directories : incdirs,
|
||
install : true,
|
||
link_with : [libstuff],
|
||
sources : [
|
||
'gprof/arcs.c',
|
||
'gprof/calls.c',
|
||
'gprof/dfn.c',
|
||
'gprof/getnfile.c',
|
||
'gprof/gprof.c',
|
||
'gprof/hertz.c',
|
||
'gprof/lookup.c',
|
||
'gprof/printgprof.c',
|
||
'gprof/printlist.c',
|
||
'gprof/scatter.c',
|
||
],
|
||
)
|
||
install_man('man/gprof.1')
|
||
|
||
# Not supported on 64-bit architectures
|
||
# indr = executable(
|
||
# f'@target_prefix@indr',
|
||
# include_directories : incdirs,
|
||
# sources : ['misc/indr.c'],
|
||
# )
|
||
# install_man('man/indr.1')
|
||
|
||
install_name_tool = executable(
|
||
f'@target_prefix@install_name_tool',
|
||
dependencies : [libcodedirectory],
|
||
include_directories : incdirs,
|
||
install : true,
|
||
link_with : [libstuff],
|
||
sources : ['misc/install_name_tool.c'],
|
||
)
|
||
install_man('man/install_name_tool.1')
|
||
|
||
libtool = executable(
|
||
f'@target_prefix@libtool',
|
||
include_directories : incdirs,
|
||
install : true,
|
||
link_with : [libstuff],
|
||
sources : ['misc/libtool.c'],
|
||
)
|
||
install_man('man/libtool.1')
|
||
|
||
lipo = executable(
|
||
f'@target_prefix@lipo',
|
||
include_directories : incdirs,
|
||
install : true,
|
||
link_with : [libstuff],
|
||
sources : ['misc/lipo.c'],
|
||
)
|
||
install_man('man/lipo.1')
|
||
|
||
mtoc = executable(
|
||
f'@target_prefix@mtoc',
|
||
include_directories : incdirs,
|
||
install : true,
|
||
link_with : [libstuff],
|
||
sources : ['efitools/mtoc.c'],
|
||
)
|
||
install_man('man/mtoc.1')
|
||
|
||
mtor = executable(
|
||
f'@target_prefix@mtor',
|
||
include_directories : incdirs,
|
||
install : true,
|
||
link_with : [libstuff],
|
||
sources : ['efitools/mtor.c'],
|
||
)
|
||
install_man('man/mtor.1')
|
||
|
||
nm = executable(
|
||
f'@target_prefix@nm',
|
||
include_directories : incdirs,
|
||
install : true,
|
||
link_with : [libstuff],
|
||
sources : ['misc/nm.c'],
|
||
)
|
||
install_man('man/nm-classic.1')
|
||
|
||
nmedit = executable(
|
||
f'@target_prefix@nmedit',
|
||
c_args : ['-DNMEDIT'],
|
||
dependencies : [libcodedirectory],
|
||
include_directories : incdirs,
|
||
install : true,
|
||
link_with : [libstuff],
|
||
sources : ['misc/strip.c'],
|
||
)
|
||
install_man('man/nmedit.1')
|
||
|
||
otool = executable(
|
||
f'@target_prefix@otool',
|
||
c_args : ['-DEFI_SUPPORT'],
|
||
include_directories : incdirs,
|
||
install : true,
|
||
link_with : [libstuff],
|
||
sources : [
|
||
'otool/arm64_disasm.c',
|
||
'otool/arm_disasm.c',
|
||
'otool/coff_print.c',
|
||
'otool/dyld_bind_info.c',
|
||
'otool/hppa_disasm.c',
|
||
'otool/i386_disasm.c',
|
||
'otool/i860_disasm.c',
|
||
'otool/m68k_disasm.c',
|
||
'otool/m88k_disasm.c',
|
||
'otool/main.c',
|
||
'otool/ofile_print.c',
|
||
'otool/ppc_disasm.c',
|
||
'otool/print_bitcode.c',
|
||
'otool/print_objc.c',
|
||
'otool/print_objc2_32bit.c',
|
||
'otool/print_objc2_64bit.c',
|
||
'otool/print_objc2_util.c',
|
||
'otool/sparc_disasm.c',
|
||
],
|
||
)
|
||
install_man('man/otool-classic.1')
|
||
|
||
pagestuff = executable(
|
||
f'@target_prefix@pagestuff',
|
||
include_directories : incdirs,
|
||
install : true,
|
||
link_with : [libstuff],
|
||
sources : ['misc/pagestuff.c'],
|
||
)
|
||
install_man('man/pagestuff.1')
|
||
|
||
# ranlib is a symlink to libtool
|
||
install_man(
|
||
'man/ranlib.1',
|
||
'man/ranlib.5',
|
||
)
|
||
|
||
redo_prebinding = executable(
|
||
f'@target_prefix@redo_prebinding',
|
||
dependencies : [libcodedirectory],
|
||
include_directories : incdirs,
|
||
install : true,
|
||
link_with : [libstuff],
|
||
sources : ['misc/redo_prebinding.c'],
|
||
)
|
||
install_man('man/redo_prebinding.1')
|
||
|
||
seg_addr_table = executable(
|
||
f'@target_prefix@seg_addr_table',
|
||
include_directories : incdirs,
|
||
install : true,
|
||
link_with : [libstuff],
|
||
sources : ['misc/seg_addr_table.c'],
|
||
)
|
||
install_man('man/seg_addr_table.1')
|
||
|
||
seg_hack = executable(
|
||
f'@target_prefix@seg_hack',
|
||
dependencies : [libcodedirectory],
|
||
include_directories : incdirs,
|
||
install : true,
|
||
link_with : [libstuff],
|
||
sources : ['misc/seg_hack.c'],
|
||
)
|
||
|
||
segedit = executable(
|
||
f'@target_prefix@segedit',
|
||
include_directories : incdirs,
|
||
install : true,
|
||
link_with : [libstuff],
|
||
sources : ['misc/segedit.c'],
|
||
)
|
||
install_man('man/segedit.1',)
|
||
|
||
size = executable(
|
||
f'@target_prefix@size',
|
||
include_directories : incdirs,
|
||
install : true,
|
||
link_with : [libstuff],
|
||
sources : ['misc/size.c'],
|
||
)
|
||
install_man('man/size-classic.1')
|
||
|
||
strings = executable(
|
||
f'@target_prefix@strings',
|
||
include_directories : incdirs,
|
||
install : true,
|
||
link_with : [libstuff],
|
||
sources : ['misc/strings.c'],
|
||
)
|
||
install_man('man/strings.1')
|
||
|
||
strip = executable(
|
||
f'@target_prefix@strip',
|
||
c_args : ['-DTRIE_SUPPORT'],
|
||
dependencies : [libcodedirectory, libprunetrie],
|
||
include_directories : incdirs,
|
||
install : true,
|
||
link_with : [libstuff],
|
||
sources : ['misc/strip.c'],
|
||
)
|
||
install_man('man/strip.1')
|
||
|
||
vtool = executable(
|
||
f'@target_prefix@vtool',
|
||
dependencies : [libcodedirectory],
|
||
include_directories : [incdirs, 'include/stuff'],
|
||
install : true,
|
||
link_with : [libstuff],
|
||
sources : ['misc/vtool.c'],
|
||
)
|
||
install_man('man/vtool.1')
|
||
|
||
|
||
# Development files
|
||
# Static libraries
|
||
libmacho = static_library(
|
||
'macho',
|
||
include_directories : incdirs,
|
||
sources : [
|
||
'libmacho/arch.c',
|
||
'libmacho/get_end.c',
|
||
'libmacho/getsecbyname.c',
|
||
'libmacho/getsegbyname.c',
|
||
'libmacho/hppa_swap.c',
|
||
'libmacho/i386_swap.c',
|
||
'libmacho/i860_swap.c',
|
||
'libmacho/m68k_swap.c',
|
||
'libmacho/m88k_swap.c',
|
||
'libmacho/ppc_swap.c',
|
||
'libmacho/slot_name.c',
|
||
'libmacho/sparc_swap.c',
|
||
'libmacho/swap.c',
|
||
],
|
||
)
|
||
|
||
libredo_prebinding = static_library(
|
||
'redo_prebinding',
|
||
c_args : ['-DLIBRARY_API'],
|
||
include_directories : incdirs,
|
||
sources : ['misc/redo_prebinding.c'],
|
||
)
|
||
install_man('man/redo_prebinding.3')
|
||
|
||
|
||
# Development files
|
||
# Based on the contents of the upstream SDK.
|
||
install_headers(
|
||
'include/mach-o/arch.h',
|
||
'include/mach-o/fat.h',
|
||
'include/mach-o/getsect.h',
|
||
'include/mach-o/ldsyms.h',
|
||
'include/mach-o/loader.h',
|
||
'include/mach-o/nlist.h',
|
||
'include/mach-o/ranlib.h',
|
||
'include/mach-o/reloc.h',
|
||
'include/mach-o/stab.h',
|
||
'include/mach-o/swap.h',
|
||
subdir : 'mach-o',
|
||
)
|
||
|
||
# Some of these architectures are irrelevant, but the Libsystem derivation expects their headers to be present.
|
||
# Not every arch has both headers, so tailor the lists for each that does.
|
||
foreach arch : ['arm', 'arm64', 'hppa', 'i860', 'm88k', 'ppc', 'sparc', 'x86_64']
|
||
install_headers(
|
||
f'include/mach-o/@arch@/reloc.h',
|
||
subdir : f'mach-o/@arch@',
|
||
)
|
||
endforeach
|
||
foreach arch : ['hppa', 'i386', 'i860', 'm68k', 'm88k', 'ppc', 'sparc']
|
||
install_headers(
|
||
f'include/mach-o/@arch@/swap.h',
|
||
subdir : f'mach-o/@arch@',
|
||
)
|
||
endforeach
|
||
|
||
install_data(
|
||
'include/modules/mach-o.modulemap',
|
||
install_dir : get_option('includedir'),
|
||
rename : 'mach-o/module.map',
|
||
)
|
||
install_man(
|
||
'man/Mach-O.5',
|
||
'man/NSModule.3',
|
||
'man/NSObjectFileImage.3',
|
||
'man/NSObjectFileImage_priv.3',
|
||
'man/arch.3',
|
||
'man/dyld.3',
|
||
'man/end.3',
|
||
'man/get_end.3',
|
||
'man/getsectbyname.3',
|
||
'man/getsectbynamefromheader.3',
|
||
'man/getsectdata.3',
|
||
'man/getsectdatafromheader.3',
|
||
'man/getsegbyname.3',
|
||
'man/stab.5',
|
||
)
|