#-----------------------------------------------------------------------------# # vim: ts=8 sw=8 noexpandtab ft=make #-----------------------------------------------------------------------------# # Copyright (C) 2002-2008, 2010, 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. #-----------------------------------------------------------------------------# # Mmake.workspace - build a program or library using the current workspace, # not an installed library. # # The variable WORKSPACE must be set externally. # # If the variable LINK_STATIC is set to `yes', the names of the `.a' files # for the Mercury libraries will be included in MLLIBS, otherwise # `-l' options will be included. # # By default, if LINK_STATIC is unset or set to `no', `-R' options # will be passed to ml for each of the directories containing the # Mercury libraries. If SET_RPATH is set to `no', these options will # not be passed. This is useful for building the Mercury libraries, # for which the rpath must be set in each Mmakefile to point to # the installed library directory. # # Setting LINK_BOEHM_GC_ONLY to `yes' causes only the boehm_gc directory # to be included in MLFLAGS, MLLIBS and CFLAGS. # Setting LINK_RUNTIME_ONLY to `yes' causes only the *_gc and runtime # directories to be included in MLFLAGS, MLLIBS and CFLAGS. # Setting LINK_STDLIB_ONLY to `yes' causes only the *_gc, runtime # and library directories to be included in MLFLAGS, MLLIBS and CFLAGS. #-----------------------------------------------------------------------------# # CROSS_COMPILING is always set in Mmake.common, but # # - the Mmakefiles of the test suite include this file but do not include # Mmake.common, which leaves CROSS_COMPILING undefined for them; and # # - we do not support cross-compilation in the test suite anyway. ifeq ($(origin CROSS_COMPILING),undefined) CROSS_COMPILING = no endif ifeq ($(origin LINK_STATIC),undefined) LINK_STATIC = no endif ifeq ($(origin SET_RPATH),undefined) SET_RPATH = yes endif ifeq ($(origin LINK_BOEHM_GC_ONLY),undefined) LINK_BOEHM_GC_ONLY = no endif ifeq ($(origin LINK_RUNTIME_ONLY),undefined) LINK_RUNTIME_ONLY = no endif ifeq ($(origin LINK_STDLIB_ONLY),undefined) LINK_STDLIB_ONLY = no endif ifeq ($(origin EXTRA_MTAGSFLAGS),undefined) EXTRA_MTAGSFLAGS = endif SCRIPTS_DIR = $(WORKSPACE)/scripts RUNTIME_DIR = $(WORKSPACE)/runtime LIBRARY_DIR = $(WORKSPACE)/library TRACE_DIR = $(WORKSPACE)/trace SSDB_DIR = $(WORKSPACE)/ssdb MDBCOMP_DIR = $(WORKSPACE)/mdbcomp BROWSER_DIR = $(WORKSPACE)/browser BOEHM_GC_DIR = $(WORKSPACE)/boehm_gc COMPILER_DIR = $(WORKSPACE)/compiler UTIL_DIR = $(WORKSPACE)/util ROBDD_DIR = $(WORKSPACE)/robdd # The names of the various libraries. # The archives and shared object objects have a "lib" prefix and a ".a" or # ".so" (or ".dll") suffix around these names; the initialization files # have just a ".init" suffix. (The trace library does not have a .init file, # since it contains no Mercury code.) # # If you change these, you will also need to change the files indicated # in scripts/c2init.in. RT_LIB_NAME = mer_rt STD_LIB_NAME = mer_std TRACE_LIB_NAME = mer_trace EVENTSPEC_LIB_NAME = mer_eventspec SSDB_LIB_NAME = mer_ssdb BROWSER_LIB_NAME = mer_browser MDBCOMP_LIB_NAME = mer_mdbcomp # This specifies the path to the so_locations file (or its equivalent), # which is used by the linker to help it to map different shared objects # to different virtual memory addresses at static link time, so as to avoid # the need to relocate them at dynamic link time. SO_LOCATIONS_DIR = $(WORKSPACE)/ export SO_LOCATIONS_DIR MC = $(SCRIPTS_DIR)/mmc MGNUC = $(SCRIPTS_DIR)/mgnuc ML = $(SCRIPTS_DIR)/ml # We cannot use the binaries in util when cross-compiling. # Just assume that the default c2init and mkinit are usable. ifneq ($(CROSS_COMPILING),yes) C2INIT = MERCURY_MKINIT=$(UTIL_DIR)/mkinit $(SCRIPTS_DIR)/c2init MKLIBINIT = $(UTIL_DIR)/mkinit -k endif MTAGS = $(SCRIPTS_DIR)/mtags MTAGSFLAGS += $(EXTRA_MTAGSFLAGS) VPATH = $(LIBRARY_DIR) ifeq ($(origin MERCURY_CONFIG_FILE),undefined) MERCURY_CONFIG_FILE = $(SCRIPTS_DIR)/Mercury.config.bootstrap CONFIG_OVERRIDE = else CONFIG_OVERRIDE = --config-file $(MERCURY_CONFIG_FILE) endif ifeq ($(MMAKE_USE_MMC_MAKE),yes) MCFLAGS += --options-file $(WORKSPACE)/Mercury.options endif # This is now in FLAGS files. # MCFLAGS += -I$(LIBRARY_DIR) # This is now in .mgnuc_opt files. # MGNUCFLAGS += --no-mercury-stdlib-dir # XXX browser.init and mdbcomp.init might need to be included even if tracing # is disabled if ssdb uses code from the browser or mdbcomp libraries C2INITFLAGS += --trace-init-file $(BROWSER_DIR)/$(BROWSER_LIB_NAME).init \ --trace-init-file $(MDBCOMP_DIR)/$(MDBCOMP_LIB_NAME).init \ --ssdb-init-file $(SSDB_DIR)/$(SSDB_LIB_NAME).init C2INITARGS += $(LIBRARY_DIR)/$(STD_LIB_NAME).init \ $(RUNTIME_DIR)/$(RT_LIB_NAME).init MLFLAGS += --no-mercury-stdlib-dir # The following are now in .mgnuc_copts files: # # # Work out the C include directories. # # C_INCL_DIRS = -I$(BOEHM_GC_DIR) -I$(BOEHM_GC_DIR)/include # ifneq ($(LINK_BOEHM_GC_ONLY),yes) # C_INCL_DIRS += -I$(RUNTIME_DIR) # ifneq ($(LINK_RUNTIME_ONLY),yes) # C_INCL_DIRS += -I$(LIBRARY_DIR) -I$(LIBRARY_DIR)/$(mihs_subdir) # ifneq ($(LINK_STDLIB_ONLY),yes) # C_INCL_DIRS += -I$(MDBCOMP_DIR) -I$(MDBCOMP_DIR)/$(mihs_subdir) \ # -I$(BROWSER_DIR) -I$(BROWSER_DIR)/$(mihs_subdir) -I$(TRACE_DIR) # endif # endif # endif # CFLAGS += $(C_INCL_DIRS) # This is now in FLAGS files. # MCFLAGS += $(C_INCL_DIRS:-I%=--c-include-directory %) # Work out which libraries to link with. # The $(shell) here is needed to allow the variable values in # ECHO_MERCURY_OPTIONS in Mmake.vars to be single-quoted when passed # to echo in order to preserve double-quotes (e.g. for file names # containing spaces). GC_LIBS_0=`$(ML) --grade $(GRADE) --print-gc-grade` GC_LIBS=$(shell echo $(GC_LIBS_0)) STATIC_GC_LIBS_0 = \ ` \ case $(GRADE) in \ *.gc*) echo $(BOEHM_GC_DIR)/lib$(GC_LIBS).$A ;; \ esac \ ` STATIC_GC_LIBS = $(shell echo $(STATIC_GC_LIBS_0)) SHARED_GC_LIBS_0 = \ ` \ case $(GRADE) in \ *.gc*) echo -l$(GC_LIBS) ;; \ esac \ ` SHARED_GC_LIBS = $(shell echo $(SHARED_GC_LIBS_0)) ifeq ($(LINK_STATIC),yes) STATIC_RT_LIBS= STATIC_STD_LIBS= STATIC_TRACE_LIBS= ifneq ($(LINK_BOEHM_GC_ONLY),yes) STATIC_RT_LIBS = $(RUNTIME_DIR)/lib$(RT_LIB_NAME).$A ifneq ($(LINK_RUNTIME_ONLY),yes) STATIC_STD_LIBS = $(LIBRARY_DIR)/lib$(STD_LIB_NAME).$A ifneq ($(LINK_STDLIB_ONLY),yes) STATIC_TRACE_LIBS = \ $(TRACE_DIR)/lib$(TRACE_LIB_NAME).$A \ $(TRACE_DIR)/lib$(EVENTSPEC_LIB_NAME).$A \ $(SSDB_DIR)/lib$(SSDB_LIB_NAME).$A \ $(BROWSER_DIR)/lib$(BROWSER_LIB_NAME).$A \ $(MDBCOMP_DIR)/lib$(MDBCOMP_LIB_NAME).$A endif endif endif ifeq ("$(filter csharp% java%,$(GRADE))","") MLOBJS += \ $(STATIC_TRACE_LIBS) \ $(STATIC_STD_LIBS) \ $(STATIC_RT_LIBS) \ $(STATIC_GC_LIBS) endif MCFLAGS += --mercury-linkage static else # LINK_STATIC != yes LINK_RT_LIB_OPTS= LINK_STD_LIB_OPTS= LINK_TRACE_SSDB_LIB_OPTS= ifneq ($(LINK_BOEHM_GC_ONLY),yes) ifneq ("$(filter csharp%,$(GRADE))","") # There is no separate runtime library for C# grades. LINK_RT_LIB_OPTS = else LINK_RT_LIB_OPTS = -l$(RT_LIB_NAME) endif ifneq ($(LINK_RUNTIME_ONLY),yes) LINK_STD_LIB_OPTS = -l$(STD_LIB_NAME) ifneq ($(LINK_STDLIB_ONLY),yes) LINK_TRACE_SSDB_LIB_OPTS = \ -l$(TRACE_LIB_NAME) \ -l$(EVENTSPEC_LIB_NAME) \ -l$(SSDB_LIB_NAME) \ -l$(BROWSER_LIB_NAME) \ -l$(MDBCOMP_LIB_NAME) endif endif endif LINK_LIB_OPTS = \ $(LINK_TRACE_SSDB_LIB_OPTS) \ $(LINK_STD_LIB_OPTS) \ $(LINK_RT_LIB_OPTS) \ $(SHARED_GC_LIBS) LIB_DIR_OPTS = \ -L$(BOEHM_GC_DIR) \ -L$(RUNTIME_DIR) \ -L$(LIBRARY_DIR) \ -L$(TRACE_DIR) \ -L$(MDBCOMP_DIR) \ -L$(BROWSER_DIR) \ -L$(SSDB_DIR) MLFLAGS += $(LIB_DIR_OPTS) # This is now in FLAGS files. # MCFLAGS += $(LIB_DIR_OPTS) MLLIBS += $(LINK_LIB_OPTS) MCFLAGS += --mercury-linkage shared ifeq ($(SET_RPATH),yes) MLFLAGS += $(LIB_DIR_OPTS:-L%=-R%) MCFLAGS += --flags RPATH endif endif # LINK_STATIC != yes