2017-05-30 69 views
0

依赖我贡献了自定义功能自定义对象 - 说,我的功能 --to使用CMake和有独立的来源和生成目录的项目。 MyFeature由单个二进制文件组成。 (我的功能其实是一个自定义的Simulink库,所以我必须调用MATLAB来创建它 - 在这里,重要的是创建该对象不涉及GCC或CMake的默认使用其他标准的构建工具)。所以我有一个特殊的规则来建立对象 - 比方说myRule。我想使运行MyRule的只有(一)我的功能不存在,或(b)在其我的功能取决于一个源文件 - 比如,MYSOURCE --is比当前新 - 存在MyFeature。一个小补充皱纹是我唯一真正需要我的功能在源代码树,这是在MyRule的通常会将它。我怎样才能完成这一切?与CMake的

我不能使用任何add_executableadd_library,据我所知,因为他们是为你建立一个使用GCC(或其他已配置)工具链的对象狭隘设计。我不能使用add_custom_target,因为由此产生的目标是总是过时。到目前为止,我已经使用add_custom_targetadd_custom_command的组合取得了一些进展,具体如下:

add_custom_target(fakeTarget 
    DEPENDS MyFeature) 

add_custom_command(OUTPUT MyFeature 
    COMMAND myRule && touch ${CMAKE_CURRENT_BINARY_DIR}/MyFeature 
    DEPENDS mySource) 

add_dependencies(targetThatAlwaysRuns fakeTarget) 

建立在构建树空我的功能文件的命令似乎足以假化妆到不重建如果真正我的功能存在(在源代码树),它实现了我的目标之一。但是,一旦这种假文件存在,即使我更新MYSOURCE在源代码树,使不重建我的功能。这是我卡住的地方。这似乎令人费解尤其是因为我可以在CMakeFiles看到内脏有用于我的功能确实做列表MYSOURCE目标(用正确的路径 - 在源代码树)作为一个依赖。如果我尝试复制以更简单(玩具)这种情况下的Makefile在同一个目录,如果我刷新所述目标所依赖的源文件中的一个,即使目标输出文件已经存在,使会做正确的事情 - 它会从更新的源重建对象,然后重新构建整个目标。那么为什么这种情况下的构建行为不同?我能做些什么来实现目标(b)和目标(a)?谢谢!

+0

通过'add_custom_rule'假设您的意思是'add_custom_command',这个方法应该可以工作。尝试在* DEPENDS *和* OUTPUT *选项中使用绝对路径。 “额外的小皱纹是我真的只需要源树中的MyFeature” - 没有任何东西阻止你在源码树中创建文件。 – Tsyvarev

+0

哎呀!是的,我的意思是add_custom_command - 已经编辑来解决这个问题。没错,没有任何东西阻止我在源码树中创建文件;我正在解释我的黑客将一个空文件放入构建树的原因。 CMake _does_阻止我在源代码树中定义目标,因此,add_custom_command中的输出文件也不能位于源代码树中。 –

+0

在add_custom_command中将绝对路径添加到* DEPENDS *选项!谢谢! –

回答

0

由于Tsyvarev在他的评论中建议,所有我所要做的就是指定DEPENDS依赖绝对路径:

add_custom_target(fakeTarget 
    DEPENDS MyFeature) 

add_custom_command(OUTPUT MyFeature 
    COMMAND myRule && touch ${CMAKE_CURRENT_BINARY_DIR}/MyFeature 
    DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/mySource) 

add_dependencies(targetThatAlwaysRuns fakeTarget) 

不过,现在假设一个用户从删除的真正我的功能然后运行再次制作制作将不会再生MyFeature,因为假的MyFeature仍存在于构建树中。我怎样才能克服这个问题?