# use lib or use source : use lib by default(OFF)cmake_minimum_required(VERSION 3.5 FATAL_ERROR)project(recipe-04 LANGUAGES CXX)# introduce a toggle for using a libraryset(USE_LIBRARY OFF)#print a message during cmakemessage(STATUS "Compile sources into a library? ${USE_LIBRARY}")# BUILD_SHARED_LIBS is a global flag offered by CMake# to toggle the behavior of add_libraryset(BUILD_SHARED_LIBS OFF) #could set to "ON"# list source, append variale to _sources list(APPEND _sources Message.hpp Message.cpp)if(USE_LIBRARY)# add_library will create a static library# since BUILD_SHARED_LIBS is OFFadd_library(message ${_sources})add_executable(hello-world hello-world.cpp)target_link_libraries(hello-world message)else()add_executable(hello-world hello-world.cpp ${_sources})endif()# log
$ cmake .-- The CXX compiler identification is GNU 9.3.0-- Check for working CXX compiler:/usr/bin/c++-- Check for working CXX compiler:/usr/bin/c++-- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Compile sources into a library? OFF
-- Configuring done
-- Generating done
-- Build files have been written to:/home/jianleya/trainning/cmake/cmake/cmake-cookbook/cmake-cookbook/chapter-01/recipe-04/cxx-example
Condition Option
# use dependent optioncmake_minimum_required(VERSION 3.5 FATAL_ERROR)project(recipe-05 LANGUAGES CXX)# expose options to the useroption(USE_LIBRARY "Compile sources into a library" OFF)message(STATUS "Compile sources into a library? ${USE_LIBRARY}")include(CMakeDependentOption)# second option depends on the value of the firstcmake_dependent_option(
MAKE_STATIC_LIBRARY "Compile sources into a static library" OFF
"USE_LIBRARY" ON
)# third option depends on the value of the firstcmake_dependent_option(
MAKE_SHARED_LIBRARY "Compile sources into a shared library" ON
"USE_LIBRARY" ON
)set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)# list sourceslist(APPEND _sources Message.hpp Message.cpp)if(USE_LIBRARY)message(STATUS "Compile sources into a STATIC library? ${MAKE_STATIC_LIBRARY}")message(STATUS "Compile sources into a SHARED library? ${MAKE_SHARED_LIBRARY}")if(MAKE_SHARED_LIBRARY)add_library(message SHARED ${_sources})add_executable(hello-world hello-world.cpp)target_link_libraries(hello-world message)endif()if(MAKE_STATIC_LIBRARY)add_library(message STATIC ${_sources})add_executable(hello-world hello-world.cpp)target_link_libraries(hello-world message)endif()else()add_executable(hello-world hello-world.cpp ${_sources})endif()#log1-- The CXX compiler identification is GNU 9.3.0-- Check for working CXX compiler:/usr/bin/c++-- Check for working CXX compiler:/usr/bin/c++-- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Compile sources into a library? OFF
-- Configuring done
-- Generating done
-- Build files have been written to:/home/jianleya/trainning/cmake/cmake/cmake-cookbook/cmake-cookbook
#log2-- The CXX compiler identification is GNU 9.3.0-- Check for working CXX compiler:/usr/bin/c++-- Check for working CXX compiler:/usr/bin/c++-- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Compile sources into a library? ON
-- Compile sources into a STATIC library? OFF
-- Compile sources into a SHARED library? ON
-- Configuring done
-- Generating done
-- Build files have been written to:/home/jianleya/trainning/cmake/cmake/cmake-cookbook/cmake-cookbook/chapter-01/recipe-05/cxx-example
Source flow control
# set build flags for each souce filecmake_minimum_required(VERSION 3.5 FATAL_ERROR)project(recipe-10 LANGUAGES CXX)add_library(geometry
STATIC
geometry_circle.cpp
geometry_circle.hpp
geometry_polygon.cpp
geometry_polygon.hpp
geometry_rhombus.cpp
geometry_rhombus.hpp
geometry_square.cpp
geometry_square.hpp
)# we wish to compile the library with the optimization flag: -O3target_compile_options(geometry
PRIVATE
-O3
)list(
APPEND sources_with_lower_optimization
geometry_circle.cpp
geometry_rhombus.cpp
)# we use the IN LISTS foreach syntax to set source propertiesmessage(STATUS "Setting source properties using IN LISTS syntax:")foreach(_source IN LISTS sources_with_lower_optimization)set_source_files_properties(${_source} PROPERTIES COMPILE_FLAGS -O2)message(STATUS "Appending -O2 flag for ${_source}")endforeach()# we demonstrate the plain foreach syntax to query source properties# which requires to expand the contents of the variablemessage(STATUS "Querying sources properties using plain syntax:")foreach(_source ${sources_with_lower_optimization})get_source_file_property(_flags ${_source} COMPILE_FLAGS)message(STATUS "Source ${_source} has the following extra COMPILE_FLAGS: ${_flags}")endforeach()add_executable(compute-areas compute-areas.cpp)target_link_libraries(compute-areas geometry)#log
$ cmake .-- The CXX compiler identification is GNU 9.3.0-- Check for working CXX compiler:/usr/bin/c++-- Check for working CXX compiler:/usr/bin/c++-- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Setting source properties using IN LISTS syntax:-- Appending -O2 flag for geometry_circle.cpp
-- Appending -O2 flag for geometry_rhombus.cpp
-- Querying sources properties using plain syntax:-- Source geometry_circle.cpp has the following extra COMPILE_FLAGS:-O2
-- Source geometry_rhombus.cpp has the following extra COMPILE_FLAGS:-O2
-- Configuring done
-- Generating done
-- Build files have been written to:/home/jianleya/trainning/cmake/cmake/cmake-cookbook/cmake-cookbook/chapter-01/recipe-10/cxx-example