blob: f6546e99975a1df0e2e4c9d4c1303c90b53d07a8 [file] [log] [blame]
% -*- mode: erlang;erlang-indent-level: 4;indent-tabs-mode: nil -*-
% ex: ts=4 sw=4 ft=erlang 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.
% Windows is "special" so we treat it "specially"
Msys = "msys2_shell.cmd -defterm -no-start -ucrt64 -here -lc ".
% Disabled CONFIG_LTO=y as of June 2025. It interfered with -j8 and microbench
% on quickjs repo didn't show any measurable per benefit for it. It even looked
% a bit slower on ubuntu-noble/x86_64 (lto:9032ns vs nolto:8746ns) and only a
% tiny bit faster on MacOS x86_64 (lto:12646 vs nolto:12614)
%
PreHooks = [
{"(linux|darwin)", compile, "make -C quickjs -j8 libquickjs.a qjsc"},
{"freebsd", compile, "gmake -C quickjs -j8 libquickjs.a qjsc"},
{"win32", compile, Msys ++ "'make -C quickjs -j8 libquickjs.a qjsc.exe'"},
{"(linux|darwin|freebsd|win32)", compile, "escript build_js.escript compile"}
].
PostHooks = [
{"(linux|darwin)", clean, "make -C quickjs clean"},
{"freebsd", clean, "gmake -C quickjs clean"},
{"win32", clean, Msys ++ "'make -C quickjs clean'"},
{"(linux|darwin|freebsd|win32)", clean, "escript build_js.escript clean"}
].
% We're not building a driver just an executable so we don't
% need all the Erlang/OTP headers and libraries
ResetFlags = [
{"ERL_CFLAGS", ""},
{"ERL_LDFLAGS", ""},
{"EXE_CFLAGS", ""},
{"EXE_LDFLAGS", ""}
].
UnixEnv = [
{"CFLAGS", "$CFLAGS -g -Wall -O2 -Iquickjs"},
{"LDFLAGS", "$LDFLAGS quickjs/libquickjs.a -lpthread -lm"}
] ++ ResetFlags.
WindowsEnv = [
{"CFLAGS", "-D_GNU_SOURCE -O2 -fwrapv -DCONFIG_VERSION=\\\"0\\\" -Iquickjs"},
{"LDFLAGS", "$LDFLAGS -lm -Wl,-Bstatic -lpthread quickjs/libquickjs.a"},
{"EXE_CC_TEMPLATE", "gcc.exe -g -c $CFLAGS $PORT_IN_FILES -o $PORT_OUT_FILE"},
{"EXE_LINK_TEMPLATE", "gcc.exe -g -lm $PORT_IN_FILES $LDFLAGS -o $PORT_OUT_FILE"}
].
% couchjs_*_bytecode.c sources are auto-generated by build_js.escript
%
UnixMainjsSrc = ["c_src/couchjs.c", "c_src/couchjs_mainjs_bytecode.c"],
UnixCoffeeSrc = ["c_src/couchjs.c", "c_src/couchjs_coffee_bytecode.c"],
WindowsBaseSrc = [
"quickjs/quickjs.c",
"quickjs/dtoa.c",
"quickjs/libregexp.c",
"quickjs/libunicode.c",
"quickjs/cutils.c",
"quickjs/libbf.c"
].
WindowsMainjsSrc = WindowsBaseSrc ++ UnixMainjsSrc.
WindowsCoffeeSrc = WindowsBaseSrc ++ UnixCoffeeSrc.
PortSpecs = [
{"(linux|darwin|freebsd)", "priv/couchjs_mainjs", UnixMainjsSrc, [{env, UnixEnv}]},
{"(linux|darwin|freebsd)", "priv/couchjs_coffee", UnixCoffeeSrc, [{env, UnixEnv}]},
{"win32", "priv/couchjs_mainjs.exe", WindowsMainjsSrc, [{env, WindowsEnv}]},
{"win32", "priv/couchjs_coffee.exe", WindowsCoffeeSrc, [{env, WindowsEnv}]}
].
AddConfig = [
{port_specs, PortSpecs},
{pre_hooks, PreHooks},
{post_hooks, PostHooks}
].
lists:foldl(fun({K, V}, CfgAcc) ->
case lists:keyfind(K, 1, CfgAcc) of
{K, Existent} when is_list(Existent) andalso is_list(V) ->
lists:keystore(K, 1, CfgAcc, {K, Existent ++ V});
false ->
lists:keystore(K, 1, CfgAcc, {K, V})
end
end, CONFIG, AddConfig).