すぐ忘れるのでここをチートシート化しよう。

構成 solution

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(hello) # .sln

subdirectory

https://cmake.org/cmake/help/latest/command/add_subdirectory.html

ADD_SUBDIRECTORY(src)

もしくは

SUBDIRS(FOO BAR HOGE FUGA)

target exe

https://cmake.org/cmake/help/latest/command/add_executable.html

ADD_EXECUTABLE(hello
    main.cpp
    renderer.cpp
    scene.cpp
    )

file を集める例

FILE(GLOB SRC
    *.cpp
    *.h
    )
ADD_EXECUTABLE(hello
    ${SRC}
    )

fo winmain

ADD_EXECUTABLE(hello_windows WIN32
    ${SRC}
    )

static lib

https://cmake.org/cmake/help/latest/command/add_library.html

ADD_LIBRARY(renderer STATIC
    renderer.cpp
    )

dll

ADD_LIBRARY(renderer SHARED
    renderer.cpp
    )

compile compiler options 全体

SET(CMAKE_CXX_FLAGS "-Wall")

ターゲット指定

TARGET_COMPILE_OPTIONS(foo PUBLIC "#x3C;#x3C;CONFIG:DEBUG>:${MY_DEBUG_OPTIONS}>")
TARGET_COMPILE_OPTIONS(foo PUBLIC "#x3C;#x3C;CONFIG:RELEASE>:${MY_RELEASE_OPTIONS}>")

include path 全体 以降の ADD_XXX に対して有効になる

INCLUDE_DIRECTORIES(libpath/include)

ターゲット指定 PUBLIC の部分はよくわからぬ。

TARGET_INCLUDE_DIRECTORIES(HELLO PUBLIC
	${BOOST_DIR}
	)

define 全体 以降の ADD_XXX に対して有効になる

ADD_DEFINITIONS(-DWITH_OPENCV2)

ターゲット指定 PUBLIC の部分はよくわからぬ。

-D なし

TARGET_COMPILE_DEFINITIONS(TARGET PUBLIC
    WITH_OPENCV2=1
    )

link link path

LINK_DIRECTORIES(libpath/lib)

x86 と x64 で違うパスにしたい時は?

LINK_LIBRARIES
TARGET_LINK_LIBRARIES
TARGET_LINK_LIBRARIES(MediaSessionPlaybackExample
    Mf
    Mfplat
    Mfuuid
    strmiids
    )

Debug Release の切り分け

TARGET_LINK_LIBRARIES(Fuga
    DEBUG hoge_d
    OPTIMIZE hoge
    )

変数 ソース

cmake -G CMAKE_SOURCE_DIR
CMAKE_SOURCE_DIR

ビルドディレクトリ cmake -G CMAKE_SOURCE_DIR を実行したディレクトリ

CMAKE_BINARY_DIR

The path to the top level of the build tree

出力ディレクトリ exe と dll の出力先。

SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

example CMakeLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(hello) # hello.sln
ADD_EXECUTABLE(hello main.cpp) # hello.vcxproj

set(CMAKE_CXX_FLAGS "/WD4096")
set(CMAKE_C_FLAGS "/WD4096")
include_directories(libpath/include)
add_definitions(
    -DUNICODE
    -D_UNICODE
    )