cmake_minimum_required(VERSION 3.5 FATAL_ERROR)project(recipe-02 LANGUAGES NONE)find_package(PythonInterp REQUIRED)# this is set as variable to prepare# for abstraction using loops or functionsset(_module_name "cffi")execute_process(
COMMAND
${PYTHON_EXECUTABLE}"-c""import ${_module_name}; print(${_module_name}.__version__)"
OUTPUT_VARIABLE _stdout
ERROR_VARIABLE _stderr
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_STRIP_TRAILING_WHITESPACE
)if(_stderr MATCHES "ModuleNotFoundError")message(STATUS "Module ${_module_name} not found")else()message(STATUS "Found module ${_module_name} v${_stdout}")endif()
$ cmake .-- Found PythonInterp:/usr/bin/python3.8(found version "3.8.5")-- Module cffi not found
-- Configuring done
-- Generating done
-- Build files have been written to:/home/jianleya/trainning/cmake/cmake/cmake-cookbook/cmake-cookbook/chapter-05/recipe-02/example
build time command
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)project(recipe-03 LANGUAGES CXX)set(CMAKE_CXX_STANDARD 11)set(CMAKE_CXX_EXTENSIONS OFF)set(CMAKE_CXX_STANDARD_REQUIRED ON)# we require Python for this recipe to workfind_package(PythonInterp QUIET REQUIRED)# generate directory where we place the generated codefile(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/generated)# upper boundset(MAX_NUMBER "100" CACHE STRING "Upper bound for primes")# generate codeadd_custom_command(
OUTPUT
${CMAKE_CURRENT_BINARY_DIR}/generated/primes.hpp
COMMAND
${PYTHON_EXECUTABLE} generate.py ${MAX_NUMBER} ${CMAKE_CURRENT_BINARY_DIR}/generated/primes.hpp
WORKING_DIRECTORY
${CMAKE_CURRENT_SOURCE_DIR}
DEPENDS
generate.py
)add_executable(example "")target_sources(example
PRIVATE
example.cpp
${CMAKE_CURRENT_BINARY_DIR}/generated/primes.hpp
)target_include_directories(example
PRIVATE
${CMAKE_CURRENT_BINARY_DIR}/generated
)
$ make
[33%] Generating generated/primes.hpp
Scanning dependencies of target example
[33%] Generating generated/primes.hpp
[66%] Building CXX object CMakeFiles/example.dir/example.cpp.o
[100%] Linking CXX executable example
[100%] Built target example
build time command for target
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)project(recipe-05 LANGUAGES Fortran)find_package(PythonInterp REQUIRED)# we default to Release build typeif(NOT CMAKE_BUILD_TYPE)set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)endif()add_executable(example "")target_sources(example
PRIVATE
example.f90
)add_custom_command(
TARGET
example
PRE_LINK
COMMAND
${PYTHON_EXECUTABLE}
${CMAKE_CURRENT_SOURCE_DIR}/echo-file.py
${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/example.dir/link.txt
COMMENT
"link line:"
VERBATIM
)add_custom_command(
TARGET
example
POST_BUILD
COMMAND
${PYTHON_EXECUTABLE}
${CMAKE_CURRENT_SOURCE_DIR}/static-size.py
$<TARGET_FILE:example>
COMMENT
"static size of executable:"
VERBATIM
)#log
$ make
Scanning dependencies of target example
[50%] Building Fortran object CMakeFiles/example.dir/example.f90.o
[100%] Linking Fortran executable example
link line:/usr/bin/f95 -O3 -DNDEBUG -O3 CMakeFiles/example.dir/example.f90.o -o example
static size of executable:160.003 MB
[100%] Built target example