2012-10-15 161 views
2

以下是我的項目的目錄結構:Makefile文件 - 編譯來回

     expt-main 
         --------- 
         Makefile_main 
        /   \ 
     subdir-1     subdir-2 
     --------     -------- 
     Makefile_1     Makefile_2 
     mod_codeA.f90    mod_code1.f90 
     mod_codeB.f90    mod_code2.f90 
     mod_codeC.f90    mod_code3.f90 

Makefile_main:

export 

SHELL = /bin/sh 

F90  = mpxlf95 

SRCDIRS = $(subdir-1) $(subdir-2) 

all: 
     @for DIR in ${SRCDIRS} ; 

      do \ 
      back=`pwd`; \ 
      cd $$DIR ;\ 
      $(MAKE) ; status=$$? ; \ 
      if [ $$status != 0 ] ; then \ 
       echo "Exit status fro make was $$status" ; exit $$status ; \ 
      fi ; \ 
      cd $$back ; \ 
     done 

------------------------------------------------------------------------------- 

Makefile-1: 

%.o: %.f90 
     $(F90) $(F90FLAGS) -I$(subdir-2) -c $< 

mod_codeA.o: mod_codeC.o $(subdir-2)/mod_code2.o 

------------------------------------------------------------------------------- 

Makefile-2: 

PROG = $(exec) 

subdir-1_objs = $(subdir-1)/mod_codeA.o mod_codeB.o mod_codeC.o 

all: $(PROG) 

$(PROG): $(subdir-2_objs) $(subdir-1_objs) -o [email protected] $(subdir-2_objs) $(subdir-1_objs) 

--------------------------------------------------------------------------------- 

-

我已經寫了Makefile_main使得它編譯首先在subdir-1中編碼(模塊),然後在subdir-2中編碼,然後生成可執行文件。問題:subdir-1中的模塊使用subdir-2中的模塊,並且以類似的方式使用,subdir-2中的模塊使用subdir-1中的模塊。由於正在使用的模塊位於其他目錄中,因此我的make失敗。如何編寫一個makefile來處理這個問題,即在編譯subdir-1中的模塊時,每當遇到需要來自subdir-2的目標文件時,它應該切換到subdir-2編譯必要的模塊並返回回到subdir-1進一步行動?

+0

糟糕!我刪除了舊的Qs的:(我希望我最近的Q給整個畫面:( – jkp

回答

2

如果您說的不同子目錄中的模塊需要彼此對應,那麼這對遞歸Make來說並不是很好用。

廢除Makefile-1Makefile-2,並讓Makefile_main做所有的工作。 (我不能告訴你具體如何改變Makefile-main,因爲我不做Fortran,我不明白Makefile-2,並且我沒有看到subdir-2中的模塊對subdir-1中的模塊的依賴)。

+0

感謝公測!兩個子目錄是我想根據邏輯交換機上集成了兩個不同的模型,因此,它不會是兩個子目錄組合成一個的清潔方式的生成文件-2: PROG = $(EXEC) 子目錄-1_objs = $(子目錄-1)/mod_codeA.o mod_codeB.o mod_codeC。Ø 所有:$(PROG) $(PROG):$(子目錄-2_objs)$(子目錄-1_objs)-o $ @ $(子目錄-2_objs)$(子目錄-1_objs) mod_code1 :mod_code3.o $(subdir-1)/mod_codeA.o ___________________________________________________________________ – jkp

+0

@jkp,你不必組合目錄。只需組合makefile即可。 – Beta

+0

謝謝Beta!閱讀Massimiliano建議的論文,瞭解你想說的話 – jkp

1

如果你想堅持到這個目錄佈局,仍然保持三個獨立的Makefile,那麼你可以使用編譯器標誌指示FORTRAN編譯器將模塊文件到你選擇的一個公共目錄。

例如使用:

$ gfortran --version 
GNU Fortran (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 
Copyright (C) 2011 Free Software Foundation, Inc. 

可以使用-I-J標誌指示編譯器:

  1. 哪裏搜索模塊文件(的.mod)
  2. 放在哪裏生成模塊文件

這就是我說的Beta給出的加入Makefiles的建議很有意義。要知道你應該這樣做的一些原因,你可以閱讀this paper

最後,由於您的項目在這個階段看起來不是很大,我還建議考慮CMake作爲構建系統,因爲它可能提供了一種更方便的方式來指定目標之間的依賴關係(以及許多其他事情)。

+0

@Beta&@ Massimiliamo:上面描述的目錄結構只是我項目的一個樣本。事實上這個項目非常龐大:subdir-1(200多個文件)和subdir-2(400多個文件)。其任務是將兩個建在不同中心的模型結合起來,因此它們有不同的規則(編譯器,編譯器和鏈接選項)用於構建。我將通讀論文,並且我正在研究Beta提供的建議。但最好是,我渴望擁有單獨的makefile。現在,我正在研究如何在1個目錄中創建所有代碼的軟鏈接,然後使用一個生成文件。 – jkp

+0

@Massimiliamo:你可以詳細說明你的靈魂的第一部分(...使用編譯器標誌...) – jkp

+0

@jkp你可以使用像'gfortran -I -J 規則... '。 '-I '告訴'gfortran'在''中尋找.mod,而'-J '告訴'gfortran'將.mod文件放在''中。 – Massimiliano