Files
zinnia/meson.build
T
2026-10-11 17:43:21 +02:00

163 lines
4.0 KiB
Meson

project(
'zinnia',
license: 'ISC',
version: '0.1.0',
meson_version: '>=1.5.0',
default_options: [
'c_std=gnu23',
'werror=true',
'warning_level=2',
'strip=true',
],
)
if get_option('headers_only')
install_subdir('include/uapi', install_dir: get_option('includedir'))
pkg = import('pkgconfig')
pkg.generate(name: 'zinnia', description: 'Zinnia user API')
subdir_done()
endif
add_languages('c', native: false, required: true)
# Check if we're using a sane compiler.
c_compiler = meson.get_compiler('c')
# We require a compiler that supports the GNU C dialect.
assert(c_compiler.has_define('__GNUC__'))
add_project_arguments(
'-Wno-unused',
'-Wno-unused-parameter',
'-fno-stack-protector',
'-ffunction-sections',
'-fdata-sections',
'-ffreestanding',
'-fno-stack-protector',
language: 'c',
)
add_project_link_arguments(
'-ffreestanding',
'-nostdlib',
'-znoexecstack',
'-Wl,--gc-sections',
'-Wl,--build-id=none',
language: 'c',
)
common_includes = [
include_directories('include'),
include_directories('arch' / target_machine.cpu_family() / 'include'),
]
cfg = configuration_data()
cfg.set_quoted('ZINNIA_VERSION', meson.project_version())
cfg.set_quoted('ZINNIA_ARCH', target_machine.cpu_family())
cfg.set_quoted('ZINNIA_COMPILER_ID', c_compiler.get_id() + ' ' + c_compiler.version())
cfg.set_quoted('ZINNIA_LINKER_ID', c_compiler.get_linker_id())
# Parse kernel config
kv = import('keyval')
kconfig = kv.load(get_option('config_path'))
foreach k, v : kconfig
if v == 'y'
cfg.set10(k, true)
elif v == 'n'
cfg.set10(k, false)
else
cfg.set(k, v)
endif
endforeach
kernel_c_args = ['-DIN_KERNEL']
kernel_lds = meson.current_source_dir() / 'boot' / 'kernel.ld'
kernel_link_args = [
'-T' + kernel_lds,
'-Wl,--export-dynamic',
]
kernel_includes = []
kernel_sources = []
modules = {}
# These dirs go first so we can add arch-specific flags to drivers.
subdir('arch' / target_machine.cpu_family())
subdir('boot')
subdir('core')
subdir('syscalls')
# Device and file system drivers.
subdir('dev')
subdir('fs')
configure_file(
configuration: cfg,
output: 'config.h',
)
mod_summary = {}
foreach name, v : modules
is_modular = v.get('modular', false)
mod_sources = v.get('sources')
mod_c_args = v.get('c_args', [])
mod_link_args = v.get('link_args', [])
mod_includes = v.get('include_directories', [])
mod_link = v.get('link_with', [])
if is_modular
shared_library(
name,
sources: mod_sources,
c_args: ['-fPIC', '-fPIE', '-DIN_MODULE', mod_c_args],
link_args: [
'-T' + module_lds, mod_link_args,
],
link_depends: module_lds,
include_directories: [
common_includes,
kernel_includes, # We want this, actually
mod_includes,
],
name_prefix: '',
name_suffix: 'kso',
link_with: mod_link,
override_options: ['b_lundef=false'],
install_dir: get_option('datadir') / 'zinnia' / 'modules',
#link_depends: kernel.full_path(),
)
else
kernel_sources += mod_sources
kernel_c_args += mod_c_args
kernel_includes += mod_includes
kernel_link_args += mod_link_args
endif
if is_modular
mod_summary += {name: 'mod'}
else
mod_summary += {name: 'builtin'}
endif
endforeach
# Kernel
executable(
'zinnia',
include_directories: [
common_includes,
kernel_includes,
],
c_args: [kernel_c_args],
link_args: kernel_link_args,
link_depends: kernel_lds,
sources: kernel_sources,
install: true,
install_dir: get_option('datadir') / 'zinnia',
pie: true,
)
# Print a summary
summary(mod_summary, section: 'Driver configuration')
summary(kconfig, bool_yn: true, section: 'Kernel configuration')