我有以下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}"
...
但没有工作。
这对你来说是显而易见的,但是我看不到它 所有帮助表示赞赏!
:沸点:
答案 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_PATH和EXECUTABLE_OUTPUT_PATH或各个目标的相应属性目标的位置。