Premake工具链

警告

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

重要

此类将生成仅与 Premake 版本 ≥ 5.0.0 兼容的文件

PremakeToolchain 生成器可以在 conanfile 中按名称使用

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()

生成的文件

在执行 conan install 命令(或在缓存中构建包时)之后,PremakeToolchain 会生成 conantoolchain.premake5.lua 文件,其中包含在 generate() 方法中提供的信息,以及从当前 settingsconf 等转换的信息。

Premake 没有暴露任何 API 来交互、注入或修改构建脚本。此外,Premake 没有工具链的概念,因此按照 Premake 维护者的说明(参见 Premake 讨论),由于 Premake 是基于 Lua 脚本构建的,Conan 生成的文件是一个 Lua 脚本,它将覆盖原始 Premake 脚本并添加以下信息:

  • 从 Conan 设置中检测 buildtype

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

  • 根据需要定义 C 标准。

  • 根据 Conan 配置和操作系统检测 Premake action

  • 定义构建文件夹,以避免 Premake 在源仓库中创建构建文件夹和对象文件的默认行为(这与 Conan 的最佳实践相悖)。

  • 根据用户配置值定义编译器和链接器标志以及宏定义。

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

  • 根据 Conan 选项定义 fPIC 标志。

  • 根据 shared Conan 选项,PremakeToolchain 会将 workspacekind 设置为 SharedLibStaticLib

注意

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

建议:由于 Premake 没有提供像 CMake 的 BUILD_SHARED_LIBS 那样外部管理库创建类型(共享库或静态库)的机制,因此在使用 Conan 时,建议避免在库项目中定义 kind 属性。

参考

class PremakeToolchain(conanfile)

PremakeToolchain 生成器

参数:

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

extra_cxxflags

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

extra_cflags

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

extra_ldflags

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

extra_defines

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

project(project_name)

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

generate()

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