1

免责声明:我是新手。

我有以下 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}"... 但没有一个工作。

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

:bp:

4

2 回答 2

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}
)
于 2013-05-01T22:33:19.287 回答
-1

实际上不是对被忽略的变量问题的直接答案,但如果您想定义目标的输出位置,也许您应该使用的是定义 CMake 变量LIBRARY_OUTPUT_PATHEXECUTABLE_OUTPUT_PATH或各个目标上的相应属性。

于 2013-05-01T21:58:58.960 回答