|
| 1 | +package = { |
| 2 | + spec = "1", |
| 3 | + namespace = "compat", |
| 4 | + name = "muduo", |
| 5 | + description = "A reactor-based C++ network library for Linux", |
| 6 | + licenses = {"BSD-3-Clause"}, |
| 7 | + repo = "https://github.com/chenshuo/muduo", |
| 8 | + type = "package", |
| 9 | + |
| 10 | + xpm = { |
| 11 | + linux = { |
| 12 | + ["2.0.3"] = { |
| 13 | + url = "https://github.com/chenshuo/muduo/archive/refs/tags/v2.0.3.tar.gz", |
| 14 | + sha256 = "5e90c2f07074ed5ab9347959edc8d387e40a57fbffb92e4a99cfb9a230851371", |
| 15 | + }, |
| 16 | + }, |
| 17 | + }, |
| 18 | + |
| 19 | + mcpp = { |
| 20 | + language = "c++23", |
| 21 | + import_std = false, |
| 22 | + include_dirs = { "*" }, |
| 23 | + sources = { |
| 24 | + "*/muduo/base/*.cc", |
| 25 | + "*/muduo/net/poller/DefaultPoller.cc", |
| 26 | + "*/muduo/net/poller/EPollPoller.cc", |
| 27 | + "*/muduo/net/poller/PollPoller.cc", |
| 28 | + "*/muduo/net/Acceptor.cc", |
| 29 | + "*/muduo/net/Buffer.cc", |
| 30 | + "*/muduo/net/Channel.cc", |
| 31 | + "*/muduo/net/Connector.cc", |
| 32 | + "*/muduo/net/EventLoop.cc", |
| 33 | + "*/muduo/net/EventLoopThread.cc", |
| 34 | + "*/muduo/net/EventLoopThreadPool.cc", |
| 35 | + "*/muduo/net/InetAddress.cc", |
| 36 | + "*/muduo/net/Poller.cc", |
| 37 | + "*/muduo/net/Socket.cc", |
| 38 | + "*/muduo/net/SocketsOps.cc", |
| 39 | + "*/muduo/net/TcpClient.cc", |
| 40 | + "*/muduo/net/TcpConnection.cc", |
| 41 | + "*/muduo/net/TcpServer.cc", |
| 42 | + "*/muduo/net/Timer.cc", |
| 43 | + "*/muduo/net/TimerQueue.cc", |
| 44 | + }, |
| 45 | + targets = { |
| 46 | + ["muduo"] = { kind = "lib" }, |
| 47 | + }, |
| 48 | + deps = { |
| 49 | + ["compat.boost-circular-buffer"] = "1.92.0", |
| 50 | + ["compat.boost-any"] = "1.92.0", |
| 51 | + ["compat.boost-utility"] = "1.92.0", |
| 52 | + }, |
| 53 | + }, |
| 54 | +} |
| 55 | + |
| 56 | +import("xim.libxpkg.pkginfo") |
| 57 | +import("xim.libxpkg.log") |
| 58 | + |
| 59 | +function install() |
| 60 | + local wrap = "muduo-" .. pkginfo.version() |
| 61 | + if not os.isfile(path.join(wrap, "muduo/net/TcpClient.cc")) then |
| 62 | + log.error("compat.muduo: expected %s/muduo/net/TcpClient.cc", wrap) |
| 63 | + return false |
| 64 | + end |
| 65 | + |
| 66 | + local prefix = pkginfo.install_dir() |
| 67 | + os.tryrm(prefix) |
| 68 | + os.mkdir(prefix) |
| 69 | + local srcroot = path.join(prefix, wrap) |
| 70 | + os.mv(wrap, srcroot) |
| 71 | + |
| 72 | + -- shared_ptr::unique() was removed in C++20; the upstream C++17 code |
| 73 | + -- uses it before copying connection_. Preserve its exact meaning. |
| 74 | + local source = path.join(srcroot, "muduo/net/TcpClient.cc") |
| 75 | + local content = io.readfile(source) |
| 76 | + local patched, count = content:gsub("connection_%.unique%(%);", "connection_.use_count() == 1;") |
| 77 | + if count ~= 1 then |
| 78 | + log.error("compat.muduo: expected exactly one shared_ptr::unique() call, got %d", count) |
| 79 | + return false |
| 80 | + end |
| 81 | + io.writefile(source, patched) |
| 82 | + -- sys/time.h does not promise the definition of struct tm. Clang's |
| 83 | + -- Linux sysroot needs the explicit time.h include for gmtime_r(). |
| 84 | + source = path.join(srcroot, "muduo/base/Timestamp.cc") |
| 85 | + content = io.readfile(source) |
| 86 | + patched, count = content:gsub("#include <sys/time%.h>\n", "#include <sys/time.h>\n#include <time.h>\n") |
| 87 | + if count ~= 1 then |
| 88 | + log.error("compat.muduo: expected exactly one sys/time.h include, got %d", count) |
| 89 | + return false |
| 90 | + end |
| 91 | + io.writefile(source, patched) |
| 92 | + return true |
| 93 | +end |
0 commit comments