project('smolbote', ['cpp'], version: '0.1.0', default_options: ['cpp_std=c++2a', 'warning_level=3'], license: 'GPL3', meson_version: '>=0.55.0' ) summary({ 'prefix': get_option('prefix'), 'bindir': get_option('bindir'), 'libdir': get_option('libdir'), 'datadir': get_option('datadir') }, section: 'Install locations') kconfig = import('unstable-keyval') cdata = configuration_data(kconfig.load(host_machine.system() + '/.config')) version_h = vcs_tag( command: [find_program('git').full_path(), 'describe', '--long', '--abbrev=40'], #fallback: defaults to meson.project_version(), input: 'src/version.h.in', output: 'version.h' ) # add -DQT_NO_DEBUG to non-debug builds if not get_option('debug') add_project_arguments('-DQT_NO_DEBUG', language: 'cpp') endif sourceset = import('sourceset') cxx = meson.get_compiler('cpp') summary({ 'id': cxx.get_id(), 'version': cxx.version(), 'linker': cxx.get_linker_id(), }, section: 'Compiler') # add some specific flags add_project_arguments(cxx.get_supported_arguments([ '-ffunction-sections', # Place each function into its own section, better ASLR but larger executables '-fstack-protector-all', # Emit code to check for buffer overflows on all functions '-fstack-clash-protection', # Emit code to check for stack clash attacks # gcc specific '-fconcepts', # gcc9 c++20 compat # clang specific '-mspeculative-load-hardening', # Spectre v1 mitigation '-Xclang -plugin-arg-clazy -Xclang level0,level1', # clazy default warning level ## warnings # variables '-Wunused', # warn on anything being unused '-Wshadow', # if variable declaration shadows one from a parent context # functions '-Wnon-virtual-dtor', # if class with virtual functions has non-virtual dtor '-Werror=missing-declarations', # missing function declarations in header files '-Werror=redundant-decls', '-Woverloaded-virtual', # warn if you overload (not override) a virtual function '-Werror=return-type', # style '-Wformat=2', # security issues around printf '-Wdate-time', # __TIME__ and __DATE__ macros '-Werror=missing-field-initializers', # objects '-Wnull-dereference', '-Wconsumed', # use-after-move warnings '-Wlifetime', # object lifetime issues # logic '-Wlogical-op', # logical operations being used where bitwise were probably wanted '-Wimplicit-fallthrough', '-Wduplicated-cond', # if/else chain has duplicated conditions '-Wduplicated-branches', # if/else branches have duplicated code # casts '-Wold-style-cast', '-Wcast-align', # potential performance problem casts '-Wuseless-cast', # cast to same type '-Wconversion', # type conversions that may lose data '-Wsign-conversion', # sign conversions '-Wdouble-promotion', # float is promoted to double # others '-Werror=pedantic', # if non-standard c++ is used #'-Weffc++', ]), language: 'cpp') # Dependencies mod_qt5 = import('qt5') dep_qt5 = dependency('qt5', modules: [ 'Core', 'Network', 'Widgets', 'Svg', 'WebEngine', 'WebEngineWidgets', 'Concurrent' ], include_type: 'system' ) dep_spdlog = dependency('spdlog', fallback: ['spdlog', 'spdlog_dep'], version: '>=1.3.1') dep_gtest = dependency('gtest', required: false, disabler: true) dep_catch = dependency('catch2', required: true, fallback: ['catch2', 'catch2_dep'] ) dep_SingleApplication = dependency('singleapplication', fallback: [ 'singleapplication', 'SingleApplication_dep' ]) dep_args = dependency('args.hxx', fallback: [ 'args', 'args_dep' ]) # Generate config header poi_sourceset = sourceset.source_set() subdir('include') smolbote_interfaces = include_directories('include') subdir('lib/bookmarks') subdir('lib/configuration') subdir('lib/downloads') subdir('lib/pluginloader') subdir('lib/session_formats') subdir('lib/smolblok') subdir('src') subdir('lang') subdir('doc') subdir('tools') subdir('plugins/ProfileEditor') subdir('plugins/HostlistFilter') subdir('plugins/AdblockFilter') subdir('test/firefox-bookmarks-json-parser') ssconfig = poi_sourceset.apply(cdata) poi_exe = executable(get_option('poi'), cpp_args: ['-DQAPPLICATION_CLASS=QApplication'], sources: [ssconfig.sources()], include_directories: [ plugininterfaces_include, include_directories('src') ], dependencies: [ dep_qt5, dep_spdlog, dep_SingleApplication, dep_args, dep_bookmarks, dep_configuration, dep_downloads, dep_pluginloader, ssconfig.dependencies(), lib_session_formats ], install: true, ) test('poi-bookmarks: xbel', poi_exe, args: [ 'bookmarks', '-x', files('test/bookmarks.xbel'), '--export=stdout' ]) subdir(host_machine.system()) # cppcheck target cppcheck = find_program('cppcheck', required: false) if cppcheck.found() run_target('cppcheck', command: [cppcheck, '--enable=all', '--project=' + meson.build_root() / 'compile_commands.json'] ) endif