如何在我的项目中覆盖柯南共享选项?
How to overwrite conan shared option inside my project?
我有一个包含以下柯南食谱的项目:
from conans import ConanFile, CMake
class MyLibConan(ConanFile):
name = "mylib"
version = "1.16.0"
generators = "cmake"
settings = "os", "arch", "compiler", "build_type"
options = {"shared": [True, False]}
default_options = "shared=False"
exports_sources = ["*"]
url = "some-url"
license = "my license"
description = "my library"
def build(self):
cmake = CMake(self)
cmake.configure()
cmake.build()
def package(self):
# do some copying here
def package_info(self):
self.cpp_info.includedirs = ['include']
self.cpp_info.libdirs = ['lib']
self.cpp_info.libs = ['mylib']
这个库应该以静态模式构建。但是公司服务器将其构建为共享,而我的库测试失败,因为它们找不到 .lib
文件。
即使我将默认类型设置为静态,当服务器运行它的脚本时它也会被覆盖。我还从 options
中删除了 True
值,但随后整个脚本失败,因为 True
不是一个选项。
options = {"shared": [False]}
如何确保库始终以静态模式构建而服务器脚本不会失败?
显而易见的建议是修复您的服务器脚本,因为您的库可以构建为共享的和静态的。另一种可能性是更新您的服务器脚本以生成静态和共享,而不仅仅是一个选项。如果在您的公司中您需要维护内部脚本,我建议您改用 Conan Package Tools,您可以在其中定义一组要构建的配置。
但是,如果这不是一种可能的情况并且您确实需要解决方法,您仍然可以在 configure(self)
方法中强制执行您的包选项:
def configure(self):
self.options.shared = False
它将覆盖构建时参数传递的任何值。此外,包 ID 将相同,因为您的包将始终是静态的。
我有一个包含以下柯南食谱的项目:
from conans import ConanFile, CMake
class MyLibConan(ConanFile):
name = "mylib"
version = "1.16.0"
generators = "cmake"
settings = "os", "arch", "compiler", "build_type"
options = {"shared": [True, False]}
default_options = "shared=False"
exports_sources = ["*"]
url = "some-url"
license = "my license"
description = "my library"
def build(self):
cmake = CMake(self)
cmake.configure()
cmake.build()
def package(self):
# do some copying here
def package_info(self):
self.cpp_info.includedirs = ['include']
self.cpp_info.libdirs = ['lib']
self.cpp_info.libs = ['mylib']
这个库应该以静态模式构建。但是公司服务器将其构建为共享,而我的库测试失败,因为它们找不到 .lib
文件。
即使我将默认类型设置为静态,当服务器运行它的脚本时它也会被覆盖。我还从 options
中删除了 True
值,但随后整个脚本失败,因为 True
不是一个选项。
options = {"shared": [False]}
如何确保库始终以静态模式构建而服务器脚本不会失败?
显而易见的建议是修复您的服务器脚本,因为您的库可以构建为共享的和静态的。另一种可能性是更新您的服务器脚本以生成静态和共享,而不仅仅是一个选项。如果在您的公司中您需要维护内部脚本,我建议您改用 Conan Package Tools,您可以在其中定义一组要构建的配置。
但是,如果这不是一种可能的情况并且您确实需要解决方法,您仍然可以在 configure(self)
方法中强制执行您的包选项:
def configure(self):
self.options.shared = False
它将覆盖构建时参数传递的任何值。此外,包 ID 将相同,因为您的包将始终是静态的。