premake基本配置详解
前文premake在Ubuntu和GCC环境下创建简单的C++工程中举了一个例子,虽然能work,但是并不是很了解。后来花了点时间看了lua的语法,自以为理解了,再回头来看,发现还是有些不懂。现在明白了,premake虽然基于lua,但是也有自己的一些语法。标准的lua语法在premake中是肯定可以用的。
现在来细说一下原来的例子中的脚本。
[plain]
-- A solution contains projects, and defines the available configurations
solution "Hello1"
configurations { "Debug", "Release" }
-- A project defines one build target
project "Hello1"
kind "ConsoleApp"
language "C++"
files { "**.h", "**.cpp" }
configuration "Debug"
defines { "DEBUG" }
flags { "Symbols" }
configuration "Release"
defines { "NDEBUG" }
flags { "Optimize" }
注意:
1. 这些solution, configurations等都是function, 并不是变量,这里和lua标准语法不一样(标准写法也可以),而是用premake自定义的规则,有空格,有{ }号等。
2. solution可以包含多个project,语法参考http://industriousone.com/solution,solution管理多个project,这个设计很实用。
3. configurations接受的参数是每一段configuration的名字,自己应该在每个project中定义对应的configuration的设置。必须在所有project定义前调用configurations。
4. configurations函数的参数,Debug放在最前面,也就意味着将来产生的*.make文件中,Debug会作为默认设置。如果现在将Release放在最前面,生成make文件后,会看到:
[plain]
ifndef config
config=release
endif
当make不传递参数时,就会默认使用release配置。
5. project里面可以通过configuration进行设置 ,文档:http://industriousone.com/project,里面有错误:
[plain]
solution "MySolution"
configuration { "Debug", "Release" } // should be configurations
project "MyProject"
6. 注意kind,即可用在configuration里面,也可用在project里面。文档:http://industriousone.com/kind
7. configuration就是对应3中的配置函数。注意,可以用通配符,比如"*Lib"或则“*DLL”来匹配configurations中的参数。configuration函数之后所有的配置都属于这个configuration,直到遇到下一个configuration为止。在我的例子中,后续的只有defines和flags函数。文档:http://industriousone.com/configuration
8. defines用来给一个project添加预处理或者编译符号。前面两个configuration里面分别用来一次define,看一下:
[plain]
configuration "Debug"
defines { "DEBUG" }
和
[plain]
configuration "Release"
defines { "NDEBUG" }
结果在生成的Hello1.make文件中,我们看到生成了对应的gmake指令:-DDEBUG和-DNDEBUG
[plain]
ifeq ($(config),debug)
OBJDIR = obj/Debug
TARGETDIR = .
TARGET = $(TARGETDIR)/Hello1
DEFINES += -DDEBUG
和
[plain]
ifeq ($(config),release)
OBJDIR = obj/Release
TARGETDIR = .
TARGET = $(TARGETDIR)/Hello1
DEFINES += -DNDEBUG
9. flags用来指定编译或者链接过程中的标识,查看文档:http://industriousone.com/flags
我这里用了最普通的, "Symbols" 允许编译出调试信息,"Optimize"编译优化,一般为Release准备。
10. premake指令可以简化为:
[plain]
premake4 --file=config.lua gmake
原来的
[plain]
premake4 --file=config.lua --os=linux --platform=x64 gmake
有副作用。特别是--platform=x64会导致产生的make文件中有debug64和release64的配置。还是由自己控制的比较好。
11. 最后介绍一个添加文件和目录,甚至排除某些文件的用法。参考:http://industriousone.com/adding-files
有了这个,就没必要像一般的makefile每个目录都写makefile,和cmake差不多方便了。
补充:软件开发 , C++ ,