Шахтерская яма cmake (1)

C++

[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 имеет весь приведенный выше код:мой гитхаб

Не ходи, обрати внимание на общественный номер