boost: cmake test (#5640)
* boost: cmake test * fix windows build * move test to single file * add iostreams support * support regex, locale * use tar.gz * support locale, python * Use sorted libs * support all buildable by default configs * support all configs * support header only config * improve all config * improve header only config * add warning for mpi config * merge to boost package * workaround for cmake url * boostdep: add package * hack add_urls * boostdep: fix c++ language * improve xmake.luapull/5553/merge
parent
bf358b339c
commit
ba8fd3c1a5
10 changed files with 1066 additions and 461 deletions
@ -0,0 +1,269 @@ |
|||||||
|
import("core.tool.toolchain") |
||||||
|
import("core.base.option") |
||||||
|
|
||||||
|
function _get_compiler(package, toolchain) |
||||||
|
local cxx = package:build_getenv("cxx") |
||||||
|
if package:is_plat("macosx") then |
||||||
|
-- we uses ld/clang++ for link stdc++ for shared libraries |
||||||
|
-- and we need `xcrun -sdk macosx clang++` to make b2 to get `-isysroot` automatically |
||||||
|
local cc = package:build_getenv("ld") |
||||||
|
if cc and cc:find("clang", 1, true) and cc:find("Xcode", 1, true) then |
||||||
|
cc = "xcrun -sdk macosx clang++" |
||||||
|
end |
||||||
|
return format("using darwin : : %s ;", cc) |
||||||
|
elseif package:is_plat("windows") then |
||||||
|
local vs_toolset = toolchain:config("vs_toolset") |
||||||
|
local msvc_ver = "" |
||||||
|
local win_toolset = "msvc" |
||||||
|
if toolchain:name() == "clang-cl" then |
||||||
|
win_toolset = "clang-win" |
||||||
|
cxx = cxx:gsub("(clang%-cl)$", "%1.exe", 1) |
||||||
|
msvc_ver = "" |
||||||
|
elseif vs_toolset then |
||||||
|
local i = vs_toolset:find("%.") |
||||||
|
msvc_ver = i and vs_toolset:sub(1, i + 1) |
||||||
|
end |
||||||
|
|
||||||
|
-- Specifying a version will disable b2 from forcing tools |
||||||
|
-- from the latest installed msvc version. |
||||||
|
return format("using %s : %s : \"%s\" ;", win_toolset, msvc_ver, cxx:gsub("\\", "\\\\")) |
||||||
|
else |
||||||
|
cxx = cxx:gsub("gcc$", "g++") |
||||||
|
cxx = cxx:gsub("gcc%-", "g++-") |
||||||
|
cxx = cxx:gsub("clang$", "clang++") |
||||||
|
cxx = cxx:gsub("clang%-", "clang++-") |
||||||
|
if cxx and cxx:find("clang", 1, true) then |
||||||
|
return format("using clang : : \"%s\" ;", cxx:gsub("\\", "/")) |
||||||
|
else |
||||||
|
return format("using gcc : : \"%s\" ;", cxx:gsub("\\", "/")) |
||||||
|
end |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
function _config_deppath(file, depname, rule) |
||||||
|
local dep = package:dep(depname) |
||||||
|
local info = dep:fetch({external = false}) |
||||||
|
if info then |
||||||
|
local includedirs = table.wrap(info.sysincludedirs or info.includedirs) |
||||||
|
for i, dir in ipairs(includedirs) do |
||||||
|
includedirs[i] = path.unix(dir) |
||||||
|
end |
||||||
|
local linkdirs = table.wrap(info.linkdirs) |
||||||
|
for i, dir in ipairs(linkdirs) do |
||||||
|
linkdirs[i] = path.unix(dir) |
||||||
|
end |
||||||
|
local links = table.wrap(info.links) |
||||||
|
local usingstr = format("\nusing %s : %s : <include>%s <search>%s <name>%s ;", |
||||||
|
rule, dep:version(), |
||||||
|
table.concat(includedirs, ";"), |
||||||
|
table.concat(linkdirs, ";"), |
||||||
|
table.concat(links, ";")) |
||||||
|
file:write(usingstr) |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
function main(package) |
||||||
|
import("libs", {rootdir = package:scriptdir()}) |
||||||
|
|
||||||
|
-- get host toolchain |
||||||
|
local host_toolchain |
||||||
|
if package:is_plat("windows") then |
||||||
|
host_toolchain = toolchain.load("msvc", {plat = "windows", arch = os.arch()}) |
||||||
|
if not host_toolchain:check() then |
||||||
|
host_toolchain = toolchain.load("clang-cl", {plat = "windows", arch = os.arch()}) |
||||||
|
end |
||||||
|
assert(host_toolchain:check(), "host msvc or clang-cl not found!") |
||||||
|
end |
||||||
|
|
||||||
|
-- force boost to compile with the desired compiler |
||||||
|
local file = io.open("user-config.jam", "w") |
||||||
|
if file then |
||||||
|
file:write(_get_compiler(package, host_toolchain)) |
||||||
|
file:close() |
||||||
|
end |
||||||
|
|
||||||
|
local bootstrap_argv = |
||||||
|
{ |
||||||
|
"--prefix=" .. package:installdir(), |
||||||
|
"--libdir=" .. package:installdir("lib"), |
||||||
|
"--without-icu" |
||||||
|
} |
||||||
|
|
||||||
|
if package:has_tool("cxx", "clang", "clangxx") then |
||||||
|
table.insert(bootstrap_argv, "--with-toolset=clang") |
||||||
|
end |
||||||
|
|
||||||
|
if package:is_plat("windows") then |
||||||
|
-- for bootstrap.bat, all other arguments are useless |
||||||
|
bootstrap_argv = { "msvc" } |
||||||
|
os.vrunv("bootstrap.bat", bootstrap_argv, {envs = host_toolchain:runenvs()}) |
||||||
|
elseif package:is_plat("mingw") and is_host("windows") then |
||||||
|
bootstrap_argv = { "gcc" } |
||||||
|
os.vrunv("bootstrap.bat", bootstrap_argv) |
||||||
|
-- todo looking for better solution to fix the confict between user-config.jam and project-config.jam |
||||||
|
io.replace("project-config.jam", "using[^\n]+", "") |
||||||
|
else |
||||||
|
os.vrunv("./bootstrap.sh", bootstrap_argv) |
||||||
|
end |
||||||
|
|
||||||
|
-- get build toolchain |
||||||
|
local build_toolchain |
||||||
|
local build_toolset |
||||||
|
local runenvs |
||||||
|
if package:is_plat("windows") then |
||||||
|
if package:has_tool("cxx", "clang_cl") then |
||||||
|
build_toolset = "clang-win" |
||||||
|
build_toolchain = package:toolchain("clang-cl") |
||||||
|
elseif package:has_tool("cxx", "clang") then |
||||||
|
build_toolset = "clang-win" |
||||||
|
build_toolchain = package:toolchain("clang") or package:toolchain("llvm") |
||||||
|
elseif package:has_tool("cxx", "cl") then |
||||||
|
build_toolset = "msvc" |
||||||
|
build_toolchain = package:toolchain("msvc") |
||||||
|
end |
||||||
|
if build_toolchain then |
||||||
|
runenvs = build_toolchain:runenvs() |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
local file = io.open("user-config.jam", "w") |
||||||
|
if file then |
||||||
|
file:write(_get_compiler(package, build_toolchain)) |
||||||
|
if package:config("lzma") then |
||||||
|
_config_deppath(file, "xz", "lzma") |
||||||
|
end |
||||||
|
if package:config("zstd") then |
||||||
|
_config_deppath(file, "zstd", "zstd") |
||||||
|
end |
||||||
|
if package:config("zlib") then |
||||||
|
_config_deppath(file, "zlib", "zlib") |
||||||
|
end |
||||||
|
if package:config("bzip2") then |
||||||
|
_config_deppath(file, "bzip2", "bzip2") |
||||||
|
end |
||||||
|
file:close() |
||||||
|
end |
||||||
|
os.vrun("./b2 headers") |
||||||
|
|
||||||
|
local njobs = option.get("jobs") or tostring(os.default_njob()) |
||||||
|
local argv = |
||||||
|
{ |
||||||
|
"--prefix=" .. package:installdir(), |
||||||
|
"--libdir=" .. package:installdir("lib"), |
||||||
|
"-d2", |
||||||
|
"-j" .. njobs, |
||||||
|
"--hash", |
||||||
|
"-q", -- quit on first error |
||||||
|
"--layout=tagged-1.66", -- prevent -x64 suffix in case cmake can't find it |
||||||
|
"--user-config=user-config.jam", |
||||||
|
"install", |
||||||
|
"threading=" .. (package:config("multi") and "multi" or "single"), |
||||||
|
"debug-symbols=" .. (package:debug() and "on" or "off"), |
||||||
|
"link=" .. (package:config("shared") and "shared" or "static"), |
||||||
|
"variant=" .. (package:is_debug() and "debug" or "release"), |
||||||
|
"runtime-debugging=" .. (package:is_debug() and "on" or "off") |
||||||
|
} |
||||||
|
|
||||||
|
local cxxflags = {} |
||||||
|
if package:config("lzma") then |
||||||
|
if package:is_plat("windows") and not package:dep("xz"):config("shared") then |
||||||
|
table.insert(cxxflags, "-DLZMA_API_STATIC") |
||||||
|
end |
||||||
|
else |
||||||
|
table.insert(argv, "-sNO_LZMA=1") |
||||||
|
end |
||||||
|
if not package:config("zstd") then |
||||||
|
table.insert(argv, "-sNO_ZSTD=1") |
||||||
|
end |
||||||
|
if not package:config("zlib") then |
||||||
|
table.insert(argv, "-sNO_ZLIB=1") |
||||||
|
end |
||||||
|
if not package:config("bzip2") then |
||||||
|
table.insert(argv, "-sNO_BZIP2=1") |
||||||
|
end |
||||||
|
|
||||||
|
if package:config("lto") then |
||||||
|
table.insert(argv, "lto=on") |
||||||
|
end |
||||||
|
if package:is_arch("aarch64", "arm+.*") then |
||||||
|
table.insert(argv, "architecture=arm") |
||||||
|
end |
||||||
|
if package:is_arch(".+64.*") then |
||||||
|
table.insert(argv, "address-model=64") |
||||||
|
else |
||||||
|
table.insert(argv, "address-model=32") |
||||||
|
end |
||||||
|
|
||||||
|
local linkflags = {} |
||||||
|
table.join2(cxxflags, table.wrap(package:config("cxflags"))) |
||||||
|
table.join2(cxxflags, table.wrap(package:config("cxxflags"))) |
||||||
|
if package:is_plat("windows") then |
||||||
|
if package:config("shared") then |
||||||
|
table.insert(argv, "runtime-link=shared") |
||||||
|
elseif package:has_runtime("MT", "MTd") then |
||||||
|
table.insert(argv, "runtime-link=static") |
||||||
|
else |
||||||
|
table.insert(argv, "runtime-link=shared") |
||||||
|
end |
||||||
|
table.insert(argv, "toolset=" .. build_toolset) |
||||||
|
table.insert(cxxflags, "-std:c++14") |
||||||
|
elseif package:is_plat("mingw") then |
||||||
|
table.insert(argv, "toolset=gcc") |
||||||
|
elseif package:is_plat("macosx") then |
||||||
|
table.insert(argv, "toolset=darwin") |
||||||
|
|
||||||
|
-- fix macosx arm64 build issue https://github.com/microsoft/vcpkg/pull/18529 |
||||||
|
table.insert(cxxflags, "-std=c++14") |
||||||
|
table.insert(cxxflags, "-arch") |
||||||
|
table.insert(cxxflags, package:arch()) |
||||||
|
local xcode = package:toolchain("xcode") or import("core.tool.toolchain").load("xcode", {plat = package:plat(), arch = package:arch()}) |
||||||
|
if xcode:check() then |
||||||
|
local xcode_dir = xcode:config("xcode") |
||||||
|
local xcode_sdkver = xcode:config("xcode_sdkver") |
||||||
|
local target_minver = xcode:config("target_minver") |
||||||
|
if xcode_dir and xcode_sdkver then |
||||||
|
local xcode_sdkdir = xcode_dir .. "/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX" .. xcode_sdkver .. ".sdk" |
||||||
|
table.insert(cxxflags, "-isysroot") |
||||||
|
table.insert(cxxflags, xcode_sdkdir) |
||||||
|
end |
||||||
|
if target_minver then |
||||||
|
table.insert(cxxflags, "-mmacosx-version-min=" .. target_minver) |
||||||
|
end |
||||||
|
end |
||||||
|
else |
||||||
|
table.insert(cxxflags, "-std=c++14") |
||||||
|
if package:config("pic") ~= false then |
||||||
|
table.insert(cxxflags, "-fPIC") |
||||||
|
end |
||||||
|
end |
||||||
|
if package.has_runtime and package:has_runtime("c++_shared", "c++_static") then |
||||||
|
table.insert(cxxflags, "-stdlib=libc++") |
||||||
|
table.insert(linkflags, "-stdlib=libc++") |
||||||
|
if package:has_runtime("c++_static") then |
||||||
|
table.insert(linkflags, "-static-libstdc++") |
||||||
|
end |
||||||
|
end |
||||||
|
if package:config("asan") then |
||||||
|
table.insert(cxxflags, "-fsanitize=address") |
||||||
|
table.insert(linkflags, "-fsanitize=address") |
||||||
|
end |
||||||
|
if cxxflags then |
||||||
|
table.insert(argv, "cxxflags=" .. table.concat(cxxflags, " ")) |
||||||
|
end |
||||||
|
if linkflags then |
||||||
|
table.insert(argv, "linkflags=" .. table.concat(linkflags, " ")) |
||||||
|
end |
||||||
|
libs.for_each(function (libname) |
||||||
|
if package:config("all") or package:config(libname) then |
||||||
|
table.insert(argv, "--with-" .. libname) |
||||||
|
end |
||||||
|
end) |
||||||
|
|
||||||
|
if package:is_plat("linux") then |
||||||
|
table.insert(argv, "pch=off") |
||||||
|
end |
||||||
|
local ok = os.execv("./b2", argv, {envs = runenvs, try = true, stdout = "boost-log.txt"}) |
||||||
|
if ok ~= 0 then |
||||||
|
raise("boost build failed, please check log in " .. path.join(os.curdir(), "boost-log.txt")) |
||||||
|
end |
||||||
|
end |
@ -0,0 +1,94 @@ |
|||||||
|
function _get_linkname(package, libname) |
||||||
|
local linkname |
||||||
|
if package:is_plat("windows") then |
||||||
|
linkname = (package:config("shared") and "boost_" or "libboost_") .. libname |
||||||
|
else |
||||||
|
linkname = "boost_" .. libname |
||||||
|
end |
||||||
|
if libname == "python" or libname == "numpy" then |
||||||
|
linkname = linkname .. package:config("pyver"):gsub("%p+", "") |
||||||
|
end |
||||||
|
if package:config("multi") then |
||||||
|
linkname = linkname .. "-mt" |
||||||
|
end |
||||||
|
if package:is_plat("windows") then |
||||||
|
if package:config("shared") then |
||||||
|
if package:debug() then |
||||||
|
linkname = linkname .. "-gd" |
||||||
|
end |
||||||
|
elseif package:config("asan") or package:has_runtime("MTd") then |
||||||
|
linkname = linkname .. "-sgd" |
||||||
|
elseif package:has_runtime("MT") then |
||||||
|
linkname = linkname .. "-s" |
||||||
|
elseif package:config("asan") or package:has_runtime("MDd") then |
||||||
|
linkname = linkname .. "-gd" |
||||||
|
end |
||||||
|
else |
||||||
|
if package:debug() then |
||||||
|
linkname = linkname .. "-d" |
||||||
|
end |
||||||
|
end |
||||||
|
return linkname |
||||||
|
end |
||||||
|
|
||||||
|
function main(package) |
||||||
|
import("libs", {rootdir = package:scriptdir()}) |
||||||
|
|
||||||
|
-- we need the fixed link order |
||||||
|
local headeronly = not package:config("all") |
||||||
|
local sublibs = {log = {"log_setup", "log"}, |
||||||
|
python = {"python", "numpy"}, |
||||||
|
stacktrace = {"stacktrace_backtrace", "stacktrace_basic"}} |
||||||
|
|
||||||
|
libs.for_each(function (libname) |
||||||
|
if package:config(libname) then |
||||||
|
headeronly = false |
||||||
|
end |
||||||
|
local libs = sublibs[libname] |
||||||
|
if libs then |
||||||
|
for _, lib in ipairs(libs) do |
||||||
|
package:add("links", _get_linkname(package, lib)) |
||||||
|
end |
||||||
|
else |
||||||
|
package:add("links", _get_linkname(package, libname)) |
||||||
|
end |
||||||
|
end) |
||||||
|
|
||||||
|
if headeronly then |
||||||
|
package:set("kind", "library", {headeronly = true}) |
||||||
|
end |
||||||
|
-- disable auto-link all libs |
||||||
|
if package:is_plat("windows") then |
||||||
|
package:add("defines", "BOOST_ALL_NO_LIB") |
||||||
|
end |
||||||
|
|
||||||
|
if package:config("python") then |
||||||
|
if not package:config("shared") then |
||||||
|
package:add("defines", "BOOST_PYTHON_STATIC_LIB") |
||||||
|
end |
||||||
|
package:add("deps", "python " .. package:config("pyver") .. ".x", {configs = {headeronly = true}}) |
||||||
|
end |
||||||
|
if package:config("zstd") then |
||||||
|
package:add("deps", "zstd") |
||||||
|
end |
||||||
|
if package:config("lzma") then |
||||||
|
package:add("deps", "xz") |
||||||
|
end |
||||||
|
if package:config("zlib") then |
||||||
|
package:add("deps", "zlib") |
||||||
|
end |
||||||
|
if package:config("bzip2") then |
||||||
|
package:add("deps", "bzip2") |
||||||
|
end |
||||||
|
|
||||||
|
if package:is_plat("windows") and package:version():le("1.85.0") then |
||||||
|
local vs_toolset = package:toolchain("msvc"):config("vs_toolset") |
||||||
|
if vs_toolset then |
||||||
|
local vs_toolset_ver = import("core.base.semver").new(vs_toolset) |
||||||
|
local minor = vs_toolset_ver:minor() |
||||||
|
if minor and minor >= 40 then |
||||||
|
package:add("patches", "<=1.85.0", "patches/1.85.0/fix-v144.patch", "1ba99cb2e2f03a4ba489a32596c62e1310b6c73ba4d19afa8796bcf180c84422") |
||||||
|
end |
||||||
|
end |
||||||
|
end |
||||||
|
end |
@ -0,0 +1,160 @@ |
|||||||
|
import("core.base.hashset") |
||||||
|
import("core.base.option") |
||||||
|
|
||||||
|
function _mangle_link_string(package) |
||||||
|
local link = "boost_" |
||||||
|
if package:is_plat("windows") and not package:config("shared") then |
||||||
|
link = "lib" .. link |
||||||
|
end |
||||||
|
return link |
||||||
|
end |
||||||
|
-- Only get package dep version in on_install |
||||||
|
function _add_links(package) |
||||||
|
local suffix = _mangle_link_string(package) |
||||||
|
|
||||||
|
local sub_libs_map = { |
||||||
|
test = {"prg_exec_monitor", "unit_test_framework"}, |
||||||
|
serialization = {"wserialization", "serialization"}, |
||||||
|
fiber = {"fiber", "fiber_numa"}, |
||||||
|
log = {"log", "log_setup"}, |
||||||
|
stacktrace = { |
||||||
|
"stacktrace_noop", |
||||||
|
"stacktrace_backtrace", |
||||||
|
"stacktrace_addr2line", |
||||||
|
"stacktrace_basic", |
||||||
|
"stacktrace_windbg", |
||||||
|
"stacktrace_windbg_cached", |
||||||
|
}, |
||||||
|
} |
||||||
|
|
||||||
|
if package:config("python") then |
||||||
|
local py_ver = assert(package:dep("python"):version(), "Can't get python version") |
||||||
|
py_ver = py_ver:major() .. py_ver:minor() |
||||||
|
-- TODO: detect numpy |
||||||
|
sub_libs_map["python"] = { |
||||||
|
"python" .. py_ver, |
||||||
|
"numpy" .. py_ver, |
||||||
|
} |
||||||
|
end |
||||||
|
|
||||||
|
libs.for_each(function (libname) |
||||||
|
if not package:config(libname) then |
||||||
|
return |
||||||
|
end |
||||||
|
|
||||||
|
local sub_libs = sub_libs_map[libname] |
||||||
|
if sub_libs then |
||||||
|
for _, sub_libname in ipairs(sub_libs) do |
||||||
|
package:add("links", suffix .. sub_libname) |
||||||
|
end |
||||||
|
if libname == "test" then |
||||||
|
-- always static |
||||||
|
package:add("links", "libboost_test_exec_monitor") |
||||||
|
end |
||||||
|
else |
||||||
|
package:add("links", suffix .. libname) |
||||||
|
end |
||||||
|
end) |
||||||
|
end |
||||||
|
|
||||||
|
function _check_links(package) |
||||||
|
local lib_files = {} |
||||||
|
local links = hashset.from(table.wrap(package:get("links"))) |
||||||
|
|
||||||
|
for _, libfile in ipairs(os.files(package:installdir("lib/*"))) do |
||||||
|
local link = path.basename(libfile) |
||||||
|
if not links:remove(link) then |
||||||
|
table.insert(lib_files, path.filename(libfile)) |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
links = links:to_array() |
||||||
|
if #links ~= 0 then |
||||||
|
-- TODO: Remove header only "link" or unsupported platform link |
||||||
|
wprint("Missing library files\n" .. table.concat(links, "\n")) |
||||||
|
end |
||||||
|
if #lib_files ~= 0 then |
||||||
|
wprint("Missing links\n" .. table.concat(lib_files, "\n")) |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
function _add_iostreams_configs(package, configs) |
||||||
|
local iostreams_deps = {"zlib", "bzip2", "lzma", "zstd"} |
||||||
|
for _, dep in ipairs(iostreams_deps) do |
||||||
|
local config = format("-DBOOST_IOSTREAMS_ENABLE_%s=%s", dep:upper(), (package:config(dep) and "ON" or "OFF")) |
||||||
|
table.insert(configs, config) |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
function _add_libs_configs(package, configs) |
||||||
|
if not package:config("all") then |
||||||
|
local header_only_buildable |
||||||
|
if package:is_headeronly() then |
||||||
|
header_only_buildable = hashset.from(libs.get_header_only_buildable()) |
||||||
|
end |
||||||
|
|
||||||
|
local exclude_libs = {} |
||||||
|
libs.for_each(function (libname) |
||||||
|
if header_only_buildable and header_only_buildable:has(libname) then |
||||||
|
-- continue |
||||||
|
else |
||||||
|
if not package:config(libname) then |
||||||
|
table.insert(exclude_libs, libname) |
||||||
|
end |
||||||
|
end |
||||||
|
end) |
||||||
|
table.insert(configs, "-DBOOST_EXCLUDE_LIBRARIES=" .. table.concat(exclude_libs, ";")) |
||||||
|
end |
||||||
|
|
||||||
|
table.insert(configs, "-DBOOST_ENABLE_PYTHON=" .. (package:config("python") and "ON" or "OFF")) |
||||||
|
table.insert(configs, "-DBOOST_ENABLE_MPI=" .. (package:config("mpi") and "ON" or "OFF")) |
||||||
|
if package:config("locale") then |
||||||
|
table.insert(configs, "-DCMAKE_CXX_STANDARD=17") |
||||||
|
end |
||||||
|
|
||||||
|
_add_iostreams_configs(package, configs) |
||||||
|
|
||||||
|
local openssl = package:dep("openssl") |
||||||
|
if openssl and not openssl:is_system() then |
||||||
|
table.insert(configs, "-DOPENSSL_ROOT_DIR=" .. openssl:installdir()) |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
function _add_opt(package, opt) |
||||||
|
opt.cxflags = {} |
||||||
|
local lzma = package:dep("xz") |
||||||
|
if lzma and not lzma:config("shared") then |
||||||
|
table.insert(opt.cxflags, "-DLZMA_API_STATIC") |
||||||
|
end |
||||||
|
|
||||||
|
if package:has_tool("cxx", "cl") then |
||||||
|
table.insert(opt.cxflags, "/EHsc") |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
function main(package) |
||||||
|
import("libs", {rootdir = package:scriptdir()}) |
||||||
|
|
||||||
|
local configs = {"-DBOOST_INSTALL_LAYOUT=system"} |
||||||
|
table.insert(configs, "-DCMAKE_BUILD_TYPE=" .. (package:is_debug() and "Debug" or "Release")) |
||||||
|
table.insert(configs, "-DBUILD_SHARED_LIBS=" .. (package:config("shared") and "ON" or "OFF")) |
||||||
|
if package:is_plat("windows") then |
||||||
|
table.insert(configs, "-DCMAKE_COMPILE_PDB_OUTPUT_DIRECTORY=''") |
||||||
|
end |
||||||
|
|
||||||
|
_add_libs_configs(package, configs) |
||||||
|
|
||||||
|
if option.get("verbose") then |
||||||
|
table.insert(configs, "-DBoost_DEBUG=ON") |
||||||
|
end |
||||||
|
|
||||||
|
local opt = {} |
||||||
|
_add_opt(package, opt) |
||||||
|
import("package.tools.cmake").install(package, configs, opt) |
||||||
|
|
||||||
|
_add_links(package) |
||||||
|
|
||||||
|
if option.get("verbose") then |
||||||
|
_check_links(package) |
||||||
|
end |
||||||
|
end |
@ -0,0 +1,112 @@ |
|||||||
|
function _add_defines(package) |
||||||
|
if package:is_plat("windows") then |
||||||
|
package:add("defines", "BOOST_ALL_NO_LIB") |
||||||
|
end |
||||||
|
if package:config("shared") then |
||||||
|
package:add("defines", "BOOST_ALL_DYN_LINK") |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
function _recursion_enabled_dep_configs(package, libname, deps, visited_table) |
||||||
|
if package:config(libname) and not visited_table[libname] then |
||||||
|
visited_table[libname] = true |
||||||
|
for _, dep_libname in ipairs(deps) do |
||||||
|
package:config_set(dep_libname, true) |
||||||
|
_recursion_enabled_dep_configs(package, dep_libname, libs.get_lib_deps()[dep_libname], visited_table) |
||||||
|
end |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
function _auto_enabled_dep_configs(package) |
||||||
|
-- workaround |
||||||
|
if package:config("locale") then |
||||||
|
package:config_set("regex", true) |
||||||
|
end |
||||||
|
if package:config("python") then |
||||||
|
package:config_set("thread", true) |
||||||
|
end |
||||||
|
|
||||||
|
local visited_table = {} |
||||||
|
|
||||||
|
libs.for_each_lib_deps(function (libname, deps) |
||||||
|
_recursion_enabled_dep_configs(package, libname, deps, visited_table) |
||||||
|
end) |
||||||
|
end |
||||||
|
|
||||||
|
function _add_iostreams_deps(package) |
||||||
|
if not package:config("iostreams") then |
||||||
|
return |
||||||
|
end |
||||||
|
|
||||||
|
if package:config("zlib") then |
||||||
|
package:add("deps", "zlib") |
||||||
|
end |
||||||
|
if package:config("bzip2") then |
||||||
|
package:add("deps", "bzip2") |
||||||
|
end |
||||||
|
if package:config("lzma") then |
||||||
|
package:add("deps", "xz") |
||||||
|
end |
||||||
|
|
||||||
|
if package:config("zstd") then |
||||||
|
package:add("deps", "zstd") |
||||||
|
|
||||||
|
package:add("deps", (is_subhost("windows") and "pkgconf") or "pkg-config") |
||||||
|
package:add("patches", "1.86.0", "patches/1.86.0/find-zstd.patch", "7a90f2cbf01fc26bc8a98d58468c20627974f30e45bdd4a00c52644b60af1ef6") |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
function _add_deps(package) |
||||||
|
if package:config("regex") then |
||||||
|
package:add("deps", "icu4c") |
||||||
|
end |
||||||
|
if package:config("locale") then |
||||||
|
package:add("deps", "libiconv", "icu4c") |
||||||
|
end |
||||||
|
if package:config("python") then |
||||||
|
package:add("deps", "python", {configs = {headeronly = true}}) |
||||||
|
end |
||||||
|
if package:config("openssl") then |
||||||
|
package:add("deps", "openssl >=1.1.1-a") -- same as python on_load |
||||||
|
end |
||||||
|
|
||||||
|
_add_iostreams_deps(package) |
||||||
|
end |
||||||
|
|
||||||
|
function _add_header_only_configs(package) |
||||||
|
libs.for_each(function (libname) |
||||||
|
package:config_set(libname, false) |
||||||
|
end) |
||||||
|
-- TODO: find cmake option to install header only library |
||||||
|
-- libs.for_each_header_only_buildable_lib(function (libname) |
||||||
|
-- package:config_set(libname, true) |
||||||
|
-- end) |
||||||
|
end |
||||||
|
|
||||||
|
function main(package) |
||||||
|
import("libs", {rootdir = package:scriptdir()}) |
||||||
|
|
||||||
|
if package:config("header_only") then |
||||||
|
package:set("kind", "library", {headeronly = true}) |
||||||
|
_add_header_only_configs(package) |
||||||
|
else |
||||||
|
if package:config("all") then |
||||||
|
package:config_set("openssl", true) -- mysql/redis require |
||||||
|
libs.for_each(function (libname) |
||||||
|
package:config_set(libname, true) |
||||||
|
end) |
||||||
|
else |
||||||
|
_auto_enabled_dep_configs(package) |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
if package:config("mpi") then |
||||||
|
-- TODO: add mpi to xrepo |
||||||
|
package:config_set("mpi", false) |
||||||
|
wprint("package(boost) Unsupported mpi config") |
||||||
|
end |
||||||
|
|
||||||
|
_add_deps(package) |
||||||
|
|
||||||
|
_add_defines(package) |
||||||
|
end |
@ -0,0 +1,191 @@ |
|||||||
|
local sorted_libs = { |
||||||
|
"wave", |
||||||
|
"url", |
||||||
|
"type_erasure", |
||||||
|
"timer", |
||||||
|
"test", |
||||||
|
"stacktrace", |
||||||
|
"program_options", |
||||||
|
"process", |
||||||
|
"nowide", |
||||||
|
"log", |
||||||
|
"locale", |
||||||
|
"json", |
||||||
|
"iostreams", |
||||||
|
"graph_parallel", |
||||||
|
"mpi", |
||||||
|
"python", |
||||||
|
"graph", |
||||||
|
"serialization", |
||||||
|
"regex", |
||||||
|
"math", |
||||||
|
"random", |
||||||
|
"fiber", |
||||||
|
"filesystem", |
||||||
|
"coroutine", |
||||||
|
"contract", |
||||||
|
"thread", |
||||||
|
"date_time", |
||||||
|
"exception", |
||||||
|
"cobalt", |
||||||
|
"context", |
||||||
|
"container", |
||||||
|
"chrono", |
||||||
|
"system", |
||||||
|
"charconv", |
||||||
|
"atomic" |
||||||
|
} |
||||||
|
|
||||||
|
local libs_dep = { |
||||||
|
json = { |
||||||
|
"container", |
||||||
|
"system" |
||||||
|
}, |
||||||
|
python = { |
||||||
|
"graph" |
||||||
|
}, |
||||||
|
test = { |
||||||
|
"exception" |
||||||
|
}, |
||||||
|
type_erasure = { |
||||||
|
"thread" |
||||||
|
}, |
||||||
|
thread = { |
||||||
|
"atomic", |
||||||
|
"chrono", |
||||||
|
"container", |
||||||
|
"date_time", |
||||||
|
"exception", |
||||||
|
"system" |
||||||
|
}, |
||||||
|
fiber = { |
||||||
|
"context", |
||||||
|
"filesystem" |
||||||
|
}, |
||||||
|
chrono = { |
||||||
|
"system" |
||||||
|
}, |
||||||
|
charconv = { }, |
||||||
|
contract = { |
||||||
|
"exception", |
||||||
|
"thread" |
||||||
|
}, |
||||||
|
timer = { }, |
||||||
|
wave = { |
||||||
|
"filesystem", |
||||||
|
"serialization" |
||||||
|
}, |
||||||
|
stacktrace = { }, |
||||||
|
coroutine = { |
||||||
|
"context", |
||||||
|
"exception", |
||||||
|
"system" |
||||||
|
}, |
||||||
|
math = { |
||||||
|
"random" |
||||||
|
}, |
||||||
|
exception = { }, |
||||||
|
filesystem = { |
||||||
|
"atomic", |
||||||
|
"system" |
||||||
|
}, |
||||||
|
date_time = { }, |
||||||
|
atomic = { }, |
||||||
|
url = { |
||||||
|
"system" |
||||||
|
}, |
||||||
|
serialization = { }, |
||||||
|
process = { |
||||||
|
"filesystem", |
||||||
|
"system" |
||||||
|
}, |
||||||
|
regex = { }, |
||||||
|
container = { }, |
||||||
|
random = { |
||||||
|
"system" |
||||||
|
}, |
||||||
|
nowide = { |
||||||
|
"filesystem" |
||||||
|
}, |
||||||
|
program_options = { }, |
||||||
|
system = { }, |
||||||
|
cobalt = { |
||||||
|
"container", |
||||||
|
"context", |
||||||
|
"system" |
||||||
|
}, |
||||||
|
graph = { |
||||||
|
"math", |
||||||
|
"random", |
||||||
|
"regex", |
||||||
|
"serialization" |
||||||
|
}, |
||||||
|
context = { }, |
||||||
|
mpi = { |
||||||
|
"graph", |
||||||
|
"python", |
||||||
|
"serialization" |
||||||
|
}, |
||||||
|
log = { |
||||||
|
"atomic", |
||||||
|
"date_time", |
||||||
|
"exception", |
||||||
|
"filesystem", |
||||||
|
"random", |
||||||
|
"regex", |
||||||
|
"system", |
||||||
|
"thread" |
||||||
|
}, |
||||||
|
iostreams = { |
||||||
|
"random", |
||||||
|
"regex" |
||||||
|
}, |
||||||
|
locale = { |
||||||
|
"thread" |
||||||
|
}, |
||||||
|
graph_parallel = { |
||||||
|
"filesystem", |
||||||
|
"graph", |
||||||
|
"mpi", |
||||||
|
"random", |
||||||
|
"serialization" |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
local header_only_buildable = { |
||||||
|
"graph_parallel", |
||||||
|
"system", |
||||||
|
"exception", |
||||||
|
"regex", |
||||||
|
"math", |
||||||
|
} |
||||||
|
|
||||||
|
function get_libs() |
||||||
|
return sorted_libs |
||||||
|
end |
||||||
|
|
||||||
|
function get_lib_deps() |
||||||
|
return libs_dep |
||||||
|
end |
||||||
|
|
||||||
|
function get_header_only_buildable() |
||||||
|
return header_only_buildable |
||||||
|
end |
||||||
|
|
||||||
|
function for_each(lambda) |
||||||
|
for _, libname in ipairs(get_libs()) do |
||||||
|
lambda(libname) |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
function for_each_header_only_buildable_lib(lambda) |
||||||
|
for _, libname in ipairs(get_header_only_buildable()) do |
||||||
|
lambda(libname) |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
function for_each_lib_deps(lambda) |
||||||
|
for libname, deps in pairs(get_lib_deps()) do |
||||||
|
lambda(libname, deps) |
||||||
|
end |
||||||
|
end |
@ -0,0 +1,19 @@ |
|||||||
|
diff --git a/libs/iostreams/CMakeLists.txt b/libs/iostreams/CMakeLists.txt
|
||||||
|
index 1d8352f..01b612c 100644
|
||||||
|
--- a/libs/iostreams/CMakeLists.txt
|
||||||
|
+++ b/libs/iostreams/CMakeLists.txt
|
||||||
|
@@ -27,7 +27,13 @@ function(boost_iostreams_option name description package version found target) #
|
||||||
|
|
||||||
|
if(${name})
|
||||||
|
|
||||||
|
- find_package(${package} ${version} REQUIRED)
|
||||||
|
+ if("${package}" STREQUAL "zstd")
|
||||||
|
+ include(FindPkgConfig)
|
||||||
|
+ pkg_search_module("libzstd" REQUIRED IMPORTED_TARGET "libzstd")
|
||||||
|
+ set(target "PkgConfig::libzstd")
|
||||||
|
+ else()
|
||||||
|
+ find_package(${package} ${version} REQUIRED)
|
||||||
|
+ endif()
|
||||||
|
target_sources(boost_iostreams PRIVATE ${ARGN})
|
||||||
|
target_link_libraries(boost_iostreams PRIVATE ${target})
|
||||||
|
|
@ -0,0 +1,107 @@ |
|||||||
|
function _iostreams(package, snippets) |
||||||
|
if not package:config("iostreams") then |
||||||
|
return |
||||||
|
end |
||||||
|
|
||||||
|
if package:config("zstd") then |
||||||
|
table.insert(snippets, |
||||||
|
[[ |
||||||
|
#include <boost/iostreams/filter/zstd.hpp> |
||||||
|
#include <boost/iostreams/filtering_stream.hpp> |
||||||
|
void test() { |
||||||
|
boost::iostreams::filtering_ostream out; |
||||||
|
out.push(boost::iostreams::zstd_compressor()); |
||||||
|
} |
||||||
|
]] |
||||||
|
) |
||||||
|
end |
||||||
|
|
||||||
|
if package:config("lzma") then |
||||||
|
table.insert(snippets, |
||||||
|
[[ |
||||||
|
#include <boost/iostreams/filter/lzma.hpp> |
||||||
|
#include <boost/iostreams/filtering_stream.hpp> |
||||||
|
void test() { |
||||||
|
boost::iostreams::filtering_ostream out; |
||||||
|
out.push(boost::iostreams::lzma_compressor()); |
||||||
|
} |
||||||
|
]] |
||||||
|
) |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
function _filesystem(package, snippets) |
||||||
|
if package:config("filesystem") then |
||||||
|
table.insert(snippets, |
||||||
|
[[ |
||||||
|
#include <boost/filesystem.hpp> |
||||||
|
#include <iostream> |
||||||
|
void test() { |
||||||
|
boost::filesystem::path path("/path/to/directory"); |
||||||
|
if (boost::filesystem::exists(path)) { |
||||||
|
std::cout << "Directory exists" << std::endl; |
||||||
|
} else { |
||||||
|
std::cout << "Directory does not exist" << std::endl; |
||||||
|
} |
||||||
|
} |
||||||
|
]] |
||||||
|
) |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
function _date_time(package, snippets) |
||||||
|
if package:config("date_time") then |
||||||
|
table.insert(snippets, |
||||||
|
[[ |
||||||
|
#include <boost/date_time/gregorian/gregorian.hpp> |
||||||
|
void test() { |
||||||
|
boost::gregorian::date d(2010, 1, 30); |
||||||
|
} |
||||||
|
]] |
||||||
|
) |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
function _header_only(package, snippets) |
||||||
|
table.insert(snippets, |
||||||
|
[[ |
||||||
|
#include <boost/algorithm/string.hpp> |
||||||
|
#include <string> |
||||||
|
#include <vector> |
||||||
|
void test() { |
||||||
|
std::string str("a,b"); |
||||||
|
std::vector<std::string> vec; |
||||||
|
boost::algorithm::split(vec, str, boost::algorithm::is_any_of(",")); |
||||||
|
} |
||||||
|
]] |
||||||
|
) |
||||||
|
table.insert(snippets, |
||||||
|
[[ |
||||||
|
#include <boost/unordered_map.hpp> |
||||||
|
void test() { |
||||||
|
boost::unordered_map<std::string, int> map; |
||||||
|
map["2"] = 2; |
||||||
|
} |
||||||
|
]] |
||||||
|
) |
||||||
|
end |
||||||
|
|
||||||
|
function main(package) |
||||||
|
local snippets = {} |
||||||
|
|
||||||
|
if package:config("header_only") then |
||||||
|
_header_only(package, snippets) |
||||||
|
else |
||||||
|
if not package:config("cmake") then |
||||||
|
_header_only(package, snippets) |
||||||
|
end |
||||||
|
_iostreams(package, snippets) |
||||||
|
_filesystem(package, snippets) |
||||||
|
_date_time(package, snippets) |
||||||
|
end |
||||||
|
|
||||||
|
local opt = {configs = {languages = "c++14"}} |
||||||
|
for _, snippet in ipairs(snippets) do |
||||||
|
assert(package:check_cxxsnippets({test = snippet}, opt)) |
||||||
|
end |
||||||
|
end |
@ -0,0 +1,30 @@ |
|||||||
|
-- Boost Root build |
||||||
|
|
||||||
|
add_rules("mode.debug", "mode.release") |
||||||
|
|
||||||
|
set_languages("c++17") |
||||||
|
|
||||||
|
target("filesystem") |
||||||
|
set_kind("static") |
||||||
|
add_files("libs/filesystem/src/*.cpp|windows_file_codecvt.cpp") |
||||||
|
|
||||||
|
add_defines("BOOST_FILESYSTEM_NO_CXX20_ATOMIC_REF") |
||||||
|
add_defines("BOOST_FILESYSTEM_STATIC_LINK=1", {public = true}) |
||||||
|
|
||||||
|
for _, dir in ipairs(os.dirs("libs/*")) do |
||||||
|
add_includedirs(path.join(dir, "include"), {public = true}) |
||||||
|
end |
||||||
|
|
||||||
|
if is_plat("windows", "mingw", "msys2") then |
||||||
|
add_files("libs/filesystem/src/*.cpp") |
||||||
|
add_defines("BOOST_USE_WINDOWS_H", "WIN32_LEAN_AND_MEAN", "NOMINMAX") |
||||||
|
add_syslinks("bcrypt") |
||||||
|
if is_plat("windows") then |
||||||
|
add_defines("BOOST_ALL_NO_LIB", {public = true}) |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
target("boostdep") |
||||||
|
set_kind("binary") |
||||||
|
add_files("tools/boostdep/src/*.cpp") |
||||||
|
add_deps("filesystem") |
@ -0,0 +1,31 @@ |
|||||||
|
package("boostdep") |
||||||
|
set_kind("binary") |
||||||
|
set_homepage("https://boost.org/tools/boostdep") |
||||||
|
set_description("A tool to create Boost module dependency reports") |
||||||
|
set_license("BSL-1.0") |
||||||
|
|
||||||
|
add_urls("https://github.com/boostorg/boostdep.git") |
||||||
|
add_versions("2024.10.07", "289f2a16286e62348676f2abb75c0bd9968f156b") |
||||||
|
|
||||||
|
add_deps("boost", {configs = {filesystem = true}}) |
||||||
|
|
||||||
|
on_install(function (package) |
||||||
|
io.writefile("xmake.lua", [[ |
||||||
|
add_rules("mode.debug", "mode.release") |
||||||
|
add_requires("boost", {configs = {filesystem = true}}) |
||||||
|
add_packages("boost") |
||||||
|
set_languages("c++17") |
||||||
|
target("boostdep") |
||||||
|
set_kind("binary") |
||||||
|
add_files("src/*.cpp") |
||||||
|
]]) |
||||||
|
import("package.tools.xmake").install(package) |
||||||
|
end) |
||||||
|
|
||||||
|
on_test(function (package) |
||||||
|
local boostdep = package:installdir("bin/boostdep") |
||||||
|
if is_host("windows") then |
||||||
|
boostdep = boostdep .. ".exe" |
||||||
|
end |
||||||
|
assert(os.isexec(boostdep), "boostdep not found!") |
||||||
|
end) |
Loading…
Reference in new issue