【问题标题】:cmake generator expression for runtime output directory运行时输出目录的 cmake 生成器表达式
【发布时间】:2015-08-04 19:08:11
【问题描述】:

CMAKE_RUNTIME_OUTPUT_DIRECTORY 是否有生成器表达式?

我想将一个目录复制到运行时输出目录,我目前这样做是这样的:

 add_custom_target(copy_target ALL)
 add_custom_command(TARGET copy_target POST_BUILD
  COMMAND ${CMAKE_COMMAND} -E copy_directory
      ${CMAKE_CURRENT_SOURCE_DIR}/foo
      $<TARGET_FILE_DIR:other_target>/foo)

仅复制到 CMAKE_RUNTIME_OUTPUT_DIRECTORY 不适用于为每个配置创建子目录的多配置生成器(Visual Studio、XCode)。

上面的示例有效,但它在other_target 上创建了copy_target 的不必要依赖。我更喜欢${CMAKE_RUNTIME_OUTPUT_DIRECTORY_$&lt;CONFIG&gt;} 之类的东西,但这不被接受(出乎意料的&lt;)。此外,该解决方案也应该适用于单一配置生成器,${CMAKE_RUNTIME_OUTPUT_DIRECTORY_$&lt;CONFIG&gt;} 可能不会。

$&lt;TARGET_FILE_DIR:copy_target&gt; 也不起作用,因为copy_target 是一个虚拟对象,而不是二进制文件。

【问题讨论】:

    标签: cmake cross-platform


    【解决方案1】:

    变量CMAKE_CFG_INTDIR 可能会有所帮助,例如:

    add_custom_command(TARGET copy_target POST_BUILD
      COMMAND ${CMAKE_COMMAND} -E copy_directory
          ${CMAKE_CURRENT_SOURCE_DIR}/foo
          ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${CMAKE_CFG_INTDIR}/foo)
    

    【讨论】:

      【解决方案2】:

      我看到 sakra 回答了您的问题,但对于您的具体问题,我没有更好的答案。但我确实有一个建议来简化多配置构建(对于 Visual Studio)和单配置构建(对于 Linux makefile)的使用。我喜欢将输出目录折叠成一个平面结构,所有配置工件都具有唯一的后缀,因此它们不会发生冲突。我使用以下init_output_directories 宏来执行此操作:

      # initialize the variables defining output directories
      #
      # Sets the following variables:
      #
      # - :cmake:data:`CMAKE_ARCHIVE_OUTPUT_DIRECTORY`
      # - :cmake:data:`CMAKE_LIBRARY_OUTPUT_DIRECTORY`
      # - :cmake:data:`CMAKE_RUNTIME_OUTPUT_DIRECTORY`
      #
      # plus the per-config variants, ``*_$<CONFIG>``
      #
      # @public
      #
      macro(init_output_directories)
      
        # Directory for output files
        set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib 
          CACHE PATH "Output directory for static libraries.")
      
        set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib
          CACHE PATH "Output directory for shared libraries.")
      
        set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
          CACHE PATH "Output directory for executables and DLL's.")
      
        foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} )
          string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG )
          set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} "${CMAKE_BINARY_DIR}/bin" CACHE PATH "" FORCE)
          set( CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} "${CMAKE_BINARY_DIR}/lib" CACHE PATH "" FORCE)
          set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} "${CMAKE_BINARY_DIR}/lib" CACHE PATH "" FORCE)
        endforeach()
      
      endmacro()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-27
        • 2015-01-25
        • 1970-01-01
        • 2021-03-10
        • 1970-01-01
        相关资源
        最近更新 更多