Premake可以将includeirs传播到依赖项项目吗?

时间:2019-02-01 04:30:33

标签: premake

我有一个项目,其结构大致如下:

main.c
premake5.lua

moduleA/
  premake5.lua
  include/modulea.h
  src/modulea.c

moduleB/
  premake5.lua
  include/moduleb.h
  src/moduleb.c

我的最高级别premake5.lua很简单:

workspace "myproject"
    configurations { "Debug", "Release" }

    include "moduleA"
    include "moduleB"

    project "myproject"
        kind "ConsoleApp"
        language "C"

        files { "main.c" }
        includedirs { "." }

        links { "moduleA" , "moduleB" }

我希望能够表达模块的配置/依赖性,而无需在包含的项目中使用硬编码约定。模块A和B将在其他项目中重复使用,因此我想避免这样做:

project "moduleA"
  kind "StaticLib"
  -- files, etc
  include { "..", "../moduleB/include" }
  links { "moduleB" }

包含..的include行对并非总是成立的父项目结构进行了假设。

是否有某种方式可以使高级Premake脚本“告诉”这些子项目“这是includeirs / sysincludedirs的基础”?即使涉及以不同方式编写那些依赖项项目来接受该信息?

例如(并且让我强调,我对Lua或Premake的了解不多,不足以使人理解),我的模块可以说“确保设置MODULE_INCLUDE_BASEMODULE_SYS_INCLUDE_BASE”,然后使用:

project "moduleA"
  -- etc
  include { "%{MODULE_INCLUDE_BASE}/moduleB/include" }

然后可以在包含依赖项配置之前...设置?...这些变量。 (同样,这只是一个例子,也许有一种更优雅的方法可以做到这一点。)

2 个答案:

答案 0 :(得分:0)

一种选择是通过将项目调用包装在函数本身中来推迟评估:

function project_A()
    project "moduleA"
        kind "StaticLib"
        language "C"
        files { "moduleA/src/*.c" }
        includedirs { '.' }
end

从顶层premake5.lua调用此方法时,将在顶层脚本的上下文中评估'.'

workspace "myproject"
    configurations { "Debug", "Release" }

    include "moduleA"
    include "moduleB"

    module_process()
    module_protocol()

    -- ...

然后相对于此顶级脚本进行包含。

答案 1 :(得分:0)

我建议检查导出模块中的预制件 https://github.com/Meoo/premake-export

项目可以定义需要导出到其他库或应用程序的内容。 反过来,其他库也可以导入它们依赖的项目 它非常方便,语法也很富有表现力!