以下の内容はhttps://daisuke20240310.hatenablog.com/entry/xpmより取得しました。


QEMUのビルドに必要なxpm(xPack Project Manager)について学ぶ

前回は、バイナリファイル(デバッグ情報、シンボル情報が削除される)から再構築した ELFファイルを QEMU (ターゲットは STM32F4-Discovery)で動かしました。

今回は、QEMU をビルドして動かす予定でしたが、やってみるとビルドエラーになりました。簡単にはエラーを解決できなかったので、QEMU のビルドの仕組みの xpm を理解していきます。

それでは、やっていきます。

参考文献

  • CQ出版

はじめに

「QEMUを動かす」の記事一覧です。良かったら参考にしてください。

QEMUを動かすの記事一覧

xpm について学ぶことが必要になりました。

xpm とは、xPack Project Manager の略で、ビルドツールのようです。

今回は、xpm のサンプルプロジェクトを動かして、xpm を理解していきます。

xpm を動かすには環境構築が必要なので、そこからやっていきます。

xpmの環境構築

参考文献の に、QEMU をソースコードからビルドする方法が書かれています。

ソースコードは以下と書かれています。

github.com

ビルド手順は以下と書かれています。

github.com

こう書かれていますが、現在は、変更されたのか、ここにはインストールする手順が書かれているだけで、ビルドする手順は書かれていませんでした。

同じフォルダにある以下の README-MAINTAINER.md にビルド手順が書かれていました。

github.com

README-MAINTAINER.md の先頭に、事前にインストールが必要な手順が書かれたリンクがあります。

xpack.github.io

これに従って、環境構築をやっていきます。

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 について理解していきます。

まず、公式サイトは以下です。

xpack.github.io

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 のサンプルプロジェクトは以下です。

github.com

単純な 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-debugxpm 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 のソースコードをビルドして、ビルドエラーを解消したいと思います。

最後になりましたが、エンジニアグループのランキングに参加中です。

気楽にポチッとよろしくお願いいたします🙇

今回は以上です!

最後までお読みいただき、ありがとうございました。




以上の内容はhttps://daisuke20240310.hatenablog.com/entry/xpmより取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14