| %% -*- tab-width: 4;erlang-indent-level: 4;indent-tabs-mode: nil -*- |
| %% ex: ft=erlang ts=4 sw=4 et |
| |
| %% Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| %% use this file except in compliance with the License. You may obtain a copy of |
| %% the License at |
| %% |
| %% http://www.apache.org/licenses/LICENSE-2.0 |
| %% |
| %% Unless required by applicable law or agreed to in writing, software |
| %% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| %% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| %% License for the specific language governing permissions and limitations under |
| %% the License. |
| |
| |
| Cfg = case file:consult("../../pkg.vars.config") of |
| {ok, Terms} -> |
| Terms; |
| _Err -> |
| [] |
| end, |
| |
| %% get version infos |
| MajorVersion = integer_to_list(proplists:get_value(version_major, Cfg, 0)), |
| MinorVersion = integer_to_list(proplists:get_value(version_minor, Cfg, 0)), |
| RevVersion = integer_to_list(proplists:get_value(version_revision, Cfg, 0)), |
| |
| %% build the version |
| BaseVersion = MajorVersion ++ "." ++ MinorVersion ++ "." ++ RevVersion, |
| |
| Version = case os:getenv("RELEASE_TAG") of |
| false -> |
| BaseVersion; |
| "git" -> |
| {0, Ret} = eunit_lib:command("git describe --always"), |
| Tag = [C||C <- Ret, C =/= $\n], |
| BaseVersion ++ "+build." ++ Tag; |
| Tag -> |
| BaseVersion ++ Tag |
| end, |
| |
| %% couchjs name |
| CouchJSName = proplists:get_value(couchjs_name, Cfg, "couchjs"), |
| |
| %% build config.h |
| ConfigH = [{package_name, proplists:get_value(vendor_name, Cfg, "")}, |
| {package_string, proplists:get_value(vendor_name, Cfg, "") |
| ++ " " ++ Version }, |
| {package_bugreport, proplists:get_value(package_bugreport, Cfg, "")}, |
| {package_version, Version}, |
| {couchjs_name, CouchJSName}], |
| |
| %% write config.h |
| ConfigHStr = lists:foldl(fun({K, V}, Acc) -> |
| K1 = string:to_upper(atom_to_list(K)), |
| case K1 of |
| "VERSION_" ++ _ -> Acc; |
| _ -> |
| ["#define ", K1, " ", $", V, $", $\n | Acc] |
| end |
| end, [], ConfigH), |
| ok = file:write_file("c_src/couch_js/config.h", iolist_to_binary(ConfigHStr)), |
| |
| GetFlag = fun(Name, Default) -> |
| case os:getenv(Name) of |
| false -> Default; |
| Val -> Val |
| end |
| end, |
| |
| {ok, Cwd} = file:get_cwd(), |
| |
| PortEnvUnix = case os:getenv("COUCHDB_STATIC") of |
| "1" -> |
| IncJs = filename:join([Cwd, ".libs", "js", "include"]), |
| IncNspr= filename:join([Cwd, ".libs", "nsprpub", "include"]), |
| StaticJs = filename:join([Cwd, ".libs", "js", "lib", |
| "libjs_static.a"]), |
| StaticNspr = filename:join([Cwd, ".libs", "nsprpub", "lib", |
| "libnspr4.a"]), |
| |
| |
| CFLAGS = GetFlag("JS_CFLAGS", "-I" ++ IncJs ++ |
| " -I" ++ IncNspr ++ " -DXP_UNIX -Wall"), |
| LDFLAGS = GetFlag("JS_LIBS", StaticJs ++ " " ++ StaticNspr), |
| |
| {CFLAGS1, LDFLAGS1} = case os:getenv("WITHOUT_CURL") of |
| "1" -> {"-DWITHOUT_CURL " ++ CFLAGS, LDFLAGS}; |
| _ -> {CFLAGS, LDFLAGS ++ " -lcurl"} |
| end, |
| |
| [ |
| {"CFLAGS", "$CFLAGS -Wall -c -g -O2 " ++ CFLAGS1}, |
| {"LDFLAGS", "$LDFLAGS " ++ LDFLAGS1 ++ " -lstdc++"}, |
| {"linux.*", "LDFLAGS", "$LDFLAGS " ++ LDFLAGS1 ++ |
| " -lstdc++ -lpthread -lm"}, |
| |
| %% Prevent the make->gmake transition from infecting |
| %% MAKEFLAGS with bad flags that confuse gmake |
| {"freebsd.*", "MAKEFLAGS", ""}, |
| {"freebsd.*","LDFLAGS", "$LDFLAGS " ++ LDFLAGS1 ++ |
| " -lstdc++ -lpthread"} |
| ]; |
| _ -> |
| JSLIBS = GetFlag("JS_LIBS", "-lmozjs185"), |
| |
| {CFLAGS, LDFLAGS} = case os:type() of |
| {unix, darwin} -> |
| JSCFLAGS = GetFlag("JS_CFLAGS", "-I/usr/local/include/js"), |
| {"-DXP_UNIX " ++ JSCFLAGS, JSLIBS}; |
| {unix, linux} -> |
| %% generally linux install in /usr/include |
| JSCFLAGS = GetFlag("JS_CFLAGS", "-I/usr/include/js"), |
| {"-DXP_UNIX " ++ JSCFLAGS, JSLIBS ++ " -lm"}; |
| {unix, _} -> |
| %% most likely a bsd |
| JSCFLAGS = GetFlag("JS_CFLAGS", "-I/usr/local/include/js"), |
| {"-DXP_UNIX " ++ JSCFLAGS, JSLIBS ++ " -lm"}; |
| _ -> |
| JSCFLAGS = GetFlag("JS_CFLAGS", "-I/usr/include/js"), |
| {"-DXP_WIN " ++ JSCFLAGS, JSLIBS} |
| end, |
| |
| {CFLAGS1, LDFLAGS1} = case os:getenv("WITHOUT_CURL") of |
| "1" -> {"-DWITHOUT_CURL " ++ CFLAGS, LDFLAGS}; |
| _ -> {CFLAGS, LDFLAGS ++ " -lcurl"} |
| end, |
| |
| [ |
| {"CFLAGS", "$CFLAGS -Wall -c -g -O2 " ++ CFLAGS1}, |
| {"LDFLAGS", "$LDFLAGS " ++ LDFLAGS1} |
| ] |
| end, |
| |
| % no support for static link on Win32/Win64 |
| PortEnv = case os:type() of |
| {win32, nt} -> |
| IncJS = filename:join([Cwd, ".libs", "js", "include", "js"]), |
| [ |
| {"CFLAGS", "$CFLAGS /I" ++ IncJS ++ |
| " /DXP_WIN /DWITHOUT_CURL /O2 /Ot /favor:blend /c /Wall"}, |
| {"LDFLAGS", "$LDFLAGS .libs\\js\\lib\\mozjs185-1.0.lib"} |
| ]; |
| _ -> |
| PortEnvUnix |
| end, |
| |
| PortSpecs0 = [{filename:join(["priv", CouchJSName]), ["c_src/couch_js/*.c"]}], |
| |
| PortSpecs = case os:type() of |
| {win32, _} -> |
| PortSpecs0 ++ [{filename:join(["priv", "couchspawnkillable"]), |
| ["c_src/spawnkillable/*.c"]}]; |
| _ -> |
| {ok, _} = file:copy("priv/couchspawnkillable.sh", |
| "priv/couchspawnkillable"), |
| os:cmd("chmod +x priv/couchspawnkillable"), |
| PortSpecs0 |
| end, |
| |
| PortInfo = [{port_env, PortEnv}, |
| {port_specs, PortSpecs}, |
| {pre_hooks, [ |
| {"(linux|solaris|freebsd|netbsd|openbsd|dragonfly|darwin)", |
| compile, "./build_spidermonkey.sh"}, |
| {"(win32|win64)", compile, |
| "powershell ./build_spidermonkey.ps1"} |
| ]}, |
| {post_hooks, [ |
| {"(linux|solaris|freebsd|netbsd|openbsd|dragonfly|darwin)", |
| clean, "./build_spidermonkey.sh clean"}, |
| {"(win32|win64)", clean, |
| "powershell ./build_spidermonkey.ps1 -clean"} |
| ]}], |
| |
| lists:keymerge(1,lists:keysort(1, PortInfo), lists:keysort(1, CONFIG)). |