CMake的对象输出文件夹变量

时间:2018-01-17 07:51:55

标签: cmake

“$ {PROJECT_BINARY_DIR} /CMakeFiles/project.dir/”,编译产生的地方对象文件将如何放置,可以是非硬编码的?

直截了当地解决这个问题,我们有一些测试可以检查harfbuzz cmake上编译产生的对象,我们使用硬编码字符串there但这似乎不对,我希望有些$ {}或$&lt ;>为此存在。

2 个答案:

答案 0 :(得分:2)

我担心你在这里运气不好。 CMake通过设计将其作为内部实现细节。

我说它不太可能改变,但是如果你想要完全面向未来,你可以使用一种解决方法,从目标文件中创建一个静态库,然后手动将其解压缩回目标文件(使用适当的归档/图书管理员)作为测试的一部分。如果目标文件也被另一个目标使用,并且链接到该静态库对该目标不起作用,则可以从文件中创建object library,然后在原始目标和for中使用它 - 测试静态库。

以下是如何实现此解决方法的示例:

add_library(MyObjectLib OBJECT src/a.cpp src/b.cpp)

add_executable(Main src/main.cpp $<TARGET_OBJECTS:MyObjectLib>)

add_library(LibForTesting STATIC $<TARGET_OBJECTS:MyObjectLib>)

add_test(
  NAME check-static-inits.sh
  COMMAND ${PROJECT_SOURCE_DIR}/src/prepare-and-check-static-inits.sh $<TARGET_FILE:LibForTesting>
)

以下是脚本prepare-and-check-static-inits.sh的样子(伪代码):

ar -x $1 -o some_dir
./check-static-inits.sh some_dir

答案 1 :(得分:2)

将我的评论转化为答案

目前没有变量或生成器表达式来获取用于链接存档或库目标的目标文件列表。

但您可以在任何程序/脚本中附加编译器/归档器/链接器调用,并在这些调用中使用CMake's expansion rules

注意:这只适用于CMake的Command-Line Build Tool Generatorslist(APPEND ...)来电后,project()来电只需在您的CMake代码中有一次。

<强>实施例

  1. 使用<OBJECT_DIR>

    生成指向<TARGET_NAME>的符号链接
    project(MyLib)
    
    list(
        APPEND CMAKE_CXX_ARCHIVE_FINISH 
            "\"${CMAKE_COMMAND}\" -E create_symlink \"<OBJECT_DIR>\" \"<TARGET_NAME>\""
    )
    
    [...]
    
    add_library(MyLib STATIC src/a.cpp src/b.cpp)
    
  2. 调用某个程序对<OBJECTS>列表执行某些操作(例如,回显或写入文件)

    project(MyExe)
    
    list(
        APPEND CMAKE_CXX_LINK_EXECUTABLE 
            "\"${CMAKE_COMMAND}\" -E echo \"<OBJECTS>\""
    )
    
    [...]
    
    add_executable(MyExe main.cpp)
    
  3. 在生成每个目标文件后直接执行某些操作。在您要为每个目标文件调用objdump的情况下,例如是:

    list(
        APPEND CMAKE_CXX_COMPILE_OBJECT
            "${CMAKE_OBJDUMP} -t \"<OBJECT>\" > $(notdir <OBJECT>.dump)"
    )
    

    不幸的是,“输出文件名”没有扩展规则,因此使用$(notdir ...)进行平台/制作特定技巧。

  4. <强>参考