Files
mercury/scripts/Mmake.rules
Warwick Harvey a11d224374 Reconciled the implementation and the documentation of the automatically
Estimated hours taken: 3

Reconciled the implementation and the documentation of the automatically
generated clean targets.  Also removed the `change_clean' targets to
simplify things, since they're not particularly useful.

`clean' now no longer deletes transitive optimization files, and should be
suitable for use when changing compilation models.  When changing the level
of intermodule optimization, a `depend' is required, but a `clean' is also
recommended.

compiler/modules.m:
	Removed the generation and recognition of the `.change_clean'
	target.
	Moved the deletion of the `.trans_opt' and `.trans_opt_date' files
	from the `.clean' target to the `.realclean' target.

doc/user_guide.texi:
	Removed the documentation for the `.change_clean' target, but
	documented how to achieve each of its two intended purposes by using
	other targets.
	Updated the documentation of the clean targets to more accurately
	and completely reflect what they do.

scripts/Mmake.rules:
	Removed a reference to `change_clean'.
1999-08-18 06:26:09 +00:00

324 lines
9.4 KiB
Plaintext

#-----------------------------------------------------------------------------#
# Copyright (C) 1995-1999 The University of Melbourne.
# This file may only be copied under the terms of the GNU General
# Public License - see the file COPYING in the Mercury distribution.
#-----------------------------------------------------------------------------#
# Mmake.rules - rules for building Mercury programs
# N.B. All the builtin rules must use $@ as the target, so that they work
# when $(VPATH) is set.
main_target: $(MAIN_TARGET)
#-----------------------------------------------------------------------------#
# Beware that the order of suffixes is significant.
.SUFFIXES: .m .nl .no .err \
.int0 .int .int2 .int3 .opt .trans_opt \
.dep .depend .dv .doit .ugly \
.date0 .date .date3 .optdate .trans_opt_date \
.c .nu .o .pic_o \
.i .s .pic_s \
.ql .pl \
.rlo
#-----------------------------------------------------------------------------#
#
# Code to set variables based on the setting of MMAKE_USE_SUBDIRS
# (i.e. --use-subdirs).
#
ifeq ($(MMAKE_USE_SUBDIRS),yes)
MCFLAGS += --use-subdirs
MSCFLAGS += --use-subdirs
MNCFLAGS += --use-subdirs
ALL_MGNUCFLAGS += -I.
endif
#-----------------------------------------------------------------------------#
.PRECIOUS: $(date0s_subdir)%.date0
.PRECIOUS: $(dates_subdir)%.date
.PRECIOUS: $(date3s_subdir)%.date3
.PRECIOUS: $(optdates_subdir)%.optdate
.PRECIOUS: $(trans_opt_dates_subdir)%.trans_opt_date
#-----------------------------------------------------------------------------#
#
# Rules for NU-Prolog and SICStus Prolog.
#
.m.pl:
sicstus_conv $<
.nl.pl:
sicstus_conv $<
$(nos_subdir)%.no : %.m
$(MNC) $(ALL_MNCFLAGS) -o $@ $<
$(nos_subdir)%.no : %.nl
$(MNC) $(ALL_MNCFLAGS) -o $@ $<
$(qls_subdir)%.ql : %.m
$(MSC) $(ALL_MSCFLAGS) -o $@ $<
$(qls_subdir)%.ql : %.nl
$(MSC) $(ALL_MSCFLAGS) -o $@ $<
#-----------------------------------------------------------------------------#
#
# Rules for building dependency files
#
# When creating the dependencies with `--use-subdirs' enabled,
# we need to create the `Mercury/dates' directories manually
# in order to get things started. This should not be necessary,
# but there is a bug in GNU Make with regard to directory caching.
# I have sent off a bug report to the GNU Make maintainers (19 March 1998).
# -fjh.
# beware the code for `%.depend' and `%.dep'/`%.dv' is duplicated
$(deps_subdir)%.dep $(deps_subdir)%.dv:
$(MCD) $(ALL_MCDFLAGS) $*
ifeq ($(MMAKE_USE_SUBDIRS),yes)
# the following mkdirs work around a bug in GNU Make
-[ -d Mercury/dates ] || mkdir Mercury/dates
-[ -d Mercury/date0s ] || mkdir Mercury/date0s
-[ -d Mercury/date3s ] || mkdir Mercury/date3s
-[ -d Mercury/optdates ] || mkdir Mercury/optdates
endif
# beware the code for `%.depend' and `%.dep'/`%.dv' is duplicated
.PHONY: %.depend
%.depend :
$(MCD) $(ALL_MCDFLAGS) $*
ifeq ($(MMAKE_USE_SUBDIRS),yes)
# the following mkdirs work around a bug in GNU Make
-[ -d Mercury/dates ] || mkdir Mercury/dates
-[ -d Mercury/date0s ] || mkdir Mercury/date0s
-[ -d Mercury/date3s ] || mkdir Mercury/date3s
-[ -d Mercury/optdates ] || mkdir Mercury/optdates
endif
# The `.doit' files are helpful when using Prolog.
%.doit : $(deps_subdir)%.dep $(deps_subdir)%.dv
sed -e ':a' -e '/\\/N' -e 's/\\\n //' -e 't a' $< | \
grep '\.ms *=' | \
sed -e 's/.*=/:-[ '\''nu_library.doit'\'', /' \
-e 's/\.m/,/g' \
-e 's/$$/ portray ]./' \
> $@
#-----------------------------------------------------------------------------#
#
# Rules for building interface files
# WARNING: any changes here will probably need to be
# duplicated in compiler/modules.m.
#
$(date0s_subdir)%.date0 : %.m
$(MCPI) $(ALL_MCPIFLAGS) $<
$(dates_subdir)%.date : %.m
$(MCI) $(ALL_MCIFLAGS) $<
$(date3s_subdir)%.date3 : %.m
$(MCSI) $(ALL_MCSIFLAGS) $<
$(optdates_subdir)%.optdate : %.m
$(MCOI) $(ALL_MCOIFLAGS) $<
$(trans_opt_dates_subdir)%.trans_opt_date : %.m
$(MCTOI) $(ALL_MCTOIFLAGS) $<
# Be very careful about changing the following rules.
# The `@:' is a silent do-nothing command.
# It is used to force GNU Make to recheck the timestamp
# on the target file. (It is a pity that GNU Make doesn't
# have a way of handling these sorts of rules in a nicer manner.)
$(int0s_subdir)%.int0 : $(date0s_subdir)%.date0
@:
$(ints_subdir)%.int : $(dates_subdir)%.date
@:
$(int2s_subdir)%.int2 : $(dates_subdir)%.date
@:
$(int3s_subdir)%.int3 : $(date3s_subdir)%.date3
@:
$(opts_subdir)%.opt : $(optdates_subdir)%.optdate
@:
$(trans_opts_subdir)%.trans_opt : $(trans_opt_dates_subdir)%.trans_opt_date
@:
#-----------------------------------------------------------------------------#
#
# Rules for compiling Mercury source files
# WARNING: any changes here will probably need to be
# duplicated in compiler/modules.m.
#
$(cs_subdir)%.c : %.m
rm -f $(cs_subdir)$*.c
$(MCG) $(ALL_GRADEFLAGS) $(ALL_MCGFLAGS) $< > $*.err 2>&1
$(rlos_subdir)%.rlo : %.m
rm -f $(rlos_subdir)$*.c
$(MCG) $(ALL_GRADEFLAGS) $(ALL_MCGFLAGS) --aditi-only $< > $*.err 2>&1
# If we are removing the .c files, we need to tell Make that we're
# generating the .o files directly from the .m files, but
# in order to avoid remaking the .c files if they're already there,
# we need to invoke mmake recursively for each .c file.
# This can be pretty inefficient.
ifneq ($(RM_C),:)
$(os_subdir)%.o : %.m
$(MMAKE_MAKE_CMD) $(MFLAGS) MC="$(MC)" ALL_MCFLAGS="$(ALL_MCFLAGS)" \
ALL_GRADEFLAGS="$(ALL_GRADEFLAGS)" $(cs_subdir)$*.c
$(MGNUC) $(ALL_GRADEFLAGS) $(ALL_MGNUCFLAGS) -c $(cs_subdir)$*.c -o $@
$(RM_C) $(cs_subdir)$*.c
$(os_subdir)%.pic_o : %.m
$(MMAKE_MAKE_CMD) $(MFLAGS) MC="$(MC)" ALL_MCFLAGS="$(ALL_MCFLAGS)" \
ALL_GRADEFLAGS="$(ALL_GRADEFLAGS)" $(cs_subdir)$*.c
$(MGNUC) $(ALL_GRADEFLAGS) $(ALL_MGNUCFLAGS) $(CFLAGS_FOR_PIC) \
-c $(cs_subdir)$*.c -o $@
endif # RM_C != :
# For --split-c-files, we generate the .o files directly from the .m files.
# (One reason for this is that there's no easy of telling Make how many
# `.o' files it should make, since the number of them depends on what's
# in the source files.)
$(dirs_subdir)%.dir/*.o: %.m
rm -f $@
$(MCS) $(ALL_GRADEFLAGS) $(ALL_MCSFLAGS) $<
# The `touch' is necessary, since otherwise if
# the old .err file was of size zero and
# the new .err file is also of size zero,
# the time-stamp doesn't get updated!
# (Is that a bug in unix? In bash?)
.m.err:
$(MC) $(ALL_MCFLAGS) --errorcheck-only $< > $@ 2>&1
@touch $@
.m.ugly:
$(MC) --convert-to-mercury $(ALL_MCFLAGS) $<
#-----------------------------------------------------------------------------#
#
# Rules for compiling C files in the user's source directory.
#
.c.o:
$(MGNUC) $(ALL_GRADEFLAGS) $(ALL_MGNUCFLAGS) -c $< -o $@
.c.pic_o:
$(MGNUC) $(ALL_GRADEFLAGS) $(ALL_MGNUCFLAGS) $(CFLAGS_FOR_PIC) \
-c $< -o $@
.c.s:
$(MGNUC) $(ALL_GRADEFLAGS) $(ALL_MGNUCFLAGS) -S $< -o $@
.c.pic_s:
$(MGNUC) $(ALL_GRADEFLAGS) $(ALL_MGNUCFLAGS) $(CFLAGS_FOR_PIC) \
-S $< -o $@
.c.i:
$(MGNUC) $(ALL_GRADEFLAGS) $(ALL_MGNUCFLAGS) -E $< > $@
#-----------------------------------------------------------------------------#
#
# Rules for compiling C files in a subdirectory.
# Note that we need both these rules and the ones above,
# since even if the compiler generates all of its files in subdirectories,
# the user may have some C files of their own which need to be compiled.
#
ifneq ("$(cs_subdir)","")
$(os_subdir)%.o : $(cs_subdir)%.c
$(MGNUC) $(ALL_GRADEFLAGS) $(ALL_MGNUCFLAGS) -c $< -o $@
$(os_subdir)%.pic_o : $(cs_subdir)%.c
$(MGNUC) $(ALL_GRADEFLAGS) $(ALL_MGNUCFLAGS) $(CFLAGS_FOR_PIC) \
-c $< -o $@
%.s: $(cs_subdir)%.c
$(MGNUC) $(ALL_GRADEFLAGS) $(ALL_MGNUCFLAGS) -S $< -o $@
%.pic_s: $(cs_subdir)%.c
$(MGNUC) $(ALL_GRADEFLAGS) $(ALL_MGNUCFLAGS) $(CFLAGS_FOR_PIC) \
-S $< -o $@
%.i: $(cs_subdir)%.c
$(MGNUC) $(ALL_GRADEFLAGS) $(ALL_MGNUCFLAGS) -E $< > $@
endif # $(cs_subdir) != ""
#-----------------------------------------------------------------------------#
#
# Code to handle dependencies on $(MLOBJS) and $(MLPICOBJS).
#
# The generated `.dep' files include rules for targets which may depend
# on $(MLOBJS) or $(MLPICOBJS). However, the definition of $(MLOBJS)
# or $(MLPICOBJS) is in the user's Mmakefile, and the `.dep' files get
# included *before* the Mmakefile. The `.dep' files cannot contain
# those dependency directly, because $(MLOBJS) and $(MLPICOBJS) variables
# have not yet been defined.
#
# Instead, the generated `.dep' files just add the appropriate targets to
# the $(MLOBJS_DEPS) or $(MLPICOBJS_DEPS) variables, and then we record the
# dependency of those files on $(MLOBJS) or $(MLPICOBJS) here in Mmake.rules,
# which gets included after the user's Mmakefile.
$(MLOBJS_DEPS) : $(MLOBJS)
$(MLPICOBJS_DEPS) : $(MLPICOBJS)
#-----------------------------------------------------------------------------#
#
# Targets for cleaning up.
#
# Note that the actions for most of these targets are in the
# automatically generated `.d' files.
#
.PHONY: clean realclean clean_nu clean_sicstus clean_prof_files
clean_prof_files:
-rm -f Prof.CallPair Prof.Counts Prof.Decl Prof.MemWords Prof.MemCells
#
# The `clean' and `realclean' targets are implemented via `clean_local'
# and `realclean_local'. This allows a user to add rules in their
# Mmakefile to do a recursive mmake clean, for example, while still being
# able to use the local versions in their original form.
#
.PHONY: clean_local realclean_local
realclean: realclean_local
clean: clean_local
realclean_local: clean_local
clean_local: clean_prof_files
#-----------------------------------------------------------------------------#