Files
mercury/compiler/Mmakefile
Julien Fischer f1cc066ab0 Remove workarounds for depend_ints on Windows.
The changes to file copying in the compiler in early 2024 mean that we no
longer encounter the same performance problems these workarounds were put
in place to avoid.

compiler/Mmakefile:
library/Mmakefile:
    As above.
2026-01-07 16:55:55 +11:00

291 lines
8.9 KiB
Makefile

#-----------------------------------------------------------------------------#
# vim: ts=8 sw=8 noexpandtab ft=make
#-----------------------------------------------------------------------------#
# Copyright (C) 1995-2003, 2005-2012 The University of Melbourne.
# Copyright (C) 2013-2017, 2019-2020, 2022-2024, 2026 The Mercury team.
# This file may only be copied under the terms of the GNU General
# Public Licence - see the file COPYING in the Mercury distribution.
#-----------------------------------------------------------------------------#
# Mmake - this is Mmake file for building the Mercury compiler
MERCURY_DIR=..
LINK_STATIC=yes
include $(MERCURY_DIR)/Mmake.common
# Override the settings in ../Mmake.workspace so that in debugging grades we
# do not include mer_mdbcomp.init twice in the list of files passed to mkinit.
#
C2INITFLAGS = \
--trace-init-file $(BROWSER_DIR)/$(BROWSER_LIB_NAME).init \
--ssdb-init-file $(SSDB_DIR)/$(SSDB_LIB_NAME).init
-include Mmake.compiler.params
# Override the default rule in `mmake --use-mmc-make' that asks `mmc' to
# create a missing optional params file for us.
Mmake.compiler.params:
# Module-specific options should go in Mercury.options so they
# can be found by `mmc --make'.
include Mercury.options
MAIN_TARGET=all
MERCURY_MAIN_MODULES = mercury_compile
PDBS = $(patsubst %,%.pdb,$(MERCURY_MAIN_MODULES))
VPATH = \
$(LIBRARY_DIR) \
$(MDBCOMP_DIR) \
$(BROWSER_DIR) \
$(SSDB_DIR)
#-----------------------------------------------------------------------------#
MCFLAGS += --flags COMP_FLAGS $(CONFIG_OVERRIDE)
# XXX Why does one branch of this set MLLIBS and the other MLOBJS?
ifeq ("$(filter csharp% java%,$(GRADE))","")
MLLIBS += $(THREAD_LIBS)
else
MLOBJS =
endif
ALL_MLLIBS = $(MLLIBS) $(EXTRA_MLLIBS)
MLFLAGS += --shared
C2INITARGS += $(MDBCOMP_DIR)/$(MDBCOMP_LIB_NAME).init
# -Xmx256m doesn't always seem to be enough memory to build the compiler.
# This bumps up the memory when building the compiler if the javac executable
# accepts the -J-Xmx flag, without bumping up the memory requirements in
# general.
ifneq ("$(findstring -J\"-Xmx,$(JAVACFLAGS))","")
JAVACFLAGS += -J\"-Xmx2048m\"
endif
# The default C stack size of 1Mb on Windows is not enough to bootcheck the
# system using a Mercury compiler built in the hlc.gc grade with MinGW-w64 GCC,
# Cygwin GCC or MinGW64 clang.
# XXX For MSVC, we currently set the stack size in the ml script.
ifneq ("$(USING_MICROSOFT_CL_COMPILER)", "yes")
ifneq ("$(findstring x86_64-w64-mingw32,$(FULLARCH))","")
LDFLAGS += -Wl,--stack=8388608
endif
ifneq ("$(findstring x86_64-pc-cygwin,$(FULLARCH))","")
LDFLAGS += -Wl,--stack=8388608
endif
endif
# If we are compiling using MSVC, then enable the use of the C runtime library
# extension that enables wildcard expansion for command lines. On Windows,
# wildcard expansion is *not* done by the shell.
ifeq ("$(USING_MICROSOFT_CL_COMPILER)", "yes")
MLFLAGS += --use-msvc-setargv-extension
endif
#-----------------------------------------------------------------------------#
# Targets.
# Specify the name of the top-level module to build.
MC_PROG = mercury_compile
.PHONY: depend
depend: $(MC_PROG).depend_ints
.PHONY: depend_only
depend_only: $(MC_PROG).depend
$(MC_PROG).depend: Mercury.modules COMP_FLAGS
$(MC_PROG).depend_ints: Mercury.modules COMP_FLAGS
# This directory contains source files for which the module
# name doesn't match the file name, so smart recompilation
# won't work without the Mercury.modules file.
# XXX this .PHONY directive is required when building the source
# distribution -- why?
.PHONY: Mercury.modules
Mercury.modules: COMP_FLAGS
$(MC) $(ALL_GRADEFLAGS) $(ALL_MCFLAGS) -f *.m
.PHONY: all
all: mercury $(TAGS_FILE_EXISTS)
.PHONY: mercury
mercury: mercury_compile
#-----------------------------------------------------------------------------#
# Tell the C# compiler where the stdlib and mdbcomp assemblies are.
#
ifneq ("$(filter csharp%,$(GRADE))","")
CSCFLAGS=-lib:../library -r:mer_std.dll -lib:../mdbcomp -r:mer_mdbcomp.dll
endif
#-----------------------------------------------------------------------------#
# Add some additional dependencies, so that Mmake knows to remake the
# compiler if one of the libraries changes.
ifeq ("$(filter csharp% java%,$(GRADE))","")
$(MC_PROG): $(RUNTIME_DIR)/lib$(RT_LIB_NAME).$A
$(MC_PROG): $(LIBRARY_DIR)/lib$(STD_LIB_NAME).$A
$(MC_PROG): $(MDBCOMP_DIR)/lib$(MDBCOMP_LIB_NAME).$A
$(MC_PROG): $(BROWSER_DIR)/lib$(BROWSER_LIB_NAME).$A
$(MC_PROG): $(SSDB_DIR)/lib$(SSDB_LIB_NAME).$A
$(MC_PROG): $(TRACE_DIR)/lib$(TRACE_LIB_NAME).$A
$(MC_PROG): $(TRACE_DIR)/lib$(EVENTSPEC_LIB_NAME).$A
# XXX should also depend on $(BOEHM_GC_DIR)/libgc(_prof).$A, but only
# if in .gc(.prof) grade
endif
#-----------------------------------------------------------------------------#
.PHONY: check
check: $(MC_PROG).check
.PHONY: ints
int3s: $(MC_PROG).int3s
.PHONY: ints
ints: $(MC_PROG).ints
#-----------------------------------------------------------------------------#
# We need the shenanigans with .compiler_tags to avoid situations in which an
# "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.
.PHONY: tags
tags: .compiler_tags
.compiler_tags: $(MTAGS) \
$(wildcard *.m) \
$(wildcard $(LIBRARY_DIR)/*.m) \
$(wildcard $(MDBCOMP_DIR)/*.m)
$(MTAGS) $(MTAGSFLAGS) *.m $(LIBRARY_DIR)/*.m $(MDBCOMP_DIR)/*.m
@touch .compiler_tags
.PHONY: tags_file_exists
tags_file_exists:
@if test ! -f tags; then echo making tags; \
$(MTAGS) $(MTAGSFLAGS) *.m $(LIBRARY_DIR)/*.m $(MDBCOMP_DIR)/*.m; \
touch .compiler_tags; \
fi
$(MC_PROG).stats: source_stats.awk $($(MC_PROG).ms)
awk -f `vpath_find source_stats.awk` \
`vpath_find $($(MC_PROG).ms)` > $@
#-----------------------------------------------------------------------------#
.PHONY: dates
dates:
touch $($(MC_PROG).dates)
#-----------------------------------------------------------------------------#
# The documentation of the reason for this set of rules
# can be found in library/Mmakefile.
# Note that the all_cs and all_os targets don't build
# mercury_compile_init.{c,o}.
.PHONY: all_os all_cs all_css all_javas all_opts
ifeq ($(MMAKE_USE_MMC_MAKE),yes)
all_os: $(MC_PROG).all_os
all_cs: $(MC_PROG).all_cs
all_css: $(MC_PROG).all_css
all_javas: $(MC_PROG).all_javas
all_opts: $(MC_PROG).all_opts
else
ifneq ($(origin $(MC_PROG).all_os),undefined)
all_os: $($(MC_PROG).all_os)
all_cs: $($(MC_PROG).all_cs)
all_css: $($(MC_PROG).all_css)
all_javas: $($(MC_PROG).all_javas)
all_opts: $($(MC_PROG).all_opts)
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
all_opts:
mmake depend; mmake all_opts
endif
endif
#-----------------------------------------------------------------------------#
clean_local:
rm -f ../main.$O $(PREPROCESSED_M_FILES) $(PP_DATE_FILES)
realclean_local:
rm -f tags $(MC_PROG).stats Mercury.modules \
COMP_FLAGS COMP_FLAGS.date mercury_compile$(EXT_FOR_EXE)
rm -f $(PDBS) vc*.pdb
#-----------------------------------------------------------------------------#
#-----------------------------------------------------------------------------#
# Installation targets
.PHONY: install
install: install_mercury
.PHONY: install_all
install_all: install_mercury
.PHONY: install_mercury
install_mercury: install_compiler
.PHONY: install_dirs
install_dirs:
-test -d $(INSTALL_MERC_BIN_DIR) || mkdir -p $(INSTALL_MERC_BIN_DIR)
# If the compiler is built in the Java grade then we need to install Java
# archive containing its class files, 'mercury_compiler.jar', but
# *not* the generated wrapper script 'mercury_compile' from this directory.
# The latter will set the CLASSPATH variable relative to this directory and
# won't work when moved to the installation directory. Instead we use the
# version of the wrapper script from the scripts directory and leave the
# one here alone.
#
# Similarly, for compilers built in the C# grade we need to install the
# executable assembly, 'mercury_compile.exe', but *not* the generated
# wrapper script 'mercury_compile' from this directory. As with the Java grade,
# we use the version of the wrapper script from the scripts directory.
# XXX This covers Mono but not actual .NET; in the latter case we don't need
# a wrapper script at all.
#
ifeq ($(findstring java,$(GRADE)),java)
INSTALL_PROGRAM=mercury_compile.jar
else ifeq ($(findstring csharp,$(GRADE)),csharp)
INSTALL_PROGRAM=mercury_compile.exe
else
INSTALL_PROGRAM=mercury_compile$(EXT_FOR_EXE)
endif
.PHONY: install_compiler
install_compiler: mercury_compile install_dirs
cp `vpath_find $(INSTALL_PROGRAM)` $(INSTALL_MERC_BIN_DIR)
#-----------------------------------------------------------------------------#
.PHONY: uninstall
uninstall:
-rm -f $(INSTALL_MERC_BIN_DIR)/$(INSTALL_PROGRAM)
#-----------------------------------------------------------------------------#