2015-12-24 1 views
2

Я пытаюсь изменить мой Makefile так, что я могу ввести любойLinux Makefile поможет объявить переменную FC FFLAGS на основе косметики гну или сделать правилу Linux

«сделать гну» или «сделать Интел»

и он будет скомпилировать все с единственной разницей

FC = gfortran-4.8 или ifort, и FFLAGS = соответствующие флаги для gfortran или ifort.

Может кто-нибудь помочь с тем, что у меня есть до сих пор?

SOURCES = a1.f a2.f a3.f 
OBJECTS = $(SOURCES:.f=.o) 
TARGET = myexececutable.x 

gnu: GNU_FC $(TARGET) 

intel: INTEL_FC $(TARGET) 

GNU_FC: 
    FC = gfortran-4.8 
    FFLAGS = -O3 -mcmodel=medium -shared 

INTEL_FC: 
    FC = ifort 
    FFLAGS = -O3 -mcmodel medium -shared-intel 

$(TARGET): $(OBJECTS) 
$(OBJECTS): $(SOURCES) 

.f.o: 
    $(FC) -c $(FFLAGS) $*.f 

ответ

1

Возможно, вы ищете MAKECMDGOALS.

Здесь ниже я грубо Изменив Makefile, пожалуйста, проверьте ниже: -

SOURCES = a1.f a2.f a3.f 
    OBJECTS = $(SOURCES:.f=.o) 
    TARGET = myexececutable.x 

    gnu: GNU_FC $(TARGET) 

    intel: INTEL_FC $(TARGET) 

    ifeq ($(MAKECMDGOALS),gnu) 
    GNU_FC: 
     FC = gfortran-4.8 
     FFLAGS = -O3 -mcmodel=medium -shared 
    endif 

    ifeq ($(MAKECMDGOALS),intel) 
    INTEL_FC: 
     FC = ifort 
     FFLAGS = -O3 -mcmodel medium -shared-intel 
    endif 

    $(TARGET): $(OBJECTS) 
    $(OBJECTS): $(SOURCES) 

    .f.o: 
     $(FC) -c $(FFLAGS) $*.f 

Более подробную информацию можно получить здесь

https://www.gnu.org/software/make/manual/html_node/Goals.html][1]

1

спасибо. Я получил его, чтобы работать, как я хотел, на основе вашей помощи MAKECMDGOALS. вот мой makefile, и он работает очень хорошо. , если вы набираете только make-файл без аргументов, тогда он выполняет все: раздел и остановки, что хорошо, потому что он заставляет пользователя выражать очевидность, следует ли использовать компилятор gnu или компилятор Intel ... или что-то еще.

COMPILER_VERSION = "Intel 64 Compiler 16.0 and gfortran-4.8" 

SOURCES = \ 
program1.f \ 
program2.f \ 
program3.f 

OBJECTS = $(SOURCES:.f=.o) 
TARGET = ../lib/mylib.a 

all: 
     @echo "" 
     @echo " type either  make intel  or  make gnu" 
     @echo "" 

intel: INTEL_FC linux 
gnu: GNU_FC linux 

ifeq ($(MAKECMDGOALS),intel) 
    INTEL_FC: 
    FC = ifort 
    FFLAGS = -O3 -integer-size 64 -real-size 64 -align -pad -mcmodel medium -shared-intel 
endif 

ifeq ($(MAKECMDGOALS),gnu) 
    GNU_FC: 
    FC = gfortran-4.8 
    FFLAGS = -O3 -falign-commons -finit-local-zero -fdefault-integer-8 -fdefault-real-8 -mcmodel=medium -shared -fopenmp 
endif 

linux: ECHO1 $(TARGET) 
     @echo 
     @echo -n " " 
     ar r $(TARGET) $(OBJECTS) 
     @echo 
     @echo -n " " 
     ranlib $(TARGET) 
     @echo 

$(TARGET): $(OBJECTS) 

$(OBJECTS): $(SOURCES) 

.f.o: 
     @echo -n " " 
     $(FC) -c $(FFLAGS) $*.f 

cleanall: 
     @echo 
     rm -f $(OBJECTS) $(TARGET) 
     @echo 

clean: 
     @echo 
     rm -f $(OBJECTS) 
     @echo 

ECHO1: 
     @echo 
     @echo " Makefile written for the compiler version ${COMPILER_VERSION}" 
     @echo 
Смежные вопросы