你的第一个脚本

首先,为传统的“ Hello,world!”配置一个构建。程序,用C语言编写:

/* hello.c */
#include <stdio.h>

int main(void) {
   puts("Hello, world!");
   return 0;
}

例如以下示例的典型C程序的Premake脚本为:

-- premake5.lua
workspace "HelloWorld"
   configurations { "Debug", "Release" }

project "HelloWorld"
   kind "ConsoleApp"
   language "C"
   targetdir "bin/%{cfg.buildcfg}"

   files { "**.h", "**.c" }

   filter "configurations:Debug"
      defines { "DEBUG" }
      symbols "On"

   filter "configurations:Release"
      defines { "NDEBUG" }
      optimize "On"

如果将此脚本另存为名为premake5.lua的文件,并将其放置在与上述hello.c相同的目录中,则可以通过运行以下命令来生成项目文件:

$ premake5 vs2013

此特定命令将为Visual Studio 2013生成HelloWorld.sln和HelloWorld.vcxproj文件(有关导出程序的完整列表,请参阅使用Premake或运行premake --help)。如果生成生成的工作区,则将在bin / Debug或bin / Release目录中获得一个名为HelloWorld.exe的命令行可执行文件,具体取决于在Visual Studio中选择的配置。

如果您碰巧是在Linux上,则可以生成并生成一个makefile,如下所示:

$ premake5 gmake
$ make                # build default (Debug) configuration
$ make config=release # build release configuration
$ make help           # show available configurations

如果您想使用脚本的名称而不是默认的“ premake5.lua”,请使用Premake的--file参数来告诉它应该加载哪个文件。

$ premake5 --file=MyProjectScript.lua vs2013

这里发生了什么?

在本手册的其余部分中,我将分解此样本,并以某种合乎逻辑的方式介绍Premake的所有功能。 它不是火箭科学,并且您可能已经从上面的示例中了解了它的要旨,因此随时可以跳过。 但是首先,一般了解有关Premake脚本的一些知识会有所帮助。

premake是lua

Premake基于Lua(一种功能强大,快速,轻量级的脚本语言)构建。 Premake脚本实际上是Lua程序,因此在Lua中可以执行的任何操作也可以在Premake脚本中完成。

Premake基于Lua运行时构建,添加了用于定义工作空间,项目和配置以及常见构建和文件管理任务的功能。它还提供了用于设置自己的命令行选项和参数的约定,从而允许构建复杂的构建配置和自动化脚本。

由于Lua语言具有描述性,因此您的构建脚本通常看起来像静态配置文件,而不是小型程序,如您从上面的示例中看到的那样。

您可以在这里或从其出色的参考手册中了解有关Lua的更多信息,但这是理解此示例所需的以下知识:

  • 标识空白是任意的;这就是我碰巧喜欢的方式。

  • 双破折号“-”开始单行注释。

  • 大括号“ {”和“}”用于表示值列表。

函数和参数

示例脚本中的每一行实际上都是一个函数调用。 当您使用简单的字符串或表参数调用Lua函数时,可以省略通常的括号以提高可读性。 因此,该示例的前两行也可以写成:

workspace("HelloWorld")
configurations({ "Debug", "Release" })

如果您使用的不是简单的字符串或表,则括号是强制性的。

local lang = "C++"
language (lang)  -- using a variable, needs parenthesis

workspace("HelloWorld" .. _ACTION) -- using string concatenation, needs parenthesis

值和列表

Premake的大多数函数都接受单个字符串或字符串列表作为参数。单字符串参数易于使用和理解。

language "C++"

如果一个简单的值遇到多个值,则最后一个获胜。

language "C++"   -- the value is now "C++"
language "C"     -- the value is now "C"

对于接受值列表的函数,可以使用Lua的花括号语法或单个字符串值来提供列表

defines { "DEBUG", "TRACE" }  -- defines multiple values using list syntax
defines { "NDEBUG" }           -- defines a single value using list syntax
defines "NDEBUG"              -- defines a single value as a simple string

如果列表遇到多个值,则将它们串联。

defines { "DEBUG", "TRACE" }  -- value is now { "DEBUG", "TRACE" }
defines { "WINDOWS" }         -- value is now { "DEBUG", "TRACE", "WINDOWS" }

如果您希望删除以前设置的值,则所有列表函数都定义一个相应的remove ...()调用。

defines { "DEBUG", "TRACE" }  -- value is now { "DEBUG", "TRACE" }
removedefines { "TRACE" }     -- value is now { "DEBUG" }

路径

您将在Premake脚本中指定许多路径。 有两个规则要记住: 始终指定相对于它们出现在其中的脚本文件的路径。 始终使用正斜杠(“ /”)作为路径分隔符。 生成输出文件时,Premake将转换为适当的分隔符。

results matching ""

    No results matching ""