2016-05-10 14 views
2

Ich versuche, eine statische Bibliothek mit gemischten C-und Fortran-Code zu erstellen. Beim Erstellen der Fortran-Dateien erhalte ich diesen Fehler für jede meiner Fortran-Dateien, aber nicht für die c-Dateien.Circular Abhängigkeit gelöscht: make, fortran und c Gebäude statische Bibliothek

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

Das Makefile, das ich verwende, ist unten. Meine Regel für F90-Dateien ist die gleiche wie für C-Dateien, also bin ich mir nicht sicher, warum es dieses Verhalten haben sollte?

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 

Ich habe auch versucht mit Gnu Compiler mit dem gleichen Ergebnis. Irgendwelche Ideen, warum das passiert?

Antwort

2

.c ist ein Einbau-Suffix, zumindest was bedeutet, es gibt einen eingebauten Regel als %.c: definiert, die aus der Anwendung übereinstimmen Regeln etwas machen stoppen (%:), um Dateien mit .c endet.

Fabrikat hat keine Ahnung von .F90 auf der anderen Seite, so dass, wenn er die Voraussetzungen Ihrer %.F90.o Regel erreicht, wird er versuchen, das Spiel etwas Regel %: %.o, die in file0.F90: file0.F90.o und eine zirkuläre Abhängigkeit führt anzuwenden.

Die schnelle und schmutzige Lösung ist einfach eine leere Musterregel .F90

%.F90: 

Die „richtige“ Art und Weise (IMHO) für fügen Sie diese zu handhaben wäre Ihr Make-Datei neu zu schreiben, um die zu entsprechen Einbau-implizite Regeln

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) 

Fabrikat hat eine eingebaute in der Regel für Archive, so dass Sie nur ARFLAGS und libname(objects) als PreR verwenden angeben equisite (IIRC, wenn Sie GNU ar verwenden, brauchen Sie nicht s, da es immer einen Index bildet).

Das F90 Rezept ist für .F von Make-interner Regel kopiert, in der Tat, wenn Sie .F als Fortran-Suffix statt .F90 verwenden, werden Sie nicht einmal diese Regel brauchen.

Wenn Sie zwei Quelldateien mit dem gleichen Stamm (sagen wir foo.c und foo.F90) Sie müssen entweder die Quellen in zwei Unterverzeichnisse aufgeteilt (empfohlen), oder gehen Sie zurück zu Ihrem ursprünglichen Plan des Doppel Suffix (Sie‘ In diesem Fall müssen beide Regeln erneut zur Verfügung gestellt werden).

Ich habe clean umgeschrieben, da die Objekte jetzt Zwischendateien sind und automatisch gelöscht werden, nachdem sie dem Archiv hinzugefügt wurden.

+0

Brilliant dies löste das Problem, danke. – timdykes

+0

Interessant, gibt es eine nicht 'schnelle und dreckige' Lösung für dieses Problem? – timdykes

+0

@timofiend Ich dachte, du würdest nie fragen: D Ich kann jetzt nicht, aber ich werde ein Update in etwa 8 Stunden oder so veröffentlichen. Es geht hauptsächlich darum, ein paar Macken in deinem aktuellen Setup zu beheben. – user657267

Verwandte Themen