ビルドしたい(cmake

// プロジェクト内に移動する
$ cd $G4WORK/プロジェクト

// ビルド用ディレクトリを作成する
(プロジェクト) $ mkdir build
(プロジェクト)$ cd build

// ビルド準備する
(プ/build) $ cmake ..

// ビルドする
(プ/build) $ make -j8   # 必要ならば make install する

Geant4本体と同じようにアプリケーションもCMakeでビルド準備します。 自作アプリケーションも、付属サンプルのようにCMakeLists.txtが必要です。

ここでもcmakeの作法(out-of-source)にしたがい、ビルド用ディレクトリで作業します。 ディレクトリ名は任意ですが、分かりやすくbuildとしました。 ビルド作業はすべてこのディレクトリで行います。

まずはじめにCMakeLists.txtから、Makefileなどビルドに必要なファイルを生成します。 ビルド用ディレクトリに対してCMakeLists.txtは親ディレクトリにあるのでcmake ..を実行しています。

そしてMakefileから実行ファイルを生成します。 Makefileはビルド用ディレクトリの中にあるのでmake -j8を実行しています。 プロセッサ数のオプション(-jN)は指定した方がよいです。

実行ファイルは現在のディレクトリ(build)に生成されます。 プロジェクトの中でアプリケーションを実行するのがよいと思うので、ここで完了です。 もし、システム全体で使いたい場合はmake installします。

// アプリケーションを実行
$ ./実行ファイル名    # 対話モード
$ ./実行ファイル名 マクロ.mac    # バッチモード

アプリケーションの実行方法は「対話モード」と「バッチモード」の2種類あります。 引数なしで実行すると対話モード、 引数にマクロファイル(.mac)を指定するとバッチモードになります。

マクロは、対話モードで使用するコマンドをまとめたようなファイルです。 対話モードで起動するときも、同じディレクトリにある init_vis.macvis.macが読み込まれるようです。

CMakeLists.txtしたい

exampleB1のCMakeLists.txtをサンプルに、 何をしているのか分割しながら確認します。

#----------------------------------------------------------------------------
# Setup the project
cmake_minimum_required(VERSION 3.16...3.21)
project(B1)

プロジェクト全体の設定です。 cmake_minimum_requiredでCMakeのバージョンを指定しています。

注釈

CMake 3.29.6 を使ってビルドしましたが、エラーはでませんでした。 上限値の制限はゆるいみたいです。

#----------------------------------------------------------------------------
# Find Geant4 package, activating all available UI and Vis drivers by default
# You can set WITH_GEANT4_UIVIS to OFF via the command line or ccmake/cmake-gui
# to build a batch mode only executable
#
option(WITH_GEANT4_UIVIS "Build example with Geant4 UI and Vis drivers" ON)
if(WITH_GEANT4_UIVIS)
  find_package(Geant4 REQUIRED ui_all vis_all)
else()
  find_package(Geant4 REQUIRED)
endif()

find_packageコマンドで、Geant4の設定を取得しています。 WITH_GEANT4_UIVISオプションは可視化オプションです。 デフォルトはONになっていて、すべての可視化オプション(ui_all / vis_all)が有効になります。 OFFにすると無効にできます。

#----------------------------------------------------------------------------
# Setup Geant4 include directories and compile definitions
# Setup include directory for this project
#
include(${Geant4_USE_FILE})
include_directories(${PROJECT_SOURCE_DIR}/include)

Geant4アプリのビルドに必要なディレクトリを設定しています。 Geant4_USE_FILEfind_package(Geant4)したときに設定されます。 他にも設定される変数がありますが、$HOME/geant4/11.2.1/lib/cmake/Geant4/Geant4Config.cmakeの頭にあるコメントと、中の処理を直接確認するのがよいと思います。

#----------------------------------------------------------------------------
# Locate sources and headers for this project
# NB: headers are included so they will show up in IDEs
#
file(GLOB sources ${PROJECT_SOURCE_DIR}/src/*.cc)
file(GLOB headers ${PROJECT_SOURCE_DIR}/include/*.hh)

Geant4アプリのビルドに必要なファイルを取得しています。 ${sources}にソースファイルの一覧、 ${headers}にヘッダーファイルの一覧、 を代入しています。

#----------------------------------------------------------------------------
# Add the executable, and link it to the Geant4 libraries
#
add_executable(exampleB1 exampleB1.cc ${sources} ${headers})
target_link_libraries(exampleB1 ${Geant4_LIBRARIES})

実行ファイルを作るときの設定です。 add_executableで、実行ファイルの作成に必要なファイルを指定しています。 target_link_librariesでビルド時にリンクさせるライブラリを指定しています。

Geant4以外の外部ライブラリを使う場合は、ここに設定を追加すればOKです。

#----------------------------------------------------------------------------
# Copy all scripts to the build directory, i.e. the directory in which we
# build B1. This is so that we can run the executable directly because it
# relies on these scripts being in the current working directory.
#
set(EXAMPLEB1_SCRIPTS
  exampleB1.in
  exampleB1.out
  init_vis.mac
  run1.mac
  run2.mac
  vis.mac
  tsg_offscreen.mac
  )

foreach(_script ${EXAMPLEB1_SCRIPTS})
  configure_file(
    ${PROJECT_SOURCE_DIR}/${_script}
    ${PROJECT_BINARY_DIR}/${_script}
    COPYONLY
    )
endforeach()

これはGeant4のexamples固有の設定です。 アプリの実行に必要なファイルをコピーしています。

注釈

ファイルが存在しない場合は、エラーになります。 汎用的な設定ではないと思うので、自分のアプリに不要な場合は、 この部分は真似しなくてもよいと思います。

#----------------------------------------------------------------------------
# For internal Geant4 use - but has no effect if you build this
# example standalone
#
add_custom_target(B1 DEPENDS exampleB1)

(ここはわかってない)

#----------------------------------------------------------------------------
# Install the executable to 'bin' directory under CMAKE_INSTALL_PREFIX
#
install(TARGETS exampleB1 DESTINATION bin)

実行ファイルのインストール先の設定です。 プロジェクト/bin/exampleB1にインストールされます。