From 3f7cbc61108ae6d52404c4f8f8970436985360b0 Mon Sep 17 00:00:00 2001 From: SpaceIm <30052553+SpaceIm@users.noreply.github.com> Date: Mon, 20 Feb 2023 15:22:56 +0100 Subject: [PATCH 01/47] conan v2 support --- recipes/nss/all/conanfile.py | 146 +++++++++--------- recipes/nss/all/test_package/CMakeLists.txt | 8 +- recipes/nss/all/test_package/conanfile.py | 20 ++- .../nss/all/test_v1_package/CMakeLists.txt | 8 + recipes/nss/all/test_v1_package/conanfile.py | 17 ++ 5 files changed, 118 insertions(+), 81 deletions(-) create mode 100644 recipes/nss/all/test_v1_package/CMakeLists.txt create mode 100644 recipes/nss/all/test_v1_package/conanfile.py diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index 6c0ff3efc96a7..13a18f6e59b90 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -1,14 +1,16 @@ from conan import ConanFile from conan.errors import ConanInvalidConfiguration -from conan.tools.microsoft import msvc_runtime_flag -from conan.tools.scm import Version -from conan.tools.files import apply_conandata_patches, get, chdir, rename, rm +from conan.tools.apple import fix_apple_shared_install_name from conan.tools.build import cross_building -from conans import tools +from conan.tools.env import VirtualBuildEnv, VirtualRunEnv +from conan.tools.files import chdir, copy, get, rename, rm +from conan.tools.microsoft import is_msvc, msvc_runtime_flag, VCVars +from conan.tools.scm import Version import os import glob -required_conan_version = ">=1.51.3" +required_conan_version = ">=1.53.0" + class NSSConan(ConanFile): name = "nss" @@ -17,39 +19,36 @@ class NSSConan(ConanFile): url = "https://github.com/conan-io/conan-center-index" description = "Network Security Services" topics = ("network", "security", "crypto", "ssl") - settings = "os", "compiler", "build_type", "arch" - options = {"shared": [True, False], "fPIC": [True, False]} - default_options = {"shared": True, "fPIC": True} - + package_type = "library" + settings = "os", "arch", "compiler", "build_type" + options = { + "shared": [True, False], + "fPIC": [True, False], + } + default_options = { + "shared": True, + "fPIC": True, + } @property - def _source_subfolder(self): - return "source_subfolder" + def _settings_build(self): + return getattr(self, "settings_build", self.settings) def config_options(self): if self.settings.os == "Windows": del self.options.fPIC - def build_requirements(self): - if self.settings.compiler == "Visual Studio" and not tools.get_env("CONAN_BASH_PATH"): - self.build_requires("msys2/cci.latest") - if self.settings.os == "Windows": - self.build_requires("mozilla-build/3.3") - if hasattr(self, "settings_build"): - self.build_requires("sqlite3/3.41.2") - def configure(self): + if self.options.shared: + self.options.rm_safe("fPIC") + self.settings.rm_safe("compiler.cppstd") + self.settings.rm_safe("compiler.libcxx") self.options["nspr"].shared = True self.options["sqlite3"].shared = True - if self.options.shared: - del self.options.fPIC - del self.settings.compiler.libcxx - del self.settings.compiler.cppstd - def requirements(self): self.requires("nspr/4.35") - self.requires("sqlite3/3.41.2") + self.requires("sqlite3/3.41.2", run=not cross_building(self)) self.requires("zlib/1.2.13") def validate(self): @@ -67,9 +66,27 @@ def validate(self): if self.settings.compiler == "clang" and Version(self.settings.compiler.version) >= 13: raise ConanInvalidConfiguration("nss < 3.74 requires clang < 13 .") + 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 self.settings.os == "Windows": + self.tool_requires("mozilla-build/3.3") + if cross_building(self): + self.build_requires("sqlite3/3.41.2") def source(self): - get(self, **self.conan_data["sources"][self.version], strip_root=True, destination=self._source_subfolder) + get(self, **self.conan_data["sources"][self.version], strip_root=True) + + def generate(self): + env = VirtualBuildEnv(self) + env.generate() + if not cross_building(self): + env = VirtualRunEnv(self) + env.generate(scope="build") + vc = VCVars(self) + vc.generate() @property def _make_args(self): @@ -85,8 +102,10 @@ def _make_args(self): args.append("CPU_ARCH=aarch64") if self.settings.compiler == "gcc": args.append("XCFLAGS=-Wno-array-parameter") - args.append("NSPR_INCLUDE_DIR=%s" % self.deps_cpp_info["nspr"].include_paths[1]) - args.append("NSPR_LIB_DIR=%s" % self.deps_cpp_info["nspr"].lib_paths[0]) + + nspr_cpp_info = self.dependencies["nspr"].cpp_info.aggregated_components() + args.append(f"NSPR_INCLUDE_DIR={nspr_cpp_info.includedirs[1]}") # very fragile !! + args.append(f"NSPR_LIB_DIR={nspr_cpp_info.libdirs[0]}") os_map = { "Linux": "Linux", @@ -99,43 +118,35 @@ def _make_args(self): args.append("OS_ARCH=%s" % os_map.get(str(self.settings.os), "UNSUPPORTED_OS")) if self.settings.build_type != "Debug": args.append("BUILD_OPT=1") - if self.settings.compiler == "Visual Studio": + if is_msvc(self): args.append("NSPR31_LIB_PREFIX=$(NULL)") args.append("USE_SYSTEM_ZLIB=1") - args.append("ZLIB_INCLUDE_DIR=%s" % self.deps_cpp_info["zlib"].include_paths[0]) - + zlib_cpp_info = self.dependencies["zlib"].cpp_info.aggregated_components() + args.append(f"ZLIB_INCLUDE_DIR={zlib_cpp_info.includedirs[0]}") - def adjust_path(path, settings): + def adjust_path(path): """ adjusts path to be safely passed to the compiler command line for Windows bash, ensures path is in format according to the subsystem for path with spaces, places double quotes around it converts slashes to backslashes, or vice versa """ - compiler = _base_compiler(settings) - if str(compiler) == 'Visual Studio': + if is_msvc(self): path = path.replace('/', '\\') else: path = path.replace('\\', '/') return '"%s"' % path if ' ' in path else path - def _base_compiler(settings): - return settings.get_safe("compiler.base") or settings.get_safe("compiler") - - def _format_library_paths(library_paths, settings): - compiler = _base_compiler(settings) - pattern = "-LIBPATH:%s" if str(compiler) == 'Visual Studio' else "-L%s" - return [pattern % adjust_path(library_path, settings) + def _format_library_paths(library_paths): + pattern = "-LIBPATH:%s" if is_msvc(self) else "-L%s" + return [pattern % adjust_path(library_path) for library_path in library_paths if library_path] - - def _format_libraries(libraries, settings): + def _format_libraries(libraries): result = [] - compiler = settings.get_safe("compiler") - compiler_base = settings.get_safe("compiler.base") for library in libraries: - if str(compiler) == 'Visual Studio' or str(compiler_base) == 'Visual Studio': + if is_msvc(self): if not library.endswith(".lib"): library += ".lib" result.append(library) @@ -143,40 +154,37 @@ def _format_libraries(libraries, settings): result.append(f"-l{library}") return result - args.append("\"ZLIB_LIBS=%s\"" % " ".join( - _format_libraries(self.deps_cpp_info["zlib"].libs, self.settings) + - _format_library_paths(self.deps_cpp_info["zlib"].lib_paths, self.settings))) + _format_libraries(zlib_cpp_info.libs) + + _format_library_paths(zlib_cpp_info.libdirs))) args.append("NSS_DISABLE_GTESTS=1") args.append("NSS_USE_SYSTEM_SQLITE=1") - args.append("SQLITE_INCLUDE_DIR=%s" % self.deps_cpp_info["sqlite3"].include_paths[0]) - args.append("SQLITE_LIB_DIR=%s" % self.deps_cpp_info["sqlite3"].lib_paths[0]) + sqlite3_cpp_info = self.dependencies["sqlite3"].cpp_info.aggregated_components() + args.append(f"SQLITE_INCLUDE_DIR={sqlite3_cpp_info.includedirs[0]}") + args.append(f"SQLITE_LIB_DIR={sqlite3_cpp_info.libdirs[0]}") args.append("NSDISTMODE=copy") if cross_building(self): args.append("CROSS_COMPILE=1") - return args - + return " ".join(args) def build(self): - apply_conandata_patches(self) - with chdir(self, os.path.join(self._source_subfolder, "nss")): - with tools.vcvars(self) if self.settings.compiler == "Visual Studio" else tools.no_op(): - self.run("make %s" % " ".join(self._make_args), run_environment=True) + with chdir(self, os.path.join(self.source_folder, "nss")): + self.run(f"make {self._make_args}") def package(self): - self.copy("COPYING", src = os.path.join(self._source_subfolder, "nss"), dst = "licenses") - with chdir(self, os.path.join(self._source_subfolder, "nss")): - self.run("make install %s" % " ".join(self._make_args)) - self.copy("*", - src=os.path.join(self._source_subfolder, "dist", "public", "nss"), - dst="include") - for d in os.listdir(os.path.join(self._source_subfolder, "dist")): - if d in ["private","public"]: + copy(self, "COPYING", src=os.path.join(self.source_folder, "nss"), dst=os.path.join(self.package_folder, "licenses")) + with chdir(self, os.path.join(self.source_folder, "nss")): + self.run(f"make install {self._make_args}") + copy(self, "*", + src=os.path.join(self.source_folder, "dist", "public", "nss"), + dst=os.path.join(self.package_folder, "include")) + for d in os.listdir(os.path.join(self.source_folder, "dist")): + if d in ["private", "public"]: continue - f = os.path.join(self._source_subfolder, "dist", d) + f = os.path.join(self.source_folder, "dist", d) if not os.path.isdir(f): continue - self.copy("*", src = f) + copy(self, "*", src=f, dst=self.package_folder) for dll_file in glob.glob(os.path.join(self.package_folder, "lib", "*.dll")): rename(self, dll_file, os.path.join(self.package_folder, "bin", os.path.basename(dll_file))) @@ -186,11 +194,9 @@ def package(self): else: rm(self, "*.so", os.path.join(self.package_folder, "lib")) rm(self, "*.dll", os.path.join(self.package_folder, "bin")) - - + fix_apple_shared_install_name(self) def package_info(self): - def _library_name(lib,vers): return f"{lib}{vers}" if self.options.shared else lib self.cpp_info.components["libnss"].libs.append(_library_name("nss", 3)) diff --git a/recipes/nss/all/test_package/CMakeLists.txt b/recipes/nss/all/test_package/CMakeLists.txt index ae0d9b4b934f7..654002f0d6ec2 100644 --- a/recipes/nss/all/test_package/CMakeLists.txt +++ b/recipes/nss/all/test_package/CMakeLists.txt @@ -1,9 +1,7 @@ cmake_minimum_required(VERSION 3.1) -project(test_package C) +project(test_package LANGUAGES C) -include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) -conan_basic_setup(TARGETS) +find_package(nss REQUIRED CONFIG) add_executable(${PROJECT_NAME} test_package.c) -target_link_libraries(${PROJECT_NAME} CONAN_PKG::nss) - +target_link_libraries(${PROJECT_NAME} PRIVATE nss::nss) diff --git a/recipes/nss/all/test_package/conanfile.py b/recipes/nss/all/test_package/conanfile.py index 6a9b925c476c6..0a6bc68712d90 100644 --- a/recipes/nss/all/test_package/conanfile.py +++ b/recipes/nss/all/test_package/conanfile.py @@ -1,18 +1,26 @@ -from conans import ConanFile, CMake, tools +from conan import ConanFile +from conan.tools.build import can_run +from conan.tools.cmake import CMake, cmake_layout import os class TestPackageConan(ConanFile): settings = "os", "arch", "compiler", "build_type" - generators = "cmake", "cmake_find_package" + generators = "CMakeToolchain", "CMakeDeps", "VirtualRunEnv" + test_type = "explicit" + + def layout(self): + cmake_layout(self) + + def requirements(self): + self.requires(self.tested_reference_str) 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) + if can_run(self): + bin_path = os.path.join(self.cpp.build.bindirs[0], "test_package") + self.run(bin_path, env="conanrun") diff --git a/recipes/nss/all/test_v1_package/CMakeLists.txt b/recipes/nss/all/test_v1_package/CMakeLists.txt new file mode 100644 index 0000000000000..0d20897301b68 --- /dev/null +++ b/recipes/nss/all/test_v1_package/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.1) +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/nss/all/test_v1_package/conanfile.py b/recipes/nss/all/test_v1_package/conanfile.py new file mode 100644 index 0000000000000..38f4483872d47 --- /dev/null +++ b/recipes/nss/all/test_v1_package/conanfile.py @@ -0,0 +1,17 @@ +from conans import ConanFile, CMake, tools +import os + + +class TestPackageConan(ConanFile): + settings = "os", "arch", "compiler", "build_type" + 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 49da2272914d94a0cbec9500f31c6b65cba89471 Mon Sep 17 00:00:00 2001 From: SpaceIm <30052553+spaceim@users.noreply.github.com> Date: Mon, 20 Feb 2023 15:22:56 +0100 Subject: [PATCH 02/47] nss: minor fixes for v2 support --- recipes/nss/all/conanfile.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index 13a18f6e59b90..56f9d4ed2cc92 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -47,18 +47,18 @@ def configure(self): self.options["sqlite3"].shared = True def requirements(self): - self.requires("nspr/4.35") - self.requires("sqlite3/3.41.2", run=not cross_building(self)) + self.requires("nspr/4.35", transitive_headers=True, transitive_libs=True) + self.requires("sqlite3/3.42.0", run=not cross_building(self)) self.requires("zlib/1.2.13") def validate(self): if not self.options.shared: raise ConanInvalidConfiguration("NSS recipe cannot yet build static library. Contributions are welcome.") - if not self.options["nspr"].shared: + if not self.dependencies["nspr"].options.shared: raise ConanInvalidConfiguration("NSS cannot link to static NSPR. Please use option nspr:shared=True") if msvc_runtime_flag(self) == "MTd": raise ConanInvalidConfiguration("NSS recipes does not support MTd runtime. Contributions are welcome.") - if not self.options["sqlite3"].shared: + if not self.dependencies["sqlite3"].options.shared: raise ConanInvalidConfiguration("NSS cannot link to static sqlite. Please use option sqlite3:shared=True") if self.settings.arch in ["armv8", "armv8.3"] and self.settings.os in ["Macos"]: raise ConanInvalidConfiguration("Macos ARM64 builds not yet supported. Contributions are welcome.") @@ -74,7 +74,7 @@ def build_requirements(self): if self.settings.os == "Windows": self.tool_requires("mozilla-build/3.3") if cross_building(self): - self.build_requires("sqlite3/3.41.2") + self.tool_requires("sqlite3/3.42.0") def source(self): get(self, **self.conan_data["sources"][self.version], strip_root=True) From 91efa255b1a5ef2f95ae04a15dd0fbb35ead0865 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Thu, 17 Aug 2023 23:30:33 +0300 Subject: [PATCH 03/47] nss: further minor fixes --- recipes/nss/all/test_package/CMakeLists.txt | 4 ++-- recipes/nss/all/test_package/conanfile.py | 2 +- recipes/nss/all/test_v1_package/CMakeLists.txt | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/recipes/nss/all/test_package/CMakeLists.txt b/recipes/nss/all/test_package/CMakeLists.txt index 654002f0d6ec2..72a30b22a18e1 100644 --- a/recipes/nss/all/test_package/CMakeLists.txt +++ b/recipes/nss/all/test_package/CMakeLists.txt @@ -1,5 +1,5 @@ -cmake_minimum_required(VERSION 3.1) -project(test_package LANGUAGES C) +cmake_minimum_required(VERSION 3.15) +project(test_package C) find_package(nss REQUIRED CONFIG) diff --git a/recipes/nss/all/test_package/conanfile.py b/recipes/nss/all/test_package/conanfile.py index 0a6bc68712d90..fafba71d30d56 100644 --- a/recipes/nss/all/test_package/conanfile.py +++ b/recipes/nss/all/test_package/conanfile.py @@ -22,5 +22,5 @@ def build(self): def test(self): if can_run(self): - bin_path = os.path.join(self.cpp.build.bindirs[0], "test_package") + bin_path = os.path.join(self.cpp.build.bindir, "test_package") self.run(bin_path, env="conanrun") diff --git a/recipes/nss/all/test_v1_package/CMakeLists.txt b/recipes/nss/all/test_v1_package/CMakeLists.txt index 0d20897301b68..b21cc49efde95 100644 --- a/recipes/nss/all/test_v1_package/CMakeLists.txt +++ b/recipes/nss/all/test_v1_package/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.1) +cmake_minimum_required(VERSION 3.15) project(test_package) include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) From abdf9c9fc33c70e9368b32e30221d168de1f3e8c Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Wed, 1 Nov 2023 15:22:10 +0200 Subject: [PATCH 04/47] nss: bump deps --- recipes/nss/all/conanfile.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index 56f9d4ed2cc92..1dc3cff94bd78 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -9,7 +9,7 @@ import os import glob -required_conan_version = ">=1.53.0" +required_conan_version = ">=1.60.0 <2.0 || >=2.0.6" class NSSConan(ConanFile): @@ -48,8 +48,8 @@ def configure(self): def requirements(self): self.requires("nspr/4.35", transitive_headers=True, transitive_libs=True) - self.requires("sqlite3/3.42.0", run=not cross_building(self)) - self.requires("zlib/1.2.13") + self.requires("sqlite3/3.43.2", run=not cross_building(self)) + self.requires("zlib/[>=1.2.11 <2]") def validate(self): if not self.options.shared: @@ -74,7 +74,7 @@ def build_requirements(self): if self.settings.os == "Windows": self.tool_requires("mozilla-build/3.3") if cross_building(self): - self.tool_requires("sqlite3/3.42.0") + self.tool_requires("sqlite3/") def source(self): get(self, **self.conan_data["sources"][self.version], strip_root=True) From df0db13b0d6bff0ef5d735b0e7c36abfc4db69af Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Thu, 2 Nov 2023 21:38:48 +0200 Subject: [PATCH 05/47] nss: tidy --- recipes/nss/all/conanfile.py | 89 +++++++++++++++++++----------------- 1 file changed, 47 insertions(+), 42 deletions(-) diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index 1dc3cff94bd78..d5ce4525d5f9f 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -90,41 +90,6 @@ def generate(self): @property def _make_args(self): - args = [] - if self.settings.arch in ["x86_64"]: - args.append("USE_64=1") - if self.settings.os == "Macos": - args.append("CPU_ARCH=i386") - else: - args.append("CPU_ARCH=x86_64") - if self.settings.arch in ["armv8", "armv8.3"]: - args.append("USE_64=1") - args.append("CPU_ARCH=aarch64") - if self.settings.compiler == "gcc": - args.append("XCFLAGS=-Wno-array-parameter") - - nspr_cpp_info = self.dependencies["nspr"].cpp_info.aggregated_components() - args.append(f"NSPR_INCLUDE_DIR={nspr_cpp_info.includedirs[1]}") # very fragile !! - args.append(f"NSPR_LIB_DIR={nspr_cpp_info.libdirs[0]}") - - os_map = { - "Linux": "Linux", - "Macos": "Darwin", - "Windows": "WINNT", - "FreeBSD": "FreeBSD" - } - - args.append("OS_TARGET=%s" % os_map.get(str(self.settings.os), "UNSUPPORTED_OS")) - args.append("OS_ARCH=%s" % os_map.get(str(self.settings.os), "UNSUPPORTED_OS")) - if self.settings.build_type != "Debug": - args.append("BUILD_OPT=1") - if is_msvc(self): - args.append("NSPR31_LIB_PREFIX=$(NULL)") - - args.append("USE_SYSTEM_ZLIB=1") - zlib_cpp_info = self.dependencies["zlib"].cpp_info.aggregated_components() - args.append(f"ZLIB_INCLUDE_DIR={zlib_cpp_info.includedirs[0]}") - def adjust_path(path): """ adjusts path to be safely passed to the compiler command line @@ -136,7 +101,7 @@ def adjust_path(path): path = path.replace('/', '\\') else: path = path.replace('\\', '/') - return '"%s"' % path if ' ' in path else path + return f'"{path}"' if ' ' in path else path def _format_library_paths(library_paths): pattern = "-LIBPATH:%s" if is_msvc(self) else "-L%s" @@ -154,17 +119,57 @@ def _format_libraries(libraries): result.append(f"-l{library}") return result - args.append("\"ZLIB_LIBS=%s\"" % " ".join( + args = [] + if self.settings.arch in ["x86_64"]: + args.append("USE_64=1") + if self.settings.os == "Macos": + args.append("CPU_ARCH=i386") + else: + args.append("CPU_ARCH=x86_64") + elif self.settings.arch in ["armv8", "armv8.3"]: + args.append("USE_64=1") + args.append("CPU_ARCH=aarch64") + + if cross_building(self): + args.append("CROSS_COMPILE=1") + + if self.settings.compiler == "gcc": + args.append("XCFLAGS=-Wno-array-parameter") + + nspr_root = self.dependencies["nspr"].package_folder + args.append(f"NSPR_INCLUDE_DIR={adjust_path(os.path.join(nspr_root, 'include', 'nspr'))}") + args.append(f"NSPR_LIB_DIR={adjust_path(os.path.join(nspr_root, 'lib'))}") + if is_msvc(self): + args.append("NSPR31_LIB_PREFIX=$(NULL)") + + os_id = { + "Linux": "Linux", + "Macos": "Darwin", + "Windows": "WINNT", + "FreeBSD": "FreeBSD", + }.get(str(self.settings.os), 'UNSUPPORTED_OS') + args.append(f"OS_TARGET={os_id}") + args.append(f"OS_ARCH={os_id}") + + if self.settings.build_type != "Debug": + args.append("BUILD_OPT=1") + + args.append("USE_SYSTEM_ZLIB=1") + zlib_cpp_info = self.dependencies["zlib"].cpp_info.aggregated_components() + args.append(f"ZLIB_INCLUDE_DIR={zlib_cpp_info.includedir}") + args.append('"ZLIB_LIBS=%s"' % " ".join( _format_libraries(zlib_cpp_info.libs) + - _format_library_paths(zlib_cpp_info.libdirs))) + _format_library_paths(zlib_cpp_info.libdirs) + )) + args.append("NSS_DISABLE_GTESTS=1") + args.append("NSS_USE_SYSTEM_SQLITE=1") sqlite3_cpp_info = self.dependencies["sqlite3"].cpp_info.aggregated_components() - args.append(f"SQLITE_INCLUDE_DIR={sqlite3_cpp_info.includedirs[0]}") - args.append(f"SQLITE_LIB_DIR={sqlite3_cpp_info.libdirs[0]}") + args.append(f"SQLITE_INCLUDE_DIR={sqlite3_cpp_info.includedir}") + args.append(f"SQLITE_LIB_DIR={sqlite3_cpp_info.libdir}") + args.append("NSDISTMODE=copy") - if cross_building(self): - args.append("CROSS_COMPILE=1") return " ".join(args) def build(self): From f9e98c980d7be6db135a4633a394e9537b39c167 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Thu, 2 Nov 2023 22:05:14 +0200 Subject: [PATCH 06/47] nss: disable MSVC Fails with ../../coreconf/rules.mk:164: *** multiple target patterns. Stop. make[2]: *** [../coreconf/rules.mk:44: bltest] Error 2 make[1]: *** [coreconf/rules.mk:44: cmd] Error 2 make: *** [manifest.mn:26: prepare_build] Error 2 And even the existing recipe fails with make[3]: *** No rule to make target '../certhigh/WINNT10.0-22621_x86_64_64_OPT.OBJ/certhtml.obj', needed by 'WINNT3.4.5.x86_64_x86_64_64_OPT.OBJ/nss3.dll'. Stop. on MSVC 193 for me. --- recipes/nss/all/conanfile.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index d5ce4525d5f9f..e6c39f9d1407d 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -64,7 +64,10 @@ def validate(self): raise ConanInvalidConfiguration("Macos ARM64 builds not yet supported. Contributions are welcome.") if Version(self.version) < "3.74": if self.settings.compiler == "clang" and Version(self.settings.compiler.version) >= 13: - raise ConanInvalidConfiguration("nss < 3.74 requires clang < 13 .") + raise ConanInvalidConfiguration("nss < 3.74 requires clang < 13.") + if is_msvc(self): + # https://c3i.jfrog.io/c3i/misc/summary.html?json=https://c3i.jfrog.io/c3i/misc/logs/pr/19262/4-windows-visual_studio/nss/3.89/summary.json + raise ConanInvalidConfiguration("MSVC is currently not supported. Contributions are welcome.") def build_requirements(self): if self._settings_build.os == "Windows": From 5f3ef9dcaf39482d7354b93d5506aca8890e911c Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Sun, 26 Nov 2023 22:09:39 +0200 Subject: [PATCH 07/47] nss: bump sqlite3 Co-authored-by: Matthieu Darbois --- recipes/nss/all/conanfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index e6c39f9d1407d..321588d65c28f 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -48,7 +48,7 @@ def configure(self): def requirements(self): self.requires("nspr/4.35", transitive_headers=True, transitive_libs=True) - self.requires("sqlite3/3.43.2", run=not cross_building(self)) + self.requires("sqlite3/3.44.2", run=not cross_building(self)) self.requires("zlib/[>=1.2.11 <2]") def validate(self): From 01776f9a687a9d6812e7423a75209795fe3d90d9 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Mon, 27 Nov 2023 18:09:18 +0200 Subject: [PATCH 08/47] nss: drop cross_building(self) check from sqlite3 --- recipes/nss/all/conanfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index 321588d65c28f..029c73b11d453 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -48,7 +48,7 @@ def configure(self): def requirements(self): self.requires("nspr/4.35", transitive_headers=True, transitive_libs=True) - self.requires("sqlite3/3.44.2", run=not cross_building(self)) + self.requires("sqlite3/3.44.2", run=True) self.requires("zlib/[>=1.2.11 <2]") def validate(self): From 9528a93af346a9741c3d5e32490dba420084c52c Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Mon, 27 Nov 2023 18:14:43 +0200 Subject: [PATCH 09/47] nss: set package_type to static-library, do not set shared for deps --- recipes/nss/all/conanfile.py | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index 029c73b11d453..61bddcc348b2f 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -1,6 +1,6 @@ from conan import ConanFile from conan.errors import ConanInvalidConfiguration -from conan.tools.apple import fix_apple_shared_install_name +from conan.tools.apple import fix_apple_shared_install_name, is_apple_os from conan.tools.build import cross_building from conan.tools.env import VirtualBuildEnv, VirtualRunEnv from conan.tools.files import chdir, copy, get, rename, rm @@ -19,14 +19,13 @@ class NSSConan(ConanFile): url = "https://github.com/conan-io/conan-center-index" description = "Network Security Services" topics = ("network", "security", "crypto", "ssl") - package_type = "library" + + package_type = "static-library" settings = "os", "arch", "compiler", "build_type" options = { - "shared": [True, False], "fPIC": [True, False], } default_options = { - "shared": True, "fPIC": True, } @@ -39,12 +38,8 @@ def config_options(self): del self.options.fPIC def configure(self): - if self.options.shared: - self.options.rm_safe("fPIC") self.settings.rm_safe("compiler.cppstd") self.settings.rm_safe("compiler.libcxx") - self.options["nspr"].shared = True - self.options["sqlite3"].shared = True def requirements(self): self.requires("nspr/4.35", transitive_headers=True, transitive_libs=True) @@ -52,15 +47,13 @@ def requirements(self): self.requires("zlib/[>=1.2.11 <2]") def validate(self): - if not self.options.shared: - raise ConanInvalidConfiguration("NSS recipe cannot yet build static library. Contributions are welcome.") - if not self.dependencies["nspr"].options.shared: - raise ConanInvalidConfiguration("NSS cannot link to static NSPR. Please use option nspr:shared=True") if msvc_runtime_flag(self) == "MTd": raise ConanInvalidConfiguration("NSS recipes does not support MTd runtime. Contributions are welcome.") + if not self.dependencies["nspr"].options.shared: + raise ConanInvalidConfiguration("NSS cannot link to static NSPR. Please use option nspr:shared=True") if not self.dependencies["sqlite3"].options.shared: raise ConanInvalidConfiguration("NSS cannot link to static sqlite. Please use option sqlite3:shared=True") - if self.settings.arch in ["armv8", "armv8.3"] and self.settings.os in ["Macos"]: + if self.settings.arch in ["armv8", "armv8.3"] and is_apple_os(self): raise ConanInvalidConfiguration("Macos ARM64 builds not yet supported. Contributions are welcome.") if Version(self.version) < "3.74": if self.settings.compiler == "clang" and Version(self.settings.compiler.version) >= 13: @@ -197,16 +190,14 @@ def package(self): for dll_file in glob.glob(os.path.join(self.package_folder, "lib", "*.dll")): rename(self, dll_file, os.path.join(self.package_folder, "bin", os.path.basename(dll_file))) - if self.options.shared: - rm(self, "*.a", os.path.join(self.package_folder, "lib")) - else: - rm(self, "*.so", os.path.join(self.package_folder, "lib")) - rm(self, "*.dll", os.path.join(self.package_folder, "bin")) + rm(self, "*.so", os.path.join(self.package_folder, "lib")) + rm(self, "*.dll", os.path.join(self.package_folder, "bin")) fix_apple_shared_install_name(self) def package_info(self): def _library_name(lib,vers): - return f"{lib}{vers}" if self.options.shared else lib + # return f"{lib}{vers}" if self.options.shared else lib + return lib self.cpp_info.components["libnss"].libs.append(_library_name("nss", 3)) self.cpp_info.components["libnss"].requires = ["nssutil", "nspr::nspr"] From 3675da7adb59731bbec0ddff8caf842d239ef183 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Sat, 23 Mar 2024 22:29:43 +0200 Subject: [PATCH 10/47] nss: bump sqlite3 --- recipes/nss/all/conanfile.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index 61bddcc348b2f..92571e8cd55f3 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -43,7 +43,7 @@ def configure(self): def requirements(self): self.requires("nspr/4.35", transitive_headers=True, transitive_libs=True) - self.requires("sqlite3/3.44.2", run=True) + self.requires("sqlite3/3.45.2", run=True) self.requires("zlib/[>=1.2.11 <2]") def validate(self): @@ -68,7 +68,7 @@ def build_requirements(self): if not self.conf.get("tools.microsoft.bash:path", check_type=str): self.tool_requires("msys2/cci.latest") if self.settings.os == "Windows": - self.tool_requires("mozilla-build/3.3") + self.tool_requires("mozilla-build/4.0.2") if cross_building(self): self.tool_requires("sqlite3/") From d654257a1f1405a51c6f3a0270d695d575e0f9ad Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Sat, 23 Mar 2024 23:10:10 +0200 Subject: [PATCH 11/47] nss: drop old versions --- recipes/nss/all/conandata.yml | 27 --------------------------- recipes/nss/all/conanfile.py | 4 ---- recipes/nss/config.yml | 18 ------------------ 3 files changed, 49 deletions(-) diff --git a/recipes/nss/all/conandata.yml b/recipes/nss/all/conandata.yml index f10905ebbaa04..0f633a75cf7a4 100644 --- a/recipes/nss/all/conandata.yml +++ b/recipes/nss/all/conandata.yml @@ -11,30 +11,3 @@ sources: "3.89": url: "https://ftp.mozilla.org/pub/security/nss/releases/NSS_3_89_RTM/src/nss-3.89.tar.gz" sha256: "55c37a3f4da010d0574fb8b39264cb1e7b4ce9e6c2954c1c7ecf9f41ee00bed5" - "3.88.1": - url: "https://ftp.mozilla.org/pub/security/nss/releases/NSS_3_88_1_RTM/src/nss-3.88.1.tar.gz" - sha256: "27d243edf87d1cf1bb9c861f03d387e0e9230ce5017f4308c941f558b54b3496" - "3.87": - url: "https://ftp.mozilla.org/pub/security/nss/releases/NSS_3_87_RTM/src/nss-3.87.tar.gz" - sha256: "68a1894496d3d158babc75f8a5dda3f55b7c1560573936e3b101a10fa4ac152d" - "3.86": - url: "https://ftp.mozilla.org/pub/security/nss/releases/NSS_3_86_RTM/src/nss-3.86.tar.gz" - sha256: "3f385fc686476bbba811035fa6821b542475d55747b18c20c221d4d66573b975" - "3.85": - url: "https://ftp.mozilla.org/pub/security/nss/releases/NSS_3_85_RTM/src/nss-3.85.tar.gz" - sha256: "afd9d64510b1154debbd6cab3571e9ff64a3373898e03483e4c85cdada13d297" - "3.84": - url: "https://ftp.mozilla.org/pub/security/nss/releases/NSS_3_84_RTM/src/nss-3.84.tar.gz" - sha256: "9a387ffe350ff14f001d943f96cc0c064891551d71e1a97a5ddbffe7f1207a25" - "3.83": - url: "https://ftp.mozilla.org/pub/security/nss/releases/NSS_3_83_RTM/src/nss-3.83.tar.gz" - sha256: "ab23ea67f964090b8b73c80a674082571c36e5f4eba92057ac648c9c1def0128" - "3.77": - url: "https://ftp.mozilla.org/pub/security/nss/releases/NSS_3_77_RTM/src/nss-3.77.tar.gz" - sha256: "825edf5a2fd35b788a23ff80face591f82919ae3ad2b8f77d424a450d618dedd" - "3.76.1": - url: "https://ftp.mozilla.org/pub/security/nss/releases/NSS_3_76_1_RTM/src/nss-3.76.1.tar.gz" - sha256: "e13104c374e2e1d7890d8f6bc18d0f18eb886ed4dbad4144d1c482f2983d232a" - "3.72": - url: "https://ftp.mozilla.org/pub/security/nss/releases/NSS_3_72_RTM/src/nss-3.72.tar.gz" - sha256: "6ea60a9ff113e493ea2ab25f41ea75a9fbd10af7903f26f703dac8680732d02e" diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index 92571e8cd55f3..4f123e50e4248 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -5,7 +5,6 @@ from conan.tools.env import VirtualBuildEnv, VirtualRunEnv from conan.tools.files import chdir, copy, get, rename, rm from conan.tools.microsoft import is_msvc, msvc_runtime_flag, VCVars -from conan.tools.scm import Version import os import glob @@ -55,9 +54,6 @@ def validate(self): raise ConanInvalidConfiguration("NSS cannot link to static sqlite. Please use option sqlite3:shared=True") if self.settings.arch in ["armv8", "armv8.3"] and is_apple_os(self): raise ConanInvalidConfiguration("Macos ARM64 builds not yet supported. Contributions are welcome.") - if Version(self.version) < "3.74": - if self.settings.compiler == "clang" and Version(self.settings.compiler.version) >= 13: - raise ConanInvalidConfiguration("nss < 3.74 requires clang < 13.") if is_msvc(self): # https://c3i.jfrog.io/c3i/misc/summary.html?json=https://c3i.jfrog.io/c3i/misc/logs/pr/19262/4-windows-visual_studio/nss/3.89/summary.json raise ConanInvalidConfiguration("MSVC is currently not supported. Contributions are welcome.") diff --git a/recipes/nss/config.yml b/recipes/nss/config.yml index 82fff1e6a41ec..3665a07d0962b 100644 --- a/recipes/nss/config.yml +++ b/recipes/nss/config.yml @@ -7,21 +7,3 @@ versions: folder: all "3.89": folder: all - "3.88.1": - folder: all - "3.87": - folder: all - "3.86": - folder: all - "3.85": - folder: all - "3.84": - folder: all - "3.83": - folder: all - "3.77": - folder: all - "3.76.1": - folder: all - "3.72": - folder: all From 7df341842f46c00547647f6fb5f7812468a8f28b Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Mon, 25 Mar 2024 14:21:43 +0200 Subject: [PATCH 12/47] nss: add v3.99 --- recipes/nss/all/conandata.yml | 3 +++ recipes/nss/config.yml | 2 ++ 2 files changed, 5 insertions(+) diff --git a/recipes/nss/all/conandata.yml b/recipes/nss/all/conandata.yml index 0f633a75cf7a4..349bd490cbaf6 100644 --- a/recipes/nss/all/conandata.yml +++ b/recipes/nss/all/conandata.yml @@ -1,4 +1,7 @@ sources: + "3.99": + url: "https://ftp.mozilla.org/pub/security/nss/releases/NSS_3_99_RTM/src/nss-3.99.tar.gz" + sha256: "5cd5c2c8406a376686e6fa4b9c2de38aa280bea07bf927c0d521ba07c88b09bd" "3.93": url: "https://ftp.mozilla.org/pub/security/nss/releases/NSS_3_93_RTM/src/nss-3.93.tar.gz" sha256: "15f54bb72048eb105f8c0e936a04b899e74c3db9a19bbc1e00acee2af9476a8a" diff --git a/recipes/nss/config.yml b/recipes/nss/config.yml index 3665a07d0962b..dd1df39e358a1 100644 --- a/recipes/nss/config.yml +++ b/recipes/nss/config.yml @@ -1,4 +1,6 @@ versions: + "3.99": + folder: all "3.93": folder: all "3.92": From 9b5c543e0380848c666ef1aea1eb9a6e4a9c92bc Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Tue, 26 Mar 2024 10:00:40 +0200 Subject: [PATCH 13/47] nss: set shared=True for deps where necessary --- recipes/nss/all/conanfile.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index 4f123e50e4248..7a3515b4a14ce 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -39,6 +39,8 @@ def config_options(self): def configure(self): self.settings.rm_safe("compiler.cppstd") self.settings.rm_safe("compiler.libcxx") + self.options["nspr"].shared = True + self.options["sqlite3"].shared = True def requirements(self): self.requires("nspr/4.35", transitive_headers=True, transitive_libs=True) From cd4cbf5ce61bebd782532e7d957b2f0b938b4612 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Tue, 26 Mar 2024 10:02:43 +0200 Subject: [PATCH 14/47] nss: allow MSVC builds --- recipes/nss/all/conanfile.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index 7a3515b4a14ce..a7fdfd5ce02a2 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -56,9 +56,6 @@ def validate(self): raise ConanInvalidConfiguration("NSS cannot link to static sqlite. Please use option sqlite3:shared=True") if self.settings.arch in ["armv8", "armv8.3"] and is_apple_os(self): raise ConanInvalidConfiguration("Macos ARM64 builds not yet supported. Contributions are welcome.") - if is_msvc(self): - # https://c3i.jfrog.io/c3i/misc/summary.html?json=https://c3i.jfrog.io/c3i/misc/logs/pr/19262/4-windows-visual_studio/nss/3.89/summary.json - raise ConanInvalidConfiguration("MSVC is currently not supported. Contributions are welcome.") def build_requirements(self): if self._settings_build.os == "Windows": From b0ff870e1d1c6d4e8705571dbe439a20d3d247b0 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Tue, 26 Mar 2024 10:11:11 +0200 Subject: [PATCH 15/47] nss: use a generator for make args --- recipes/nss/all/conanfile.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index a7fdfd5ce02a2..d79fd40ff2f45 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -4,6 +4,7 @@ from conan.tools.build import cross_building from conan.tools.env import VirtualBuildEnv, VirtualRunEnv from conan.tools.files import chdir, copy, get, rename, rm +from conan.tools.gnu import AutotoolsToolchain, Autotools from conan.tools.microsoft import is_msvc, msvc_runtime_flag, VCVars import os import glob @@ -79,8 +80,6 @@ def generate(self): vc = VCVars(self) vc.generate() - @property - def _make_args(self): def adjust_path(path): """ adjusts path to be safely passed to the compiler command line @@ -110,6 +109,7 @@ def _format_libraries(libraries): result.append(f"-l{library}") return result + tc = AutotoolsToolchain(self) args = [] if self.settings.arch in ["x86_64"]: args.append("USE_64=1") @@ -138,7 +138,7 @@ def _format_libraries(libraries): "Macos": "Darwin", "Windows": "WINNT", "FreeBSD": "FreeBSD", - }.get(str(self.settings.os), 'UNSUPPORTED_OS') + }.get(str(self.settings.os), "UNSUPPORTED_OS") args.append(f"OS_TARGET={os_id}") args.append(f"OS_ARCH={os_id}") @@ -148,7 +148,7 @@ def _format_libraries(libraries): args.append("USE_SYSTEM_ZLIB=1") zlib_cpp_info = self.dependencies["zlib"].cpp_info.aggregated_components() args.append(f"ZLIB_INCLUDE_DIR={zlib_cpp_info.includedir}") - args.append('"ZLIB_LIBS=%s"' % " ".join( + args.append("ZLIB_LIBS=%s" % " ".join( _format_libraries(zlib_cpp_info.libs) + _format_library_paths(zlib_cpp_info.libdirs) )) @@ -161,16 +161,21 @@ def _format_libraries(libraries): args.append(f"SQLITE_LIB_DIR={sqlite3_cpp_info.libdir}") args.append("NSDISTMODE=copy") - return " ".join(args) + + tc.make_args += args + tc.generate() + def build(self): with chdir(self, os.path.join(self.source_folder, "nss")): - self.run(f"make {self._make_args}") + autotools = Autotools(self) + autotools.make() def package(self): copy(self, "COPYING", src=os.path.join(self.source_folder, "nss"), dst=os.path.join(self.package_folder, "licenses")) with chdir(self, os.path.join(self.source_folder, "nss")): - self.run(f"make install {self._make_args}") + autotools = Autotools(self) + autotools.install() copy(self, "*", src=os.path.join(self.source_folder, "dist", "public", "nss"), dst=os.path.join(self.package_folder, "include")) From 770600ec476ac51e58888c09c2c0793406f8b243 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Tue, 26 Mar 2024 10:41:18 +0200 Subject: [PATCH 16/47] nss: switch to gyp-based build, rework components --- recipes/nss/all/conanfile.py | 231 +++++++------------- recipes/nss/all/test_package/test_package.c | 9 +- 2 files changed, 90 insertions(+), 150 deletions(-) diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index d79fd40ff2f45..9b020ee630eb4 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -1,13 +1,13 @@ +import os + from conan import ConanFile from conan.errors import ConanInvalidConfiguration -from conan.tools.apple import fix_apple_shared_install_name, is_apple_os +from conan.tools.apple import fix_apple_shared_install_name from conan.tools.build import cross_building -from conan.tools.env import VirtualBuildEnv, VirtualRunEnv -from conan.tools.files import chdir, copy, get, rename, rm -from conan.tools.gnu import AutotoolsToolchain, Autotools -from conan.tools.microsoft import is_msvc, msvc_runtime_flag, VCVars -import os -import glob +from conan.tools.env import VirtualBuildEnv, VirtualRunEnv, Environment +from conan.tools.files import chdir, copy, get, rm +from conan.tools.layout import basic_layout +from conan.tools.microsoft import is_msvc, VCVars required_conan_version = ">=1.60.0 <2.0 || >=2.0.6" @@ -20,7 +20,7 @@ class NSSConan(ConanFile): description = "Network Security Services" topics = ("network", "security", "crypto", "ssl") - package_type = "static-library" + package_type = "shared-library" settings = "os", "arch", "compiler", "build_type" options = { "fPIC": [True, False], @@ -33,30 +33,25 @@ class NSSConan(ConanFile): def _settings_build(self): return getattr(self, "settings_build", self.settings) - def config_options(self): - if self.settings.os == "Windows": - del self.options.fPIC - def configure(self): self.settings.rm_safe("compiler.cppstd") self.settings.rm_safe("compiler.libcxx") self.options["nspr"].shared = True self.options["sqlite3"].shared = True + def layout(self): + basic_layout(self, src_folder="src") + def requirements(self): self.requires("nspr/4.35", transitive_headers=True, transitive_libs=True) self.requires("sqlite3/3.45.2", run=True) self.requires("zlib/[>=1.2.11 <2]") def validate(self): - if msvc_runtime_flag(self) == "MTd": - raise ConanInvalidConfiguration("NSS recipes does not support MTd runtime. Contributions are welcome.") if not self.dependencies["nspr"].options.shared: raise ConanInvalidConfiguration("NSS cannot link to static NSPR. Please use option nspr:shared=True") if not self.dependencies["sqlite3"].options.shared: raise ConanInvalidConfiguration("NSS cannot link to static sqlite. Please use option sqlite3:shared=True") - if self.settings.arch in ["armv8", "armv8.3"] and is_apple_os(self): - raise ConanInvalidConfiguration("Macos ARM64 builds not yet supported. Contributions are welcome.") def build_requirements(self): if self._settings_build.os == "Windows": @@ -67,10 +62,16 @@ def build_requirements(self): self.tool_requires("mozilla-build/4.0.2") if cross_building(self): self.tool_requires("sqlite3/") + self.tool_requires("cpython/3.10.0") + self.tool_requires("ninja/1.11.1") def source(self): get(self, **self.conan_data["sources"][self.version], strip_root=True) + @property + def _site_packages_dir(self): + return os.path.join(self.build_folder, "site-packages") + def generate(self): env = VirtualBuildEnv(self) env.generate() @@ -80,150 +81,88 @@ def generate(self): vc = VCVars(self) vc.generate() - def adjust_path(path): - """ - adjusts path to be safely passed to the compiler command line - for Windows bash, ensures path is in format according to the subsystem - for path with spaces, places double quotes around it - converts slashes to backslashes, or vice versa - """ - if is_msvc(self): - path = path.replace('/', '\\') - else: - path = path.replace('\\', '/') - return f'"{path}"' if ' ' in path else path - - def _format_library_paths(library_paths): - pattern = "-LIBPATH:%s" if is_msvc(self) else "-L%s" - return [pattern % adjust_path(library_path) - for library_path in library_paths if library_path] - - def _format_libraries(libraries): - result = [] - for library in libraries: - if is_msvc(self): - if not library.endswith(".lib"): - library += ".lib" - result.append(library) - else: - result.append(f"-l{library}") - return result - - tc = AutotoolsToolchain(self) + # add PYTHONPATH for gyp-next + env = Environment() + env.prepend_path("PYTHONPATH", self._site_packages_dir) + env.prepend_path("PATH", os.path.join(self._site_packages_dir, "bin")) + env.vars(self, scope="build").save_script("conan_site_packages") + + @property + def _build_args(self): + # https://github.com/nss-dev/nss/blob/master/help.txt args = [] - if self.settings.arch in ["x86_64"]: - args.append("USE_64=1") - if self.settings.os == "Macos": - args.append("CPU_ARCH=i386") - else: - args.append("CPU_ARCH=x86_64") + # if self.settings.compiler == "gcc": + # args.append("XCFLAGS=-Wno-array-parameter") + args.append("--disable-tests") + if self.settings.build_type != "Debug": + args.append("--opt") + if self.settings.arch == "x86_64": + args.append("--target=x64") + elif self.settings.arch == "x86": + args.append("--target=ia32") elif self.settings.arch in ["armv8", "armv8.3"]: - args.append("USE_64=1") - args.append("CPU_ARCH=aarch64") - - if cross_building(self): - args.append("CROSS_COMPILE=1") - - if self.settings.compiler == "gcc": - args.append("XCFLAGS=-Wno-array-parameter") - - nspr_root = self.dependencies["nspr"].package_folder - args.append(f"NSPR_INCLUDE_DIR={adjust_path(os.path.join(nspr_root, 'include', 'nspr'))}") - args.append(f"NSPR_LIB_DIR={adjust_path(os.path.join(nspr_root, 'lib'))}") + args.append("--target=aarch64") if is_msvc(self): - args.append("NSPR31_LIB_PREFIX=$(NULL)") - - os_id = { - "Linux": "Linux", - "Macos": "Darwin", - "Windows": "WINNT", - "FreeBSD": "FreeBSD", - }.get(str(self.settings.os), "UNSUPPORTED_OS") - args.append(f"OS_TARGET={os_id}") - args.append(f"OS_ARCH={os_id}") - - if self.settings.build_type != "Debug": - args.append("BUILD_OPT=1") - - args.append("USE_SYSTEM_ZLIB=1") - zlib_cpp_info = self.dependencies["zlib"].cpp_info.aggregated_components() - args.append(f"ZLIB_INCLUDE_DIR={zlib_cpp_info.includedir}") - args.append("ZLIB_LIBS=%s" % " ".join( - _format_libraries(zlib_cpp_info.libs) + - _format_library_paths(zlib_cpp_info.libdirs) - )) - - args.append("NSS_DISABLE_GTESTS=1") - - args.append("NSS_USE_SYSTEM_SQLITE=1") - sqlite3_cpp_info = self.dependencies["sqlite3"].cpp_info.aggregated_components() - args.append(f"SQLITE_INCLUDE_DIR={sqlite3_cpp_info.includedir}") - args.append(f"SQLITE_LIB_DIR={sqlite3_cpp_info.libdir}") - - args.append("NSDISTMODE=copy") - - tc.make_args += args - tc.generate() - + args.append("--msvc") + if not self.options.get_safe("shared", True): + args.append("--static") + nspr_root = self.dependencies["nspr"].package_folder + nspr_includedir = os.path.join(nspr_root, "include", "nspr").replace("\\", "/") + nspr_libdir = os.path.join(nspr_root, "lib").replace("\\", "/") + args.append(f"--with-nspr={nspr_includedir}:{nspr_libdir}") + args.append("--enable-legacy-db") # for libnssdbm3 + return args def build(self): + # install gyp-next + self.run(f"python -m pip install gyp-next --no-cache-dir --target={self._site_packages_dir}") + self.run("gyp --version") + with chdir(self, os.path.join(self.source_folder, "nss")): - autotools = Autotools(self) - autotools.make() + self.run(f"./build.sh {' '.join(self._build_args)}") def package(self): copy(self, "COPYING", src=os.path.join(self.source_folder, "nss"), dst=os.path.join(self.package_folder, "licenses")) - with chdir(self, os.path.join(self.source_folder, "nss")): - autotools = Autotools(self) - autotools.install() copy(self, "*", - src=os.path.join(self.source_folder, "dist", "public", "nss"), - dst=os.path.join(self.package_folder, "include")) - for d in os.listdir(os.path.join(self.source_folder, "dist")): - if d in ["private", "public"]: - continue - f = os.path.join(self.source_folder, "dist", d) - if not os.path.isdir(f): - continue - copy(self, "*", src=f, dst=self.package_folder) - - for dll_file in glob.glob(os.path.join(self.package_folder, "lib", "*.dll")): - rename(self, dll_file, os.path.join(self.package_folder, "bin", os.path.basename(dll_file))) - - rm(self, "*.so", os.path.join(self.package_folder, "lib")) - rm(self, "*.dll", os.path.join(self.package_folder, "bin")) + src=os.path.join(self.source_folder, "dist", "public"), + dst=os.path.join(self.package_folder, "include")) + dist_dir = os.path.join(self.source_folder, "dist", "Debug" if self.settings.build_type == "Debug" else "Release") + copy(self, "*", os.path.join(dist_dir, "bin"), os.path.join(self.package_folder, "bin")) + for pattern in ["*.a", "*.lib", "*.so", "*.dylib"]: + copy(self, pattern, os.path.join(dist_dir, "lib"), os.path.join(self.package_folder, "lib")) + copy(self, "*.dll", os.path.join(dist_dir, "lib"), os.path.join(self.package_folder, "bin")) + if not self.options.get_safe("shared", True): + rm(self, "*.so", os.path.join(self.package_folder, "lib")) + rm(self, "*.dll", os.path.join(self.package_folder, "bin")) fix_apple_shared_install_name(self) def package_info(self): - def _library_name(lib,vers): - # return f"{lib}{vers}" if self.options.shared else lib - return lib - self.cpp_info.components["libnss"].libs.append(_library_name("nss", 3)) - self.cpp_info.components["libnss"].requires = ["nssutil", "nspr::nspr"] - - self.cpp_info.components["nssutil"].libs = [_library_name("nssutil", 3)] + # Since the project exports over 30 static and 13 shared libraries with + # complex interdependencies and without an any .pc files, + # we will rely on the .pc files created by Fedora + # https://src.fedoraproject.org/rpms/nss/tree/rawhide + # and Debian + # https://salsa.debian.org/mozilla-team/nss/-/tree/master/debian + # instead to keep things sane. + + self.cpp_info.set_property("pkg_config_name", "_nss") + + # https://src.fedoraproject.org/rpms/nss/blob/rawhide/f/nss-util.pc.in + self.cpp_info.components["nssutil"].set_property("pkg_config_name", "nss-util") + self.cpp_info.components["nssutil"].libs = ["nssutil3"] + self.cpp_info.components["nssutil"].includedirs.append(os.path.join("include", "nss")) self.cpp_info.components["nssutil"].requires = ["nspr::nspr"] - if self.settings.os in ["Linux", "FreeBSD"]: - self.cpp_info.components["nssutil"].system_libs = ["pthread"] - - self.cpp_info.components["softokn"].libs = [_library_name("softokn", 3)] - self.cpp_info.components["softokn"].requires = ["sqlite3::sqlite3", "nssutil", "nspr::nspr"] - if self.settings.os in ["Linux", "FreeBSD"]: - self.cpp_info.components["softokn"].system_libs = ["pthread"] - - self.cpp_info.components["nssdbm"].libs = [_library_name("nssdbm", 3)] - self.cpp_info.components["nssdbm"].requires = ["nspr::nspr", "nssutil"] - if self.settings.os in ["Linux", "FreeBSD"]: - self.cpp_info.components["nssdbm"].system_libs = ["pthread"] - - self.cpp_info.components["smime"].libs = [_library_name("smime", 3)] - self.cpp_info.components["smime"].requires = ["nspr::nspr", "libnss", "nssutil"] - self.cpp_info.components["ssl"].libs = [_library_name("ssl", 3)] - self.cpp_info.components["ssl"].requires = ["nspr::nspr", "libnss", "nssutil"] - if self.settings.os in ["Linux", "FreeBSD"]: - self.cpp_info.components["ssl"].system_libs = ["pthread"] + # https://src.fedoraproject.org/rpms/nss/blob/rawhide/f/nss.pc.in + self.cpp_info.components["libnss"].set_property("pkg_config_name", "nss") + self.cpp_info.components["libnss"].libs = ["ssl3", "smime3", "nss3"] + self.cpp_info.components["libnss"].includedirs.append(os.path.join("include", "nss")) + self.cpp_info.components["libnss"].requires = ["nspr::nspr", "nssutil"] - self.cpp_info.components["nss_executables"].requires = ["zlib::zlib"] + # https://src.fedoraproject.org/rpms/nss/blob/rawhide/f/nss-softokn.pc.in + self.cpp_info.components["softokn"].set_property("pkg_config_name", "nss-softokn") + self.cpp_info.components["softokn"].libs = ["freebl3", "nssdbm3", "softokn3"] + self.cpp_info.components["softokn"].includedirs.append(os.path.join("include", "nss")) + self.cpp_info.components["softokn"].requires = ["nspr::nspr", "nssutil"] - self.cpp_info.set_property("pkg_config_name", "nss") + self.cpp_info.components["nss_executables"].requires = ["zlib::zlib", "nspr::nspr", "sqlite3::sqlite3"] diff --git a/recipes/nss/all/test_package/test_package.c b/recipes/nss/all/test_package/test_package.c index ade30c972dd62..fb8401438f8d8 100644 --- a/recipes/nss/all/test_package/test_package.c +++ b/recipes/nss/all/test_package/test_package.c @@ -1,7 +1,8 @@ -#include "nss.h" -#include "nssutil.h" -#include "smime.h" -#include "ssl.h" +#include +#include +#include +#include + #include int main() { From cd960960431cc5b50e547140f5b908019186a8d7 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Tue, 26 Mar 2024 14:38:58 +0200 Subject: [PATCH 17/47] nss: inject dependencies --- recipes/nss/all/conanfile.py | 65 +++++++++++++++++++++++++++++++++--- 1 file changed, 60 insertions(+), 5 deletions(-) diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index 9b020ee630eb4..8679903fa689c 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -5,7 +5,7 @@ from conan.tools.apple import fix_apple_shared_install_name from conan.tools.build import cross_building from conan.tools.env import VirtualBuildEnv, VirtualRunEnv, Environment -from conan.tools.files import chdir, copy, get, rm +from conan.tools.files import chdir, copy, get, rm, replace_in_file from conan.tools.layout import basic_layout from conan.tools.microsoft import is_msvc, VCVars @@ -87,6 +87,52 @@ def generate(self): env.prepend_path("PATH", os.path.join(self._site_packages_dir, "bin")) env.vars(self, scope="build").save_script("conan_site_packages") + def _patch_sources(self): + def adjust_path(path): + """ + adjusts path to be safely passed to the compiler command line + for Windows bash, ensures path is in format according to the subsystem + for path with spaces, places double quotes around it + converts slashes to backslashes, or vice versa + """ + if is_msvc(self): + path = path.replace('/', '\\') + else: + path = path.replace('\\', '/') + return f'"{path}"' if ' ' in path else path + + def _format_library_paths(library_paths): + pattern = "-LIBPATH:%s" if is_msvc(self) else "-L%s" + return [pattern % adjust_path(library_path) + for library_path in library_paths if library_path] + + def _format_libraries(libraries): + result = [] + for library in libraries: + if is_msvc(self): + if not library.endswith(".lib"): + library += ".lib" + result.append(library) + else: + result.append(f"-l{library}") + return result + + sqlite_info = self.dependencies["sqlite3"].cpp_info.aggregated_components() + sqlite_flags = " ".join([f"-I{sqlite_info.includedir}"] + + _format_libraries(sqlite_info.libs) + + _format_library_paths(sqlite_info.libdirs)) + replace_in_file(self, os.path.join(self.source_folder, "nss", "lib", "sqlite", "sqlite.gyp"), + "'libraries': ['<(sqlite_libs)'],", + f"'libraries': ['{sqlite_flags}'],") + + zlib_info = self.dependencies["zlib"].cpp_info.aggregated_components() + zlib_flags = " ".join([f"-I{zlib_info.includedir}"] + + _format_libraries(zlib_info.libs) + + _format_library_paths(zlib_info.libdirs)) + replace_in_file(self, os.path.join(self.source_folder, "nss", "lib", "zlib", "zlib.gyp"), + "'libraries': ['<@(zlib_libs)'],", + f"'libraries': ['{zlib_flags}'],") + @property def _build_args(self): # https://github.com/nss-dev/nss/blob/master/help.txt @@ -110,10 +156,12 @@ def _build_args(self): nspr_includedir = os.path.join(nspr_root, "include", "nspr").replace("\\", "/") nspr_libdir = os.path.join(nspr_root, "lib").replace("\\", "/") args.append(f"--with-nspr={nspr_includedir}:{nspr_libdir}") + args.append("--system-sqlite") args.append("--enable-legacy-db") # for libnssdbm3 return args def build(self): + self._patch_sources() # install gyp-next self.run(f"python -m pip install gyp-next --no-cache-dir --target={self._site_packages_dir}") self.run("gyp --version") @@ -134,16 +182,17 @@ def package(self): if not self.options.get_safe("shared", True): rm(self, "*.so", os.path.join(self.package_folder, "lib")) rm(self, "*.dll", os.path.join(self.package_folder, "bin")) + else: + rm(self, "*.a", os.path.join(self.package_folder, "lib")) fix_apple_shared_install_name(self) def package_info(self): - # Since the project exports over 30 static and 13 shared libraries with - # complex interdependencies and without an any .pc files, + # Since the project does not export any .pc files, # we will rely on the .pc files created by Fedora # https://src.fedoraproject.org/rpms/nss/tree/rawhide # and Debian # https://salsa.debian.org/mozilla-team/nss/-/tree/master/debian - # instead to keep things sane. + # instead. self.cpp_info.set_property("pkg_config_name", "_nss") @@ -152,17 +201,23 @@ def package_info(self): self.cpp_info.components["nssutil"].libs = ["nssutil3"] self.cpp_info.components["nssutil"].includedirs.append(os.path.join("include", "nss")) self.cpp_info.components["nssutil"].requires = ["nspr::nspr"] + if self.settings.os in ["Linux", "FreeBSD"]: + self.cpp_info.components["nssutil"].system_libs = ["pthread", "dl"] # https://src.fedoraproject.org/rpms/nss/blob/rawhide/f/nss.pc.in self.cpp_info.components["libnss"].set_property("pkg_config_name", "nss") self.cpp_info.components["libnss"].libs = ["ssl3", "smime3", "nss3"] self.cpp_info.components["libnss"].includedirs.append(os.path.join("include", "nss")) self.cpp_info.components["libnss"].requires = ["nspr::nspr", "nssutil"] + if self.settings.os in ["Linux", "FreeBSD"]: + self.cpp_info.components["libnss"].system_libs = ["pthread", "dl"] # https://src.fedoraproject.org/rpms/nss/blob/rawhide/f/nss-softokn.pc.in self.cpp_info.components["softokn"].set_property("pkg_config_name", "nss-softokn") self.cpp_info.components["softokn"].libs = ["freebl3", "nssdbm3", "softokn3"] self.cpp_info.components["softokn"].includedirs.append(os.path.join("include", "nss")) - self.cpp_info.components["softokn"].requires = ["nspr::nspr", "nssutil"] + self.cpp_info.components["softokn"].requires = ["nspr::nspr", "sqlite3::sqlite3", "nssutil"] + if self.settings.os in ["Linux", "FreeBSD"]: + self.cpp_info.components["softokn"].system_libs = ["pthread", "dl"] self.cpp_info.components["nss_executables"].requires = ["zlib::zlib", "nspr::nspr", "sqlite3::sqlite3"] From 26f1c9c41de287b02f5ef5b4b83f71896e489c6a Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Tue, 26 Mar 2024 14:40:48 +0200 Subject: [PATCH 18/47] nss: downgrade sqlite3 for cpython --- recipes/nss/all/conanfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index 8679903fa689c..f7bc6ddca2a86 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -44,7 +44,7 @@ def layout(self): def requirements(self): self.requires("nspr/4.35", transitive_headers=True, transitive_libs=True) - self.requires("sqlite3/3.45.2", run=True) + self.requires("sqlite3/3.45.0", run=True) self.requires("zlib/[>=1.2.11 <2]") def validate(self): From 424b7046aab582af10e9e5ce2f7b014f39e73a55 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Wed, 27 Mar 2024 13:30:36 +0200 Subject: [PATCH 19/47] nss: adjust LD_LIBRARY_PATH for build --- recipes/nss/all/conanfile.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index f7bc6ddca2a86..789db0e3fe52c 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -72,6 +72,11 @@ def source(self): def _site_packages_dir(self): return os.path.join(self.build_folder, "site-packages") + @property + def _dist_dir(self): + # location for installed lib/ and bin/ subdirs + return os.path.join(self.source_folder, "dist", "Debug" if self.settings.build_type == "Debug" else "Release") + def generate(self): env = VirtualBuildEnv(self) env.generate() @@ -81,11 +86,13 @@ def generate(self): vc = VCVars(self) vc.generate() - # add PYTHONPATH for gyp-next env = Environment() + # Add temporary site-packages to PYTHONPATH for gyp-next env.prepend_path("PYTHONPATH", self._site_packages_dir) env.prepend_path("PATH", os.path.join(self._site_packages_dir, "bin")) - env.vars(self, scope="build").save_script("conan_site_packages") + # For 'shlibsign -v -i /lib/libfreebl3.so' etc to work during build + env.prepend_path("LD_LIBRARY_PATH", os.path.join(self._dist_dir, "lib")) + env.vars(self, scope="build").save_script("conan_paths") def _patch_sources(self): def adjust_path(path): @@ -174,11 +181,10 @@ def package(self): copy(self, "*", src=os.path.join(self.source_folder, "dist", "public"), dst=os.path.join(self.package_folder, "include")) - dist_dir = os.path.join(self.source_folder, "dist", "Debug" if self.settings.build_type == "Debug" else "Release") - copy(self, "*", os.path.join(dist_dir, "bin"), os.path.join(self.package_folder, "bin")) + copy(self, "*", os.path.join(self._dist_dir, "bin"), os.path.join(self.package_folder, "bin")) for pattern in ["*.a", "*.lib", "*.so", "*.dylib"]: - copy(self, pattern, os.path.join(dist_dir, "lib"), os.path.join(self.package_folder, "lib")) - copy(self, "*.dll", os.path.join(dist_dir, "lib"), os.path.join(self.package_folder, "bin")) + copy(self, pattern, os.path.join(self._dist_dir, "lib"), os.path.join(self.package_folder, "lib")) + copy(self, "*.dll", os.path.join(self._dist_dir, "lib"), os.path.join(self.package_folder, "bin")) if not self.options.get_safe("shared", True): rm(self, "*.so", os.path.join(self.package_folder, "lib")) rm(self, "*.dll", os.path.join(self.package_folder, "bin")) From b0506a10f210b55fec6b584975c790e5999c60e1 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Wed, 27 Mar 2024 13:50:16 +0200 Subject: [PATCH 20/47] nss: do not hide shlibsign errors --- recipes/nss/all/conanfile.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index 789db0e3fe52c..68c556cdb8b7c 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -140,6 +140,10 @@ def _format_libraries(libraries): "'libraries': ['<@(zlib_libs)'],", f"'libraries': ['{zlib_flags}'],") + # Do not hide shlibsign errors in subprocess.check_call() + replace_in_file(self, os.path.join(self.source_folder, "nss", "coreconf", "shlibsign.py"), + ", stdout=dev_null, stderr=dev_null", "") + @property def _build_args(self): # https://github.com/nss-dev/nss/blob/master/help.txt From 55ce5e963e19d7be8b3568b8f078d56ee6de91f6 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Mon, 27 May 2024 23:31:56 +0300 Subject: [PATCH 21/47] nss: keep only the latest version, bump deps --- recipes/nss/all/conandata.yml | 18 +++--------------- recipes/nss/all/conanfile.py | 6 +++--- recipes/nss/config.yml | 10 +--------- 3 files changed, 7 insertions(+), 27 deletions(-) diff --git a/recipes/nss/all/conandata.yml b/recipes/nss/all/conandata.yml index 349bd490cbaf6..5568e1fc051a3 100644 --- a/recipes/nss/all/conandata.yml +++ b/recipes/nss/all/conandata.yml @@ -1,16 +1,4 @@ sources: - "3.99": - url: "https://ftp.mozilla.org/pub/security/nss/releases/NSS_3_99_RTM/src/nss-3.99.tar.gz" - sha256: "5cd5c2c8406a376686e6fa4b9c2de38aa280bea07bf927c0d521ba07c88b09bd" - "3.93": - url: "https://ftp.mozilla.org/pub/security/nss/releases/NSS_3_93_RTM/src/nss-3.93.tar.gz" - sha256: "15f54bb72048eb105f8c0e936a04b899e74c3db9a19bbc1e00acee2af9476a8a" - "3.92": - url: "https://ftp.mozilla.org/pub/security/nss/releases/NSS_3_92_RTM/src/nss-3.92.tar.gz" - sha256: "3db192d6e882039af02ae7eaf3217ed114bb7ad83414c646772ab8021e24a254" - "3.91": - url: "https://ftp.mozilla.org/pub/security/nss/releases/NSS_3_91_RTM/src/nss-3.91.tar.gz" - sha256: "84bd46376df17118c55f6d73d30fd93a0af21296c66e7690471547e5898fc4b3" - "3.89": - url: "https://ftp.mozilla.org/pub/security/nss/releases/NSS_3_89_RTM/src/nss-3.89.tar.gz" - sha256: "55c37a3f4da010d0574fb8b39264cb1e7b4ce9e6c2954c1c7ecf9f41ee00bed5" + "3.100": + url: "https://ftp.mozilla.org/pub/security/nss/releases/NSS_3_100_RTM/src/nss-3.100.tar.gz" + sha256: "1e35373ce9cb5b776f678bb341b0625c437520d09ebd91d1abd622e072e38d88" diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index 68c556cdb8b7c..37ea4bd8411e5 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -44,7 +44,7 @@ def layout(self): def requirements(self): self.requires("nspr/4.35", transitive_headers=True, transitive_libs=True) - self.requires("sqlite3/3.45.0", run=True) + self.requires("sqlite3/3.46.0", run=True) self.requires("zlib/[>=1.2.11 <2]") def validate(self): @@ -62,8 +62,8 @@ def build_requirements(self): self.tool_requires("mozilla-build/4.0.2") if cross_building(self): self.tool_requires("sqlite3/") - self.tool_requires("cpython/3.10.0") - self.tool_requires("ninja/1.11.1") + self.tool_requires("cpython/3.12.2") + self.tool_requires("ninja/1.12.1") def source(self): get(self, **self.conan_data["sources"][self.version], strip_root=True) diff --git a/recipes/nss/config.yml b/recipes/nss/config.yml index dd1df39e358a1..65d4204c528e2 100644 --- a/recipes/nss/config.yml +++ b/recipes/nss/config.yml @@ -1,11 +1,3 @@ versions: - "3.99": - folder: all - "3.93": - folder: all - "3.92": - folder: all - "3.91": - folder: all - "3.89": + "3.100": folder: all From 64c86d045a83a0dce61bff4ce78d07e83da5ab2e Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Mon, 27 May 2024 23:35:41 +0300 Subject: [PATCH 22/47] nss: pin gyp-next --- recipes/nss/all/conanfile.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index 37ea4bd8411e5..fcc55aec5e805 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -62,7 +62,8 @@ def build_requirements(self): self.tool_requires("mozilla-build/4.0.2") if cross_building(self): self.tool_requires("sqlite3/") - self.tool_requires("cpython/3.12.2") + # gyp is not compatible with Python 3.12 + self.tool_requires("cpython/3.11.9") self.tool_requires("ninja/1.12.1") def source(self): @@ -174,7 +175,7 @@ def _build_args(self): def build(self): self._patch_sources() # install gyp-next - self.run(f"python -m pip install gyp-next --no-cache-dir --target={self._site_packages_dir}") + self.run(f"python -m pip install gyp-next==0.18.0 --no-cache-dir --target={self._site_packages_dir}") self.run("gyp --version") with chdir(self, os.path.join(self.source_folder, "nss")): From 16a09811a9a3ad2c86d4626b00e93a32d28fbe6f Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Mon, 15 Jul 2024 18:07:22 +0300 Subject: [PATCH 23/47] nss: downgrade sqlite3 --- recipes/nss/all/conanfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index fcc55aec5e805..41525e9f920fe 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -44,7 +44,7 @@ def layout(self): def requirements(self): self.requires("nspr/4.35", transitive_headers=True, transitive_libs=True) - self.requires("sqlite3/3.46.0", run=True) + self.requires("sqlite3/3.45.2", run=True) self.requires("zlib/[>=1.2.11 <2]") def validate(self): From 32bd3c51c3aa0f06f992da44918dcf2433f570e6 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Sun, 18 Aug 2024 11:36:10 +0300 Subject: [PATCH 24/47] nss: bump to v3.103 --- recipes/nss/all/conandata.yml | 6 +++--- recipes/nss/config.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/recipes/nss/all/conandata.yml b/recipes/nss/all/conandata.yml index 5568e1fc051a3..f3d01fae58815 100644 --- a/recipes/nss/all/conandata.yml +++ b/recipes/nss/all/conandata.yml @@ -1,4 +1,4 @@ sources: - "3.100": - url: "https://ftp.mozilla.org/pub/security/nss/releases/NSS_3_100_RTM/src/nss-3.100.tar.gz" - sha256: "1e35373ce9cb5b776f678bb341b0625c437520d09ebd91d1abd622e072e38d88" + "3.103": + url: "https://ftp.mozilla.org/pub/security/nss/releases/NSS_3_103_RTM/src/nss-3.103.tar.gz" + sha256: "7b4ab657f772dc7520c46e8d481940b292dcfc6a4c90150a7c26672384cee962" diff --git a/recipes/nss/config.yml b/recipes/nss/config.yml index 65d4204c528e2..1b18d316c91e9 100644 --- a/recipes/nss/config.yml +++ b/recipes/nss/config.yml @@ -1,3 +1,3 @@ versions: - "3.100": + "3.103": folder: all From b7c20e479c8419c507a44d6389264e40b6a38c13 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Sun, 18 Aug 2024 11:37:01 +0300 Subject: [PATCH 25/47] nss: bump tool deps --- recipes/nss/all/conanfile.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index 41525e9f920fe..d232741db8d10 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -63,8 +63,8 @@ def build_requirements(self): if cross_building(self): self.tool_requires("sqlite3/") # gyp is not compatible with Python 3.12 - self.tool_requires("cpython/3.11.9") - self.tool_requires("ninja/1.12.1") + self.tool_requires("cpython/3.12.2") + self.tool_requires("ninja/[>=1.10.2 <2]") def source(self): get(self, **self.conan_data["sources"][self.version], strip_root=True) From db7e6795be8960a318b93b416b91fda55d5392cc Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Sun, 18 Aug 2024 11:43:48 +0300 Subject: [PATCH 26/47] nss: tweak pip install --- recipes/nss/all/conanfile.py | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index d232741db8d10..4441a1349cdb2 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -69,15 +69,6 @@ def build_requirements(self): def source(self): get(self, **self.conan_data["sources"][self.version], strip_root=True) - @property - def _site_packages_dir(self): - return os.path.join(self.build_folder, "site-packages") - - @property - def _dist_dir(self): - # location for installed lib/ and bin/ subdirs - return os.path.join(self.source_folder, "dist", "Debug" if self.settings.build_type == "Debug" else "Release") - def generate(self): env = VirtualBuildEnv(self) env.generate() @@ -95,6 +86,19 @@ def generate(self): env.prepend_path("LD_LIBRARY_PATH", os.path.join(self._dist_dir, "lib")) env.vars(self, scope="build").save_script("conan_paths") + @property + def _dist_dir(self): + # location for installed lib/ and bin/ subdirs + dist_subdir = "Debug" if self.settings.build_type == "Debug" else "Release" + return os.path.join(self.source_folder, "dist", dist_subdir) + + @property + def _site_packages_dir(self): + return os.path.join(self.build_folder, "site-packages") + + def _pip_install(self, packages): + self.run(f"python -m pip install {' '.join(packages)} --no-cache-dir --target={self._site_packages_dir}") + def _patch_sources(self): def adjust_path(path): """ @@ -174,8 +178,7 @@ def _build_args(self): def build(self): self._patch_sources() - # install gyp-next - self.run(f"python -m pip install gyp-next==0.18.0 --no-cache-dir --target={self._site_packages_dir}") + self._pip_install(["gyp-next"]) self.run("gyp --version") with chdir(self, os.path.join(self.source_folder, "nss")): From a074668da1c79e14199125035f96bcc54bcb06ac Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Sun, 18 Aug 2024 15:48:51 +0300 Subject: [PATCH 27/47] nss: make sure shlibsign's .so dependencies are found via VirtualRunEnv --- recipes/nss/all/conanfile.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index 4441a1349cdb2..179bd01f43878 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -72,9 +72,8 @@ def source(self): def generate(self): env = VirtualBuildEnv(self) env.generate() - if not cross_building(self): - env = VirtualRunEnv(self) - env.generate(scope="build") + env = VirtualRunEnv(self) + env.generate(scope="build") vc = VCVars(self) vc.generate() From 0ac589547c315a30f5d0f0802a5cf20282078319 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Mon, 9 Sep 2024 23:42:27 +0300 Subject: [PATCH 28/47] nss: bump to v3.104 --- recipes/nss/all/conandata.yml | 6 +++--- recipes/nss/config.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/recipes/nss/all/conandata.yml b/recipes/nss/all/conandata.yml index f3d01fae58815..0211be8103de3 100644 --- a/recipes/nss/all/conandata.yml +++ b/recipes/nss/all/conandata.yml @@ -1,4 +1,4 @@ sources: - "3.103": - url: "https://ftp.mozilla.org/pub/security/nss/releases/NSS_3_103_RTM/src/nss-3.103.tar.gz" - sha256: "7b4ab657f772dc7520c46e8d481940b292dcfc6a4c90150a7c26672384cee962" + "3.104": + url: "https://ftp.mozilla.org/pub/security/nss/releases/NSS_3_104_RTM/src/nss-3.104.tar.gz" + sha256: "e2763223622d1e76b98a43030873856f248af0a41b03b2fa2ca06a91bc50ac8e" diff --git a/recipes/nss/config.yml b/recipes/nss/config.yml index 1b18d316c91e9..32675b672432b 100644 --- a/recipes/nss/config.yml +++ b/recipes/nss/config.yml @@ -1,3 +1,3 @@ versions: - "3.103": + "3.104": folder: all From 36b77333372bbfe4965dba05cc83723a98dc1045 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Tue, 10 Sep 2024 00:38:04 +0300 Subject: [PATCH 29/47] nss: fix Python paths on MSYS2 --- recipes/nss/all/conanfile.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index 179bd01f43878..c594da557547e 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -62,7 +62,6 @@ def build_requirements(self): self.tool_requires("mozilla-build/4.0.2") if cross_building(self): self.tool_requires("sqlite3/") - # gyp is not compatible with Python 3.12 self.tool_requires("cpython/3.12.2") self.tool_requires("ninja/[>=1.10.2 <2]") @@ -80,6 +79,7 @@ def generate(self): env = Environment() # Add temporary site-packages to PYTHONPATH for gyp-next env.prepend_path("PYTHONPATH", self._site_packages_dir) + env.prepend_path("PYTHONPATH", self._site_packages_dir.replace("\\", "/")) env.prepend_path("PATH", os.path.join(self._site_packages_dir, "bin")) # For 'shlibsign -v -i /lib/libfreebl3.so' etc to work during build env.prepend_path("LD_LIBRARY_PATH", os.path.join(self._dist_dir, "lib")) @@ -96,7 +96,8 @@ def _site_packages_dir(self): return os.path.join(self.build_folder, "site-packages") def _pip_install(self, packages): - self.run(f"python -m pip install {' '.join(packages)} --no-cache-dir --target={self._site_packages_dir}") + site_packages_dir = self._site_packages_dir.replace("\\", "/") + self.run(f"python -m pip install {' '.join(packages)} --no-cache-dir --target={site_packages_dir}",) def _patch_sources(self): def adjust_path(path): @@ -178,7 +179,7 @@ def _build_args(self): def build(self): self._patch_sources() self._pip_install(["gyp-next"]) - self.run("gyp --version") + self.run(f"gyp --version") with chdir(self, os.path.join(self.source_folder, "nss")): self.run(f"./build.sh {' '.join(self._build_args)}") From 93201399fb8de51e234d6fa90433a67fdfeb750f Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Tue, 10 Sep 2024 01:28:21 +0300 Subject: [PATCH 30/47] nss: fix MSVC build --- recipes/nss/all/conanfile.py | 52 +++++++++++++++--------------------- 1 file changed, 21 insertions(+), 31 deletions(-) diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index c594da557547e..d601fef8481c6 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -7,7 +7,7 @@ from conan.tools.env import VirtualBuildEnv, VirtualRunEnv, Environment from conan.tools.files import chdir, copy, get, rm, replace_in_file from conan.tools.layout import basic_layout -from conan.tools.microsoft import is_msvc, VCVars +from conan.tools.microsoft import is_msvc, VCVars, unix_path required_conan_version = ">=1.60.0 <2.0 || >=2.0.6" @@ -22,12 +22,6 @@ class NSSConan(ConanFile): package_type = "shared-library" settings = "os", "arch", "compiler", "build_type" - options = { - "fPIC": [True, False], - } - default_options = { - "fPIC": True, - } @property def _settings_build(self): @@ -60,6 +54,8 @@ def build_requirements(self): self.tool_requires("msys2/cci.latest") if self.settings.os == "Windows": self.tool_requires("mozilla-build/4.0.2") + if is_msvc(self): + self.tool_requires("vswhere/3.1.7") if cross_building(self): self.tool_requires("sqlite3/") self.tool_requires("cpython/3.12.2") @@ -79,7 +75,9 @@ def generate(self): env = Environment() # Add temporary site-packages to PYTHONPATH for gyp-next env.prepend_path("PYTHONPATH", self._site_packages_dir) - env.prepend_path("PYTHONPATH", self._site_packages_dir.replace("\\", "/")) + if self.settings.os == "Windows": + # An additional forward-slash path is needed for MSYS2 bash + env.prepend_path("PYTHONPATH", self._site_packages_dir.replace("\\", "/")) env.prepend_path("PATH", os.path.join(self._site_packages_dir, "bin")) # For 'shlibsign -v -i /lib/libfreebl3.so' etc to work during build env.prepend_path("LD_LIBRARY_PATH", os.path.join(self._dist_dir, "lib")) @@ -100,51 +98,43 @@ def _pip_install(self, packages): self.run(f"python -m pip install {' '.join(packages)} --no-cache-dir --target={site_packages_dir}",) def _patch_sources(self): - def adjust_path(path): - """ - adjusts path to be safely passed to the compiler command line - for Windows bash, ensures path is in format according to the subsystem - for path with spaces, places double quotes around it - converts slashes to backslashes, or vice versa - """ - if is_msvc(self): - path = path.replace('/', '\\') - else: - path = path.replace('\\', '/') - return f'"{path}"' if ' ' in path else path - def _format_library_paths(library_paths): - pattern = "-LIBPATH:%s" if is_msvc(self) else "-L%s" - return [pattern % adjust_path(library_path) + flag = "-LIBPATH:" if is_msvc(self) else "-L" + return [flag + unix_path(self, library_path) for library_path in library_paths if library_path] - def _format_libraries(libraries): + def _format_libraries(libraries, libdir): result = [] for library in libraries: if is_msvc(self): if not library.endswith(".lib"): library += ".lib" - result.append(library) + result.append(os.path.join(libdir, library).replace("\\", "/")) else: result.append(f"-l{library}") return result sqlite_info = self.dependencies["sqlite3"].cpp_info.aggregated_components() - sqlite_flags = " ".join([f"-I{sqlite_info.includedir}"] + - _format_libraries(sqlite_info.libs) + + sqlite_flags = " ".join([f"-I{unix_path(self, sqlite_info.includedir)}"] + + _format_libraries(sqlite_info.libs, sqlite_info.libdir) + _format_library_paths(sqlite_info.libdirs)) replace_in_file(self, os.path.join(self.source_folder, "nss", "lib", "sqlite", "sqlite.gyp"), "'libraries': ['<(sqlite_libs)'],", f"'libraries': ['{sqlite_flags}'],") zlib_info = self.dependencies["zlib"].cpp_info.aggregated_components() - zlib_flags = " ".join([f"-I{zlib_info.includedir}"] + - _format_libraries(zlib_info.libs) + + zlib_flags = " ".join([f"-I{unix_path(self, zlib_info.includedir)}"] + + _format_libraries(zlib_info.libs, zlib_info.libdir) + _format_library_paths(zlib_info.libdirs)) replace_in_file(self, os.path.join(self.source_folder, "nss", "lib", "zlib", "zlib.gyp"), "'libraries': ['<@(zlib_libs)'],", f"'libraries': ['{zlib_flags}'],") + # NSPR Windows libs on CCI don't include a lib prefix + replace_in_file(self, os.path.join(self.source_folder, "nss", "coreconf", "config.gypi"), + "'nspr_libs%': ['libnspr4.lib', 'libplc4.lib', 'libplds4.lib'],", + "'nspr_libs%': ['nspr4.lib', 'plc4.lib', 'plds4.lib'],") + # Do not hide shlibsign errors in subprocess.check_call() replace_in_file(self, os.path.join(self.source_folder, "nss", "coreconf", "shlibsign.py"), ", stdout=dev_null, stderr=dev_null", "") @@ -169,8 +159,8 @@ def _build_args(self): if not self.options.get_safe("shared", True): args.append("--static") nspr_root = self.dependencies["nspr"].package_folder - nspr_includedir = os.path.join(nspr_root, "include", "nspr").replace("\\", "/") - nspr_libdir = os.path.join(nspr_root, "lib").replace("\\", "/") + nspr_includedir = unix_path(self, os.path.join(nspr_root, "include", "nspr")) + nspr_libdir = unix_path(self, os.path.join(nspr_root, "lib")) args.append(f"--with-nspr={nspr_includedir}:{nspr_libdir}") args.append("--system-sqlite") args.append("--enable-legacy-db") # for libnssdbm3 From 527aca5df0a0d7dc7b40b229bcc24c71ac4d94f3 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Thu, 10 Oct 2024 15:47:21 +0300 Subject: [PATCH 31/47] nss: skip vswhere for now, bump cpython --- recipes/nss/all/conanfile.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index d601fef8481c6..bea5cd4ab992b 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -54,11 +54,9 @@ def build_requirements(self): self.tool_requires("msys2/cci.latest") if self.settings.os == "Windows": self.tool_requires("mozilla-build/4.0.2") - if is_msvc(self): - self.tool_requires("vswhere/3.1.7") if cross_building(self): self.tool_requires("sqlite3/") - self.tool_requires("cpython/3.12.2") + self.tool_requires("cpython/3.12.7") self.tool_requires("ninja/[>=1.10.2 <2]") def source(self): From 9a906e423f0fff20cbd3be5428ea8ba03c5a7851 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Thu, 10 Oct 2024 15:47:37 +0300 Subject: [PATCH 32/47] nss: add a fix for shlibsign.py --- recipes/nss/all/conanfile.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index bea5cd4ab992b..f37288455d64f 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -93,7 +93,7 @@ def _site_packages_dir(self): def _pip_install(self, packages): site_packages_dir = self._site_packages_dir.replace("\\", "/") - self.run(f"python -m pip install {' '.join(packages)} --no-cache-dir --target={site_packages_dir}",) + self.run(f"python -m pip install {' '.join(packages)} --no-cache-dir --target={site_packages_dir} --index-url https://pypi.org/simple",) def _patch_sources(self): def _format_library_paths(library_paths): @@ -133,9 +133,9 @@ def _format_libraries(libraries, libdir): "'nspr_libs%': ['libnspr4.lib', 'libplc4.lib', 'libplds4.lib'],", "'nspr_libs%': ['nspr4.lib', 'plc4.lib', 'plds4.lib'],") - # Do not hide shlibsign errors in subprocess.check_call() + # Don't let shlibsign.py set LD_LIBRARY_PATH to the incorrect value. replace_in_file(self, os.path.join(self.source_folder, "nss", "coreconf", "shlibsign.py"), - ", stdout=dev_null, stderr=dev_null", "") + "env['LD_LIBRARY_PATH']", "pass # env['LD_LIBRARY_PATH']") @property def _build_args(self): From b102d4eb28d2031eed43226ddbe126809774d958 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Thu, 10 Oct 2024 16:09:22 +0300 Subject: [PATCH 33/47] nss: use vswhere from system --- recipes/nss/all/conanfile.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index f37288455d64f..632c4e848b230 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -56,7 +56,8 @@ def build_requirements(self): self.tool_requires("mozilla-build/4.0.2") if cross_building(self): self.tool_requires("sqlite3/") - self.tool_requires("cpython/3.12.7") + # shared=True is required for MSVC + self.tool_requires("cpython/3.12.7", options={"shared": True}) self.tool_requires("ninja/[>=1.10.2 <2]") def source(self): @@ -79,6 +80,11 @@ def generate(self): env.prepend_path("PATH", os.path.join(self._site_packages_dir, "bin")) # For 'shlibsign -v -i /lib/libfreebl3.so' etc to work during build env.prepend_path("LD_LIBRARY_PATH", os.path.join(self._dist_dir, "lib")) + if is_msvc(self): + # Needed to locate vswhere.exe. + # https://github.com/Microsoft/vswhere/wiki/Installing + # "Starting with Visual Studio 15.2 (26418.1 Preview) vswhere.exe is installed in [the below path]" + env.append_path("PATH", r"C:\Program Files (x86)\Microsoft Visual Studio\Installer") env.vars(self, scope="build").save_script("conan_paths") @property From 779c901210f96a5d23e709e6ee814c03a77761db Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Thu, 10 Oct 2024 16:48:55 +0300 Subject: [PATCH 34/47] nss: revert cpython changes --- recipes/nss/all/conanfile.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index 632c4e848b230..294bbff53a914 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -56,8 +56,7 @@ def build_requirements(self): self.tool_requires("mozilla-build/4.0.2") if cross_building(self): self.tool_requires("sqlite3/") - # shared=True is required for MSVC - self.tool_requires("cpython/3.12.7", options={"shared": True}) + self.tool_requires("cpython/3.12.2") self.tool_requires("ninja/[>=1.10.2 <2]") def source(self): From 04f42870445b2853cab993171c51b1d34a479039 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Sun, 13 Oct 2024 12:49:31 +0300 Subject: [PATCH 35/47] nss: add cross-compilation support --- recipes/nss/all/conanfile.py | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index 294bbff53a914..6dff42defc85c 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -3,7 +3,7 @@ from conan import ConanFile from conan.errors import ConanInvalidConfiguration from conan.tools.apple import fix_apple_shared_install_name -from conan.tools.build import cross_building +from conan.tools.build import cross_building, can_run from conan.tools.env import VirtualBuildEnv, VirtualRunEnv, Environment from conan.tools.files import chdir, copy, get, rm, replace_in_file from conan.tools.layout import basic_layout @@ -54,10 +54,12 @@ def build_requirements(self): self.tool_requires("msys2/cci.latest") if self.settings.os == "Windows": self.tool_requires("mozilla-build/4.0.2") - if cross_building(self): - self.tool_requires("sqlite3/") self.tool_requires("cpython/3.12.2") self.tool_requires("ninja/[>=1.10.2 <2]") + if not can_run(self): + # Needed for shlibsign executable + self.tool_requires(f"nss/{self.version}") + self.tool_requires("sqlite3/3.45.2") def source(self): get(self, **self.conan_data["sources"][self.version], strip_root=True) @@ -71,19 +73,35 @@ def generate(self): vc.generate() env = Environment() + + compilers_from_conf = self.conf.get("tools.build:compiler_executables", default={}, check_type=dict) + buildenv_vars = VirtualBuildEnv(self).vars() + cc = compilers_from_conf.get("c", buildenv_vars.get("CC")) + if cc: + env.define("CC", unix_path(self, cc)) + strip = compilers_from_conf.get("strip", buildenv_vars.get("STRIP")) + if strip: + env.define("STRIP", unix_path(self, strip)) + cxx = compilers_from_conf.get("cpp", buildenv_vars.get("CXX")) + if cc: + env.define("CXX", unix_path(self, cxx)) + # Add temporary site-packages to PYTHONPATH for gyp-next env.prepend_path("PYTHONPATH", self._site_packages_dir) if self.settings.os == "Windows": # An additional forward-slash path is needed for MSYS2 bash env.prepend_path("PYTHONPATH", self._site_packages_dir.replace("\\", "/")) env.prepend_path("PATH", os.path.join(self._site_packages_dir, "bin")) + # For 'shlibsign -v -i /lib/libfreebl3.so' etc to work during build env.prepend_path("LD_LIBRARY_PATH", os.path.join(self._dist_dir, "lib")) + if is_msvc(self): # Needed to locate vswhere.exe. # https://github.com/Microsoft/vswhere/wiki/Installing # "Starting with Visual Studio 15.2 (26418.1 Preview) vswhere.exe is installed in [the below path]" env.append_path("PATH", r"C:\Program Files (x86)\Microsoft Visual Studio\Installer") + env.vars(self, scope="build").save_script("conan_paths") @property @@ -141,6 +159,10 @@ def _format_libraries(libraries, libdir): # Don't let shlibsign.py set LD_LIBRARY_PATH to the incorrect value. replace_in_file(self, os.path.join(self.source_folder, "nss", "coreconf", "shlibsign.py"), "env['LD_LIBRARY_PATH']", "pass # env['LD_LIBRARY_PATH']") + if not can_run(self): + shlibsign = os.path.join(self.dependencies.build["nss"].package_folder, "bin", "shlibsign").replace("\\", "/") + replace_in_file(self, os.path.join(self.source_folder, "nss", "coreconf", "shlibsign.py"), + "os.path.join(bin_path, 'shlibsign')", f"'{shlibsign}'") @property def _build_args(self): From c95c042009338d51a410dd146073d0c79bf11aa0 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Thu, 17 Oct 2024 23:16:36 +0300 Subject: [PATCH 36/47] Use a version range for sqlite3 to match qt/6.x recipe --- recipes/nss/all/conanfile.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index 6dff42defc85c..38045f764a4ab 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -38,7 +38,7 @@ def layout(self): def requirements(self): self.requires("nspr/4.35", transitive_headers=True, transitive_libs=True) - self.requires("sqlite3/3.45.2", run=True) + self.requires("sqlite3/[>=3.45.0 <4]", run=True) self.requires("zlib/[>=1.2.11 <2]") def validate(self): @@ -59,7 +59,7 @@ def build_requirements(self): if not can_run(self): # Needed for shlibsign executable self.tool_requires(f"nss/{self.version}") - self.tool_requires("sqlite3/3.45.2") + self.tool_requires("sqlite3/[>=3.45.0 <4]") def source(self): get(self, **self.conan_data["sources"][self.version], strip_root=True) From f91b63fa3b77dd47cb9125d87509f784fc62a86b Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Wed, 13 Nov 2024 14:15:01 +0200 Subject: [PATCH 37/47] nss: drop test_v1_package --- recipes/nss/all/test_v1_package/CMakeLists.txt | 8 -------- recipes/nss/all/test_v1_package/conanfile.py | 17 ----------------- 2 files changed, 25 deletions(-) delete mode 100644 recipes/nss/all/test_v1_package/CMakeLists.txt delete mode 100644 recipes/nss/all/test_v1_package/conanfile.py diff --git a/recipes/nss/all/test_v1_package/CMakeLists.txt b/recipes/nss/all/test_v1_package/CMakeLists.txt deleted file mode 100644 index b21cc49efde95..0000000000000 --- a/recipes/nss/all/test_v1_package/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ -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/nss/all/test_v1_package/conanfile.py b/recipes/nss/all/test_v1_package/conanfile.py deleted file mode 100644 index 38f4483872d47..0000000000000 --- a/recipes/nss/all/test_v1_package/conanfile.py +++ /dev/null @@ -1,17 +0,0 @@ -from conans import ConanFile, CMake, tools -import os - - -class TestPackageConan(ConanFile): - settings = "os", "arch", "compiler", "build_type" - 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 25e930f48fc725f0f62d7f799fcf7622b89b2766 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Fri, 10 Jan 2025 09:57:15 +0200 Subject: [PATCH 38/47] nss: clean up test_package --- recipes/nss/all/test_package/conanfile.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/recipes/nss/all/test_package/conanfile.py b/recipes/nss/all/test_package/conanfile.py index fafba71d30d56..b3f098e55841a 100644 --- a/recipes/nss/all/test_package/conanfile.py +++ b/recipes/nss/all/test_package/conanfile.py @@ -6,8 +6,7 @@ class TestPackageConan(ConanFile): settings = "os", "arch", "compiler", "build_type" - generators = "CMakeToolchain", "CMakeDeps", "VirtualRunEnv" - test_type = "explicit" + generators = "CMakeToolchain", "CMakeDeps" def layout(self): cmake_layout(self) From 8567db8203780e6e240fe4306e4b2df0cd1146d8 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Thu, 9 Jan 2025 17:52:46 +0200 Subject: [PATCH 39/47] nss: bump to 3.107, avoid vswhere --- recipes/nss/all/conandata.yml | 11 +++++-- recipes/nss/all/conanfile.py | 25 ++++++++++---- .../nss/all/patches/3.107-avoid-vswhere.patch | 33 +++++++++++++++++++ recipes/nss/config.yml | 2 +- 4 files changed, 61 insertions(+), 10 deletions(-) create mode 100644 recipes/nss/all/patches/3.107-avoid-vswhere.patch diff --git a/recipes/nss/all/conandata.yml b/recipes/nss/all/conandata.yml index 0211be8103de3..63ea58903d114 100644 --- a/recipes/nss/all/conandata.yml +++ b/recipes/nss/all/conandata.yml @@ -1,4 +1,9 @@ sources: - "3.104": - url: "https://ftp.mozilla.org/pub/security/nss/releases/NSS_3_104_RTM/src/nss-3.104.tar.gz" - sha256: "e2763223622d1e76b98a43030873856f248af0a41b03b2fa2ca06a91bc50ac8e" + "3.107": + url: "https://ftp.mozilla.org/pub/security/nss/releases/NSS_3_107_RTM/src/nss-3.107.tar.gz" + sha256: "7f7e96473e38150771a615f5d40e8c41ba3a19385301ae0c525091f2fc9d6729" +patches: + "3.107": + - patch_file: "patches/3.107-avoid-vswhere.patch" + patch_description: "Use VCVars env vars instead of vswhere" + patch_type: "conan" diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index 70b62f25aa37c..f09d105121281 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -3,9 +3,9 @@ from conan import ConanFile from conan.errors import ConanInvalidConfiguration from conan.tools.apple import fix_apple_shared_install_name -from conan.tools.build import cross_building, can_run +from conan.tools.build import can_run from conan.tools.env import VirtualBuildEnv, VirtualRunEnv, Environment -from conan.tools.files import chdir, copy, get, rm, replace_in_file +from conan.tools.files import chdir, copy, get, rm, replace_in_file, export_conandata_patches, apply_conandata_patches from conan.tools.layout import basic_layout from conan.tools.microsoft import is_msvc, VCVars, unix_path @@ -23,6 +23,9 @@ class NSSConan(ConanFile): package_type = "shared-library" settings = "os", "arch", "compiler", "build_type" + def export_sources(self): + export_conandata_patches(self) + def configure(self): self.settings.rm_safe("compiler.cppstd") self.settings.rm_safe("compiler.libcxx") @@ -59,6 +62,19 @@ def build_requirements(self): def source(self): get(self, **self.conan_data["sources"][self.version], strip_root=True) + apply_conandata_patches(self) + + @property + def _vs_year(self): + compiler_version = str(self.settings.compiler.version) + return { + "180": "2013", + "190": "2015", + "191": "2017", + "192": "2019", + "193": "2022", + "194": "2022", + }.get(compiler_version) def generate(self): env = VirtualBuildEnv(self) @@ -93,10 +109,7 @@ def generate(self): env.prepend_path("LD_LIBRARY_PATH", os.path.join(self._dist_dir, "lib")) if is_msvc(self): - # Needed to locate vswhere.exe. - # https://github.com/Microsoft/vswhere/wiki/Installing - # "Starting with Visual Studio 15.2 (26418.1 Preview) vswhere.exe is installed in [the below path]" - env.append_path("PATH", r"C:\Program Files (x86)\Microsoft Visual Studio\Installer") + env.define("GYP_MSVS_VERSION", self._vs_year) env.vars(self, scope="build").save_script("conan_paths") diff --git a/recipes/nss/all/patches/3.107-avoid-vswhere.patch b/recipes/nss/all/patches/3.107-avoid-vswhere.patch new file mode 100644 index 0000000000000..bc48068b8a7e5 --- /dev/null +++ b/recipes/nss/all/patches/3.107-avoid-vswhere.patch @@ -0,0 +1,33 @@ +--- a/nss/coreconf/msvc.sh ++++ b/nss/coreconf/msvc.sh +@@ -1,11 +1,6 @@ + #!/bin/bash + # This configures the environment for running MSVC. It uses vswhere, the + # registry, and a little knowledge of how MSVC is laid out. +- +-if ! hash vswhere 2>/dev/null; then +- echo "Can't find vswhere on the path, aborting" 1>&2 +- exit 1 +-fi + + if ! hash reg 2>/dev/null; then + echo "Can't find reg on the path, aborting" 1>&2 +@@ -44,8 +39,7 @@ + return 1 + } + +-VSCOMPONENT=Microsoft.VisualStudio.Component.VC.Tools.x86.x64 +-vsinstall=$(vswhere -latest -requires "$VSCOMPONENT" -property installationPath) ++vsinstall=$VSINSTALLDIR + + # Attempt to setup paths if vswhere returns something and VSPATH isn't set. + # Otherwise, assume that the env is setup. +@@ -99,7 +93,7 @@ + export LIB + + export GYP_MSVS_OVERRIDE_PATH="${VSPATH}" +- export GYP_MSVS_VERSION=$(vswhere -latest -requires "$VSCOMPONENT" -property catalog_productLineVersion) ++ # export GYP_MSVS_VERSION=$(vswhere -latest -requires "$VSCOMPONENT" -property catalog_productLineVersion) + else + echo Assuming env setup is already done. + echo VSPATH=$VSPATH diff --git a/recipes/nss/config.yml b/recipes/nss/config.yml index 32675b672432b..1d8f8c1dfa574 100644 --- a/recipes/nss/config.yml +++ b/recipes/nss/config.yml @@ -1,3 +1,3 @@ versions: - "3.104": + "3.107": folder: all From 155665ee34b012d64991b9c2cec928a61a11556d Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Fri, 10 Jan 2025 10:13:31 +0200 Subject: [PATCH 40/47] nss: use host_version for sqlite tool_requires --- recipes/nss/all/conanfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index f09d105121281..e2db7f1609ad9 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -58,7 +58,7 @@ def build_requirements(self): if not can_run(self): # Needed for shlibsign executable self.tool_requires(f"nss/{self.version}") - self.tool_requires("sqlite3/[>=3.45.0 <4]") + self.tool_requires("sqlite3/") def source(self): get(self, **self.conan_data["sources"][self.version], strip_root=True) From f6cf7634d33f237197cdf87d05e814a2fcba77b8 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Fri, 10 Jan 2025 11:15:18 +0200 Subject: [PATCH 41/47] nss: add v3.93 used in other recipes --- recipes/nss/all/conandata.yml | 7 +++++++ recipes/nss/config.yml | 2 ++ 2 files changed, 9 insertions(+) diff --git a/recipes/nss/all/conandata.yml b/recipes/nss/all/conandata.yml index 63ea58903d114..be1356a512ebf 100644 --- a/recipes/nss/all/conandata.yml +++ b/recipes/nss/all/conandata.yml @@ -2,8 +2,15 @@ sources: "3.107": url: "https://ftp.mozilla.org/pub/security/nss/releases/NSS_3_107_RTM/src/nss-3.107.tar.gz" sha256: "7f7e96473e38150771a615f5d40e8c41ba3a19385301ae0c525091f2fc9d6729" + "3.93": + url: "https://ftp.mozilla.org/pub/security/nss/releases/NSS_3_93_RTM/src/nss-3.93.tar.gz" + sha256: "15f54bb72048eb105f8c0e936a04b899e74c3db9a19bbc1e00acee2af9476a8a" patches: "3.107": - patch_file: "patches/3.107-avoid-vswhere.patch" patch_description: "Use VCVars env vars instead of vswhere" patch_type: "conan" + "3.93": + - patch_file: "patches/3.107-avoid-vswhere.patch" + patch_description: "Use VCVars env vars instead of vswhere" + patch_type: "conan" diff --git a/recipes/nss/config.yml b/recipes/nss/config.yml index 1d8f8c1dfa574..282102bdaf3d3 100644 --- a/recipes/nss/config.yml +++ b/recipes/nss/config.yml @@ -1,3 +1,5 @@ versions: "3.107": folder: all + "3.93": + folder: all From fbf7c23a77a9a8811ce67014c33863c0e4a0f216 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Fri, 10 Jan 2025 11:15:52 +0200 Subject: [PATCH 42/47] nss: make sqlite3 a tool_requires, improve cross-compilation --- recipes/nss/all/conanfile.py | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index e2db7f1609ad9..1946c9c7ea55f 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -4,7 +4,7 @@ from conan.errors import ConanInvalidConfiguration from conan.tools.apple import fix_apple_shared_install_name from conan.tools.build import can_run -from conan.tools.env import VirtualBuildEnv, VirtualRunEnv, Environment +from conan.tools.env import VirtualBuildEnv, Environment from conan.tools.files import chdir, copy, get, rm, replace_in_file, export_conandata_patches, apply_conandata_patches from conan.tools.layout import basic_layout from conan.tools.microsoft import is_msvc, VCVars, unix_path @@ -37,7 +37,7 @@ def layout(self): def requirements(self): self.requires("nspr/4.35", transitive_headers=True, transitive_libs=True) - self.requires("sqlite3/[>=3.41.0 <4]", run=True) + self.requires("sqlite3/[>=3.41.0 <4]") self.requires("zlib/[>=1.2.11 <2]") def validate(self): @@ -55,10 +55,10 @@ def build_requirements(self): self.tool_requires("mozilla-build/4.0.2") self.tool_requires("cpython/3.12.2") self.tool_requires("ninja/[>=1.10.2 <2]") + self.tool_requires("sqlite3/") if not can_run(self): # Needed for shlibsign executable self.tool_requires(f"nss/{self.version}") - self.tool_requires("sqlite3/") def source(self): get(self, **self.conan_data["sources"][self.version], strip_root=True) @@ -79,8 +79,7 @@ def _vs_year(self): def generate(self): env = VirtualBuildEnv(self) env.generate() - env = VirtualRunEnv(self) - env.generate(scope="build") + vc = VCVars(self) vc.generate() @@ -173,6 +172,16 @@ def _format_libraries(libraries, libdir): replace_in_file(self, os.path.join(self.source_folder, "nss", "coreconf", "shlibsign.py"), "os.path.join(bin_path, 'shlibsign')", f"'{shlibsign}'") + @property + def _arch(self): + if self.settings.arch == "x86_64": + return "x64" + elif self.settings.arch == "x86": + return "ia32" + elif self.settings.arch in ["armv8", "armv8.3"]: + return "aarch64" + return str(self.settings.arch) + @property def _build_args(self): # https://github.com/nss-dev/nss/blob/master/help.txt @@ -180,14 +189,10 @@ def _build_args(self): # if self.settings.compiler == "gcc": # args.append("XCFLAGS=-Wno-array-parameter") args.append("--disable-tests") + args.append(f"--target={self._arch}") + args.append(f"-Dtarget_arch={self._arch}") if self.settings.build_type != "Debug": args.append("--opt") - if self.settings.arch == "x86_64": - args.append("--target=x64") - elif self.settings.arch == "x86": - args.append("--target=ia32") - elif self.settings.arch in ["armv8", "armv8.3"]: - args.append("--target=aarch64") if is_msvc(self): args.append("--msvc") if not self.options.get_safe("shared", True): From 2b0b57b2f8f74dfd45a0cd0d9b27102563618d56 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Fri, 10 Jan 2025 12:15:56 +0200 Subject: [PATCH 43/47] nss: can use static sqlite3 --- recipes/nss/all/conanfile.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index 1946c9c7ea55f..7db6c7c54750c 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -20,6 +20,7 @@ class NSSConan(ConanFile): description = "Network Security Services" topics = ("network", "security", "crypto", "ssl") + # TODO: static builds are supported, but the necessary package_info() is complex package_type = "shared-library" settings = "os", "arch", "compiler", "build_type" @@ -30,7 +31,6 @@ def configure(self): self.settings.rm_safe("compiler.cppstd") self.settings.rm_safe("compiler.libcxx") self.options["nspr"].shared = True - self.options["sqlite3"].shared = True def layout(self): basic_layout(self, src_folder="src") @@ -43,8 +43,6 @@ def requirements(self): def validate(self): if not self.dependencies["nspr"].options.shared: raise ConanInvalidConfiguration("NSS cannot link to static NSPR. Please use option nspr:shared=True") - if not self.dependencies["sqlite3"].options.shared: - raise ConanInvalidConfiguration("NSS cannot link to static sqlite. Please use option sqlite3:shared=True") def build_requirements(self): if self.settings_build.os == "Windows": @@ -138,7 +136,9 @@ def _format_libraries(libraries, libdir): if is_msvc(self): if not library.endswith(".lib"): library += ".lib" - result.append(os.path.join(libdir, library).replace("\\", "/")) + if libdir is not None: + library = os.path.join(libdir, library).replace("\\", "/") + result.append(library) else: result.append(f"-l{library}") return result @@ -146,6 +146,7 @@ def _format_libraries(libraries, libdir): sqlite_info = self.dependencies["sqlite3"].cpp_info.aggregated_components() sqlite_flags = " ".join([f"-I{unix_path(self, sqlite_info.includedir)}"] + _format_libraries(sqlite_info.libs, sqlite_info.libdir) + + _format_libraries(sqlite_info.system_libs, None) + _format_library_paths(sqlite_info.libdirs)) replace_in_file(self, os.path.join(self.source_folder, "nss", "lib", "sqlite", "sqlite.gyp"), "'libraries': ['<(sqlite_libs)'],", @@ -154,6 +155,7 @@ def _format_libraries(libraries, libdir): zlib_info = self.dependencies["zlib"].cpp_info.aggregated_components() zlib_flags = " ".join([f"-I{unix_path(self, zlib_info.includedir)}"] + _format_libraries(zlib_info.libs, zlib_info.libdir) + + _format_libraries(zlib_info.system_libs, None) + _format_library_paths(zlib_info.libdirs)) replace_in_file(self, os.path.join(self.source_folder, "nss", "lib", "zlib", "zlib.gyp"), "'libraries': ['<@(zlib_libs)'],", @@ -186,17 +188,16 @@ def _arch(self): def _build_args(self): # https://github.com/nss-dev/nss/blob/master/help.txt args = [] - # if self.settings.compiler == "gcc": - # args.append("XCFLAGS=-Wno-array-parameter") args.append("--disable-tests") args.append(f"--target={self._arch}") args.append(f"-Dtarget_arch={self._arch}") + args.append("-Dstatic_libs=" + ("1" if not self.options.shared else "0")) + if not self.options.shared: + args.append("--static") if self.settings.build_type != "Debug": args.append("--opt") if is_msvc(self): args.append("--msvc") - if not self.options.get_safe("shared", True): - args.append("--static") nspr_root = self.dependencies["nspr"].package_folder nspr_includedir = unix_path(self, os.path.join(nspr_root, "include", "nspr")) nspr_libdir = unix_path(self, os.path.join(nspr_root, "lib")) From 766eddf524ef8f5af923e4d4daa7d58e6d67bf7c Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Fri, 10 Jan 2025 19:32:51 +0200 Subject: [PATCH 44/47] nss: fix self.options.shared use --- recipes/nss/all/conanfile.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index 7db6c7c54750c..31e07266f55e3 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -191,8 +191,8 @@ def _build_args(self): args.append("--disable-tests") args.append(f"--target={self._arch}") args.append(f"-Dtarget_arch={self._arch}") - args.append("-Dstatic_libs=" + ("1" if not self.options.shared else "0")) - if not self.options.shared: + args.append("-Dstatic_libs=" + ("1" if not self.options.get_safe("shared", True) else "0")) + if not self.options.get_safe("shared", True): args.append("--static") if self.settings.build_type != "Debug": args.append("--opt") From 6779049846b45cd41b0590398c71e06a1969c67e Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Sat, 11 Jan 2025 18:11:43 +0200 Subject: [PATCH 45/47] nss: fix Windows build, ensure vendored sources are not used --- recipes/nss/all/conanfile.py | 185 ++++++++++++++++++++--------------- 1 file changed, 108 insertions(+), 77 deletions(-) diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index 31e07266f55e3..501e7bdb1edda 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -1,11 +1,12 @@ +import json import os from conan import ConanFile from conan.errors import ConanInvalidConfiguration from conan.tools.apple import fix_apple_shared_install_name from conan.tools.build import can_run -from conan.tools.env import VirtualBuildEnv, Environment -from conan.tools.files import chdir, copy, get, rm, replace_in_file, export_conandata_patches, apply_conandata_patches +from conan.tools.env import VirtualBuildEnv, Environment, VirtualRunEnv +from conan.tools.files import copy, get, rm, replace_in_file, export_conandata_patches, apply_conandata_patches, rmdir, save, load from conan.tools.layout import basic_layout from conan.tools.microsoft import is_msvc, VCVars, unix_path @@ -23,6 +24,12 @@ class NSSConan(ConanFile): # TODO: static builds are supported, but the necessary package_info() is complex package_type = "shared-library" settings = "os", "arch", "compiler", "build_type" + options = { + "enable_legacy_db": [True, False], + } + default_options = { + "enable_legacy_db": False, + } def export_sources(self): export_conandata_patches(self) @@ -61,6 +68,9 @@ def build_requirements(self): def source(self): get(self, **self.conan_data["sources"][self.version], strip_root=True) apply_conandata_patches(self) + # Remove vendored sources + rmdir(self, os.path.join("nss", "lib", "sqlite")) + rmdir(self, os.path.join("nss", "lib", "zlib")) @property def _vs_year(self): @@ -74,13 +84,57 @@ def _vs_year(self): "194": "2022", }.get(compiler_version) + @property + def _dist_dir(self): + return os.path.join(self.build_folder, "dist") + + @property + def _target_build_dir(self): + return os.path.join(self.build_folder, "out", "Debug" if self.settings.build_type == "Debug" else "Release") + + @property + def _arch(self): + if self.settings.arch == "x86_64": + return "x64" + elif self.settings.arch == "x86": + return "ia32" + elif self.settings.arch in ["armv8", "armv8.3"]: + return "aarch64" + return str(self.settings.arch) + def generate(self): env = VirtualBuildEnv(self) env.generate() + if can_run(self): + # The built shlibsign executable needs to find shared libs + env = VirtualRunEnv(self) + env.generate(scope="build") + vc = VCVars(self) vc.generate() + + nspr_root = self.dependencies["nspr"].package_folder + nspr_includedir = unix_path(self, os.path.join(nspr_root, "include", "nspr")) + nspr_libdir = unix_path(self, os.path.join(nspr_root, "lib")) + + gyp_args = {} + gyp_args["nss_dist_dir"] = unix_path(self, self._dist_dir) + gyp_args["nss_dist_obj_dir"] = unix_path(self, self._dist_dir) + gyp_args["opt_build"] = 1 if self.settings.build_type != "Debug" else 0 + gyp_args["static_libs"] = 1 if not self.options.get_safe("shared", True) else 0 + gyp_args["target_arch"] = self._arch + gyp_args["disable_tests"] = 1 + gyp_args["no_local_nspr"] = 1 + gyp_args["nspr_include_dir"] = nspr_includedir + gyp_args["nspr_lib_dir"] = nspr_libdir + gyp_args["use_system_sqlite"] = 1 + gyp_args["use_system_zlib"] = 1 + gyp_args["disable_dbm"] = 0 if self.options.enable_legacy_db else 1 + gyp_args["enable_sslkeylogfile"] = 1 # default in build.sh + save(self, "gyp_args.txt", "\n".join(f"-D{k}={v}" for k, v in gyp_args.items())) + env = Environment() compilers_from_conf = self.conf.get("tools.build:compiler_executables", default={}, check_type=dict) @@ -94,6 +148,13 @@ def generate(self): cxx = compilers_from_conf.get("cpp", buildenv_vars.get("CXX")) if cc: env.define("CXX", unix_path(self, cxx)) + env.define("CCC", unix_path(self, cxx)) + + if is_msvc(self): + env.define("GYP_MSVS_VERSION", self._vs_year) + + # For 'shlibsign -v -i /lib/libfreebl3.so' etc to work during build + env.prepend_path("LD_LIBRARY_PATH", os.path.join(self._dist_dir, "lib")) # Add temporary site-packages to PYTHONPATH for gyp-next env.prepend_path("PYTHONPATH", self._site_packages_dir) @@ -102,20 +163,8 @@ def generate(self): env.prepend_path("PYTHONPATH", self._site_packages_dir.replace("\\", "/")) env.prepend_path("PATH", os.path.join(self._site_packages_dir, "bin")) - # For 'shlibsign -v -i /lib/libfreebl3.so' etc to work during build - env.prepend_path("LD_LIBRARY_PATH", os.path.join(self._dist_dir, "lib")) - - if is_msvc(self): - env.define("GYP_MSVS_VERSION", self._vs_year) - env.vars(self, scope="build").save_script("conan_paths") - @property - def _dist_dir(self): - # location for installed lib/ and bin/ subdirs - dist_subdir = "Debug" if self.settings.build_type == "Debug" else "Release" - return os.path.join(self.source_folder, "dist", dist_subdir) - @property def _site_packages_dir(self): return os.path.join(self.build_folder, "site-packages") @@ -124,13 +173,8 @@ def _pip_install(self, packages): site_packages_dir = self._site_packages_dir.replace("\\", "/") self.run(f"python -m pip install {' '.join(packages)} --no-cache-dir --target={site_packages_dir} --index-url https://pypi.org/simple",) - def _patch_sources(self): - def _format_library_paths(library_paths): - flag = "-LIBPATH:" if is_msvc(self) else "-L" - return [flag + unix_path(self, library_path) - for library_path in library_paths if library_path] - - def _format_libraries(libraries, libdir): + def _write_conan_gyp_target(self, conan_dep, target_name, file_name): + def _format_libs(libraries, libdir=None): result = [] for library in libraries: if is_msvc(self): @@ -143,30 +187,44 @@ def _format_libraries(libraries, libdir): result.append(f"-l{library}") return result - sqlite_info = self.dependencies["sqlite3"].cpp_info.aggregated_components() - sqlite_flags = " ".join([f"-I{unix_path(self, sqlite_info.includedir)}"] + - _format_libraries(sqlite_info.libs, sqlite_info.libdir) + - _format_libraries(sqlite_info.system_libs, None) + - _format_library_paths(sqlite_info.libdirs)) - replace_in_file(self, os.path.join(self.source_folder, "nss", "lib", "sqlite", "sqlite.gyp"), - "'libraries': ['<(sqlite_libs)'],", - f"'libraries': ['{sqlite_flags}'],") - - zlib_info = self.dependencies["zlib"].cpp_info.aggregated_components() - zlib_flags = " ".join([f"-I{unix_path(self, zlib_info.includedir)}"] + - _format_libraries(zlib_info.libs, zlib_info.libdir) + - _format_libraries(zlib_info.system_libs, None) + - _format_library_paths(zlib_info.libdirs)) - replace_in_file(self, os.path.join(self.source_folder, "nss", "lib", "zlib", "zlib.gyp"), - "'libraries': ['<@(zlib_libs)'],", - f"'libraries': ['{zlib_flags}'],") + lib_dir = os.path.join(self.source_folder, "nss", "lib", file_name) + cpp_info = self.dependencies[conan_dep].cpp_info.aggregated_components() + build_gyp = { + "includes": ["../../coreconf/config.gypi"], + "targets": [{ + "target_name": target_name, + "type": "none", + "direct_dependent_settings": { + "defines": cpp_info.defines, + "include_dirs": [cpp_info.includedir.replace("\\", "/")], + "link_settings": { + "libraries": _format_libs(cpp_info.libs, cpp_info.libdir.replace("\\", "/")) + _format_libs(cpp_info.system_libs), + "library_dirs": [libdir.replace("\\", "/") for libdir in cpp_info.libdirs], + }, + } + }], + } + save(self, os.path.join(lib_dir, f"{file_name}.gyp"), json.dumps(build_gyp, indent=2)) + + exports_gyp = { + "includes": ["../../coreconf/config.gypi"], + "targets": [{ + "target_name": f"lib_{file_name}_exports", + "type": "none", + }], + } + save(self, os.path.join(lib_dir, "exports.gyp"), json.dumps(exports_gyp, indent=2)) + + def _patch_sources(self): + self._write_conan_gyp_target("sqlite3", "sqlite3", "sqlite") + self._write_conan_gyp_target("zlib", "nss_zlib", "zlib") # NSPR Windows libs on CCI don't include a lib prefix replace_in_file(self, os.path.join(self.source_folder, "nss", "coreconf", "config.gypi"), "'nspr_libs%': ['libnspr4.lib', 'libplc4.lib', 'libplds4.lib'],", "'nspr_libs%': ['nspr4.lib', 'plc4.lib', 'plds4.lib'],") - # Don't let shlibsign.py set LD_LIBRARY_PATH to the incorrect value. + # Don't let shlibsign.py set LD_LIBRARY_PATH to an incorrect value. replace_in_file(self, os.path.join(self.source_folder, "nss", "coreconf", "shlibsign.py"), "env['LD_LIBRARY_PATH']", "pass # env['LD_LIBRARY_PATH']") if not can_run(self): @@ -174,53 +232,26 @@ def _format_libraries(libraries, libdir): replace_in_file(self, os.path.join(self.source_folder, "nss", "coreconf", "shlibsign.py"), "os.path.join(bin_path, 'shlibsign')", f"'{shlibsign}'") - @property - def _arch(self): - if self.settings.arch == "x86_64": - return "x64" - elif self.settings.arch == "x86": - return "ia32" - elif self.settings.arch in ["armv8", "armv8.3"]: - return "aarch64" - return str(self.settings.arch) - - @property - def _build_args(self): - # https://github.com/nss-dev/nss/blob/master/help.txt - args = [] - args.append("--disable-tests") - args.append(f"--target={self._arch}") - args.append(f"-Dtarget_arch={self._arch}") - args.append("-Dstatic_libs=" + ("1" if not self.options.get_safe("shared", True) else "0")) - if not self.options.get_safe("shared", True): - args.append("--static") - if self.settings.build_type != "Debug": - args.append("--opt") - if is_msvc(self): - args.append("--msvc") - nspr_root = self.dependencies["nspr"].package_folder - nspr_includedir = unix_path(self, os.path.join(nspr_root, "include", "nspr")) - nspr_libdir = unix_path(self, os.path.join(nspr_root, "lib")) - args.append(f"--with-nspr={nspr_includedir}:{nspr_libdir}") - args.append("--system-sqlite") - args.append("--enable-legacy-db") # for libnssdbm3 - return args - def build(self): self._patch_sources() self._pip_install(["gyp-next"]) - self.run(f"gyp --version") - - with chdir(self, os.path.join(self.source_folder, "nss")): - self.run(f"./build.sh {' '.join(self._build_args)}") + args = load(self, os.path.join(self.generators_folder, "gyp_args.txt")).replace("\n", " ") + cmd = f'gyp -f ninja nss.gyp --depth=. --generator-output="{unix_path(self, self.build_folder)}" ' + args + if is_msvc(self): + cmd = f"bash -c 'target_arch={self._arch} source coreconf/msvc.sh; {cmd}'" + self.run(cmd, cwd=os.path.join(self.source_folder, "nss")) + self.run("ninja", cwd=self._target_build_dir) def package(self): copy(self, "COPYING", src=os.path.join(self.source_folder, "nss"), dst=os.path.join(self.package_folder, "licenses")) copy(self, "*", - src=os.path.join(self.source_folder, "dist", "public"), + src=os.path.join(self._dist_dir, "public"), dst=os.path.join(self.package_folder, "include")) + copy(self, "*", + src=os.path.join(self._dist_dir, "private"), + dst=os.path.join(self.package_folder, "include", "private")) copy(self, "*", os.path.join(self._dist_dir, "bin"), os.path.join(self.package_folder, "bin")) - for pattern in ["*.a", "*.lib", "*.so", "*.dylib"]: + for pattern in ["*.a", "*.lib", "*.so", "*.chk", "*.dylib"]: copy(self, pattern, os.path.join(self._dist_dir, "lib"), os.path.join(self.package_folder, "lib")) copy(self, "*.dll", os.path.join(self._dist_dir, "lib"), os.path.join(self.package_folder, "bin")) if not self.options.get_safe("shared", True): From c5b7e10bec94e6899787c3fc73067e37f4955919 Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Sat, 11 Jan 2025 18:48:21 +0200 Subject: [PATCH 46/47] nss: restructure package_info() --- recipes/nss/all/conanfile.py | 51 ++++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index 501e7bdb1edda..b4d1695974575 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -269,30 +269,43 @@ def package_info(self): # https://salsa.debian.org/mozilla-team/nss/-/tree/master/debian # instead. + # Do not use self.cpp_info.set_property("pkg_config_name", "_nss") - # https://src.fedoraproject.org/rpms/nss/blob/rawhide/f/nss-util.pc.in - self.cpp_info.components["nssutil"].set_property("pkg_config_name", "nss-util") - self.cpp_info.components["nssutil"].libs = ["nssutil3"] - self.cpp_info.components["nssutil"].includedirs.append(os.path.join("include", "nss")) - self.cpp_info.components["nssutil"].requires = ["nspr::nspr"] - if self.settings.os in ["Linux", "FreeBSD"]: - self.cpp_info.components["nssutil"].system_libs = ["pthread", "dl"] - # https://src.fedoraproject.org/rpms/nss/blob/rawhide/f/nss.pc.in - self.cpp_info.components["libnss"].set_property("pkg_config_name", "nss") - self.cpp_info.components["libnss"].libs = ["ssl3", "smime3", "nss3"] + self.cpp_info.components["nss_pc"].set_property("pkg_config_name", "nss") + self.cpp_info.components["nss_pc"].requires = ["libnss", "ssl", "smime"] + + self.cpp_info.components["libnss"].libs = ["nss3"] self.cpp_info.components["libnss"].includedirs.append(os.path.join("include", "nss")) - self.cpp_info.components["libnss"].requires = ["nspr::nspr", "nssutil"] - if self.settings.os in ["Linux", "FreeBSD"]: - self.cpp_info.components["libnss"].system_libs = ["pthread", "dl"] + self.cpp_info.components["libnss"].requires = ["util", "nspr::nspr"] + + # https://src.fedoraproject.org/rpms/nss/blob/rawhide/f/nss-util.pc.in + self.cpp_info.components["util"].set_property("pkg_config_name", "nss-util") + self.cpp_info.components["util"].libs = ["nssutil3"] + self.cpp_info.components["util"].includedirs.append(os.path.join("include", "nss")) + self.cpp_info.components["util"].requires = ["nspr::nspr"] # https://src.fedoraproject.org/rpms/nss/blob/rawhide/f/nss-softokn.pc.in self.cpp_info.components["softokn"].set_property("pkg_config_name", "nss-softokn") - self.cpp_info.components["softokn"].libs = ["freebl3", "nssdbm3", "softokn3"] - self.cpp_info.components["softokn"].includedirs.append(os.path.join("include", "nss")) - self.cpp_info.components["softokn"].requires = ["nspr::nspr", "sqlite3::sqlite3", "nssutil"] - if self.settings.os in ["Linux", "FreeBSD"]: - self.cpp_info.components["softokn"].system_libs = ["pthread", "dl"] + self.cpp_info.components["softokn"].libs = ["softokn3"] + self.cpp_info.components["softokn"].requires = ["libnss", "freebl", "sqlite3::sqlite3"] + if self.options.enable_legacy_db: + self.cpp_info.components["softokn"].requires.append("dbm") + + self.cpp_info.components["ssl"].libs = ["ssl3"] + self.cpp_info.components["ssl"].requires = ["libnss", "util", "nspr::nspr"] + + self.cpp_info.components["smime"].libs = ["smime3"] + self.cpp_info.components["smime"].requires = ["libnss", "util", "nspr::nspr"] + + self.cpp_info.components["freebl"].libs = ["freebl3"] + self.cpp_info.components["freebl"].includedirs.append(os.path.join("include", "nss")) + + if self.options.enable_legacy_db: + self.cpp_info.components["dbm"].libs = ["nssdbm3"] + self.cpp_info.components["dbm"].requires = ["util", "nspr::nspr"] + + # There are also nssckbi and nsssysinit shared libs, but these are meant to be loaded dynamically - self.cpp_info.components["nss_executables"].requires = ["zlib::zlib", "nspr::nspr", "sqlite3::sqlite3"] + self.cpp_info.components["tools"].requires = ["zlib::zlib", "nspr::nspr", "sqlite3::sqlite3"] From 735df499341924901089fd512a8ac56ac83d1e6a Mon Sep 17 00:00:00 2001 From: Martin Valgur Date: Sat, 11 Jan 2025 20:07:39 +0200 Subject: [PATCH 47/47] nss: improve static build support --- recipes/nss/all/conanfile.py | 69 +++++++++++++++++++++++++++++------- 1 file changed, 57 insertions(+), 12 deletions(-) diff --git a/recipes/nss/all/conanfile.py b/recipes/nss/all/conanfile.py index b4d1695974575..ad7279f96d7ec 100644 --- a/recipes/nss/all/conanfile.py +++ b/recipes/nss/all/conanfile.py @@ -6,7 +6,7 @@ from conan.tools.apple import fix_apple_shared_install_name from conan.tools.build import can_run from conan.tools.env import VirtualBuildEnv, Environment, VirtualRunEnv -from conan.tools.files import copy, get, rm, replace_in_file, export_conandata_patches, apply_conandata_patches, rmdir, save, load +from conan.tools.files import copy, get, replace_in_file, export_conandata_patches, apply_conandata_patches, rmdir, save, load, collect_libs from conan.tools.layout import basic_layout from conan.tools.microsoft import is_msvc, VCVars, unix_path @@ -21,7 +21,7 @@ class NSSConan(ConanFile): description = "Network Security Services" topics = ("network", "security", "crypto", "ssl") - # TODO: static builds are supported, but the necessary package_info() is complex + # FIXME: NSS_Init() fails in test_package for static builds package_type = "shared-library" settings = "os", "arch", "compiler", "build_type" options = { @@ -244,21 +244,27 @@ def build(self): def package(self): copy(self, "COPYING", src=os.path.join(self.source_folder, "nss"), dst=os.path.join(self.package_folder, "licenses")) + copy(self, "*", src=os.path.join(self._dist_dir, "public"), dst=os.path.join(self.package_folder, "include")) copy(self, "*", - src=os.path.join(self._dist_dir, "private"), - dst=os.path.join(self.package_folder, "include", "private")) - copy(self, "*", os.path.join(self._dist_dir, "bin"), os.path.join(self.package_folder, "bin")) - for pattern in ["*.a", "*.lib", "*.so", "*.chk", "*.dylib"]: - copy(self, pattern, os.path.join(self._dist_dir, "lib"), os.path.join(self.package_folder, "lib")) - copy(self, "*.dll", os.path.join(self._dist_dir, "lib"), os.path.join(self.package_folder, "bin")) - if not self.options.get_safe("shared", True): - rm(self, "*.so", os.path.join(self.package_folder, "lib")) - rm(self, "*.dll", os.path.join(self.package_folder, "bin")) + src=os.path.join(self._dist_dir, "private", "nss"), + dst=os.path.join(self.package_folder, "include", "nss", "private")) + + # Tools are always linked against shared libs only + if self.options.get_safe("shared", True): + exe_pattern = "*.exe" if self.settings.os == "Windows" else "*" + copy(self, exe_pattern, os.path.join(self._dist_dir, "bin"), os.path.join(self.package_folder, "bin")) + + lib_dir = os.path.join(self._dist_dir, "lib") + if self.options.get_safe("shared", True): + for pattern in ["*.so", "*.chk", "*.dylib", "*.dll.lib"]: + copy(self, pattern, lib_dir, os.path.join(self.package_folder, "lib")) + copy(self, "*.dll", lib_dir, os.path.join(self.package_folder, "bin")) else: - rm(self, "*.a", os.path.join(self.package_folder, "lib")) + copy(self, "*.a", lib_dir, os.path.join(self.package_folder, "lib")) + copy(self, "*.lib", lib_dir, os.path.join(self.package_folder, "lib"), excludes="*.dll.lib") fix_apple_shared_install_name(self) def package_info(self): @@ -308,4 +314,43 @@ def package_info(self): # There are also nssckbi and nsssysinit shared libs, but these are meant to be loaded dynamically + if not self.options.get_safe("shared", True): + static_libs = collect_libs(self) + + self.cpp_info.components["libnss"].libs = ["nss_static"] + self.cpp_info.components["libnss"].requires += [ + "base", "certdb", "certhi", "cryptohi", "dev", "pk11wrap", "pki", + ] + + freebl_private = [name for name in static_libs if + name.startswith("freebl") or "c_lib" in name or "gcm-" in name or "hw-acc-crypto-" in name] + self.cpp_info.components["freebl"].libs = ["freebl", "freebl_static"] + freebl_private + + self.cpp_info.components["smime"].libs = ["smime"] + self.cpp_info.components["softokn"].libs = ["softokn", "softokn_static"] + self.cpp_info.components["ssl"].libs = ["ssl"] + self.cpp_info.components["util"].libs = ["nssutil"] + + if self.options.enable_legacy_db: + self.cpp_info.components["dbm"].libs = ["nssdbm"] + + # Static-only libs + self.cpp_info.components["base"].libs = ["nssb"] + self.cpp_info.components["certdb"].libs = ["certdb"] + self.cpp_info.components["certhi"].libs = ["certhi"] + self.cpp_info.components["ckfw"].libs = ["nssckfw"] + self.cpp_info.components["crmf"].libs = ["crmf"] + self.cpp_info.components["cryptohi"].libs = ["cryptohi"] + self.cpp_info.components["dev"].libs = ["nssdev"] + self.cpp_info.components["jar"].libs = ["jar"] + self.cpp_info.components["mozpkix"].libs = ["mozpkix"] + self.cpp_info.components["mozpkix-testlib"].libs = ["mozpkix-testlib"] + self.cpp_info.components["pk11wrap"].libs = ["pk11wrap", "pk11wrap_static"] + self.cpp_info.components["pkcs7"].libs = ["pkcs7"] + self.cpp_info.components["pkcs12"].libs = ["pkcs12"] + self.cpp_info.components["pki"].libs = ["nsspki"] + + # Not built by default + # self.cpp_info.components["sysinit"].libs = ["nsssysinit_static"] + self.cpp_info.components["tools"].requires = ["zlib::zlib", "nspr::nspr", "sqlite3::sqlite3"]