2016-11-29 50 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