aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <waruqi@gmail.com>2019-08-21 00:53:53 +0800
committerruki <waruqi@gmail.com>2019-08-20 23:23:20 +0800
commitd9b6e4d9d003fa53a9245fe03dd894f4bddc8afb (patch)
tree6e2cdff6ad1f566791e7c09c0080ee7903e791a3
parentbe189b16eccdedf0cb2a692ad00c44db2a531f10 (diff)
downloadxmake-docs-d9b6e4d9d003fa53a9245fe03dd894f4bddc8afb.tar.gz
xmake-docs-d9b6e4d9d003fa53a9245fe03dd894f4bddc8afb.zip
update docs
-rw-r--r--zh-cn/guide/syntax_description.md125
1 files changed, 125 insertions, 0 deletions
diff --git a/zh-cn/guide/syntax_description.md b/zh-cn/guide/syntax_description.md
index 30fe5f80..cd814bdd 100644
--- a/zh-cn/guide/syntax_description.md
+++ b/zh-cn/guide/syntax_description.md
@@ -9,6 +9,129 @@ target("test")
add_files("src/*.c")
```
+## 配置域
+
+xmake.lua采用二八原则实现了描述域、脚本域两层分离式配置。
+
+什么是二八原则呢,简单来说,大部分项目的配置,80%的情况下,都是些基础的常规配置,比如:`add_cxflags`, `add_links`等,
+只有剩下不到20%的地方才需要额外做些复杂来满足一些特殊的配置需求。
+
+而这剩余的20%的配置通常比较复杂,如果直接充斥在整个xmake.lua里面,会把整个项目的配置整个很混乱,非常不可读。
+
+因此,xmake通过描述域、脚本域两种不同的配置方式,来隔离80%的简单配置以及20%的复杂配置,使得整个xmake.lua看起来非常的清晰直观,可读性和可维护性都达到最佳。
+
+### 描述域
+
+对于刚入门的新手用户,或者仅仅是维护一些简单的小项目,通过完全在描述配置就已经完全满足需求了,那什么是描述域呢?它长这样:
+
+```lua
+target("test")
+ set_kind("binary")
+ add_files("src/*.c")
+ add_defines("DEBUG")
+ add_links("pthread", "m", "dl")
+```
+
+一眼望去,其实就是个 `set_xxx`/`add_xxx`的配置集,对于新手,完全可以不把它当做lua脚本,仅仅作为普通的,但有一些基础规则的配置文件就行了。
+
+如果因为,看着有括号,还是像脚本语言的函数调用,那我们也可以这么写(是否带括号看个人喜好):
+
+```lua
+target "test"
+ set_kind "binary"
+ add_files "src/*.c"
+ add_defines "DEBUG"
+ add_links "pthread", "m", "dl"
+```
+
+这是不是看着更像配置文件了?其实描述域就是配置文件,类似像json等key/values的配置而已,所以即使完全不会lua的新手,也是能很快上手的。
+
+而且,对于通常的项目,仅通过`set_xxx/add_xxx`去配置各种项目设置,已经完全满足需求了。
+
+这也就是开头说的:80%的情况下,可以用最简单的配置规则去简化项目的配置,提高可读性和可维护性,这样对用户和开发者都会非常的友好,也更加直观。
+
+如果我们要针对不同平台,架构做一些条件判断怎么办?没关系,描述域除了基础配置,也是支持条件判断,以及for循环的:
+
+```lua
+target("test")
+ set_kind("binary")
+ add_files("src/*.c")
+ add_defines("DEBUG")
+ if is_plat("linux", "macosx") then
+ add_links("pthread", "m", "dl")
+ end
+```
+
+```lua
+target("test")
+ set_kind("binary")
+ add_files("src/*.c")
+ add_defines("DEBUG")
+ for _, name in ipairs({"pthread", "m", "dl"}) do
+ add_links(name)
+ end
+```
+
+这是不是看着有点像lua了?虽说,平常可以把它当做普通配置问题,但是xmake毕竟基于lua,所以描述域还是支持lua的基础语言特性的。
+
+!> 不过需要注意的是,描述域虽然支持lua的脚本语法,但在描述域尽量不要写太复杂的lua脚本,比如一些耗时的函数调用和for循环
+
+并且在描述域,主要目的是为了设置配置项,因此xmake并没有完全开放所有的模块接口,很多接口在描述域是被禁止调用的,
+即使开放出来的一些可调用接口,也是完全只读的,不耗时的安全接口,比如:`os.getenv()`等读取一些常规的系统信息,用于配置逻辑的控制。
+
+!> 另外需要注意一点,xmake.lua是会被多次解析的,用于在不同阶段解析不同的配置域:比如:`option()`, `target()`等域。
+
+因此,不要想着在xmake.lua的描述域,写复杂的lua脚本,也不要在描述域调用print去显示信息,因为会被执行多遍,记住:会被执行多遍!!!
+
+### 脚本域
+
+限制描述域写复杂的lua,各种lua模块和接口都用不了?怎么办?这个时候就是脚本域出场的时候了。
+
+如果用户已经完全熟悉了xmake的描述域配置,并且感觉有些满足不了项目上的一些特殊配置维护了,那么我们可以在脚本域做更加复杂的配置逻辑:
+
+```lua
+target("test")
+ set_kind("binary")
+ add_files("src/*.c")
+ on_load(function (target)
+ if is_plat("linux", "macosx") then
+ target:add("links", "pthread", "m", "dl")
+ end
+ end)
+ after_build(function (target)
+ import("core.project.config")
+ local targetfile = target:targetfile()
+ os.cp(targetfile, path.join(config.buildir(), path.filename(targetfile)))
+ print("build %s", targetfile)
+ end)
+```
+
+只要是类似:`on_xxx`, `after_xxx`, `before_xxx`等字样的function body内部的脚本,都属于脚本域。
+
+在脚本域中,用户可以干任何事,xmake提供了import接口可以导入xmake内置的各种lua模块,也可以导入用户提供的lua脚本。
+
+我们可以在脚本域实现你想实现的任意功能,甚至写个独立项目出来都是可以的。
+
+对于一些脚本片段,不是很臃肿的话,像上面这么内置写写就足够了,如果需要实现更加复杂的脚本,不想充斥在一个xmake.lua里面,可以把脚本分离到独立的lua文件中去维护。
+
+例如:
+
+```lua
+target("test")
+ set_kind("binary")
+ add_files("src/*.c")
+ on_load("modules.test.load")
+ on_install("modules.test.install")
+```
+
+我们可以吧自定义的脚本放置到xmake.lua对应目录下,`modules/test/load.lua`和`modules/test/install.lua`中独立维护。
+
+这些独立的lua脚本里面,我们还可以通过import导入各种内置模块和自定义模块进来使用,就跟平常写lua, java没啥区别。
+
+而对于脚本的域的不同阶段,`on_load`主要用于target加载时候,做一些动态化的配置,这里不像描述域,只会执行一遍哦!!!
+
+其他阶段,还有很多,比如:`on/after/before`_`build/install/package/run`等,具体看下后面的target api手册部分吧,这里就不细说了。
+
## 作用域
xmake的描述语法是按作用域划分的,主要分为:
@@ -226,6 +349,8 @@ add_files("*.c")
最后附上,tbox的[xmake.lua](https://github.com/tboox/tbox/blob/master/src/tbox/xmake.lua)描述,仅供参考。。
+## 配置结构
+
## 语法简化
xmake.lua的配置域语法,非常灵活,可以在相关域做各种复杂灵活的配置,但是对于许多精简的小块配置,这个时候就稍显冗余了: