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.f90và file2.f90như đầ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.execái sử dụng -O2cờ biên dịch, một hello_O3.exephiên bản có -O3cờ 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.exesử dụng -O2cờ cũng như sử dụng iforttrình biên dịch intel.
Lý tưởng nhất, tôi muốn chỉ định make intelO3sử dụng iforttrình biên dịch và -O3gắn cờ và sẽ tạo ra hello_intel_O3.exetệp thực thi. Nếu tôi chỉ định make allnó sẽ tạo ra hello_O2.exe, hello_O3.exe, hello_intel_O2.exe, và hello_intel_O3.exenhữ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.