xmake v2 6 4 發布,大量包管理特性改進

2022-10-08 16:15:18 字數 4734 閱讀 1259

xmake 是乙個基於 lua 的輕量級跨平台構建工具。

它非常的輕量,沒有任何依賴,因為它內建了 lua 執行時。

它使用 xmake.lua 維護專案構建,相比 makefile/cmakelists.txt,配置語法更加簡潔直觀,對新手非常友好,短時間內就能快速入門,能夠讓使用者把更多的精力集中在實際的專案開發上。

我們能夠使用它像 make/ninja 那樣可以直接編譯專案,也可以像 cmake/meson 那樣生成工程檔案,另外它還有內建的包管理系統來幫助使用者解決 c/c++ 依賴庫的整合使用問題。

目前,xmake 主要用於 c/c++ 專案的構建,但是同時也支援其他 native 語言的構建,可以實現跟 c/c++ 進行混合編譯,同時編譯速度也是非常的快,可以跟 ninja 持平。

xmake = build backend + project generator + package manager
現在,我們可以通過set_base介面去繼承乙個已有的包的全部配置,然後在此基礎上重寫部分配置。

這通常在使用者自己的專案中,修改 xmake-repo 官方倉庫的內建包比較有用,比如:修復改 urls,修改版本列表,安裝邏輯等等。

例如,修改內建 zlib 包的 url,切到自己的 zlib 原始碼位址。

package("myzlib")

set_base("zlib")

set_urls("")

package_end()

add_requires("myzlib", )

target("test")

set_kind("binary")

add_files("src/*.c")

add_packages("zlib")

我們也可以用來單純新增乙個別名包。

package("onetbb")

set_base("tbb")

我們可以通過add_requires("onetbb")整合安裝 tbb 包,只是包名不同而已。

之前,我們限制了只能在 cross 平台下切換包安裝的工具鏈,新版本中,我們可以支援更多平台下,對工具鏈的切換。

例如:

$ xrepo install --toolchains=clang zlib
我們可以在 linux 等平台上,快速切換到 clang 工具鏈編譯安裝 zlib 庫。

我們也可以在 xmake.lua 的配置檔案中去切換他們。

add_requires("zlib", })
不同的工具鏈安裝的 zlib 包,會被分別儲存在不同目錄,互不干擾,不會存在編譯器差異導致的鏈結相容問題。

xrepo 命令之前已經很好的支援了包虛擬環境管理,xrepo env shell,但是對於複雜的包環境,還是需要使用者自己配置乙個 xmake.lua 檔案,用於管理自己的包環境。

例如,我們需要乙個常用的開發環境 shell,預設帶有 cmake, python 和 vs/autoconf 等常用的開發工具鏈,我們需要自己起乙個配置檔案 devel.lua。

add_requires("cmake")

add_requires("python")

if is_host("linux", "bsd", "macosx") then

add_requires("pkg-config", "autoconf", "automake", "libtool")

elseif is_host("windows") then

set_toolchains("msvc")

end

然後,執行下面的命令去匯入到全域性配置。

$ xrepo env --add devel.lua
這樣,我們可以通過下面的命令,去載入 shell 繫結這個環境:

$ xrepo env -b devel shell

> cmake --version

cmake version 3.19.3

而在新版本中,我們內建了一些常用的環境,可以通過xrepo env -l檢視:

$ xrepo env -l

- msvc

- llvm-mingw

- llvm

- mingw-w64

- devel

- python3

- depot_tools

- python2

其中 devel 也在裡面,所以,我們只需要執行xrepo env -b devel shell就可以帶起乙個 devel 開發環境,而不需要自己配置它們。

像 python, msvc 等也都是一些比較常用的環境,都可以直接使用。

當然,我們也支援臨時在本地建立乙個 xmake.lua 來配置載入包環境,而不放置到全域性配置中去。

on_download(function (package, opt)

-- download packages:urls() to opt.sourcedir

end)

asn.1 程式,需要借助 asn.1 compiler 去生成相關的 .c 檔案參與專案編譯。

而 xmake 內建提供了add_rules("asn1c")規則去處理.c檔案生成,add_requires("asn1c")自動拉取整合 asn.1 編譯器工具。

下面是乙個基礎的配置例子:

add_rules("mode.debug", "mode.release")

add_requires("asn1c")

target("test")

set_kind("binary")

add_files("src/*.c")

add_files("src/*.asn1")

add_rules("asn1c")

add_packages("asn1c")

具體見 完整例子工程。

之前,xmake 僅支援 macos 下借助 xcode 工具鏈實現對 swift 程式的構建,新版本中,我們也進行了改進,可以獨立使用 swift 工具鏈,支援在 linux/windows 上構架 swift 程式,用法跟之前相同。

在之前的版本中,我們提供了utils.symbols.export_all對 windows 的 dll 庫實現自動的完整符號匯出。

這儘管很方便,但只能支援 windows 程式,並且全量匯出對生成的 dll 大小不好控制,有可能會存在不少根本不需要的內部符號被匯出。

而,我們新版本提供的utils.symbols.export_list規則,可以在 xmake.lua 裡面直接定義匯出的符號列表,例如:

target("foo")

set_kind("shared")

add_files("src/foo.c")

add_rules("utils.symbols.export_list", })

或者,在*.export.txt檔案中新增匯出的符號列表。

target("foo2")

set_kind("shared")

add_files("src/foo.c")

add_files("src/foo.export.txt")

add_rules("utils.symbols.export_list")

完整的工程例子見:匯出符號例子

通過指定符號匯出,我們可以使得生成的動態庫盡可能的小,無關的內部符號完全不去匯出它們,另外這個規則支援 linux, macos 和 windows,更加的通用。

它內部會自動使用 .def, version scripts 和--exported_symbols_list去處理符號匯出。

新版中,我們也內建了 對 linker scripts 和 version scripts 檔案的支援,我們可以使用add_files直接新增它們,而不需要配置add_ldflags("-t***.lds")

當前支援.ld.lds作為 linker scripts 配置檔案來新增:

add_rules("mode.debug", "mode.release")

target("test")

add_deps("foo")

set_kind("binary")

add_files("src/main.c")

add_files("src/main.lds")

我們也支援.ver,.map字尾檔案作為 version script 來新增。

target("foo")

set_kind("shared")

add_files("src/foo.c")

add_files("src/foo.map")

foo.map 檔案內容如下:

;

mysql8發布日期 MySQL 8 0 0 發布

mysql 開發團隊於 12 日宣布 mysql 8.0.0 開發里程碑版本 dmr 發布!可能有人會驚奇 mysql 為何從 5.x 一下跳躍到了 8.0。事實上,mysql 5.x 系列已經延續了很多年,從被 oracle 收購之前就是 5.1,而收購之後一直維持在 5.x,比如 5.5,5.6...

10 發布訂閱模型

icestorm 是乙個高效的用於ice應用的發布 訂閱服務,icestorm有幾個比較重要的概念 訊息 icestorm的訊息和普通的訊息佇列中介軟體中描述的訊息有點區別,icestorm 的訊息是強型別的,由對某個slice 操作的呼叫 代表 操作名 標識 訊息的型別,操作引數 定義 訊息內容。...

17 發布與訂閱

redis的發布與訂閱功能由publish subscribe psubscribe等命令組成。通過執行subscribe命令,客戶端可以訂閱乙個或多個頻道,從而成為這些頻道的訂閱者 subscriber 每當有其他客戶端向被訂閱的頻道傳送訊息 message 時,頻道的所有訂閱者都會收到這個訊息。...