The optional keyword determines the type of message:
1 2 3 4 5 6 7 8 9 10
(none) =Important information STATUS=Incidental information WARNING=CMakeWarning, continue processing AUTHOR_WARNING=CMakeWarning (dev), continue processing SEND_ERROR=CMakeError, continue processing, but skip generation FATAL_ERROR=CMakeError, stop processing and generation DEPRECATION=CMakeDeprecationError or Warningif variable CMAKE_ERROR_DEPRECATED or CMAKE_WARN_DEPRECATED is enabled, respectively, else no message.
The CMake command-line tool displays STATUS messages on stdout and all other message types on stderr. The CMake GUI displays all messages in its log area. The interactive dialogs (ccmake and CMakeSetup) show STATUS messages one at a time on a status line and other messages in interactive pop-up boxes.
CMake Warning and Error message text displays using a simple markup language. Non-indented text is formatted in line-wrapped paragraphs delimited by newlines. Indented text is considered pre-formatted.
// A simple program that computes the square root of a number #include<stdio.h> #include<stdlib.h> #include<math.h> intmain(int argc, char *argv[]) { if (argc < 2) { fprintf(stdout,"Usage: %s number\n",argv[0]); return1; } double inputValue = atof(argv[1]); double outputValue = sqrt(inputValue); fprintf(stdout,"The square root of %g is %g\n", inputValue, outputValue); return0; }
cmake_minimum_required (VERSION 2.6) project (Tutorial) # The version number. set (Tutorial_VERSION_MAJOR 1) set (Tutorial_VERSION_MINOR 0)
# configure a header file to pass some of the CMake settings # to the source code configure_file ( "${PROJECT_SOURCE_DIR}/TutorialConfig.h.in" "${PROJECT_BINARY_DIR}/TutorialConfig.h" )
# add the binary tree to the search path for include files # so that we will find TutorialConfig.h include_directories("${PROJECT_BINARY_DIR}")
# add the executable add_executable(Tutorial tutorial.cxx)
从上面的内容可以看到我们需要的头文件在binary目录,所以我们需要把该目录包含进来。
接下来我们创建一个文件TutorialConfig.h.in,内容如下所示:
1 2 3
// the configured options and settings for Tutorial #define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@ #define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@
// A simple program that computes the square root of a number #include<stdio.h> #include<stdlib.h> #include<math.h> #include"TutorialConfig.h" #ifdef USE_MYMATH #include"MathFunctions.h" #endif
# does the application run add_test (TutorialRuns Tutorial 25)
# does it sqrt of 25 add_test (TutorialComp25 Tutorial 25) set_tests_properties (TutorialComp25 PROPERTIES PASS_REGULAR_EXPRESSION “25 is 5”)
# does it handle negative numbers add_test (TutorialNegative Tutorial -25) set_tests_properties (TutorialNegative PROPERTIES PASS_REGULAR_EXPRESSION “-25 is 0”)
# does it handle small numbers add_test (TutorialSmall Tutorial 0.0001) set_tests_properties (TutorialSmall PROPERTIES PASS_REGULAR_EXPRESSION “0.0001 is 0.01”)
# does the usage message work? add_test (TutorialUsage Tutorial) set_tests_properties (TutorialUsage PROPERTIES PASS_REGULAR_EXPRESSION “Usage:.*number”)
#define a macro to simplify adding tests, then use it macro (do_test arg result) add_test (TutorialComp${arg} Tutorial ${arg}) set_tests_properties (TutorialComp${arg} PROPERTIES PASS_REGULAR_EXPRESSION ${result}) endmacro (do_test) # do a bunch of result based tests do_test (25"25 is 5") do_test (-25"-25 is 0")
# does this system provide the log and exp functions? include (CheckFunctionExists) check_function_exists (log HAVE_LOG) check_function_exists (exp HAVE_EXP)
接下来我们通过修改TutorialConfig.h.in文件来定义CMake是否发现了这些值。
1 2 3
// does theplatform provide expandlog functions? #cmakedefine HAVE_LOG #cmakedefine HAVE_EXP
// if we have both log and exp then use them #if defined (HAVE_LOG) && defined (HAVE_EXP) result = exp(log(x)*0.5); #else// otherwise use an iterative approach . . .
// A simple program that builds a sqrt table #include<stdio.h> #include<stdlib.h> #include<math.h>
intmain(int argc, char *argv[]) { int i; double result;
// make sure we have enough arguments if (argc < 2) { return1; }
// open the output file FILE *fout = fopen(argv[1],"w"); if (!fout) { return1; }
// create a source file with a table of square roots fprintf(fout,"double sqrtTable[] = {\n"); for (i = 0; i < 10; ++i) { result = sqrt(static_cast<double>(i)); fprintf(fout,"%g,\n",result); }
// close the table with a zero fprintf(fout,"0};\n"); fclose(fout); return0; }
添加下面的几行命令来完成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
# first we add the executable that generates the table add_executable(MakeTable MakeTable.cpp)
# add the command to generate the source code add_custom_command ( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/Table.h COMMAND MakeTable ${CMAKE_CURRENT_BINARY_DIR}/Table.h DEPENDS MakeTable )
# add the binary tree directory to the search path for # include files include_directories( ${CMAKE_CURRENT_BINARY_DIR} )
# add the main library add_library(MathFunctions `mysqrt.cxx` ${CMAKE_CURRENT_BINARY_DIR}/Table.h )
# should we use our own math functions option(USE_MYMATH "Use tutorial provided math implementation"ON)
# configure a header file to pass some of the CMake settings # to the source code configure_file ( "${PROJECT_SOURCE_DIR}/TutorialConfig.h.in" "${PROJECT_BINARY_DIR}/TutorialConfig.h" )
# add the binary tree to the search path for include files # so that we will find TutorialConfig.h include_directories ("${PROJECT_BINARY_DIR}")
# add the MathFunctions library? if (USE_MYMATH) include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions") add_subdirectory (MathFunctions) set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions) endif (USE_MYMATH)
# add the executable add_executable (Tutorial tutorial.cxx) target_link_libraries (Tutorial ${EXTRA_LIBS})
# do a bunch of result based tests do_test (4"4 is 2") do_test (9"9 is 3") do_test (5"5 is 2.236") do_test (7"7 is 2.645") do_test (25"25 is 5") do_test (-25"-25 is 0") do_test (0.0001"0.0001 is 0.01")
文件TutorialConfig.h.in 如下所示:
1 2 3 4 5 6 7 8
// the configured options and settings for Tutorial #define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@ #define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@ #cmakedefine USE_MYMATH
// does the platform provide exp and log functions? #cmakedefine HAVE_LOG #cmakedefine HAVE_EXP
MathFunctions目录的文件CMakeLists.txt内容为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
# first we add the executable that generates the table add_executable(MakeTable MakeTable.cxx) # add the command to generate the source code add_custom_command ( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/Table.h DEPENDS MakeTable COMMAND MakeTable ${CMAKE_CURRENT_BINARY_DIR}/Table.h ) # add the binary tree directory to the search path # for include files include_directories( ${CMAKE_CURRENT_BINARY_DIR} )
# add the main library add_library(MathFunctions `mysqrt.cxx` ${CMAKE_CURRENT_BINARY_DIR}/Table.h)
# build a CPack driven installer package include (InstallRequiredSystemLibraries) set (CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/License.txt") set (CPACK_PACKAGE_VERSION_MAJOR "${Tutorial_VERSION_MAJOR}") set (CPACK_PACKAGE_VERSION_MINOR "${Tutorial_VERSION_MINOR}") include (CPack)
print'Process (%s) start...' % os.getpid() pid = os.fork() if pid==0: print'I am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid()) else: print'I (%s) just created a child process (%s).' % (os.getpid(), pid)
运行结果如下:
1 2 3
Process (876) start... I (876) just created a child process (877). I am child process (877) and my parent is 876.
if __name__=='__main__': print'Parent process %s.' % os.getpid() p = Pool() for i in range(5): p.apply_async(long_time_task, args=(i,)) print'Waiting for all subprocesses done...' p.close() p.join() print'All subprocesses done.'
执行结果如下:
1 2 3 4 5 6 7 8 9 10 11 12 13
Parent process 669. Waiting for all subprocesses done... Run task 0 (671)... Run task 1 (672)... Run task 2 (673)... Run task 3 (674)... Task2 runs 0.14 seconds. Run task 4 (673)... Task1 runs 0.27 seconds. Task3 runs 0.86 seconds. Task0 runs 1.41 seconds. Task4 runs 1.91 seconds. All subprocesses done.