draconisplusplus/meson.build
2025-04-24 00:10:10 -04:00

196 lines
4.8 KiB
Meson

# ----------------------- #
# Project Configuration #
# ----------------------- #
project(
'draconis++',
'cpp',
version : '0.1.0',
default_options : [
'default_library=static',
'buildtype=debugoptimized',
'b_vscrt=mt',
'warning_level=3',
],
)
cpp = meson.get_compiler('cpp')
host_system = host_machine.system()
# ------------------------ #
# Compiler Configuration #
# ------------------------ #
common_warning_flags = [
'-Wno-c++20-compat',
'-Wno-c++20-extensions',
'-Wno-c++98-compat',
'-Wno-c++98-compat-pedantic',
'-Wno-disabled-macro-expansion',
'-Wno-missing-prototypes',
'-Wno-padded',
'-Wno-pre-c++20-compat-pedantic',
'-Wunused-function',
]
common_cpp_flags = {
'common' : [
'-fno-strict-enums',
'-fvisibility=hidden',
'-fvisibility-inlines-hidden',
'-std=c++26',
],
'msvc' : [
'-DNOMINMAX',
'/MT',
'/Zc:__cplusplus',
'/Zc:preprocessor',
'/external:W0',
'/external:anglebrackets',
'/std:c++latest',
'/w44668',
'/w44710',
'/w44820',
],
'unix_extra' : [
'-march=native',
'-nostdlib++',
],
'windows_extra' : '-DCURL_STATICLIB',
}
# Configure Objective-C++ for macOS
if host_system == 'darwin'
add_languages('objcpp', native : false)
objcpp = meson.get_compiler('objcpp')
objcpp_flags = common_warning_flags + [
'-Wno-switch-default',
'-std=c++23',
'-fvisibility=hidden',
'-fvisibility-inlines-hidden',
]
add_project_arguments(objcpp.get_supported_arguments(objcpp_flags), language : 'objcpp')
endif
# Apply C++ compiler arguments
if cpp.get_id() in ['msvc', 'clang-cl']
common_cpp_args = common_cpp_flags['msvc']
if cpp.get_id() == 'clang-cl'
common_cpp_args += common_warning_flags + common_cpp_flags['common']
endif
else
common_cpp_args = common_warning_flags + common_cpp_flags['common'] + common_cpp_flags['unix_extra']
if host_system == 'windows'
common_cpp_args += common_cpp_flags['windows_extra']
endif
common_cpp_args = cpp.get_supported_arguments(common_cpp_args)
endif
add_project_arguments(common_cpp_args, language : 'cpp')
# ------- #
# Files #
# ------- #
base_sources = files('src/core/system_data.cpp', 'src/config/config.cpp', 'src/config/weather.cpp', 'src/main.cpp')
platform_sources = {
'linux' : ['src/os/linux.cpp', 'src/os/linux/issetugid_stub.cpp', 'src/os/linux/display_guards.cpp'],
'darwin' : ['src/os/macos.cpp', 'src/os/macos/bridge.mm'],
'windows' : ['src/os/windows.cpp'],
}
sources = base_sources + files(platform_sources.get(host_system, []))
# --------------------- #
# Dependencies Config #
# --------------------- #
common_deps = [
dependency('libcurl', include_type : 'system', static : true),
dependency('tomlplusplus', include_type : 'system', static : true),
dependency('openssl', include_type : 'system', static : true, required : false),
]
# Platform-specific dependencies
platform_deps = []
if host_system == 'darwin'
platform_deps += [
dependency(
'appleframeworks',
modules : ['foundation', 'mediaplayer', 'systemconfiguration'],
static : true,
),
dependency('iconv'),
]
elif host_system == 'windows'
platform_deps += [
cpp.find_library('dwmapi'),
cpp.find_library('windowsapp'),
]
elif host_system == 'linux'
platform_deps += [
dependency('SQLiteCpp'),
dependency('x11'),
dependency('xcb'),
dependency('xau'),
dependency('xdmcp'),
dependency('wayland-client'),
dependency('sigc++-3.0', include_type : 'system'),
dependency('dbus-cxx', include_type : 'system'),
]
endif
# FTXUI configuration
ftxui_components = ['ftxui::screen', 'ftxui::dom', 'ftxui::component']
ftxui_dep = dependency(
'ftxui',
modules : ftxui_components,
include_type : 'system',
static : true,
required : false,
)
if not ftxui_dep.found()
ftxui_dep = declare_dependency(
dependencies : [
dependency('ftxui-dom', fallback : ['ftxui', 'dom_dep']),
dependency('ftxui-screen', fallback : ['ftxui', 'screen_dep']),
dependency('ftxui-component', fallback : ['ftxui', 'component_dep']),
],
)
endif
glaze_dep = dependency('glaze', include_type : 'system', required : false)
if not glaze_dep.found()
cmake = import('cmake')
glaze_proj = cmake.subproject('glaze')
glaze_dep = glaze_proj.dependency('glaze_glaze', include_type : 'system')
endif
# Combine all dependencies
deps = common_deps + platform_deps + ftxui_dep + glaze_dep
# ------------------------- #
# Link/ObjC Configuration #
# ------------------------- #
link_args = []
objc_args = []
if host_system == 'darwin'
objc_args += ['-fobjc-arc']
elif cpp.get_id() == 'clang'
link_args += ['-static-libgcc', '-static-libstdc++']
endif
# ------------------- #
# Executable Target #
# ------------------- #
executable(
'draconis++',
sources,
objc_args : objc_args,
link_args : link_args,
dependencies : deps,
install : true,
)