Geant4例子的代码结构一般为:
-example
-example.cc
-src
-include
-CMakeLists.txt
-*.mac/*.in
其中example.cc是main()所在的主文件,src是源文件所在目录,include是头文件所在目录,CMakeLists.txt是cmake脚本,*.mac/*.in是宏命令文件。
首先,在Geant4的安装目录下"_install\lib\Geant4-版本号\Geant4Config.cmake"定义了一些CMake变量,在每一个例子的CMakeLists.txt中的 "find_package"命令执行时被获得。当该命令执行后,它会设置几个CMake变量,并提供一种机制来检查和激活Geant4的可选特性。这将允许在自己CMake项目中以多种方式使用它来配置Geant4以供你的应用使用。
其中最基本的是定位Geant4,采用以下命令:
# 如果只是定位,则不加任何后缀
find_package(Geant4)
# 如果必须找到Geant4,则使用如下命令
find_package(Geant4 REQUIRED)
当Geant4的安装目录找到后,以下CMake变量便可在项目的其他地方进行使用:
· Geant4_FOUND
如果找到Geant4的安装,则将该CMake bool变量设置为true
· Geant4_INCLUDE_DIRS
为包含Geant4所需头文件列表的目录
· Geant4_LIBRARIES
使用Geant4时需要链接到的库列表目录
· Geant4_CXX_FLAGS
用于构建Geant4安装的编译器标志,通常在Windows平台上是最重要的
· Geant4_CXX_FLAGS_<CONFIG>
在CONFIG模式下(比如,Release,Debug等)编译Geant4和应用时的编译器标志
· Geant4_CXXSTD
c++标准,例如"c++11",Geant4的安装是根据它编译的
· Geant4_TLS_MODEL
线程本地存储模型,如"initial-exec",仅在使用多线程支持编译安装时设置
· Geant4_USE_FILE
一个可以自动处理某些CMake步骤的CMake脚本,对于基本应用程序十分实用
· and so on
可以参见G4用户手册
让我们来剖析这样一个Geant4的CMakeLists.txt
#-第一步----------------------------------------------------------------------
# 设置项目名称为:dnaphysics
#
cmake_minimum_required(VERSION 2.6 FATAL_ERROR)
project(dnaphysics)
#-第二步----------------------------------------------------------------------
# 找到Geant4安装目录,即Geant4Config.cmake所在目录
#
option(WITH_GEANT4_VIS "Build example with Geant4 Vis drivers" ON)
if(WITH_GEANT4_VIS)
find_package(Geant4 REQUIRED vis_all)
else()
find_package(Geant4 REQUIRED)
endif()
#-第三步----------------------------------------------------------------------
# 自动配置Geant4头文件
#
include(${Geant4_USE_FILE})
#-第四步----------------------------------------------------------------------
# 定位项目的源文件和头文件
#
# 将用户自定义头文件和Geant4头文件一并添加到头文件目录,即-I路径
#
include_directories(${PROJECT_SOURCE_DIR}/include
${Geant4_INCLUDE_DIR})
#
# 将用户自定义源文件,即/src目录下的*.cc文件一并添加到CMake全局变量sources中
#
file(GLOB sources ${PROJECT_SOURCE_DIR}/src/*.cc)
#
# 将用户自定义头文件,即/include目录下的*.hh文件一并添加到CMake全局变量headers中
#
file(GLOB headers ${PROJECT_SOURCE_DIR}/include/*.hh)
#-第五步----------------------------------------------------------------------
# 添加可执行文件,并链接到Geant4的库
#
# 将目录下的main()文件,即dnaphysics.cc、源文件和头文件一并添加到可执行文件dnaphysics中
#
add_executable(dnaphysics dnaphysics.cc ${sources} ${headers})
#
# 将可执行文件dnaphysics链接到Geant4库
#
target_link_libraries(dnaphysics ${Geant4_LIBRARIES} )
#-第六步----------------------------------------------------------------------
# 复制所有脚本到build目录,因为可执行文件依赖于一些宏命令等,拷贝后可直接运行
#
# 将目录下以*.mac、*.in和*.C结尾的文件添加到全局变量MAC_FILES中
#
file(GLOB MAC_FILES ${PROJECT_SOURCE_DIR}/*.mac
${PROJECT_SOURCE_DIR}/*.in
${PROJECT_SOURCE_DIR}/*.C)
#
# 遍历MAC_FILES
#
# 将遍历到的文件路径${_script}拷贝到指定路径${PROJECT_BINARY_DIR}/. 并执行指定操作
# 这里的操作是只复制:COPYONLY
#
foreach(_script ${MAC_FILES})
configure_file(
${_script}
${PROJECT_BINARY_DIR}/.
COPYONLY
)
endforeach()
#-第七步----------------------------------------------------------------------
# 将可执行二进制文件dnaphysics安装到'bin'目录
#
install(TARGETS dnaphysics DESTINATION bin)
|