Files
mercury/deep_profiler/Mmakefile
Zoltan Somogyi 104a8ebd9e Get "make cs"/"mmc --make x.cs" to build a C# file ...
... instead of building a bunch of .c files.

Our tradition of adding an "s" at the end of a suffix to mean "all of the
files with the original suffix" had a problem when we added C# as a target
language. Until then, just as "os" stood for ".o files" when it occurred
as either a mmake target, mmc --make target, or mmake variable name component.
"cs" likewise stood for ".c files", but was now also needed to mean ".cs file".
We coped by keeping "cs" meaning ".c files", and adding "csharp" as a target
name synonym to mean ".cs file".

This diff keeps that synonym, but it changes

- the name needed to refer to ".c files" from "cs" to "all_cs"
- the name needed to refer to ".o files" from "os" to "all_os"
- the name needed to refer to ".pic_o files" from "pic_os" to "all_pic_os"
- the name needed to refer to ".cs files" from "css" to "all_css"
- the name needed to refer to ".java files" from "javas" to "all_javas"
- the name needed to refer to ".opt files" from "opts" to "all_opts"
- the name needed to refer to ".trans_opt files"
        from "trans_opts" to "all_trans_opts"

It would be nice if we could apply this same change to all other similar
target names and mmake variable name suffixes, such as "ints" and "int3s",
but some of those names are already in use to mean semantically different
things. All of the names above that used to have the form "<ext>s" and
now have the form "all_<ext>s" stood for all the files with extension
".<ext>" that are prerequisites for building a linked target, i.e.
an executable or a library. But the mmake variable name suffixes
".all_mihs", ".all_mhs" and ".all_int0s" each stand for something subtly
different: the names of files that *may or may not exist", but which,
if they do exist, should be deleted by a clean or realclean target.

To make this breaking change easier to handle by users, this diff does
not simply redefine the meaning of ".all_int0s". (It does change the meaning
of the "cs" target, but the fact this will happen at some time has been
announced ages ago.) Instead, it defines three new mmake var suffixes,
".mihs_to_clean", ".mhs_to_clean" and ".int0s_to_clean", which are
synonyms for ".all_mihs", ".all_mhs" and ".all_int0s" respectively,
and announces that ".all_mihs", ".all_mhs" and ".all_int0s" are being
deprecated, and will have the above change of semantics applied to them
in the future.

NEWS.md:
    Announce the breaking change.

compiler/make.top_level.m:
    Stop treating the target "cs" as meaning "build all the .c files
    for this program".

    The code of classify_target_2 has long been semidet, but only in a way
    that was not apparent to the compiler. Change the code to allow the
    compiler to see its semidet nature while keeping the algorithm the same,
    except for the change in the paragraph above.

    This includes keeping e.g. "ints" as meaning "build all the .int/.int2
    files needed by this program".

compiler/write_deps_file.m:
    Stop generating mmake variables with suffixes ".cs", ".os", ".pic_os",
    ".javas" and ".css". The mmake variables with suffixes ".all_cs",
    ".all_os", ".all_pic_os", ".all_javas" and ".all_css" already existed.
    All had the same value as the mmake variable without the "all",
    with one exception: ".cs". However, in this case, the old (and still
    current) value of ".all_cs" is what the value of ".cs" *should* have been.

    Simplify some code.

