diff options
| author | ruki <[email protected]> | 2024-08-21 00:19:12 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-08-21 00:19:12 +0800 |
| commit | d3effb1bc2076932bbcc319a696be3f40b95d4b7 (patch) | |
| tree | 9506f31fb2025b55875e6aeca729418284dfdbf3 | |
| parent | 624b853a4ec3397eb79c4745e365a87f079f9a0f (diff) | |
| parent | 594be318a7a10b95002451a66b892b99338eed53 (diff) | |
Merge pull request #5488 from xmake-io/cosmocc
Support to build xmake using cosmocc
| -rwxr-xr-x | configure | 57 | ||||
| -rwxr-xr-x | core/src/tbox/inc/linux/tbox.config.h | 21 | ||||
| m--------- | core/src/tbox/tbox | 0 | ||||
| -rw-r--r-- | xmake/core/base/fwatcher.lua | 2 | ||||
| -rw-r--r-- | xmake/plugins/project/cmake/cmakelists.lua | 171 |
5 files changed, 209 insertions, 42 deletions
@@ -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 |
