#---------------------------------------------------------------------------# # 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 Documentation/README.Java.md and # Documentation/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 # Ignore reference pointer symbols created by GCC on Windows. # (See definition of HAVE_REFPTR_SYMS in configure.ac for details.) ifeq ("@HAVE_REFPTR_SYMS@","yes") GCC_WIN_OBJ_PREFIX_EXPRS = \ -e '^\.refptr\.' else GCC_WIN_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) \ $(GCC_WIN_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 #---------------------------------------------------------------------------#