198 lines
4.2 KiB
Meson
198 lines
4.2 KiB
Meson
project('cell', ['c', 'cpp'],
|
|
version: '0.9.3',
|
|
meson_version: '>=1.4',
|
|
default_options : [ 'cpp_std=c++11', 'default_library=static'])
|
|
|
|
libtype = get_option('default_library')
|
|
|
|
link = []
|
|
src = []
|
|
|
|
add_project_arguments(
|
|
'-Wno-incompatible-pointer-types',
|
|
'-Wno-missing-braces',
|
|
'-Wno-strict-prototypes',
|
|
'-Wno-unused-function',
|
|
'-Wno-int-conversion',
|
|
language: 'c'
|
|
)
|
|
add_project_arguments('-Wno-narrowing', language: 'cpp')
|
|
|
|
if get_option('validate_gc')
|
|
add_project_arguments('-DVALIDATE_GC', language: 'c')
|
|
endif
|
|
|
|
if get_option('force_gc')
|
|
add_project_arguments('-DFORCE_GC_AT_MALLOC', language: 'c')
|
|
endif
|
|
|
|
|
|
deps = []
|
|
|
|
if host_machine.system() == 'darwin'
|
|
add_project_arguments('-x', 'objective-c', language: 'c')
|
|
fworks = [
|
|
'CoreFoundation',
|
|
'CFNetwork',
|
|
]
|
|
foreach fkit : fworks
|
|
deps += dependency('appleframeworks', modules: fkit)
|
|
endforeach
|
|
# Native code uses dispatch loop (no C stack recursion)
|
|
endif
|
|
|
|
if host_machine.system() == 'playdate'
|
|
add_project_arguments('-DTARGET_PLAYDATE', language: 'c')
|
|
endif
|
|
|
|
link_args = link
|
|
sources = []
|
|
src += [ # core
|
|
'monocypher.c',
|
|
'cell.c',
|
|
'suite.c',
|
|
'wildmatch.c',
|
|
'qjs_actor.c',
|
|
'miniz.c',
|
|
'runtime.c',
|
|
'mach.c',
|
|
'libregexp.c', 'libunicode.c', 'cutils.c', 'dtoa.c'
|
|
]
|
|
|
|
src += ['scheduler.c']
|
|
src += ['qbe_helpers.c']
|
|
src += ['qbe_backend.c']
|
|
|
|
scripts = [
|
|
'json.c',
|
|
'internal/nota.c',
|
|
'internal/wota.c',
|
|
'math/radians.c',
|
|
'math/degrees.c',
|
|
'math/cycles.c',
|
|
'src/cell_math.c',
|
|
'debug/js.c',
|
|
'internal/qop.c',
|
|
'internal/wildstar.c',
|
|
'fit.c',
|
|
'internal/crypto.c',
|
|
'internal/kim.c',
|
|
'internal/time.c',
|
|
'debug/debug.c',
|
|
'internal/os.c',
|
|
'internal/fd.c',
|
|
'net/http.c',
|
|
'net/enet.c',
|
|
'archive/miniz.c',
|
|
'source/cJSON.c'
|
|
]
|
|
|
|
foreach file: scripts
|
|
sources += files(file)
|
|
endforeach
|
|
|
|
srceng = 'source'
|
|
includes = [srceng, 'internal', 'debug', 'net', 'archive', 'src/qbe', 'src']
|
|
|
|
foreach file : src
|
|
full_path = join_paths(srceng, file)
|
|
sources += files(full_path)
|
|
endforeach
|
|
|
|
# QBE compiler sources (all except main.c)
|
|
# Built as a separate static library to avoid -x objective-c on macOS
|
|
# (QBE uses 'Class' as a struct name, which conflicts with ObjC)
|
|
qbe_src = [
|
|
'src/qbe/util.c',
|
|
'src/qbe/parse.c',
|
|
'src/qbe/abi.c',
|
|
'src/qbe/cfg.c',
|
|
'src/qbe/mem.c',
|
|
'src/qbe/ssa.c',
|
|
'src/qbe/alias.c',
|
|
'src/qbe/load.c',
|
|
'src/qbe/copy.c',
|
|
'src/qbe/fold.c',
|
|
'src/qbe/gvn.c',
|
|
'src/qbe/gcm.c',
|
|
'src/qbe/simpl.c',
|
|
'src/qbe/ifopt.c',
|
|
'src/qbe/live.c',
|
|
'src/qbe/spill.c',
|
|
'src/qbe/rega.c',
|
|
'src/qbe/emit.c',
|
|
'src/qbe/amd64/targ.c',
|
|
'src/qbe/amd64/sysv.c',
|
|
'src/qbe/amd64/isel.c',
|
|
'src/qbe/amd64/emit.c',
|
|
'src/qbe/amd64/winabi.c',
|
|
'src/qbe/arm64/targ.c',
|
|
'src/qbe/arm64/abi.c',
|
|
'src/qbe/arm64/isel.c',
|
|
'src/qbe/arm64/emit.c',
|
|
'src/qbe/rv64/targ.c',
|
|
'src/qbe/rv64/abi.c',
|
|
'src/qbe/rv64/isel.c',
|
|
'src/qbe/rv64/emit.c',
|
|
]
|
|
|
|
qbe_files = []
|
|
foreach file : qbe_src
|
|
qbe_files += files(file)
|
|
endforeach
|
|
|
|
includers = []
|
|
foreach inc : includes
|
|
includers += include_directories(inc)
|
|
endforeach
|
|
|
|
qbe_c_args = ['-x', 'c']
|
|
qbe_lib = static_library('qbe',
|
|
qbe_files,
|
|
include_directories: includers,
|
|
c_args: qbe_c_args,
|
|
)
|
|
|
|
if host_machine.system() == 'windows'
|
|
exe_ext = '.exe'
|
|
link += '-Wl,--export-all-symbols'
|
|
else
|
|
exe_ext = ''
|
|
link += '-Wl,-export_dynamic'
|
|
endif
|
|
|
|
cell_so = shared_library(
|
|
'cell_runtime',
|
|
sources,
|
|
include_directories: includers,
|
|
dependencies: deps,
|
|
link_whole: qbe_lib,
|
|
install : true,
|
|
)
|
|
|
|
# Determine RPATH based on OS
|
|
# MacOS uses @loader_path, Linux uses $ORIGIN
|
|
# We include both the current directory (for build) and ../lib (for install)
|
|
rpath_dirs = []
|
|
if host_machine.system() == 'darwin'
|
|
rpath_dirs += ['@loader_path', '@loader_path/../lib']
|
|
elif host_machine.system() == 'linux'
|
|
rpath_dirs += ['$ORIGIN', '$ORIGIN/../lib']
|
|
endif
|
|
|
|
# Create main executable linked against the cell library
|
|
cell_exe = executable('cell',
|
|
'source/main.c',
|
|
dependencies: deps,
|
|
include_directories: includers,
|
|
link_with: cell_so,
|
|
link_args: link,
|
|
build_rpath: ':'.join(rpath_dirs),
|
|
install: true
|
|
)
|
|
|
|
# Install headers for building dynamic libraries using Cell
|
|
install_headers('source/cell.h')
|
|
install_headers('source/quickjs.h')
|
|
install_headers('source/wota.h')
|