summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2024-12-30 16:12:44 +0800
committerGitHub <[email protected]>2024-12-30 16:12:44 +0800
commited2c060fc074d68dde66d855f694b5e72ed3b194 (patch)
tree4e4862541ec858d401183b73f508673a733164ac
parent5665dc8df7a837d09c905c62591efefba92fb4df (diff)
parent0c5e47e4c52941b43d93981ba6c16e4678e48811 (diff)
Merge pull request #5949 from Freed-Wu/nodejs
add rule nodejs.module
-rw-r--r--xmake/rules/nodejs/module/xmake.lua79
1 files changed, 79 insertions, 0 deletions
diff --git a/xmake/rules/nodejs/module/xmake.lua b/xmake/rules/nodejs/module/xmake.lua
new file mode 100644
index 000000000..7e419dff1
--- /dev/null
+++ b/xmake/rules/nodejs/module/xmake.lua
@@ -0,0 +1,79 @@
+--!A cross-platform build utility based on Lua
+--
+-- 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.
+--
+-- Copyright (C) 2015-present, TBOOX Open Source Group.
+--
+-- @author Wu, Zhenyu
+-- @file xmake.lua
+--
+
+-- usage:
+--
+-- npm add -D node-addon-api node-api-headers
+--
+-- target("foo")
+-- do
+-- set_languages("cxx17")
+-- add_rules("nodejs.module")
+-- add_includedirs("node_modules/node-addon-api", "node_modules/node-api-headers/include")
+-- add_files("*.cc")
+-- end
+rule("nodejs.module")
+ on_config(function(target)
+ -- imports
+ import("core.cache.detectcache")
+ import("core.project.target", { alias = "project_target" })
+ import("devel.git")
+
+ -- set kind
+ if target:is_plat("macosx") then
+ target:set("kind", "binary")
+ target:add("ldflags", "-bundle", "-undefined dynamic_lookup", { force = true })
+ else
+ target:set("kind", "shared")
+ end
+
+ -- export symbols
+ if target:is_plat("windows") then
+ target:add("shflags", "/export:napi_register_module_v1", "/export:node_api_module_get_api_version_v1",
+ { force = true })
+ else
+ target:set("symbols", "none")
+ end
+
+ -- https://github.com/nodejs/node-addon-api/issues/1021
+ if target:is_plat("mingw") then
+ target:add("packages", "node-api-stub")
+ target:add("deps", target:pkg("node-api-stub"))
+ end
+
+ -- set library name
+ local modulename = target:name():split('.', { plain = true })
+ modulename = modulename[#modulename]
+ target:set("filename", modulename .. ".node")
+ end)
+
+ on_install(function(target)
+ if target:is_plat("macosx") then
+ target:set("kind", "shared")
+ end
+ local moduledir = path.directory((target:name():gsub('%.', '/')))
+ local installdir = path.join("build", get_config("mode"))
+ import("target.action.install")(target, {
+ installdir = installdir,
+ libdir = moduledir,
+ bindir = moduledir,
+ includedir = path.join("include", moduledir)
+ })
+ end)