Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
85 changes: 79 additions & 6 deletions pkgs/c/compat.ftxui.lua
Original file line number Diff line number Diff line change
@@ -1,9 +1,27 @@
-- M6.x glob-aware Form B descriptor for FTXUI 6.1.9.
-- M6.x glob-aware Form B descriptor for FTXUI 6.1.9 and 7.0.3.
--
-- Pure C++ library (no C++23 modules); compiled sources + public headers.
-- Uses mcpp 0.0.4's glob exclusion (`!` prefix) to skip the ~46
-- Uses mcpp 0.0.4's glob exclusion (`!` prefix) to skip the
-- *_test.cpp / *_fuzzer.cpp files that live alongside the library
-- sources in the same directories.
-- sources in the same directories (6.1.9: ~30 test / ~16 fuzzer;
-- 7.0.3: 47 test / 6 fuzzer).
--
-- 7.0.3: source layout is unchanged (include/ftxui + src/ftxui/{screen,dom,
-- component,util}), so the 6.1.9 globs apply verbatim, and the public header
-- API this index's smoke test uses (hbox/text/separator, `Dimension::Fit`,
-- `Screen::Create(Dimensions, Dimensions)`, `Render`) is source-compatible
-- with 6.1.9. Upstream added C++20 module units (src/ftxui/*.cppm,
-- FTXUI_BUILD_MODULES, off by default); the `*.cpp` globs never match them,
-- and the plain .cpp sources still compile header-only style.
--
-- ONE version skew the globs cannot express (no per-version build blocks,
-- mcpp-community/mcpp#290): FTXUI 7 moved Loop's method definitions from
-- loop.cpp into app.cpp and dropped loop.cpp from the CMake build, but the
-- stale file still ships in the 7.0.3 tarball. Compiling both duplicates
-- `Loop::{~Loop,RunOnce,...}` at the consumer's link (a dependency's objects
-- ALL enter the link — no lazy archive selection). 6.1.9 has no app.cpp and
-- genuinely needs loop.cpp. The install() hook below deletes loop.cpp only
-- when app.cpp exists, i.e. exactly on the 7.x layout.
--
-- Produces a single static archive `libftxui.a` covering all three
-- upstream cmake targets (ftxui-screen, ftxui-dom, ftxui-component).
Expand All @@ -26,6 +44,13 @@ package = {
},
sha256 = "45819c1e54914783d4a1ca5633885035d74146778a1f74e1213cdb7b76340e71",
},
-- 7.0.3 has no CN mirror yet (never published to mcpp-res);
-- plain-string GLOBAL fallback. Flip to { GLOBAL, CN } if it gets
-- mirrored — sha256 stays the same.
["7.0.3"] = {
url = "https://github.com/ArthurSonzogni/FTXUI/archive/refs/tags/v7.0.3.tar.gz",
sha256 = "e7c62ffe19009759821b4f0f8df7f2a6fb83784c3a9f1477d81f56d3ee723c88",
},
},
macosx = {
["6.1.9"] = {
Expand All @@ -35,6 +60,13 @@ package = {
},
sha256 = "45819c1e54914783d4a1ca5633885035d74146778a1f74e1213cdb7b76340e71",
},
-- 7.0.3 has no CN mirror yet (never published to mcpp-res);
-- plain-string GLOBAL fallback. Flip to { GLOBAL, CN } if it gets
-- mirrored — sha256 stays the same.
["7.0.3"] = {
url = "https://github.com/ArthurSonzogni/FTXUI/archive/refs/tags/v7.0.3.tar.gz",
sha256 = "e7c62ffe19009759821b4f0f8df7f2a6fb83784c3a9f1477d81f56d3ee723c88",
},
},
windows = {
["6.1.9"] = {
Expand All @@ -44,19 +76,26 @@ package = {
},
sha256 = "45819c1e54914783d4a1ca5633885035d74146778a1f74e1213cdb7b76340e71",
},
-- 7.0.3 has no CN mirror yet (never published to mcpp-res);
-- plain-string GLOBAL fallback. Flip to { GLOBAL, CN } if it gets
-- mirrored — sha256 stays the same.
["7.0.3"] = {
url = "https://github.com/ArthurSonzogni/FTXUI/archive/refs/tags/v7.0.3.tar.gz",
sha256 = "e7c62ffe19009759821b4f0f8df7f2a6fb83784c3a9f1477d81f56d3ee723c88",
},
},
},

-- Form B `mcpp` segment: paths are globs relative to the verdir.
-- The leading `*/` absorbs the GitHub tarball's `FTXUI-6.1.9/` wrap.
-- The leading `*/` absorbs the GitHub tarball's `FTXUI-<ver>/` wrap.
mcpp = {
language = "c++23",
import_std = false, -- pure compiled lib, no `import std;`
include_dirs = { "*/include", "*/src" }, -- src/ for private headers (box_helper.hpp etc.),
sources = {
"*/src/ftxui/**/*.cpp",
"!*/src/ftxui/**/*_test.cpp", -- 30+ gtest files
"!*/src/ftxui/**/*_fuzzer.cpp", -- ~16 fuzz targets
"!*/src/ftxui/**/*_test.cpp", -- gtest files (30+ in 6.1.9, 47 in 7.0.3)
"!*/src/ftxui/**/*_fuzzer.cpp", -- fuzz targets (16 in 6.1.9, 6 in 7.0.3)
},
targets = { ["ftxui"] = { kind = "lib" } },
deps = { },
Expand All @@ -65,3 +104,37 @@ package = {
},
},
}

import("xim.libxpkg.pkginfo")

function install()

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里看 install hook 只是移动了目录, 好像没有其他额外功能,是不是可以省去

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这个 hook 除了保持默认解包目录结构外,还会在检测到 7.x 的 app.cpp 时删除 tarball 中遗留的 loop.cpp。FTXUI 7.0.3 同时编译 app.cpploop.cpp 会产生 Loop::* 重复定义,而 6.1.9 仍然需要 loop.cpp。目前描述符还不能按版本声明不同的 sourcesmcpp-community/mcpp#290),所以暂时需要在 install hook 中处理这个版本差异。这里的目录移动是自定义 install hook 接管默认安装流程后,为保持原有 */ glob 解包结构所需的。基于这个兼容约束,是否可以保留该 hook?我也可以进一步精简注释,让删除 loop.cpp 的目的更突出。

-- Reproduce the default unpack shape — install_dir/<wrap>/src/... — so
-- the descriptor's `*/` globs keep matching exactly one wrap level (same
-- normalisation as compat.eui-neo). ⚠️ NO SHELL and no directory listing
-- in this sandbox: the wrap is asked about by name, not discovered.
local v = pkginfo.version()
local idir = pkginfo.install_dir()
local layer = path.join(idir, "FTXUI-" .. v)
os.tryrm(idir)
os.mkdir(idir)
for _, name in ipairs({ "FTXUI-" .. v, "ftxui-" .. v,
"FTXUI-v" .. v, "ftxui-v" .. v }) do
if os.isfile(path.join(name, "CMakeLists.txt")) then
os.mv(name, layer)
break
end
end
if not os.isfile(path.join(layer, "CMakeLists.txt")) then
log.error("ftxui: no CMakeLists.txt under %s after unpacking; the "
.. "archive layout is neither wrapped nor flat", layer)
return false
end

-- See the header comment: drop the stale loop.cpp on the 7.x layout
-- (app.cpp present) where its Loop methods are duplicated; keep it for
-- 6.1.9, which has no app.cpp.
if os.isfile(path.join(layer, "src", "ftxui", "component", "app.cpp")) then
os.tryrm(path.join(layer, "src", "ftxui", "component", "loop.cpp"))
end
return true
end
2 changes: 1 addition & 1 deletion tests/examples/core/mcpp.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ version = "0.1.0"

[dependencies.compat]
gtest = { version = "1.15.2", features = ["main"] }
ftxui = "6.1.9"
ftxui = "7.0.3"
lua = "5.4.7"
mbedtls = "3.6.1"
opengl = "2026.05.31"
Expand Down
Loading