1 Ekim 2017 Pazar

CMake

Giriş
En basit kullanım şekli şöyle
cmake_minimum_required(VERSION 2.8)
find_package(Boost REQUIRED filesystem system)
include_directories(${Boost_INCLUDE_DIRS})
target_link_libraries(mytarget ${Boost_LIBRARIES})
1. option
Şöyle yaparız.set(...) çağrısı ile aynıdır.
option(Boost_USE_STATIC_LIBS "Use Boost static version" ON)
2. set
Şöyle yaparız.
set(BOOST_ROOT <where you built boost>)
Şöyle yaparız.
set(Boost_USE_STATIC_LIBS   ON)
Bu satır ile libboost_date_time.a, libboost_random.a, libboost_system.a gibi .a ile biten kütüphaneler linklenir.

Şöyle yaparız.
set(Boost_USE_MULTITHREADED ON)
Şöyle yaparız.
set(Boost_USE_STATIC_RUNTIME OFF)
Şöyle yaparız.
set(BOOST_MIN_VERSION "1.55.0")
Şöyle yaparız.
set(BOOST_VER "1.61.0")
set(Boost_VERSION 106100)
Şöyle yaparız.
set(Boost_FIND_QUIETLY 0 )
set(Boost_DEBUG 1)
Şöyle yaparız.. Bunun yerine target_link_libraries kullanılsa daha iyi
set(CMAKE_CXX_FLAGS "-lboost_program_options")
3. find_package
Not : Eğer CMake sürümü eski ise find_package modülü şu hatayı verir.
Imported targets not available for Boost version 106300
CMake kurulumundaki FindBoost modülü çalışır. Çıktılarda şuna benzer satırlar görülür.
/usr/share/cmake-3.5/Modules/FindBoost.cmake ......
Şöyle yaparız.
find_package (Boost)
CONFIG
Header only kütüphaneler için kullanılır. Eğer lib.a gibi bir kütüphane için kullanırsak hata alırız. Şu kullanım yanlış.
find_package(Boost CONFIG REQUIRED COMPONENTS system)
EXACT
Birden fazla boost sürümü kurulu ise tercih ettiğimiz sürümü belirtmek için şöyle yaparız. Bu sürüm find_package'a sadece bir öneri niteliği taşır. find_package'ı bu sürümü kullanmak için zorlamaz yani find_package bu sürümü tercih edilmeyebilir!
set(BOOST_VERSION_REQUIRED "your version value here") # adjust as needed
find_package(Boost ${BOOST_VERSION_REQUIRED} REQUIRED regex date_time ...)
Tam olarak hangi sürümü bulmak istediğimizi belirtmek için şöyle yaparız.
# Add old boost library
set(BOOST_VERSION_REQUIRED "1.63.0")

find_package(Boost ${BOOST_VERSION_REQUIRED} EXACT REQUIRED
  regex date_time system filesystem thread graph program_options serialization
  iostreams chrono atomic)
QUIET
Çıktı istemezsek şöyle yaparız.
find_package(Boost 1.54.0 QUIET REQUIRED COMPONENTS
  system program_options regex filesystem
)
REQUIRED
Şöyle yaparız.
find_package(Boost REQUIRED COMPONENTS ...)
Şu kütüphaneler kullanılabilir.
coroutine
context
filesystem
mpi
program_options
python
regex
thread
signals
system

Boost'un varlığını şöyle kontrol etmek için şöyle yaparız.
IF(Boost_FOUND)
  ...
ELSEIF(NOT Boost_FOUND)
  MESSAGE(FATAL_ERROR "Set BOOST_ROOT")
ENDIF()
find işleminden sonra bazı ortam değişkenleri atanır. Ortam değişkenlerinin hepsi küçük harfle yani "Boost_XXX" şeklinde başlarlar. Kazara "BOOST_XXX" kullanılabiliyor.  Şu kullanım şekli yanlış
target_link_libraries(myapp ${BOOST_LIBRARIES})
Açıklaması şöyle
Boost_FOUND - True if headers and requested libraries were found
Boost_INCLUDE_DIRS - Boost include directories
Boost_LIBRARY_DIRS - Link directories for Boost libraries
Boost_LIBRARIES - Boost component libraries to be linked
Bazı ortam değişkenlerini şöyle görebiliriz.
message(STATUS "Boost_INCLUDE_DIRS: ${Boost_INCLUDE_DIRS}")
message(STATUS "Boost_LIBRARIES: ${Boost_LIBRARIES}")
message(STATUS "Boost_VERSION: ${Boost_VERSION}")
Kolay kullanım için şöyle yaparız.
if(Boost_FOUND)
  include_directories(${Boost_INCLUDE_DIRS}) 
  add_executable(myapp main.cpp)
  target_link_libraries(myapp ${Boost_LIBRARIES})
endif()
Şöyle yaparız.
cmake_minimum_required(VERSION 3.7)
project(untitled)

set(CMAKE_CXX_STANDARD 11)

