免责声明:我是个新手。
我有以下cmakelists.txt文件:
cmake_minimum_required( VERSION 2.8.10.2 )
project( widget )
# gleaned from the original makefile
add_definitions( -DPJ_IS_BIG_ENDIAN=0 )
add_definitions( -DPJ_IS_LITTLE_ENDIAN=1 )
add_definitions( -DPJ_AUTOCONF=1 )
SET ( SRC_PATH ${CMAKE_CURRENT_SOURCE_DIR}/src/pj )
SET ( sources ${SRC_PATH}/addr_resolv_sock.c
${SRC_PATH}/file_access_unistd.c
${SRC_PATH}/file_io_ansi.c
${SRC_PATH}/guid_simple.c
${SRC_PATH}/log_writer_stdout.c
${SRC_PATH}/os_core_unix.c
${SRC_PATH}/os_error_unix.c
${SRC_PATH}/os_time_unix.c
${SRC_PATH}/os_timestamp_common.c
${SRC_PATH}/os_timestamp_posix.c
${SRC_PATH}/pool_policy_malloc.c
${SRC_PATH}/sock_bsd.c
${SRC_PATH}/sock_select.c
)
SET( outpath ${CMAKE_CURRENT_LIST_DIR} "/lib/" )
message(" outpath = " ${outpath} )
include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/include )
add_library( pj ${sources} )
ADD_CUSTOM_COMMAND( TARGET pj POST_BUILD
COMMAND ${CMAKE_COMMAND} -E echo "what now?"
COMMAND ${CMAKE_COMMAND} -E copy libpj.a "$outpath"
)
由于某些原因,copy命令中
$outpath
的值被忽略。如果我输入一个硬编码字符串,例如“bubba”,它就可以工作。如果我将$outpath
设置为“bubba”,它将不起作用。我已经尝试了所有已知的变化在
$outpath
--${outpath}
,"$outpath"
,"${outpath}"
。但没用。
这(对你)一定很明显,但我看不出来。
感谢大家的帮助!
:血压:
最佳答案
第一个问题是outpath
的值。您应该避免在set
命令中留下空格,因为这会将该值解释为两个单独的条目,第一个条目是${CMAKE_CURRENT_LIST_DIR}
,第二个条目是/lib/
。
另一个问题是使用add_custom_command
。你应该喜欢在这里使用“生成器表达式”。从文档中:
命令的参数可以使用语法为“$”的“生成器表达式”。生成器表达式在生成生成系统期间求值,以生成特定于每个生成配置的信息。
此外,如果目标是目录(在本例中是目录),则需要在调用cmake -E copy
之前创建“/lib”目录。
最后,一个小的优化是使用cmake -E copy_if_different
而不是copy
。
所以总结一下,你需要做一些类似的事情:
set( outpath "${CMAKE_CURRENT_LIST_DIR}/lib" )
...
add_custom_command( TARGET pj POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory ${outpath}
COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:pj> ${outpath}
)
关于linux - CMake忽略自定义命令中的变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16326927/