build: Improved meson-build to use rizin as subproject (#4684)

* Setting GNU99/C99 standard for subprojects
* Remove use of `add_global_arguments`
* Added extern "C" linkage specification to some public headers of rizin
* Changed the meson_git_wrapper.py-script to explicitly specify the output-path
* Made the RIZIN_BUILD_PATH conditional in the integration-test meson-build

Co-authored-by: amibranch <amibranch@users.noreply.github.com>
This commit is contained in:
amibranch 2024-10-29 16:59:42 +01:00 committed by GitHub
parent 86d8953912
commit 8e6b764fb5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
25 changed files with 228 additions and 46 deletions

View file

@ -14,6 +14,10 @@
#include <inttypes.h> #include <inttypes.h>
#endif #endif
#ifdef __cplusplus
extern "C" {
#endif
// TODO: fix this to make it crosscompile-friendly: RZ_SYS_OSTYPE ? // TODO: fix this to make it crosscompile-friendly: RZ_SYS_OSTYPE ?
/* operating system */ /* operating system */
#undef __BSD__ #undef __BSD__
@ -729,4 +733,8 @@ static inline void *rz_asm_plugin_data_from_rz_analysis(RZ_NONNULL void /*<RzAna
return rasm->plugin_data; return rasm->plugin_data;
} }
#ifdef __cplusplus
}
#endif
#endif // RZ_TYPES_H #endif // RZ_TYPES_H

View file

@ -7,6 +7,10 @@
#include "rz_rbtree.h" #include "rz_rbtree.h"
#include "../rz_types.h" #include "../rz_types.h"
#ifdef __cplusplus
extern "C" {
#endif
/* /*
* RzIntervalTree is a special RBTree (augmented red-black tree) * RzIntervalTree is a special RBTree (augmented red-black tree)
* that holds its entries, each associated with a interval, * that holds its entries, each associated with a interval,
@ -100,4 +104,8 @@ static inline bool rz_interval_tree_empty(RzIntervalTree *tree) {
if ((tree)->root) \ if ((tree)->root) \
for ((it) = rz_rbtree_last(&(tree)->root->node); rz_rbtree_iter_has(&it) && (dat = rz_rbtree_iter_get(&it, RzIntervalNode, node)->data); rz_rbtree_iter_prev(&(it))) for ((it) = rz_rbtree_last(&(tree)->root->node); rz_rbtree_iter_has(&it) && (dat = rz_rbtree_iter_get(&it, RzIntervalNode, node)->data); rz_rbtree_iter_prev(&(it)))
#ifdef __cplusplus
}
#endif
#endif // RZ_INTERVALTREE_H #endif // RZ_INTERVALTREE_H

View file

@ -1,6 +1,6 @@
project('rizin', 'c', project('rizin', 'c',
version: 'v0.8.0', version: 'v0.8.0',
license: 'LGPL3', license: 'LGPL-3.0-only',
meson_version: '>=0.57.0', meson_version: '>=0.57.0',
default_options: [ default_options: [
'buildtype=debugoptimized', 'buildtype=debugoptimized',
@ -91,14 +91,14 @@ if cc.has_argument('-Wenum-compare')
endif endif
if cc.has_argument('--std=gnu99') if cc.has_argument('--std=gnu99')
add_global_arguments('--std=gnu99', language: ['c', 'cpp']) add_project_arguments('--std=gnu99', language: ['c', 'cpp'])
elif cc.has_argument('--std=c99') elif cc.has_argument('--std=c99')
add_global_arguments('--std=c99', language: ['c', 'cpp']) add_project_arguments('--std=c99', language: ['c', 'cpp'])
endif endif
# Sanitize correct usage of rz_strf() # Sanitize correct usage of rz_strf()
if cc.has_argument('-Werror=sizeof-pointer-memaccess') if cc.has_argument('-Werror=sizeof-pointer-memaccess')
add_global_arguments('-Werror=sizeof-pointer-memaccess', language: ['c', 'cpp']) add_project_arguments('-Werror=sizeof-pointer-memaccess', language: ['c', 'cpp'])
endif endif
if cc.has_argument('-Wimplicit-fallthrough=3') if cc.has_argument('-Wimplicit-fallthrough=3')
@ -117,17 +117,17 @@ endif
if get_option('default_library') == 'shared' if get_option('default_library') == 'shared'
if cc.has_argument('-fvisibility=hidden') if cc.has_argument('-fvisibility=hidden')
add_global_arguments('-fvisibility=hidden', language: 'c') add_project_arguments('-fvisibility=hidden', language: 'c')
endif endif
endif endif
add_project_arguments(['-DRZ_PLUGIN_INCORE=1'], language: 'c') add_project_arguments(['-DRZ_PLUGIN_INCORE=1'], language: 'c')
b_sanitize_opt = get_option('b_sanitize') b_sanitize_opt = get_option('b_sanitize')
if (b_sanitize_opt.contains('address') or b_sanitize_opt.contains('undefined')) and cc.get_id() == 'clang' if (b_sanitize_opt.contains('address') or b_sanitize_opt.contains('undefined')) and cc.get_id() == 'clang'
add_global_arguments('-shared-libasan', language: 'c') add_project_arguments('-shared-libasan', language: 'c')
add_global_link_arguments('-shared-libasan', language: 'c') add_project_link_arguments('-shared-libasan', language: 'c')
add_global_arguments('-shared-libasan', language: 'c', native: true) add_project_arguments('-shared-libasan', language: 'c', native: true)
add_global_link_arguments('-shared-libasan', language: 'c', native: true) add_project_link_arguments('-shared-libasan', language: 'c', native: true)
endif endif
fs = import('fs') fs = import('fs')
@ -366,7 +366,7 @@ foreach it : ccs
have_pthread = it_th.found() and it_machine.system() != 'windows' have_pthread = it_th.found() and it_machine.system() != 'windows'
if it_machine.system() == 'sunos' if it_machine.system() == 'sunos'
# workaround for Solaris until https://github.com/mesonbuild/meson/issues/4328 is fixed # workaround for Solaris until https://github.com/mesonbuild/meson/issues/4328 is fixed
it_mth = declare_dependency(link_args: '-lm', native: it_native) it_mth = declare_dependency(link_args: '-lm')
else else
it_mth = it_cc.find_library('m', required: false, static: is_static_build) it_mth = it_cc.find_library('m', required: false, static: is_static_build)
endif endif
@ -569,7 +569,7 @@ if git_exe.found() and fs.exists('.git')
build_always_stale: true, build_always_stale: true,
build_by_default: true, build_by_default: true,
output: 'gittip', output: 'gittip',
command: [py3_exe, git_exe_repo_py, git_exe, repo, 'rev-parse', 'HEAD'], command: [py3_exe, git_exe_repo_py, git_exe, repo, '@OUTPUT@', 'rev-parse', 'HEAD'],
install: true, install: true,
install_dir: rizin_datdir_rz install_dir: rizin_datdir_rz
) )

View file

@ -1,5 +1,5 @@
project('nettle', 'c', project('nettle', 'c',
license: [ 'LGPL'], license: 'LGPL',
version: '3.7.3' version: '3.7.3'
) )
# https://git.lysator.liu.se/nettle/nettle # https://git.lysator.liu.se/nettle/nettle

View file

@ -1,4 +1,11 @@
project('blake3', 'c', version: '1.3.1', license : ['CC0-1.0'], meson_version: '>=0.55.0') project('blake3', 'c',
version: '1.3.1',
license: 'CC0-1.0',
meson_version: '>=0.55.0',
default_options: [
'c_std=c99',
]
)
cc = meson.get_compiler('c') cc = meson.get_compiler('c')

View file

@ -1,4 +1,15 @@
project('capstone', 'c', version: '4.0.2', meson_version: '>=0.55.0') project('capstone', 'c',
version: '4.0.2',
meson_version: '>=0.55.0',
)
cc = meson.get_compiler('c')
if cc.has_argument('--std=gnu99')
add_project_arguments('--std=gnu99', language: ['c'])
elif cc.has_argument('--std=c99')
add_project_arguments('--std=c99', language: ['c'])
endif
cs_files = [ cs_files = [
'arch/AArch64/AArch64BaseInfo.c', 'arch/AArch64/AArch64BaseInfo.c',

View file

@ -1,4 +1,15 @@
project('capstone', 'c', version: '5.0.1', meson_version: '>=0.55.0') project('capstone', 'c',
version: '5.0.1',
meson_version: '>=0.55.0',
)
cc = meson.get_compiler('c')
if cc.has_argument('--std=gnu99')
add_project_arguments('--std=gnu99', language: ['c'])
elif cc.has_argument('--std=c99')
add_project_arguments('--std=c99', language: ['c'])
endif
cs_files = [ cs_files = [
'arch/AArch64/AArch64BaseInfo.c', 'arch/AArch64/AArch64BaseInfo.c',

View file

@ -1,4 +1,15 @@
project('capstone', 'c', version: 'next', meson_version: '>=0.55.0') project('capstone', 'c',
version: 'next',
meson_version: '>=0.55.0',
)
cc = meson.get_compiler('c')
if cc.has_argument('--std=gnu99')
add_project_arguments('--std=gnu99', language: ['c'])
elif cc.has_argument('--std=c99')
add_project_arguments('--std=c99', language: ['c'])
endif
cs_files = [ cs_files = [
'arch/Alpha/AlphaDisassembler.c', 'arch/Alpha/AlphaDisassembler.c',

View file

@ -1,4 +1,15 @@
project('capstone', 'c', version: 'next', meson_version: '>=0.55.0') project('capstone', 'c',
version: 'next',
meson_version: '>=0.55.0',
)
cc = meson.get_compiler('c')
if cc.has_argument('--std=gnu99')
add_project_arguments('--std=gnu99', language: ['c'])
elif cc.has_argument('--std=c99')
add_project_arguments('--std=c99', language: ['c'])
endif
cs_files = [ cs_files = [
'arch/Alpha/AlphaDisassembler.c', 'arch/Alpha/AlphaDisassembler.c',

View file

@ -1,7 +1,15 @@
project('libmspack', 'c', version: '0.10.1alpha', license : ['LGPL2'], meson_version: '>=0.55.0') project('libmspack', 'c',
version: '0.10.1alpha',
license : 'LGPL2',
meson_version: '>=0.55.0',
)
cc = meson.get_compiler('c') cc = meson.get_compiler('c')
if cc.has_argument('--std=c99')
add_project_arguments('--std=c99', language: ['c'])
endif
# handle libmspack dependency # handle libmspack dependency
libmspack_files = [ libmspack_files = [
'libmspack' / 'mspack' / 'cabc.c', 'libmspack' / 'mspack' / 'cabc.c',

View file

@ -1,10 +1,19 @@
project('libzip', 'c', project('libzip', 'c',
version: '1.9.2') version: '1.9.2',
license: 'BSD-3-clause',
meson_version: '>=0.55.0',
)
py3_exe = import('python').find_installation() py3_exe = import('python').find_installation()
cc = meson.get_compiler('c') cc = meson.get_compiler('c')
is_static_build = get_option('static_runtime') is_static_build = get_option('static_runtime')
if cc.has_argument('--std=gnu99')
add_project_arguments('--std=gnu99', language: ['c'])
elif cc.has_argument('--std=c99')
add_project_arguments('--std=c99', language: ['c'])
endif
# Create config.h file # Create config.h file
conf_data = configuration_data() conf_data = configuration_data()
zlib_dep = dependency('zlib', required: get_option('use_sys_zlib'), static: is_static_build) zlib_dep = dependency('zlib', required: get_option('use_sys_zlib'), static: is_static_build)

View file

@ -1,7 +1,14 @@
project('lz4', ['c'], project('lz4', ['c'],
license: ['BSD', 'GPLv2'], license: 'BSD-2-Clause-Patent AND GPL-2.0-or-later',
version: '1.9.4', version: '1.9.4',
meson_version: '>=0.47.0') meson_version: '>=0.55.0',
)
cc = meson.get_compiler('c')
if cc.has_argument('--std=c99')
add_project_arguments('--std=c99', language: ['c'])
endif
lz4_files = [ lz4_files = [
'lib/lz4.c', 'lib/lz4.c',

View file

@ -2,6 +2,10 @@ project('pcre2', 'c', version: '10.44')
cc = meson.get_compiler('c') cc = meson.get_compiler('c')
if cc.has_argument('--std=c99')
add_project_arguments('--std=c99', language: ['c'])
endif
conf_data = configuration_data() conf_data = configuration_data()
pcre2_chartables = configure_file(input : 'src/pcre2_chartables.c.dist', pcre2_chartables = configure_file(input : 'src/pcre2_chartables.c.dist',

View file

@ -1,4 +1,16 @@
project('rizin-grammar-c', 'c', default_options: ['werror=false']) project('rizin-grammar-c', 'c',
license: 'MIT',
meson_version: '>=0.55.0',
default_options: [
'werror=false'
]
)
cc = meson.get_compiler('c')
if cc.has_argument('--std=c99')
add_project_arguments('--std=c99', language: ['c'])
endif
ts_c_files = [ ts_c_files = [
'src/parser.c' 'src/parser.c'

View file

@ -1,7 +1,16 @@
project('tree-sitter', 'c') project('tree-sitter', 'c',
license: 'MIT',
meson_version: '>=0.55.0',
)
cc = meson.get_compiler('c') cc = meson.get_compiler('c')
if cc.has_argument('--std=gnu99')
add_project_arguments('--std=gnu99', language: ['c'])
elif cc.has_argument('--std=c99')
add_project_arguments('--std=c99', language: ['c'])
endif
tree_sitter_path = 'tree-sitter' tree_sitter_path = 'tree-sitter'
tree_sitter_files = ['lib/src/lib.c'] tree_sitter_files = ['lib/src/lib.c']

View file

@ -1,10 +1,18 @@
# liblzma is what upstream uses for their pkg-config name # liblzma is what upstream uses for their pkg-config name
project('liblzma', 'c', project('liblzma', 'c',
version : '5.2.9', version : '5.4.3',
license : 'pd/lgpl2/gpl2/gpl3',) license : ['PD', 'LGPL2', 'GPL2', 'GPL3'],
meson_version: '>=0.55.0',
)
cc = meson.get_compiler('c') cc = meson.get_compiler('c')
if cc.has_argument('--std=gnu99')
add_project_arguments('--std=gnu99', language: ['c'])
elif cc.has_argument('--std=c99')
add_project_arguments('--std=c99', language: ['c'])
endif
lzma_cflags = ['-DHAVE_CONFIG_H', '-DTUKLIB_SYMBOL_PREFIX=lzma_', '-DLZMA_API_STATIC'] lzma_cflags = ['-DHAVE_CONFIG_H', '-DTUKLIB_SYMBOL_PREFIX=lzma_', '-DLZMA_API_STATIC']
cdata = configuration_data() cdata = configuration_data()

View file

@ -1,7 +1,15 @@
project('zlib', 'c', version : '1.3.1', license : 'zlib') project('zlib', 'c',
version : '1.3.1',
license : 'zlib',
meson_version: '>=0.55.0',
)
cc = meson.get_compiler('c') cc = meson.get_compiler('c')
if cc.has_argument('--std=c99')
add_project_arguments('--std=c99', language: ['c'])
endif
link_args = [] link_args = []
compile_args = [] compile_args = []
if cc.get_argument_syntax() == 'msvc' if cc.get_argument_syntax() == 'msvc'

View file

@ -1,7 +1,14 @@
project('rizin-shell-parser', 'c', project('rizin-shell-parser', 'c',
license : [ 'LGPL'] license: 'LGPL-3.0-only',
meson_version: '>=0.55.0',
) )
cc = meson.get_compiler('c')
if cc.has_argument('--std=c99')
add_project_arguments('--std=c99', language: ['c'])
endif
tree_sitter_dep = dependency('tree-sitter') tree_sitter_dep = dependency('tree-sitter')
grammar_js = files('grammar.js') grammar_js = files('grammar.js')
tree_sitter_wrap_py = files('meson_tree_sitter_generate.py') tree_sitter_wrap_py = files('meson_tree_sitter_generate.py')

View file

@ -1,5 +1,6 @@
project('rzar', 'c', project('rzar', 'c',
license : [ 'LGPL'] license: 'LGPL-3.0-only',
meson_version: '>=0.55.0',
) )
# handle ar dependency # handle ar dependency
@ -7,6 +8,14 @@ ar_files = [
'ar.c' 'ar.c'
] ]
cc = meson.get_compiler('c')
if cc.has_argument('--std=gnu99')
add_project_arguments('--std=gnu99', language: ['c'])
elif cc.has_argument('--std=c99')
add_project_arguments('--std=c99', language: ['c'])
endif
rz_util_dep = dependency('rz_util') rz_util_dep = dependency('rz_util')
ar_inc = [include_directories(['.'])] ar_inc = [include_directories(['.'])]

View file

@ -1,5 +1,12 @@
project('rzw32dbg_wrap', 'c') project('rzw32dbg_wrap', 'c')
cc = meson.get_compiler('c')
if cc.has_argument('--std=gnu99')
add_project_arguments('--std=gnu99', language: ['c'])
elif cc.has_argument('--std=c99')
add_project_arguments('--std=c99', language: ['c'])
endif
gdb_files = [ gdb_files = [
'src/arch.c', 'src/arch.c',

View file

@ -1,7 +1,16 @@
project('rzqnx', 'c', project('rzqnx', 'c',
license : [ 'GPL'] license: 'GPL-2.0-only',
meson_version: '>=0.55.0',
) )
cc = meson.get_compiler('c')
if cc.has_argument('--std=gnu99')
add_project_arguments('--std=gnu99', language: ['c'])
elif cc.has_argument('--std=c99')
add_project_arguments('--std=c99', language: ['c'])
endif
qnx_files = [ qnx_files = [
'src/core.c', 'src/core.c',
'src/packet.c', 'src/packet.c',

View file

@ -1,5 +1,6 @@
project('rzwinkd', 'c', project('rzwinkd', 'c',
license : [ 'LGPL'] license: 'LGPL-3.0-only',
meson_version: '>=0.55.0',
) )
cc = meson.get_compiler('c') cc = meson.get_compiler('c')
@ -12,6 +13,12 @@ winkd_files = [
'winkd.c', 'winkd.c',
] ]
if cc.has_argument('--std=gnu99')
add_project_arguments('--std=gnu99', language: ['c'])
elif cc.has_argument('--std=c99')
add_project_arguments('--std=c99', language: ['c'])
endif
winkd_inc = [include_directories('.')] winkd_inc = [include_directories('.')]
rz_util_dep = dependency('rz_util') rz_util_dep = dependency('rz_util')

View file

@ -1,7 +1,15 @@
project('xxhash', 'c', project('xxhash', 'c',
# library files are BSD licensed. xxhsum utility is GPL licensed. # library files are BSD licensed. xxhsum utility is GPL licensed.
license : [ 'BSD', 'GPL'], version : '0.6.5',
version : '0.6.5') license: 'BSD-2-Clause AND GPL-2.0-or-later',
meson_version: '>=0.55.0',
)
cc = meson.get_compiler('c')
if cc.has_argument('--std=c99')
add_project_arguments('--std=c99', language: ['c'])
endif
inc = include_directories('.') inc = include_directories('.')
@ -13,4 +21,4 @@ libxxhash = library('xxhash',
xxhash_dep = declare_dependency( xxhash_dep = declare_dependency(
include_directories : inc, include_directories : inc,
link_with : libxxhash) link_with : libxxhash)

View file

@ -23,12 +23,10 @@ def isCArgSupported(executable, path):
return False return False
def simple_git_execution(args, gittip_dir=None): def simple_git_execution(args, output_path=None):
try: try:
called = subprocess.run(args, check=True, stdout=subprocess.PIPE) called = subprocess.run(args, check=True, stdout=subprocess.PIPE)
if gittip_dir is not None: with open(output_path, "w", encoding="utf8") as f:
os.chdir(gittip_dir)
with open("gittip", "w", encoding="utf8") as f:
f.write(called.stdout.decode("utf8").strip()) f.write(called.stdout.decode("utf8").strip())
sys.exit(called.returncode) sys.exit(called.returncode)
except subprocess.CalledProcessError as e: except subprocess.CalledProcessError as e:
@ -38,7 +36,7 @@ def simple_git_execution(args, gittip_dir=None):
def parse(): def parse():
if len(sys.argv) <= 3: if len(sys.argv) <= 3:
print( print(
"Usage: {} <git_executable_path> <repo_path> [git_args...]".format( "Usage: {} <git_executable_path> <repo_path> <output_path> [git_args...]".format(
sys.argv[0] sys.argv[0]
) )
) )
@ -46,20 +44,21 @@ def parse():
git_exe = sys.argv[1] git_exe = sys.argv[1]
repo_path = sys.argv[2] repo_path = sys.argv[2]
args = sys.argv[3:] output_path = sys.argv[3]
args = sys.argv[4:]
return git_exe, repo_path, args return git_exe, repo_path, output_path, args
def main(): def main():
git_exe, repo_path, args = parse() git_exe, repo_path, output_path, args = parse()
if isCArgSupported(git_exe, repo_path): if isCArgSupported(git_exe, repo_path):
simple_git_execution([git_exe, "-C", repo_path] + args) simple_git_execution([git_exe, "-C", repo_path] + args, output_path=output_path)
else: else:
gittip_dir = os.getcwd() out_abs_path = os.path.abspath(output_path)
os.chdir(repo_path) os.chdir(repo_path)
simple_git_execution([git_exe] + args, gittip_dir) simple_git_execution([git_exe] + args, out_abs_path)
if __name__ == "__main__": if __name__ == "__main__":

View file

@ -1,6 +1,10 @@
if get_option('enable_tests') if get_option('enable_tests')
test_conf_data = configuration_data() test_conf_data = configuration_data()
test_conf_data.set_quoted('RIZIN_BUILD_PATH', rizin_exe.full_path()) if cli_enabled
test_conf_data.set_quoted('RIZIN_BUILD_PATH', rizin_exe.full_path())
else
test_conf_data.set_quoted('RIZIN_BUILD_PATH', meson.current_build_dir())
endif
test_conf_data.set_quoted('TEST_BUILD_TYPES_DIR', fs.as_posix(types_build_dir)) test_conf_data.set_quoted('TEST_BUILD_TYPES_DIR', fs.as_posix(types_build_dir))
test_config_h = configure_file( test_config_h = configure_file(
input: 'test_config.h.in', input: 'test_config.h.in',