|
|
- # Erlang nif port compiler
- windows linux mac下erlang nif或者port_driver通用编译脚本
- 改造自 erlang-native-compiler
-
-
- ## Usage
- default_env
- 1. Clone this repository
- 1. Run `make` in this directory
- 1. Copy `eNpc` to your project "c_src" dir and commit it
- 1. Add these (or similar) hooks to your rebar.config:
-
- ```erlang
- {pre_hooks, [{"", compile, "escript c_src/eNpc compile"}]}.
- {post_hooks, [{"", clean, "escript c_src/eNpc clean"}]}.
- ```
-
- After that eNpc should read your old rebar.config `port_specs` and `port_env` settings as expected (it is rebar2's port compiler after all...).
-
- ###
- ```
- Supported configuration variables:
- * port_specs - Erlang list of tuples of the forms
- {ArchRegex, TargetFile, Sources, Options}
- {ArchRegex, TargetFile, Sources}
- {TargetFile, Sources}
-
- Note that if you want to use any of the rebar3 variables
- below you must MUST use a ${}-style to get the expansion
- to work. e.g. to expand REBAR_DEPS_DIR, do something like:
-
- {port_specs, [{"priv/nif.so",
- ["c_src/nif.c",
- "${REBAR_DEPS_DIR}/foo/bar.c"]}]}.
-
- This is a _very_ good way to be able to use your code both
- as a top level app and a dependency.
-
- CAVEAT! Not using {} is broken for the moment.
-
- * port_env - Erlang list of key/value pairs which will control
- the environment when running the compiler and linker.
- Variables set in the surrounding system shell are taken
- into consideration when expanding port_env. Note that
- for ERL_LDFLAGS, -lerl_interface is used for only those
- Erlang/OTP versions where it exists (those prior to
- version 23.0).
-
- By default, the following variables are defined:
- CC - C compiler
- CXX - C++ compiler
- CFLAGS - C compiler
- CXXFLAGS - C++ compiler
- LDFLAGS - Link flags
- ERL_CFLAGS - default -I paths for erts and ei
- ERL_LDFLAGS - default -L and -lerl_interface -lei
- DRV_CFLAGS - flags that will be used for compiling
- DRV_LDFLAGS - flags that will be used for linking
- EXE_CFLAGS - flags that will be used for compiling
- EXE_LDFLAGS - flags that will be used for linking
- ERL_EI_LIBDIR - ei library directory
- DRV_CXX_TEMPLATE - C++ command template
- DRV_CC_TEMPLATE - C command template
- DRV_LINK_TEMPLATE - C Linker command template
- DRV_LINK_CXX_TEMPLATE - C++ Linker command template
- EXE_CXX_TEMPLATE - C++ command template
- EXE_CC_TEMPLATE - C command template
- EXE_LINK_TEMPLATE - C Linker command template
- EXE_LINK_CXX_TEMPLATE - C++ Linker command template
-
- Note that if you wish to extend (vs. replace) these variables,
- you MUST include a shell-style reference in your definition.
- e.g. to extend CFLAGS, do something like:
-
- {port_env, [{"CFLAGS", "$CFLAGS -MyOtherOptions"}]}
-
- It is also possible to specify platform specific options
- by specifying a triplet where the first string is a regex
- that is checked against Erlang's system architecture string.
- e.g. to specify a CFLAG that only applies to x86_64 on linux
- do:
-
- {port_env, [{"x86_64.*-linux", "CFLAGS",
- "$CFLAGS -X86Options"}]}
-
- Cross-arch environment variables to configure toolchain:
- GET_ARCH to set the tool chain name to use
- GET_ARCH_WORDSIZE (optional - to determine word size)"
- word size is 32
- GET_ARCH_VSN (optional - "
- l version of CC/CXX is requested),
-
-
- {port_specs, [
- {"priv/jiffy.so", [
- "c_src/*.c",
- "c_src/*.cc",
- "c_src/double-conversion/*.cc"
- ]}
- ]}.
-
- {port_env, [
- % Drop -lerl_interface
- {"ERL_LDFLAGS", " -L$ERL_EI_LIBDIR -lei"},
- {"win32", "ERL_LDFLAGS", " /LIBPATH:$ERL_EI_LIBDIR ei.lib"},
-
- {".*", "FLTO_FLAG", ""},
-
- {"(linux|solaris|freebsd|netbsd|openbsd|dragonfly|darwin|gnu)", "CFLAGS", "$CFLAGS -Ic_src/ -g -Wall $FLTO_FLAG -Werror -O3"},
- {"(linux|solaris|freebsd|netbsd|openbsd|dragonfly|darwin|gnu)", "CXXFLAGS", "$CXXFLAGS -Ic_src/ -g -Wall $FLTO_FLAG -Werror -O3"},
-
- {"(linux|solaris|freebsd|netbsd|openbsd|dragonfly|darwin|gnu)", "LDFLAGS", "$LDFLAGS $FLTO_FLAG -lstdc++"},
-
- %% OS X Leopard flags for 64-bit
- {"darwin9.*-64$", "CXXFLAGS", "-m64"},
- {"darwin9.*-64$", "LDFLAGS", "-arch x86_64"},
-
- %% OS X Snow Leopard flags for 32-bit
- {"darwin10.*-32$", "CXXFLAGS", "-m32"},
- {"darwin10.*-32$", "LDFLAGS", "-arch i386"},
-
- {"win32", "CXXFLAGS", "$CXXFLAGS /O2 /DNDEBUG"}
- ]}.
- ```
|