The following changes in compiler/*.m are only cosmetic, but they helped me
rule out possible sources of problems with incomplete versions of this diff.

compiler/file_names.m:
    Add a version of a fact_table_file_name_return_dirs which does not
    return directories, since most of its callers don't need that info.

compiler/make.program_target.m:
    Clarify code by making variable names more descriptive,

compiler/make.file_names.m:
compiler/make.module_target.m:
    Conform to the changes above,

browser/Mmakefile:
compiler/Mmakefile:
deep_profiler/Mmakefile:
grade_lib/Mmakefile:
library/Mmakefile:
mdbcomp/Mmakefile:
mfilterjavac/Mmakefile:
profiler/Mmakefile:
slice/Mmakefile:
ssdb/Mmakefile:
    Rename os to all_os, cs to all_cs, css to all_css, javas to all_javas,
    and opts to all_opts. (There were no occurrences of trans_opts to rename.)

    Replace [s as sh command names in actions.

scripts/Mmake.vars.in:
    Specify the names of mmake variables holding the names of sets of files
    with a given extension directly, since for some of them, adding an "s"
    at the end of the name of the extension does not generate the name
    of the corresponding mmake variable anymore.

scripts/Mmake.rules:
    Use the directly specified mmake variable names from Mmake.vars.in
    in the rule for installing lbraries. Temporarily add some debugging
    output to make suree that the updated nested mmake variable references
    work as intended.

tools/bootcheck:
    Specify the names of mmake targets for making all the files in a program
    with a given extension directly, since adding an "s" at the end of the
    name of the extension does not generate the name of the corresponding
    mmake target anymore.

    Print timestamps around the action of checking namespace cleanliness,
    to allow the time taken by that action to be measured. (I kept track
    of bootchecks as they happened while working on this diff, and found
    this time to be nontrivial.)
2023-10-05 02:03:47 +11:00

406 lines
13 KiB
Makefile

#-----------------------------------------------------------------------------#
# vim: ts=8 sw=8 noexpandtab ft=make
#-----------------------------------------------------------------------------#
# Copyright (C) 1995-2012 The University of Melbourne.
# This file may only be copied under the terms of the GNU General
# Public Licence - see the file COPYING in the Mercury distribution.
#-----------------------------------------------------------------------------#
# This is the Mmakefile for building the Mercury deep profiler.
MERCURY_DIR=..
LINK_STATIC=yes
include $(MERCURY_DIR)/Mmake.common
#----------------------------------------------------------------------------#
# Override some settings from ../Mmake.workspace so that in debugging grades
# we do not include mer_mdbcomp.init when creating the _init.c files in
# this directory. We copy the mdbcomp modules into this directory so if we
# do include mer_mdbcomp.init we will end up with duplicate entries in the
# _init.c files.
C2INITFLAGS = --trace-init-file $(BROWSER_DIR)/$(BROWSER_LIB_NAME).init
#----------------------------------------------------------------------------#
-include Mmake.deep.params
# Override the default rule in `mmake --use-mmc-make' that asks `mmc'
# to create a missing optional params file.
Mmake.deep.params:
# Module-specific options should go in Mercury.options so they can be found
# by `mmc --make'.
include Mercury.options
MAIN_TARGET = all
ALL_DEEP_MAIN_MODULES = \
mdprof_cgi \
mdprof_test \
mdprof_dump \
mdprof_create_feedback \
mdprof_report_feedback \
mdprof_procrep
# Always compile the deep profiler, even if it is not enabled.
#
MAIN_TARGET=all
MERCURY_MAIN_MODULES=$(ALL_DEEP_MAIN_MODULES)
DEPEND=$(patsubst %,%.depend,$(ALL_DEEP_MAIN_MODULES))
PDBS=$(patsubst %,%.pdb,$(ALL_DEEP_MAIN_MODULES))
ifeq ("$(ENABLE_DEEP_PROFILER)","yes")
INSTALL=install_cgi_progs
else
INSTALL=nothing
endif
VPATH = $(LIBRARY_DIR) $(SSDB_DIR)
#-----------------------------------------------------------------------------#
MDBCOMP_MODULES = \
builtin_modules.m \
feedback.automatic_parallelism.m \
feedback.m \
mdbcomp.m \
mdbcomp.goal_path.m \
prim_data.m \
program_representation.m \
rtti_access.m \
shared_utilities.m \
slice_and_dice.m \
sym_name.m \
trace_counts.m
#-----------------------------------------------------------------------------#
MLFLAGS += --shared
MCFLAGS += --flags DEEP_FLAGS $(CONFIG_OVERRIDE)
#-----------------------------------------------------------------------------#
# Tell the C# compiler where the stdlib assembly is.
#
ifneq ("$(filter csharp%,$(GRADE))","")
CSCFLAGS=-lib:../library -r:mer_std.dll
endif
#-----------------------------------------------------------------------------#
ifneq ("$(filter csharp% java%,$(GRADE))","")
MLOBJS =
endif
#-----------------------------------------------------------------------------#
# The deep profiler contains quite a lot of C code for which there are
# currently not C# or Java implementations. We need to pass
# `--allow-stubs' in order to compile it.
#
ifneq ("$(filter csharp% java%,$(GRADE))","")
MCFLAGS += --allow-stubs --no-warn-stubs
endif
#-----------------------------------------------------------------------------#
.PHONY: nothing
nothing:
.PHONY: depend
depend: $(MDBCOMP_MODULES) $(DEPEND)
$(DEPEND): DEEP_FLAGS $(MDBCOMP_MODULES) Mercury.modules
# This directory contains source files for which the module name
# does not match the file name, so smart recompilation won't work
# without the Mercury.modules file.
.PHONY: Mercury.modules
Mercury.modules: DEEP_FLAGS $(MDBCOMP_MODULES)
$(MC) $(ALL_GRADEFLAGS) $(ALL_MCFLAGS) -f *.m
.PHONY: all
all: $(MDBCOMP_MODULES) $(ALL_DEEP_MAIN_MODULES) $(TAGS_FILE_EXISTS)
#-----------------------------------------------------------------------------#
#
# The programs in this directory rely on the mdbcomp package, since
# it contains the types that define the representation of Mercury programs
# for tools such as debuggers and profilers, and predicates that operate on
# those representations.
#
# If we linked ../mdbcomp/libmer_mdbcomp.so into the executables in this
# directory, then those executables would have to be compiled in the same grade
# as the modules of the mdbcomp directory, which in turn is the same grade
# as the modules of the library and compiler directories. This would work,
# but it would mean that rebuilding the tools in this directory in another
# grade (e.g. to enable debugging) would take several minutes. To avoid such
# delays, we copy across the source files of the mdbcomp library. The copied
# .m files, and the .m files that natively reside in this directory, can be
# recompiled in a different grade much more quickly than that.
#
$(MDBCOMP_MODULES): %: $(MDBCOMP_DIR)/%
-@/bin/rm -f $*
@cp $(MDBCOMP_DIR)/$* .
@chmod a-w $*
#-----------------------------------------------------------------------------#
# Add some additional dependencies, so that Mmake knows to remake the
# profiler if one of the libraries changes.
# XXX Should also depend on $(BOEHM_GC_DIR)/libgc(_prof).$A, but only
# if in .gc(.prof) grade.
RUN_LIB = \
$(RUNTIME_DIR)/lib$(RT_LIB_NAME).$A \
$(LIBRARY_DIR)/lib$(STD_LIB_NAME).$A
ifeq ("$(filter csharp% java%,$(GRADE))","")
mdprof_cgi: $(RUN_LIB)
mdprof_test: $(RUN_LIB)
mdprof_dump: $(RUN_LIB)
mdprof_create_feedback: $(RUN_LIB)
mdprof_report_feedback: $(RUN_LIB)
mdprof_procrep: $(RUN_LIB)
endif
$(cs_subdir)mdprof_cgi_init.c: $(UTIL_DIR)/mkinit$(EXT_FOR_EXE)
$(cs_subdir)mdprof_test_init.c: $(UTIL_DIR)/mkinit$(EXT_FOR_EXE)
$(cs_subdir)mdprof_dump_init.c: $(UTIL_DIR)/mkinit$(EXT_FOR_EXE)
$(cs_subdir)mdprof_create_feedback_init.c: $(UTIL_DIR)/mkinit$(EXT_FOR_EXE)
$(cs_subdir)mdprof_report_feedback_init.c: $(UTIL_DIR)/mkinit$(EXT_FOR_EXE)
$(cs_subdir)mdprof_procrep_init.c: $(UTIL_DIR)/mkinit$(EXT_FOR_EXE)
#-----------------------------------------------------------------------------#
.PHONY: check
check: DEPEND=$(patsubst %,%.check,$(ALL_DEEP_MAIN_MODULES))
.PHONY: ints
ints: DEPEND=$(patsubst %,%.ints,$(ALL_DEEP_MAIN_MODULES))
#-----------------------------------------------------------------------------#
# We need the shenanigans with .deep_tags to avoid situations in which
# "mmake tags" in this directory does nothing even in the absence of a tags
# file in this directory, because mmake uses VPATH to find ../library/tags
# and believes it to be the tags file we are asking for.
#
# We give files in mdbcomp to mtags before the files in this directory
# because we want references to entities defined in the modules copied from the
# mdbcomp directory to this directory to go the actual, effective definitions,
# the definitions which can be changed *without* those changes going away
# on the next copy.
.PHONY: tags
tags: .deep_tags
.deep_tags: $(MTAGS) $(wildcard *.m) \
$(wildcard $(MDBCOMP_DIR)/*.m) \
$(wildcard $(LIBRARY_DIR)/*.m)
$(MTAGS) $(MDBCOMP_DIR)/*.m *.m $(LIBRARY_DIR)/*.m
@touch .deep_tags
.PHONY: tags_file_exists
tags_file_exists:
@if test ! -f tags; \
then \
echo making tags; \
$(MTAGS) *.m $(MDBCOMP_DIR)/*.m $(LIBRARY_DIR)/*.m; \
touch .deep_tags; \
fi
#-----------------------------------------------------------------------------#
.PHONY: dates
dates:
touch $(mdprof_cgi.dates) \
$(mdprof_test.dates) \
$(mdprof_dump.dates) \
$(mdprof_create_feedback.dates) \
$(mdprof_report_feedback.dates) \
$(mdprof_procrep.dates)
#-----------------------------------------------------------------------------#
# The documentation of the reason for this set of rules
# can be found in library/Mmakefile.
.PHONY: all_os all_cs all_css all_javas
ifeq ($(MMAKE_USE_MMC_MAKE),yes)
all_os: \
mdprof_cgi.all_os \
mdprof_test.all_os \
mdprof_dump.all_os \
mdprof_create_feedback.all_os \
mdprof_report_feedback.all_os \
mdprof_procrep.all_os
all_cs: \
mdprof_cgi.all_cs \
mdprof_test.all_cs \
mdprof_dump.all_cs \
mdprof_create_feedback.all_cs \
mdprof_report_feedback.all_cs \
mdprof_procrep.all_cs
all_css: \
mdprof_cgi.all_css \
mdprof_test.all_css \
mdprof_dump.all_css \
mdprof_create_feedback.all_css \
mdprof_report_feedback.all_css \
mdprof_procrep.all_css
all_javas: \
mdprof_cgi.all_javas \
mdprof_test.all_javas \
mdprof_dump.all_javas \
mdprof_create_feedback.all_javas \
mdprof_report_feedback.all_javas \
mdprof_procrep.all_javas
else
ifneq ($(origin mdprof_cgi.all_os),undefined)
all_os: \
$(mdprof_cgi.all_os) \
$(mdprof_test.all_os) \
$(mdprof_dump.all_os) \
$(mdprof_create_feedback.all_os) \
$(mdprof_report_feedback.all_os) \
$(mdprof_procrep.all_os)
all_cs: \
$(mdprof_cgi.all_cs) \
$(mdprof_test.all_cs) \
$(mdprof_dump.all_cs) \
$(mdprof_create_feedback.all_cs) \
$(mdprof_report_feedback.all_cs) \
$(mdprof_procrep.all_cs)
all_css: \
$(mdprof_cgi.all_css) \
$(mdprof_test.all_css) \
$(mdprof_dump.all_css) \
$(mdprof_create_feedback.all_css) \
$(mdprof_report_feedback.all_css) \
$(mdprof_procrep.all_css)
all_javas: \
$(mdprof_cgi.all_javas) \
$(mdprof_test.all_javas) \
$(mdprof_dump.all_javas) \
$(mdprof_create_feedback.all_javas) \
$(mdprof_report_feedback.all_javas) \
$(mdprof_procrep.all_javas)
else
all_os:
mmake depend; mmake all_os
all_cs:
mmake depend; mmake all_cs
all_css:
mmake depend; mmake all_css
all_javas:
mmake depend; mmake all_javas
endif
endif
#-----------------------------------------------------------------------------#
realclean_local:
rm -f Mercury.modules .deep_tags tags DEEP_FLAGS DEEP_FLAGS.date \
.mdbcomp_modules $(MDBCOMP_MODULES) mdbcomp.*.err
rm -f $(PDBS) vc*.pdb
#-----------------------------------------------------------------------------#
# Installation targets
.PHONY: install
install: $(INSTALL)
# We don't install mdprof_test, since it is not for users.
# The code of the install_cgi_progs target is duplicated in
# bindist/bindist.Makefile.in, though the two rules refer to mdprof_cgi
# by different paths.
.PHONY: install_cgi_progs
install_cgi_progs: mdprof_cgi mdprof_dump mdprof_test \
mdprof_create_feedback mdprof_report_feedback
# $(INSTALL_CGI_DIR) is likely to be writeable only by root or
# the www system administrator, which is why we don't consider a
# failure of this action to be an error. If the command fails,
# the install action in ../Mmakefile will remind the user to do
# the copy later.
#
# The mv before the cp is there in case the executable is being
# executed when we do the install. The mv is of course expected to
# fail during a first-time installation. The rm is before the move
# in case this is the third or later installation.
-if test $(ENABLE_DEEP_PROFILER) = yes ; then \
if test -w $(INSTALL_CGI_DIR) ; then \
rm -f $(INSTALL_CGI_DIR)/mdprof_cgi.was ; \
mv -f $(INSTALL_CGI_DIR)/mdprof_cgi \
$(INSTALL_CGI_DIR)/mdprof_cgi.was ; \
cp mdprof_cgi $(INSTALL_CGI_DIR) ; \
else \
echo "cannot install mdprof_cgi: " \
"$(INSTALL_CGI_DIR) is not writeable"; \
fi \
fi
# We also install mdprof_cgi in $(INSTALL_MERC_BIN_DIR).
# This is done just so that it can easily get put in the binary
# distribution (even if the step above failed). It is useful for
# mdprof_test and mdprof_dump to be available when debugging problems
# with the deep profiler, so we install them as well.
-test -d $(INSTALL_MERC_BIN_DIR) || mkdir -p $(INSTALL_MERC_BIN_DIR)
cp `vpath_find mdprof_cgi$(EXT_FOR_EXE)` \
$(INSTALL_MERC_BIN_DIR)/mdprof_cgi$(EXT_FOR_EXE)
cp `vpath_find mdprof_test$(EXT_FOR_EXE)` \
$(INSTALL_MERC_BIN_DIR)/mdprof_test$(EXT_FOR_EXE)
cp `vpath_find mdprof_dump$(EXT_FOR_EXE)` \
$(INSTALL_MERC_BIN_DIR)/mdprof_dump$(EXT_FOR_EXE)
cp `vpath_find mdprof_create_feedback$(EXT_FOR_EXE)` \
$(INSTALL_MERC_BIN_DIR)/mdprof_create_feedback$(EXT_FOR_EXE)
cp `vpath_find mdprof_report_feedback$(EXT_FOR_EXE)` \
$(INSTALL_MERC_BIN_DIR)/mdprof_report_feedback$(EXT_FOR_EXE)
ifeq ($(findstring java,$(GRADE)),java)
cp `vpath_find mdprof_cgi.jar` $(INSTALL_MERC_BIN_DIR)
cp `vpath_find mdprof_create_feedback.jar` $(INSTALL_MERC_BIN_DIR)
cp `vpath_find mdprof_dump.jar` $(INSTALL_MERC_BIN_DIR)
cp `vpath_find mdprof_procrep.jar` $(INSTALL_MERC_BIN_DIR)
cp `vpath_find mdprof_report_feedback.jar` $(INSTALL_MERC_BIN_DIR)
cp `vpath_find mdprof_test.jar` $(INSTALL_MERC_BIN_DIR)
endif
#-----------------------------------------------------------------------------#
.PHONY: uninstall
uninstall:
# We try to uninstall mdprof_cgi, but failure to do so is not an
# error for two reasons: because we may simply lack permission to
# update the directory, and because the deep profiler installation
# may not have been enabled in the first place. (Looking at the current
# value of $(ENABLE_DEEP_PROFILER) to check for the latter wouldn't
# necessarily do any good, since its setting may have changed since
# the original install.)
-rm -f $(INSTALL_CGI_DIR)/mdprof_cgi$(EXT_FOR_EXE)
-rm -f $(INSTALL_MERC_BIN_DIR)/mdprof_cgi$(EXT_FOR_EXE)
-rm -f $(INSTALL_MERC_BIN_DIR)/mdprof_test$(EXT_FOR_EXE)
-rm -f $(INSTALL_MERC_BIN_DIR)/mdprof_dump$(EXT_FOR_EXE)
-rm -f $(INSTALL_MERC_BIN_DIR)/mdprof_create_feedback$(EXT_FOR_EXE)
-rm -f $(INSTALL_MERC_BIN_DIR)/mdprof_report_feedback$(EXT_FOR_EXE)
-rm -f $(INSTALL_MERC_BIN_DIR)/mdprof_procrep$(EXT_FOR_EXE)
#-----------------------------------------------------------------------------#