mirror of
https://github.com/Mercury-Language/mercury.git
synced 2025-12-05 23:35:47 +00:00
643 lines
22 KiB
Makefile
643 lines
22 KiB
Makefile
#---------------------------------------------------------------------------#
|
|
# vim: ts=8 sw=8 noexpandtab ft=make
|
|
#---------------------------------------------------------------------------#
|
|
# Copyright (C) 1995-2006, 2009-2012 The University of Melbourne.
|
|
# Copyright (C) 2013-2014, 2016-2017, 2019-2020, 2022-2025 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.common - this is the part of the makefiles for building the Mercury
|
|
# implementation that is shared between all the subdirectories. It also
|
|
# contains all the parameters that might need to be modified when installing
|
|
# Mercury on a new machine.
|
|
|
|
# These parameters should all be determined automatically by `configure'.
|
|
# Any definitions in the Mmake.params file take precedence over the
|
|
# definitions here, so if you want to change one of the values here
|
|
# it is best to just add a definition to Mmake.params.
|
|
|
|
#---------------------------------------------------------------------------#
|
|
|
|
include $(MERCURY_DIR)/VERSION
|
|
|
|
#---------------------------------------------------------------------------#
|
|
#
|
|
# Make variables whose values are set *only* by the configure script.
|
|
#
|
|
# Note that the Make variable MC, whose values are set by the configure script
|
|
# and *also* by Mmake.workspace, has its definition after the inclusion
|
|
# of Mmake.workspace, in order to maintain the traditional ordering.
|
|
#
|
|
|
|
#---------------------#
|
|
|
|
# This affects code in Mmake.workspace, so must be set before we include
|
|
# that file.
|
|
CROSS_COMPILING = @CROSS_COMPILING@
|
|
|
|
#---------------------#
|
|
#
|
|
# Autoconfigured parameters for building the Boehm collector.
|
|
#
|
|
|
|
# Specify a C compiler to build executables that can be executed on the build
|
|
# system itself, as part of the Boehm GC build process. The name is confusing
|
|
# because it conflicts with the autoconf meaning of "host", but it comes from
|
|
# upstream.
|
|
HOSTCC = @BUILD_C_PROGS_FOR_BUILD_SYSTEM@
|
|
|
|
# Options to pass to the C compiler when building Boehm-GC.
|
|
BOEHM_CFLAGS = \
|
|
@ENABLE_BOEHM_LARGE_CONFIG@ \
|
|
@ENABLE_BOEHM_USE_MMAP@ \
|
|
@ENABLE_BOEHM_USE_MUNMAP@ \
|
|
@ENABLE_BOEHM_XOPEN_SOURCE@ \
|
|
@BOEHM_NO_GETCONTEXT@ \
|
|
@BOEHM_HAVE_DL_ITERATE_PTR@
|
|
|
|
# Additional options to pass to the C compiler when
|
|
# building Boehm-GC for threads.
|
|
BOEHM_CFLAGS_FOR_THREADS = \
|
|
@BOEHM_CFLAGS_FOR_THREADS@ \
|
|
@ENABLE_BOEHM_THREAD_LOCAL_ALLOC@ \
|
|
@ENABLE_BOEHM_PARALLEL_MARK@
|
|
|
|
# Whether Boehm-GC needs object files built from libatomic_ops .S files.
|
|
BOEHM_NEED_ATOMIC_OPS_ASM = @BOEHM_NEED_ATOMIC_OPS_ASM@
|
|
|
|
# The CPU type to pass via the "cpu" argument of boehm_gc/NT_MAKEFILE.
|
|
# (This is only relevant when using MSVC.)
|
|
BOEHM_WINDOWS_CPU_TYPE = @BOEHM_WINDOWS_CPU_TYPE@
|
|
|
|
#---------------------#
|
|
#
|
|
# Autoconfigured hardware properties of the host machine.
|
|
#
|
|
|
|
# The host triplet is used to configure libatomic_ops.
|
|
FULLARCH = @FULLARCH@
|
|
|
|
#---------------------#
|
|
#
|
|
# Autoconfigured extensions on the host machine.
|
|
#
|
|
|
|
# Extensions to use for object files and archives.
|
|
O = @OBJ_SUFFIX@
|
|
A = @LIB_SUFFIX@
|
|
|
|
# Specify EXT_FOR_PIC_OBJECTS as `pic_o' if any special $(PIC) flags are
|
|
# required (see above), and as `o' otherwise. This is used to ensure that
|
|
# we don't bother to build the .pic_o files if $(PIC) is null, since we can
|
|
# just reuse the .o files.
|
|
EXT_FOR_PIC_OBJECTS = @EXT_FOR_PIC_OBJECTS@
|
|
|
|
# Specify EXT_FOR_SHARED_LIB as `so' if the operating system
|
|
# supports `.so' shared libraries,
|
|
# `.dll' if it supports DLLs,
|
|
# or as `a' if it doesn't.
|
|
EXT_FOR_SHARED_LIB = @EXT_FOR_SHARED_LIB@
|
|
|
|
# Specify EXT_FOR_EXE is `.exe' on MS-Windows and empty elsewhere.
|
|
EXT_FOR_EXE = @EXT_FOR_EXE@
|
|
|
|
#---------------------#
|
|
#
|
|
# The autoconfigured bootstrap compiler.
|
|
#
|
|
|
|
BOOTSTRAP_MC = @BOOTSTRAP_MC_COMPILER@
|
|
|
|
#---------------------#
|
|
#
|
|
# Autoconfigured properties of the host machine C compiler.
|
|
#
|
|
|
|
# Are we compiling using the MS C compiler?
|
|
USING_MICROSOFT_CL_COMPILER = @USING_MICROSOFT_CL_COMPILER@
|
|
|
|
# NOTE: This file does not define $(CC), whose value is autoconfigured,
|
|
# but it does use it.
|
|
|
|
# Specify the Mmake command to link a shared library.
|
|
# This is only used if EXT_FOR_SHARED_LIB was defined as `so' above.
|
|
# This command may reference $(SO_LOCATIONS_DIR).
|
|
#
|
|
# LINK_SHARED_OBJ = gcc -shared # for Solaris etc.
|
|
LINK_SHARED_OBJ = @LINK_SHARED_OBJ@
|
|
|
|
# This is the same as LINK_SHARED_OBJ except that it specifies
|
|
# a Bourne shell command rather than an Mmake command, so if it references
|
|
# the SO_LOCATIONS_DIR variable, it must use ${SO_LOCATIONS_DIR}
|
|
# rather than $(SO_LOCATIONS_DIR).
|
|
LINK_SHARED_OBJ_SH = @LINK_SHARED_OBJ_SH@
|
|
|
|
# Specify USE_DLLs as `yes' if the OS supports Windows-style DLLs.
|
|
USE_DLLS = @USE_DLLS@
|
|
|
|
# The option needed to name object files.
|
|
# We need to use $(empty_string) here to prevent Make from truncating
|
|
# any trailing spaces in -o
|
|
# XXX In what exactly? The string "-o" has no trailing spaces.
|
|
empty_string=
|
|
OBJFILE_OPT = @OBJFILE_OPT@$(empty_string)
|
|
|
|
# Specify any special flags to pass to the C compiler when creating objects
|
|
# for a shared library (e.g. -fpic or -fPIC for gcc).
|
|
CFLAGS_FOR_PIC = @CFLAGS_FOR_PIC@
|
|
|
|
# Specify any options required when linking if AddressSanitizer and other
|
|
# sanitizers are enabled.
|
|
LDFLAGS_FOR_SANITIZERS = @LDFLAGS_FOR_SANITIZERS@
|
|
|
|
# The following variables specify how to pass options to the $(CC) or
|
|
# $(LINK_SHARED_OBJ) command to specify directories to be searched at
|
|
# runtime for shared libraries.
|
|
# Normally RPATH_OPT is either "-R" or "-rpath ", but you may need to
|
|
# do something special to get the C compiler to pass this option on
|
|
# to the linker (e.g. with gcc you can use "-Wl,-rpath,").
|
|
# RPATH_SEP is a path separator; normally either ":"
|
|
# or just RPATH_OPT with a space in front of it.
|
|
# The SHLIB_ versions are used when linking shared libraries
|
|
# (perhaps invoking ld directly, rather than via the C compiler).
|
|
# The EXE_ versions are used when linking executables.
|
|
# The empty single quote pairs below are there to ensure that `make'
|
|
# does not throw away any important trailing or leading whitespace.
|
|
SHLIB_RPATH_OPT = @SHLIB_RPATH_OPT@''
|
|
SHLIB_RPATH_SEP = ''@SHLIB_RPATH_SEP@''
|
|
EXE_RPATH_OPT = @EXE_RPATH_OPT@''
|
|
EXE_RPATH_SEP = ''@EXE_RPATH_SEP@''
|
|
|
|
# These variables can be used to set the install-name for the Mercury
|
|
# shared libraries on systems that use the install-name option (such as
|
|
# Darwin). XXX The two-single-quotes in a row are very unusual, and
|
|
# the reason why they are needed should be documented.
|
|
SHLIB_USE_INSTALL_NAME = @SHLIB_USE_INSTALL_NAME@
|
|
SHLIB_INSTALL_NAME_FLAG = @SHLIB_INSTALL_NAME_FLAG@''
|
|
|
|
# Specify any extra libraries that must be linked in when linking shared
|
|
# objects.
|
|
SHARED_LIBS = @SHARED_LIBS@
|
|
|
|
# Is getopt() available?
|
|
# This is not *strictly* a property of the host compiler, but
|
|
# it does not fit anywhere else either.
|
|
HAVE_GETOPT = @HAVE_GETOPT@
|
|
|
|
#---------------------#
|
|
#
|
|
# Autoconfigured library names or locations.
|
|
#
|
|
|
|
# The linker option to use to link in the math library, if any.
|
|
# Typically `-lm'.
|
|
MATH_LIB = @MATH_LIB@
|
|
|
|
# More libraries to link.
|
|
THREAD_LIBS = @THREAD_LIBS@
|
|
SOCKET_LIBRARY = @SOCKET_LIBRARY@
|
|
NSL_LIBRARY = @NSL_LIBRARY@
|
|
DL_LIBRARY = @DL_LIBRARY@
|
|
READLINE_LIBRARIES = @READLINE_LIBRARIES@
|
|
TERMCAP_LIBRARY = @TERMCAP_LIBRARY@
|
|
HWLOC_CFLAGS = @HWLOC_CFLAGS@
|
|
HWLOC_LIBS = @HWLOC_LIBS@
|
|
|
|
#---------------------#
|
|
#
|
|
# Configured installation parameters.
|
|
#
|
|
|
|
# Set the installation prefix. This is done here as well as
|
|
# in scripts/Mmake.vars to avoid accidentally overwriting an
|
|
# existing installation when using an installed mmake.
|
|
ifeq ($(DESTDIR),)
|
|
# DESTDIR is the empty string, DESTDIR_AND_SLASH must therefore
|
|
# be empty. Otherwise, the slash can change a relative path
|
|
# into an absolute one; or on Windows, it can create an invalid
|
|
# path name.
|
|
DESTDIR_AND_SLASH=
|
|
else
|
|
# We cannot append paths like this in Windows, but we don't think
|
|
# anyone will use DESTDIR on Windows.
|
|
DESTDIR_AND_SLASH=$(DESTDIR)/
|
|
endif
|
|
|
|
INSTALL_PREFIX = $(DESTDIR_AND_SLASH)@prefix@
|
|
FINAL_INSTALL_PREFIX = @prefix@
|
|
|
|
INSTALLABLE_PREFIX = @INSTALLABLE_PREFIX@
|
|
|
|
INSTALL_MERC_GC_LIB_DIR = $(INSTALL_MERC_GRADELESS_LIB_DIR)
|
|
FINAL_INSTALL_MERC_GC_LIB_DIR = $(FINAL_INSTALL_MERC_GRADELESS_LIB_DIR)
|
|
|
|
# Should we install batch files (and other Windows specific files)?
|
|
INSTALL_WINDOWS_SCRIPTS = @INSTALL_WINDOWS_SCRIPTS@
|
|
|
|
# Enable building of the deep profiler?
|
|
# The value of ENABLE_DEEP_PROFILER is either yes or no.
|
|
ENABLE_DEEP_PROFILER = @ENABLE_DEEP_PROFILER@
|
|
|
|
#---------------------#
|
|
#
|
|
# The default grade selected by autoconfiguration, and its implications.
|
|
#
|
|
|
|
# Specify the compilation model to use for compiling the compiler.
|
|
GRADE = @GRADE@
|
|
|
|
# By default, GRADESTRING is defined as the result of invoking
|
|
# `mmc --output-grade-string' with $(GRADE) and $(GRADEFLAGS).
|
|
# But when installing the standard library, the compiler will not yet
|
|
# have been installed. So we need to define GRADESTRING here, in a way
|
|
# that doesn't require invoking mmc.
|
|
#
|
|
# Note that the definition below does _not_ include GRADEFLAGS.
|
|
# So any changes to the grade flags for the standard library or
|
|
# compiler itself should be done by setting GRADE, not GRADEFLAGS.
|
|
GRADESTRING = $(shell $(SCRIPTS_DIR)/canonical_grade $(ALL_GRADEFLAGS))
|
|
|
|
# The following variables specify options to $LINK_SHARED_OBJ to
|
|
# allow/disallow unresolved symbols when building shared libraries.
|
|
ALLOW_UNDEFINED = @ALLOW_UNDEFINED@
|
|
ERROR_UNDEFINED = @ERROR_UNDEFINED@
|
|
|
|
# The thread-safe version of the Boehm GC library links in lots
|
|
# of system-specific libraries that we don't want to have to
|
|
# explicitly link in when building the Mercury shared libraries,
|
|
# so override ERROR_UNDEFINED in that case.
|
|
ifeq "$(findstring .par,$(GRADE))$(findstring .gc,$(GRADE))" ".par.gc"
|
|
ERROR_UNDEFINED = $(ALLOW_UNDEFINED)
|
|
endif
|
|
|
|
#---------------------#
|
|
#
|
|
# Autoconfigured commands, mostly to build documentation and tools.
|
|
#
|
|
|
|
INSTALL_INFO = @INSTALL_INFO@
|
|
INFO = @INFO@
|
|
TEXI2DVI = @TEXI2DVI@
|
|
DVIPS = @DVIPS@
|
|
PDFTEX = @PDFTEX@
|
|
MAKEINFO = @MAKEINFO@
|
|
LYNX = @LYNX@
|
|
PERL = @PERL@
|
|
NM = @NM@
|
|
|
|
#---------------------------------------------------------------------------#
|
|
#
|
|
# The inclusion of Mmake.workspace.
|
|
#
|
|
# We should swap the sections that include Mmake.workspace and Mmake.params,
|
|
# as this should allow the instructions in README.java.md and README.CSharp.md
|
|
# to be simplified.
|
|
#
|
|
|
|
# The rpath for the libraries needs to be set to the final installation
|
|
# directory, not $(MERCURY_DIR)/runtime etc.
|
|
SET_RPATH=no
|
|
|
|
WORKSPACE=$(MERCURY_DIR)
|
|
include $(MERCURY_DIR)/Mmake.workspace
|
|
|
|
#---------------------------------------------------------------------------#
|
|
#
|
|
# The inclusion of Mmake.params.
|
|
#
|
|
# We define LIBRARY_INTERMODULE and LIBRARY_TRACE_MINIMUM here explicitly
|
|
# because we expect that sometimes, Mmake.params will override the
|
|
# default values we set here.
|
|
#
|
|
|
|
# Do we want to deal with intermodule information when building the library?
|
|
# By default yes, since this way we note immediately when intermodule
|
|
# optimization breaks, and always at installation time, since we must install
|
|
# the library's .opt and .trans_opt files as well. However, during development
|
|
# some problems are easier to track down without intermodule optimization
|
|
# complicating things.
|
|
# Some test cases assume that the library is compiled intermodule optimization,
|
|
# so it is not a good idea to disable it in a bootcheck.
|
|
LIBRARY_INTERMODULE = yes
|
|
|
|
# Do we want to compile the library with --trace minimum?
|
|
# By default yes, since the library is pretty well debugged. However,
|
|
# when it is being modified, it may have bugs we may want to chase down,
|
|
# so we allow the user to override this by setting LIBRARY_TRACE_MINIMUM to no.
|
|
# However, the test cases assume that the library is compiled with --trace
|
|
# minimum, so if you do that, expect test case failures in the debugger
|
|
# directory.
|
|
LIBRARY_TRACE_MINIMUM = yes
|
|
|
|
# The Mmake.params file can be used to override definitions in this file
|
|
-include $(MERCURY_DIR)/Mmake.params
|
|
|
|
# Avoid trying to make this file with `mmc --make' if it doesn't exist.
|
|
$(MERCURY_DIR)/Mmake.params: ;
|
|
|
|
#---------------------------------------------------------------------------#
|
|
#
|
|
# While we set MC here, Mmake.workspace also sets it above,
|
|
# to point to $(SCRIPTS_DIR)/mmc.
|
|
#
|
|
# We want to ensure that
|
|
#
|
|
# - the definition here is active when compiling stage 1, while
|
|
#
|
|
# - the definition in Mmake.workspace is active in mmakefiles
|
|
# that include Mmake.workspace but do NOT include this file.
|
|
#
|
|
|
|
MC = $(BOOTSTRAP_MC)
|
|
|
|
# Options to pass to the Mercury compiler.
|
|
# This is now included in FLAGS files.
|
|
# MCFLAGS += --no-infer-all --halt-at-warn --no-warn-inferred-erroneous
|
|
|
|
#---------------------------------------------------------------------------#
|
|
|
|
# Module-specific options should go in Mercury.options,
|
|
# so they can be found by `mmc --make'.
|
|
include $(MERCURY_DIR)/Mercury.options
|
|
|
|
$(MERCURY_DIR)/Mercury.options:
|
|
@if test ! -f $(MERCURY_DIR)/Mercury.options ; then \
|
|
touch $(MERCURY_DIR)/Mercury.options; \
|
|
fi
|
|
|
|
#---------------------------------------------------------------------------#
|
|
|
|
# Making the tags file for a directory containing Mercury source files
|
|
# requires giving mmake access to the list of source files in the directory.
|
|
# We normally do this by having the programs' and/or libraries .dv files
|
|
# define make variables such as "mer_std.ms".
|
|
#
|
|
# Mmc --make does not create .dv files, so these make variable don't get
|
|
# defined. The resulting invocation of mtags with an empty argument list
|
|
# (the default value of an undefined make variable) would yield an error.
|
|
ifeq ($(MMAKE_USE_MMC_MAKE),yes)
|
|
TAGS_FILE_EXISTS =
|
|
else
|
|
ifdef ALWAYS_MMAKE_TAGS_FILE
|
|
TAGS_FILE_EXISTS = tags_file_exists
|
|
else
|
|
TAGS_FILE_EXISTS =
|
|
endif
|
|
endif
|
|
|
|
#---------------------------------------------------------------------------#
|
|
#
|
|
# `mmake check_namespace' performs various checks on the header files
|
|
# and object files to make sure that they conform with our coding standards.
|
|
#
|
|
|
|
# The #endif for this #ifdef is almost at the end of this file.
|
|
ifdef CHECK_OBJS
|
|
|
|
HDR_CHECK_CS = $(CHECK_HDRS:.h=.check_hdr.c)
|
|
HDR_CHECK_POBJS = $(CHECK_HDRS:.h=.check_hdr.pseudo_o)
|
|
HDR_CHECK_MACROS = $(CHECK_HDRS:.h=.check.macros)
|
|
MHDR_CHECK_CS = $(CHECK_MHDRS:.mh=.check_mhdr.c)
|
|
MHDR_CHECK_POBJS = $(CHECK_MHDRS:.mh=.check_mhdr.pseudo_o)
|
|
MHDR_CHECK_MACROS = $(CHECK_MHDRS:.mh=.check.mmacros)
|
|
OBJ_CHECKS = $(CHECK_OBJS:%=%.obj_check)
|
|
|
|
# Macro names must normally start with one of the prefixes associated
|
|
# with the different components of our system:
|
|
# `MR_' or `MERCURY_' for stuff in the Mercury runtime implementation
|
|
# (the `runtime' and `trace' directories)
|
|
# `ML_' for stuff in the Mercury standard library
|
|
# (the `library' directory)
|
|
# `MDB_' stuff in the browser
|
|
# (the `browser' directory)
|
|
# `MDBCOMP_'for stuff in the mdbcomp library
|
|
# (the `mdbcomp' directory)
|
|
# `GC_' for stuff in the Boehm et al conservative garbage collector
|
|
# (the `boehm_gc' directory)
|
|
# Exceptions to this policy must be listed in the RESERVED_MACRO_NAMES file
|
|
# in the top directory (if applicable to all C source directories) or in
|
|
# the relevant directory (if applicable only to some C source directories).
|
|
#
|
|
# XXX The base_typeclass_info prefix is allowed only temporarily; it should
|
|
# be fixed by adding a prefix giving the name of the module defining the
|
|
# typeclass.
|
|
|
|
GEN_MACRO_PREFIX_EXPRS = \
|
|
-e '^MR_' -e '^MERCURY_' -e '^GC_'
|
|
GEN_OBJ_PREFIX_EXPRS = \
|
|
-e '^@SYMPREFIX@MR_' -e '^_entry' -e '^@SYMPREFIX@mercury_' \
|
|
-e '^@SYMPREFIX@base_typeclass_info_'
|
|
|
|
ifeq ("$(ALLOW_LIB_PREFIX)","yes")
|
|
LIB_MACRO_PREFIX_EXPRS = \
|
|
-e '^ML_'
|
|
LIB_OBJ_PREFIX_EXPRS = \
|
|
-e '^@SYMPREFIX@ML_'
|
|
else
|
|
LIB_MACRO_PREFIX_EXPRS =
|
|
LIB_OBJ_PREFIX_EXPRS =
|
|
endif
|
|
|
|
ifeq ("$(ALLOW_BROWSER_PREFIX)","yes")
|
|
BROWSER_MACRO_PREFIX_EXPRS = \
|
|
-e '^MDB_'
|
|
BROWSER_OBJ_PREFIX_EXPRS = \
|
|
-e '^@SYMPREFIX@MDB_' -e '^@SYMPREFIX@mdb_'
|
|
else
|
|
BROWSER_MACRO_PREFIX_EXPRS =
|
|
BROWSER_OBJ_PREFIX_EXPRS =
|
|
endif
|
|
|
|
ifeq ("$(ALLOW_MDBCOMP_PREFIX)","yes")
|
|
MDBCOMP_MACRO_PREFIX_EXPRS = \
|
|
-e '^MDBCOMP_'
|
|
MDBCOMP_OBJ_PREFIX_EXPRS = \
|
|
-e '^@SYMPREFIX@MDBCOMP_' -e '^@SYMPREFIX@mdbcomp_'
|
|
else
|
|
MDBCOMP_MACRO_PREFIX_EXPRS =
|
|
MDBCOMP_OBJ_PREFIX_EXPRS =
|
|
endif
|
|
|
|
ifeq ("$(ALLOW_SSDB_PREFIX)","yes")
|
|
SSDB_MACRO_PREFIX_EXPRS = \
|
|
-e '^SSDB_'
|
|
SSDB_OBJ_PREFIX_EXPRS = \
|
|
-e '^@SYMPREFIX@SSDB_' -e '^@SYMPREFIX@ssdb_'
|
|
else
|
|
SSDB_MACRO_PREFIX_EXPRS =
|
|
SSDB_OBJ_PREFIX_EXPRS =
|
|
endif
|
|
|
|
# The external symbols in object files generated by MSVC will include a symbol
|
|
# for each string in the global string pool. Such symbols have names
|
|
# that begin with "??_C@".
|
|
ifeq ("$(USING_MICROSOFT_CL_COMPILER)","yes")
|
|
MSVC_OBJ_PREFIX_EXPRS = \
|
|
-e '^??_C@'
|
|
else
|
|
MSVC_OBJ_PREFIX_EXPRS =
|
|
endif
|
|
|
|
MACRO_PREFIX_EXPRS = \
|
|
$(GEN_MACRO_PREFIX_EXPRS) \
|
|
$(LIB_MACRO_PREFIX_EXPRS) \
|
|
$(BROWSER_MACRO_PREFIX_EXPRS) \
|
|
$(MDBCOMP_MACRO_PREFIX_EXPRS) \
|
|
$(SSDB_MACRO_PREFIX_EXPRS)
|
|
OBJ_PREFIX_EXPRS = \
|
|
$(GEN_OBJ_PREFIX_EXPRS) \
|
|
$(LIB_OBJ_PREFIX_EXPRS) \
|
|
$(BROWSER_OBJ_PREFIX_EXPRS) \
|
|
$(MDBCOMP_OBJ_PREFIX_EXPRS) \
|
|
$(SSDB_OBJ_PREFIX_EXPRS) \
|
|
$(MSVC_OBJ_PREFIX_EXPRS)
|
|
|
|
HEADER_CLEAN_FILTER = \
|
|
grep -v $(MACRO_PREFIX_EXPRS) | \
|
|
fgrep -v -x -f ../RESERVED_MACRO_NAMES | \
|
|
fgrep -v -x -f RESERVED_MACRO_NAMES
|
|
|
|
# This rule checks that object files are properly namespace-clean,
|
|
# with regard to the global symbols that they define.
|
|
# For an object file foo.o, it produces a file foo.o.obj_check that contains
|
|
# a list of all the globals defined by that object that do not start with
|
|
# `MR_', `mercury_', or `entry_'.
|
|
|
|
%.obj_check: %
|
|
@$(NM) -P -g $< | awk '$$2 != "U" { print $$1; }' | \
|
|
grep -v $(OBJ_PREFIX_EXPRS) | sort -u > $@
|
|
@if cmp -s /dev/null $@; then \
|
|
true; \
|
|
else \
|
|
echo "** Global symbols in user namespace: $*:"; \
|
|
cat $@; \
|
|
echo "(You may need to add a distinguishing prefix to these names.)"; \
|
|
exit 1; \
|
|
fi
|
|
|
|
# These rules help to check that each header file is self-contained,
|
|
# i.e. that each header file foo.h includes any other header files
|
|
# that define types used by foo.h. It creates a foo.check_hdr.c file
|
|
# that contains only a single `#include' statement that includes foo.h;
|
|
# compiling foo.check_hdr.c will fail if foo.h is not self-contained.
|
|
# Similarly for .mh files.
|
|
|
|
%.check_hdr.c: %.h
|
|
@echo "#include \"$*.h\"" > $*.check_hdr.c
|
|
|
|
%.check_mhdr.c: %.mh
|
|
@echo "#include \"$*.mh\"" > $*.check_mhdr.c
|
|
|
|
# This rule is a version of the rule for "%.$O: %c" in scripts/Mmake.rules,
|
|
# but to avoid clutter in the usual case that the object file *can* be made,
|
|
# it does not print the action.
|
|
|
|
%.pseudo_o: %.c
|
|
@$(MGNUC) $(ALL_GRADEFLAGS) $(ALL_MGNUCFLAGS) -c $< $(OBJFILE_OPT)$@
|
|
|
|
# Mark these files as intermediate files that make should NOT delete
|
|
# automatically. The reason for this is that there is no way to tell make
|
|
# to delete these files *without* printing the rm command used to delete them.
|
|
# Instead, tools/bootcheck uses "mmake clean_check" to delete them silently.
|
|
# Users whose run "mmake check_namespace" manually can do so as well.
|
|
.SECONDARY: $(HDR_CHECK_CS) $(HDR_CHECK_POBJS) $(HDR_CHECK_MACROS)
|
|
.SECONDARY: $(MHDR_CHECK_CS) $(MHDR_CHECK_POBJS) $(MHDR_CHECK_MACROS)
|
|
.SECONDARY: $(OBJ_CHECKS)
|
|
|
|
# These rules check whether a header file defines any macros it shouldn't.
|
|
# They generates the list of macros defined in the header file, and filter this
|
|
# list through a command that is intended to filter out all references to macro
|
|
# names that are all right. Each directory that uses this rule must arrange
|
|
# for the precursors of the HEADER_CLEAN_FILTER make variable to contain this
|
|
# command.
|
|
#
|
|
# The two rules should differ only in the filenames they use, and in the fact
|
|
# that the automatically created header file for module x is allowed to have
|
|
# three macros, X_H, X_MH and X_DECL_GUARD over and above what
|
|
# HEADER_CLEAN_FILTER allows.
|
|
#
|
|
# XXX We should consider deleting the special handling of these macros, and
|
|
# requiring instead that the compiler put MERCURY_ prefixes in front of them,
|
|
# considering them to be honorary submodules of the "mercury" module.
|
|
|
|
AWK = awk
|
|
|
|
%.check.macros: %.h %.check_hdr.c
|
|
@> $*.empty.c
|
|
-@ @CC@ -E $*.empty.c -nostdinc -dN 2> /dev/null | \
|
|
$(AWK) '/[ \t]*#define/ { print $$2; }' | sort -u > $*.base
|
|
-@$(MGNUC) $(ALL_GRADEFLAGS) $(ALL_MGNUCFLAGS) \
|
|
-DMERCURY_BOOTSTRAP_H -DMR_NO_CONF_BACKWARDS_COMPAT \
|
|
-E $*.check_hdr.c -nostdinc -dN \
|
|
2> /dev/null | $(AWK) '/[ \t]*#define/ { print $$2; }' | \
|
|
$(HEADER_CLEAN_FILTER) | sort -u > $*.actual
|
|
@comm -1 -3 $*.base $*.actual > $@
|
|
@rm $*.base $*.actual $*.empty.c
|
|
@if cmp -s /dev/null $@; then \
|
|
true; \
|
|
else \
|
|
echo "** Macro name(s) in user namespace: $*:"; \
|
|
cat $@; \
|
|
echo "(You may need to add a distinguishing prefix to these names.)"; \
|
|
exit 1; \
|
|
fi
|
|
|
|
%.check.mmacros: %.mh %.check_mhdr.c
|
|
@> $*.mempty.c
|
|
-@ @CC@ -E $*.mempty.c -nostdinc -dN 2> /dev/null | \
|
|
$(AWK) '/[ \t]*#define/ { print $$2; }' | sort -u > $*.mbase
|
|
-@$(MGNUC) $(ALL_GRADEFLAGS) $(ALL_MGNUCFLAGS) \
|
|
-DMERCURY_BOOTSTRAP_H -DMR_NO_CONF_BACKWARDS_COMPAT \
|
|
-E $*.check_mhdr.c -nostdinc -dN \
|
|
2> /dev/null | $(AWK) '/[ \t]*#define/ { print $$2; }' | \
|
|
grep -v -e `echo $(subst .check.mmacros,,$@) | tr '[a-z]' '[A-Z]' | sed -e s/\\\\./__/`_H | \
|
|
grep -v -e `echo $(subst .check.mmacros,,$@) | tr '[a-z]' '[A-Z]' | sed -e s/\\\\./__/`_MH | \
|
|
grep -v -e `echo $(subst .check.mmacros,,$@) | tr '[a-z]' '[A-Z]' | sed -e s/\\\\./__/`_DECL_GUARD | \
|
|
$(HEADER_CLEAN_FILTER) | sort -u > $*.mactual
|
|
@comm -1 -3 $*.mbase $*.mactual > $@
|
|
@rm $*.mbase $*.mactual $*.mempty.c
|
|
@if cmp -s /dev/null $@; then \
|
|
true; \
|
|
else \
|
|
echo "** Macro name(s) in user namespace: $*:"; \
|
|
cat $@; \
|
|
echo "(You may need to add a distinguishing prefix to these names.)"; \
|
|
exit 1; \
|
|
fi
|
|
|
|
#---------------------#
|
|
|
|
.PHONY: check_headers_self_contained
|
|
check_headers_self_contained: $(HDR_CHECK_POBJS) $(MHDR_CHECK_POBJS)
|
|
|
|
.PHONY: check_headers_macros
|
|
check_headers_macros: $(HDR_CHECK_MACROS) $(MHDR_CHECK_MACROS)
|
|
|
|
.PHONY: check_headers
|
|
check_headers: check_headers_self_contained check_headers_macros
|
|
|
|
.PHONY: check_objs
|
|
check_objs: $(OBJ_CHECKS)
|
|
|
|
.PHONY: check_namespace
|
|
check_namespace: check_headers check_objs
|
|
|
|
.PHONY: clean_check
|
|
clean_check:
|
|
-@rm -f $(HDR_CHECK_POBJS) $(HDR_CHECK_CS) $(HDR_CHECK_MACROS)
|
|
-@rm -f $(MHDR_CHECK_POBJS) $(MHDR_CHECK_CS) $(MHDR_CHECK_MACROS)
|
|
-@rm -f $(OBJ_CHECKS)
|
|
|
|
endif
|
|
# The endif is for "ifdef CHECK_OBJS" a long way above.
|
|
|
|
#---------------------------------------------------------------------------#
|
|
|
|
%_FLAGS: %_FLAGS.in ../config.status
|
|
@if test -f $*_FLAGS; then chmod u+w $*_FLAGS; fi
|
|
@../config.status --file $*_FLAGS
|
|
@chmod a-w $*_FLAGS
|
|
|
|
#---------------------------------------------------------------------------#
|