CMake是什么
- Cross Platform Make,一款优秀的工程构建工具
CMake与其他编译工具的对比
- autotools,配置繁琐(autoscan+autoconf+automake)
- CMake,效率比autotools块40%
- GCC --> Makefile --> CMake(autotools)
示例程序
sample1
include
|__base.h
lib
|__libbase.a
|__libbase.so
src
|__CMakeLists.txt
|__main
|__CMakeLists.txt
|__main.cpp
|__base
|__CMakeLists.txt
|__base.cpp
cmake_minimum_required(VERSION 3.8.0)
project( demo )
set (demo_VERSION_MAJOR 1)
set (demo_VERSION_MINOR 0)
MESSAGE(STATUS "PROJECT BINARY DIR: " ${PROJECT_BINARY_DIR})
MESSAGE(STATUS "PROJECT SOURCE DIR: " ${PROJECT_SOURCE_DIR})
set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_CXX_STANDARD 14)
add_compile_options(-std=c++11)
ADD_DEFINITIONS(-DLINUX)
SET(CMAKE_C_FILAGS "$ENV{CFLAGS} -O0 -Wall -g -ggdb")
SET(CMAKE_C_FLAGS_RELEASE "$ENV{CFLAGS} -O3 -Wall")
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
add_subdirectories( base )
add_subdirectories( main )
cmake_minimum_required(VERSION 3.8.0)
project( base )
set (base_VERSION_MAJOR 1)
set (base_VERSION_MINOR 0)
MESSAGE(STATUS "BINARY DIR: " ${CMAKE_BINARY_DIR})
MESSAGE(STATUS "SOURCE DIR: " ${CMAKE_SOURCE_DIR})
MESSAGE(STATUS "CURRENT BINARY DIR: " ${CMAKE_CURRENT_BINARY_DIR})
MESSAGE(STATUS "CURRENT SOURCE DIR: " ${CMAKE_CURRENT_SOURCE_DIR})
aux_source_directory(. DIR_SRCS)
set( DIR_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/base.cpp
...
)
include_directories(
${CMAKE_SOURCE_DIR}/include
)
set(LIBRARY_OUTPUT_PATH $(PROJECT_SOURCE_DIR)/lib)
add_library( base STATIC
${DIR_SRCS}
)
set(CMAKE_INSTALL_PREFIX /usr)
install(FILES include/base.h DESTINATION include)
install(TARGETS base ARCHIVE DESTINATION lib)
cmake_minimum_required(VERSION 3.8.0)
project( main )
set (main_VERSION_MAJOR 1)
set (main_VERSION_MINOR 0)
MESSAGE(STATUS "BINARY DIR: " ${CMAKE_BINARY_DIR})
MESSAGE(STATUS "SOURCE DIR: " ${CMAKE_SOURCE_DIR})
MESSAGE(STATUS "CURRENT BINARY DIR: " ${CMAKE_CURRENT_BINARY_DIR})
MESSAGE(STATUS "CURRENT SOURCE DIR: " ${CMAKE_CURRENT_SOURCE_DIR})
include (${CMAKE_ROOT}/Modules/CheckFunctionExists.cmake)
check_function_exists (pow HAVE_POW)
configure_file (
"${PROJECT_SOURCE_DIR}/config.h.in"
"${PROJECT_BINARY_DIR}/config.h"
)
if (NOT HAVE_POW)
include_directories ("${PROJECT_SOURCE_DIR}/math")
add_subdirectory (math)
set (EXTRA_LIBS ${EXTRA_LIBS} math)
endif (NOT HAVE_POW)
aux_source_directory(. DIR_SRCS)
set( DIR_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/main.cpp
...
)
include_directories(
${CMAKE_SOURCE_DIR}/include
)
link_directories(
${CMAKE_SOURCE_DIR}/lib
)
add_excutable( main
${DIR_SRCS}
)
target_link_libraries(
main
"base"
)
include (InstallRequiredSystemLibraries)
set (CPACK_RESOURCE_FILE_LICENSE
"${CMAKE_CURRENT_SOURCE_DIR}/License.txt")
set (CPACK_PACKAGE_VERSION_MAJOR "${main_VERSION_MAJOR}")
set (CPACK_PACKAGE_VERSION_MINOR "${main_VERSION_MINOR}")
include (CPack)
enable_testing()
add_test (test_run main 5 2)
add_test (test_usage main)
set_tests_properties (test_usage
PROPERTIES PASS_REGULAR_EXPRESSION "Usage: .* base exponent")
macro (do_test arg1 arg2 result)
add_test (test_${arg1}_${arg2} main ${arg1} ${arg2})
set_tests_properties (test_${arg1}_${arg2}
PROPERTIES PASS_REGULAR_EXPRESSION ${result})
endmacro (do_test)
do_test (5 2 "is 25")
do_test (10 5 "is 100000")
do_test (2 10 "is 1024")
mkdir build && cd build
cmake ..
make
./hello