From 0a109138c3a55cd474bd072e4248b45123389d00 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Fri, 28 Jul 2023 16:27:01 +0300 Subject: [PATCH 01/15] pbc: migrate to Conan v2 --- recipes/pbc/all/conanfile.py | 119 +++++++++--------- recipes/pbc/all/test_package/CMakeLists.txt | 9 +- recipes/pbc/all/test_package/conanfile.py | 21 +++- .../pbc/all/test_v1_package/CMakeLists.txt | 8 ++ recipes/pbc/all/test_v1_package/conanfile.py | 17 +++ 5 files changed, 101 insertions(+), 73 deletions(-) create mode 100644 recipes/pbc/all/test_v1_package/CMakeLists.txt create mode 100644 recipes/pbc/all/test_v1_package/conanfile.py diff --git a/recipes/pbc/all/conanfile.py b/recipes/pbc/all/conanfile.py index cef849369307b..049c5fdcf211e 100644 --- a/recipes/pbc/all/conanfile.py +++ b/recipes/pbc/all/conanfile.py @@ -1,22 +1,39 @@ -from conans import ConanFile, AutoToolsBuildEnvironment, tools import os -required_conan_version = ">=1.33.0" +from conan import ConanFile +from conan.tools.apple import XCRun, to_apple_arch +from conan.tools.build import cross_building +from conan.tools.files import apply_conandata_patches, copy, export_conandata_patches, get, rm, rmdir, chdir +from conan.tools.gnu import Autotools, AutotoolsToolchain, AutotoolsDeps +from conan.tools.layout import basic_layout + +required_conan_version = ">=1.53.0" class PbcConan(ConanFile): name = "pbc" - topics = ("pbc", "crypto", "cryptography", "security", "pairings", "cryptographic") + description = ( + "The PBC (Pairing-Based Crypto) library is a C library providing " + "low-level routines for pairing-based cryptosystems." + ) + license = "LGPL-3.0" url = "https://github.com/conan-io/conan-center-index" homepage = "https://crypto.stanford.edu/pbc/" - license = "LGPL-3.0" - description = "The PBC (Pairing-Based Crypto) library is a C library providing low-level routines for pairing-based cryptosystems." + topics = ("crypto", "cryptography", "security", "pairings", "cryptographic") + package_type = "library" settings = "os", "arch", "compiler", "build_type" - options = {"shared": [True, False], "fPIC": [True, False]} - default_options = {"shared": False, "fPIC": True} - _autotools = None - exports_sources = "patches/**" + options = { + "shared": [True, False], + "fPIC": [True, False], + } + default_options = { + "shared": False, + "fPIC": True, + } + + def export_sources(self): + export_conandata_patches(self) def config_options(self): if self.settings.os == "Windows": @@ -24,75 +41,55 @@ def config_options(self): def configure(self): if self.options.shared: - del self.options.fPIC - del self.settings.compiler.libcxx - del self.settings.compiler.cppstd + self.options.rm_safe("fPIC") + self.settings.rm_safe("compiler.libcxx") + self.settings.rm_safe("compiler.cppstd") + + def layout(self): + basic_layout(self, src_folder="src") def requirements(self): self.requires("gmp/6.2.1") def build_requirements(self): - self.build_requires("bison/3.7.6") - self.build_requires("flex/2.6.4") - - @property - def _settings_build(self): - return getattr(self, "settings_build", self.settings) + self.tool_requires("bison/3.8.2") + self.tool_requires("flex/2.6.4") def source(self): - tools.get(**self.conan_data["sources"][self.version], strip_root=True) - - def _configure_autotools(self): - if self._autotools: - return self._autotools - self._autotools = AutoToolsBuildEnvironment( - self, win_bash=tools.os_info.is_windows - ) - # Need to override environment or configure will fail despite that flex - # is actually available. - args = ["LEX=flex"] - if self.options.shared: - args.extend(["--disable-static", "--enable-shared"]) - else: - args.extend(["--disable-shared", "--enable-static"]) + get(self, **self.conan_data["sources"][self.version], strip_root=True) + def generate(self): + tc = AutotoolsToolchain(self) + tc.extra_defines += ["LEX=flex"] # No idea why this is necessary, but if you don't set CC this way, then # configure complains that it can't find gmp. - if ( - tools.cross_building(self.settings) - and self.settings.compiler == "apple-clang" - ): - - xcr = tools.XCRun(self.settings) - target = tools.to_apple_arch(self.settings.arch) + "-apple-darwin" - + if cross_building(self) and self.settings.compiler == "apple-clang": + xcr = XCRun(self.settings) + target = to_apple_arch(self.settings.arch) + "-apple-darwin" min_ios = "" if self.settings.os == "iOS": - min_ios = "-miphoneos-version-min={}".format(self.settings.os.version) - - args.append( - "CC={} -isysroot {} -target {} {}".format( - xcr.cc, xcr.sdk_path, target, min_ios - ) - ) - - self._autotools.configure(args=args) - return self._autotools + min_ios = f"-miphoneos-version-min={self.settings.os.version}" + tc.configure_args.append(f"CC={xcr.cc} -isysroot {xcr.sdk_path} -target {target} {min_ios}") + tc.generate() + deps = AutotoolsDeps(self) + deps.generate() def build(self): - for patch in self.conan_data.get("patches", {}).get(self.version, []): - tools.patch(**patch) - autotools = self._configure_autotools() - autotools.make() + apply_conandata_patches(self) + with chdir(self, self.source_folder): + autotools = Autotools(self) + autotools.configure() + autotools.make() def package(self): - self.copy(pattern="COPYING", dst="licenses") - autotools = self._configure_autotools() - autotools.install() - tools.rmdir(os.path.join(self.package_folder, "share")) - tools.remove_files_by_mask(os.path.join(self.package_folder, "lib"), "*.la") + copy(self, "COPYING", dst=os.path.join(self.package_folder, "licenses"), src=self.source_folder) + with chdir(self, self.source_folder): + autotools = Autotools(self) + autotools.install() + rmdir(self, os.path.join(self.package_folder, "share")) + rm(self, "*.la", self.package_folder, recursive=True) def package_info(self): self.cpp_info.libs = ["pbc"] - if self.settings.os == "Linux": + if self.settings.os in ["Linux", "FreeBSD"]: self.cpp_info.system_libs = ["m"] diff --git a/recipes/pbc/all/test_package/CMakeLists.txt b/recipes/pbc/all/test_package/CMakeLists.txt index c67cb318985e8..a724a29a8da1f 100644 --- a/recipes/pbc/all/test_package/CMakeLists.txt +++ b/recipes/pbc/all/test_package/CMakeLists.txt @@ -1,10 +1,7 @@ -cmake_minimum_required(VERSION 3.1) -project(test_package) +cmake_minimum_required(VERSION 3.15) +project(test_package LANGUAGES C) -include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) -conan_basic_setup(TARGETS) - -find_package(pbc CONFIG REQUIRED) +find_package(pbc REQUIRED CONFIG) add_executable(${PROJECT_NAME} test_package.c) target_link_libraries(${PROJECT_NAME} pbc::pbc) diff --git a/recipes/pbc/all/test_package/conanfile.py b/recipes/pbc/all/test_package/conanfile.py index 49a3a66ea5bad..ef5d7042163ec 100644 --- a/recipes/pbc/all/test_package/conanfile.py +++ b/recipes/pbc/all/test_package/conanfile.py @@ -1,10 +1,19 @@ -from conans import ConanFile, CMake, tools +from conan import ConanFile +from conan.tools.build import can_run +from conan.tools.cmake import cmake_layout, CMake import os class TestPackageConan(ConanFile): - settings = "os", "compiler", "build_type", "arch" - generators = "cmake", "cmake_find_package_multi" + settings = "os", "arch", "compiler", "build_type" + generators = "CMakeDeps", "CMakeToolchain", "VirtualRunEnv" + test_type = "explicit" + + def requirements(self): + self.requires(self.tested_reference_str) + + def layout(self): + cmake_layout(self) def build(self): cmake = CMake(self) @@ -12,6 +21,6 @@ def build(self): cmake.build() def test(self): - if not tools.cross_building(self): - bin_path = os.path.join("bin", "test_package") - self.run(bin_path, run_environment=True) + if can_run(self): + bin_path = os.path.join(self.cpp.build.bindir, "test_package") + self.run(bin_path, env="conanrun") diff --git a/recipes/pbc/all/test_v1_package/CMakeLists.txt b/recipes/pbc/all/test_v1_package/CMakeLists.txt new file mode 100644 index 0000000000000..91630d79f4abb --- /dev/null +++ b/recipes/pbc/all/test_v1_package/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.15) +project(test_package) + +include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) +conan_basic_setup(TARGETS) + +add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../test_package/ + ${CMAKE_CURRENT_BINARY_DIR}/test_package/) diff --git a/recipes/pbc/all/test_v1_package/conanfile.py b/recipes/pbc/all/test_v1_package/conanfile.py new file mode 100644 index 0000000000000..49a3a66ea5bad --- /dev/null +++ b/recipes/pbc/all/test_v1_package/conanfile.py @@ -0,0 +1,17 @@ +from conans import ConanFile, CMake, tools +import os + + +class TestPackageConan(ConanFile): + settings = "os", "compiler", "build_type", "arch" + generators = "cmake", "cmake_find_package_multi" + + def build(self): + cmake = CMake(self) + cmake.configure() + cmake.build() + + def test(self): + if not tools.cross_building(self): + bin_path = os.path.join("bin", "test_package") + self.run(bin_path, run_environment=True) From bb891a3e99a078f99f0c0a62dc8b9a4efe19e872 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Mon, 11 Sep 2023 18:24:31 +0300 Subject: [PATCH 02/15] pbc: bump gmp --- recipes/pbc/all/conanfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes/pbc/all/conanfile.py b/recipes/pbc/all/conanfile.py index 049c5fdcf211e..3851ccf81dc30 100644 --- a/recipes/pbc/all/conanfile.py +++ b/recipes/pbc/all/conanfile.py @@ -49,7 +49,7 @@ def layout(self): basic_layout(self, src_folder="src") def requirements(self): - self.requires("gmp/6.2.1") + self.requires("gmp/6.3.0") def build_requirements(self): self.tool_requires("bison/3.8.2") From 48cd19da363197a3c65999c679dcec8e7aaed784 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Mon, 11 Sep 2023 18:28:22 +0300 Subject: [PATCH 03/15] pbc: use winflexbison on Windows --- recipes/pbc/all/conanfile.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/recipes/pbc/all/conanfile.py b/recipes/pbc/all/conanfile.py index 3851ccf81dc30..9da7bf03f32a7 100644 --- a/recipes/pbc/all/conanfile.py +++ b/recipes/pbc/all/conanfile.py @@ -32,6 +32,10 @@ class PbcConan(ConanFile): "fPIC": True, } + @property + def _settings_build(self): + return getattr(self, "settings_build", self.settings) + def export_sources(self): export_conandata_patches(self) @@ -52,8 +56,11 @@ def requirements(self): self.requires("gmp/6.3.0") def build_requirements(self): - self.tool_requires("bison/3.8.2") - self.tool_requires("flex/2.6.4") + if self._settings_build.os == "Windows": + self.tool_requires("winflexbison/2.5.24") + else: + self.tool_requires("flex/2.6.4") + self.tool_requires("bison/3.8.2") def source(self): get(self, **self.conan_data["sources"][self.version], strip_root=True) From 855a5a7f0e715d783c1254e85f56ab2227869d92 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Mon, 11 Sep 2023 18:45:21 +0300 Subject: [PATCH 04/15] pbc: add transitive_headers=True to gmp --- recipes/pbc/all/conandata.yml | 1 - recipes/pbc/all/conanfile.py | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/recipes/pbc/all/conandata.yml b/recipes/pbc/all/conandata.yml index af6c41c5d370b..3a82e91b4ea31 100644 --- a/recipes/pbc/all/conandata.yml +++ b/recipes/pbc/all/conandata.yml @@ -5,4 +5,3 @@ sources: patches: "0.5.14": - patch_file: "patches/0.5.14-0001-fix-config-sub-ios.patch" - base_path: "" diff --git a/recipes/pbc/all/conanfile.py b/recipes/pbc/all/conanfile.py index 9da7bf03f32a7..f3998302aad92 100644 --- a/recipes/pbc/all/conanfile.py +++ b/recipes/pbc/all/conanfile.py @@ -53,7 +53,7 @@ def layout(self): basic_layout(self, src_folder="src") def requirements(self): - self.requires("gmp/6.3.0") + self.requires("gmp/6.3.0", transitive_headers=True) def build_requirements(self): if self._settings_build.os == "Windows": From 2ec541899cce95a19514e3ea5ce8c9e50f02048b Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Fri, 3 Nov 2023 23:19:41 +0200 Subject: [PATCH 05/15] pbc: fix build --- recipes/pbc/all/conanfile.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/recipes/pbc/all/conanfile.py b/recipes/pbc/all/conanfile.py index f3998302aad92..987b59e134d65 100644 --- a/recipes/pbc/all/conanfile.py +++ b/recipes/pbc/all/conanfile.py @@ -3,6 +3,7 @@ from conan import ConanFile from conan.tools.apple import XCRun, to_apple_arch from conan.tools.build import cross_building +from conan.tools.env import VirtualBuildEnv from conan.tools.files import apply_conandata_patches, copy, export_conandata_patches, get, rm, rmdir, chdir from conan.tools.gnu import Autotools, AutotoolsToolchain, AutotoolsDeps from conan.tools.layout import basic_layout @@ -66,8 +67,10 @@ def source(self): get(self, **self.conan_data["sources"][self.version], strip_root=True) def generate(self): + env = VirtualBuildEnv(self) + env.generate() tc = AutotoolsToolchain(self) - tc.extra_defines += ["LEX=flex"] + tc.configure_args.append("LEX=flex") # No idea why this is necessary, but if you don't set CC this way, then # configure complains that it can't find gmp. if cross_building(self) and self.settings.compiler == "apple-clang": From 9b0b8cef60e24bf63895fb86b57572bb04f0b90d Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Mon, 6 Nov 2023 18:17:46 +0200 Subject: [PATCH 06/15] pbc: fix apple cross building bug --- recipes/pbc/all/conanfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes/pbc/all/conanfile.py b/recipes/pbc/all/conanfile.py index 987b59e134d65..89d88349bfc82 100644 --- a/recipes/pbc/all/conanfile.py +++ b/recipes/pbc/all/conanfile.py @@ -74,7 +74,7 @@ def generate(self): # No idea why this is necessary, but if you don't set CC this way, then # configure complains that it can't find gmp. if cross_building(self) and self.settings.compiler == "apple-clang": - xcr = XCRun(self.settings) + xcr = XCRun(self) target = to_apple_arch(self.settings.arch) + "-apple-darwin" min_ios = "" if self.settings.os == "iOS": From a56b00ba49d78f42494c3052cce26332f564ebb9 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Mon, 6 Nov 2023 18:19:54 +0200 Subject: [PATCH 07/15] pbc: transitive_libs=True --- recipes/pbc/all/conanfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes/pbc/all/conanfile.py b/recipes/pbc/all/conanfile.py index 89d88349bfc82..e4564ba3b04c4 100644 --- a/recipes/pbc/all/conanfile.py +++ b/recipes/pbc/all/conanfile.py @@ -54,7 +54,7 @@ def layout(self): basic_layout(self, src_folder="src") def requirements(self): - self.requires("gmp/6.3.0", transitive_headers=True) + self.requires("gmp/6.3.0", transitive_headers=True, transitive_libs=True) def build_requirements(self): if self._settings_build.os == "Windows": From 3151da74d2443269bf8c97f186bda958db0b7767 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Mon, 6 Nov 2023 18:20:56 +0200 Subject: [PATCH 08/15] pbc: bump deps --- recipes/pbc/all/conanfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes/pbc/all/conanfile.py b/recipes/pbc/all/conanfile.py index e4564ba3b04c4..48f9aafcbd54b 100644 --- a/recipes/pbc/all/conanfile.py +++ b/recipes/pbc/all/conanfile.py @@ -58,7 +58,7 @@ def requirements(self): def build_requirements(self): if self._settings_build.os == "Windows": - self.tool_requires("winflexbison/2.5.24") + self.tool_requires("winflexbison/2.5.25") else: self.tool_requires("flex/2.6.4") self.tool_requires("bison/3.8.2") From c3e4e7f28a58c17af34b219b32c86424d8f4af05 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Mon, 6 Nov 2023 18:27:46 +0200 Subject: [PATCH 09/15] pbc: fix configure issue --- recipes/pbc/all/conanfile.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/recipes/pbc/all/conanfile.py b/recipes/pbc/all/conanfile.py index 48f9aafcbd54b..7ffdba85186ee 100644 --- a/recipes/pbc/all/conanfile.py +++ b/recipes/pbc/all/conanfile.py @@ -3,7 +3,7 @@ from conan import ConanFile from conan.tools.apple import XCRun, to_apple_arch from conan.tools.build import cross_building -from conan.tools.env import VirtualBuildEnv +from conan.tools.env import VirtualBuildEnv, VirtualRunEnv from conan.tools.files import apply_conandata_patches, copy, export_conandata_patches, get, rm, rmdir, chdir from conan.tools.gnu import Autotools, AutotoolsToolchain, AutotoolsDeps from conan.tools.layout import basic_layout @@ -69,6 +69,11 @@ def source(self): def generate(self): env = VirtualBuildEnv(self) env.generate() + + if not cross_building(self): + env = VirtualRunEnv(self) + env.generate(scope="build") + tc = AutotoolsToolchain(self) tc.configure_args.append("LEX=flex") # No idea why this is necessary, but if you don't set CC this way, then From 2db1f42359d08ea528547642e4ee64ec250d1b7c Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Wed, 22 Nov 2023 15:50:59 +0200 Subject: [PATCH 10/15] pbc: fix to_apple_arch() --- recipes/pbc/all/conanfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes/pbc/all/conanfile.py b/recipes/pbc/all/conanfile.py index 7ffdba85186ee..3ccc86b0b1f1c 100644 --- a/recipes/pbc/all/conanfile.py +++ b/recipes/pbc/all/conanfile.py @@ -80,7 +80,7 @@ def generate(self): # configure complains that it can't find gmp. if cross_building(self) and self.settings.compiler == "apple-clang": xcr = XCRun(self) - target = to_apple_arch(self.settings.arch) + "-apple-darwin" + target = to_apple_arch(self) + "-apple-darwin" min_ios = "" if self.settings.os == "iOS": min_ios = f"-miphoneos-version-min={self.settings.os.version}" From 8cf882b11ae69d02a54346d5a313691f74868545 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Thu, 23 Nov 2023 10:15:39 +0200 Subject: [PATCH 11/15] pbc: add MSVC support --- recipes/pbc/all/conanfile.py | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/recipes/pbc/all/conanfile.py b/recipes/pbc/all/conanfile.py index 3ccc86b0b1f1c..ccd8a3bd50791 100644 --- a/recipes/pbc/all/conanfile.py +++ b/recipes/pbc/all/conanfile.py @@ -3,20 +3,19 @@ from conan import ConanFile from conan.tools.apple import XCRun, to_apple_arch from conan.tools.build import cross_building -from conan.tools.env import VirtualBuildEnv, VirtualRunEnv +from conan.tools.env import VirtualBuildEnv, VirtualRunEnv, Environment from conan.tools.files import apply_conandata_patches, copy, export_conandata_patches, get, rm, rmdir, chdir from conan.tools.gnu import Autotools, AutotoolsToolchain, AutotoolsDeps from conan.tools.layout import basic_layout +from conan.tools.microsoft import is_msvc, unix_path required_conan_version = ">=1.53.0" class PbcConan(ConanFile): name = "pbc" - description = ( - "The PBC (Pairing-Based Crypto) library is a C library providing " - "low-level routines for pairing-based cryptosystems." - ) + description = ("The PBC (Pairing-Based Crypto) library is a C library providing " + "low-level routines for pairing-based cryptosystems.") license = "LGPL-3.0" url = "https://github.com/conan-io/conan-center-index" homepage = "https://crypto.stanford.edu/pbc/" @@ -58,6 +57,11 @@ def requirements(self): def build_requirements(self): if self._settings_build.os == "Windows": + self.win_bash = True + if not self.conf.get("tools.microsoft.bash:path", check_type=str): + self.tool_requires("msys2/cci.latest") + if is_msvc(self): + self.tool_requires("automake/1.16.5") self.tool_requires("winflexbison/2.5.25") else: self.tool_requires("flex/2.6.4") @@ -89,6 +93,17 @@ def generate(self): deps = AutotoolsDeps(self) deps.generate() + if is_msvc(self): + env = Environment() + automake_conf = self.dependencies.build["automake"].conf_info + compile_wrapper = unix_path(self, automake_conf.get("user.automake:compile-wrapper", check_type=str)) + ar_wrapper = unix_path(self, automake_conf.get("user.automake:lib-wrapper", check_type=str)) + env.define("CC", f"{compile_wrapper} cl -nologo") + env.define("LD", "link -nologo") + env.define("AR", f"{ar_wrapper} \"lib -nologo\"") + env.define("NM", "dumpbin -symbols") + env.vars(self).save_script("conanbuild_msvc") + def build(self): apply_conandata_patches(self) with chdir(self, self.source_folder): From 612f8544d228d9b3f4205d3ad748fccf79ba98a8 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Thu, 23 Nov 2023 12:37:46 +0200 Subject: [PATCH 12/15] pbc: add AutotoolsDeps workaround for MSVC --- recipes/pbc/all/conanfile.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/recipes/pbc/all/conanfile.py b/recipes/pbc/all/conanfile.py index ccd8a3bd50791..4bf1c9697cc3d 100644 --- a/recipes/pbc/all/conanfile.py +++ b/recipes/pbc/all/conanfile.py @@ -90,8 +90,20 @@ def generate(self): min_ios = f"-miphoneos-version-min={self.settings.os.version}" tc.configure_args.append(f"CC={xcr.cc} -isysroot {xcr.sdk_path} -target {target} {min_ios}") tc.generate() - deps = AutotoolsDeps(self) - deps.generate() + + if not is_msvc(self): + deps = AutotoolsDeps(self) + deps.generate() + else: + # Custom AutotoolsDeps for cl like compilers + # workaround for https://github.com/conan-io/conan/issues/12784 + gmp_info = self.dependencies["gmp"].cpp_info + env = Environment() + env.append("CPPFLAGS", [f"-I{unix_path(self, p)}" for p in gmp_info.includedirs] + [f"-D{d}" for d in gmp_info.defines]) + env.append("_LINK_", [lib if lib.endswith(".lib") else f"{lib}.lib" for lib in (gmp_info.libs + gmp_info.system_libs)]) + env.append("LDFLAGS", [f"-LIBPATH:{unix_path(self, p)}" for p in gmp_info.libdirs] + gmp_info.sharedlinkflags + gmp_info.exelinkflags) + env.append("CFLAGS", gmp_info.cflags) + env.vars(self).save_script("conanautotoolsdeps_cl_workaround") if is_msvc(self): env = Environment() From df808c9bfd578d33cc75045a4b55816d626900a9 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Sun, 21 Jan 2024 18:22:28 +0200 Subject: [PATCH 13/15] pbc: add MSVC ./configure workarounds --- recipes/pbc/all/conanfile.py | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/recipes/pbc/all/conanfile.py b/recipes/pbc/all/conanfile.py index 4bf1c9697cc3d..21ce3087badfc 100644 --- a/recipes/pbc/all/conanfile.py +++ b/recipes/pbc/all/conanfile.py @@ -4,7 +4,7 @@ from conan.tools.apple import XCRun, to_apple_arch from conan.tools.build import cross_building from conan.tools.env import VirtualBuildEnv, VirtualRunEnv, Environment -from conan.tools.files import apply_conandata_patches, copy, export_conandata_patches, get, rm, rmdir, chdir +from conan.tools.files import apply_conandata_patches, copy, export_conandata_patches, get, rm, rmdir, chdir, replace_in_file from conan.tools.gnu import Autotools, AutotoolsToolchain, AutotoolsDeps from conan.tools.layout import basic_layout from conan.tools.microsoft import is_msvc, unix_path @@ -101,7 +101,7 @@ def generate(self): env = Environment() env.append("CPPFLAGS", [f"-I{unix_path(self, p)}" for p in gmp_info.includedirs] + [f"-D{d}" for d in gmp_info.defines]) env.append("_LINK_", [lib if lib.endswith(".lib") else f"{lib}.lib" for lib in (gmp_info.libs + gmp_info.system_libs)]) - env.append("LDFLAGS", [f"-LIBPATH:{unix_path(self, p)}" for p in gmp_info.libdirs] + gmp_info.sharedlinkflags + gmp_info.exelinkflags) + env.append("LDFLAGS", [f"-L{unix_path(self, p)}" for p in gmp_info.libdirs] + gmp_info.sharedlinkflags + gmp_info.exelinkflags) env.append("CFLAGS", gmp_info.cflags) env.vars(self).save_script("conanautotoolsdeps_cl_workaround") @@ -116,11 +116,28 @@ def generate(self): env.define("NM", "dumpbin -symbols") env.vars(self).save_script("conanbuild_msvc") - def build(self): + def _patch_sources(self): apply_conandata_patches(self) + configure = os.path.join(self.source_folder, "configure") + # The check for bison/yacc is overly strict and fails for winflexbison + replace_in_file(self, configure, + 'if test "x$YACC" != "xbison -y"; then', + "if false; then") + if is_msvc(self): + # Skip -lm check + replace_in_file(self, configure, + 'if test "x$ac_cv_lib_m_pow" = xyes; then :', + "if true; then :") + replace_in_file(self, configure, 'LIBS="-lm $LIBS"', "") + + def build(self): + self._patch_sources() with chdir(self, self.source_folder): autotools = Autotools(self) autotools.configure() + if is_msvc(self): + # Drop GCC/Clang flags + replace_in_file(self, "Makefile", "CFLAGS = ", "CFLAGS = # ") autotools.make() def package(self): From 02d20c509ec5e170f1871e43661bdd278c1ffe27 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Sun, 21 Jan 2024 18:33:28 +0200 Subject: [PATCH 14/15] pbc: not compatible with MSVC due to use of GNU extensions --- recipes/pbc/all/conanfile.py | 72 +++++++----------------------------- 1 file changed, 13 insertions(+), 59 deletions(-) diff --git a/recipes/pbc/all/conanfile.py b/recipes/pbc/all/conanfile.py index 21ce3087badfc..286de8abee1c4 100644 --- a/recipes/pbc/all/conanfile.py +++ b/recipes/pbc/all/conanfile.py @@ -1,13 +1,14 @@ import os from conan import ConanFile +from conan.errors import ConanInvalidConfiguration from conan.tools.apple import XCRun, to_apple_arch from conan.tools.build import cross_building -from conan.tools.env import VirtualBuildEnv, VirtualRunEnv, Environment -from conan.tools.files import apply_conandata_patches, copy, export_conandata_patches, get, rm, rmdir, chdir, replace_in_file +from conan.tools.env import VirtualBuildEnv, VirtualRunEnv +from conan.tools.files import apply_conandata_patches, copy, export_conandata_patches, get, rm, rmdir, chdir from conan.tools.gnu import Autotools, AutotoolsToolchain, AutotoolsDeps from conan.tools.layout import basic_layout -from conan.tools.microsoft import is_msvc, unix_path +from conan.tools.microsoft import is_msvc required_conan_version = ">=1.53.0" @@ -32,10 +33,6 @@ class PbcConan(ConanFile): "fPIC": True, } - @property - def _settings_build(self): - return getattr(self, "settings_build", self.settings) - def export_sources(self): export_conandata_patches(self) @@ -55,17 +52,13 @@ def layout(self): def requirements(self): self.requires("gmp/6.3.0", transitive_headers=True, transitive_libs=True) + def validate(self): + if is_msvc(self): + raise ConanInvalidConfiguration("pbc is not compatible with MSVC due to use of GNU extensions") + def build_requirements(self): - if self._settings_build.os == "Windows": - self.win_bash = True - if not self.conf.get("tools.microsoft.bash:path", check_type=str): - self.tool_requires("msys2/cci.latest") - if is_msvc(self): - self.tool_requires("automake/1.16.5") - self.tool_requires("winflexbison/2.5.25") - else: - self.tool_requires("flex/2.6.4") - self.tool_requires("bison/3.8.2") + self.tool_requires("flex/2.6.4") + self.tool_requires("bison/3.8.2") def source(self): get(self, **self.conan_data["sources"][self.version], strip_root=True) @@ -91,53 +84,14 @@ def generate(self): tc.configure_args.append(f"CC={xcr.cc} -isysroot {xcr.sdk_path} -target {target} {min_ios}") tc.generate() - if not is_msvc(self): - deps = AutotoolsDeps(self) - deps.generate() - else: - # Custom AutotoolsDeps for cl like compilers - # workaround for https://github.com/conan-io/conan/issues/12784 - gmp_info = self.dependencies["gmp"].cpp_info - env = Environment() - env.append("CPPFLAGS", [f"-I{unix_path(self, p)}" for p in gmp_info.includedirs] + [f"-D{d}" for d in gmp_info.defines]) - env.append("_LINK_", [lib if lib.endswith(".lib") else f"{lib}.lib" for lib in (gmp_info.libs + gmp_info.system_libs)]) - env.append("LDFLAGS", [f"-L{unix_path(self, p)}" for p in gmp_info.libdirs] + gmp_info.sharedlinkflags + gmp_info.exelinkflags) - env.append("CFLAGS", gmp_info.cflags) - env.vars(self).save_script("conanautotoolsdeps_cl_workaround") - - if is_msvc(self): - env = Environment() - automake_conf = self.dependencies.build["automake"].conf_info - compile_wrapper = unix_path(self, automake_conf.get("user.automake:compile-wrapper", check_type=str)) - ar_wrapper = unix_path(self, automake_conf.get("user.automake:lib-wrapper", check_type=str)) - env.define("CC", f"{compile_wrapper} cl -nologo") - env.define("LD", "link -nologo") - env.define("AR", f"{ar_wrapper} \"lib -nologo\"") - env.define("NM", "dumpbin -symbols") - env.vars(self).save_script("conanbuild_msvc") - - def _patch_sources(self): - apply_conandata_patches(self) - configure = os.path.join(self.source_folder, "configure") - # The check for bison/yacc is overly strict and fails for winflexbison - replace_in_file(self, configure, - 'if test "x$YACC" != "xbison -y"; then', - "if false; then") - if is_msvc(self): - # Skip -lm check - replace_in_file(self, configure, - 'if test "x$ac_cv_lib_m_pow" = xyes; then :', - "if true; then :") - replace_in_file(self, configure, 'LIBS="-lm $LIBS"', "") + deps = AutotoolsDeps(self) + deps.generate() def build(self): - self._patch_sources() + apply_conandata_patches(self) with chdir(self, self.source_folder): autotools = Autotools(self) autotools.configure() - if is_msvc(self): - # Drop GCC/Clang flags - replace_in_file(self, "Makefile", "CFLAGS = ", "CFLAGS = # ") autotools.make() def package(self): From c2b8d645b970d559a1f836f5579a09fd412a332f Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Sun, 21 Jan 2024 19:35:23 +0200 Subject: [PATCH 15/15] pbc: fix_apple_shared_install_name() --- recipes/pbc/all/conanfile.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/recipes/pbc/all/conanfile.py b/recipes/pbc/all/conanfile.py index 286de8abee1c4..2de63fee00601 100644 --- a/recipes/pbc/all/conanfile.py +++ b/recipes/pbc/all/conanfile.py @@ -2,7 +2,7 @@ from conan import ConanFile from conan.errors import ConanInvalidConfiguration -from conan.tools.apple import XCRun, to_apple_arch +from conan.tools.apple import XCRun, to_apple_arch, fix_apple_shared_install_name from conan.tools.build import cross_building from conan.tools.env import VirtualBuildEnv, VirtualRunEnv from conan.tools.files import apply_conandata_patches, copy, export_conandata_patches, get, rm, rmdir, chdir @@ -101,6 +101,7 @@ def package(self): autotools.install() rmdir(self, os.path.join(self.package_folder, "share")) rm(self, "*.la", self.package_folder, recursive=True) + fix_apple_shared_install_name(self) def package_info(self): self.cpp_info.libs = ["pbc"]