2010-01-26 48 views
20

我搜索了這個問題的答案,但找不到任何好處。也許他們已經老了,有什麼改變了,所以我再問一次。Automake生成二進制文件到bin /而不是在src/

我有一個目錄結構:

MY_PROJECT

  • SRC

我希望,當我做出的根目錄,二進制文件放在./bin中,而不是混亂的./src。但是如何?

編輯:我正在使用C++。我的Makefile.am沒有什麼特別的。只是bin_PROGRAM和_SOURCES變量。

當我運行make時,生成的二進制文件被放入./src。我只是想讓他們在./bin中。

+0

發佈你已經完成的(你的makefile),澄清你的目錄結構,然後它會更容易幫助(同時,你正在使用的編程語言可能是相關的) – KevinDTimm 2010-01-26 14:43:27

+0

您是否使用完整的Autotools堆棧?如果是這樣,就像@Braden提到的那樣,只需使用由Autoconf生成的configure腳本。 – Plamen 2014-09-03 16:17:34

+0

http:// stackoverflow。com/questions/1015700/autotools-library-and-object-file-output-control – 2016-02-20 20:45:36

回答

29

你在這裏有錯誤的想法。

您的構建樹就是您運行的任何地方configure。這就是autoconf設計的工作原理。您的軟件包用戶(不想混淆他們的源代碼樹)會期望它以這種方式工作。

這種方法是比你想象的機構更多的靈活性更通用的解決方案。例如,想要在單獨的文件系統上維護源文件和構建文件並不奇怪。

18

如果嘗試以不同於預期的方式設置目錄,Automake不能很好地應對。你想要的是編寫額外的規則,在編譯後將二進制文件移動到../bin,這是不必要的複雜。

如果你不想弄亂你的源代碼目錄,試試這個:

cd my_project 
mkdir build 
cd build 
../configure 
make 

這將會把所有生成的文件(如生成文件,二進制文件,目標文件)中的my_project/build子目錄。

+0

它可以工作,但是有點聚合。我可以做到,但如果其他人使用我的軟件呢?他們的./src雜亂無章。也許我可以簡單地將這些命令添加到Makefile的所有規則中? – 2010-01-28 02:48:55

+1

'configure'是生成makefiles的東西,所以你不能把這個命令放在makefile中。 我可以放心地說,大多數人並不在意他們的./src混亂,因爲Automake總是以這種方式工作。這是那些照顧病人的標準解決方案。如果他們更喜歡在同一個目錄中有二進制文件呢? 如果你仍然想按照自己的方式設置它,我認爲沒有放棄Automake的任何方式,儘管你仍然可以使用Autoconf。 – ptomato 2010-01-28 08:53:10

+2

另外,如果其他人使用你的軟件並看到它使用autoconf/automake,他們不會期望它在一個單獨的目錄中創建東西(除非他們通過運行configure,而不是像ptomato顯示的那樣安排它)。這只是GNU構建系統的哲學,而Autoconf/Automake是實現GNU構建系統的工具,而不是其他的。您可能需要查看Automake的介紹性章節,瞭解GNU構建系統的用戶典型用例:http://sources.redhat.com/automake/automake.html#Use-Cases – adl 2010-01-28 10:13:02

14

一種方式來告訴Automake的某個目錄創建二進制文件到該目錄中的「bin_PROGRAMS」變量添加正確的名稱。

考慮下面的src/Makefile.am:

bin_PROGRAMS = foo 
foo_SOURCES = ... 
foo_CPPFLAGS = ... 
foo_LDFLAGS = ... 

它創建了一個二進制 「的src/foo」 的,但你能告訴Automake的使用來源SRC創建一個二進制的 「斌/富」 :

bin_PROGRAMS = $(top_builddir)/bin/foo 
__top_builddir__bin_foo_SOURCES = ... 
__top_builddir__bin_foo_CPPFLAGS = ... 
__top_builddir__bin_foo_LDFLAGS = ... 

我有一些包嘗試過了,甚至「讓distcheck」吞下它。不能是那麼多的黑客,但...

+0

這是我認爲最好的解決方案。不完美,因爲編譯過程創建的所有.o和文件仍然在src中,但是... – 2010-02-10 02:13:58

+1

是否有任何移動*一切*構建與子文件夾相關,如構建/(包括對象文件,生成的文本文件,.desktop文件等),類似於我在Java世界中常見的例子,例如Maven。 – lanoxx 2013-12-05 10:01:29

+2

您可以嘗試從另一個文件夾執行配置腳本;例如,你可以創建一個「build」子文件夾,執行「cd build; ../configure; make」。這會使「構建」之外的所有內容都保持原樣並在「構建」內部生成所有文件,包括對象和二進制文件。 – 2013-12-05 13:59:25

相關問題