前回は、バイナリファイル(デバッグ情報、シンボル情報が削除される)から再構築した ELFファイルを QEMU (ターゲットは STM32F4-Discovery)で動かしました。
今回は、QEMU をビルドして動かす予定でしたが、やってみるとビルドエラーになりました。簡単にはエラーを解決できなかったので、QEMU のビルドの仕組みの xpm を理解していきます。
それでは、やっていきます。
参考文献
はじめに
「QEMUを動かす」の記事一覧です。良かったら参考にしてください。
・第2回:STM32(ARM Cortex-M)をQEMUで動かす(ソースコード確認編)
・第3回:STM32(ARM Cortex-M)をQEMUで動かす(スタートアップルーチン編)
・第4回:STM32(ARM Cortex-M)をQEMUで動かす(リンカスクリプト編)
・第5回:STM32(ARM Cortex-M)のELFファイルの内容を確認する
・第6回:STM32(ARM Cortex-M)のELFファイル→バイナリ、バイナリ→ELFファイルに変換する
・第7回:STM32(ARM Cortex-M)のバイナリから構築したELFファイルをQEMUで動かす
・第8回:QEMUのビルドに必要なxpm(xPack Project Manager)について学ぶ ← 今回 ・第9回:QEMUをソースからビルドして動かす
・第10回:QEMUのソースコードを変更してSTM32の動作を変える
xpm について学ぶことが必要になりました。
xpm とは、xPack Project Manager の略で、ビルドツールのようです。
今回は、xpm のサンプルプロジェクトを動かして、xpm を理解していきます。
xpm を動かすには環境構築が必要なので、そこからやっていきます。
xpmの環境構築
参考文献の に、QEMU をソースコードからビルドする方法が書かれています。
ソースコードは以下と書かれています。
ビルド手順は以下と書かれています。
こう書かれていますが、現在は、変更されたのか、ここにはインストールする手順が書かれているだけで、ビルドする手順は書かれていませんでした。
同じフォルダにある以下の README-MAINTAINER.md にビルド手順が書かれていました。
README-MAINTAINER.md の先頭に、事前にインストールが必要な手順が書かれたリンクがあります。
これに従って、環境構築をやっていきます。
Gitとcurlのインストール
まず、git と curl をインストールします。
$ sudo apt-get install --yes curl git
Dockerのインストール
続いて、Docker をインストールします。以下の $ を除いて、全部コピペしてください。
$ sudo apt-get update && \ \ sudo apt-get install ca-certificates curl gnupg && \ \ sudo mkdir -m 0755 -p /etc/apt/keyrings && \ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg && \ \ echo \ "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null && \ \ sudo apt-get update && \ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
これで Docker をインストールできました。
Docker のインストールを確認します。
$ sudo docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world c1ec31eb5944: Pull complete Digest: sha256:266b191e926f65542fa8daaec01a192c4d292bff79426f47300a046e1bc576fd Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/
問題ないようです。
現在のユーザを docker グループに所属させます。
$ sudo groupadd docker groupadd: グループ 'docker' は既に存在します $ sudo gpasswd -a ${USER} docker ユーザ daisuke をグループ docker に追加 $ sudo service docker restart
VirtualBox の Ubuntu 22.04 を再起動します。
sudo を使わなくても、docker が使えることを確認します。
$ docker run hello-world Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/
実行できました。これで Docker のインストールは完了です。
Node.jsとnpmとxpmのインストール
あまり分かっていませんが、Node.js、npm、xpm というソフトが必要らしいので、インストールします。
$ cd ~/Downloads/ $ curl --output "${HOME}/Downloads/install-nvm-node-npm-xpm.sh" https://raw.githubusercontent.com/xpack/assets/master/scripts/install-nvm-node-npm-xpm.sh $ bash "${HOME}/Downloads/install-nvm-node-npm-xpm.sh" node: v20.13.1 npm: 10.8.0 xpm: 0.19.1 Done. Be sure to exit the current terminal and enter a new one. $ exit
無事、完了したようです。
一度、シェルを終了して、もう一度シェルを起動すると、3つのコマンドが実行できるようになっていました。
$ node -v v20.13.1 $ npm -v 10.8.0 $ xpm --version 0.19.1
これで環境構築は完了です。
xpmを理解する
xpm について理解していきます。
まず、公式サイトは以下です。
xpm とは、xPack Project Manager の略で、 xPack プロジェクトを管理するための Node.js の CLI アプリケーションです。
Node.js とは、JavaScript の実行環境で、Node.js をインストールすると、node というコマンドが実行できるようになります。
もともと、JavaScript は、ブラウザ上で動作するプログラムで、セキュリティの都合上、ファイルや、ネットワークなどのローカルリソースにはアクセスできないようになっていました。Node.js は、JavaScript を、前述の制約なく、ローカルで実行できる環境です。
xpm は、JavaScript で書かれたプロジェクト管理ツールということですね。
また、xpm は、npm を補うと書かれています。npm とは、xpm と同様に、開発するプロジェクト内で使用するパッケージを管理する Node.js のアプリケーション(ツールという意味が近いかも)です。Web上にパッケージのリポジトリがあり、npm が使用するパッケージの依存関係や、競合を回避して、ダウンロードして、管理してくれる便利なツールです。
もともと、npm があり、xpm は、xPack 用に、npm を拡張したもの、npm に機能を追加したもの、という位置付けのようです。
上では、npm と xpm は一気にインストールしましたが、通常は、npm を使って、xpm をインストールするようです。
xpm や、npm で管理されるプロジェクトには、package.json というファイルが存在して、このファイルに、パッケージが依存するパッケージの情報などが書かれます(xpm、npm でインストールしたときに追記される場合もあれば、自分で編集する場合もあるようです)。
xpmのサンプルプロジェクトを動かしてみる
xpm のサンプルプロジェクトは以下です。
単純な Hello World プロジェクトのようです。
README.md に従って進めていきます。
プロジェクトの初期化(xpm init)
最初に、プロジェクトの初期化を行います。
空のディレクトリを作り、その中に移動してから、xpm init --template で初期化を行うことが出来ます。
対話形式で、選択します。
今回は、全てデフォルト(全てリターンを押すだけ)としました。
- c と cpp は、cpp がデフォルトで選択されました
- cmake と meson と autotools は、cmake がデフォルトで選択されました
- gcc と clang とs ystem(?)は、gcc がデフォルトで選択されました
$ mkdir -p my-project && cd my-project $ xpm init --template @xpack/hello-world-template@latest Checking package @xpack/hello-world-template@latest metadata... Installing @xpack/hello-world-template@0.6.0... Processing @xpack/hello-world-template@0.6.0... Programming language? (c, cpp, ?) [cpp]: Build System? (cmake, meson, autotools, ?) [cmake]: Toolchain? (gcc, clang, system, ?) [gcc]: Creating the C++ project 'my-project'... File 'include/hello-world.h' copied. File 'src/hello-world.cpp' copied. File 'libs/adder/include/add/add.h' copied. File 'libs/adder/src/add.c' copied. Folder 'cmake' copied. File 'CMakeLists.txt' generated. File '.vscode/tasks.json' copied. File '.vscode/settings.json' copied. File '.gitignore' copied. File '.npmignore' copied. File 'README.md' generated. File 'LICENSE' generated. File 'package.json' generated.
プロジェクトの初期化が完了した状態の構成は以下の通りです。
$ tree . |-- CMakeLists.txt |-- LICENSE |-- README.md |-- cmake | `-- toolchains | |-- clang.cmake | `-- gcc.cmake |-- include | `-- hello-world.h |-- libs | `-- adder | |-- include | | `-- add | | `-- add.h | `-- src | `-- add.c |-- package.json `-- src `-- hello-world.cpp 9 directories, 10 files
自動生成されたコードを確認する
順番にファイルの内容を確認します。
ヘッダファイルです。
hello-world.h では、"Hello World!" という文字列が定義されているだけです。
#ifndef HELLO_WORLD_H_ #define HELLO_WORLD_H_ #define HELLO_WORLD_MESSAGE "Hello World!" #endif // HELLO_WORLD_H_
add.h では、add関数が宣言されているだけです。
#ifndef ADD_H_ #define ADD_H_ #if defined(__cplusplus) extern "C" { #endif // defined(__cplusplus) // ---------------------------------------------------------------------------- int add (int a, int b); // ---------------------------------------------------------------------------- #if defined(__cplusplus) } #endif // defined(__cplusplus) #endif // ADD_H_
ソースファイルです。
hello-world.cpp では、先ほどの "Hello World!" などを出力して、add関数の結果も出力しています。
#include "hello-world.h" #include "add/add.h" #include <iostream> int main (int argc, char* argv[]) { std::cout << HELLO_WORLD_MESSAGE << std::endl; #if defined(DEBUG) std::cout << "(in debug mode)" << std::endl; #else std::cout << "(in release mode)" << std::endl; #endif #if defined(NDEBUG) std::cout << "(no asserts)" << std::endl; #endif std::cout << "Check adder lib: 41 + 1 = " << add (41, 1) << std::endl; return 0; }
add.cpp では、add関数が定義されていて、内容は2つ引数を足したものを返すというものです。
#include "add/add.h" int add (int a, int b) { return a + b; }
package.json です。
前半は、プロジェクトの内容のテンプレートが書かれています。
"properties" が重要そうです。CMake で使われる build ディレクトリの定義や、CMake のビルドツールとして Ninja が選択されていること、gcc が使われるようになっていること、ビルド、クリーン、実行も定義されています。
"actions" では、debug、release、all の3つの実行方法が定義されています。
"buildConfigurations" では、"actions" で使われる具体的なコマンドが定義されていそうです。
{ "name": "@my-scope/my-project", "version": "0.1.0", "description": "A source xPack with a Hello World application", "main": "", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "repository": { "type": "git", "url": "https://github.com/my-github-id/my-project.git" }, "bugs": { "url": "https://github.com/my-github-id/my-project/issues/" }, "homepage": "https://github.com/my-github-id/my-project/", "keywords": [ "xpack" ], "author": { "name": "my name", "email": "my@eMail.com", "url": "https://my-url" }, "contributors": [ { "name": "Liviu Ionescu", "email": "ilg@livius.net", "url": "https://github.com/ilg-ul/" } ], "license": "MIT", "config": {}, "dependencies": {}, "bundledDependencies": [], "devDependencies": {}, "xpack": { "minimumXpmRequired": "0.14.0", "dependencies": {}, "devDependencies": { "@xpack-dev-tools/gcc": "11.3.0-1.1", "@xpack-dev-tools/cmake": "3.21.6-1.1", "@xpack-dev-tools/ninja-build": "1.11.0-1.1" }, "properties": { "buildFolderRelativePath": "{{ 'build' | path_join: configuration.name | to_filename | downcase }}", "toolchainFileName": "gcc.cmake", "commandPrepare": "cmake -S . -B {{ properties.buildFolderRelativePath }} -G Ninja -D CMAKE_BUILD_TYPE={{ properties.buildType }} -D CMAKE_EXPORT_COMPILE_COMMANDS=ON", "commandPrepareWithToolchain": "{{ properties.commandPrepare }} -D CMAKE_TOOLCHAIN_FILE=cmake/toolchains/{{ properties.toolchainFileName }}", "commandReconfigure": "{{ properties.commandPrepare }}", "commandBuild": "cmake --build {{ properties.buildFolderRelativePath }} --verbose", "commandClean": "cmake --build {{ properties.buildFolderRelativePath }} --target clean", "commandExecuteHello": "{{ properties.buildFolderRelativePath }}{{ path.sep }}hello-world" }, "actions": { "test-debug": [ "xpm run prepare --config debug", "xpm run build --config debug", "xpm run execute --config debug" ], "test-release": [ "xpm run prepare --config release", "xpm run build --config release", "xpm run execute --config release" ], "test-all": [ "xpm run test-debug", "xpm run test-release" ] }, "buildConfigurations": { "debug": { "properties": { "buildType": "Debug" }, "actions": { "prepare": "{{ properties.commandPrepareWithToolchain }}", "build": [ "{{ properties.commandReconfigure }}", "{{ properties.commandBuild }}" ], "clean": "{{ properties.commandClean }}", "execute": "{{ properties.commandExecuteHello }}" } }, "release": { "inherit": [ "debug" ], "properties": { "buildType": "Release" } } } } }
プロジェクトに必要なパッケージのインストール(xpm install)
プロジェクトの初期化の次は、プロジェクトに必要なパッケージのインストールです。
C++ プロジェクトを、CMake でビルドするためのツールがプロジェクトにインストールされたようです。
$ xpm install @my-scope/my-project... + @xpack-dev-tools/ninja-build@1.11.0-1.1 + @xpack-dev-tools/cmake@3.21.6-1.1 + @xpack-dev-tools/gcc@11.3.0-1.1 @xpack-dev-tools/cmake@3.21.6-1.1 => '/home/daisuke/.local/xPacks/@xpack-dev-tools/cmake/3.21.6-1.1' Downloading https://github.com/xpack-dev-tools/cmake-xpack/releases/download/v3.21.6-1/xpack-cmake-3.21.6-1-linux-x64.tar.gz... @xpack-dev-tools/gcc@11.3.0-1.1 => '/home/daisuke/.local/xPacks/@xpack-dev-tools/gcc/11.3.0-1.1' Downloading https://github.com/xpack-dev-tools/gcc-xpack/releases/download/v11.3.0-1/xpack-gcc-11.3.0-1-linux-x64.tar.gz... @xpack-dev-tools/ninja-build@1.11.0-1.1 => '/home/daisuke/.local/xPacks/@xpack-dev-tools/ninja-build/1.11.0-1.1' Downloading https://github.com/xpack-dev-tools/ninja-build-xpack/releases/download/v1.11.0-1/xpack-ninja-build-1.11.0-1-linux-x64.tar.gz... Extracting 'xpack-ninja-build-1.11.0-1-linux-x64.tar.gz'... 127 files => '/home/daisuke/.local/xPacks/@xpack-dev-tools/ninja-build/1.11.0-1.1/.content' 'xpacks/xpack-dev-tools-ninja-build' -> '/home/daisuke/.local/xPacks/@xpack-dev-tools/ninja-build/1.11.0-1.1' 'xpacks/.bin/ninja' -> '../xpack-dev-tools-ninja-build/.content/bin/ninja' Extracting 'xpack-cmake-3.21.6-1-linux-x64.tar.gz'... 3155 files => '/home/daisuke/.local/xPacks/@xpack-dev-tools/cmake/3.21.6-1.1/.content' Extracting 'xpack-gcc-11.3.0-1-linux-x64.tar.gz'... 'xpacks/xpack-dev-tools-cmake' -> '/home/daisuke/.local/xPacks/@xpack-dev-tools/cmake/3.21.6-1.1' 'xpacks/.bin/ccmake' -> '../xpack-dev-tools-cmake/.content/bin/ccmake' 'xpacks/.bin/cmake' -> '../xpack-dev-tools-cmake/.content/bin/cmake' 'xpacks/.bin/cpack' -> '../xpack-dev-tools-cmake/.content/bin/cpack' 'xpacks/.bin/ctest' -> '../xpack-dev-tools-cmake/.content/bin/ctest' 2073 files => '/home/daisuke/.local/xPacks/@xpack-dev-tools/gcc/11.3.0-1.1/.content' 'xpacks/xpack-dev-tools-gcc' -> '/home/daisuke/.local/xPacks/@xpack-dev-tools/gcc/11.3.0-1.1' 'xpacks/.bin/addr2line' -> '../xpack-dev-tools-gcc/.content/bin/addr2line' 'xpacks/.bin/ar' -> '../xpack-dev-tools-gcc/.content/bin/ar' 'xpacks/.bin/as' -> '../xpack-dev-tools-gcc/.content/bin/as' 'xpacks/.bin/c++' -> '../xpack-dev-tools-gcc/.content/bin/c++' 'xpacks/.bin/c++filt' -> '../xpack-dev-tools-gcc/.content/bin/c++filt' 'xpacks/.bin/cpp' -> '../xpack-dev-tools-gcc/.content/bin/cpp' 'xpacks/.bin/dwp' -> '../xpack-dev-tools-gcc/.content/bin/dwp' 'xpacks/.bin/elfedit' -> '../xpack-dev-tools-gcc/.content/bin/elfedit' 'xpacks/.bin/g++' -> '../xpack-dev-tools-gcc/.content/bin/g++' 'xpacks/.bin/gcc' -> '../xpack-dev-tools-gcc/.content/bin/gcc' 'xpacks/.bin/gcc-ar' -> '../xpack-dev-tools-gcc/.content/bin/gcc-ar' 'xpacks/.bin/gcc-nm' -> '../xpack-dev-tools-gcc/.content/bin/gcc-nm' 'xpacks/.bin/gcc-ranlib' -> '../xpack-dev-tools-gcc/.content/bin/gcc-ranlib' 'xpacks/.bin/gcov' -> '../xpack-dev-tools-gcc/.content/bin/gcov' 'xpacks/.bin/gcov-dump' -> '../xpack-dev-tools-gcc/.content/bin/gcov-dump' 'xpacks/.bin/gcov-tool' -> '../xpack-dev-tools-gcc/.content/bin/gcov-tool' 'xpacks/.bin/gdb' -> '../xpack-dev-tools-gcc/.content/bin/gdb' 'xpacks/.bin/gprof' -> '../xpack-dev-tools-gcc/.content/bin/gprof' 'xpacks/.bin/ld' -> '../xpack-dev-tools-gcc/.content/bin/ld' 'xpacks/.bin/ld.bfd' -> '../xpack-dev-tools-gcc/.content/bin/ld.bfd' 'xpacks/.bin/ld.gold' -> '../xpack-dev-tools-gcc/.content/bin/ld.gold' 'xpacks/.bin/lto-dump' -> '../xpack-dev-tools-gcc/.content/bin/lto-dump' 'xpacks/.bin/nm' -> '../xpack-dev-tools-gcc/.content/bin/nm' 'xpacks/.bin/objcopy' -> '../xpack-dev-tools-gcc/.content/bin/objcopy' 'xpacks/.bin/objdump' -> '../xpack-dev-tools-gcc/.content/bin/objdump' 'xpacks/.bin/ranlib' -> '../xpack-dev-tools-gcc/.content/bin/ranlib' 'xpacks/.bin/readelf' -> '../xpack-dev-tools-gcc/.content/bin/readelf' 'xpacks/.bin/size' -> '../xpack-dev-tools-gcc/.content/bin/size' 'xpacks/.bin/strings' -> '../xpack-dev-tools-gcc/.content/bin/strings' 'xpacks/.bin/strip' -> '../xpack-dev-tools-gcc/.content/bin/strip'
プロジェクトに必要なパッケージのインストールが完了した状態の構成は以下の通りです。
インストールされたパッケージは、~/.local/xPacks 以下にインストールされて、xpacks ディレクトリに、そのシンボリックリンクが置かれたようです。差分を確認しましたが、それ以外に変化はありませんでした。
$ tree . |-- CMakeLists.txt |-- LICENSE |-- README.md |-- cmake | `-- toolchains | |-- clang.cmake | `-- gcc.cmake |-- include | `-- hello-world.h |-- libs | `-- adder | |-- include | | `-- add | | `-- add.h | `-- src | `-- add.c |-- package.json |-- src | `-- hello-world.cpp `-- xpacks |-- xpack-dev-tools-cmake -> /home/daisuke/.local/xPacks/@xpack-dev-tools/cmake/3.21.6-1.1 |-- xpack-dev-tools-gcc -> /home/daisuke/.local/xPacks/@xpack-dev-tools/gcc/11.3.0-1.1 `-- xpack-dev-tools-ninja-build -> /home/daisuke/.local/xPacks/@xpack-dev-tools/ninja-build/1.11.0-1.1 13 directories, 10 files
プロジェクトのビルド(xpm run)
ビルドと実行です。
README.md では、xpm run test-all を実行しているので、それに従います。
package.json によると、xpm run test-all では、xpm run test-debug と xpm run test-release が実行されます。
xpm run test-debug では、xpm run prepare --config debug と、xpm run build --config debug と、xpm run execute --config debug が実行されます。xpm run test-release も同様です。
実行ログが少し長いので、前半のdebugモードだけとして、さらに、重要なところだけ貼り付けます。
最初の xpm run prepare --config debug では、CMake のコンフィグレーションが実行されています。
次の xpm run build --config debug では、CMake のリコンフィグレーションとビルドが実行されています。
最後の xpm run execute --config debug では、ビルドで生成された実行ファイルを実行しています。
$ xpm run test-all > xpm run test-debug > xpm run prepare --config debug > cmake -S . -B build/debug -G Ninja -D CMAKE_BUILD_TYPE=Debug -D CMAKE_EXPORT_COMPILE_COMMANDS=ON -D CMAKE_TOOLCHAIN_FILE=cmake/toolchains/gcc.cmake (省略) > xpm run build --config debug > cmake -S . -B build/debug -G Ninja -D CMAKE_BUILD_TYPE=Debug -D CMAKE_EXPORT_COMPILE_COMMANDS=ON (省略) > cmake --build build/debug --verbose [1/3] /home/daisuke/svn_/xpm_prj/my-project/xpacks/.bin/gcc -DDEBUG -I/home/daisuke/svn_/xpm_prj/my-project/include -I/home/daisuke/svn_/xpm_prj/my-project/libs/adder/include -O0 -g3 -static-libgcc -static-libstdc++ -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -flto -std=c11 -MD -MT CMakeFiles/hello-world.dir/libs/adder/src/add.c.o -MF CMakeFiles/hello-world.dir/libs/adder/src/add.c.o.d -o CMakeFiles/hello-world.dir/libs/adder/src/add.c.o -c /home/daisuke/svn_/xpm_prj/my-project/libs/adder/src/add.c [2/3] /home/daisuke/svn_/xpm_prj/my-project/xpacks/.bin/g++ -DDEBUG -I/home/daisuke/svn_/xpm_prj/my-project/include -I/home/daisuke/svn_/xpm_prj/my-project/libs/adder/include -O0 -g3 -static-libgcc -static-libstdc++ -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -flto -std=c++20 -MD -MT CMakeFiles/hello-world.dir/src/hello-world.cpp.o -MF CMakeFiles/hello-world.dir/src/hello-world.cpp.o.d -o CMakeFiles/hello-world.dir/src/hello-world.cpp.o -c /home/daisuke/svn_/xpm_prj/my-project/src/hello-world.cpp [3/3] : && /home/daisuke/svn_/xpm_prj/my-project/xpacks/.bin/g++ -O0 -g3 -static-libgcc -static-libstdc++ -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -flto -Wl,--gc-sections CMakeFiles/hello-world.dir/src/hello-world.cpp.o CMakeFiles/hello-world.dir/libs/adder/src/add.c.o -o hello-world && : > xpm run execute --config debug > build/debug/hello-world Hello World! (in debug mode) Check adder lib: 41 + 1 = 42 > xpm run test-release > xpm run prepare --config release > cmake -S . -B build/release -G Ninja -D CMAKE_BUILD_TYPE=Release -D CMAKE_EXPORT_COMPILE_COMMANDS=ON -D CMAKE_TOOLCHAIN_FILE=cmake/toolchains/gcc.cmake > xpm run build --config release > cmake -S . -B build/release -G Ninja -D CMAKE_BUILD_TYPE=Release -D CMAKE_EXPORT_COMPILE_COMMANDS=ON > cmake --build build/release --verbose [1/3] /home/daisuke/svn_/xpm_prj/my-project/xpacks/.bin/gcc -I/home/daisuke/svn_/xpm_prj/my-project/include -I/home/daisuke/svn_/xpm_prj/my-project/libs/adder/include -O3 -DNDEBUG -static-libgcc -static-libstdc++ -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -flto -std=c11 -MD -MT CMakeFiles/hello-world.dir/libs/adder/src/add.c.o -MF CMakeFiles/hello-world.dir/libs/adder/src/add.c.o.d -o CMakeFiles/hello-world.dir/libs/adder/src/add.c.o -c /home/daisuke/svn_/xpm_prj/my-project/libs/adder/src/add.c [2/3] /home/daisuke/svn_/xpm_prj/my-project/xpacks/.bin/g++ -I/home/daisuke/svn_/xpm_prj/my-project/include -I/home/daisuke/svn_/xpm_prj/my-project/libs/adder/include -O3 -DNDEBUG -static-libgcc -static-libstdc++ -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -flto -std=c++20 -MD -MT CMakeFiles/hello-world.dir/src/hello-world.cpp.o -MF CMakeFiles/hello-world.dir/src/hello-world.cpp.o.d -o CMakeFiles/hello-world.dir/src/hello-world.cpp.o -c /home/daisuke/svn_/xpm_prj/my-project/src/hello-world.cpp [3/3] : && /home/daisuke/svn_/xpm_prj/my-project/xpacks/.bin/g++ -O3 -DNDEBUG -static-libgcc -static-libstdc++ -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -flto -Wl,--gc-sections CMakeFiles/hello-world.dir/src/hello-world.cpp.o CMakeFiles/hello-world.dir/libs/adder/src/add.c.o -o hello-world && : > xpm run execute --config release > build/release/hello-world Hello World! (in release mode) (no asserts) Check adder lib: 41 + 1 = 42
プロジェクトのビルドが完了した状態の構成は以下の通りです。build ディレクトリ以下は、多くのファイルがあったので省略します。
$ tree . |-- CMakeLists.txt |-- LICENSE |-- README.md |-- build | |-- debug | | |-- CMakeCache.txt | | |-- (省略) | | `-- hello-world | `-- release | |-- CMakeCache.txt | |-- (省略) | `-- hello-world |-- cmake | `-- toolchains | |-- clang.cmake | `-- gcc.cmake |-- include | `-- hello-world.h |-- libs | `-- adder | |-- include | | `-- add | | `-- add.h | `-- src | `-- add.c |-- package.json |-- src | `-- hello-world.cpp `-- xpacks |-- xpack-dev-tools-cmake -> /home/daisuke/.local/xPacks/@xpack-dev-tools/cmake/3.21.6-1.1 |-- xpack-dev-tools-gcc -> /home/daisuke/.local/xPacks/@xpack-dev-tools/gcc/11.3.0-1.1 `-- xpack-dev-tools-ninja-build -> /home/daisuke/.local/xPacks/@xpack-dev-tools/ninja-build/1.11.0-1.1 42 directories, 52 files
buildディレクトリが新規に作成されました。それ以外に変化はありませんでした。
xpm のサンプルプロジェクトの実行は以上です。
おわりに
今回は、xpm について、概要ですが調べてみました。
package.json の内容を見れば、何が実行されているかを確認することが出来ます。
次回は、QEMU のソースコードをビルドして、ビルドエラーを解消したいと思います。
最後になりましたが、エンジニアグループのランキングに参加中です。
気楽にポチッとよろしくお願いいたします🙇
今回は以上です!
最後までお読みいただき、ありがとうございました。