cmake之采坑(一)

3,034 阅读2分钟

[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 826 20:16 .
drwxr-xr-x 3 txz txz  4096 824 14:38 ..
-rw-r--r-- 1 txz txz 11609 826 20:16 CMakeCache.txt
drwxr-xr-x 8 txz txz  4096 826 20:16 CMakeFiles
-rw-r--r-- 1 txz txz  1371 826 20:16 cmake_install.cmake
-rw-r--r-- 1 txz txz  7879 826 20:16 Makefile
-rwxr-xr-x 1 txz txz  8808 826 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有我上面的所有代码:我的github

别走,关注公众号呗