2010-02-12 31 views
4

在我的項目中,系統中各種目錄,文件和其他組件的路徑數量存儲爲,這是filenames.h中的一個文件,它是所有需要它們的文件。它適用於編譯生成的所有各種二進制文件,但該項目還包含一些使用相同路徑的shell腳本。目前這意味着隨着路徑的變化,我所要做的就是編輯filenames.h並重新編譯以獲取可執行文件集以理解新路徑,但我必須手動編輯每個shell腳本。將C#定義爲shell變量

所以問題是,如何使#defines進入shell變量,例如生成一些filenames.sh腳本,該腳本可以從其他腳本調用來初始化它們。因此,例如:

#define TMP_PATH  "/ait/tmp/" 
#define SYNCTMZFILE TMP_PATH "sync_tmz" 

將創造

TMP_PATH="/ait/tmp/" 
SYNCTMZFILE="/ait/tmp/sync_tmz" 

當然,有可能寫一個ç程序創建它(甚至打印出來到標準輸出,然後在反引號執行它在外殼中),但我更喜歡更簡單,更強大的方法,比如說,編寫一個類似half-C的半殼,通過cpp就可以創建正確的輸出,或者類似的東西。

回答

1

把這個在你的Makefile:

filenames.sh: filenames.h 
     awk '/^#define/{print;printf "_%s=%s\n",$2,$2}' $< \ 
     | cpp -P \ 
     | sed 's/^_//;s/" "//;' > [email protected] 
+0

不幸的是,它在第​​二個#define中沒有很好的複合語句。 –

+0

我編輯的答案應該更好。 – mouviciel

1

反過來 - 將master作爲shell腳本並從中生成標題 - 會更容易。如果您的頭文件非常風格化,則可以編寫一個shell腳本(或使用awk/sed/perl/...)來解析它並生成shell片段。

0

如果你建立一個使用make您的程序和Shell腳本由make作爲構建過程的一部分執行的,你可以把它周圍:

  • 單一來源變量在您的Makefile
  • 將它們導出到shell腳本的環境中。
  • 將它們作爲命令行選項傳遞給C編譯器。 (這裏假設你的編譯器支持類似的-D parameter什麼的。)

例(未經測試):

export TMP_PATH := /ait/tmp/ 
export SYNCTMZFILE := $(TMP_PATH)sync_tmz 
CFLAGS += -DTMP_PATH="$(TMP_PATH)" -DSYNCTMZFILE="$(SYNCTMZFILE)" 

如果不使用make,該-D選項仍然可能對您有用:你可以在shell腳本中而不是在頭文件中單一來源變量。

+0

這樣的CFLAGS可能不會在路徑更改時重建對象以進行增量編譯。取決於makefile。也許最好從Make或者它調用的腳本生成一個C頭文件。 – blueshift