設定ファイル
CMakeLists.txt簡単な使い方
Visual Studio 2013でx64アーキテクチャ用のプロジェクトファイルを作成する.
ビルド用の作業ツリーは, build_x64ディレクトリ以下に作成する.
#cmake -G<generator name> <path-to-source> mkdir build_x64 cd ./build_x64 cmake -G"Visual Studio 12 2013 Win64" ..Visual Studioの場合デフォルトでは, ALL_BUILDとZERO_CHECKというプロジェクトが作成される.
ALL_BUILD: make allに相当
ZERO_CHECK: CMakeLists.txt更新されていた場合, プロジェクトファイルを更新する. cmakeコマンドを再実行する代わり.
CMake バージョンチェック
cmake_minimum_required(VERSION 3.5)
変数定義
set(PROJECT_VERSION_MAJOR 0) set(PROJECT_VERSION_MINOR 1) set(PROJECT_VERSION_PATCH 0) set(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}) #Print to console message(${PROJECT_VERSION})
プロジェクト名
set(ProjectName lcore) project(${ProjectName})
コンフィギュレーション
set(CMAKE_CONFIGURATION_TYPES "Debug" "Release")
コンフィギュレーションファイル
#configure.h.inに ##cmakedefine FOO_ENABLE ##cmakedefine FOO_STRING "@FOO_STRING@" ##define BAR_STRING "@BAR_STRING@" #と書いてある場合 option(FOO_ENABLE "Enable Foo" ON) set(FOO_STRING "foo") set(BAR_STRING "bar") configure_file("${CMAKE_CURRENT_SOURCE_DIR}/configure.h.in" "${CMAKE_CURRENT_SOURCE_DIR}/configure.h" NEWLINE_STYLE LF @ONLY) ##define FOO_ENABLE ##define FOO_STRING "foo" ##define BAR_STRING "bar" #となる. #option(FOO_ENABLE "Enable Foo" ON) #set(FOO_STRING "foo") #set(BAR_STRING "bar") configure_file("${CMAKE_CURRENT_SOURCE_DIR}/configure.h.in" "${CMAKE_CURRENT_SOURCE_DIR}/configure.h" NEWLINE_STYLE LF @ONLY) #とすると, #/* #undef FOO_ENABLE */ #/* #undef FOO_STRING */ ##define BAR_STRING "" #となる.
コンパイラやBinutilsを設定
function(set_llvm_tools) if(WIN32) set(CMAKE_C_COMPILER "clang-cl" PARENT_SCOPE) set(CMAKE_CXX_COMPILER "clang-cl" PARENT_SCOPE) else() set(CMAKE_C_COMPILER "clang" PANRENT_SCOPE) set(CMAKE_CXX_COMPILER "clang++" PARENT_SCOPE) endif() set(CMAKE_AR "llvm-ar" PARENT_SCOPE) set(CMAKE_LINKER "llvm-ld" PARENT_SCOPE) set(CMAKE_NM "llvm-nm" PARENT_SCOPE) set(CMAKE_OBJDUMP "llvm-objdump" PANRET_SCOPE) set(CMAKE_RANLIB "llvm-ranlib" PARENT_SCOPE) endfunction(set_llvm_tools)
インクルードディレクトリ
# CMAKE_CURRENT_SOURCE_DIR変数は, 現在処理中のCMakeLists.txtのあるディレクトリ. # BEFORE or AFTER オプションは, パスリストへの追加位置. include_directories(AFTER ${CMAKE_CURRENT_SOURCE_DIR})
リンクディレクトリ
Visual Studioの場合以下のようにしないと上手く展開されない.
link_directories("./lib")
ライブラリ検索
先頭から順に検索して見つかったものが結果に入る.
find_library(LIBRARY0 NAMES hoge0 PATHS "/libs/hoge") find_library(LIBRARY1 NAMES hoge1 PATHS "/libs/hoge")
出力ディレクトリ
コンフィギュレーション毎の設定をしないと, 出力ディレクトリは, OUTPUT_DIRECTORY/CONFIGURATIONが設定される.
# Executable file: CMAKE_RUNTIME_OUTPUT_DIRECTORY # Static library: CMAKE_ARCHIVE_OUTPUT_DIRECTORY # Shared library: CMAKE_RUNTIME_OUTPUT_DIRECTORY set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/bin") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}/bin/Debug") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/bin/Release")
関数と返値
function(expand_files FILES SOURCE) file (GLOB SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${SOURCE}) set(${FILES} ${SOURCES} PARENT_SCOPE) endfunction(expand_files)
環境変数
# Set environment variable INCLUDE set(ENV{INCLUDE} "PATH0") set(ENV{INCLUDE} "$ENV{INCLUDE};PATH1") message("$ENV{INCLUDE}")
リスト
# Create list set(LIST_ a;b;c) message("${LIST_}") set(LIST_ "a" "b" "c") message("${LIST_}") set(LIST_ "a;b;c") message("${LIST_}") # list(LENGTH LIST_ LIST_LENGTH) message("${LIST_LENGTH}") list(GET LIST_ 0 LIST_VALUE) message("${LIST_VALUE}")
ファイルの収集, グルーピング
Visual Studioではファイルフィルタに相当.
Visual Studioでは, ディレクトリ階層の区切りに'¥'を使用する.
set(ROOT_INCLUDE "./include") set(ROOT_SOURCE "./src") set(MODULES "/") set(HEADERS "") set(SOURCES "") # Collect files foreach(MODULE IN LISTS MODULES) set(HFILES "") set(CPPFILES "") set(CFILES "") expand_files(HFILES "${ROOT_INCLUDE}${MODULE}/*h") expand_files(CPPFILES "${ROOT_SOURCE}${MODULE}/*cpp") expand_files(CFILES "${ROOT_SOURCE}${MODULE}/*c") # Append files to list set(HEADERS ${HEADERS} ${HFILES}) set(SOURCES ${SOURCES} ${CPPFILES} ${CFILES}) # Grouping files string(REPLACE "/" "\\" FILTER "include/${MODULE}") source_group("${FILTER}" FILES ${HEADERS}) string(REPLACE "/" "\\" FILTER "src/${MODULE}") source_group("${FILTER}" FILES ${CPPFILES} ${CFILES}) endforeach()
コンパイラ, リンカフラグ
if(MSVC) set(CMAKE_CXX_FLAGS "/DWIN32 /D_WINDOWS /D_MBCS /W4 /WX- /nologo /fp:precise /Zc:wchar_t /TP /Gd") set(CMAKE_CXX_FLAGS_DEBUG "/MTd /ZI /Ob0 /Od /RTC1 /Gy /GR- /GS /Gm-") set(CMAKE_CXX_FLAGS_RELEASE "/MT /O2 /Ob2 /GL /GR-") #set(CMAKE_STATIC_LINKER_FLAGS_DEBUG "") set(CMAKE_STATIC_LINKER_FLAGS_RELEASE "/LTCG") elseif(UNIX) elseif(APPLE) endif()
出力設定
add_executable(${ProjectName} ${FILES}) add_library(${ProjectName} STATIC ${FILES}) add_library(${ProjectName} SHARED ${FILES})
ターゲット指定のコンパイラオプション
出力設定add_????の後に, 以下のように書く.
プリプロセッサ定義をコンフィギュレーション毎に変える場合, set_propertyを使用して以下のようにする.
set_target_properties(${ProjectName} PROPERTIES OUTPUT_NAME_DEBUG "${ProjectName}d" OUTPUT_NAME_RELEASE "${ProjectName}" COMPILE_DEFINITIONS "HOGE") #$<$<CONFIG:DEBUG>:DEBUG_MODE> means if CONFIG==DEBUG then expand DEBUG_MODE set_property(TARGET ${ProjectName} APPEND PROPERTY COMPILE_DEFINITIONS $<$<CONFIG:DEBUG>:DEBUG_MODE1> $<$<CONFIG:DEBUG>:DEBUG_MODE2> $<$<CONFIG:RELEASE>:RELEASE_MODE>) #Linker flags set_target_properties(${ProjectName} PROPERTIES LINK_FLAGS_DEBUG "/SUBSYSTEM:CONSOLE" LINK_FLAGS_RELEASE "/LTCG /SUBSYSTEM:CONSOLE")
コンフィギュレーション毎のリンクするライブラリ
インポート済みライブラリターゲットを作って, コンフィギュレーション毎にリンクしたいファイルを追加.
そのライブラリを本体に追加する.
add_library(GTEST MODULE IMPORTED) set_target_properties(GTEST PROPERTIES IMPORTED_LOCATION_DEBUG "gtestd.lib" IMPORTED_LOCATION_RELEASE "gtest.lib") target_link_libraries(${ProjectName} GTEST)
その他
Visual Studioのデバッグディレクトリを設定
# Set the wroking directory for Visual Studio function(set_vs_working_directory projectname path) file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${projectname}.vcxproj.user" "<?xml version=\"1.0\" encoding=\"utf-8\"?> <Project ToolsVersion=\"12.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\"> <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\"> <LocalDebuggerWorkingDirectory>${path}</LocalDebuggerWorkingDirectory> <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor> </PropertyGroup> <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\"> <LocalDebuggerWorkingDirectory>${path}</LocalDebuggerWorkingDirectory> <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor> </PropertyGroup> </Project>") endfunction(set_vs_working_directory)
Visual Studioのインストールディレクトリをレジストリから取得
function(get_dir_from_list RESULT_VALUE INPUT_STR INDEX) string(REGEX REPLACE [\n\r] "" INPUT_STR ${INPUT_STR}) string(REPLACE " " ";" INPUT_LIST ${INPUT_STR}) list(GET INPUT_LIST ${INDEX} INPUT_STR) string(REPLACE "\\" "/" INPUT_STR ${INPUT_STR}) set(${RESULT_VALUE} ${INPUT_STR} PARENT_SCOPE) endfunction(get_dir_from_list) function(get_visualstudio_dir VS_DIR VERSIONS) set(VS_DIR "" PARENT_SCOPE) set(KEYS "HKLM;HKCU") # Search Wow64 foreach(ver IN LISTS VERSIONS) foreach(key IN LISTS KEYS) execute_process(COMMAND reg query "${key}\\SOFTWARE\\Wow6432Node\\Microsoft\\VisualStudio\\${ver}\\Setup\\VC" /v "ProductDir" RESULT_VARIABLE REG_RESULT OUTPUT_VARIABLE REG_VALUE) if(REG_RESULT EQUAL 0) get_dir_from_list(REG_VALUE ${REG_VALUE} 3) set(${VS_DIR} ${REG_VALUE} PARENT_SCOPE) return() endif() endforeach(key) endforeach(ver) # Search 32bit foreach(ver IN LISTS VERSIONS) foreach(key IN LISTS KEYS) execute_process(COMMAND reg query "${key}\\SOFTWARE\\Microsoft\\VisualStudio\\${ver}\\Setup\\VC" /v "ProductDir" RESULT_VARIABLE REG_RESULT OUTPUT_VARIABLE REG_VALUE) if(REG_RESULT EQUAL 0) get_dir_from_list(REG_VALUE ${REG_VALUE} 3) set(${VS_DIR} ${REG_VALUE} PARENT_SCOPE) return() endif() endforeach(key) endforeach(ver) endfunction(get_visualstudio_dir) //Visual Studio 2015または2013のディレクトリを取得するなら get_visualstudio_dir(VS_DIR "14.0;12.0")
0 件のコメント:
コメントを投稿