set(SOURCE_FILES main.cpp)
add_executable(untitled ${SOURCE_FILES})

find_package(Boost COMPONENTS system filesystem REQUIRED)
IF (Boost_FOUND)
    include_directories(${Boost_INCLUDE_DIR})
    target_link_libraries(untitled 
        ${Boost_FILESYSTEM_LIBRARY}
        ${Boost_SYSTEM_LIBRARY}
        )
endif()
4. include_directories
Şöyle yaparız.
include_directories(${Boost_INCLUDE_DIRS})
5. target_include_directories
Şöyle yaparız.
target_include_directories(myapp ${Boost_INCLUDE_DIRS})
6. target_link_libraries
Açıklaması şöyle
Boost provides 3 ways of linking their library: single-header, static library and shared library.
1. Visual Studio
Visual Studio kullanıyorsak boost'tan kullanmak istediğimiz kütüphanaleri belirtmeye gerek yok. Auto linking ile sorun halloluyor. Bu özelliği kapatmak için şunu tanımlarız.
BOOST_ALL_NO_LIB
Eğer auto linking açık ise ve dll kullanmak istiyorsak BOOST_ALL_DYN_LINK macrosu tanımlanır. Açıklaması şöyle.
Forces all libraries that have separate source, to be linked as dll's rather than static libraries on Microsoft Windows
Eğer bu macro tanımlı değilse Windows'ta static linkleme yapılır. Yani boost dll'lerini dağıtmaya gerek yoktur.

2. Gcc
Gcc kulllanıyorsak kütüphanaleri belirtmek lazım.
Örnek
Şöyle yaparız.
target_link_libraries(${PROJECT_NAME}
                      Boost::log)
Örnek
Şöyle yaparız. Boost::system şeklinde kullanınca system kütüphanesinin bağımlı olduğu diğer kütüphaneler de otomatik olarak linklenir.
target_link_libraries(myapp Boost::system)
Örnek
Şöyle yaparız.
target_link_libraries(myapp Boost::thread)
Örnek
Bazıları şöyle yapıyor. Ben bu kullanımı sevmiyorum.
target_link_libraries(myapp ${Boost_LIBRARIES})
Örnek
Şöyle yaparız.
target_link_libraries(myapp 
  ${Boost_FILESYSTEM_LIBRARY}
  ${Boost_SYSTEM_LIBRARY}
)
komut satırı
1. BOOST_ROOT
Açıklaması şöyle
BOOST_ROOT             - Preferred installation prefix
BOOST_ROOT tanımlanır. Gerekirse ortam değişkeninden kullanılır. Şöyle yaparız.
cmake .. -DBOOST_ROOT=/home/user/boost
Diğer değişkenleri de kontrol etmek istersek şöyle yaparız.
cmake -DBOOST_ROOT=... -DBOOST_INCLUDEDIR=... -DBOOST_LIBRARYDIR=...
  -DBOOST_VER:STRING=... ./
2. Boost_COMPILER
Şöyle yaparız.
cmake -G "Visual Studio 15 2017" ..
    -DBOOST_ROOT="C:\libs\boost_1_65_0"
    -DBOOST_LIBRARYDIR="C:\libs\boost_1_65_0\lib64-msvc-15.0"alo
    -DBoost_Compiler="-vc141"
3. BOOST_INCLUDEDIR
Açıklaması şöyle
# This module reads hints about search locations from variables::
#
#   BOOST_ROOT             - Preferred installation prefix
#    (or BOOSTROOT)
#   BOOST_INCLUDEDIR       - Preferred include directory e.g. <prefix>/include
#   BOOST_LIBRARYDIR       - Preferred library directory e.g. <prefix>/lib
#   Boost_NO_SYSTEM_PATHS  - Set to ON to disable searching in locations not
#                            specified by these hint variables. Default is OFF.
#   Boost_ADDITIONAL_VERSIONS
#                          - List of Boost versions not known to this module
#                            (Boost install locations may contain the version)

4. BOOST_LIB
BOOST_ROOT 'a bakarak kendimiz tanımlamak istersek şöyle yaparız.
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
    set(Boost_LIBRARY_DIR ${BOOST_ROOT}/stage64/lib
elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
    set(Boost_LIBRARY_DIR ${BOOST_ROOT}/stage/lib
endif()
Visual Studio
VS 2017'den itibaren CMake IDE içinde geliyor. Menüden CMake->Change CMake Settings->CMakeLists.txt yolunu izlersek CMakeSettings.json dosyası açılır. İçi şöyledir.
{
  "configurations": [
  {
    "name": "x86-Debug",
    "generator": "Visual Studio 15 2017",
    "configurationType": "Debug",
    "buildRoot": "${env.LOCALAPPDATA}\\CMakeBuild\\${workspace}\\build\\${name}",
    "cmakeCommandArgs": "",
    "buildCommandArgs": "\"-m -v:minimal\"."
  },...


Hiç yorum yok:

Yorum Gönder