N2的编译系统核心主要是由三部分组成:
模块: 有一组源文件和头文件构成,这组文件包含从nRoot继承过来的代码,以及任意的代码.
目标: 执行文件,比如.exe,静态库,比如,.lib,动态库,比如,.dll
工作区: 由一起编译过的目标组成的集合.
其中每个模块都只对应于一个nRoot继承的文件.因此不能将多个源文件在任意 一个模块中对应于一个NebulaClass或NebulaScriptClass.
编译系统按照以下的目录来查找bld files:
$home/code/nebula2/bldfiles and its subdirectories
$home/code/XXX/bldfiles
$home/code/contrib/XXX/bldfiles
$home:就是主目录了,bldfiles会在这里被搜索到,并且按照一定的规格生成相应的工程文件,这里的bldfiles就相当于配置文件.
并且我们用update.py在 $home/build/[compiler]生成工作区,解决方案等,
模块是一些相关文件的集合,经常是单个类的头文件和源文件,在工程中需要的文件都可以列在这里.
比如:
beginmodule nmyclass1
setdir wheretofindthefollowing
setfiles { nmyclass1_main }
setheaders { nmyclass1 }
endmodule
上面是设置源文件和头文件所在的目录以及源文件名和头文件名.
一般地,我们在建模块的时候,都要用beginmodule和endmodule对应起来.
setdir设置的路径是这样的:相当于home/code/XXX/src----inc,或者是home/code/contrib/XXX/src以及对应的inc,这里的目录主要是贡献的目录,其它程序员提供的模块.
接着,我们可以将这个module放置到一个新的目标里面去.
begintarget mylibrary
settype lib
setmodules { nmyclass1 nmyclass2 }
endtarget
很 显然,这个目标是想将原来的模块组成一个lib库.这里的话,settype还可以改成dll或者exe.他们将分别生成lib,dll,exe.
接着我们就可以定义一个更加大的了.---workspace.
beginworkspace myProjectWorkspace
setbinarydir ./bin/
settargets {
mylibrary
nkernel
nnebula
}
endworkspace
在这targets里面就有我们在之前定义的东西,mylibrary,可以看出,这种结果是由上'而下来的,由小变大.
setbinarydir的目录是相对于home而来的,settargets 是设置一些在工作区或者解决方案中出现的目标.