summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2021-09-02 23:04:28 +0800
committerruki <[email protected]>2021-09-02 23:04:28 +0800
commit3d595c5f5f91bd380d3b43bd0dfc8c1f738c325b (patch)
tree0a5f42eb430151408ff86c19468cb65b7dfa1709
parentf131f88e73c2c9718f61dee0aac451e00d63f64f (diff)
add pascal stub
-rw-r--r--xmake/languages/pascal/check_main.lua40
-rw-r--r--xmake/languages/pascal/load.lua80
-rw-r--r--xmake/languages/pascal/xmake.lua96
-rw-r--r--xmake/modules/core/tools/fpc.lua142
-rw-r--r--xmake/rules/pascal/xmake.lua46
-rw-r--r--xmake/toolchains/fpc/xmake.lua34
6 files changed, 438 insertions, 0 deletions
diff --git a/xmake/languages/pascal/check_main.lua b/xmake/languages/pascal/check_main.lua
new file mode 100644
index 000000000..a66f70427
--- /dev/null
+++ b/xmake/languages/pascal/check_main.lua
@@ -0,0 +1,40 @@
+--!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 check_main.lua
+--
+
+-- check it
+function main(sourcefile)
+
+ -- load source code
+ local sourcecode = io.readfile(sourcefile)
+
+ -- remove comment first
+ sourcecode = sourcecode:gsub("{%*.-%*}", "")
+ sourcecode = sourcecode:gsub("//.-\n", "\n")
+
+ -- find 'program xxx'
+ if sourcecode:find("program%s*%(.-%)") then
+ return true
+ end
+
+ -- no main function
+ return false
+end
+
+
diff --git a/xmake/languages/pascal/load.lua b/xmake/languages/pascal/load.lua
new file mode 100644
index 000000000..997fc504a
--- /dev/null
+++ b/xmake/languages/pascal/load.lua
@@ -0,0 +1,80 @@
+--!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 load.lua
+--
+
+function _get_apis()
+ local apis = {}
+ apis.values = {
+ -- target.add_xxx
+ "target.add_links"
+ , "target.add_syslinks"
+ , "target.add_pcflags"
+ , "target.add_ldflags"
+ , "target.add_arflags"
+ , "target.add_shflags"
+ , "target.add_rpathdirs" -- @note do not translate path, it's usually an absolute path or contains $ORIGIN/@loader_path
+ -- option.add_xxx
+ , "option.add_links"
+ , "option.add_syslinks"
+ , "option.add_pcflags"
+ , "option.add_ldflags"
+ , "option.add_arflags"
+ , "option.add_shflags"
+ , "option.add_rpathdirs"
+ -- package.add_xxx
+ , "package.add_links"
+ , "package.add_syslinks"
+ , "package.add_pcflags"
+ , "package.add_ldflags"
+ , "package.add_arflags"
+ , "package.add_shflags"
+ , "package.add_rpathdirs"
+ , "package.add_linkdirs"
+ , "package.add_includedirs"
+ , "package.add_sysincludedirs"
+ -- toolchain.add_xxx
+ , "toolchain.add_links"
+ , "toolchain.add_syslinks"
+ , "toolchain.add_pcflags"
+ , "toolchain.add_ldflags"
+ , "toolchain.add_arflags"
+ , "toolchain.add_shflags"
+ , "toolchain.add_rpathdirs"
+ , "toolchain.add_linkdirs"
+ , "toolchain.add_includedirs"
+ , "toolchain.add_sysincludedirs"
+ }
+ apis.paths = {
+ -- target.add_xxx
+ "target.add_linkdirs"
+ , "target.add_includedirs"
+ , "target.add_sysincludedirs"
+ -- option.add_xxx
+ , "option.add_linkdirs"
+ , "option.add_includedirs"
+ , "option.add_sysincludedirs"
+ }
+ return apis
+end
+
+function main()
+ return {apis = _get_apis()}
+end
+
+
diff --git a/xmake/languages/pascal/xmake.lua b/xmake/languages/pascal/xmake.lua
new file mode 100644
index 000000000..f61a7db38
--- /dev/null
+++ b/xmake/languages/pascal/xmake.lua
@@ -0,0 +1,96 @@
+--!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
+--
+
+language("pascal")
+ add_rules("pascal")
+ set_sourcekinds {pc = {".pas", ".pp"}}
+ set_sourceflags {pc = "pcflags"}
+ set_targetkinds {binary = "pcld", static = "ar", shared = "pcsh"}
+ set_targetflags {binary = "ldflags", static = "arflags", shared = "shflags"}
+ set_langkinds {pascal = "pc"}
+ set_mixingkinds("pc", "cc", "cxx", "as")
+
+ on_load("load")
+ on_check_main("check_main")
+
+ set_nameflags {
+ object = {
+ "config.includedirs"
+ , "target.symbols"
+ , "target.warnings"
+ , "target.optimize:check"
+ , "target.vectorexts:check"
+ , "target.includedirs"
+ , "toolchain.includedirs"
+ , "target.sysincludedirs"
+ , "toolchain.sysincludedirs"
+ }
+ , binary = {
+ "config.linkdirs"
+ , "target.linkdirs"
+ , "target.rpathdirs"
+ , "target.strip"
+ , "target.symbols"
+ , "toolchain.linkdirs"
+ , "toolchain.rpathdirs"
+ , "config.links"
+ , "target.links"
+ , "toolchain.links"
+ , "config.syslinks"
+ , "target.syslinks"
+ , "toolchain.syslinks"
+ }
+ , shared = {
+ "config.linkdirs"
+ , "target.linkdirs"
+ , "target.strip"
+ , "target.symbols"
+ , "toolchain.linkdirs"
+ , "config.links"
+ , "target.links"
+ , "toolchain.links"
+ , "config.syslinks"
+ , "target.syslinks"
+ , "toolchain.syslinks"
+ }
+ , static = {
+ "target.strip"
+ , "target.symbols"
+ }
+ }
+
+ set_menu {
+ config =
+ {
+ {category = "Cross Complation Configuration/Compiler Configuration" }
+ , {nil, "pc", "kv", nil, "The Pascal Compiler" }
+
+ , {category = "Cross Complation Configuration/Linker Configuration" }
+ , {nil, "pcld", "kv", nil, "The Pascal Linker" }
+ , {nil, "pcsh", "kv", nil, "The Pascal Shared Library Linker" }
+
+ , {category = "Cross Complation Configuration/Builtin Flags Configuration" }
+ , {nil, "links", "kv", nil, "The Link Libraries" }
+ , {nil, "syslinks", "kv", nil, "The System Link Libraries" }
+ , {nil, "linkdirs", "kv", nil, "The Link Search Directories" }
+ , {nil, "includedirs","kv", nil, "The Include Search Directories" }
+ }
+ }
+
diff --git a/xmake/modules/core/tools/fpc.lua b/xmake/modules/core/tools/fpc.lua
new file mode 100644
index 000000000..1e66b9ad5
--- /dev/null
+++ b/xmake/modules/core/tools/fpc.lua
@@ -0,0 +1,142 @@
+--!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 fpc.lua
+--
+
+-- imports
+import("core.base.option")
+import("core.project.config")
+import("core.project.project")
+import("core.project.target")
+
+-- init it
+function init(self)
+
+ -- init shflags
+ self:set("zcshflags", "-dynamic", "-fPIC")
+
+ -- init zcflags for the kind: shared
+ self:set("shared.zcflags", "-fPIC")
+end
+
+-- make the strip flag
+function nf_strip(self, level)
+ local maps =
+ {
+ debug = "--strip"
+ , all = "--strip"
+ }
+ return maps[level]
+end
+
+-- make the define flag
+function nf_define(self, macro)
+ return "-D" .. macro
+end
+
+-- make the optimize flag
+function nf_optimize(self, level)
+ local maps =
+ {
+ none = "-O Debug"
+ , fast = "-O ReleaseSafe"
+ , aggressive = "-O ReleaseFast"
+ , fastest = "-O ReleaseFast"
+ , smallest = "-O ReleaseSmall"
+ , aggressive = "-O ReleaseFast"
+ }
+ return maps[level]
+end
+
+-- make the link flag
+function nf_link(self, lib)
+ return "-l" .. lib
+end
+
+-- make the syslink flag
+function nf_syslink(self, lib)
+ return nf_link(self, lib)
+end
+
+-- make the linkdir flag
+function nf_linkdir(self, dir)
+ return {"-L", dir}
+end
+
+-- make the framework flag
+function nf_framework(self, framework)
+ return {"-framework", framework}
+end
+
+-- make the frameworkdir flag
+function nf_frameworkdir(self, frameworkdir)
+ return {"-F", path.translate(frameworkdir)}
+end
+
+-- make the rpathdir flag
+function nf_rpathdir(self, dir)
+ dir = path.translate(dir)
+ if is_plat("macosx") then
+ return {"-rpath", (dir:gsub("%$ORIGIN", "@loader_path"))}
+ else
+ return {"-rpath", (dir:gsub("@[%w_]+", function (name)
+ local maps = {["@loader_path"] = "$ORIGIN", ["@executable_path"] = "$ORIGIN"}
+ return maps[name]
+ end))}
+ end
+end
+
+-- make the link arguments list
+function linkargv(self, objectfiles, targetkind, targetfile, flags)
+ local argv = {}
+ if targetkind == "binary" then
+ table.insert(argv, "build-exe")
+ elseif targetkind == "static" or targetkind == "shared" then
+ table.insert(argv, "build-lib")
+ else
+ raise("unknown target kind(%s)!", targetkind)
+ end
+ table.join2(argv, flags, "-femit-bin=" .. targetfile, objectfiles)
+ return self:program(), argv
+end
+
+-- link the target file
+function link(self, objectfiles, targetkind, targetfile, flags)
+
+ -- ensure the target directory
+ os.mkdir(path.directory(targetfile))
+
+ -- link it
+ os.runv(linkargv(self, objectfiles, targetkind, targetfile, flags))
+end
+
+-- make the compile arguments list
+function compargv(self, sourcefile, objectfile, flags)
+ return self:program(), table.join("build-obj", flags, "-femit-bin=" .. objectfile, sourcefile)
+end
+
+-- compile the source file
+function compile(self, sourcefile, objectfile, dependinfo, flags)
+
+ -- ensure the object directory
+ os.mkdir(path.directory(objectfile))
+
+ -- compile it
+ os.runv(compargv(self, sourcefile, objectfile, flags))
+end
+
diff --git a/xmake/rules/pascal/xmake.lua b/xmake/rules/pascal/xmake.lua
new file mode 100644
index 000000000..bca2bc3ce
--- /dev/null
+++ b/xmake/rules/pascal/xmake.lua
@@ -0,0 +1,46 @@
+--!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: pascal.build
+rule("pascal.build")
+ set_sourcekinds("pc")
+ on_load(function (target)
+ -- we disable to build across targets in parallel, because the source files may depend on other target modules
+ target:set("policy", "build.across_targets_in_parallel", false)
+ end)
+ on_build_files(function (target, sourcebatch, opt)
+ import("private.action.build.object").build(target, sourcebatch, opt)
+ end)
+
+-- define rule: pascal
+rule("pascal")
+
+ -- add build rules
+ add_deps("pascal.build")
+
+ -- 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")
diff --git a/xmake/toolchains/fpc/xmake.lua b/xmake/toolchains/fpc/xmake.lua
new file mode 100644
index 000000000..d3499867a
--- /dev/null
+++ b/xmake/toolchains/fpc/xmake.lua
@@ -0,0 +1,34 @@
+--!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 toolchain
+toolchain("fpc")
+
+ -- set homepage
+ set_homepage("https://www.freepascal.org/")
+ set_description("Free Pascal Programming Language Compiler")
+
+ -- on check
+ on_check(function (toolchain)
+ end)
+
+ -- on load
+ on_load(function (toolchain)
+ end)