Tôi đang cố gắng biên dịch mã nguồn theo nhiều cách khác nhau. Ví dụ, giả sử tôi muốn biên dịch một chương trình fortran với mã nguồn main.f90
, file1.f90
và file2.f90
như đầu vào. Để tạo hello.exe
, tôi chỉ cần làm
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
Bây giờ, giả sử tôi muốn tạo các phiên bản khác nhau của điều này và so sánh đầu ra. Tôi muốn tạo một hello_O2.exe
cái sử dụng -O2
cờ biên dịch, một hello_O3.exe
phiên bản có -O3
cờ và thậm chí biên dịch với các trình biên dịch khác nhau. Tôi muốn một ví dụ hello_intel_O2.exe
sử dụng -O2
cờ cũng như sử dụng ifort
trình biên dịch intel.
Lý tưởng nhất, tôi muốn chỉ định make intelO3
sử dụng ifort
trình biên dịch và -O3
gắn cờ và sẽ tạo ra hello_intel_O3.exe
tệp thực thi. Nếu tôi chỉ định make all
nó sẽ tạo ra hello_O2.exe
, hello_O3.exe
, hello_intel_O2.exe
, và hello_intel_O3.exe
những chương trình, mỗi trình biên dịch chính xác và mức độ tối ưu hóa.
Làm thế nào điều này có thể đạt được trong ví dụ tối thiểu này? Makefile thực tế của tôi là ~ 120 dòng ngay bây giờ và sử dụng nhiều biến mà tôi thay đổi mỗi lần tôi muốn xây dựng cho một phiên bản khác.