CMake忽略自定义命令中的变量

时间:2013-05-01 21:36:29

标签: linux cmake

免责声明:我是新手。

我有以下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" 
    )

由于某种原因,忽略了复制命令中$outpath的值。如果我输入一个硬编码的字符串,例如“bubba”,它就可以了。如果我将$outpath设置为“bubba”,则无效。

我已尝试$outpath上的所有已知变体 - ${outpath}"$outpath""${outpath}" ... 但没有工作。

这对你来说是显而易见的,但是我看不到它 所有帮助表示赞赏!

:沸点:

2 个答案:

答案 0 :(得分:1)

第一个问题是outpath的价值。您应该避免在set命令中留一个空格,因为这会将该值解释为两个单独的条目,第一个是${CMAKE_CURRENT_LIST_DIR},第二个是/lib/

另一个问题只是使用add_custom_command。你应该赞成在这里使用“生成器表达式”。来自文档:

  

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}
)

答案 1 :(得分:-1)

实际上并不直接回答忽略的变量问题,但是如果要定义输出,可能应该使用的是定义CMake变量LIBRARY_OUTPUT_PATHEXECUTABLE_OUTPUT_PATH或各个目标的相应属性目标的位置。