2016-11-29 48 views
0

有没有办法摆脱目标在Visual Studio中的CMake Rules文件夹?摆脱CMake规则文件夹

solution explorer

在这种情况下game目标使用cotire预编译头支持和omg目标具有解析.mix文件并输出..._gen.h文件的自定义命令。

也有可能从那里删除CMakeLists.txt文件吗?我知道这是为了方便,但在我的工作流程中并没有那么有用。

编辑:开始第二个赏金,因为我真的需要这个 - 这些“CMake规则”文件夹膨胀我的解决方案资源管理器,因为我有100多个项目都有它们!

我会接受任何东西 - 一个CMake的方式,VS方式(一些“解决方案资源管理器视图”或宏观或其他)...

编辑2:

这里是排序的cmake的用于omg目标:

add_library(omg SHARED D:/omg.cpp D:/omg.mix) 
add_custom_command(OUTPUT D:/omg_gen.h MAIN_DEPENDENCY D:/omg.mix COMMAND python D:/mixify.py D:/omg.mix D:/omg_gen.h) 
add_custom_target(${target}_gen_${mix_name_only} DEPENDS ${gen_header}) 
add_dependencies(omg omg_gen) 
target_sources(omg PUBLIC D:/omg_gen.h) 

所以omg_gen.homg.mix产生,然后包括在omg.cpp

+0

的CMakeLists.txt由CMake的需要,该文件包含所有的CMake将执行的东西。希望它们被删除,就像问你可以摆脱所有的C++源文件。 – usr1234567

+0

@ usr1234567 ok - 不删除CMakeLists.txt使得感觉。但是''CMake Rules'''文件夹怎么样? – onqtam

+0

@ usr1234567我确实使用out-of-source构建。问题是我的目标有附加的自定义命令,因此这些CMake_Rules文件夹会在解决方案资源管理器中弹出。而且我有数百个这样的目标(解决方案中的项目),我的解决方案资源管理器臃肿,我不想看到的东西。 – onqtam

回答

2

CMake需要.rule文件将自定义命令附加到某些“虚拟”自生文件,如果没有给出输入文件的话。当您查看有问题的Visual Studio项目的.rule文件属性时,您可以看到此内容(请参阅Custom Build Tool/General/Command Line)。

如果您没有更改包含这些目标的CMake脚本代码,则无法删除它们。

您只能将它们移动到项目的根源文件夹或您指定的任何其他文件夹中。

我已经成功地测试了以下例子:

cmake_minimum_required(VERSION 2.8) 
project(NoRulesSourceGroup NONE) 

# Overwrite the rule for "CMake Rules" with do-not-match-anything (-> root) 
source_group("CMake Rules" REGULAR_EXPRESSION "^$") 

# Move ".rule" files somewhere else 
source_group("Some Other Source Group" REGULAR_EXPRESSION "\\.rule$") 

add_custom_target(
    ${PROJECT_NAME} 
    COMMAND ${CMAKE_COMMAND} -E echo "Hello World" 
) 

编辑:您还可以用火柴结合上述正则表达式为CMakeLists.txt

source_group("Some Other Source Group" REGULAR_EXPRESSION "CMakeLists\\.txt|\\.rule$") 

编辑:如果你可以修改CMake的脚本代码,您应该添加到您的通话add_custom_command()

MAIN_DEPENDENCY 

指定主输入源文件的命令。这与对DEPENDS选项给出的任何值一样,但也向Visual Studio生成器建议在哪里挂起自定义命令。至多有一个自定义命令可以指定给定的源文件作为其主要依赖项。

在你的情况下,你甚至不需要额外的自定义目标,因为你有一个依赖通过头文件。我已经成功地测试了从你的问题的示例以下导出:

file(WRITE omg.cpp "") 
file(WRITE omg.mix "") 

add_library(omg SHARED omg.cpp omg.mix) 
add_custom_command(
    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/omg_gen.h 
    MAIN_DEPENDENCY omg.mix 
    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/omg.mix ${CMAKE_CURRENT_BINARY_DIR}/omg_gen.h 
) 
target_sources(omg PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/omg_gen.h) 

参考

+0

感谢您的解释。 我试图把''''.rule'''文件和''''CMakeLists.txt'''文件放在同一''Some Other Source Group“'''文件夹中,但它没有工作 - 只有规则进入了它。 当我试图把''''.rule'''文件和'''CMakeLists.txt''放在单独的文件夹中时,它就起作用了。 无论如何... 我应该如何添加一个输入到我的自定义命令,所以没有'''.rule'''文件开始?我已经使用过'''OUTPUT''' /'''DEPENDS''' /''COMMAND''' /'''COMMENT''' - 也许我需要使用'''MAIN_DEPENDENCY'''? OMG! – onqtam

+0

使用'''MAIN_DEPENDENCY'''而不是'''DEPENDS'''去掉''''.rule'''文件! OMG谢谢! 所以没有办法隐藏或删除'''CMakeLists.txt'''文件... 你得到赏金。但只是一个侧面的问题 - 你知道一种方法来隐藏VS放在每个项目中的'''References''' thingie吗?这不是CMake特定的... – onqtam

+0

@onqtam不客气。如果您可以添加一些CMake代码示例,其中包含例如'omg'目标,我可以从我这边添加一个提案。是的,我的意思是'MAIN_DEPENDENCY'来声明CMake可以添加'COMMAND'的输入文件。你可以添加你试图将'CMakeLists.txt'放入源组吗?您是否尝试在有问题的'source_group()'调用中使用绝对路径或正则表达式? – Florian