summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2023-08-29 18:50:41 +0800
committerGitHub <[email protected]>2023-08-29 18:50:41 +0800
commit567f2d5415aeb0dc41fcb23f8884cd7f68bf1fd9 (patch)
tree0897370db00eb16f44216c7dd6795f43b73c5243
parentcc0bb72f305ed4b1df69bb3d4c77583ef1bc77db (diff)
parent801b1ef7756eb5fa0d28fb943c6305d525d47ce4 (diff)
Merge pull request #4140 from xmake-io/cppfront
Add cppfront rule
-rw-r--r--tests/projects/cppfront/console/.gitignore8
-rw-r--r--tests/projects/cppfront/console/src/main.cpp27
-rw-r--r--tests/projects/cppfront/console/xmake.lua10
-rw-r--r--xmake/rules/cppfront/xmake.lua84
4 files changed, 109 insertions, 0 deletions
diff --git a/tests/projects/cppfront/console/.gitignore b/tests/projects/cppfront/console/.gitignore
new file mode 100644
index 000000000..152105761
--- /dev/null
+++ b/tests/projects/cppfront/console/.gitignore
@@ -0,0 +1,8 @@
+# Xmake cache
+.xmake/
+build/
+
+# MacOS Cache
+.DS_Store
+
+
diff --git a/tests/projects/cppfront/console/src/main.cpp2 b/tests/projects/cppfront/console/src/main.cpp2
new file mode 100644
index 000000000..1ab54b94b
--- /dev/null
+++ b/tests/projects/cppfront/console/src/main.cpp2
@@ -0,0 +1,7 @@
+main: () -> int =
+ println("Hello world!\n");
+
+println: (msg: _) -> int = {
+ std::cout << msg;
+ return 0;
+}
diff --git a/tests/projects/cppfront/console/xmake.lua b/tests/projects/cppfront/console/xmake.lua
new file mode 100644
index 000000000..65b68cd6e
--- /dev/null
+++ b/tests/projects/cppfront/console/xmake.lua
@@ -0,0 +1,10 @@
+add_rules("mode.debug", "mode.release")
+
+add_requires("cppfront")
+
+target("test")
+ add_rules("cppfront")
+ set_kind("binary")
+ add_files("src/*.cpp2")
+ add_packages("cppfront")
+
diff --git a/xmake/rules/cppfront/xmake.lua b/xmake/rules/cppfront/xmake.lua
new file mode 100644
index 000000000..90153df85
--- /dev/null
+++ b/xmake/rules/cppfront/xmake.lua
@@ -0,0 +1,84 @@
+--!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 ruki
+-- @file xmake.lua
+--
+
+-- define rule: cppfront.build
+rule("cppfront.build")
+ set_extensions(".cpp2")
+ on_load(function (target)
+ -- only cppfront source files? we need to patch cxx source kind for linker
+ local sourcekinds = target:sourcekinds()
+ if #sourcekinds == 0 then
+ table.insert(sourcekinds, "cxx")
+ end
+ local cppfront = target:pkg("cppfront")
+ if cppfront and cppfront:installdir() then
+ local includedir = path.join(cppfront:installdir(), "include")
+ if os.isdir(includedir) then
+ target:add("includedirs", includedir)
+ end
+ end
+ end)
+ on_buildcmd_file(function (target, batchcmds, sourcefile_cpp2, opt)
+
+ -- get cppfront
+ import("lib.detect.find_tool")
+ local cppfront = assert(find_tool("cppfront", {check = "-h"}), "cppfront not found!")
+
+ -- get c++ source file for cpp2
+ local sourcefile_cpp = target:autogenfile((sourcefile_cpp2:gsub(".cpp2$", ".cpp")))
+ local basedir = path.directory(sourcefile_cpp)
+
+ -- add objectfile
+ local objectfile = target:objectfile(sourcefile_cpp)
+ table.insert(target:objectfiles(), objectfile)
+
+ -- add commands
+ local argv = {"-o", path(sourcefile_cpp), path(sourcefile_cpp2)}
+ batchcmds:show_progress(opt.progress, "${color.build.object}compiling.cpp2 %s", sourcefile_cpp2)
+ batchcmds:mkdir(basedir)
+ batchcmds:vrunv(cppfront.program, argv)
+ batchcmds:compile(sourcefile_cpp, objectfile, {configs = {languages = "c++20"}})
+
+ -- add deps
+ batchcmds:add_depfiles(sourcefile_cpp2)
+ batchcmds:set_depmtime(os.mtime(objectfile))
+ batchcmds:set_depcache(target:dependfile(objectfile))
+ end)
+
+
+-- define rule: cppfront
+rule("cppfront")
+
+ -- add build rules
+ add_deps("cppfront.build")
+
+ -- set compiler runtime, e.g. vs runtime
+ add_deps("utils.compiler.runtime")
+
+ -- inherit links and linkdirs of all dependent targets by default
+ add_deps("utils.inherit.links")
+
+ -- support `add_files("src/*.o")` and `add_files("src/*.a")` to merge object and archive files to target
+ add_deps("utils.merge.object", "utils.merge.archive")
+
+ -- we attempt to extract symbols to the independent file and
+ -- strip self-target binary if `set_symbols("debug")` and `set_strip("all")` are enabled
+ add_deps("utils.symbols.extract")
+