●project(TutorialVERSION1.0) ●configure_file(http://TutorialConfig.h.inTutorialConfig.h) ●TODO 10: TutorialConfig.h.in // the configured options and settings for Tutorial#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@ ●#include"TutorialConfig.h" if (argc < 2) { // report version std::cout << argv[0] << " Version " << Tutorial_VERSION_MAJOR << "." << Tutorial_VERSION_MINOR << std::endl; std::cout << "Usage: " << argv[0] << " number" << std::endl; return 1; }
2. 链接库
添加一个库
1 2 3 4
●add_library(MathFunctionshttp://mysqrt.cxx) ●add_subdirectory(MathFunctions) ●target_link_libraries(Tutorial PUBLIC MathFunctions) ●target_include_directories(Tutorial PUBLIC "${PROJECT_BINARY_DIR}" "${PROJECT_SOURCE_DIR}/MathFunctions")
●target_include_directories(MathFunctionsINTERFACE${CMAKE_CURRENT_SOURCE_DIR}) ●if(USE_MYMATH)add_subdirectory(MathFunctions)list(APPENDEXTRA_LIBSMathFunctions)endif() ●target_include_directories(Tutorial PUBLIC "${PROJECT_BINARY_DIR}")
●set(installable_libsMathFunctionstutorial_compiler_flags)install(TARGETS${installable_libs}DESTINATIONlib) ●install(FILESMathFunctions.hDESTINATIONinclude) ●install(TARGETSTutorialDESTINATIONbin ●install(FILES"${PROJECT_BINARY_DIR}/TutorialConfig.h"DESTINATIONinclude) ●enable_testing() ●add_test(NAMERunsCOMMANDTutorial25) ●add_test(NAMEUsageCOMMANDTutorial)set_tests_properties(UsagePROPERTIESPASS_REGULAR_EXPRESSION"Usage:.*number")\ ●add_test(NAMEStandardUseCOMMANDTutorial4)set_tests_properties(StandardUsePROPERTIESPASS_REGULAR_EXPRESSION"4 is 2") ●function(do_testtargetargresult)add_test(NAMEComp${arg}COMMAND${target}${arg})set_tests_properties(Comp${arg}PROPERTIESPASS_REGULAR_EXPRESSION${result})endfunction()# do a bunch of result based testsdo_test(Tutorial4"4 is 2")do_test(Tutorial9"9 is 3")do_test(Tutorial5"5 is 2.236")do_test(Tutorial7"7 is 2.645")do_test(Tutorial25"25 is 5")do_test(Tutorial-25"-25 is (-nan|nan|0)")do_test(Tutorial0.0001"0.0001 is 0.01")
●if(HAVE_LOG AND HAVE_EXP)target_compile_definitions(MathFunctionsPRIVATE"HAVE_LOG""HAVE_EXP")endif()
●#include<cmath> ●#if defined(HAVE_LOG) && defined(HAVE_EXP) double result = std::exp(std::log(x) * 0.5); std::cout << "Computing sqrt of " << x << " to be " << result << " using log and exp" << std::endl; #else double result = x;
9. 添加自定义命令及生成文件
1 2 3 4
●add_executable(MakeTablehttp://MakeTable.cxx) ●add_custom_command(OUTPUT${CMAKE_CURRENT_BINARY_DIR}/Table.hCOMMANDMakeTable${CMAKE_CURRENT_BINARY_DIR}/Table.hDEPENDSMakeTable) ●add_library(MathFunctionshttp://mysqrt.cxx${CMAKE_CURRENT_BINARY_DIR}/Table.h) ●target_include_directories(MathFunctionsINTERFACE${CMAKE_CURRENT_SOURCE_DIR}PRIVATE${CMAKE_CURRENT_BINARY_DIR})# link our compiler flags interface librarytarget_link_libraries(MathFunctionstutorial_compiler_flags)
# state that SqrtLibrary need PIC when the default is shared libraries set_target_properties(SqrtLibrary PROPERTIES POSITION_INDEPENDENT_CODE ${BUILD_SHARED_LIBS} )