2012-11-23 103 views
0

這裏是我的問題:我一直在使用Java進行多年,並享受有許多目錄分離代碼的不同區域。對於我目前的項目,我正在編寫Fortran代碼,它應該在Windows和Unix/Linux下編譯。對於Windows,我使用帶有MinGW/gfortran工具的Eclipse/Photran來設置Makefiles。makefile編譯在不同的目錄Fortran源文件

這裏是希望的項目結構(深度嵌套樹狀類似Java的會更好)

dir1/src/*.f95 
dir1/make/Makefile_lib1.any 
dir1/make/Makefile_lib1.win 
dir1/make/Makefile_lib1.unix 

dir2/src/*.f 
dir2/make/Makefile_lib2.any 
dir2/make/Makefile_lib2.win 
dir2/make/Makefile_lib2.unix 

... 

dir_main/src/*.f or *.f95 
dir_main/make/Makefile_main.any 
dir_main/make/Makefile_main.win 
dir_main/make/Makefile_main.unix 

我想打電話給make Makefile_main.unix,這將設立任何具體Unix的變量,然後包括Makefile_main.anyMakefile_lib1.any,...

(類似於製作在Windows上)

我到了階段,我可以看到在一個給定的目錄中的所有源文件,如

SRCS := $(wildcard $(SRC_DIR)/*.$(SRC_EXT)) 

現在我與如何使所有的依賴在Fortran 95的每個源產生*.o*.mod掙扎。

有沒有辦法編譯,這樣所有目標/依賴沒有在他們的名字DIR-路徑時目錄之間進行切換?請注意,我從Eclipse項目所在的其他服務目錄調用make。任何建議如何進行?

我真的不想與代碼一起做的僅具有一個目錄的常用的Fortran風格 所有的爛攤子。

+1

如果你有'dir2/src/foo.f',你想要'foo.o'和'foo.mod'去哪裏? 「區域」目錄之間是否存在任何依賴關係? – Beta

+4

有很多更好的方法去做我想你想做的事,其中不乏中的一些相關問題列出,並有可能獲得幾十個導遊只有很短的谷歌了。你使用fortran的事實是無關緊要的。一個可能有助於您搜索的詞是「遞歸」,就像「遞歸makefile」中一樣。 –

回答

0

有您可以採取兩種主要策略。

您可以將每個子目錄中生成文件,並將它支持像allclean等目標,然後使用遞歸從頂層Makefile使調用做出同樣的目標(例如all)在每一個子目錄。

或者,你可以處理這一切在一個化妝調用,非遞歸,但你必須包含子目錄名稱相對路徑工作。就我個人而言,我沒有看到它的問題,並且我基於這種方法維護了一個makefile系統。

這裏是你可以在你的情況做了什麼,假設SRC正確設置爲每一個需要編譯源相對路徑的列表。

# This replaces the SRC_EXT suffix with .o in each filename 
OBJ = $(SRC:%.$(SRC_EXT)=%.o) 

$(BINARY_NAME): $(OBJ) 
    ...link command... 

%.o: %.$(SRC_EXT) 
    ...compile command... 
相關問題