2017-05-10 57 views
0

我爲每個狀態創建軟件。有一些特定於狀態的代碼,以及在所有狀態上運行的一些通用代碼。 我已經創建了以下目錄結構:不止一次使用cmake add_subdirectories與[binary_dir]

common 
     foo 
      CMakeLists.txt 
     bar 
      CMakeLists.txt 
    State 
     AL 
      bin 
      src 
       build 
       CMakeLists.txt 
       DMV 
        CMakeLists.txt    
       ABC 
        CMakeLists.txt 
     AK 
      bin 
      src 
       build 
       CMakeLists.txt 
       DMV 
        CMakeLists.txt 
       ABC 
        CMakeLists.txt 

CMakeList.txt在每個國家

set (COMMON "/home/me/common") 
add_subdirectory(${COMMON}/foo {STATE_BIN_DIR}) 
add_subdirectory(${COMMON}/bar {STATE_BIN_DIR}) 
add_subdirectory(${DMV) 

的CMakeLists.txt在DMV目錄(和ABC)

install(TARGETS dmv DESTINATION ${STATE_BIN_DIR}) 

的CMakeLists.txt在普通foo目錄(和欄)

install(TARGETS foo DESTINATION ${STATE_BIN_DIR}) 

cmake的錯誤:

The binary directory 
/home/me/State/AL/bin is already used to build a source directory. It cannot be used to build source directory 
/home/me/common/bar 
Specify a unique binary directory name. 

它工作正常,如果我只是在建設FOO。當我嘗試在目錄結構之外生成欄時,它會失敗。 我不明白的是,我所有的二進制文件(在狀態和普通情況下)都會進入州的bin目錄。

閱讀本: CMAKE add sub-directory which is not sub-directory on real directory

它說。「CMake的不能有兩個不同的源目錄映射到同一個build目錄」
但所有不同的來源(DMV,ABC)都會轉到垃圾箱。它在這裏工作。

的CMake的網站沒有明確規定 https://cmake.org/cmake/help/v3.0/command/add_subdirectory.html

有什麼解決辦法做我想做什麼? 我知道我可以在States目錄下創建foo和bar drirectory,只需將一個CMakeLisist.txt指向共同的代碼即可。
工作。但我想保留代碼的配方。

我想我也可以創建bin/foo和bin/bar來放入這些二進制文件。 但有些共享庫,我想在一個地方。

有什麼想法?

感謝

+0

'但是所有的不同的充源(DMV,ABC)都去斌。 - 你的意思是說,在給定的源碼目錄下創建的*可交付成果是**安裝到'bin'的?如果是這樣,這是不被禁止的。但是相同的目錄不能用於**構建**不同的源目錄。你無法克服這一點。 – Tsyvarev

+0

感謝您的回答。是的,可交付成果,而不是來源,對不起。我誤解了_binary_dir_的含義。我只是使用與外部源相同的目錄並且它工作。我在做什麼有什麼陷阱? –

+0

@TimEdwards你能解決這個問題嗎?我面臨着與Android項目相同的問題... – ahasbini

回答

0

我已經由二進制目錄中增加一個額外的子文件夾下解決了問題。它似乎不會導致我的構建任何問題,並且如果包含所有的二進制文件並且它已經做了,我已經檢查了最終的構建輸出(這是我的情況下的APK)。

在你的情況下,只需使用add_subdirectory()這樣:

add_subdirectory(${COMMON}/foo {STATE_BIN_DIR}/foo) 
add_subdirectory(${COMMON}/bar {STATE_BIN_DIR}/bar) 
... 

類似的解決方案可以在這裏找到詳細說明如下:link