使用sourcetrail 來閱讀meson專案的程式碼

最近在啃 weston 的程式碼,突然想到可以透過 Sourcetrail 來協助閱讀程式碼,因此來試試看。

本文將講述如何透過 Sourcetrail 來協助閱讀以 meson 編譯系統為主的專案。其中 Sourcetrail 的安裝方式請自行查找,不額外贅述。

取得 weston

本文以 weston 為例,因此我們先來下載 weston 的程式碼

git clone https://github.com/wayland-project/weston.git

接下來進入到 weston 資料夾去

coldnew@gentoo ~ $ cd weston

本文撰寫時以 7.0.0 這個 tag 為主,因此請切過去,或使用當前的 branch

coldnew@gentoo ~/weston $ git checkout v7.0.0
Note: switching to '7.0.0'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

  git switch -c <new-branch-name>

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false

HEAD is now at 3180fa8a build: bump to version 7.0.0 for the official release

安裝編譯用的依賴

由於我們要查看 weston 的程式碼,因此最好讓系統滿足編譯 weston 的依賴,這樣在查找的時候才不會有什麼東西找不到對應的標頭檔或是對應的程式碼檔案。

由於筆者是 Gentoo Linux 的使用者,安裝依賴只要用以下命令就可以完成囉~

coldnew@gentoo ~ $ sudo emerge dev-libs/weston

其他 Linux 發行板的使用者則請參照該發行板的作法,或是參考 Building weston 一文來滿足系統依賴。

編譯 weston

安裝好編譯依賴後,由於我們需要透過 Sourcetrail 來查看 weston 的程式碼,因此需要透過以下命令去讓 meson 產生一些編譯前資訊

coldnew@getnoo ~/weston $ meson build -Dsimple-dmabuf-drm=auto
The Meson build system
Version: 0.52.1
Source dir: /home/coldnew/weston
Build dir: /home/coldnew/weston/build
Build type: native build
Project name: weston
Project version: 7.0.0
C compiler for the host machine: cc (gcc 9.2.0 "cc (Gentoo 9.2.0-r3 p4) 9.2.0")
C linker for the host machine: GNU ld.bfd 2.32
Host machine cpu family: x86_64
Host machine cpu: x86_64
Found git repository at /data/Workspace/wayland/weston
Compiler for C supports arguments -Wno-unused-parameter -Wunused-parameter: YES
Compiler for C supports arguments -Wno-shift-negative-value -Wshift-negative-value: YES
Compiler for C supports arguments -Wno-missing-field-initializers -Wmissing-field-initializers: YES
Compiler for C supports arguments -Wno-pedantic -Wpedantic: YES
Compiler for C supports arguments -fvisibility=hidden: YES
.... skip ....
Configuring weston-rdp.7 using configuration
Configuring config.h using configuration
Message: Documentation will not be built. Use -Ddoc to build it.
Build targets in project: 170
Found ninja-1.9.0.git.kitware.dyndep-1.jobserver-1 at /usr/bin/ninja

另外,由於 weston 會在編譯的時候透過 wayland-scanner 來產生一些需要的 header 以及 .c 檔案,因此我們還是透過 ninja 這套編譯系統來將我們的程式碼編譯一下吧~

coldnew@getnoo ~/weston $ ninja -C build
ninja: Entering directory `build/'
[121/433] Compiling C object 'libweston/backend-rdp/13a5658@@rdp-backend@sha/rdp.c.o'.
../libweston/backend-rdp/rdp.c: In function ‘rdp_peer_context_new’:
../libweston/backend-rdp/rdp.c:748:2: warning: nsc_context_set_pixel_format’ is deprecated [-Wdeprecated-declarations]
  748 |  nsc_context_set_pixel_format(context->nsc_context, DEFAULT_PIXEL_FORMAT);
      |  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/winpr2/winpr/wtsapi.h:25,
                 from /usr/include/freerdp2/freerdp/types.h:25,
                 from /usr/include/freerdp2/freerdp/freerdp.h:43,
                 from ../libweston/backend-rdp/rdp.c:85:
/usr/include/freerdp2/freerdp/codec/nsc.h:47:36: note: declared here
   47 |  FREERDP_API WINPR_DEPRECATED(BOOL nsc_context_set_pixel_format(NSC_CONTEXT* context,
      |                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/winpr2/winpr/winpr.h:53:31: note: in definition of macro ‘WINPR_DEPRECATED’
   53 | #define WINPR_DEPRECATED(obj) obj __attribute__((deprecated))
      |                               ^~~
[433/433] Linking target desktop-shell/desktop-shell.so.

完成後,你應該會看到 build/compile_commands.json 這個檔案,這就是我們要讓 Sourcetrail 載入的 JSON Compilation Database

Sourcetrail 建立專案

啟動 Sourcetrail 後,我們來建立新的專案

好了後,填一下專案名稱與路徑,然後進行下一步

由於我們要載入的是 compile_commands.json 這個檔案,因此選擇 C/C++ from Compilation Database

選擇我們要載入的 build/compile_commands.json 檔案,由於 config.h 以及 protocols資料夾 是編譯時期產生的檔案,因此要告知 Sourcetrail 載入這些傢伙。

都好了後,建立我們的專案

並讓 Sourcetrail 進行索引

Sourcetrail 查看程式碼

索引完成後,就可以透過 Sourcetrail 來查找我們的程式碼囉~