Files
mercury/library/Mmakefile
Fergus Henderson 57e65f8176 Define `MGNUCFLAGS-io = --no-ansi', to avoid some compiler warnings.
Estimated hours taken: 0.5

library/Mmakefile:
	Define `MGNUCFLAGS-io = --no-ansi', to avoid some compiler warnings.
1999-06-20 09:33:28 +00:00

327 lines
9.3 KiB
Plaintext

#-----------------------------------------------------------------------------#
# Copyright (C) 1997-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.
#-----------------------------------------------------------------------------#
# library/Mmake - this is the main part of the Makefile
# for building the Mercury libraries.
MERCURY_DIR=..
include $(MERCURY_DIR)/Mmake.common
MAIN_TARGET=mercury
VPATH=.
#-----------------------------------------------------------------------------#
# If we're going to generate both `.o' files and `.pic_o' files, then
# don't remove the intermediate `.c' files.
RM_C = $(LIBRARY_RM_C)
#-----------------------------------------------------------------------------#
# Specify which options to use to compile the library.
# Don't change these without good reason - if you want to
# do a temporary change, change ../Mmake.params.
ifeq ($(LIBRARY_INTERMODULE),yes)
INTERMODULE_OPTS = --transitive-intermodule-optimization
ENABLE_TERM_OPTS = --enable-termination
CHECK_TERM_OPTS =
# If you want to actually check termination for the library, then you need
# CHECK_TERM_OPTS = --check-termination
# but that is not enabled by default because it probably just results in
# spurious warnings.
else
INTERMODULE_OPTS =
ENABLE_TERM_OPTS =
CHECK_TERM_OPTS =
endif
M_ENV = MERCURY_INT_DIR=. \
MERCURY_ALL_C_INCL_DIRS="\
-I$(TRACE_DIR) \
-I$(RUNTIME_DIR) \
-I$(BOEHM_GC_DIR) \
-I$(BOEHM_GC_DIR)/include \
"
MCD = $(M_ENV) $(MC) --generate-dependencies $(INTERMODULE_OPTS)
MCI = $(M_ENV) $(MC) --make-interface $(INTERMODULE_OPTS) \
$(ENABLE_TERM_OPTS)
MCPI = $(M_ENV) $(MC) --make-private-interface $(INTERMODULE_OPTS) \
$(ENABLE_TERM_OPTS)
MCSI = $(M_ENV) $(MC) --make-short-interface $(INTERMODULE_OPTS) \
$(ENABLE_TERM_OPTS)
MCOI = $(M_ENV) $(MC) --make-opt-int $(INTERMODULE_OPTS) \
$(ENABLE_TERM_OPTS)
MCTOI = $(M_ENV) $(MC) --make-trans-opt $(INTERMODULE_OPTS) \
$(ENABLE_TERM_OPTS)
MCG = $(M_ENV) $(MC) --compile-to-c $(INTERMODULE_OPTS) \
$(CHECK_TERM_OPTS)
MCS = $(M_ENV) $(MC) --split-c-files -c --cflags "$(ALL_CFLAGS)" \
$(INTERMODULE_OPTS) $(CHECK_TERM_OPTS)
MGNUC = $(M_ENV) $(SCRIPTS_DIR)/mgnuc
MGNUCFLAGS = $(DLL_CFLAGS)
LDFLAGS = -L$(BOEHM_GC_DIR) -L$(RUNTIME_DIR)
ALL_LDFLAGS = $(LDFLAGS) $(EXTRA_LDFLAGS)
LDLIBS = -l$(RT_LIB_NAME) \
` case "$(GRADE)" in \
*.gc*.prof*) echo "-lgc_prof" ;; \
*.gc*) echo "-lgc" ;; \
esac \
`
ALL_LDLIBS = $(LDLIBS) $(EXTRA_LDLIBS)
MTAGS = $(SCRIPTS_DIR)/mtags
#-----------------------------------------------------------------------------#
# Stuff for Windows DLLS using gnu-win32
ifeq ($(USE_DLLS),yes)
DLL_CFLAGS = -Dlib$(STD_LIB_NAME)_DEFINE_DLL
include $(MERCURY_DIR)/Makefile.DLLs
else
DLL_CFLAGS =
DLL_DEF_LIB =
endif
# io.m uses library features that are supported by POSIX but which are not
# part of ANSI C, such as `struct stat', fileno(), and putenv().
# We need to pass --no-ansi to mgnuc to ensure that these are declared.
MGNUCFLAGS-io = --no-ansi
#-----------------------------------------------------------------------------#
# targets
.PHONY: all
all : mercury
.PHONY: mercury
mercury : all-ints lib_std
#-----------------------------------------------------------------------------#
.PHONY: depend
depend : library.depend
.PHONY: check
check : library.check
.PHONY: all-ints
ifeq ($(LIBRARY_INTERMODULE),yes)
all-ints: ints int3s opts trans_opts
else
all-ints: ints int3s
endif
.PHONY: ints
ints : library.ints
.PHONY: int3s
int3s : library.int3s
.PHONY: opts
opts : library.opts
.PHONY: trans_opts
trans_opts : library.trans_opts
library.trans_opts : $(library.trans_opts)
#-----------------------------------------------------------------------------#
tags : $(MTAGS) $(library.ms)
$(MTAGS) $(library.ms)
library.stats : $(COMPILER_DIR)/source_stats.awk $(library.ms)
awk -f $(COMPILER_DIR)/source_stats.awk `vpath_find $(library.ms)` > $@
#-----------------------------------------------------------------------------#
.PHONY: dates
dates :
touch $(library.dates)
#-----------------------------------------------------------------------------#
.PHONY: os cs
os: $(library.os)
cs: $(library.cs)
#-----------------------------------------------------------------------------#
.PHONY: lib_std
# the following dependency is just there to improve compilation speed;
# making tree234.o first improves effective parallelism with parallel makes.
lib_std: $(os_subdir)tree234.o
lib_std: lib$(STD_LIB_NAME).a lib$(STD_LIB_NAME).$(EXT_FOR_SHARED_LIB)
lib_std: $(STD_LIB_NAME).init
lib$(STD_LIB_NAME)$(DLL_DEF_LIB).a : $(library.os)
rm -f lib$(STD_LIB_NAME)$(DLL_DEF_LIB).a
ar cr lib$(STD_LIB_NAME)$(DLL_DEF_LIB).a $(library.os)
$(RANLIB) lib$(STD_LIB_NAME)$(DLL_DEF_LIB).a
RPATH_1=$(SHLIB_RPATH_OPT)$(FINAL_INSTALL_MERC_LIB_DIR)
RPATH_2=$(SHLIB_RPATH_SEP)$(FINAL_INSTALL_MERC_GC_LIB_DIR)
lib$(STD_LIB_NAME).so : $(library.pic_os)
$(LINK_SHARED_OBJ) -o lib$(STD_LIB_NAME).so $(library.pic_os) \
$(RPATH_1)$(RPATH_2) \
$(ALL_LDFLAGS) $(ALL_LDLIBS) \
$(SHARED_LIBS)
$(STD_LIB_NAME).init: $(deps_subdir)library.dep
for file in $(library.ms); do \
grep '^INIT ' $$file; \
echo "INIT mercury__`basename $$file .m`__init"; \
done > $(STD_LIB_NAME).init
#-----------------------------------------------------------------------------#
# Ensure we recompile library__version if VERSION is changed.
$(os_subdir)library.o \
$(os_subdir)library.pic_o \
: $(RUNTIME_DIR)/mercury_conf.h
# The object files in this directory depend on many of the header files
# in the runtime. However, changes to many of these header files require
# a global make clean. Here we list only the header files from the runtime
# whose changes don't usually require a make clean but which nevertheless
# require some files in the library to be recompiled.
$(os_subdir)benchmarking.o \
$(os_subdir)benchmarking.pic_o \
$(os_subdir)std_util.o \
$(os_subdir)std_util.pic_o \
: ../runtime/mercury_stack_layout.h
#-----------------------------------------------------------------------------#
realclean:
rm -f lib$(STD_LIB_NAME).a lib$(STD_LIB_NAME).so $(STD_LIB_NAME).init
rm -f tags
#-----------------------------------------------------------------------------#
ifeq ($(LIBRARY_INTERMODULE),yes)
# Installation targets
# LIBRARY_INTERMODULE should be turned off only during development.
# A full install requires the library's .opt and .trans_opt files.
# If you add a new target below, please add a parallel target for the
# case LIBRARY_INTERMODULE != yes.
.PHONY: install
install: install_mercury
.PHONY: install_all
install_all: install_mercury
.PHONY: install_mercury
install_mercury: install_ints install_init install_library
.PHONY: install_dirs
install_dirs:
#-[ -d $(INSTALL_INT_DIR) ] || mkdir -p $(INSTALL_INT_DIR)
-[ -d $(INSTALL_INT_DIR)/Mercury ] || \
mkdir -p $(INSTALL_INT_DIR)/Mercury
-[ -d $(INSTALL_MODULE_DIR) ] || mkdir -p $(INSTALL_MODULE_DIR)
-[ -d $(INSTALL_MERC_LIB_DIR) ] || mkdir -p $(INSTALL_MERC_LIB_DIR)
.PHONY: install_ints
install_ints: $(library.ints) $(library.int3s) \
$(library.opts) $(library.trans_opts) install_dirs
for file in $(library.ints) $(library.int3s) \
$(library.opts) $(library.trans_opts); \
do \
target=$(INSTALL_INT_DIR)/`basename $$file`; \
if cmp -s $$file $$target; then \
echo "$$target unchanged"; \
else \
echo "installing $$target"; \
cp $$file $$target; \
fi; \
done
# The following is needed to support the `--use-subdirs' option
for dir in ints int2s int3s opts trans_opts; do \
rm -f $(INSTALL_INT_DIR)/Mercury/$$dir; \
ln -s .. $(INSTALL_INT_DIR)/Mercury/$$dir; \
done
.PHONY: install_init
install_init: $(STD_LIB_NAME).init install_dirs
cp `vpath_find $(STD_LIB_NAME).init` $(INSTALL_MODULE_DIR)
# "$(STD_LIB_NAME).init" used to be called "library.init" or
# "libmercury.init". If there is still a version with an old name
# lying around, then delete it; otherwise the initialization
# would get done twice.
rm -f $(INSTALL_MODULE_DIR)/library.init \
$(INSTALL_MODULE_DIR)/libmercury.init
.PHONY: install_library
install_library: lib$(STD_LIB_NAME).a \
lib$(STD_LIB_NAME).$(EXT_FOR_SHARED_LIB) install_dirs
cp `vpath_find lib$(STD_LIB_NAME).a \
lib$(STD_LIB_NAME).$(EXT_FOR_SHARED_LIB)` \
$(INSTALL_MERC_LIB_DIR)
# library.split.a is a version of lib$(STD_LIB_NAME).a that has been compiled
# with `--split-c-files'.
.PHONY: install_split_library
install_split_library: library.split.a install_dirs
cp `vpath_find library.split.a` \
$(INSTALL_MERC_LIB_DIR)/lib$(STD_LIB_NAME).a
else
.PHONY: install
install:
echo "Can't do make install without LIBRARY_INTERMODULE=yes"
.PHONY: install_all
install_all:
echo "Can't do make install without LIBRARY_INTERMODULE=yes"
.PHONY: install_mercury
install_mercury:
echo "Can't do make install without LIBRARY_INTERMODULE=yes"
.PHONY: install_ints
install_ints:
echo "Can't do make install without LIBRARY_INTERMODULE=yes"
.PHONY: install_init
install_init:
echo "Can't do make install without LIBRARY_INTERMODULE=yes"
.PHONY: install_library
install_library:
echo "Can't do make install without LIBRARY_INTERMODULE=yes"
.PHONY: install_split_library
install_split_library:
echo "Can't do make install without LIBRARY_INTERMODULE=yes"
endif
#-----------------------------------------------------------------------------#