2012-03-02 67 views
2

我正在寫一個Ruby C擴展。我將在Windows和OSX下編譯它。如何根據操作系統控制從extconf.rb生成的輸出?

我一直無法解決的是控制makefile和所有其他生成文件的放置位置。

我的extconf.rb文件獲得了用於準備makefile的條件語句,具體取決於操作系統 - 所以我爲它們使用了一個。

我想,當我在OSX下編譯時,它被放置在一個osx文件夾中,並且在Windows下的一個win文件夾下相似以保持它們全部分開。

因爲它現在所有的文件都生成在我的源代碼相同的文件夾中。

(我很綠色C和編譯應用程序。對不起,如果我錯過了一些東西明顯。)

我可以寫一個批處理事後移動文件,但我覺得它更清潔,如果它可以期間進行代。

回答

1

我看着mkfm.rb的來源,發現如果你改變當前目錄Makefile是當前目錄。

Dir.chdir(OUTPUT_PATH) 
create_makefile(EXTENSION_NAME, SOURCE_PATH) 

OUTPUT_PATH中創建了makefile。正如你所看到的那樣,我不得不提供SOURCE_PATHcreate_makefile來說明Makefile與源文件不在同一位置的情況。

1

您可以在規則之前的makefile中添加一個條件。喜歡的東西:

OS := $(shell uname) 
ifeq ($(OS),Darwin) 
FOLDER := /some_path/osx_folder 
else 
FOLDER := /some_other_path/win_folder 
endif 

編輯:
FOLDER僅僅是一個變量;但要在Makefile以後使用,就像這樣:

$(FOLDER)/main: $(FOLDER)/main.o $(FOLDER)/foo.o 
    blah blah link $^ together to build [email protected] 

$(FOLDER)/%.o: $(SOURCE_DIRECTORY)/%.c 
    blah blah compile $< to build [email protected] 

(這是粗example--更優雅的解決方案是可能的,如果你有很多文件的處理。)

+0

這是記錄在哪裏?我一直在努力尋找extconf.rb配置的一個很好的概述。 – thomthom 2012-03-05 08:52:31

+0

@thomthom,UNIX uname,位於http://en.wikipedia.org/wiki/Uname,在http://www.gnu.org/software/make/manual/make.html#Conditionals處製作條件,我不喜歡不瞭解Ruby或'extconf.rb'。 – Beta 2012-03-05 13:28:44

+0

我對FOLDER有點困惑 - 是一個特殊的指令嗎?還是應該稍後在MAKE文件中使用它來定義文件的輸出位置? – thomthom 2012-03-06 12:29:05