# /*@@ # @file make.config.rules.in # @date Sun Jan 17 22:31:16 1999 # @author Tom Goodale # @desc # Rules to generate object files from source files in another # directory. # # Note that, due to the (IMHO) rather bizarre way in which Make # deals with directories in the target names, this will # not work if the target is in a subdirectory. # # In order to accomodate Fortran 90 modules, the working directory # for each compilation is set to a scratch directory, so that # all module files end up there. # @enddesc # @version $Header$ # @@*/ # Dividers to make the screen output slightly nicer DIVEL = __________________ DIVIDER = $(DIVEL)$(DIVEL)$(DIVEL)$(DIVEL) ##################################################################### # Shortcuts. INCLUDE_LINE = $(patsubst %,-I"%",$(call TRANSFORM_DIRS,$(INC_DIRS))) ##################################################################### # Define how to do dependencies ifeq ($(strip $(PERL_BACKUP_NECESSARY)),) define DEPENDENCY_FIXER $(PERL) -pi -e "s,([^:]*),$(basename $@).o $(basename $@).d, if(m/: /);\ s:\s+\S*[/\\\]($(DEP_EXCLUDE_FILES))\b::g" $@ endef else define DEPENDENCY_FIXER $(PERL) -pi.bak -e "s,([^:]*),$(basename $@).o $(basename $@).d, if(m/: /);\ s:\s+\S*[/\\\]($(DEP_EXCLUDE_FILES))\b::g" $@ rm $@.bak endef endif define C_DEPENDENCIES $(C_DEPEND) $< $(INCLUDE_LINE) $(EXTRA_DEFINES:%=-D%) -DCCODE $(C_DEPEND_OUT) $(DEPENDENCY_FIXER) endef define CXX_DEPENDENCIES $(CXX_DEPEND) $< $(INCLUDE_LINE) $(EXTRA_DEFINES:%=-D%) -DCCODE $(CXX_DEPEND_OUT) $(DEPENDENCY_FIXER) endef define F77_DEPENDENCIES $(F77_DEPEND) $(INCLUDE_LINE) $(EXTRA_DEFINES:%=-D%) -DFCODE $< $(F77_DEPEND_OUT) $(DEPENDENCY_FIXER) endef define F_DEPENDENCIES $(F_DEPEND) $(INCLUDE_LINE) $(EXTRA_DEFINES:%=-D%) -DFCODE -DF90CODE $< $(F_DEPEND_OUT) $(DEPENDENCY_FIXER) current_wd=`$(GET_WD)` ; { if test $(F_LINE_DIRECTIVES) = 'yes'; then echo '#line 1 "'$<'"'; fi; cat $<; } | $(PERL) -p -e 's.//.CCTK_AUTOMATICALLY_GENERATED_CONCATENATION_PROTECTION.g' | $(FPP) $(FPPFLAGS) $(INCLUDE_LINE) $(EXTRA_DEFINES:%=-D%) -DFCODE -DF90CODE | $(PERL) -p -e 's.CCTK_AUTOMATICALLY_GENERATED_CONCATENATION_PROTECTION.//.g' | $(PERL) $(F_DEPEND_MODULES) $< $(basename $(notdir $<)).F.o $(SRCDIR) $(USESTHORNS:%=$$current_wd/../%) $(F_DEPEND_MODULES_OUT) || { rm $@; exit 1; } endef define F90_DEPENDENCIES $(F_DEPEND) $(INCLUDE_LINE) $(EXTRA_DEFINES:%=-D%) -DFCODE -DF90CODE $< $(F_DEPEND_OUT) $(DEPENDENCY_FIXER) current_wd=`$(GET_WD)` ; { if test $(F_LINE_DIRECTIVES) = 'yes'; then echo '#line 1 "'$<'"'; fi; cat $<; } | $(PERL) -p -e 's.//.CCTK_AUTOMATICALLY_GENERATED_CONCATENATION_PROTECTION.g' | $(FPP) $(FPPFLAGS) $(INCLUDE_LINE) $(EXTRA_DEFINES:%=-D%) -DFCODE -DF90CODE | $(PERL) -p -e 's.CCTK_AUTOMATICALLY_GENERATED_CONCATENATION_PROTECTION.//.g' | $(PERL) $(F_DEPEND_MODULES) $< $(basename $(notdir $<)).F90.o $(SRCDIR) $(USESTHORNS:%=$$current_wd/../%) $(F_DEPEND_MODULES_OUT) || { rm $@; exit 1; } endef # No preprocessing, just create empty dependency file define f77_DEPENDENCIES echo "" > $@ current_wd=`$(GET_WD)` ; cat $< | $(PERL) $(F_DEPEND_MODULES) $< $(basename $(notdir $<)).f77.o $(SRCDIR) $(USESTHORNS:%=$$current_wd/../%) $(F_DEPEND_MODULES_OUT) || { rm $@; exit 1; } endef define f_DEPENDENCIES echo "" > $@ current_wd=`$(GET_WD)` ; cat $< | $(PERL) $(F_DEPEND_MODULES) $< $(basename $(notdir $<)).f.o $(SRCDIR) $(USESTHORNS:%=$$current_wd/../%) $(F_DEPEND_MODULES_OUT) || { rm $@; exit 1; } endef define f90_DEPENDENCIES echo ""> $@ current_wd=`$(GET_WD)` ; cat $< | $(PERL) $(F_DEPEND_MODULES) $< $(basename $(notdir $<)).f90.o $(SRCDIR) $(USESTHORNS:%=$$current_wd/../%) $(F_DEPEND_MODULES_OUT) || { rm $@; exit 1; } endef ##################################################################### # Define how to do a C compilation define PREPROCESS_C { if test $(C_LINE_DIRECTIVES) = 'yes'; then echo '#line 1 "'$<'"'; fi; cat $<; } | $(PERL) -s $(C_FILE_PROCESSOR) -line_directives=$(C_LINE_DIRECTIVES) -source_file_name=$< $(CONFIG) > $(notdir $<) endef define COMPILE_C current_wd=`$(GET_WD)` ; cd $(SCRATCH_BUILD) ; $(CC) $(CPPFLAGS) $(CFLAGS) $(CCOMPILEONLY)$(OPTIONSEP)$$current_wd$(DIRSEP)$@ $$current_wd$(DIRSEP)$(notdir $<) $(INCLUDE_LINE) $(EXTRA_DEFINES:%=-D%) -DCCODE endef define POSTPROCESS_C $(C_POSTPROCESSING) endef # Define how to do a C++ compilation define PREPROCESS_CXX { if test $(C_LINE_DIRECTIVES) = 'yes'; then echo '#line 1 "'$<'"'; fi; cat $<; } | $(PERL) -s $(C_FILE_PROCESSOR) -line_directives=$(C_LINE_DIRECTIVES) -source_file_name=$< $(CONFIG) > $(CXX_WORKING_NAME) endef define COMPILE_CXX current_wd=`$(GET_WD)` ; cd $(SCRATCH_BUILD) ; $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(CCOMPILEONLY)$(OPTIONSEP)$$current_wd$(DIRSEP)$@ $$current_wd$(DIRSEP)$(CXX_WORKING_NAME) $(INCLUDE_LINE) $(EXTRA_DEFINES:%=-D%) -DCCODE endef define POSTPROCESS_CXX $(CXX_POSTPROCESSING) endef # Define how to do a F77 compilation define PREPROCESS_F77 { if test $(F_LINE_DIRECTIVES) = 'yes'; then echo '#line 1 "'$<'"'; fi; cat $<; } | $(PERL) -p -e 's.//.CCTK_AUTOMATICALLY_GENERATED_CONCATENATION_PROTECTION.g' | $(FPP) $(FPPFLAGS) $(INCLUDE_LINE) $(EXTRA_DEFINES:%=-D%) -DFCODE | $(PERL) -p -e 's.CCTK_AUTOMATICALLY_GENERATED_CONCATENATION_PROTECTION.//.g' | $(PERL) -p -e 's/__FORTRANFILE__/\"$(basename $(notdir $<)).F77\"/g' | $(PERL) -s $(F_FILE_PROCESSOR) -line_directives=$(F_LINE_DIRECTIVES) -source_file_name=$< > $(basename $(notdir $<)).f endef define COMPILE_F77 if test "$(F77)" = "none" ; then echo "There is no Fortran 77 compiler available. Aborting." ; exit 1 ; fi ; current_wd=`$(GET_WD)` ; cd $(SCRATCH_BUILD) ; $(F77) $(F77FLAGS) $(FCOMPILEONLY)$(OPTIONSEP)$$current_wd$(DIRSEP)$@ $$current_wd$(DIRSEP)$(basename $(notdir $<)).f endef define POSTPROCESS_F77 $(F77_POSTPROCESSING) endef # Define how to do a fixed-format F90 compilation define PREPROCESS_F { if test $(F_LINE_DIRECTIVES) = 'yes'; then echo '#line 1 "'$<'"'; fi; cat $<; } | $(PERL) -p -e 's.//.CCTK_AUTOMATICALLY_GENERATED_CONCATENATION_PROTECTION.g' | $(FPP) $(FPPFLAGS) $(INCLUDE_LINE) $(EXTRA_DEFINES:%=-D%) -DFCODE -DF90CODE | $(PERL) -p -e 's.CCTK_AUTOMATICALLY_GENERATED_CONCATENATION_PROTECTION.//.g' | $(PERL) -p -e 's/__FORTRANFILE__/\"$(basename $(notdir $<)).F\"/g' | $(PERL) -s $(F_FILE_PROCESSOR) -line_directives=$(F_LINE_DIRECTIVES) -source_file_name=$< > $(basename $(notdir $<)).f endef define COMPILE_F if test "$(F90)" = "none" ; then echo "There is no Fortran 90 compiler available. Aborting." ; exit 1 ; fi ; current_wd=`$(GET_WD)` ; cd $(SCRATCH_BUILD) ; $(F90) $(F90FLAGS) $(FCOMPILEONLY)$(OPTIONSEP)$$current_wd$(DIRSEP)$@ $$current_wd$(DIRSEP)$(basename $(notdir $<)).f endef define POSTPROCESS_F $(F_POSTPROCESSING) endef # Define how to do a free-format F90 compilation define PREPROCESS_F90 { if test $(F_LINE_DIRECTIVES) = 'yes'; then echo '#line 1 "'$<'"'; fi; cat $<; } | $(PERL) -p -e 's.//.CCTK_AUTOMATICALLY_GENERATED_CONCATENATION_PROTECTION.g' | $(FPP) $(FPPFLAGS) $(INCLUDE_LINE) $(EXTRA_DEFINES:%=-D%) -DFCODE -DF90CODE | $(PERL) -p -e 's.CCTK_AUTOMATICALLY_GENERATED_CONCATENATION_PROTECTION.//.g' | $(PERL) -p -e 's/__FORTRANFILE__/\"$(basename $(notdir $<)).F90\"/g' | $(PERL) -s $(F_FILE_PROCESSOR) -free_format -line_directives=$(F_LINE_DIRECTIVES) -source_file_name=$< > $(basename $(notdir $<)).$(F90_SUFFIX) endef define COMPILE_F90 if test "$(F90)" = "none" ; then echo "There is no Fortran 90 compiler available. Aborting." ; exit 1 ; fi ; current_wd=`$(GET_WD)` ; cd $(SCRATCH_BUILD) ; $(F90) $(F90FLAGS) $(FCOMPILEONLY)$(OPTIONSEP)$$current_wd$(DIRSEP)$@ $$current_wd$(DIRSEP)$(basename $(notdir $<)).$(F90_SUFFIX) endef define POSTPROCESS_F90 $(F90_POSTPROCESSING) endef # Define how to do a f77 compilation define PREPROCESS_f77 cat $< > $(basename $(notdir $<)).f endef # Define how to do a f compilation define PREPROCESS_f cat $< > $(basename $(notdir $<)).f endef # Define how to do a f90 compilation define PREPROCESS_f90 cat $< > $(basename $(notdir $<)).f90 endef # Build rules for C %.c.o: $(SRCDIR)/%.c @echo Preprocessing $< $(PREPROCESS_C) @echo Compiling $< $(COMPILE_C) @echo Postprocessing $< $(POSTPROCESS_C) @echo $(DIVIDER) %.c.d: $(SRCDIR)/%.c $(C_DEPENDENCIES) # Build rules for C++ %.cc.o: $(SRCDIR)/%.cc @echo Preprocessing $< $(PREPROCESS_CXX) @echo Compiling $< $(COMPILE_CXX) @echo Postprocessing $< $(POSTPROCESS_CXX) @echo $(DIVIDER) %.cc.d: $(SRCDIR)/%.cc $(CXX_DEPENDENCIES) %.C.o: $(SRCDIR)/%.C @echo Preprocessing $< $(PREPROCESS_CXX) @echo Compiling $< $(COMPILE_CXX) @echo Postprocessing $< $(POSTPROCESS_CXX) @echo $(DIVIDER) %.C.d: $(SRCDIR)/%.C $(CXX_DEPENDENCIES) %.cpp.o: $(SRCDIR)/%.cpp @echo Preprocessing $< $(PREPROCESS_CXX) @echo Compiling $< $(COMPILE_CXX) @echo Postprocessing $< $(POSTPROCESS_CXX) @echo $(DIVIDER) %.cpp.d: $(SRCDIR)/%.cpp $(CXX_DEPENDENCIES) %.cxx.o: $(SRCDIR)/%.cxx @echo Preprocessing $< $(PREPROCESS_CXX) @echo Compiling $< $(COMPILE_CXX) @echo Postprocessing $< $(POSTPROCESS_CXX) @echo $(DIVIDER) %.cxx.d: $(SRCDIR)/%.cxx $(CXX_DEPENDENCIES) # Build rules for F77 %.F77.o: $(SRCDIR)/%.F77 @echo Preprocessing $< $(PREPROCESS_F77) @echo Compiling $< $(COMPILE_F77) @echo Postprocessing $< $(POSTPROCESS_F77) @echo $(DIVIDER) %.f77.o: $(SRCDIR)/%.f77 @echo Copying $< $(PREPROCESS_f77) @echo Compiling $< $(COMPILE_F77) @echo Postprocessing $< $(POSTPROCESS_F77) @echo $(DIVIDER) %.F77.d: $(SRCDIR)/%.F77 $(F77_DEPENDENCIES) %.f77.d: $(SRCDIR)/%.f77 $(f77_DEPENDENCIES) # Build rules for F90 %.F.o: $(SRCDIR)/%.F @echo Preprocessing $< $(PREPROCESS_F) @echo Compiling $< $(COMPILE_F) @echo Postprocessing $< $(POSTPROCESS_F) @echo $(DIVIDER) %.f.o: $(SRCDIR)/%.f @echo Copying $< $(PREPROCESS_f) @echo Compiling $< $(COMPILE_F) @echo Postprocessing $< $(POSTPROCESS_F) @echo $(DIVIDER) %.F.d: $(SRCDIR)/%.F $(F_DEPENDENCIES) %.f.d: $(SRCDIR)/%.f $(f_DEPENDENCIES) # Build rules for free-format F90 %.F90.o: $(SRCDIR)/%.F90 @echo Preprocessing $< $(PREPROCESS_F90) @echo Compiling $< $(COMPILE_F90) @echo Postprocessing $< $(POSTPROCESS_F90) @echo $(DIVIDER) %.f90.o: $(SRCDIR)/%.f90 @echo Copying $< $(PREPROCESS_f90) @echo Compiling $< $(COMPILE_F90) @echo Postprocessing $< $(POSTPROCESS_F90) @echo $(DIVIDER) %.F90.d: $(SRCDIR)/%.F90 $(F90_DEPENDENCIES) %.f90.d: $(SRCDIR)/%.f90 $(f90_DEPENDENCIES)