summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2024-08-21 00:19:12 +0800
committerGitHub <[email protected]>2024-08-21 00:19:12 +0800
commitd3effb1bc2076932bbcc319a696be3f40b95d4b7 (patch)
tree9506f31fb2025b55875e6aeca729418284dfdbf3
parent624b853a4ec3397eb79c4745e365a87f079f9a0f (diff)
parent594be318a7a10b95002451a66b892b99338eed53 (diff)
Merge pull request #5488 from xmake-io/cosmocc
Support to build xmake using cosmocc
-rwxr-xr-xconfigure57
-rwxr-xr-xcore/src/tbox/inc/linux/tbox.config.h21
m---------core/src/tbox/tbox0
-rw-r--r--xmake/core/base/fwatcher.lua2
-rw-r--r--xmake/plugins/project/cmake/cmakelists.lua171
5 files changed, 209 insertions, 42 deletions
diff --git a/configure b/configure
index da16d81fe..2ca2da6f8 100755
--- a/configure
+++ b/configure
@@ -422,11 +422,17 @@ path_toolname() {
emcc) toolname="emcc";;
*/em++) toolname="emxx";;
em++) toolname="emxx";;
+ */cosmocc) toolname="cosmocc";;
+ cosmocc) toolname="cosmocc";;
+ */cosmoc++) toolname="cosmocxx";;
+ cosmoc++) toolname="cosmocxx";;
*-ar) toolname="ar";;
*/ar) toolname="ar";;
ar) toolname="ar";;
*/emar) toolname="emar";;
emar) toolname="emar";;
+ */cosmoar) toolname="cosmoar";;
+ cosmoar) toolname="cosmoar";;
cc) toolname="gcc";;
*/cc) toolname="gcc";;
c++) toolname="gxx";;
@@ -985,6 +991,8 @@ _get_abstract_flags() {
clangxx) _get_abstract_flag_for_gcc_clang "${toolkind}" "${toolname}" "${itemname}" "${value}"; flag="${_ret}";;
emcc) _get_abstract_flag_for_gcc_clang "${toolkind}" "${toolname}" "${itemname}" "${value}"; flag="${_ret}";;
emxx) _get_abstract_flag_for_gcc_clang "${toolkind}" "${toolname}" "${itemname}" "${value}"; flag="${_ret}";;
+ cosmocc) _get_abstract_flag_for_gcc_clang "${toolkind}" "${toolname}" "${itemname}" "${value}"; flag="${_ret}";;
+ cosmocxx) _get_abstract_flag_for_gcc_clang "${toolkind}" "${toolname}" "${itemname}" "${value}"; flag="${_ret}";;
*) raise "unknown toolname(${toolname})!" ;;
esac
if test_nz "${flag}"; then
@@ -1702,8 +1710,11 @@ _get_target_toolchain_flags() {
clangxx) _get_target_toolchain_flags_for_clang "${name}" "${toolkind}"; flags="${_ret}";;
emcc) _get_target_toolchain_flags_for_clang "${name}" "${toolkind}"; flags="${_ret}";;
emxx) _get_target_toolchain_flags_for_clang "${name}" "${toolkind}"; flags="${_ret}";;
+ cosmocc) _get_target_toolchain_flags_for_gcc "${name}" "${toolkind}"; flags="${_ret}";;
+ cosmocxx) _get_target_toolchain_flags_for_gcc "${name}" "${toolkind}"; flags="${_ret}";;
ar) _get_target_toolchain_flags_for_ar "${name}" "${toolkind}"; flags="${_ret}";;
emar) _get_target_toolchain_flags_for_ar "${name}" "${toolkind}"; flags="${_ret}";;
+ cosmoar) _get_target_toolchain_flags_for_ar "${name}" "${toolkind}"; flags="${_ret}";;
*) raise "unknown toolname(${toolname})!" ;;
esac
_ret="${flags}"
@@ -2719,6 +2730,7 @@ Common options:
- mingw
- macosx
- linux
+ - wasm
--arch=ARCH Compile for the given architecture. (default: '"${_target_arch_default}"')
- msys: i386 x86_64
- cross: i386 x86_64 arm arm64 mips mips64 riscv riscv64 loong64 s390x ppc ppc64 sh4
@@ -2736,6 +2748,8 @@ Common options:
--toolchain=TOOLCHAIN Set toolchain name.
- clang
- gcc
+ - emcc
+ - cosmocc
--buildir=DIR Set build directory. (default: '"${xmake_sh_buildir}"')
Autoconf options:
@@ -3027,6 +3041,18 @@ toolchain "emcc"
set_toolset "ar" "emar" "ar"
toolchain_end
+# cosmocc toolchain, e.g. ./configure --plat=linux --toolchain=cosmocc
+toolchain "cosmocc"
+ set_toolset "as" "cosmocc"
+ set_toolset "cc" "cosmocc"
+ set_toolset "cxx" "cosmocc" "cosmoc++"
+ set_toolset "mm" "cosmocc"
+ set_toolset "mxx" "cosmocc" "cosmoc++"
+ set_toolset "ld" "cosmoc++" "cosmocc"
+ set_toolset "sh" "cosmoc++" "cosmocc"
+ set_toolset "ar" "cosmoar"
+toolchain_end
+
# check platform
_check_platform() {
if test "x${_target_plat}" = "x"; then
@@ -3093,6 +3119,8 @@ _toolchain_compcmd() {
clangxx) _toolchain_compcmd_for_gcc_clang "${program}" "${objectfile}" "${sourcefile}" "${flags}"; compcmd="${_ret}";;
emcc) _toolchain_compcmd_for_gcc_clang "${program}" "${objectfile}" "${sourcefile}" "${flags}"; compcmd="${_ret}";;
emxx) _toolchain_compcmd_for_gcc_clang "${program}" "${objectfile}" "${sourcefile}" "${flags}"; compcmd="${_ret}";;
+ cosmocc) _toolchain_compcmd_for_gcc_clang "${program}" "${objectfile}" "${sourcefile}" "${flags}"; compcmd="${_ret}";;
+ cosmocxx) _toolchain_compcmd_for_gcc_clang "${program}" "${objectfile}" "${sourcefile}" "${flags}"; compcmd="${_ret}";;
*) raise "unknown toolname(${toolname})!" ;;
esac
_ret="${compcmd}"
@@ -3113,8 +3141,11 @@ _toolchain_linkcmd() {
clangxx) _toolchain_linkcmd_for_gcc_clang "${toolkind}" "${program}" "${binaryfile}" "${objectfiles}" "${flags}"; linkcmd="${_ret}";;
emcc) _toolchain_linkcmd_for_gcc_clang "${toolkind}" "${program}" "${binaryfile}" "${objectfiles}" "${flags}"; linkcmd="${_ret}";;
emxx) _toolchain_linkcmd_for_gcc_clang "${toolkind}" "${program}" "${binaryfile}" "${objectfiles}" "${flags}"; linkcmd="${_ret}";;
+ cosmocc) _toolchain_linkcmd_for_gcc_clang "${toolkind}" "${program}" "${binaryfile}" "${objectfiles}" "${flags}"; linkcmd="${_ret}";;
+ cosmocxx) _toolchain_linkcmd_for_gcc_clang "${toolkind}" "${program}" "${binaryfile}" "${objectfiles}" "${flags}"; linkcmd="${_ret}";;
ar) _toolchain_linkcmd_for_ar "${toolkind}" "${program}" "${binaryfile}" "${objectfiles}" "${flags}"; linkcmd="${_ret}";;
emar) _toolchain_linkcmd_for_ar "${toolkind}" "${program}" "${binaryfile}" "${objectfiles}" "${flags}"; linkcmd="${_ret}";;
+ cosmoar) _toolchain_linkcmd_for_ar "${toolkind}" "${program}" "${binaryfile}" "${objectfiles}" "${flags}"; linkcmd="${_ret}";;
*) raise "unknown toolname(${toolname})!" ;;
esac
_ret="${linkcmd}"
@@ -3237,6 +3268,24 @@ _toolchain_try_ar() {
return 1
}
+# try cosmoar
+_toolchain_try_cosmoar() {
+ if test "x${_toolchain_try_cosmoar_result}" = "xok"; then
+ return 0
+ elif test "x${_toolchain_try_cosmoar_result}" = "xno"; then
+ return 1
+ fi
+
+ local kind="${1}"
+ local program="${2}"
+ if _os_runv "${program}" "--version"; then
+ _toolchain_try_cosmoar_result="ok"
+ return 0
+ fi
+ _toolchain_try_cosmoar_result="no"
+ return 1
+}
+
# try program
_toolchain_try_program() {
local toolchain="${1}"
@@ -3251,8 +3300,11 @@ _toolchain_try_program() {
clangxx) _toolchain_try_clangxx "${kind}" "${program}" && ok=true;;
emcc) _toolchain_try_clang "${kind}" "${program}" && ok=true;;
emxx) _toolchain_try_clangxx "${kind}" "${program}" && ok=true;;
+ cosmocc) _toolchain_try_gcc "${kind}" "${program}" && ok=true;;
+ cosmocxx) _toolchain_try_gxx "${kind}" "${program}" && ok=true;;
ar) _toolchain_try_ar "${kind}" "${program}" && ok=true;;
emar) _toolchain_try_ar "${kind}" "${program}" && ok=true;;
+ cosmoar) _toolchain_try_cosmoar "${kind}" "${program}" && ok=true;;
*) raise "unknown toolname(${toolname})!" ;;
esac
if ${ok}; then
@@ -3982,6 +4034,8 @@ _gmake_add_build_object() {
clangxx) _gmake_add_build_object_for_gcc_clang "${sourcekind}" "${sourcefile}" "${objectfile}" "${flagname}";;
emcc) _gmake_add_build_object_for_gcc_clang "${sourcekind}" "${sourcefile}" "${objectfile}" "${flagname}";;
emxx) _gmake_add_build_object_for_gcc_clang "${sourcekind}" "${sourcefile}" "${objectfile}" "${flagname}";;
+ cosmocc) _gmake_add_build_object_for_gcc_clang "${sourcekind}" "${sourcefile}" "${objectfile}" "${flagname}";;
+ cosmocxx) _gmake_add_build_object_for_gcc_clang "${sourcekind}" "${sourcefile}" "${objectfile}" "${flagname}";;
*) raise "unknown toolname(${toolname})!" ;;
esac
echo "" >> "${xmake_sh_makefile}"
@@ -4062,8 +4116,11 @@ _gmake_add_build_target() {
clangxx) _gmake_add_build_target_for_gcc_clang "${toolkind}" "${targetfile}" "${objectfiles}" "${flagname}";;
emcc) _gmake_add_build_target_for_gcc_clang "${toolkind}" "${targetfile}" "${objectfiles}" "${flagname}";;
emxx) _gmake_add_build_target_for_gcc_clang "${toolkind}" "${targetfile}" "${objectfiles}" "${flagname}";;
+ cosmocc) _gmake_add_build_target_for_gcc_clang "${toolkind}" "${targetfile}" "${objectfiles}" "${flagname}";;
+ cosmocxx) _gmake_add_build_target_for_gcc_clang "${toolkind}" "${targetfile}" "${objectfiles}" "${flagname}";;
ar) _gmake_add_build_target_for_ar "${toolkind}" "${targetfile}" "${objectfiles}" "${flagname}";;
emar) _gmake_add_build_target_for_ar "${toolkind}" "${targetfile}" "${objectfiles}" "${flagname}";;
+ cosmoar) _gmake_add_build_target_for_ar "${toolkind}" "${targetfile}" "${objectfiles}" "${flagname}";;
*) raise "unknown toolname(${toolname})!" ;;
esac
diff --git a/core/src/tbox/inc/linux/tbox.config.h b/core/src/tbox/inc/linux/tbox.config.h
index fb8c99830..ec06d847b 100755
--- a/core/src/tbox/inc/linux/tbox.config.h
+++ b/core/src/tbox/inc/linux/tbox.config.h
@@ -171,8 +171,13 @@
#define TB_CONFIG_POSIX_HAVE_FDATASYNC 1
/* #undef TB_CONFIG_POSIX_HAVE_COPYFILE */
#define TB_CONFIG_POSIX_HAVE_SENDFILE 1
-#define TB_CONFIG_POSIX_HAVE_EPOLL_CREATE 1
-#define TB_CONFIG_POSIX_HAVE_EPOLL_WAIT 1
+#ifdef __COSMOPOLITAN__
+/* #undef TB_CONFIG_POSIX_HAVE_EPOLL_CREATE */
+/* #undef TB_CONFIG_POSIX_HAVE_EPOLL_WAIT */
+#else
+# define TB_CONFIG_POSIX_HAVE_EPOLL_CREATE 1
+# define TB_CONFIG_POSIX_HAVE_EPOLL_WAIT 1
+#endif
#if defined(__ANDROID__)
/* #undef TB_CONFIG_POSIX_HAVE_POSIX_SPAWNP */
#else
@@ -196,7 +201,11 @@
#define TB_CONFIG_POSIX_HAVE_FCNTL 1
#define TB_CONFIG_POSIX_HAVE_PIPE 1
/* #undef TB_CONFIG_POSIX_HAVE_PIPE2 */
-#define TB_CONFIG_POSIX_HAVE_MKFIFO 1
+#ifdef __COSMOPOLITAN__
+/* #undef TB_CONFIG_POSIX_HAVE_MKFIFO */
+#else
+# define TB_CONFIG_POSIX_HAVE_MKFIFO 1
+#endif
#define TB_CONFIG_POSIX_HAVE_FUTIMENS 1
#define TB_CONFIG_POSIX_HAVE_UTIMENSAT 1
@@ -211,6 +220,10 @@
/* #undef TB_CONFIG_SYSTEMV_HAVE_VALGRIND_STACK_REGISTER */
// linux functions
-#define TB_CONFIG_LINUX_HAVE_INOTIFY_INIT 1
+#ifdef __COSMOPOLITAN__
+/* #undef TB_CONFIG_LINUX_HAVE_INOTIFY_INIT */
+#else
+# define TB_CONFIG_LINUX_HAVE_INOTIFY_INIT 1
+#endif
#endif
diff --git a/core/src/tbox/tbox b/core/src/tbox/tbox
-Subproject 8ada0ab7f7eb98fa5eb4928b61b7701b0126a72
+Subproject 553c32406a09e3e0a0a8e8dfed741b4888ba07c
diff --git a/xmake/core/base/fwatcher.lua b/xmake/core/base/fwatcher.lua
index ddff66a06..e278b2124 100644
--- a/xmake/core/base/fwatcher.lua
+++ b/xmake/core/base/fwatcher.lua
@@ -148,7 +148,7 @@ end
-- ensure the fwatcher is opened
function _instance:_ensure_opened()
if not self:cdata() then
- return false, string.format("%s: has been closed!", self)
+ return false, string.format("<fwatcher:%s>: has been closed!", self:cdata())
end
return true
end
diff --git a/xmake/plugins/project/cmake/cmakelists.lua b/xmake/plugins/project/cmake/cmakelists.lua
index f36f3deed..eb20f6647 100644
--- a/xmake/plugins/project/cmake/cmakelists.lua
+++ b/xmake/plugins/project/cmake/cmakelists.lua
@@ -255,6 +255,17 @@ function _map_compflags(toolname, langkind, name, values)
return compiler.map_flags(langkind, name, values, {target = fake_target})
end
+-- split flag with tool prefix, e.g. clang::-Dclang
+function _split_flag_with_tool_prefix(flag)
+ local prefix
+ local splitinfo = flag:split("::")
+ if #splitinfo == 2 then
+ prefix = splitinfo[1]
+ flag = splitinfo[2]
+ end
+ return prefix, flag
+end
+
-- get flags from fileconfig
function _get_flags_from_fileconfig(fileconfig, outputdir, name)
local flags = {}
@@ -271,8 +282,19 @@ end
-- get flags from target
-- @see https://github.com/xmake-io/xmake/issues/3594
function _get_flags_from_target(target, flagkind)
+ local results = {}
local flags = _get_configs_from_target(target, flagkind)
- return target_utils.translate_flags_in_tool(target, flagkind, flags)
+ for _, flag in ipairs(flags) do
+ local tools = target:extraconf(flagkind, flag, "tools")
+ if not flag:find("::", 1, true) and tools then
+ for _, toolname in ipairs(tools) do
+ table.insert(results, toolname .. "::" .. flag)
+ end
+ else
+ table.insert(results, flag)
+ end
+ end
+ return results
end
-- set compiler
@@ -634,26 +656,74 @@ function _add_target_compile_options(cmakelists, target, outputdir)
local cxflags = _get_flags_from_target(target, "cxflags")
local cxxflags = _get_flags_from_target(target, "cxxflags")
local cuflags = _get_flags_from_target(target, "cuflags")
- if #cflags > 0 or #cxflags > 0 or #cxxflags > 0 or #cuflags > 0 then
- cmakelists:print("target_compile_options(%s PRIVATE", target:name())
- for _, flag in ipairs(_translate_flags(cflags, outputdir)) do
- flag = _escape_path_in_flag(target, flag)
- cmakelists:print(" $<$<COMPILE_LANGUAGE:C>:" .. flag .. ">")
- end
- for _, flag in ipairs(_translate_flags(cxflags, outputdir)) do
- flag = _escape_path_in_flag(target, flag)
- cmakelists:print(" $<$<COMPILE_LANGUAGE:C>:" .. flag .. ">")
- cmakelists:print(" $<$<COMPILE_LANGUAGE:CXX>:" .. flag .. ">")
- end
- for _, flag in ipairs(_translate_flags(cxxflags, outputdir)) do
- flag = _escape_path_in_flag(target, flag)
- cmakelists:print(" $<$<COMPILE_LANGUAGE:CXX>:" .. flag .. ">")
+ local toolnames = hashset.new()
+ local function _add_target_compile_options_for_compiler(toolname)
+ if #cflags > 0 or #cxflags > 0 or #cxxflags > 0 or #cuflags > 0 then
+ cmakelists:print("target_compile_options(%s PRIVATE", target:name())
+ for _, flag in ipairs(_translate_flags(cflags, outputdir)) do
+ local prefix
+ prefix, flag = _split_flag_with_tool_prefix(flag)
+ if prefix == toolname then
+ flag = _escape_path_in_flag(target, flag)
+ cmakelists:print(" $<$<COMPILE_LANGUAGE:C>:" .. flag .. ">")
+ end
+ if prefix then
+ toolnames:insert(prefix)
+ end
+ end
+ for _, flag in ipairs(_translate_flags(cxflags, outputdir)) do
+ local prefix
+ prefix, flag = _split_flag_with_tool_prefix(flag)
+ if prefix == toolname then
+ flag = _escape_path_in_flag(target, flag)
+ cmakelists:print(" $<$<COMPILE_LANGUAGE:C>:" .. flag .. ">")
+ cmakelists:print(" $<$<COMPILE_LANGUAGE:CXX>:" .. flag .. ">")
+ end
+ if prefix then
+ toolnames:insert(prefix)
+ end
+ end
+ for _, flag in ipairs(_translate_flags(cxxflags, outputdir)) do
+ local prefix
+ prefix, flag = _split_flag_with_tool_prefix(flag)
+ if prefix == toolname then
+ flag = _escape_path_in_flag(target, flag)
+ cmakelists:print(" $<$<COMPILE_LANGUAGE:CXX>:" .. flag .. ">")
+ end
+ if prefix then
+ toolnames:insert(prefix)
+ end
+ end
+ for _, flag in ipairs(_translate_flags(cuflags, outputdir)) do
+ local prefix
+ prefix, flag = _split_flag_with_tool_prefix(flag)
+ if prefix == toolname then
+ flag = _escape_path_in_flag(target, flag)
+ cmakelists:print(" $<$<COMPILE_LANGUAGE:CUDA>:" .. flag .. ">")
+ end
+ if prefix then
+ toolnames:insert(prefix)
+ end
+ end
+ cmakelists:print(")")
end
- for _, flag in ipairs(_translate_flags(cuflags, outputdir)) do
- flag = _escape_path_in_flag(target, flag)
- cmakelists:print(" $<$<COMPILE_LANGUAGE:CUDA>:" .. flag .. ">")
+ end
+ _add_target_compile_options_for_compiler()
+ local compilernames = {
+ clang = "Clang",
+ clangxx = "Clang",
+ gcc = "Gcc",
+ gxx = "Gcc",
+ cl = "MSVC",
+ link = "MSVC"
+ }
+ for _, toolname in toolnames:keys() do
+ local name = compilernames[toolname]
+ if name then
+ cmakelists:print("if(%s)", name)
+ _add_target_compile_options_for_compiler(toolname)
+ cmakelists:print("endif()")
end
- cmakelists:print(")")
end
-- add cflags/cxxflags for the specific source files
@@ -962,28 +1032,55 @@ end
function _add_target_link_options(cmakelists, target, outputdir)
local ldflags = _get_configs_from_target(target, "ldflags")
local shflags = _get_configs_from_target(target, "shflags")
- if #ldflags > 0 or #shflags > 0 then
- local flags = {}
- for _, flag in ipairs(table.unique(table.join(ldflags, shflags))) do
- table.insert(flags, _translate_flag(flag, outputdir))
- end
- if #flags > 0 then
- local cmake_minver = _get_cmake_minver()
- if cmake_minver:ge("3.13.0") then
- cmakelists:print("target_link_options(%s PRIVATE", target:name())
- else
- cmakelists:print("target_link_libraries(%s PRIVATE", target:name())
+ local toolnames = hashset.new()
+ local function _add_target_link_options_for_linker(toolname)
+ if #ldflags > 0 or #shflags > 0 then
+ local flags = {}
+ for _, flag in ipairs(table.unique(table.join(ldflags, shflags))) do
+ table.insert(flags, _translate_flag(flag, outputdir))
end
- for _, flag in ipairs(flags) do
- flag = _escape_path_in_flag(target, flag)
- -- @see https://github.com/xmake-io/xmake/issues/4196
- if cmake_minver:ge("3.12.0") and #os.argv(flag) > 1 then
- cmakelists:print(" " .. os.args("SHELL:" .. flag))
+ if #flags > 0 then
+ local cmake_minver = _get_cmake_minver()
+ if cmake_minver:ge("3.13.0") then
+ cmakelists:print("target_link_options(%s PRIVATE", target:name())
else
- cmakelists:print(" " .. flag)
+ cmakelists:print("target_link_libraries(%s PRIVATE", target:name())
end
+ for _, flag in ipairs(flags) do
+ local prefix
+ prefix, flag = _split_flag_with_tool_prefix(flag)
+ if prefix == toolname then
+ flag = _escape_path_in_flag(target, flag)
+ -- @see https://github.com/xmake-io/xmake/issues/4196
+ if cmake_minver:ge("3.12.0") and #os.argv(flag) > 1 then
+ cmakelists:print(" " .. os.args("SHELL:" .. flag))
+ else
+ cmakelists:print(" " .. flag)
+ end
+ end
+ if prefix then
+ toolnames:insert(prefix)
+ end
+ end
+ cmakelists:print(")")
end
- cmakelists:print(")")
+ end
+ end
+ _add_target_link_options_for_linker()
+ local linkernames = {
+ clang = "Clang",
+ clangxx = "Clang",
+ gcc = "Gcc",
+ gxx = "Gcc",
+ cl = "MSVC",
+ link = "MSVC"
+ }
+ for _, toolname in toolnames:keys() do
+ local name = linkernames[toolname]
+ if name then
+ cmakelists:print("if(%s)", name)
+ _add_target_link_options_for_linker(toolname)
+ cmakelists:print("endif()")
end
end
end