Compare commits

12 changed files with 128 additions and 190 deletions

No files matched your search

+24 -22
View File
@@ -1,13 +1,13 @@
name: run-rz-bindgen
on:
push:
paths:
- 'src/**.py'
- 'src/**.pyi'
- 'src/**.i'
- 'meson.build'
- 'meson_options.txt'
workflow_dispatch:
workflow_call:
inputs:
rizin_ref:
required: false
type: string
default: 'dev'
jobs:
run-bindgen:
@@ -17,30 +17,32 @@ jobs:
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-2019, macos-latest]
os: [ubuntu-20.04, windows-2019, macos-latest]
steps:
- name: Checkout rz-bindgen
uses: actions/checkout@v3
- name: Checkout rizin
uses: actions/checkout@v3
with:
repository: rizinorg/rizin
path: rizin
ref: ${{ inputs.rizin_ref }}
- name: Run rz-bindgen
uses: pypa/[email protected]
- name: Upload sdist
- name: Upload artifacts
uses: actions/upload-artifact@v3
with:
name: sdist
path: dist/*.tar.gz
- name: Upload wheels
uses: actions/upload-artifact@v3
with:
name: wheels
path: wheelhouse/*.whl
publish-pypi:
name: Publish PyPi
runs-on: ubuntu-latest
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags')
needs: [run-bindgen]
steps:
- name: Download artifacts
uses: actions/download-artifact@v3
with:
name: artifact
path: dist
- name: Publish wheels
uses: pypa/[email protected]
with:
password: ${{ secrets.PYPI_TOKEN }}
-41
View File
@@ -1,41 +0,0 @@
name: release-rz-bindgen
on:
push:
tags:
- rizin-v*_*
workflow_dispatch:
jobs:
extract-rizin-version:
runs-on: ubuntu-latest
outputs:
rizin_version: ${{ steps.extract_version.outputs.result }}
steps:
- id: extract_version
run: echo "result=$(echo ${{ github.ref }} | cut -d'_' -f1 | cut -d'-' -f2-)" >> "$GITHUB_OUTPUT"
run-bindgen:
uses: ./.github/workflows/ci.yml
needs: [extract-rizin-version]
with:
rizin_ref: ${{ needs.extract-rizin-version.outputs.rizin_version }}
publish-pypi:
name: Publish PyPi
runs-on: ubuntu-latest
needs: [run-bindgen]
steps:
- name: Download artifacts
uses: actions/download-artifact@v3
with:
name: wheels
path: dist
- name: Download sdist
uses: actions/download-artifact@v3
with:
name: sdist
path: dist
- name: Publish wheels
uses: pypa/[email protected]
with:
password: ${{ secrets.PYPI_TOKEN }}
+3 -18
View File
@@ -4,25 +4,16 @@
set -ex
# Install deps
pip3 install meson ninja meson-python build
pip3 install meson ninja meson-python
if command -v apt; then
set +e
grep VERSION_CODENAME=stretch /etc/os-release >/dev/null 2>/dev/null
if [[ $? == 0 ]] ; then
# Required because manylinux_2_24 uses Debian Stretch and the repos are not available anymore
echo "deb http://archive.debian.org/debian stretch main" > /etc/apt/sources.list
echo "deb http://archive.debian.org/debian-security stretch/updates main" >> /etc/apt/sources.list
echo "Acquire::Check-Valid-Until no;" > /etc/apt/apt.conf.d/99no-check-valid-until
fi
set -e
apt update && apt install --assume-yes libclang-7-dev clang-7 llvm-7
elif command -v apk; then
apk update && apk add clang-dev
elif command -v brew; then
brew install pkg-config
fi
# Install rizin
git clone --depth 1 https://github.com/wingdeans/rizin.git -b header-types
pushd rizin
if [[ "$OSTYPE" =~ msys* ]]; then
@@ -33,9 +24,3 @@ fi
meson install -C build
popd
if command -v apt; then
if [ ! -e dist/*.tar.gz ] ; then
python3 -m build --sdist
fi
fi
+37 -51
View File
@@ -1,8 +1,7 @@
project('rz-bindgen', 'c', 'cpp',
version: '0.6.0',
version: 'v0.5.0dev',
license: 'LGPL3',
meson_version: '>=0.53.0',
default_options: ['python.install_env=auto'])
meson_version: '>=0.53.0')
pymod = import('python')
fs = import('fs')
@@ -21,7 +20,7 @@ doxygen_path = get_option('doxygen_path')
if clang_path == ''
llvm = dependency('llvm', required: false)
if llvm.found()
clang_path = llvm.get_variable(cmake: 'LLVM_LIBRARY_DIRS', configtool: 'libdir', default_value: 'none')
clang_path = llvm.get_variable(configtool: 'libdir', default_value: 'none')
elif build_machine.system() == 'darwin'
clang_path = '/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/'
elif build_machine.system() == 'windows'
@@ -35,13 +34,12 @@ if not fs.exists(clang_path)
error('CLang path does not exist')
endif
rz_core = disabler()
if rizin_include_path == ''
rz_core = dependency('rz_core')
if rz_core.type_name() == 'pkgconfig'
rizin_include_path = rz_core.get_variable(pkgconfig: 'includedir') / 'librz'
elif rz_core.type_name() == 'cmake'
rizin_include_path = rz_core.get_variable(cmake: 'PACKAGE_INCLUDE_DIRS').split(';')[0]
rz_main = dependency('rz_main')
if rz_main.type_name() == 'pkgconfig'
rizin_include_path = rz_main.get_variable(pkgconfig: 'includedir') / 'librz'
elif rz_main.type_name() == 'cmake'
rizin_include_path = rz_main.get_variable(cmake: 'PACKAGE_INCLUDE_DIRS').split(';')[0]
endif
endif
@@ -72,42 +70,29 @@ summary({
'Clang path': clang_path,
})
if target_swig or target_sphinx
src_files = files(
'src/binding_class.py',
'src/binding_director.py',
'src/binding_enum.py',
'src/binding_func.py',
'src/binding_generic.py',
'src/binding_generic_specializations.py',
'src/binding_typemap.py',
'src/bindings.py',
'src/cparser_header.py',
'src/cparser_types.py',
'src/generator_sphinx.py',
'src/generator_swig.py',
'src/lint.py',
'src/main.py',
'src/writer.py',
)
bindgen_outputs = custom_target(
'bindgen_outputs',
input: 'src' / 'main.py',
output: bindgen_output_names,
depend_files: src_files,
command: [
py, '@INPUT@',
'-o', '@OUTDIR@',
'--clang-path', clang_path,
'--clang-args', clang_args,
'--rizin-include-path', rizin_include_path,
'--targets', ','.join(targets)
] + (doxygen_path != '' ? ['--doxygen-path', doxygen_path] : [])
)
endif
bindgen_outputs = custom_target(
'bindgen_outputs',
input: 'src' / 'main.py',
output: bindgen_output_names,
command: [
py, '@INPUT@',
'-o', '@OUTDIR@',
'--clang-path', clang_path,
'--clang-args', clang_args,
'--rizin-include-path', rizin_include_path,
'--targets', ','.join(targets)
] + (doxygen_path != '' ? ['--doxygen-path', doxygen_path] : [])
)
if target_swig
install_dir = py.get_install_dir()
plat_dir = py.get_path('platlib')
if plat_dir.startswith('/opt/homebrew') and (install_dir.endswith(plat_dir) or install_dir.endswith(plat_dir / '/'))
# Just use directly the platlib, this is a bug in Homebrew python / Meson
# See https://github.com/mesonbuild/meson/issues/10459
install_dir = plat_dir
endif
swig_output = custom_target(
'swig_output',
input: bindgen_outputs[swig_source_idx],
@@ -118,23 +103,25 @@ if target_swig
'-outdir', '@OUTDIR@', '@INPUT@'
],
install: true,
install_dir: [py.get_install_dir(), false]
install_dir: [install_dir, false]
)
swig_py = swig_output[0]
swig_wrap = swig_output[1]
if not rz_core.found()
rz_core = dependency('rz_core')
endif
py.extension_module(
'_rizin',
swig_wrap,
dependencies: [
py.dependency(),
rz_core,
dependency('openssl', required: false),
dependency('rz_main')
],
include_directories: include_directories(
rizin_include_path,
rizin_include_path / 'sdb'
),
install: true,
install_dir: install_dir
)
endif
@@ -155,4 +142,3 @@ endif
if get_option('plugin').enabled()
subdir('plugin')
endif
+1 -6
View File
@@ -8,17 +8,12 @@ swig_runtime = custom_target(
]
)
rz_core_dep = dependency('rz_core')
rizin_plugdir = rz_core_dep.get_variable(pkgconfig: 'plugindir', cmake: 'rz_core_PLUGINDIR')
library(
'rz-bindings-plugin',
['plugin.c', swig_runtime],
dependencies: [
py.dependency(embed: true),
dependency('openssl', required: false),
rz_core_dep,
dependency('rz_main')
],
install: true,
install_dir: rizin_plugdir,
)
+7 -18
View File
@@ -3,7 +3,6 @@
#include <Python.h>
#include <rz_core.h>
#include <rz_util/rz_file.h>
#include <swig_runtime.h>
static PyObject *rizin_module = NULL;
@@ -29,11 +28,6 @@ static PyObject *rizin_module = NULL;
} \
return result;
static int rz_bindings_run_file(RzLang *lang, const char *filename) {
FILE *file = fopen(filename, "rb");
return PyRun_SimpleFile(file, filename) == 0;
}
static int rz_bindings_init(RzLang *lang) {
DEFER_SETUP;
@@ -75,23 +69,12 @@ static int rz_bindings_init(RzLang *lang) {
Py_INCREF(py_rz_core);
Py_INCREF(rizin_module);
char *globpath = rz_file_path_join(bindings_dir, "*.py");
RzList *files = rz_file_globsearch(globpath, 1);
RzListIter *it;
char *filename;
rz_list_foreach(files, it, filename) {
rz_bindings_run_file(lang, filename);
}
free(globpath);
rz_list_free(files);
DEFER_CLEANUP;
}
static int rz_bindings_fini(RzLang *lang) {
Py_XDECREF(rizin_module);
return Py_FinalizeEx() == 0;
return Py_FinalizeEx();
}
static int rz_bindings_prompt(RzLang *lang) {
@@ -170,6 +153,11 @@ static int rz_bindings_prompt(RzLang *lang) {
DEFER_CLEANUP;
}
static int rz_bindings_run_file(RzLang *lang, const char *filename) {
FILE *file = fopen(filename, "rb");
return PyRun_SimpleFile(file, filename) == 0;
}
RzLangPlugin rz_lang_plugin_bindings = {
.name = "python",
.desc = "Python SWIG bindings",
@@ -186,4 +174,5 @@ RzLibStruct rizin_plugin = {
.data = &rz_lang_plugin_bindings,
.version = RZ_VERSION,
.free = NULL,
.pkgname = "rz-bindings",
};
+1 -2
View File
@@ -4,5 +4,4 @@ disable=too-many-instance-attributes,
too-many-branches,
too-many-return-statements,
too-many-locals,
broad-exception-raised,
fixme
fixme
+3 -19
View File
@@ -1,7 +1,7 @@
[build-system]
requires = [
"meson>=0.62.2",
"meson-python>=0.7.0"
"meson==0.62.2",
"meson-python==0.7.0"
]
build-backend = "mesonpy"
@@ -10,30 +10,14 @@ build-verbosity = 3
before-all = "bash {project}/cibw_before_all.sh"
manylinux-x86_64-image = "manylinux_2_24"
manylinux-i686-image = "manylinux_2_24"
manylinux-aarch64-image = "manylinux_2_24"
manylinux-ppc64le-image = "manylinux_2_24"
manylinux-s390x-image = "manylinux_2_24"
manylinux-pypy_x86_64-image = "manylinux_2_24"
manylinux-pypy_i686-image = "manylinux_2_24"
manylinux-pypy_aarch64-image = "manylinux_2_24"
skip = "pp*"
[tool.cibuildwheel.windows]
environment = { CMAKE_PREFIX_PATH="C:\\rizin" }
archs = ["AMD64"]
[tool.cibuildwheel.linux]
#archs = ["x86_64", "aarch64", "ppc64le", "s390x"]
archs = ["x86_64", "aarch64"]
[tool.cibuildwheel.macos]
#archs = ["x86_64", "arm64", "universal2"]
archs = ["x86_64"]
[project]
name = "rz-bindings"
dynamic = [
'version',
]
version = "0.5.0"
requires-python = ">=3.8"
readme = "README.md"
+14
View File
@@ -55,3 +55,17 @@ class Typemap:
f"Function {func.cfunc.cursor.spelling} did not match typemap `{self.args}`. "
f"Contents were: {args}"
)
buffer_len_typemap = Typemap(
"buffer_len",
[TypemapArg("unsigned char *", "buf"), TypemapArg("unsigned long long", "len")],
)
const_buffer_len_typemap = Typemap(
"const_buffer_len",
[
TypemapArg("const unsigned char *", "buf"),
TypemapArg("unsigned long long", "len"),
],
)
+22 -8
View File
@@ -12,6 +12,7 @@ from binding_class import Class
from binding_director import Director
from binding_enum import Enum, MacroEnum
from binding_generic import Generic
from binding_typemap import buffer_len_typemap, const_buffer_len_typemap
HeaderFunc = Callable[[Header], None]
threaded_headers: OrderedDict[str, HeaderFunc] = OrderedDict()
@@ -168,13 +169,6 @@ def bind_analysis(analysis_h: Header) -> None:
Class(analysis_h, typedef="RzAnalysisEsil")
Class(analysis_h, typedef="RzAnalysisPlugin")
Class(
analysis_h,
typedef="RzAnalysisXRef",
rename_fields={"from": "from_addr", "to": "to_addr"},
)
Enum(analysis_h, typedef="RzAnalysisXRefType")
@threaded_header("rz_asm.h")
def bind_asm(asm_h: Header) -> None:
@@ -220,7 +214,27 @@ def bind_buf(buf_h: Header) -> None:
RzBuf
"""
rz_buf = Class(buf_h, typedef="RzBuffer")
rz_buf.add_prefixed_methods("rz_buf_")
# const ut8 *buffer, ut64 len
for name in [
"append_bytes",
"prepend_bytes",
"set_bytes",
"insert_bytes",
"write",
"write_at",
]:
rz_buf.add_method(
f"rz_buf_{name}",
rename=name,
typemaps=[const_buffer_len_typemap],
)
# ut8 *buffer, ut64 len
rz_buf.add_method("rz_buf_read", rename="read", typemaps=[buffer_len_typemap])
rz_buf.add_method("rz_buf_read_at", rename="read_at", typemaps=[buffer_len_typemap])
rz_buf.add_method("rz_buf_seek", rename="seek")
MacroEnum(buf_h, "RZ_BUF_SET", "RZ_BUF_CUR", "RZ_BUF_END")
-1
View File
@@ -12,7 +12,6 @@ from clang.cindex import TranslationUnit, Cursor, CursorKind
from cparser_types import CType, wrap_type
### Cursor wrappers ###
class AttrCursor:
"""
+16 -4
View File
@@ -21,10 +21,22 @@ void rizin_try_warn_deprecate(const char *name, const char *c_name) {
// Buffer typemaps
%include <pybuffer.i>
%pybuffer_mutable_binary(unsigned char *buf, unsigned long long len);
%pybuffer_binary(const unsigned char *buf, unsigned long long len);
%pybuffer_mutable_binary(unsigned char *buf, int len);
%pybuffer_binary(const unsigned char *buf, int len);
%define %buffer_len_activate(TYPE, SIZE)
%pybuffer_mutable_binary(TYPE, SIZE);
%enddef
%define %const_buffer_len_activate(TYPE, SIZE)
%pybuffer_binary(TYPE, SIZE);
%enddef
%define %buffer_len_deactivate(TYPE, SIZE)
%typemap(in) (TYPE, SIZE);
%enddef
%define %const_buffer_len_deactivate(TYPE, SIZE)
%typemap(in) (TYPE, SIZE);
%enddef
// CArrays
%include <carrays.i>