Я пытаюсь скомпилировать исходный код различными способами. Например, предположим, что я хочу скомпилировать фортран-программу с исходным кодом main.f90
, file1.f90
и file2.f90
качестве входных данных. Чтобы сгенерировать hello.exe
, я бы просто сделал
FC=gfortran
EXE=hello.exe
OBJS=file1.o file2.o
FFLAGS=
$(EXE): $(OBJS)
$(FC) $(FFLAGS) main.f90 $(OBJS) -o $(EXE)
file1.o: file1.f90
$(FC) $(FFLAGS) -c file1.f90
file2.o: file2.f90
$(FC) $(FFLAGS) -c file2.f90
clean:
rm -rf *.o
Теперь предположим, что я хочу сделать разные версии этого и сравнить результаты. Я хотел бы создать hello_O2.exe
который использует флаг компиляции -O2
, версию hello_O3.exe
с флагом -O3
и даже компилировать с различными компиляторами. Я хотел бы hello_intel_O2.exe
который использует флаг -O2
а также использует компилятор Intel ifort
, например.
В идеале я бы хотел указать make intelO3
для использования компилятора ifort
и флага -O3
который и сгенерирует исполняемый файл hello_intel_O3.exe
. Если я указываю , make all
это создало бы бинарные файлы hello_O2.exe
hello_O3.exe
hello_intel_O2.exe
и hello_intel_O3.exe
каждый с правильным уровнем компилятора и оптимизации.
Как это может быть достигнуто в этом минимальном примере? Мой настоящий Makefile сейчас ~ 120 строк и использует много переменных, которые я меняю каждый раз, когда хочу построить для другой версии.