From 580d6d6dcad85f40e8efa0b78e9b70708cb72a51 Mon Sep 17 00:00:00 2001 From: MSVSphere Packaging Team Date: Fri, 25 Oct 2024 16:12:41 +0300 Subject: [PATCH] import libcpuid-0.7.0-1.el10 --- .gitignore | 1 + .libcpuid.metadata | 1 + ...n-Refactor-the-build-of-the-bindings.patch | 332 ++++++++++++++++++ ...il-sanity-tests-if-current-CPU-is-un.patch | 41 +++ SPECS/libcpuid.spec | 193 ++++++++++ 5 files changed, 568 insertions(+) create mode 100644 .gitignore create mode 100644 .libcpuid.metadata create mode 100644 SOURCES/0001-Python-Refactor-the-build-of-the-bindings.patch create mode 100644 SOURCES/0002-Python-Do-not-fail-sanity-tests-if-current-CPU-is-un.patch create mode 100644 SPECS/libcpuid.spec diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fefcd25 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/libcpuid-0.7.0.tar.gz diff --git a/.libcpuid.metadata b/.libcpuid.metadata new file mode 100644 index 0000000..6e5a118 --- /dev/null +++ b/.libcpuid.metadata @@ -0,0 +1 @@ +a951a846d9164b469f507ef8a7bffe3a68d439ab SOURCES/libcpuid-0.7.0.tar.gz diff --git a/SOURCES/0001-Python-Refactor-the-build-of-the-bindings.patch b/SOURCES/0001-Python-Refactor-the-build-of-the-bindings.patch new file mode 100644 index 0000000..a97cae1 --- /dev/null +++ b/SOURCES/0001-Python-Refactor-the-build-of-the-bindings.patch @@ -0,0 +1,332 @@ +From c2acc569714d0a72051e4e1d34053f4f080d757b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Pavol=20=C5=BD=C3=A1=C4=8Dik?= +Date: Sun, 1 Sep 2024 19:37:37 +0200 +Subject: [PATCH] Python: Refactor the build of the bindings + +When building the binding, link the dynamic +C library as built by `make` instead of linking +the system-installed C library. This simplifies +packaging in Linux distributions and also the +build of the live docs. +--- + .readthedocs.yml | 7 +- + python/pyproject.toml | 2 +- + python/src/libcpuid/_ffi_build.py | 116 +++++++++++++++++++++--- + python/src/libcpuid/_ffi_build_rtd.py | 31 ------- + python/src/libcpuid/_ffi_build_utils.py | 105 --------------------- + 5 files changed, 105 insertions(+), 156 deletions(-) + delete mode 100644 python/src/libcpuid/_ffi_build_rtd.py + delete mode 100644 python/src/libcpuid/_ffi_build_utils.py + +diff --git a/.readthedocs.yml b/.readthedocs.yml +index 0866584..8aa71c8 100644 +--- a/.readthedocs.yml ++++ b/.readthedocs.yml +@@ -14,13 +14,10 @@ build: + pre_install: + - libtoolize + - autoreconf --install +- - mkdir ./install +- - ./configure --prefix=`pwd`/install ++ - ./configure + - make +- - make install + - pip install cffi +- - python ./python/src/libcpuid/_ffi_build_rtd.py ./libcpuid/libcpuid.h ./install +- ++ - python python/src/libcpuid/_ffi_build.py --runtime-link + sphinx: + configuration: python/docs/conf.py + +diff --git a/python/pyproject.toml b/python/pyproject.toml +index 637b0e6..580a4c7 100644 +--- a/python/pyproject.toml ++++ b/python/pyproject.toml +@@ -1,5 +1,5 @@ + [build-system] +-requires = ["setuptools", "cffi"] ++requires = ["setuptools", "cffi", "wheel"] + build-backend = "setuptools.build_meta" + + [project] +diff --git a/python/src/libcpuid/_ffi_build.py b/python/src/libcpuid/_ffi_build.py +index 6e24d12..e3a7ea0 100644 +--- a/python/src/libcpuid/_ffi_build.py ++++ b/python/src/libcpuid/_ffi_build.py +@@ -3,23 +3,111 @@ Module for compiling the C FFI. + """ + + import os +-import sys ++import subprocess ++import tempfile ++import re ++import argparse ++from pathlib import Path + from cffi import FFI + +-sys.path.append(os.path.dirname(os.path.abspath(__file__))) + +-from _ffi_build_utils import ( # pylint: disable=import-error, wrong-import-position +- get_include_flags, +- find_header_file, +- preprocess_header, +- eval_sizeofs, ++class FFIBuildException(Exception): ++ """Generic exception for errors occuring during the CFFI build.""" ++ ++ ++def preprocess_header(header_path): ++ """ ++ Preprocesses the header file (python-cffi only accepts preprocessed C definitions) ++ at the given path and returns it as a string. ++ """ ++ try: ++ return subprocess.check_output( ++ ["gcc", "-U __GNUC__", "-E", header_path] ++ ).decode() ++ except subprocess.CalledProcessError as e: ++ if e.returncode == 127: ++ raise FFIBuildException( ++ "The gcc compiler is necessary to build python-libcpuid." ++ ) from e ++ raise FFIBuildException( ++ f"Error preprocessing the libcpuid header file: {e.stderr}" ++ ) from e ++ ++ ++def _get_sizeof_eval_source(sizeof): ++ return f""" ++#include ++#include ++ ++int main() {{ ++ printf("%ld", {sizeof}); ++ return 0; ++}} ++""" ++ ++ ++def eval_sizeofs(header, cflags): ++ """ ++ Evaluates each sizeof found in the given C header and replaces all ++ occurences of the sizeof with its computed value. ++ """ ++ sizeofs = set(re.findall(r"sizeof\([^\)]*\)", header)) ++ tmp_dir = tempfile.mkdtemp() ++ c_program_path = Path(tmp_dir, "sizeof.c") ++ executable_path = Path(tmp_dir, "sizeof") ++ ++ for sizeof in sizeofs: ++ with open(c_program_path, "w", encoding="UTF-8") as c_program_file: ++ c_program_file.write(_get_sizeof_eval_source(sizeof)) ++ subprocess.check_call(["gcc", c_program_path, *cflags, "-o", executable_path]) ++ size = subprocess.check_output([executable_path]).decode() ++ header = header.replace(sizeof, size) ++ ++ os.remove(c_program_path) ++ os.remove(executable_path) ++ os.rmdir(tmp_dir) ++ return header ++ ++ ++LIBCPUID_DIR = str(Path(*(Path(os.path.abspath(__file__)).parts[:-4]))) ++LIBCPUID_INCLUDE_DIR = str(Path(LIBCPUID_DIR, "libcpuid")) ++LIBCPUID_LIBRARY_DIR = str(Path(LIBCPUID_DIR, "libcpuid", ".libs")) ++LIBCPUID_MAIN_HEADER_FILENAME = "libcpuid.h" ++LIBCPUID_MAIN_HEADER_PATH = str( ++ Path(LIBCPUID_INCLUDE_DIR, LIBCPUID_MAIN_HEADER_FILENAME) + ) ++LIBCPUID_LIBRARY_NAME = "cpuid" ++PYTHON_SRC_DIR = str(Path(LIBCPUID_DIR, "python", "src")) ++ ++PREPROCESSED_HEADER = preprocess_header(LIBCPUID_MAIN_HEADER_PATH) ++EVAL_SIZEOF_CFLAGS = [ ++ f"-I{LIBCPUID_INCLUDE_DIR}", ++ f"-L{LIBCPUID_LIBRARY_DIR}", ++ f"-l{LIBCPUID_LIBRARY_NAME}", ++ f"-Wl,-rpath={LIBCPUID_LIBRARY_DIR}", ++] ++ ++NO_SIZEOF_HEADER = eval_sizeofs(PREPROCESSED_HEADER, EVAL_SIZEOF_CFLAGS) + +-include_flags = get_include_flags() +-preprocessed_header = preprocess_header(find_header_file(include_flags)) +-no_sizeof_header = eval_sizeofs(preprocessed_header, include_flags) + ffibuilder = FFI() +-ffibuilder.cdef(no_sizeof_header) +-ffibuilder.set_source_pkgconfig( +- "libcpuid._libcpuid_cffi", ["libcpuid"], "#include " +-) ++ffibuilder.cdef(NO_SIZEOF_HEADER) ++ ++set_source_kwargs = { ++ "module_name": "libcpuid._libcpuid_cffi", ++ "source": f"#include <{LIBCPUID_MAIN_HEADER_FILENAME}>", ++ "libraries": [LIBCPUID_LIBRARY_NAME], ++ "include_dirs": [LIBCPUID_INCLUDE_DIR], ++ "library_dirs": [LIBCPUID_LIBRARY_DIR], ++} ++ ++if __name__ == "__main__": ++ parser = argparse.ArgumentParser() ++ parser.add_argument("-r", "--runtime-link", action="store_true") ++ args = parser.parse_args() ++ if args.runtime_link: ++ set_source_kwargs["extra_link_args"] = [f"-Wl,-rpath={LIBCPUID_LIBRARY_DIR}"] ++ ++ffibuilder.set_source(**set_source_kwargs) ++ ++if __name__ == "__main__": ++ ffibuilder.compile(PYTHON_SRC_DIR) +diff --git a/python/src/libcpuid/_ffi_build_rtd.py b/python/src/libcpuid/_ffi_build_rtd.py +deleted file mode 100644 +index 09d09ba..0000000 +--- a/python/src/libcpuid/_ffi_build_rtd.py ++++ /dev/null +@@ -1,31 +0,0 @@ +-""" +-Script for compiling the C FFI for the live documentation. +-""" +- +-import sys +-import os +-from cffi import FFI +- +-sys.path.append(os.path.dirname(os.path.abspath(__file__))) +- +-from _ffi_build_utils import ( # pylint: disable=import-error, wrong-import-position +- preprocess_header, +- eval_sizeofs, +-) +- +-if __name__ == "__main__": +- header_path = sys.argv[1] +- install_dir = sys.argv[2] +- library_dir = os.path.join(os.getcwd(), install_dir, "lib") +- include_dir = os.path.join(install_dir, "include", "libcpuid") +- ffibuilder = FFI() +- ffibuilder.cdef(eval_sizeofs(preprocess_header(header_path), [f"-I{include_dir}"])) +- ffibuilder.set_source( +- "python.src.libcpuid._libcpuid_cffi", +- "#include ", +- libraries=["cpuid"], +- library_dirs=[library_dir], +- include_dirs=[include_dir], +- extra_link_args=[f"-Wl,-rpath={library_dir}"], +- ) +- ffibuilder.compile(verbose=True) +diff --git a/python/src/libcpuid/_ffi_build_utils.py b/python/src/libcpuid/_ffi_build_utils.py +deleted file mode 100644 +index 410bd8c..0000000 +--- a/python/src/libcpuid/_ffi_build_utils.py ++++ /dev/null +@@ -1,105 +0,0 @@ +-""" +-Utility functions for building the FFI. +-""" +- +-import subprocess +-import os +-import re +-import tempfile +- +- +-class FFIBuildException(Exception): +- """Generic exception for errors occuring during the CFFI build.""" +- +- +-def get_include_flags(): +- """ +- Obtains libcpuid include flags via pkg-config. +- """ +- try: +- cflags = ( +- subprocess.check_output(["pkg-config", "libcpuid", "--cflags-only-I"]) +- .decode() +- .strip() +- .split() +- ) +- return cflags +- except subprocess.CalledProcessError as e: +- if e.returncode == 127: +- raise FFIBuildException( +- "The pkg-config command is necessary to build python-libcpuid." +- ) from e +- if e.returncode == 1: +- raise FFIBuildException( +- "The libcpuid C library (devel) was not found." +- ) from e +- raise FFIBuildException("Error looking for the libcpuid library") from e +- +- +-def find_header_file(include_flags): +- """ +- Obtains main libcpuid header file location from include flags. +- """ +- header_path = None # pylint: disable=invalid-name +- for cflag in include_flags: +- header_candidate = os.path.join(cflag[2:], "libcpuid.h") +- if os.path.isfile(header_candidate): +- header_path = header_candidate +- break +- if header_path is None: +- raise FFIBuildException("Could not find header file of the libcpuid library.") +- return header_path +- +- +-def preprocess_header(header_path): +- """ +- Preprocesses the header file (python-cffi only accepts preprocessed C definitions) +- at the given path and returns it as a string. +- """ +- try: +- return subprocess.check_output( +- ["gcc", "-U __GNUC__", "-E", header_path] +- ).decode() +- except subprocess.CalledProcessError as e: +- if e.returncode == 127: +- raise FFIBuildException( +- "The gcc compiler is necessary to build python-libcpuid." +- ) from e +- raise FFIBuildException( +- f"Error preprocessing the libcpuid header file: {e.stderr}" +- ) from e +- +- +-def _get_sizeof_eval_source(sizeof): +- return f""" +-#include +-#include +- +-int main() {{ +- printf("%ld", {sizeof}); +- return 0; +-}} +-""" +- +- +-def eval_sizeofs(header, cflags): +- """ +- Evaluates each sizeof found in the given C header and replaces all +- occurences of the sizeof with its computed value. +- """ +- sizeofs = set(re.findall(r"sizeof\([^\)]*\)", header)) +- tmp_dir = tempfile.mkdtemp() +- c_program_path = os.path.join(tmp_dir, "sizeof.c") +- executable_path = os.path.join(tmp_dir, "sizeof") +- +- for sizeof in sizeofs: +- with open(c_program_path, "w", encoding="UTF-8") as c_program_file: +- c_program_file.write(_get_sizeof_eval_source(sizeof)) +- subprocess.check_call(["gcc", c_program_path, *cflags, "-o", executable_path]) +- size = subprocess.check_output([executable_path]).decode() +- header = header.replace(sizeof, size) +- +- os.remove(c_program_path) +- os.remove(executable_path) +- os.rmdir(tmp_dir) +- return header +-- +2.46.0 + diff --git a/SOURCES/0002-Python-Do-not-fail-sanity-tests-if-current-CPU-is-un.patch b/SOURCES/0002-Python-Do-not-fail-sanity-tests-if-current-CPU-is-un.patch new file mode 100644 index 0000000..5285110 --- /dev/null +++ b/SOURCES/0002-Python-Do-not-fail-sanity-tests-if-current-CPU-is-un.patch @@ -0,0 +1,41 @@ +From eae4874e4e29d3575c04f830c23fbe3040ca7416 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Pavol=20=C5=BD=C3=A1=C4=8Dik?= +Date: Sun, 1 Sep 2024 19:43:31 +0200 +Subject: [PATCH] Python: Do not fail sanity tests if current CPU is + unsupported + +--- + python/tests/sanity_test.py | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +diff --git a/python/tests/sanity_test.py b/python/tests/sanity_test.py +index bf17dc4..4e18165 100644 +--- a/python/tests/sanity_test.py ++++ b/python/tests/sanity_test.py +@@ -5,6 +5,7 @@ import tempfile + import libcpuid + from libcpuid.info import CPUInfo, SystemInfo + from libcpuid.raw import CPURawData, CPURawDataArray ++from libcpuid.errors import CLibraryError + + + def test_cpu_name_in_vendor_list(): +@@ -12,9 +13,12 @@ def test_cpu_name_in_vendor_list(): + Checks that the current CPU codename appears + in the list of all CPUs of its vendor. + """ +- info = CPUInfo.from_current_cpu() +- cpulist = libcpuid.get_cpu_list(info.vendor) +- assert info.cpu_codename in cpulist ++ try: ++ info = CPUInfo.from_current_cpu() ++ cpulist = libcpuid.get_cpu_list(info.vendor) ++ assert info.cpu_codename in cpulist ++ except CLibraryError: ++ pass + + + def test_serialization(): +-- +2.46.0 + diff --git a/SPECS/libcpuid.spec b/SPECS/libcpuid.spec new file mode 100644 index 0000000..314d76f --- /dev/null +++ b/SPECS/libcpuid.spec @@ -0,0 +1,193 @@ +Name: libcpuid +Version: 0.7.0 +Release: 1%{?dist} +Summary: Provides CPU identification for x86 and ARM +License: BSD-2-Clause +URL: https://github.com/anrieff/libcpuid +Source0: https://github.com/anrieff/libcpuid/archive/v%{version}.tar.gz#/%{name}-%{version}.tar.gz +# https://github.com/anrieff/libcpuid/pull/203 +Patch0: 0001-Python-Refactor-the-build-of-the-bindings.patch +Patch1: 0002-Python-Do-not-fail-sanity-tests-if-current-CPU-is-un.patch +ExcludeArch: ppc64le s390x + +BuildRequires: automake +BuildRequires: autoconf +BuildRequires: doxygen +BuildRequires: gcc-c++ +BuildRequires: git +BuildRequires: libtool +BuildRequires: make +BuildRequires: python3-devel +BuildRequires: python3-cffi +BuildRequires: python3-setuptools +BuildRequires: python3-wheel +BuildRequires: python3-pip +BuildRequires: python3-pytest +BuildRequires: pyproject-rpm-macros + +%description +Libcpuid provides CPU identification for the x86 (x86_64) and ARM architectures. + +%package devel +Summary: Development files for %{name} +Requires: %{name}%{_isa} = %{version}-%{release} + +%description devel +The %{name}-devel package contains libraries and header files for +developing applications that use %{name}. +For details about the programming API, please see the docs +on the project's site (http://libcpuid.sourceforge.net/) + +%package -n python3-%{name} +Summary: Python bindings for the libcpuid library +Requires: %{name}%{_isa} = %{version}-%{release} + +%description -n python3-%{name} +The python3-%{name} package contains Python bindings for the libcpuid library. + +%prep +%autosetup -p1 -n %{name}-%{version} + +%build +autoreconf -vfi +%configure --disable-static +%make_build + +pushd python +%pyproject_wheel +popd + +%install +%make_install +# WARNING: empty dependency_libs variable. remove the pointless .la +rm %{buildroot}%{_libdir}/*.la + +%ldconfig_scriptlets + +pushd python +%pyproject_install +popd + +%pyproject_save_files -L %{name} + +%check +LD_LIBRARY_PATH=%{buildroot}%{_libdir} %pytest python/tests + +%files +%doc Readme.md +%license COPYING +%{_libdir}/%{name}.so.* + +%files devel +%{_bindir}/cpuid_tool +%{_includedir}/%{name} +%{_libdir}/%{name}.so +%{_libdir}/pkgconfig/%{name}.pc +%{_mandir}/man3/*.3.* + +%files -n python3-%{name} -f %{pyproject_files} +%doc python/README.md + + +%changelog +* Mon Sep 02 2024 Pavol Žáčik - 0.7.0-1 +- Rebase to 0.7.0 +- Begin building the package for aarch64 +- Add Python bindings as a subpackage (python3-libcpuid) + +* Mon Jun 24 2024 Troy Dawson - 0.6.5-4 +- Bump release for June 2024 mass rebuild + +* Thu May 23 2024 Pavol Žáčik - 0.6.5-3 +- Patch bugs found by static analysis tools +- Add %%{name}-fix-handle-leaks-in-rdmsr-c.patch +- Add %%{name}-fix-cpuid_get_hypervisor.patch +- Add %%{name}-prevent-intel_fn11-array-overruns.patch + +* Thu May 09 2024 Pavol Žáčik - 0.6.5-2 +- Specify license using an SPDX identifier + +* Tue Apr 30 2024 Martin Gansser - 0.6.5-1 +- Update to 0.6.5 + +* Thu Jan 25 2024 Fedora Release Engineering - 0.6.4-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + +* Sun Jan 21 2024 Fedora Release Engineering - 0.6.4-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + +* Mon Oct 09 2023 Martin Gansser - 0.6.4-1 +- Update to 0.6.4 + +* Thu Jul 20 2023 Fedora Release Engineering - 0.6.3-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild + +* Wed May 03 2023 Martin Gansser - 0.6.3-1 +- Update to 0.6.3 + +* Thu Jan 19 2023 Fedora Release Engineering - 0.6.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild + +* Sat Nov 12 2022 Martin Gansser - 0.6.2-1 +- Update to 0.6.2 + +* Sat Oct 22 2022 Martin Gansser - 0.6.0-1 +- Update to 0.6.0 + +* Thu Jul 21 2022 Fedora Release Engineering - 0.5.1-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild + +* Thu Jan 20 2022 Fedora Release Engineering - 0.5.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild + +* Thu Sep 02 2021 Martin Gansser - 0.5.1-1 +- Update to 0.5.1 + +* Thu Jul 22 2021 Fedora Release Engineering - 0.5.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild + +* Tue Jan 26 2021 Fedora Release Engineering - 0.5.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Tue Dec 22 2020 Martin Gansser - 0.5.0-1 +- Update to 0.5.0 + +* Tue Jul 28 2020 Fedora Release Engineering - 0.4.1-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Wed Jan 29 2020 Fedora Release Engineering - 0.4.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Fri Jan 17 2020 Martin Gansser - 0.4.1-1 +- Update to 0.4.1 + +* Thu Jul 25 2019 Fedora Release Engineering - 0.4.0-8.20171023git2f10315 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + +* Fri Feb 01 2019 Fedora Release Engineering - 0.4.0-7.20171023git2f10315 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + +* Fri Jul 13 2018 Fedora Release Engineering - 0.4.0-6.20171023git2f10315 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Wed Feb 07 2018 Fedora Release Engineering - 0.4.0-5.20171023git2f10315 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Mon Oct 23 2017 Martin Gansser - 0.4.0-4.20171023git2f10315 +- Update to 0.4.0-4.20171023git2f10315 +- Dropped %%{name}-not-use-4m-macro.patch +- Add ExcludeArch: aarch64 %%arm ppc64le ppc64 s390x + +* Mon Oct 23 2017 Martin Gansser - 0.4.0-3.20170504git57298c6 +- Add BR doxygen +- disable build of static lib +- don't remove %%exclude %%{_libdir}/%%{name}.so +- Add %%{name}-not-use-4m-macro.patch + +* Mon Oct 23 2017 Martin Gansser - 0.4.0-2.20170504git57298c6 +- Add BR gcc-c++ +- replace libtoolize and autoreconf --install with autoreconf -vfi +- remove %%exclude %%{_libdir}/%%{name}.so.* not needed + +* Sun Oct 22 2017 Martin Gansser - 0.4.0-1.20170504git57298c6 +- Initial build.