Erlang中文论坛

标题: erlang.mk文档(3) [打印本页]

作者: 茶叶feng    时间: 2018-11-6 19:47
标题: erlang.mk文档(3)
有道云 http://note.youdao.com/noteshare ... CD3A9EC7FFCFCB9DF7C
#### NIF和端口驱动程序(NIFs and port drivers)
erlang.mk不单只可以构建erlang项目,还能构建附带的c项目,例如NIFs和port drivers
有两个办法构建c代码:
- 本地Makefile
- 用erlang.mk直接完成
c代码将在执行make时被构建

##### c源代码位置和erlang环境(C source code location and Erlang environment)
c源代码应该放在```$(C_SRC_DIR)```目录,默认为```c_scr/```,修改的办法如下:
```
C_SRC_DIR = $(CURDIR)/my_nif_source
```
如果这个路径存在,erlang.mk会自动创建名为```$(C_SRC_ENV)```文件,默认在```$(C_SRC_DIR)/env.mk``,这也能修改:
```
C_SRC_ENV = $(C_SRC_DIR)/erlang_env.mk
```
还有一些变量和构建相关:
```ERTS_INCLUDE_DIR``` :ERTS头文件路径
```ERL_INTEREFACE_INCLUDE_DIR``` :Erl_interface头文件路径
```ERL_INTERFACE_LIB_DIR``` :Erl_interface静态库路径

##### 使用自定义Makefile(Using a custom Makefile)
erlang.mk会自动运行make如果它检测到```$(C_SRC_DIR)/Makefile```文件
Makefile至少要有两个target
- 默认target(一般是all),被调用的时候构建c代码
- clean target指定构建的默认target
因为erlang有环境监测,所以也可以在Makefile中包含env.mk文件
```
include env.mk
```
##### 直接使用erlang.mk(Using Erlang.mk directly)
你其实可以不需要写Makefile就可以构建c源代码,erlang.mk自带的规则,可以用```$(C_SRC_DIR)```目录下的文件构建库应用和可执行应用

默认情况下,erlang.mk会创建一个共享库,如果要改成创建可执行文件,在包含erlang.mk之前写下这句:
```
C_SRC_TYPE = executable
```
生成的文件名根据你项目的类型和构建项目的平台而有所不同
- 共享库:```$(C_SRC_OUTPUT)$(C_SRC_SHARED_EXTENSION)```,默认情况下是```$(CURDIR)/priv/$(PROJECT)```,windows下扩展名为.dll,其它系统是.so
- 可执行文件:```$(C_SRC_OUTPUT)$(C_SRC_EXECUTABLE_EXTENSION)```,默认目录一样,windows下扩展名是.exe,其他系统没有扩展名

erlang.mk编译连接标志:
- CC : 要使用的编译器
- CFLAGS : C编译器的标志
- CXXFLAGS : C++编译器标志
- LDFLAGS : Linker标志
- LDLIBS : 链接的库.

源文件将由erlang.mk自动从```$(C_SRC_DIR)```中寻找.c,.C,.cc,和.cpp源文件获取

##### 将编译和连接标志发到sub-Makefiles(Propagating compile and linker flags to sub-Makefiles)
有些情况下你需要将编译和连接标志定义到你本地项目的sub-Makefiles里面,通常,你不能只导出这些,因为这会影响到项目的依赖项

Makefile允许你导出特定目标的变量,这么做的话这个变量只有在目标运行的时候才会导出,这样我们就能在构建c代码的时候才导出他们,而对其他构建过程没有影响

下面五个变量添加到Makefile,他们将在sub-Makefiles构建c代码的时候生效:
```
app-c_src: export CC +=
app-c_src: export CFLAGS +=
app-c_src: export CPPFLAGS +=
app-c_src: export LDFLAGS +=
app-c_src: export LDLIBS +=
```
必须要给一个值,即使是空字符串,Makefile等待特定目标去导出,或者你也可以直接赋值
```
app-c_src: export CFLAGS = -O3
```






欢迎光临 Erlang中文论坛 (https://bbs.erldoc.com/) Powered by Discuz! X3.3