PremakeToolchain

警告

此功能是实验性的,可能会发生重大更改。有关更多信息,请参阅 Conan 稳定性 部分。

重要

这个类将生成仅与 Premake 版本 >= 5.0.0 兼容的文件

在 conanfiles 中可以使用 PremakeToolchain 生成器

conanfile.py
class Pkg(ConanFile):
    generators = "PremakeToolchain"
conanfile.txt
[generators]
PremakeToolchain

它也可以在 conanfile 的 generate() 方法中完全实例化

用法示例

from conan.tools.premake import PremakeToolchain

class Pkg(ConanFile):
    settings = "os", "compiler", "build_type", "arch"

    def generate(self):
        tc = PremakeToolchain(self)
        tc.extra_defines = ["VALUE=2"]                      # Add define to main premake workspace
        tc.extra_cflags = ["-Wextra"]                       # Add cflags to main premake workspace
        tc.extra_cxxflags = ["-Wall", "-Wextra"]            # Add cxxflags to main premake workspace
        tc.extra_ldflags = ["-lm"]                          # Add ldflags to main premake workspace
        tc.project("main").extra_defines = ["TEST=False"]   # Add define to "main" project (overriding possible value)
        tc.project("main").extra_cxxflags = ["-FS"]         # Add cxxflags to "main" project
        tc.project("test").disable = True                   # A way of disabling "test" project compilation
        tc.project("foo").kind = "StaticLib"                # Override library type of "foo"
        tc.generate()

生成的文件

PremakeToolchainconan install (或在缓存中构建包) 之后生成 conantoolchain.premake5.lua 文件,其中包含在 generate() 方法中提供的信息,以及从当前 settingsconf 等翻译的信息。

Premake 没有暴露任何种类的 API 来交互注入/修改构建脚本。 此外,premake 没有工具链的概念,因此遵循 premake 维护者的指示(参见 premake 讨论),由于 premake 是基于 Lua 脚本构建的,Conan 生成的文件是一个 Lua 脚本,它将覆盖原始 premake 脚本,添加以下信息

  • 检测来自 Conan 设置的 buildtype

  • 根据需要定义 C++ 标准。

  • 根据需要定义 C 标准。

  • 基于 conan profile 和 OS 检测 premake action

  • 定义构建文件夹,以避免默认 premake 行为,即在源代码仓库中创建构建文件夹和目标文件(这违反了 conan 最佳实践)。

  • 基于用户配置值定义编译器和链接器标志和定义。

  • 在交叉构建时定义正确的目标架构。

  • 基于 conan 选项定义 fPIC 标志。

  • 基于 shared conan 选项,PremakeToolchain 将把 workspacekind 设置为 SharedLibStaticLib

注意

PremakeToolchain 无法覆盖项目的 kind,如果该项目已经定义了 kind 属性(典型情况)。它只能覆盖顶层 workspace.kind,这只会影响没有定义 kind 的项目。

建议:由于 premake 没有像 CMake 的 BUILD_SHARED_LIBS 那样外部管理库创建类型的机制,因此建议在使用 conan 时避免在库项目中定义 kind 属性。

参考

class PremakeToolchain(conanfile)

PremakeToolchain 生成器

参数:

conanfile< ConanFile 对象 > 当前配方对象。始终使用 self

extra_cxxflags

额外的 CXX 标志列表。添加到 buildoptions

extra_cflags

额外的 C 标志列表。添加到 buildoptions

extra_ldflags

额外的链接器标志列表。添加到 linkoptions

extra_defines

额外的预处理器定义列表。添加到 defines

project(project_name)

返回的对象也将具有与工作区相同的属性,但只会影响名称为 project_name 的项目。 :param project_name: 工作区中要更新的项目的名称。 :return: <PremakeProject> 对象,允许设置项目特定的标志。

generate()

创建一个 conantoolchain.premake5.lua 文件,该文件将根据工具链配置正确配置构建路径、二进制路径、配置设置以及编译器/链接器标志。