2016-05-10 11 views
2

私は、cとfortranコードが混在する静的ライブラリを構築しようとしています。 Fortranファイルをビルドするとき、私はFortranファイルごとにこのエラーを受け取りますが、cファイルは受け取りません。循環依存関係がなくなりました:make、fortran、cビルディングスタティックライブラリ

make: Circular file0.F90 <- file0.F90.o dependency dropped. 
mpif90 -c -O2 -o "file0.F90.o" "file0.F90" 

私が使用しているMakefileは以下のとおりです。私のF90ファイルのルールはcファイルのルールと同じなので、なぜこの動作が必要なのか分かりません。

CC = mpicc 
FC = mpif90 

TARGET=libpxn 
FCFLAGS = -O2 -fPIC 
CFLAGS  = -O2 -fPIC -lm -Wall 
CPPFLAGS = $(CFLAGS) 

SRCS = $(wildcard *.F90) $(wildcard *.c) 
OBJS = $(patsubst %, %.o, $(SRCS)) 

# Rules 
all: static 

static: $(OBJS) 
    ar rcs $(TARGET).a $(OBJS) 

%.c.o: %.c 
    $(CC) -c $(CFLAGS) -o "[email protected]" "$<" 

%.F90.o: %.F90 
    $(FC) -c $(FCFLAGS) -o "[email protected]" "$<" 

clean: 
    @printf "Cleaning: \n" 
    @find . -type f -name '*.o' -print0 | xargs -0 -I % sh -c 'printf "% "; rm -f %' 
    rm -f $(TARGET).so $(TARGET).a 

同じ結果を得たgnuコンパイラも試しました。これがなぜ起こっているのか?

答えて

2

.c.cで終わるファイルには、何もルール(%:)と一致適用から作る停止します%.c:として定義された1つのビルトインルールは非常に少なくともあることを意味、内蔵の接尾辞です。

メイクを約.F90一方では考えていないので、それはあなたの%.F90.oルールの前提条件に達したとき、それはfile0.F90: file0.F90.oその結果マッチ何もルール%: %.o、および循環依存関係を適用しようとします。

迅速かつ汚いソリューションに準拠するように、あなたのメイクファイルを書き換えることであろうだけでこれを処理するために.F90

%.F90: 

「正しい」方法(私見)のために、空のパターンルールを追加することですあなただけのARFLAGSを指定し、PRERとしてlibname(objects)を使用できるように内蔵された暗黙のルール

TARGET := libpxn.a 
CC  := mpicc 
FC  := mpif90 
FFLAGS := -O2 -fPIC 
CFLAGS := -O2 -fPIC -Wall 
ARFLAGS := rcs 

CSRCS := $(wildcard *.c) 
FSRCS := $(wildcard *.F90) 
OBJS := $(CSRCS:.c=.o) $(FSRCS:.F90=.o) 

.PHONY: all clean 

all: $(TARGET)($(OBJS)) 

%.o: %.F90 
    $(COMPILE.F) $(OUPUT_OPTION) $< 

%.F90: 

clean: 
    $(info "Cleaning:") 
    $(RM) $(TARGET) 

メイクはアーカイブの組み込みのルールを持っていますあなたがGNU arを使用している場合は、それが常にインデックスを作成するので、sは必要ありません)。

F90レシピはあなたの代わりに.F90のFORTRAN接尾辞として.Fを使用する場合でも、このルールは必要ありません実際には、.Fためのメイクのビルトインルールからコピーされます。

ソースファイルが同じステム(たとえばfoo.cfoo.F90)の場合は、ソースを2つのサブディレクトリに分割するか(推奨)、ダブルサフィックスの元の計画に戻ってくださいその場合は両方のルールを再度提供する必要があります)。

オブジェクトは中間ファイルであり、アーカイブに追加されると自動的に削除されるので、cleanを書き直しました。

+0

これは鮮明に解決しました。ありがとうございます。 – timdykes

+0

興味深いことに、これには「迅速かつ汚れた」解決策はありませんか? – timdykes

+0

@timofiend私はあなたが決して尋ねないと思った:私は今はできませんが、私は約8時間ほどでアップデートを投稿します。ほとんどの場合、現在の設定でいくつかの癖を修正するだけです。 – user657267

関連する問題