diff --git a/packages/c/cppcoro/xmake.lua b/packages/c/cppcoro/xmake.lua new file mode 100644 index 000000000..de796d14f --- /dev/null +++ b/packages/c/cppcoro/xmake.lua @@ -0,0 +1,99 @@ +package("cppcoro") + + set_homepage("https://github.com/lewissbaker/cppcoro") + set_description("A library of C++ coroutine abstractions for the coroutines TS") + + set_urls("https://github.com/lewissbaker/cppcoro.git") + add_versions("2020.10.13", "a87e97fe5b6091ca9f6de4637736b8e0d8b109cf") + + if is_plat("windows") then + add_syslinks("synchronization", "ws2_32", "mswsock") + end + + on_install("windows", function (package) + io.writefile("xmake.lua", [[ + add_rules("mode.debug", "mode.release") + target("cppcoro") + set_kind("$(kind)") + add_files("lib/*.cpp|win32.cpp") + add_includedirs("include") + add_headerfiles("include/(**.hpp)") + set_languages("c++17") + if is_plat("windows") then + add_files("lib/win32.cpp") + add_defines("_SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING") + add_cxxflags("/await") + if is_kind("shared") then + add_rules("utils.symbols.export_all", {export_classes = true}) + add_syslinks("synchronization", "ws2_32", "mswsock") + end + else + add_cxxflags("-fcoroutines-ts") + end + ]]) + local configs = {} + if package:config("shared") then + configs.kind = "shared" + elseif not package:is_plat("windows", "mingw") and package:config("pic") ~= false then + configs.cxflags = "-fPIC" + end + for _, filepath in ipairs(os.files("lib/*.cpp")) do + io.replace(filepath, "cppcoro\\", "cppcoro/", {plain = true}) + end + import("package.tools.xmake").install(package, configs) + end) + + on_test(function (package) + local cxxflags = package:is_plat("windows") and "/await" or "-fcoroutines-ts" + assert(package:check_cxxsnippets({test = [[ + #include + #include + #include + #include + #include + #include + + #include + #include + #include + #include + + namespace fs = std::experimental::filesystem; + + cppcoro::task count_lines(cppcoro::io_service& ioService, fs::path path) { + auto file = cppcoro::read_only_file::open(ioService, path); + + constexpr size_t bufferSize = 4096; + auto buffer = std::make_unique(bufferSize); + + std::uint64_t newlineCount = 0; + + for (std::uint64_t offset = 0, fileSize = file.size(); offset < fileSize;) { + const auto bytesToRead = static_cast( + std::min(bufferSize, fileSize - offset)); + const auto bytesRead = co_await file.read(offset, buffer.get(), bytesToRead); + newlineCount += std::count(buffer.get(), buffer.get() + bytesRead, '\n'); + offset += bytesRead; + } + co_return newlineCount; + } + + cppcoro::task<> run(cppcoro::io_service& ioService) { + cppcoro::io_work_scope ioScope(ioService); + auto lineCount = co_await count_lines(ioService, fs::path{"foo.txt"}); + std::cout << "foo.txt has " << lineCount << " lines." << std::endl;; + } + + cppcoro::task<> process_events(cppcoro::io_service& ioService) { + co_return; + } + + int test() { + cppcoro::io_service ioService; + cppcoro::sync_wait(cppcoro::when_all_ready( + run(ioService), + process_events(ioService))); + return 0; + } + ]]}, {configs = {cxxflags = cxxflags, languages = "c++17", defines = "_SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING"}})) + end)