From d15c58ef2e300fa9d8412b7a5dcb15772d2772fa Mon Sep 17 00:00:00 2001 From: JackCarterSmith Date: Sun, 22 Sep 2024 14:22:36 +0200 Subject: [PATCH] Final work on Conan v2 support --- Jenkinsfile | 13 ++--- conanfile.py | 129 ++++++++++++++++++++++++++++++++++++++++++++++++++ conanfile.txt | 15 ------ 3 files changed, 133 insertions(+), 24 deletions(-) create mode 100644 conanfile.py delete mode 100644 conanfile.txt diff --git a/Jenkinsfile b/Jenkinsfile index 40a001e..d008b08 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -12,7 +12,6 @@ pipeline { stage('Prepare') { steps { cleanWs() - rtConanClient(id: "conan", userHome: "/home/jackcartersmith") } } stage('Build') { @@ -22,20 +21,16 @@ pipeline { dir("linux") { checkout([$class: 'GitSCM', branches: [[name: '**']], browser: [$class: 'GiteaBrowser', repoUrl: 'https://git.jcsmith.fr/JCS-Prod/RSE-Terrain'], extensions: [], userRemoteConfigs: [[credentialsId: 'jenkins-ssh', url: 'ssh://git@git.jcsmith.fr:2322/JCS-Prod/RSE-Terrain.git']]]) sh 'git submodule update --init --recursive' - dir("build") { - rtConanRun(clientId: "conan", command: "install .. -s build_type=Release -pr:b=default -pr:h=default --build=missing") - } - cmakeBuild buildDir: 'build', cmakeArgs: '-DCMAKE_TOOLCHAIN_FILE="conan_toolchain.cmake" -DCMAKE_BUILD_TYPE=Release', installation: 'latest', steps: [[args: 'all']] + sh 'conan install . -of build -s build_type=Release -o tools=True -pr:h=default -pr:b=default --build=missing' + cmakeBuild buildDir: 'build', cmakeArgs: '-DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -RSPTERRAIN_SHARED=ON -RSPTERRAIN_STATIC=OFF -DBUILD_TOOLS=ON -DCMAKE_POLICY_DEFAULT_CMP0091=NEW -DCMAKE_BUILD_TYPE=Release', installation: 'latest', steps: [[args: 'all']] } }, windows: { dir("windows") { checkout([$class: 'GitSCM', branches: [[name: '**']], browser: [$class: 'GiteaBrowser', repoUrl: 'https://git.jcsmith.fr/JCS-Prod/RSE-Terrain'], extensions: [], userRemoteConfigs: [[credentialsId: 'jenkins-ssh', url: 'ssh://git@git.jcsmith.fr:2322/JCS-Prod/RSE-Terrain.git']]]) sh 'git submodule update --init --recursive' - dir("build") { - rtConanRun(clientId: "conan", command: "install .. -s build_type=Release -pr:b=default -pr:h=windows --build=missing") - } - cmakeBuild buildDir: 'build', cmakeArgs: '-DCMAKE_SYSTEM_NAME=Windows -DCMAKE_C_COMPILER=x86_64-w64-mingw32-gcc -DCMAKE_RC_COMPILER=x86_64-w64-mingw32-windres -DCMAKE_TOOLCHAIN_FILE="conan_toolchain.cmake" -DCMAKE_BUILD_TYPE=Release', installation: 'latest', steps: [[args: 'all']] + sh 'conan install . -of build -s build_type=Release -o tools=True -pr:h=default -pr:b=default --build=missing' + cmakeBuild buildDir: 'build', cmakeArgs: '-DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -RSPTERRAIN_SHARED=ON -RSPTERRAIN_STATIC=OFF -DBUILD_TOOLS=ON -DCMAKE_POLICY_DEFAULT_CMP0091=NEW -DCMAKE_BUILD_TYPE=Release', installation: 'latest', steps: [[args: 'all']] } } ) diff --git a/conanfile.py b/conanfile.py new file mode 100644 index 0000000..1ecba43 --- /dev/null +++ b/conanfile.py @@ -0,0 +1,129 @@ +import os +from conan import ConanFile +from conan.tools.cmake import CMakeToolchain, CMakeDeps, CMake +from conan.tools.files import copy +from conan.tools.scm import Git, Version + +required_conan_version = ">=2.3" + +class RsetextureConan(ConanFile): + name = "rspterrainlib" + package_type = "library" + version = "2.1.0" + revision_mode = "scm" + license = "GPL-3.0" + author = "JackCarterSmith " + url = "https://git.jcsmith.fr/JCS-Prod/RSE-Terrain" + description = "Rogue Squadron 3D (PC) game terrain files (hmp) extractor" + settings = "os", "compiler", "build_type", "arch" + generators = "CMakeDeps" + options = { + "shared": [True, False], + "tools": [True, False], + "fPIC": [True, False] + } + + default_options = { + "shared": True, + "tools": False, + "fPIC": True + } + + @property + def _is_msvc(self): + return str(self.settings.compiler) in ["Visual Studio", "msvc"] + + #def validate(self): + # if self.settings.os == "Macos": + # raise ConanInvalidConfiguration("MacOS not supported") + + def config_options(self): + if self.settings.os == "Windows": + del self.options.fPIC + + def configure(self): + self.options["libpng"].shared = True + self.options["libpng"].sse = True + if self.options.shared: + self.options.rm_safe("fPIC") + + def requirements(self): + if self.options.tools: + self.requires("glew/2.2.0") + self.requires("zlib/1.3.1") + self.requires("libpng/1.6.43") + + def source(self): + git = Git(self) + cargs = ['--single-branch', '--recursive', '--depth', '1', '--branch', 'v' + self.version] + git.clone(url="https://git.jcsmith.fr/JCS-Prod/RSE-Terrain.git", target=".", args=cargs) + +# def _patch(self): +# replace_in_file(self, os.path.join(self.source_folder, "RSPTextureLib", "CMakeLists.txt"), +# 'set_target_properties(rsp-texture-libstatic PROPERTIES OUTPUT_NAME "${RSP_TEXTURE_LIB_NAME}_static")', +# 'set_target_properties(rsp-texture-libstatic PROPERTIES OUTPUT_NAME "${RSP_TEXTURE_LIB_NAME}")') + + def export_sources(self): + copy(self, "CMakeLists.txt", self.recipe_folder, self.export_sources_folder) + +# def layout(self): +# cmake_layout(self, src_folder='.', build_folder='build') + + def generate(self): + tc = CMakeToolchain(self) + tc.cache_variables["RSPTERRAIN_SHARED"] = self.options.shared + tc.cache_variables["RSPTERRAIN_STATIC"] = not self.options.shared + tc.cache_variables["BUILD_TOOLS"] = self.options.tools + #tc.cache_variables["BUILD_DEBUG"] = self.settings.build_type == "Debug" + tc.generate() + + #cmdeps = CMakeDeps(self) + #cmpdeps.set_property("zlib", "cmake_find_mode", "both") + #cmpdeps.set_property("libpng", "cmake_find_mode", "both") + #if self.options.shared: + #cmdeps.configuration = "ReleaseShared" + #cmdeps.generate() + + for dep in self.dependencies.values(): + if len(dep.cpp_info.bindirs) > 0: + if self.settings.os == "Windows": + if self._is_msvc: + copy(self, "*.dll", dep.cpp_info.bindirs[0], os.path.join(self.build_folder, "bin", str(self.settings.build_type))) + else: + copy(self, "*.dll", dep.cpp_info.bindirs[0], os.path.join(self.build_folder, "bin")) + else: + copy(self, "*.so", dep.cpp_info.bindirs[0], os.path.join(self.build_folder, "bin")) + + def build(self): + cmbuilder = CMake(self) + #self._patch() + cmbuilder.configure() + cmbuilder.build() + + def package(self): + copy(self, "LICENSE", src=self.source_folder, dst=os.path.join(self.package_folder, "licenses")) + copy(self, pattern="*.h", src=os.path.join(self.source_folder, "include"), dst=os.path.join(self.package_folder, "include")) + copy(self, pattern="*.a", src=self.build_folder, dst=os.path.join(self.package_folder, "lib"), keep_path=False) + copy(self, pattern="*.so", src=self.build_folder, dst=os.path.join(self.package_folder, "lib"), keep_path=False) + copy(self, pattern="*.lib", src=self.build_folder, dst=os.path.join(self.package_folder, "lib"), keep_path=False) + copy(self, pattern="*.dll", src=self.build_folder, dst=os.path.join(self.package_folder, "bin"), keep_path=False) + + def package_info(self): + self.cpp_info.set_property("cmake_file_name", "RSETerrain") + self.cpp_info.set_property("cmake_target_name", "RSETerrain") + self.cpp_info.set_property("cmake_module_target_name", "RSETerrain::RSETerrain") + self.cpp_info.set_property("cmake_find_mode", "both") + + self.cpp_info.names["cmake_find_package"] = "RSETerrain" + self.cpp_info.names["cmake_find_package_multi"] = "RSETerrain" + + self.cpp_info.includedirs = ["include"] + + prefix = "lib" if self._is_msvc else "" + #suffix = "d" if self.settings.build_type == "Debug" else "" + suffix = "" + major_min_version = f"{Version(self.version).major}{Version(self.version).minor}" + + self.cpp_info.libs = ["{}RSETerrain{}{}".format(prefix, major_min_version, suffix)] + if self.settings.os in ["Linux", "Android", "FreeBSD", "SunOS", "AIX"]: + self.cpp_info.system_libs.append("m") diff --git a/conanfile.txt b/conanfile.txt deleted file mode 100644 index 0688c03..0000000 --- a/conanfile.txt +++ /dev/null @@ -1,15 +0,0 @@ -[requires] -zlib/1.2.13 -libpng/1.6.40 -glew/2.2.0 - -[generators] -CMakeDeps -CMakeToolchain - -[options] -libpng/*:shared=True -glew/*:shared=True - -[imports] -bin, *.dll -> ./bin \ No newline at end of file