# handle capstone dependency capstone_dep = dependency('capstone', version: '>=3.0.4', required: false) if not capstone_dep.found() or not get_option('use_sys_capstone') if get_option('capstone_in_builddir') capstone_path = join_paths(meson.current_build_dir(), 'capstone') else capstone_path = 'capstone' endif capstone_version = get_option('use_capstone_version') message('Use bundled capstone: ' + capstone_version) res = run_command(py3_exe, '-c', '__import__("sys").exit(__import__("os").path.exists("@0@"))'.format(capstone_path)) if res.returncode() == 0 if not git_exe.found() error('Cannot load capstone library. Either provide capstone in ./shlr/capstone or install git, so it can be downloaded') endif patches_files = [] # NOTE: when you update CS_TIP or CS_BRA, also update them in shlr/Makefile if capstone_version == 'next' CS_TIP = 'a4df92eda647e739432860682be638da1b8b901a' CS_BRA = 'next' patches_files = [ 'fix-x86-16.patch', ] elif capstone_version == 'v5' CS_TIP = '2971910d6eedfa52174854d89b9de7fc1d755b90' CS_BRA = 'v5' patches_files = [ 'fix-x86-16.patch' ] elif capstone_version == 'v4' CS_TIP = '0efa3cc530ea188c0e03c945ab884ee19dd16342' CS_BRA = 'v4' patches_files = [ 'capstone-calloc.patch', 'fix-x86-16.patch', 'sparc-crash.patch', 'sstream-null.patch' ] elif capstone_version == 'v3' CS_TIP = '61bf71c771680033651f16cff832446e421847b1' CS_BRA = 'v3' patches_files = [ 'capstone-include.patch' ] else error('Wrong capstone version selected. Please use one of the supported versions.') endif capstone_git_user = 'capstone-engine' message('Cloning capstone ' + CS_BRA + ' branch, commit ' + CS_TIP + ', into ' + capstone_path) git_cmd = 'clone -b @0@ https://github.com/@1@/capstone.git @2@'.format(CS_BRA, capstone_git_user, capstone_path) clone_cmd = run_command(git_exe, git_cmd.split()) if clone_cmd.returncode() != 0 error('Cannot execute git clone command') endif reset_cmd_str = '-C @0@ reset --hard @1@'.format(capstone_path, CS_TIP) reset_cmd = run_command(git_exe, reset_cmd_str.split()) if reset_cmd.returncode() != 0 error('Cannot execute git reset command') endif message('Patching capstone with radare\'s patches') foreach file : patches_files patch_path = join_paths(meson.current_source_dir(), 'capstone-patches', capstone_version, file) patch_cmd_str = '-C @0@ apply -p1 @1@'.format(capstone_path, patch_path) patch_cmd = run_command(git_exe, patch_cmd_str.split()) if patch_cmd.returncode() != 0 warning('Cannot apply patch ' + file) endif endforeach endif rel_cs_files = [ 'arch/AArch64/AArch64BaseInfo.c', 'arch/AArch64/AArch64Disassembler.c', 'arch/AArch64/AArch64InstPrinter.c', 'arch/AArch64/AArch64Mapping.c', 'arch/AArch64/AArch64Module.c', 'arch/ARM/ARMDisassembler.c', 'arch/ARM/ARMInstPrinter.c', 'arch/ARM/ARMMapping.c', 'arch/ARM/ARMModule.c', 'arch/Mips/MipsDisassembler.c', 'arch/Mips/MipsInstPrinter.c', 'arch/Mips/MipsMapping.c', 'arch/Mips/MipsModule.c', 'arch/PowerPC/PPCDisassembler.c', 'arch/PowerPC/PPCInstPrinter.c', 'arch/PowerPC/PPCMapping.c', 'arch/PowerPC/PPCModule.c', 'arch/Sparc/SparcDisassembler.c', 'arch/Sparc/SparcInstPrinter.c', 'arch/Sparc/SparcMapping.c', 'arch/Sparc/SparcModule.c', 'arch/SystemZ/SystemZDisassembler.c', 'arch/SystemZ/SystemZInstPrinter.c', 'arch/SystemZ/SystemZMapping.c', 'arch/SystemZ/SystemZMCTargetDesc.c', 'arch/SystemZ/SystemZModule.c', 'arch/X86/X86ATTInstPrinter.c', 'arch/X86/X86Disassembler.c', 'arch/X86/X86DisassemblerDecoder.c', 'arch/X86/X86IntelInstPrinter.c', 'arch/X86/X86Mapping.c', 'arch/X86/X86Module.c', 'arch/XCore/XCoreDisassembler.c', 'arch/XCore/XCoreInstPrinter.c', 'arch/XCore/XCoreMapping.c', 'arch/XCore/XCoreModule.c', 'Mapping.c', 'cs.c', 'MCInst.c', 'MCInstrDesc.c', 'MCRegisterInfo.c', 'SStream.c', 'utils.c', ] rel_cs4_files = [ 'arch/M680X/M680XDisassembler.c', 'arch/M680X/M680XInstPrinter.c', 'arch/M680X/M680XModule.c', 'arch/M68K/M68KDisassembler.c', 'arch/M68K/M68KInstPrinter.c', 'arch/M68K/M68KModule.c', 'arch/TMS320C64x/TMS320C64xDisassembler.c', 'arch/TMS320C64x/TMS320C64xInstPrinter.c', 'arch/TMS320C64x/TMS320C64xMapping.c', 'arch/TMS320C64x/TMS320C64xModule.c', ] rel_cs5_files = [ 'arch/BPF/BPFDisassembler.c', 'arch/BPF/BPFInstPrinter.c', 'arch/BPF/BPFMapping.c', 'arch/BPF/BPFModule.c', 'arch/EVM/EVMDisassembler.c', 'arch/EVM/EVMInstPrinter.c', 'arch/EVM/EVMMapping.c', 'arch/EVM/EVMModule.c', 'arch/X86/X86InstPrinterCommon.c', 'arch/MOS65XX/MOS65XXDisassembler.c', 'arch/MOS65XX/MOS65XXModule.c', 'arch/RISCV/RISCVMapping.c', 'arch/RISCV/RISCVModule.c', 'arch/RISCV/RISCVInstPrinter.c', 'arch/RISCV/RISCVDisassembler.c' ] user_plugins = get_option('plugins').split(',') no_user_plugins = get_option('plugins') == '' cs_c_args = [ '-DCAPSTONE_USE_SYS_DYN_MEM', '-DCAPSTONE_DIET_NO', ] if user_plugins.contains('x86') or no_user_plugins cs_c_args += [ '-DCAPSTONE_HAS_X86', '-DCAPSTONE_X86_ATT_DISABLE_NO', '-DCAPSTONE_X86_REDUCE_NO', ] endif if user_plugins.contains('arm') or no_user_plugins cs_c_args += [ '-DCAPSTONE_HAS_ARM', '-DCAPSTONE_HAS_ARM64', ] endif if user_plugins.contains('sparc') or no_user_plugins cs_c_args += [ '-DCAPSTONE_HAS_SPARC', ] endif if user_plugins.contains('mips') or no_user_plugins cs_c_args += [ '-DCAPSTONE_HAS_MIPS', ] endif if no_user_plugins cs_c_args += [ '-DCAPSTONE_HAS_M68K', '-DCAPSTONE_HAS_M680X', '-DCAPSTONE_HAS_POWERPC', '-DCAPSTONE_HAS_SPARC', '-DCAPSTONE_HAS_SYSZ', '-DCAPSTONE_HAS_XCORE', '-DCAPSTONE_HAS_TMS320C64X', ] endif cs_files = [] foreach rel_cs_file : rel_cs_files cs_files += [join_paths(capstone_path, rel_cs_file)] endforeach if capstone_version == 'v4' or capstone_version == 'v5' foreach rel_cs_file : rel_cs4_files cs_files += [join_paths(capstone_path, rel_cs_file)] endforeach endif if capstone_version == 'v5' foreach rel_cs_file : rel_cs5_files cs_files += [join_paths(capstone_path, rel_cs_file)] endforeach cs_c_args += [ '-DCAPSTONE_HAS_BPF', '-DCAPSTONE_HAS_EVM', '-DCAPSTONE_HAS_MOS65XX', '-DCAPSTONE_HAS_RISCV', ] endif capstone_includes = [platform_inc, include_directories(join_paths('capstone','include'))] libr2capstone = static_library('r2capstone', cs_files, c_args: cs_c_args, include_directories: capstone_includes, implicit_include_directories: false ) capstone_dep = declare_dependency( link_with: libr2capstone, include_directories: capstone_includes ) else message('Use system-provided capstone library') endif # handle bochs dependency bochs_files = [ join_paths('bochs','src','libbochs.c') ] bochs_inc = [platform_inc, include_directories(join_paths('bochs','include'))] libr2bochs = static_library('r2bochs', bochs_files, dependencies: [r_util_dep], include_directories: bochs_inc, implicit_include_directories: false ) bochs_dep = declare_dependency( link_with: libr2bochs, include_directories: bochs_inc ) if get_option('blob') libr2bochs_static = static_library('r2bochs_static', bochs_files, dependencies: [r_util_static_dep], include_directories: bochs_inc, implicit_include_directories: false ) bochs_static_dep = declare_dependency( link_with: libr2bochs_static, include_directories: bochs_inc ) endif # handle java dependency java_files = [ 'java/class.c', 'java/code.c', 'java/ops.c', #'java/main.c', ] java_inc = [platform_inc, include_directories('java')] libr2java = static_library('r2java', java_files, dependencies: [r_util_dep], include_directories: java_inc, implicit_include_directories: false ) java_dep = declare_dependency( link_with: libr2java, include_directories: java_inc ) if get_option('blob') libr2java_static = static_library('r2java_static', java_files, dependencies: [r_util_static_dep], include_directories: java_inc, implicit_include_directories: false ) java_static_dep = declare_dependency( link_with: libr2java_static, include_directories: java_inc ) endif # handle qnx dependency qnx_files = [ 'qnx/src/core.c', 'qnx/src/libqnxr.c', 'qnx/src/packet.c', 'qnx/src/sigutil.c', 'qnx/src/utils.c', ] qnx_inc = [platform_inc, include_directories('qnx/include')] libr2qnx = static_library('r2qnx', qnx_files, dependencies: [r_socket_dep], include_directories: qnx_inc, implicit_include_directories: false ) qnx_dep = declare_dependency( link_with: libr2qnx, include_directories: qnx_inc ) if get_option('blob') libr2qnx_static = static_library('r2qnx_static', qnx_files, dependencies: [r_socket_static_dep], include_directories: qnx_inc, implicit_include_directories: false ) qnx_static_dep = declare_dependency( link_with: libr2qnx_static, include_directories: qnx_inc ) endif # handle grub dependency grub_files = [ #'grub/fs/affs.c', #'grub/fs/afs.c', #'grub/fs/afs_be.c', #'grub/fs/befs.c', #'grub/fs/befs_be.c', #'grub/fs/btrfs.c', 'grub/fs/cpio.c', 'grub/fs/ext2.c', 'grub/fs/fat.c', 'grub/fs/fb.c', 'grub/fs/fshelp.c', 'grub/fs/hfs.c', 'grub/fs/hfsplus.c', 'grub/fs/iso9660.c', 'grub/fs/jfs.c', 'grub/fs/minix.c', #'grub/fs/minix2.c', #'grub/fs/nilfs2.c', 'grub/fs/ntfs.c', 'grub/fs/ntfscomp.c', 'grub/fs/reiserfs.c', 'grub/fs/sfs.c', 'grub/fs/tar.c', 'grub/fs/udf.c', 'grub/fs/ufs.c', 'grub/fs/ufs2.c', 'grub/fs/xfs.c', 'grub/grubfs.c', 'grub/kern/device.c', 'grub/kern/disk.c', 'grub/kern/env.c', 'grub/kern/err.c', 'grub/kern/file.c', 'grub/kern/fs.c', 'grub/kern/list.c', 'grub/kern/misc.c', 'grub/kern/mm.c', 'grub/kern/partition.c', 'grub/kern/term.c', 'grub/kern/time.c', #'grub/main.c', #'grub/partmap/acorn.c', 'grub/partmap/amiga.c', 'grub/partmap/apple.c', 'grub/partmap/bsdlabel.c', 'grub/partmap/gpt.c', 'grub/partmap/msdos.c', 'grub/partmap/sun.c', 'grub/partmap/sunpc.c', ] grub_inc = [platform_inc, include_directories('grub', 'grub/include')] libr2grub = static_library('r2grub', grub_files, dependencies: [r_util_dep], include_directories: grub_inc, implicit_include_directories: false ) grub_dep = declare_dependency( link_with: libr2grub, include_directories: grub_inc ) if get_option('blob') libr2grub_static = static_library('r2grub_static', grub_files, dependencies: [r_util_static_dep], include_directories: grub_inc, implicit_include_directories: false ) grub_static_dep = declare_dependency( link_with: libr2grub_static, include_directories: grub_inc ) endif # handle winkd dependency winkd_files = [ 'winkd/iob_pipe.c', 'winkd/iob_net.c', 'winkd/kd.c', 'winkd/transport.c', 'winkd/winkd.c', ] winkd_inc = [platform_inc, include_directories('winkd')] libr2winkd = static_library('r2winkd', winkd_files, dependencies: [r_crypto_dep, r_socket_dep, r_util_dep], include_directories: winkd_inc, implicit_include_directories: false ) winkd_dep = declare_dependency( link_with: libr2winkd, include_directories: winkd_inc ) if get_option('blob') libr2winkd_static = static_library('r2winkd_static', winkd_files, dependencies: [r_crypto_static_dep, r_socket_static_dep, r_util_static_dep], include_directories: winkd_inc, implicit_include_directories: false ) winkd_static_dep = declare_dependency( link_with: libr2winkd_static, include_directories: winkd_inc ) endif # handle ar dependency ar_files = [ 'ar/ar.c' ] ar_inc = [platform_inc, include_directories(['ar'])] libr2ar = static_library('r2ar', ar_files, dependencies: [r_util_dep], include_directories: ar_inc, implicit_include_directories: false ) ar_dep = declare_dependency( link_with: libr2ar, include_directories: ar_inc ) if get_option('blob') libr2ar_static = static_library('r2ar_static', ar_files, dependencies: [r_util_static_dep], include_directories: ar_inc, implicit_include_directories: false ) ar_static_dep = declare_dependency( link_with: libr2ar_static, include_directories: ar_inc ) endif # handle mpc dependency mpc_files = [ 'mpc/mpc.c' ] mpc_inc = [platform_inc, include_directories(['mpc'])] libmpc = static_library('r2mpc', mpc_files, include_directories: mpc_inc, implicit_include_directories: false ) mpc_dep = declare_dependency( link_with: libmpc, include_directories: mpc_inc )