Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

verilator: switch to cmake #5680

Open
wants to merge 16 commits into
base: dev
Choose a base branch
from
7 changes: 2 additions & 5 deletions packages/b/bison/xmake.lua
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,7 @@ package("bison")
add_versions("3.7.6", "69dc0bb46ea8fc307d4ca1e0b61c8c355eb207d0b0c69f4f8462328e74d7b9ea")
add_versions("3.8.2", "06c9e13bdf7eb24d4ceb6b59205a4f67c2c7e7213119644430fe82fbd14a0abb")

if is_subhost("msys") then
add_deps("pacman::bison")
end

on_load("macosx", "linux", "bsd", "windows", function (package)
on_load("macosx", "linux", "bsd", "windows", "@msys", function (package)
if package:is_plat("windows") then
package:add("deps", "winflexbison", {private = true})
elseif package:is_plat("linux", "bsd") then
Expand All @@ -40,6 +36,7 @@ package("bison")
end)

on_install("@msys", function (package)
os.vrun("pacman -Sy --noconfirm --needed --disable-download-timeout bison")
Copy link
Member

Choose a reason for hiding this comment

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

包配置里,不要直接调用 pacman/apt 等系统安装,会有权限问题,走 xmake 内置安装,而且你这么装,会装到系统路径,不是 包安装目录,会 break 掉 xrepo env

Copy link
Member

@waruqi waruqi Nov 12, 2024

Choose a reason for hiding this comment

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

而 xmake 内部调用 pacman 会有对权限的很多处理,这里不能这么搞,如果源码安装不行,宁愿禁用这个平台

Copy link
Contributor Author

Choose a reason for hiding this comment

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

这个是 msys2 包,用 add_deps 会加上 mingw 前缀导致安装失败

end)

on_install("windows", function (package)
Expand Down
28 changes: 23 additions & 5 deletions packages/f/flex/xmake.lua
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,16 @@ package("flex")
add_urls("https://github.com/westes/flex/releases/download/v$(version)/flex-$(version).tar.gz")
end

if is_subhost("msys") then
add_deps("pacman::flex")
end
on_fetch(function (package)
-- If pacman::flex already installed
if is_subhost("msys") and package:is_library() then
local msys_dir = os.getenv("MINGW_PREFIX")
local header = path.join(path.directory(msys_dir), "usr/include/FlexLexer.h")
os.trycp(header, package:installdir("include"))
end
end)

on_load("macosx", "linux", "bsd", "windows", function (package)
on_load("macosx", "linux", "bsd", "windows", "@msys", function (package)
if package:is_plat("windows") then
package:add("deps", "winflexbison", {private = true})
elseif package:is_plat("linux") then
Expand All @@ -35,6 +40,13 @@ package("flex")
end)

on_install("@msys", function (package)
os.vrun("pacman -Sy --noconfirm --needed --disable-download-timeout flex")
Copy link
Member

Choose a reason for hiding this comment

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

还有这

-- https://github.com/msys2/MSYS2-packages/issues/1911
if package:is_library() then
local msys_dir = os.getenv("MINGW_PREFIX")
local header = path.join(path.directory(msys_dir), "usr/include/FlexLexer.h")
os.vcp(header, package:installdir("include"))
end
end)

on_install("windows", function (package)
Expand All @@ -43,7 +55,13 @@ package("flex")
end)

on_install("macosx", "linux", "bsd", "android", "iphoneos", "cross", function (package)
import("package.tools.autoconf").install(package)
local configs = {}
table.insert(configs, "--enable-shared=" .. (package:config("shared") and "yes" or "no"))
table.insert(configs, "--enable-static=" .. (package:config("shared") and "no" or "yes"))
if package:is_debug() then
table.insert(configs, "--enable-debug")
end
import("package.tools.autoconf").install(package, configs)
end)

on_test(function (package)
Expand Down
122 changes: 84 additions & 38 deletions packages/v/verilator/xmake.lua
Original file line number Diff line number Diff line change
Expand Up @@ -2,63 +2,109 @@ package("verilator")
set_kind("toolchain")
set_homepage("https://verilator.org")
set_description("Verilator open-source SystemVerilog simulator and lint system")
set_license("LGPL-3.0")

add_urls("https://github.com/verilator/verilator/archive/refs/tags/$(version).tar.gz")
add_urls("https://github.com/verilator/verilator.git")
add_urls("https://github.com/verilator/verilator/archive/refs/tags/$(version).tar.gz",
"https://github.com/verilator/verilator.git")

add_versions("v5.016", "66fc36f65033e5ec904481dd3d0df56500e90c0bfca23b2ae21b4a8d39e05ef1")

add_deps("cmake")

on_load(function (package)
if not package:is_precompiled() then
if package:is_plat("windows") then
package:add("deps", "cmake")
package:add("deps", "winflexbison", {kind = "library"})
else
package:add("deps", "flex", {kind = "library"})
package:add("deps", "bison")
package:add("deps", "autoconf", "automake", "libtool")
end
package:add("deps", "flex", {kind = "library"})
package:add("deps", "bison")
package:add("deps", "python 3.x", {kind = "binary"})
end
package:mark_as_pathenv("VERILATOR_ROOT")
package:addenv("VERILATOR_ROOT", ".")
end)

on_install("windows", function (package)
on_install(function (package)
import("package.tools.cmake")
local configs = {}
local cxflags = {}

if is_subhost("msys") then
io.replace("CMakeLists.txt", "if(WIN32)", "if(0)", {plain = true})
end

local version = package:version()
if version then
if version:ge("5.030") then
io.replace("src/CMakeLists.txt", "MSVC_RUNTIME_LIBRARY MultiThreaded$<IF:$<CONFIG:Release>,,DebugDLL>", "", {plain = true})
else
io.replace("src/CMakeLists.txt", "MSVC_RUNTIME_LIBRARY MultiThreaded$<IF:$<CONFIG:Release>,,DebugDLL>", "", {plain = true})
if version:lt("5.028") then
if is_host("linux", "bsd") then
io.replace("src/CMakeLists.txt", "install(TARGETS ${verilator})",
"target_link_libraries(${verilator} PRIVATE pthread)\ninstall(TARGETS ${verilator})", {plain = true})
end

if version:lt("5.020") then
if is_host("windows") and not package:has_tool("cxx", "cl") then
io.replace("src/CMakeLists.txt", "INTERPROCEDURAL_OPTIMIZATION_RELEASE TRUE", "", {plain = true})
io.replace("src/CMakeLists.txt", "/bigobj", "-Wa,-mbig-obj", {plain = true})
io.replace("src/CMakeLists.txt", "YY_NO_UNISTD_H", "", {plain = true})
io.replace("src/CMakeLists.txt", "/STACK:10000000", "-Wl,--stack,10000000 -mconsole -lcomctl32 -DWIN_32_LEAN_AND_MEAN", {plain = true})
end
end
end
end
end

local configs = {
"-DOBJCACHE_ENABLED=OFF",
"-DDEBUG_AND_RELEASE_AND_COVERAGE=OFF",
}
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
if not is_host("linux") then
table.insert(configs, "-DCMAKE_CXX_STANDARD=20")
end

local opt = {}
opt.envs = cmake.buildenvs(package)
local winflexbison = package:dep("winflexbison")
local flex = winflexbison:fetch()
if flex then
local includedirs = flex.sysincludedirs or flex.includedirs
for _, includedir in ipairs(includedirs) do
table.insert(cxflags, "-I" .. includedir)
if winflexbison then
opt.envs.WIN_FLEX_BISON = winflexbison:installdir("include")
else
local flex = package:dep("flex")
-- https://github.com/verilator/verilator/issues/3487
if is_subhost("msys") or not flex:is_system() then
local includedir = flex:installdir("include")
if version and version:lt("5.026") then
opt.cxflags = "-I" .. includedir
else
table.insert(configs, "-DFLEX_INCLUDE_DIR=" .. includedir)
end
end
end
local envs = cmake.buildenvs(package)
envs.VERILATOR_ROOT = nil
envs.WIN_FLEX_BISON = winflexbison:installdir()
io.replace("src/CMakeLists.txt", '${ASTGEN} -I"${srcdir}"', '${ASTGEN} -I "${srcdir}"', {plain = true})
cmake.install(package, configs, {envs = envs, cxflags = cxflags})
os.cp(path.join(package:installdir("bin"), "verilator_bin.exe"), path.join(package:installdir("bin"), "verilator.exe"))
end)
cmake.install(package, configs, opt)

if is_host("linux") then
if package:is_debug() then
local bindir = package:installdir("bin")
os.ln(path.join(bindir, "verilator_bin_dbg"), path.join(bindir, "verilator_bin"))
end
elseif is_host("windows") then
local bindir = package:installdir("bin")
local verilator = path.join(bindir, "verilator.exe")
if not os.isfile(verilator) then
local verilator_bin = "verilator_bin"
if package:is_debug() then
verilator_bin = verilator_bin .. "_dbg"
end
verilator_bin = path.join(bindir, verilator_bin .. ".exe")
os.trycp(verilator_bin, verilator)
end

on_install("linux", "macosx", function (package)
import("package.tools.autoconf")
local configs = {}
local cxflags = {}
local flex = package:dep("flex"):fetch()
if flex then
local includedirs = flex.sysincludedirs or flex.includedirs
for _, includedir in ipairs(includedirs) do
table.insert(cxflags, "-I" .. includedir)
if package:is_plat("windows") and package:is_debug() then
os.vcp(path.join(package:buildir(), "**.pdb"), package:installdir("bin"))
end
end
os.vrun("autoconf")
local envs = autoconf.buildenvs(package, {cxflags = cxflags})
envs.VERILATOR_ROOT = nil
autoconf.install(package, configs, {envs = envs})
end)

on_test(function (package)
Expand Down
Loading