commit:     ad4249e5cec98b45e858a17e3e6071d1126350ec
Author:     Mario Haustein <mario.haustein <AT> hrz <DOT> tu-chemnitz <DOT> de>
AuthorDate: Sun Jul 13 09:27:55 2025 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Mon Jul 14 09:17:07 2025 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=ad4249e5

dev-libs/keystone: build with modern C and CMake

Closes: https://bugs.gentoo.org/952088
Closes: https://bugs.gentoo.org/924770
Signed-off-by: Mario Haustein <mario.haustein <AT> hrz.tu-chemnitz.de>
Part-of: https://github.com/gentoo/gentoo/pull/42985
Closes: https://github.com/gentoo/gentoo/pull/42985
Signed-off-by: Sam James <sam <AT> gentoo.org>

 .../keystone/files/keystone-0.9.2-modern-c.patch   | 319 +++++++++++++++++++++
 dev-libs/keystone/keystone-0.9.2-r4.ebuild         | 104 +++++++
 2 files changed, 423 insertions(+)

diff --git a/dev-libs/keystone/files/keystone-0.9.2-modern-c.patch 
b/dev-libs/keystone/files/keystone-0.9.2-modern-c.patch
new file mode 100644
index 000000000000..a3a55532cf12
--- /dev/null
+++ b/dev-libs/keystone/files/keystone-0.9.2-modern-c.patch
@@ -0,0 +1,319 @@
+From 41197bc85d6b95de3345f5a09d321469c2bba58e Mon Sep 17 00:00:00 2001
+From: Jordan Moore <[email protected]>
+Date: Mon, 2 Jun 2025 16:36:27 -0400
+Subject: [PATCH 1/5] fix: cstdint explicitly included when used
+
+* fixes error in gcc15 where this header is no longer
+  implicitly included
+---
+ llvm/include/llvm/ADT/STLExtras.h | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/llvm/include/llvm/ADT/STLExtras.h 
b/llvm/include/llvm/ADT/STLExtras.h
+index 3346de93..a2adf853 100644
+--- a/llvm/include/llvm/ADT/STLExtras.h
++++ b/llvm/include/llvm/ADT/STLExtras.h
+@@ -21,6 +21,7 @@
+ #include <algorithm> // for std::all_of
+ #include <cassert>
+ #include <cstddef> // for std::size_t
++#include <cstdint>
+ #include <cstdlib> // for qsort
+ #include <functional>
+ #include <iterator>
+
+From f3f792cc05080a4bcc3c2886c0c7cee9294c4a05 Mon Sep 17 00:00:00 2001
+From: Jordan Moore <[email protected]>
+Date: Mon, 2 Jun 2025 16:58:31 -0400
+Subject: [PATCH 2/5] fix: build with modern cmake
+
+---
+ CMakeLists.txt        | 19 +------------------
+ kstool/CMakeLists.txt |  2 +-
+ llvm/CMakeLists.txt   | 15 +--------------
+ 3 files changed, 3 insertions(+), 33 deletions(-)
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 938d4983..9ce08362 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -1,7 +1,7 @@
+ # Keystone Assembler Engine (www.keystone-engine.org)
+ # By Nguyen Anh Quynh, 2016
+ 
+-cmake_minimum_required(VERSION 2.8.7)
++cmake_minimum_required(VERSION 3.10.0)
+ project(keystone)
+ 
+ set(KEYSTONE_VERSION_MAJOR 0)
+@@ -15,23 +15,6 @@ if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
+   set(CMAKE_BUILD_TYPE "Debug")
+ endif()
+ 
+-if (POLICY CMP0022)
+-  cmake_policy(SET CMP0022 NEW) # automatic when 2.8.12 is required
+-endif()
+-
+-if (POLICY CMP0051)
+-  # CMake 3.1 and higher include generator expressions of the form
+-  # $<TARGETLIB:obj> in the SOURCES property.  These need to be
+-  # stripped everywhere that access the SOURCES property, so we just
+-  # defer to the OLD behavior of not including generator expressions
+-  # in the output for now.
+-  cmake_policy(SET CMP0051 OLD)
+-endif()
+-
+-if (POLICY CMP0063)
+-  set(CMAKE_POLICY_DEFAULT_CMP0063 NEW) # automatic when 3.3.2 is required
+-endif()
+-
+ if (CMAKE_VERSION VERSION_LESS 3.1.20141117)
+   set(cmake_3_2_USES_TERMINAL)
+ else()
+diff --git a/kstool/CMakeLists.txt b/kstool/CMakeLists.txt
+index d28da481..25113821 100644
+--- a/kstool/CMakeLists.txt
++++ b/kstool/CMakeLists.txt
+@@ -1,7 +1,7 @@
+ # Kstool for Keystone assembler engine.
+ # By Nguyen Anh Quynh, 2016
+ 
+-cmake_minimum_required(VERSION 2.8)
++cmake_minimum_required(VERSION 3.10.0)
+ 
+ project(kstool)
+ 
+diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt
+index d926b082..518613a5 100644
+--- a/llvm/CMakeLists.txt
++++ b/llvm/CMakeLists.txt
+@@ -1,6 +1,6 @@
+ # See docs/CMake.html for instructions about how to build LLVM with CMake.
+ 
+-cmake_minimum_required(VERSION 2.8.7)
++cmake_minimum_required(VERSION 3.10.0)
+ 
+ set(LLVM_INSTALL_TOOLCHAIN_ONLY ON)
+ 
+@@ -9,19 +9,6 @@ if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
+   set(CMAKE_BUILD_TYPE "Debug")
+ endif()
+ 
+-if(POLICY CMP0022)
+-  cmake_policy(SET CMP0022 NEW) # automatic when 2.8.12 is required
+-endif()
+-
+-if (POLICY CMP0051)
+-  # CMake 3.1 and higher include generator expressions of the form
+-  # $<TARGETLIB:obj> in the SOURCES property.  These need to be
+-  # stripped everywhere that access the SOURCES property, so we just
+-  # defer to the OLD behavior of not including generator expressions
+-  # in the output for now.
+-  cmake_policy(SET CMP0051 OLD)
+-endif()
+-
+ if(CMAKE_VERSION VERSION_LESS 3.1.20141117)
+   set(cmake_3_2_USES_TERMINAL)
+ else()
+
+From 4e2fcaa8fad81fc6016bd4d7d245d04719195381 Mon Sep 17 00:00:00 2001
+From: Jordan Moore <[email protected]>
+Date: Mon, 2 Jun 2025 17:49:30 -0400
+Subject: [PATCH 3/5] fix: bindings: rust: moderize and format
+
+---
+ bindings/rust/Cargo.toml              |  1 +
+ bindings/rust/keystone-sys/Cargo.toml |  1 +
+ bindings/rust/keystone-sys/build.rs   |  2 +-
+ bindings/rust/keystone-sys/src/lib.rs | 14 ++------------
+ bindings/rust/src/lib.rs              |  2 +-
+ 5 files changed, 6 insertions(+), 14 deletions(-)
+
+diff --git a/bindings/rust/Cargo.toml b/bindings/rust/Cargo.toml
+index 3342e5a1..013a6e9d 100644
+--- a/bindings/rust/Cargo.toml
++++ b/bindings/rust/Cargo.toml
+@@ -1,6 +1,7 @@
+ [package]
+ name = "keystone"
+ version = "0.9.2"
++edition = "2018"
+ authors = [
+   "Remco Verhoef <[email protected]>",
+   "Tasuku SUENAGA a.k.a. gunyarakun <[email protected]>"
+diff --git a/bindings/rust/keystone-sys/Cargo.toml 
b/bindings/rust/keystone-sys/Cargo.toml
+index a836c305..7b88aff6 100644
+--- a/bindings/rust/keystone-sys/Cargo.toml
++++ b/bindings/rust/keystone-sys/Cargo.toml
+@@ -1,6 +1,7 @@
+ [package]
+ name = "keystone-sys"
+ version = "0.9.2"
++edition = "2018"
+ authors = [
+   "Remco Verhoef <[email protected]>",
+   "Tasuku SUENAGA a.k.a. gunyarakun <[email protected]>"
+diff --git a/bindings/rust/keystone-sys/build.rs 
b/bindings/rust/keystone-sys/build.rs
+index 9670fcb3..a92a41f2 100644
+--- a/bindings/rust/keystone-sys/build.rs
++++ b/bindings/rust/keystone-sys/build.rs
+@@ -17,7 +17,7 @@ fn build_with_cmake() {
+         // This only happens when using the crate via a `git` reference as the
+         // published version already embeds keystone's source.
+         let pwd = std::env::current_dir().unwrap();
+-        let keystone_dir = pwd.ancestors().skip(3).next().unwrap();
++        let keystone_dir = pwd.ancestors().nth(3).unwrap();
+         symlink(keystone_dir, "keystone").expect("failed to symlink 
keystone");
+     }
+ 
+diff --git a/bindings/rust/keystone-sys/src/lib.rs 
b/bindings/rust/keystone-sys/src/lib.rs
+index 6eb282a6..8bd5eefd 100644
+--- a/bindings/rust/keystone-sys/src/lib.rs
++++ b/bindings/rust/keystone-sys/src/lib.rs
+@@ -10,19 +10,9 @@ extern crate libc;
+ 
+ pub mod keystone_const;
+ 
++use ::libc::{c_char, c_int, c_uchar, c_uint, size_t};
++use ::std::{ffi::CStr, fmt, ptr};
+ use keystone_const::{Arch, Error, Mode, OptionType, OptionValue};
+-use ::std::{
+-    ffi::CStr,
+-    fmt,
+-    ptr,
+-};
+-use ::libc::{
+-    c_char,
+-    c_uchar,
+-    c_int,
+-    c_uint,
+-    size_t,
+-};
+ 
+ /// Opaque type representing the Keystone engine
+ #[repr(C)]
+diff --git a/bindings/rust/src/lib.rs b/bindings/rust/src/lib.rs
+index dd5bd042..dc8cd5e0 100644
+--- a/bindings/rust/src/lib.rs
++++ b/bindings/rust/src/lib.rs
+@@ -90,7 +90,7 @@ impl Keystone {
+         let err = unsafe { ffi::ks_open(arch, mode, &mut handle) };
+         if err == Error::OK {
+             Ok(Keystone {
+-                handle: handle.expect("Got NULL engine from ks_open()")
++                handle: handle.expect("Got NULL engine from ks_open()"),
+             })
+         } else {
+             Err(err)
+
+From bf3b00fba5a32bba3b3f7fb1d54e374338614a96 Mon Sep 17 00:00:00 2001
+From: Jordan Moore <[email protected]>
+Date: Mon, 2 Jun 2025 17:50:07 -0400
+Subject: [PATCH 4/5] fix: only attempt to publish bindings on master
+
+---
+ .github/workflows/python-publish.yml | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/.github/workflows/python-publish.yml 
b/.github/workflows/python-publish.yml
+index 6f5e8554..cb0d2d5c 100644
+--- a/.github/workflows/python-publish.yml
++++ b/.github/workflows/python-publish.yml
+@@ -1,6 +1,9 @@
+ name: PyPI 📦 Distribution
+ 
+-on: [push]
++on:
++  push:
++    branches:
++      - master
+ 
+ jobs:
+   build:
+
+From 667cce956ce9c3b2ec7eb30d23198deb9596b427 Mon Sep 17 00:00:00 2001
+From: Jordan Moore <[email protected]>
+Date: Mon, 2 Jun 2025 17:50:50 -0400
+Subject: [PATCH 5/5] feat: basic CI
+
+---
+ .github/workflows/cmake-build.yml | 31 +++++++++++++++++++++++++++++++
+ .github/workflows/rust-build.yml  | 31 +++++++++++++++++++++++++++++++
+ 2 files changed, 62 insertions(+)
+ create mode 100644 .github/workflows/cmake-build.yml
+ create mode 100644 .github/workflows/rust-build.yml
+
+diff --git a/.github/workflows/cmake-build.yml 
b/.github/workflows/cmake-build.yml
+new file mode 100644
+index 00000000..4de36eab
+--- /dev/null
++++ b/.github/workflows/cmake-build.yml
+@@ -0,0 +1,31 @@
++# Builds the codebase with cmake
++
++name: CMake CI
++on:
++  pull_request:
++  push:
++    branches:
++      - master
++
++jobs:
++  linux-build:
++    name: Linux
++    runs-on: ubuntu-24.04
++    steps:
++      - name: Checkout source code
++        uses: actions/checkout@v4
++      - name: Install prerequisites
++        shell: bash
++        run: |
++          sudo apt-get -y update
++          sudo apt-get install -y \
++              cmake \
++              gcc
++      - name: Configure
++        shell: bash
++        run: |
++          cmake -B build
++      - name: Bulid
++        shell: bash
++        run: |
++          cmake --build build
+diff --git a/.github/workflows/rust-build.yml 
b/.github/workflows/rust-build.yml
+new file mode 100644
+index 00000000..7f7c8e01
+--- /dev/null
++++ b/.github/workflows/rust-build.yml
+@@ -0,0 +1,31 @@
++# Builds the codebase with cmake on ubuntu, windows and macos.
++#
++name: Rust CI
++on:
++  pull_request:
++  push:
++    branches:
++      - master
++
++jobs:
++  linux-test:
++    name: Linux
++    runs-on: ubuntu-24.04
++    steps:
++      - uses: actions/checkout@v4
++      - uses: dtolnay/rust-toolchain@stable
++
++      - name: Install prerequisites
++        shell: bash
++        run: |
++          sudo apt-get -y update
++          sudo apt-get install -y \
++              cmake \
++              libclang-dev \
++              pkg-config \
++              gcc
++      - name: Build and test rust
++        shell: bash
++        run: |
++          cd bindings/rust
++          cargo test

diff --git a/dev-libs/keystone/keystone-0.9.2-r4.ebuild 
b/dev-libs/keystone/keystone-0.9.2-r4.ebuild
new file mode 100644
index 000000000000..efe4c95c6452
--- /dev/null
+++ b/dev-libs/keystone/keystone-0.9.2-r4.ebuild
@@ -0,0 +1,104 @@
+# Copyright 1999-2025 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+DISTUTILS_EXT=1
+DISTUTILS_OPTIONAL=1
+DISTUTILS_USE_PEP517=setuptools
+PYTHON_COMPAT=( python3_{10..13} )
+
+inherit cmake distutils-r1 flag-o-matic
+
+DESCRIPTION="assembly/assembler framework + bindings"
+HOMEPAGE="https://www.keystone-engine.org/";
+
+if [[ ${PV} == 9999* ]]; then
+       EGIT_REPO_URI="https://github.com/keystone-engine/keystone.git";
+       inherit git-r3
+else
+       
SRC_URI="https://github.com/keystone-engine/keystone/archive/${PV/_rc/-rc}.tar.gz
 -> ${P}.tar.gz"
+       KEYWORDS="~amd64 ~arm ~arm64 ~ppc ~ppc64 ~x86"
+fi
+S="${WORKDIR}"/${P/_rc/-rc}
+
+LICENSE="GPL-2"
+SLOT="0"
+
+# Keep in sync with llvm/CMakeLists.txt
+KEYSTONE_TARGETS="AArch64 ARM Hexagon Mips PowerPC Sparc SystemZ X86"
+
+IUSE="python"
+
+RDEPEND="
+       python? ( ${PYTHON_DEPS} )
+"
+DEPEND="${RDEPEND}"
+BDEPEND="
+       python?
+       (
+               ${DISTUTILS_DEPS}
+               ${PYTHON_DEPS}
+       )
+"
+
+RESTRICT=test # only regression tests
+
+REQUIRED_USE="
+       python? ( ${PYTHON_REQUIRED_USE} )
+"
+
+PATCHES=(
+       "${FILESDIR}/${P}-strict-prototypes.patch"
+       "${FILESDIR}/${PN}-0.9.2-modern-c.patch"
+)
+
+# Upstream doesn't flag patch releases (bug 858395)
+QA_PKGCONFIG_VERSION="$(ver_cut 1-2)"
+
+wrap_python() {
+       if use python; then
+               pushd bindings/python >/dev/null || die
+               distutils-r1_${1} "$@"
+               popd >/dev/null || die
+       fi
+}
+
+pkg_setup() {
+       python_setup
+}
+
+src_prepare() {
+       sed -i '/NOT uppercase_CMAKE_BUILD_TYPE MATCHES/ s/DEBUG/GENTOO|DEBUG/' 
\
+               llvm/CMakeLists.txt || die
+       cmake_src_prepare
+       wrap_python ${FUNCNAME}
+}
+
+src_configure() {
+       # ODR violations in bundled LLVM (bug #924866)
+       filter-lto
+
+       local libdir="$(get_libdir)"
+       local mycmakeargs=(
+               -DCMAKE_CONFIGURATION_TYPES="Gentoo"
+               -DLLVM_LIBDIR_SUFFIX=${libdir#lib}
+               -DBUILD_SHARED_LIBS=ON
+               -DLLVM_TARGETS_TO_BUILD="${KEYSTONE_TARGETS// /;}"
+               -DLLVM_HOST_TRIPLE="${CHOST}"
+               -DPYTHON_EXECUTABLE="${PYTHON}"
+       )
+
+       cmake_src_configure
+       wrap_python ${FUNCNAME}
+}
+
+src_compile() {
+       cmake_src_compile
+       wrap_python ${FUNCNAME}
+}
+
+src_install() {
+       cmake_src_install
+       wrap_python ${FUNCNAME}
+}

Reply via email to