CMake手冊的客套話總算說完了,開始進入正題。第一部分是CMake命令。命令就相當於命令行下操作系統提供的各種命令,重要性不言而喻;可以說,這些命令是CMake構建系統的骨架。CMake 2.8.3共有80條命令,分別是:add_custom_command, add_custom_target, add_definitions, add_dependencies, add_executable, add_library, add_subdirectory, add_test, aux_source_directory, break, build_command, cmake_minimum_required, cmake_policy, configure_file, create_test_sourcelist, define_property, else, elseif, enable_language, enable_testing, endforeach, endfunction, endif, endmacro, endwhile, execute_process, export, file, find_file, find_library, find_package, find_path, find_program, fltk_wrap_ui, foreach, function, get_cmake_property, get_directory_property, get_filename_component, get_property, get_source_file_property, get_target_property, get_test_property, if, include, include_directories, include_external_msproject, include_regular_expression, install, link_directories, list, load_cache, load_command, macro, mark_as_advanced, math, message, option, output_required_files, project, qt_wrap_cpp, qt_wrap_ui, remove_definitions, return, separate_arguments, set, set_directory_properties, set_property, set_source_files_properties, set_target_properties, set_tests_properties, site_name, source_group, string, target_link_libraries, try_compile, try_run, unset, variable_watch, while。這些命令在手冊中是字典序排列的;為了便於查找,翻譯也按照字典序來組織。但是在翻譯結束后,會對命令進行小結,與大家討論一下這些命令的使用方法和使用時機。
==================================================================
CMD#1 : add_custom_command
為生成的構建系統添加一條自定義的構建規則。
add_custom_command命令
有兩種主要的功能;第一種是為了生成輸出文件,添加一條自定義命令。
add_custom_command(OUTPUT output1 [output2 ...]
COMMAND command1 [ARGS] [args1...]
[COMMAND command2 [ARGS] [args2...] ...]
[MAIN_DEPENDENCY depend]
[DEPENDS [depends...]]
[IMPLICIT_DEPENDS <lang1> depend1 ...]
[WORKING_DIRECTORY dir]
[COMMENT comment] [VERBATIM] [APPEND])
這種命令格式定義了一條生成指定的文件(文件組)的生成命令。在相同路徑下創建的目標(CMakeLists.txt文件)——任何自定義命令的輸出都作為它的源文件——被設置了一條規則:在構建的時候,使用指定的命令來生成這些文件。如果一個輸出文件名是相對路徑,它將被解釋成相對於構建樹路徑的相對路徑,並且與當前源碼路徑是對應的。注意,MAIN_DEPENDENCY完全是可選的,它用來向visual studio建議在何處停止自定義命令。對於各種類型的makefile而言,這條命令創建了一個格式如下的新目標:
OUTPUT: MAIN_DEPENDENCY DEPENDS
COMMAND
如果指定了多於一條的命令,它們會按順序執行。ARGS參數是可選的,它的存在是為了保持向后兼容,以后會被忽略掉。
第二種格式為一個目標——比如一個庫文件或者可執行文件——添加一條自定義命令。這種格式可以用於目標構建前或構建后的一些操作。這條命令會成為目標的一部分,並且只有目標被構建時才會執行。如果目標已經構建了,該目標將不會執行。
add_custom_command(TARGET target
PRE_BUILD | PRE_LINK | POST_BUILD
COMMAND command1 [ARGS] [args1...]
[COMMAND command2 [ARGS] [args2...] ...]
[WORKING_DIRECTORY dir]
[COMMENT comment] [VERBATIM])
這條命令定義了一個與指定目標的構建過程相關的新命令。新命令在何時執行,由下述的選項決定:
PRE_BUILD - 在所有其它的依賴之前執行;
PRE_LINK - 在所有其它的依賴之后執行;
POST_BUILD - 在目標被構建之后執行;
注意,只有Visual Studio 7或更高的版本才支持PRE_BUILD。對於其他的生成器,PRE_BUILD會被當做PRE_LINK來對待。
如果指定了WORKING_DIRECTORY選項,這條命令會在給定的路徑下執行。如果設置了COMMENT選項,后跟的參數會在構建時、以構建信息的形式、在命令執行之前顯示出來。如果指定了APPEND選項,COMMAND以及DEPENDS選項的值會附加到第一個輸出文件的自定義命令上。在此之前,必須有一次以相同的輸出文件作為參數的對該命令的調用。在當前版本下,如果指定了APPEND選項,COMMENT, WORKING_DIRECTORY和MAIN_DEPENDENCY選項會被忽略掉,不過未來有可能會用到。
如果指定了VERBATIM選項,所有該命令的參數將會合適地被轉義,以便構建工具能夠以原汁原味的參數去調用那些構建命令。注意,在add_custom_command能看到這些參數之前,CMake語言處理器會對這些參數做一層轉義處理。推薦使用VERBATIM參數,因為它能夠保證正確的行為。當VERBATIM未指定時,CMake的行為依賴於平台,因為CMake沒有針對某一種工具的特殊字符采取保護措施。
如果自定義命令的輸出並不是實際的磁盤文件,應該使用SET_SOURCE_FILES_PROPERTIES命令將該輸出的屬性標記為SYMBOLIC。
IMPLICIT_DEPENDS選項請求掃描一個輸入文件的隱含依賴關系。給定的語言參數(文中的lang1—譯注)指定了應該使用哪種編程語言的依賴掃描器。目前為止,僅支持C和CXX語言掃描器。掃描中發現的依賴文件將會在編譯時添加到自定義命令中。注意,IMPLICIT_DEPENDS選項目前僅僅直至Makefile生成器,其它的生成器會忽略之。
如果COMMAND選項指定了一個可執行目標(由ADD_EXECUTABLE命令創建的目標),在構建時,它會自動被可執行文件的位置所替換。而且,一個目標級的依賴性將會被添加進去,這樣這個可執行目標將會在所有依賴於該自定義命令的結果的目標之前被構建。不過,任何時候重編譯這個可執行文件,這種特性並不會引入一個會引起自定義命令重新運行的文件級依賴。
DEPENDS選項指定了該命令依賴的文件。如果依賴的對象是同一目錄(CMakeLists.txt文件)下另外一個自定義命令的輸出,CMake會自動將其它自定義命令帶到這個命令中來。如果DEPENDS指定了任何類型的目標(由ADD_*命令創建),一個目標級的依賴性將會被創建,以保證該目標在任何其它目標使用這個自定義命令的輸出之前,該目標已經被創建了。而且,如果該目標是可執行文件或庫文件,一個文件級依賴將會被創建,用來引發自定義命令在目標被重編譯時的重新運行。
=======================================================
在Unix Makefile中,這條命令相當於增加了一個依賴關系和一條顯式生成命令。