[TOC]
add_custom_command
add_custom_command(OUTPUT output1 [output2 ...]
COMMAND command1 [ARGS] [args1...]
[COMMAND command2 [ARGS] [args2...] ...]
[MAIN_DEPENDENCY depend]
[DEPENDS [depends...]]
[BYPRODUCTS [files...]]
[IMPLICIT_DEPENDS <lang1> depend1
[<lang2> depend2] ...]
[WORKING_DIRECTORY dir]
[COMMENT comment]
[DEPFILE depfile]
[VERBATIM] [APPEND] [USES_TERMINAL])
почему мойadd_custom_command
не реализована?
пример
LIST(APPEND SOURCE app_head.pb.c)
# 这里的OUTPUT 必须和add_executable 中的源一致,或者这里可以是绝对路径,底下可以是文件名称
add_custom_command(OUTPUT ${CMAKE_SOURCE_DIR}/${SOURCE}
COMMAND ls -al
COMMENT "h -----------------------"
)
# 此处的源文件必须和add_custom_command 中的一致才可以在编译的时候去执行add_custom_command中的命令
add_executable(ttt ${CMAKE_SOURCE_DIR}/${SOURCE})
Ниже приведены две непротиворечивые и непротиворечивые печатные сведения.
//这是两边一致的输出
Scanning dependencies of target ttt
[ 71%] h -----------------------
总用量 48
drwxr-xr-x 3 txz txz 4096 8月 26 20:16 .
drwxr-xr-x 3 txz txz 4096 8月 24 14:38 ..
-rw-r--r-- 1 txz txz 11609 8月 26 20:16 CMakeCache.txt
drwxr-xr-x 8 txz txz 4096 8月 26 20:16 CMakeFiles
-rw-r--r-- 1 txz txz 1371 8月 26 20:16 cmake_install.cmake
-rw-r--r-- 1 txz txz 7879 8月 26 20:16 Makefile
-rwxr-xr-x 1 txz txz 8808 8月 26 20:16 t5
[ 85%] Building C object CMakeFiles/ttt.dir/app_head.pb.c.o
cc: error: /home/txz/test/testCMake/t5/app_head.pb.c: 没有那个文件或目录
cc: fatal error: no input files
//这是两边一致的输出add_custom_command 为短路径,SOURCE 为绝对路径
-- Configuring done
CMake Error at CMakeLists.txt:30 (add_executable):
Cannot find source file:
/home/txz/test/testCMake/t5/app_head.pb.c
Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp
.hxx .in .txx
CMake Error: CMake can not determine linker language for target: ttt
CMake Error: Cannot determine link language for target "ttt".
-- Generating done
-- Build files have been written to: /home/txz/test/testCMake/t5/build
кейс
Почему мой метод сообщаетUnknown type of argument
ошибка
LIST(append SOURCE app_head.pb.c)
# 注意output为小写
add_custom_command(output ${CMAKE_SOURCE_DIR}/${SOURCE}
COMMAND ls -al
COMMENT "h -----------------------"
)
add_executable(ttt ${SOURCE})
Здесь объясняется, что имя метода не чувствительно к регистру, но внутреннийзарезервированное словоДолжен быть указан в документации какстолица
В противном случае будет сообщено об ошибке
CMake Error at CMakeLists.txt:26 (add_custom_command):
add_custom_command Wrong syntax. Unknown type of argument.
-- Configuring incomplete, errors occurred!
See also "/home/txz/test/testCMake/t5/build/CMakeFiles/CMakeOutput.log".
file
зачем использоватьfile(READ)
нельзя использоватьforeach
вывод каждой строки
# 通过STRINGS 来取值,可以组成list,如果是READ则是一陀一起返回
file(STRINGS tmp.txt out)
foreach(item ${out})
message(STATUS "xxx" ${item})
endforeach()
file(READ tmp.txt out_read)
foreach(item ${out_read})
message(STATUS "-----" ${item})
endforeach()
Ниже приведен вывод
xxxcpp/com/txz/music_manager/music_manager.pb.h
-- xxxtest
-- xxxtest1
-- -----cpp/com/txz/music_manager/music_manager.pb.h
test
test1
другой пример
execute_process(COMMAND find ${CMAKE_SOURCE_DIR} -name *.h
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
OUTPUT_FILE tmp1.txt
)
file(STRINGS tmp1.txt PROTO_HEADERS)
foreach(item ${PROTO_HEADERS})
message(STATUS ">>>>>>>>>>>>" ${item})
endforeach()
file(READ tmp1.txt read_file_content)
foreach(item ${read_file_content})
message(STATUS "<<<<<<<<<<<" ${item})
endforeach()
Ниже приведен вывод
-- >>>>>>>>>>>>/home/txz/test/testCMake/t5/b.h
-- >>>>>>>>>>>>/home/txz/test/testCMake/t5/a.h
-- <<<<<<<<<<</home/txz/test/testCMake/t5/b.h
/home/txz/test/testCMake/t5/a.h
Как печатать каждую строку, несколько строк вывода текста директивой
execute_process(COMMAND find ${CMAKE_SOURCE_DIR} -name *.h
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
OUTPUT_VARIABLE output_content
)
foreach(item ${output_content})
message(STATUS "++++++++" ${item})
endforeach()
Ниже приведен вывод [можно доказать, что все вышеперечисленное печатается за один раз, а не построчно]
-- ++++++++/home/txz/test/testCMake/t5/b.h
/home/txz/test/testCMake/t5/a.h
Решение: используйте метод из предыдущего примера, сначала распечатайте файл, а затем прочитайте каждую строку в файле [возможно, есть другие методы, которые следует изучить]
Вы можете видеть, что мой github имеет весь приведенный выше код:мой гитхаб