mlibc/meson.build

358 lines
12 KiB
Meson
Raw Normal View History

project('mlibc', default_options: ['warning_level=2', 'cpp_std=c++20'])
fs = import('fs')
rtdl_include_dirs = [
include_directories('options/internal/include'),
include_directories('options/internal' / host_machine.cpu_family() + '-include'),
include_directories('options/rtdl/include'),
]
libc_include_dirs = [
include_directories('options/internal/include'),
include_directories('options/elf/include'),
include_directories('options/lsb/include'),
2022-06-02 04:37:51 +02:00
include_directories('options/rtdl/include'),
include_directories('options/internal' / host_machine.cpu_family() + '-include')
]
2018-11-10 09:41:08 +01:00
rtdl_sources = [ ]
libc_sources = [ ]
libc_sublibs = [ ]
2018-11-10 09:41:08 +01:00
libc_deps = [ ]
rtdl_deps = [ ]
headers_only = get_option('headers_only')
2019-06-15 11:15:41 +02:00
no_headers = get_option('mlibc_no_headers')
2020-02-15 11:29:20 +01:00
static = get_option('static')
build_tests = get_option('build_tests')
2020-08-30 20:08:56 +02:00
disable_ansi_option = get_option('disable_ansi_option')
disable_posix_option = get_option('disable_posix_option')
disable_linux_option = get_option('disable_linux_option')
2021-10-27 18:16:54 +02:00
disable_linux_headers = get_option('disable_linux_headers_option')
disable_iconv_option = get_option('disable_iconv_option')
disable_intl_option = get_option('disable_intl_option')
disable_glibc_option = get_option('disable_glibc_option')
disable_crypt_option = get_option('disable_crypt_option')
disable_bsd_option = get_option('disable_bsd_option')
internal_conf = configuration_data()
mlibc_conf = configuration_data()
if not headers_only
2022-05-22 21:33:31 +02:00
cxxshim_dep = dependency('cxxshim', fallback: ['cxxshim', 'cxxshim_dep'])
libc_deps += cxxshim_dep
rtdl_deps += cxxshim_dep
frigg_dep = dependency(
'frigg',
default_options: ['frigg_no_install=true'],
fallback: ['frigg', 'frigg_dep'],
)
libc_deps += frigg_dep
rtdl_deps += frigg_dep
add_languages('c', 'cpp')
c_compiler = meson.get_compiler('c')
2022-06-02 18:47:07 +02:00
add_project_arguments('-Wno-unused-function', language: ['c', 'cpp'])
add_project_arguments('-nostdinc', '-fno-builtin', language: ['c', 'cpp'])
add_project_arguments('-fno-rtti', '-fno-exceptions', language: 'cpp')
add_project_link_arguments('-nostdlib', language: ['c', 'cpp'])
searchdirs = run_command(c_compiler.cmd_array(), '-print-search-dirs',
check: true).stdout()
searchdirs_arr = searchdirs.split('\n')
searchline = 'install: '
ccdir = ''
if c_compiler.get_id() == 'clang'
searchline = 'libraries: ='
endif
foreach line : searchdirs_arr
if line.startswith(searchline)
ccdir = line.strip(searchline)
ccdir = ccdir.split(':')[0]
2021-12-13 01:13:47 +01:00
break
endif
endforeach
if ccdir == ''
error('could not find compiler-specific header directory')
endif
if c_compiler.get_id() == 'gcc' and fs.exists(ccdir / 'include-fixed')
rtdl_include_dirs += include_directories(ccdir / 'include-fixed')
libc_include_dirs += include_directories(ccdir / 'include-fixed')
endif
rtdl_include_dirs += include_directories(ccdir / 'include')
libc_include_dirs += include_directories(ccdir / 'include')
endif
internal_conf.set_quoted('MLIBC_SYSTEM_NAME', host_machine.system())
internal_conf.set('MLIBC_MAP_DSO_SEGMENTS', false)
internal_conf.set('MLIBC_MAP_FILE_WINDOWS', false)
internal_conf.set('MLIBC_STATIC_BUILD', static)
#----------------------------------------------------------------------------------------
# Configuration based on sysdeps.
#----------------------------------------------------------------------------------------
2018-11-17 16:05:57 +01:00
# Process sysdeps first, as sysdeps might want to disable unsupported options.
if host_machine.system() == 'linux'
disable_linux_headers = true
rtdl_include_dirs += include_directories('sysdeps/linux/include')
libc_include_dirs += include_directories('sysdeps/linux/include')
subdir('sysdeps/linux')
elif host_machine.system() == 'aero'
rtdl_include_dirs += include_directories('sysdeps/aero/include')
libc_include_dirs += include_directories('sysdeps/aero/include')
subdir('sysdeps/aero')
elif host_machine.system() == 'managarm'
# TODO: Adopt the include_directories() commands from the managarm meson.build.
rtdl_include_dirs += include_directories('sysdeps/managarm/include')
libc_include_dirs += include_directories('sysdeps/managarm/include')
internal_conf.set('MLIBC_MAP_DSO_SEGMENTS', true)
internal_conf.set('MLIBC_MAP_FILE_WINDOWS', true)
2018-11-17 16:05:57 +01:00
subdir('sysdeps/managarm')
elif host_machine.system() == 'qword'
2019-08-21 12:51:45 +02:00
disable_linux_option = true
rtdl_include_dirs += include_directories('sysdeps/qword/include')
libc_include_dirs += include_directories('sysdeps/qword/include')
2018-11-17 16:05:57 +01:00
subdir('sysdeps/qword')
2022-06-07 23:26:10 +02:00
elif host_machine.system() == 'ironclad'
# disable_linux_option = true
rtdl_include_dirs += include_directories('sysdeps/ironclad/include')
libc_include_dirs += include_directories('sysdeps/ironclad/include')
subdir('sysdeps/ironclad')
2020-02-13 12:19:28 +01:00
elif host_machine.system() == 'lemon'
rtdl_include_dirs += include_directories('sysdeps/lemon/include')
libc_include_dirs += include_directories('sysdeps/lemon/include')
subdir('sysdeps/lemon')
elif host_machine.system() == 'dripos'
disable_linux_option = true
rtdl_include_dirs += include_directories('sysdeps/dripos/include')
libc_include_dirs += include_directories('sysdeps/dripos/include')
subdir('sysdeps/dripos')
2018-11-17 16:05:57 +01:00
else
error('No sysdeps defined for OS: ' + host_machine.system())
endif
2018-10-14 16:45:07 +02:00
#----------------------------------------------------------------------------------------
# Configuration based on enabled options.
#----------------------------------------------------------------------------------------
mlibc_conf.set('__MLIBC_ANSI_OPTION', not disable_ansi_option)
mlibc_conf.set('__MLIBC_POSIX_OPTION', not disable_posix_option)
mlibc_conf.set('__MLIBC_LINUX_OPTION', not disable_linux_option)
mlibc_conf.set('__MLIBC_INTL_OPTION', not disable_intl_option)
mlibc_conf.set('__MLIBC_ICONV_OPTION', not disable_iconv_option)
mlibc_conf.set('__MLIBC_GLIBC_OPTION', not disable_glibc_option)
mlibc_conf.set('__MLIBC_CRYPT_OPTION', not disable_crypt_option)
mlibc_conf.set('__MLIBC_BSD_OPTION', not disable_bsd_option)
if not disable_ansi_option
rtdl_include_dirs += include_directories('options/ansi/include')
libc_include_dirs += include_directories('options/ansi/include')
endif
if not disable_posix_option
rtdl_include_dirs += include_directories('options/posix/include')
libc_include_dirs += include_directories('options/posix/include')
endif
if not disable_iconv_option
rtdl_include_dirs += include_directories('options/iconv/include')
libc_include_dirs += include_directories('options/iconv/include')
endif
if not disable_intl_option
libc_include_dirs += include_directories('options/intl/include')
endif
if not disable_linux_option
rtdl_include_dirs += include_directories('options/linux/include')
libc_include_dirs += include_directories('options/linux/include')
endif
if not disable_glibc_option
rtdl_include_dirs += include_directories('options/glibc/include')
libc_include_dirs += include_directories('options/glibc/include')
endif
if not disable_crypt_option
libc_include_dirs += include_directories('options/crypt/include')
endif
if not disable_bsd_option
libc_include_dirs += include_directories('options/bsd/include')
endif
rtdl_include_dirs += include_directories('options/linux-headers/include')
libc_include_dirs += include_directories('options/linux-headers/include')
2020-02-15 18:47:24 +01:00
rtdl_include_dirs += include_directories('options/elf/include')
libc_include_dirs += include_directories('options/elf/include')
libc_include_dirs += include_directories('.')
#----------------------------------------------------------------------------------------
configure_file(input: 'internal-config.h.in',
output: 'internal-config.h',
configuration: internal_conf)
configure_file(input: 'mlibc-config.h.in',
output: 'mlibc-config.h',
configuration: mlibc_conf,
install: not no_headers,
install_dir: get_option('includedir'))
2018-10-14 16:45:07 +02:00
internal_sources = [
'options/internal/generic/allocator.cpp',
'options/internal/generic/charcode.cpp',
'options/internal/generic/charset.cpp',
2018-10-14 16:45:07 +02:00
'options/internal/generic/debug.cpp',
'options/internal/generic/ensure.cpp',
'options/internal/generic/essential.cpp',
'options/internal/generic/frigg.cpp',
'options/internal/generic/sigset.cpp',
'options/internal/gcc/stack_protector.cpp',
2018-11-05 20:15:53 +01:00
'options/internal/gcc/guard-abi.cpp',
2018-10-14 16:45:07 +02:00
'options/internal/gcc/initfini.cpp',
2018-12-29 13:21:37 +01:00
'options/internal/gcc-extra/cxxabi.cpp',
'options/internal' / host_machine.cpu_family() / 'setjmp.S',
2018-10-14 16:45:07 +02:00
]
2019-06-15 11:15:41 +02:00
if not static
2020-02-13 12:19:28 +01:00
internal_sources += [
'options/internal/gcc-extra/mlibc_crtbegin.S',
'options/internal' / host_machine.cpu_family() / 'mlibc_crtend.S',
2020-02-13 12:19:28 +01:00
]
endif
2019-06-15 11:15:41 +02:00
if not no_headers
install_headers(
'options/internal/include/stdint.h'
)
install_headers(
'options/internal/include/bits/wchar_t.h',
'options/internal/include/bits/wchar.h',
2019-06-15 11:15:41 +02:00
'options/internal/include/bits/wint_t.h',
'options/internal/include/bits/size_t.h',
'options/internal/include/bits/types.h',
'options/internal/include/bits/ensure.h',
'options/internal/include/bits/machine.h',
'options/internal/include/bits/mbstate.h',
'options/internal/include/bits/null.h',
'options/internal/include/bits/off_t.h',
'options/internal/include/bits/ssize_t.h',
'options/internal/include/bits/sigset_t.h',
2019-06-15 11:15:41 +02:00
subdir: 'bits'
)
endif
2018-10-14 16:45:07 +02:00
2018-11-10 09:41:08 +01:00
rtdl_sources += [
'options/internal/gcc/stack_protector.cpp',
2018-11-05 20:15:53 +01:00
'options/internal/gcc/guard-abi.cpp',
'options/internal/generic/allocator.cpp',
'options/internal/generic/debug.cpp',
'options/internal/generic/ensure.cpp',
'options/internal/generic/essential.cpp',
'options/internal/generic/frigg.cpp',
2018-10-28 14:43:01 +01:00
'options/rtdl/generic/main.cpp',
'options/rtdl/generic/linker.cpp',
'options/rtdl' / host_machine.cpu_family() / 'runtime.S'
2018-10-28 14:43:01 +01:00
]
if not static
rtdl_sources += 'options/rtdl' / host_machine.cpu_family() / 'entry.S'
endif
2018-12-15 21:47:52 +01:00
subdir('options/elf')
2018-11-10 09:41:08 +01:00
subdir('options/ansi')
subdir('options/posix')
subdir('options/lsb')
2018-12-08 11:09:22 +01:00
subdir('options/glibc')
2018-11-10 09:41:08 +01:00
subdir('options/linux')
2021-10-27 18:16:54 +02:00
subdir('options/linux-headers')
subdir('options/iconv')
subdir('options/intl')
subdir('options/crypt')
subdir('options/bsd')
2018-10-14 16:45:07 +02:00
if not headers_only
2020-02-15 11:29:20 +01:00
if not static
if host_machine.cpu_family() == 'aarch64'
# Link with libgcc to get the necessary symbols (LSE atomics and math stuff)
libgcc = meson.get_compiler('c').find_library('gcc')
libc_deps += libgcc
rtdl_deps += libgcc
endif
2020-02-15 11:29:20 +01:00
ldso_lib = shared_library('ld', rtdl_sources,
name_prefix: '',
cpp_args: ['-fvisibility=hidden', '-DMLIBC_BUILDING_RTDL',
'-fno-stack-protector'],
2020-02-15 11:29:20 +01:00
include_directories: rtdl_include_dirs,
dependencies: rtdl_deps,
install: true)
libc = shared_library('c',
2020-02-15 11:29:20 +01:00
[
libc_sources,
internal_sources,
ansi_sources,
lsb_sources,
],
include_directories: libc_include_dirs,
2020-12-12 00:53:51 +01:00
dependencies: libc_deps,
2020-02-15 11:29:20 +01:00
link_with: [ldso_lib],
link_whole: libc_sublibs,
2021-10-26 09:28:19 +02:00
install: true)
2020-02-15 11:29:20 +01:00
shared_library('dl', 'dummy-libs/libdl/src/dummy.cpp', install: true)
shared_library('pthread', 'dummy-libs/libpthread/src/dummy.cpp', install: true)
shared_library('rt', 'dummy-libs/librt/src/dummy.cpp', install: true)
shared_library('util', 'dummy-libs/libutil/src/dummy.cpp', install: true)
shared_library('m', 'dummy-libs/libm/src/dummy.cpp', install: true)
if not disable_crypt_option
shared_library('crypt', 'dummy-libs/libcrypt/src/dummy.cpp', install: true)
endif
shared_library('resolv', 'dummy-libs/libresolv/src/dummy.cpp', install: true)
2020-02-15 11:29:20 +01:00
else
ldso_lib = static_library('ld', rtdl_sources,
name_prefix: '',
cpp_args: ['-fvisibility=hidden', '-DMLIBC_BUILDING_RTDL', '-DFRIGG_HAVE_LIBC',
'-fno-stack-protector'],
include_directories: rtdl_include_dirs,
dependencies: rtdl_deps,
install: false)
libc = static_library('c',
2020-02-15 11:29:20 +01:00
[
libc_sources,
internal_sources,
ansi_sources,
lsb_sources,
2020-02-15 11:29:20 +01:00
],
cpp_args: ['-DFRIGG_HAVE_LIBC', '-fno-stack-protector'],
c_args: ['-fno-stack-protector'],
2020-02-15 11:29:20 +01:00
include_directories: libc_include_dirs,
2020-08-30 14:54:54 +02:00
dependencies: libc_deps,
link_with: [ldso_lib],
2020-08-30 14:54:54 +02:00
link_whole: [libc_sublibs, ldso_lib],
2020-02-15 11:29:20 +01:00
install: true)
static_library('pthread', 'dummy-libs/libpthread/src/dummy.cpp', install: true)
static_library('rt', 'dummy-libs/librt/src/dummy.cpp', install: true)
static_library('util', 'dummy-libs/libutil/src/dummy.cpp', install: true)
static_library('m', 'dummy-libs/libm/src/dummy.cpp', install: true)
if not disable_crypt_option
static_library('crypt', 'dummy-libs/libcrypt/src/dummy.cpp', install: true)
endif
static_library('resolv', 'dummy-libs/libresolv/src/dummy.cpp', install: true)
2020-02-15 11:29:20 +01:00
endif
endif
if build_tests
subdir('tests/')
endif