mirror of
https://github.com/Mercury-Language/mercury.git
synced 2025-12-14 05:12:33 +00:00
Estimated hours taken: 15 Split the automatically generated `.dep' file into two files. The new `.dv' file contains all the variable definitions which used to be in the `.dep' file, which now contains just the rules. With mmake including the `.dv' files before the user's Mmakefile and the `.dep' files after, this allows user-defined Mmakefiles to refer to the automatically-generated variables and automatically-generated rules to refer to variables defined in the user's Mmakefile. This was possible before to a limited extent, but in particular dependency lists for automatically-generated rules could not refer to user-defined variables. Also introduced `C2INITARGS' as part of an illustration of how this change is useful (though probably this should be a separate change). `C2INITARGS' should be used to specify extra files to be passed to `c2init', rather than the currently-used `C2INITFLAGS' (which should only be used for option flags). The `_init.c' target should depend on these extra arguments, but it was not possible to do this automatically prior to this change (at least, not if one wanted to support per-program specification of `C2INITARGS'). compiler/modules.m: Generate the new `.dv' files and revised `.dep' files. Update the `change_clean' and `real_clean' targets to delete the `.dv' files. Update the `_init.c' rule to refer to `$(ALL_C2INITARGS)' as well as `$(ALL_C2INITFLAGS)', and add a dependency on `$(ALL_C2INITARGS)'. scripts/Mmake.rules: Add appropriate rules and dependencies for `.dv' files. scripts/Mmake.vars.in: Add definitions for implementing `C2INITARGS'. scripts/mmake.in: Add code for using `.dv' files (while maintaining backward compatibility for when they don't exist). doc/user_guide.texi: Document the new `.dv' files. Document the new `C2INITARGS' variables and the dependencies they imply. ../clpr/Mmakefile: ../clpr/samples/Mmakefile: extras/complex_numbers/samples/Mmakefile: extras/complex_numbers/tests/Mmakefile: extras/graphics/mercury_opengl/Mmakefile: extras/references/samples/Mmakefile: extras/references/tests/Mmakefile: extras/trailed_update/samples/Mmakefile: extras/trailed_update/tests/Mmakefile: Update to use `C2INITARGS' instead of `C2INITFLAGS', where appropriate, and remove any now-obsolete `%_init.c' dependencies (which wouldn't have worked anyway since GNU Make ignores pattern dependencies with no commands).
324 lines
9.5 KiB
Plaintext
324 lines
9.5 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 change_clean 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
|
|
|
|
#-----------------------------------------------------------------------------#
|