2012-07-04 46 views
2

大型項目可能具有多個級別深度的目錄。 Emacs的默認編譯命令是"make -k",如果我修改了某個源代碼,然後輸入"M-x compile RET RET",它將在源代碼所在的目錄下執行"make -k"在emacs中編譯大型項目

我想我可以編寫一個函數來確定Makefile是否存在於當前目錄下,如果是的話,在父目錄下繼續搜索直到找到頂層目錄,然後執行構建命令,就會像我期望的那樣。

但是,我不是很清楚如何開始,誰能給我一些提示啓動?就像我可能遇到的函數或變量一樣。謝謝。從emacs的http://emacswiki.org/emacs/CompileCommand

「C-H V編譯命令」 直接:

+1

雖然這不是一個回答你的問題,在這種情況下,我通常在頂級目錄下運行'M-X compile'一次,離開編譯緩存打開,只需要運行'M-X recompile'在後。編譯緩衝區停留在第一次使用的目錄中。 – legoscia

+0

是的,這不是壞主意:P – hero2008

回答

4

你可以嘗試使用類似:

(setq compile-command 
     '(let ((mf (locate-dominating-file default-directory "Makefile"))) 
     (if mf (setq mf (file-name-directory mf))) 
     (concat (if (and mf (not (equal mf default-directory))) 
        (format "cd %s; " 
          (shell-quote-argument 
           (file-relative-name 
           (directory-file-name mf))))) 
       "make -k "))) 
+0

看來你的編譯命令會檢查父目錄,但是,深度可能超過兩個,如果是的話,它不會工作。 – hero2008

3

中有果醬一個smarter-compile

從文檔....當您需要它時,您可以指定一個cons單元的列表,每個單元像(TEST . COMMAND)

命令用於compile-command當 測試成功。

測試可以:

  • 的字符串。在這種情況下,它被用作正則表達式, 並與關聯到 緩衝區的文件名匹配。當正則表達式匹配時,TEST成功。

  • 一個符號,代表主要模式​​。在這種情況下,如果緩衝區使用該主模式,則 成功。

  • 一個符號,表示名稱不是 以\「 - mode \」結尾的任何函數。在這種情況下,函數調用了 ,如果返回非零,則測試 成功。

  • 表單列表。在這種情況下,表單將被評估, ,如果返回值不爲零,則測試 成功。

所以你可以產生不掃描的父目錄, 生成文件的功能,並使用它作爲你的測試。

根據文檔,如果COMMAND爲零,那麼軟件包將使用TEST的結果作爲編譯命令。這意味着你只需要一個函數,在相應的目錄中返回一個引用makefile的make命令。

+0

這很有幫助,謝謝。 – hero2008

1

下面是一個爲喜歡bash腳本而不是Emacs Lisp的人提供的解決方案。在我的.emacs中,我定義了一個保存所有緩衝區並運行編譯項目的bash腳本的命令。

(defun save-all-and-compile() (interactive) 
(save-some-buffers 1) 
(shell-command "make-and-run.sh &")) 
(add-hook 'c-mode-common-hook (lambda() 
(local-set-key (kbd "<f5>") 'save-all-and-compile))) 

對於小型項目的腳本可以簡單到

#!/bin/bash 
make -j && ./<main> 

其中,「主要」是你的可執行文件的名稱。對於較大的項目,首先需要找到根目錄。同樣,你可以有不同的腳本(綁定不同的鍵)來構建和運行程序。然後再用一些腳本來測試項目的不同部分。但這些只是人們可以爲自己弄明白的細節。

確保腳本使用'&'異步運行。這樣,異步外殼命令緩衝區將打開與make和您的項目的輸出,並保持打開狀態。

編輯基於上述討論

下面似乎我已經初步overthought它和解決方案是非常簡單的。可以使用首先導航到項目根目錄和構建的shell腳本,而不是將通常的「make」或「make -k」傳遞給編譯命令。

(setq compile-command "script.sh") 
+1

如果編譯階段有錯誤怎麼辦?將編譯命令設置爲shell腳本可能會更好,但仍然使用compile而不是shell命令來編譯它。然後,您可以爲錯誤定義正則表達式 - 如果默認值不適合您的情況 - 例如按下*編譯*緩衝區中的錯誤,RET將跳轉到有問題的代碼。這是在emacs中編譯的主要好處。 – aap

+0

感謝您的建議。我對Emacs的經驗有限,並且仍在努力將其轉化爲理想的IDE。 –

+0

好的,我剛剛意識到你的意思。這個想法是在初始解決方案中簡單地用'compile'代替'shell-command',並丟失'&'。這確實好多了。 –