2015-10-05 49 views
4

我有不同的庫和可執行文件作爲我的層次結構中的子項目。他們大多數是守護進程。所以我有他們相應的cfg文件,這些應用程序在啓動時讀取。CMake安裝前後的一致配置文件路徑

我有兩個問題。

  1. 讓我們有一個簡單的方案:單個項目沒有層次結構。我必須使用/不使用install運行應用程序。所以,如果我把一個安裝指令,以保持cfg在/etc我可以得到一個恆定的cfg路徑。但在我不希望安裝的情況下。我想在執行make之後立即運行可執行文件。那麼如何管理cfg,這種方式可以使用/不使用install
  2. 接下來是我的場景,我有一個子項目的層次結構。監視器需要a.cfgb.cfg。所有cfg都分開保存在另一個子項目中。這個設計是否可用?我可以在這種情況下解決從a,bmonitor到cfg文件的路徑嗎?

但是我可以在monitor.cfg中包含include指令來包含a.cfg和b.cfg。但是,這歸結於同樣的問題。使用/不安裝時尋址cfg文件的路徑。

abcd 
    cfg       # configuration files 
     abcd     # to be copied to /etc/abcd on install 
      a.cfg    # configuration 
      b.cfg 
      monitor.cfg 
     includes/cfg 
     sources 
     -> libabcd-cfg.so  # target library that abstracts configurations as objects 
    components 
     a: cfg     # sub project a (requires abcd/a.cfg) 
      -> a    # target executable 
     b: cfg     # sub project b (requires abcd/b.cfg) 
      -> b    # target executable 
     monitor: cfg   # sub project monitor (requires abcd/a.cfg, b.cfg, monitor.cfg) 
      -> monitor   # target executable 

一個簡單的解決方案是將一組的全局搜索路徑在類似cfg/includes/cfg/defs.h,首先搜索在.,然後在/etc搜索。但是,保存在不同項目.中的配置文件將不起作用。

回答

1

前段時間我面臨類似的問題:我想在構建(沒有安裝)之後立即有項目可測試。據我所知,這個問題沒有共同的模式。可能的方法是:

  1. 從安裝樹構建一個內重現相對路徑。在這種情況下,可執行文件應該使用地址cfg文件的相對路徑。如果將所有可執行文件安裝到同一目錄中,則可以將變量CMAKE_RUNTIME_OUTPUT_DIRECTORY設置爲二叉樹內的某個目錄。所以所有的二進制文件都將在給定的目錄中生成。 (如果使用add_subdirectory()方法構建子項目,則在頂級項目中設置變量將影響所有子項目)。至於配置文件,可以使所有子項目使用相同的變量進行編譯:

    if(NOT DEFINED CFG_OUTPUT_DIRECTORY) 
        # Use in-subproject path by default. 
        set(CFG_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/cfg") 
    endif() 
    
    configure_file(a.cfg.in `${CFG_OUTPUT_DIRECTORY}`/a.cfg) 
    

    再次,在頂級項目設置等CFG_OUTPUT_DIRECTORY變量上子項目將影響。

  2. 使用可選環境變量指向cfg文件。因此,從構建樹運行的可執行程序,你可以把這個變量指向CFG文件構建樹中:

    A_CFG_PATH=${CMAKE_CURRENT_BINARY_DIR}/a.cfg a.exe <args> 
    

    (對於運行可執行文件安裝,你需要一點都設置環境變量)。

  3. 根本不支持從構建樹運行可執行文件。它從測試的意義上有理由:爲什麼我們要測試構建樹,而預期的用戶將使用安裝樹。