项目中需要将同一份的源文件发布到不同的目录, 以前的做法是修改Emakefile
配置后,使用erl -make
生成,有点麻烦.
我们知道,编译erlang使用erl -make
,而erl -make
实际上调用的make:all().
, 而make:all().
会读取当前目录下的Emakefile
文件,根据相应的配置来编译文件.
如上,目前一些特殊的需求无法满足:
- 一个文件编译到不同的目录下;
- 读取Emakefile,然后修改其中部分参数后再编译(比如,修改outdir);
- 如果有Emakefile1, Emakefile2…EmakefileN, 怎么按照每个编译选项编译?
那如何即使用Emakefile
,又能够满足上面的需求呢?
我们先来做一些测试, 用到erlang
的make
和compile
模块.
现在我们有目录结构:
1 | . |
正常的Emakefile
一个正常的Emakefile
文件内容:
1 | {["./src/*"], [{outdir, "./ebin"}]}. |
现在使用erl -make
编译, 结果:
1 | . |
正确编译
缺少参数的Emakefile
Emakefile
1 | {["./src/*"], []}. |
编译:
1 | 1> make:all([{outdir, "./ebin"}]). |
结果和预想的结构一致
1 | . |
修改已经存在的Emakefile参数?
一个正常的Emakefile
1 | {["./src/*"], [{outdir, "./ebin"}]}. |
新建一个目录mkdir ebin1
,作为编译输出目录
显示编译完成
1 | 1> make:all([{outdir, "./ebin1"}]). |
看下结果:
1 | . |
结果并没有如我们预料的在ebin1目录下生成文件,这说明make的时候优先Emakefile中的参数
回到最开始的问题
回到最开始的问题, 解决方法:
- Emakefile只保留公有编译选项, 比如
{i, "include"}
等; - 个性部分,通过
make:all(Options).
的Options
选项传进去, 比如{outdir, "./ebin"}
,{d, debug}
等;
现在贴下小脚本,凑下字数:
1 | %% =========================================================================== |