2011-11-01 18:50:47 -05:00
|
|
|
# This is a procedure to define the targets for building
|
|
|
|
# the runtime.
|
|
|
|
#
|
|
|
|
# Argument 1 is the target triple.
|
|
|
|
#
|
|
|
|
# This is not really the right place to explain this, but
|
|
|
|
# for those of you who are not Makefile gurus, let me briefly
|
|
|
|
# cover the $ expansion system in use here, because it
|
|
|
|
# confused me for a while! The variable DEF_RUNTIME_TARGETS
|
|
|
|
# will be defined once and then expanded with different
|
|
|
|
# values substituted for $(1) each time it is called.
|
|
|
|
# That resulting text is then eval'd.
|
|
|
|
#
|
|
|
|
# For most variables, you could use a single $ sign. The result
|
|
|
|
# is that the substitution would occur when the CALL occurs,
|
|
|
|
# I believe. The problem is that the automatic variables $< and $@
|
|
|
|
# need to be expanded-per-rule. Therefore, for those variables at
|
|
|
|
# least, you need $$< and $$@ in the variable text. This way, after
|
|
|
|
# the CALL substitution occurs, you will have $< and $@. This text
|
|
|
|
# will then be evaluated, and all will work as you like.
|
|
|
|
#
|
|
|
|
# Reader beware, this explanantion could be wrong, but it seems to
|
|
|
|
# fit the experimental data (i.e., I was able to get the system
|
|
|
|
# working under these assumptions).
|
|
|
|
|
2011-11-01 23:05:56 -05:00
|
|
|
# Hack for passing flags into LIBUV, see below.
|
2011-12-01 01:17:42 -06:00
|
|
|
LIBUV_FLAGS_i386 = -m32 -fPIC
|
|
|
|
LIBUV_FLAGS_x86_64 = -m64 -fPIC
|
2011-11-01 23:05:56 -05:00
|
|
|
|
2011-11-01 18:50:47 -05:00
|
|
|
define DEF_RUNTIME_TARGETS
|
|
|
|
|
2011-05-01 15:18:52 -05:00
|
|
|
######################################################################
|
|
|
|
# Runtime (C++) library variables
|
|
|
|
######################################################################
|
|
|
|
|
2011-11-01 18:50:47 -05:00
|
|
|
RUNTIME_CS_$(1) := \
|
|
|
|
rt/sync/timer.cpp \
|
2011-05-01 15:18:52 -05:00
|
|
|
rt/sync/sync.cpp \
|
|
|
|
rt/sync/lock_and_signal.cpp \
|
|
|
|
rt/rust.cpp \
|
|
|
|
rt/rust_builtin.cpp \
|
|
|
|
rt/rust_run_program.cpp \
|
|
|
|
rt/rust_crate_cache.cpp \
|
2011-07-27 16:34:39 -05:00
|
|
|
rt/rust_env.cpp \
|
2011-06-28 14:15:41 -05:00
|
|
|
rt/rust_scheduler.cpp \
|
2011-05-01 15:18:52 -05:00
|
|
|
rt/rust_task.cpp \
|
|
|
|
rt/rust_task_list.cpp \
|
|
|
|
rt/rust_port.cpp \
|
|
|
|
rt/rust_upcall.cpp \
|
2011-12-01 01:26:23 -06:00
|
|
|
rt/rust_uv.cpp \
|
2012-01-21 19:29:52 -06:00
|
|
|
rt/rust_uvtmp.cpp \
|
2011-05-01 15:18:52 -05:00
|
|
|
rt/rust_log.cpp \
|
|
|
|
rt/circular_buffer.cpp \
|
|
|
|
rt/isaac/randport.cpp \
|
|
|
|
rt/rust_srv.cpp \
|
|
|
|
rt/rust_kernel.cpp \
|
2011-08-03 22:25:44 -05:00
|
|
|
rt/rust_shape.cpp \
|
2011-08-16 21:48:47 -05:00
|
|
|
rt/rust_obstack.cpp \
|
2011-08-18 20:48:32 -05:00
|
|
|
rt/rust_gc.cpp \
|
2011-08-20 16:22:09 -05:00
|
|
|
rt/rust_abi.cpp \
|
2011-09-20 18:47:59 -05:00
|
|
|
rt/rust_cc.cpp \
|
2011-09-23 13:42:20 -05:00
|
|
|
rt/rust_debug.cpp \
|
2011-05-01 15:18:52 -05:00
|
|
|
rt/memory_region.cpp \
|
2012-02-01 20:52:08 -06:00
|
|
|
rt/boxed_region.cpp \
|
2011-06-28 14:54:41 -05:00
|
|
|
rt/test/rust_test_harness.cpp \
|
|
|
|
rt/test/rust_test_runtime.cpp \
|
2011-10-13 19:11:28 -05:00
|
|
|
rt/test/rust_test_util.cpp \
|
2011-11-01 18:50:47 -05:00
|
|
|
rt/arch/$$(HOST_$(1))/context.cpp
|
2011-05-18 14:43:48 -05:00
|
|
|
|
2011-11-01 18:50:47 -05:00
|
|
|
RUNTIME_S_$(1) := rt/arch/$$(HOST_$(1))/_context.S \
|
|
|
|
rt/arch/$$(HOST_$(1))/ccall.S \
|
2011-11-21 20:52:12 -06:00
|
|
|
rt/arch/$$(HOST_$(1))/record_sp.S
|
2011-05-24 16:00:45 -05:00
|
|
|
|
2011-11-01 18:50:47 -05:00
|
|
|
RUNTIME_HDR_$(1) := rt/globals.h \
|
2011-05-01 15:18:52 -05:00
|
|
|
rt/rust.h \
|
2011-10-05 19:41:01 -05:00
|
|
|
rt/rust_abi.h \
|
|
|
|
rt/rust_cc.h \
|
|
|
|
rt/rust_debug.h \
|
|
|
|
rt/rust_gc.h \
|
2011-05-01 15:18:52 -05:00
|
|
|
rt/rust_internal.h \
|
|
|
|
rt/rust_util.h \
|
2011-07-27 16:34:39 -05:00
|
|
|
rt/rust_env.h \
|
2011-10-05 19:41:01 -05:00
|
|
|
rt/rust_obstack.h \
|
|
|
|
rt/rust_unwind.h \
|
|
|
|
rt/rust_upcall.h \
|
2011-05-01 15:18:52 -05:00
|
|
|
rt/rust_port.h \
|
2011-06-28 14:15:41 -05:00
|
|
|
rt/rust_scheduler.h \
|
2011-10-05 19:41:01 -05:00
|
|
|
rt/rust_shape.h \
|
2011-05-01 15:18:52 -05:00
|
|
|
rt/rust_task.h \
|
|
|
|
rt/rust_task_list.h \
|
|
|
|
rt/rust_log.h \
|
|
|
|
rt/circular_buffer.h \
|
|
|
|
rt/util/array_list.h \
|
|
|
|
rt/util/indexed_list.h \
|
|
|
|
rt/util/synchronized_indexed_list.h \
|
|
|
|
rt/util/hash_map.h \
|
|
|
|
rt/sync/sync.h \
|
|
|
|
rt/sync/timer.h \
|
|
|
|
rt/sync/lock_and_signal.h \
|
|
|
|
rt/sync/lock_free_queue.h \
|
|
|
|
rt/rust_srv.h \
|
|
|
|
rt/rust_kernel.h \
|
|
|
|
rt/memory_region.h \
|
|
|
|
rt/memory.h \
|
2011-06-28 14:54:41 -05:00
|
|
|
rt/test/rust_test_harness.h \
|
|
|
|
rt/test/rust_test_runtime.h \
|
|
|
|
rt/test/rust_test_util.h \
|
2011-11-08 19:07:11 -06:00
|
|
|
rt/arch/$$(HOST_$(1))/context.h \
|
|
|
|
rt/arch/$$(HOST_$(1))/regs.h
|
2011-05-01 15:18:52 -05:00
|
|
|
|
2011-11-01 18:50:47 -05:00
|
|
|
ifeq ($$(HOST_$(1)), i386)
|
|
|
|
LIBUV_ARCH_$(1) := ia32
|
2011-09-23 18:13:14 -05:00
|
|
|
else
|
2011-11-01 18:50:47 -05:00
|
|
|
LIBUV_ARCH_$(1) := x86_64
|
2011-09-23 18:13:14 -05:00
|
|
|
endif
|
|
|
|
|
2011-11-01 18:50:47 -05:00
|
|
|
ifeq ($$(CFG_WINDOWSY), 1)
|
|
|
|
LIBUV_OSTYPE_$(1) := win
|
2012-02-02 19:39:47 -06:00
|
|
|
LIBUV_LIB_$(1) := rt/$(1)/libuv/Release/obj.target/src/libuv/libuv.a
|
2011-11-01 18:50:47 -05:00
|
|
|
else ifeq ($(CFG_OSTYPE), apple-darwin)
|
|
|
|
LIBUV_OSTYPE_$(1) := mac
|
2012-02-02 19:39:47 -06:00
|
|
|
LIBUV_LIB_$(1) := rt/$(1)/libuv/Release/libuv.a
|
2011-12-30 02:18:55 -06:00
|
|
|
else ifeq ($(CFG_OSTYPE), unknown-freebsd)
|
|
|
|
LIBUV_OSTYPE_$(1) := freebsd
|
2012-02-02 19:39:47 -06:00
|
|
|
LIBUV_LIB_$(1) := rt/$(1)/libuv/Release/obj.target/src/libuv/libuv.a
|
2011-11-01 18:50:47 -05:00
|
|
|
else
|
|
|
|
LIBUV_OSTYPE_$(1) := unix
|
2012-02-02 19:39:47 -06:00
|
|
|
LIBUV_LIB_$(1) := rt/$(1)/libuv/Release/obj.target/src/libuv/libuv.a
|
2011-11-01 18:50:47 -05:00
|
|
|
endif
|
2011-05-01 15:18:52 -05:00
|
|
|
|
2011-11-01 18:50:47 -05:00
|
|
|
RUNTIME_DEF_$(1) := rt/rustrt$$(CFG_DEF_SUFFIX)
|
2011-12-06 01:11:11 -06:00
|
|
|
RUNTIME_INCS_$(1) := -I $$(S)src/rt -I $$(S)src/rt/isaac -I $$(S)src/rt/uthash \
|
2011-11-01 18:50:47 -05:00
|
|
|
-I $$(S)src/rt/arch/$$(HOST_$(1)) \
|
2011-11-08 16:36:19 -06:00
|
|
|
-I $$(S)src/libuv/include
|
2011-11-01 18:50:47 -05:00
|
|
|
RUNTIME_OBJS_$(1) := $$(RUNTIME_CS_$(1):rt/%.cpp=rt/$(1)/%.o) \
|
|
|
|
$$(RUNTIME_S_$(1):rt/%.S=rt/$(1)/%.o)
|
|
|
|
RUNTIME_LIBS_$(1) := $$(LIBUV_LIB_$(1))
|
|
|
|
|
2011-11-23 17:20:28 -06:00
|
|
|
rt/$(1)/%.o: rt/%.cpp $$(MKFILE_DEPS)
|
2011-11-01 18:50:47 -05:00
|
|
|
@$$(call E, compile: $$@)
|
|
|
|
$$(Q)$$(call CFG_COMPILE_C_$(1), $$@, $$(RUNTIME_INCS_$(1))) $$<
|
|
|
|
|
2011-12-09 18:02:50 -06:00
|
|
|
rt/$(1)/%.o: rt/%.S $$(MKFILE_DEPS) $$(LLVM_CONFIG_$$(CFG_HOST_TRIPLE))
|
2011-11-01 18:50:47 -05:00
|
|
|
@$$(call E, compile: $$@)
|
2011-12-09 18:02:50 -06:00
|
|
|
$$(Q)$$(call CFG_ASSEMBLE_$(1),$$@,$$<)
|
2011-11-01 18:50:47 -05:00
|
|
|
|
2011-11-23 17:20:28 -06:00
|
|
|
rt/$(1)/arch/$$(HOST_$(1))/libmorestack.a: \
|
|
|
|
rt/$(1)/arch/$$(HOST_$(1))/morestack.o
|
2011-11-28 19:23:13 -06:00
|
|
|
@$$(call E, link: $$@)
|
|
|
|
$$(Q)ar rcs $$@ $$<
|
|
|
|
|
2011-11-23 17:20:28 -06:00
|
|
|
rt/$(1)/$(CFG_RUNTIME): $$(RUNTIME_OBJS_$(1)) $$(MKFILE_DEPS) \
|
|
|
|
$$(RUNTIME_HDR_$(1)) \
|
|
|
|
$$(RUNTIME_DEF_$(1)) \
|
|
|
|
$$(RUNTIME_LIBS_$(1))
|
2011-11-01 18:50:47 -05:00
|
|
|
@$$(call E, link: $$@)
|
|
|
|
$$(Q)$$(call CFG_LINK_C_$(1),$$@, $$(RUNTIME_OBJS_$(1)) \
|
|
|
|
$$(CFG_GCCISH_POST_LIB_FLAGS) $$(RUNTIME_LIBS_$(1)) \
|
|
|
|
$$(CFG_LIBUV_LINK_FLAGS),$$(RUNTIME_DEF_$(1)),$$(CFG_RUNTIME))
|
2011-06-14 10:28:10 -05:00
|
|
|
|
2011-08-04 16:11:33 -05:00
|
|
|
# FIXME: For some reason libuv's makefiles can't figure out the correct definition
|
|
|
|
# of CC on the mingw I'm using, so we are explicitly using gcc. Also, we
|
|
|
|
# have to list environment variables first on windows... mysterious
|
2011-11-01 18:50:47 -05:00
|
|
|
$$(LIBUV_LIB_$(1)): $$(wildcard \
|
2011-11-08 16:36:19 -06:00
|
|
|
$$(S)src/libuv/* \
|
|
|
|
$$(S)src/libuv/*/* \
|
|
|
|
$$(S)src/libuv/*/*/* \
|
|
|
|
$$(S)src/libuv/*/*/*/*)
|
2011-11-01 18:50:47 -05:00
|
|
|
$$(Q)$$(MAKE) -C $$(S)mk/libuv/$$(LIBUV_ARCH_$(1))/$$(LIBUV_OSTYPE_$(1)) \
|
2011-11-01 23:05:56 -05:00
|
|
|
CFLAGS="$$(LIBUV_FLAGS_$$(HOST_$(1)))" \
|
|
|
|
LDFLAGS="$$(LIBUV_FLAGS_$$(HOST_$(1)))" \
|
2011-11-01 18:50:47 -05:00
|
|
|
CC="$$(CFG_GCCISH_CROSS)$$(CC)" \
|
|
|
|
CXX="$$(CFG_GCCISH_CROSS)$$(CXX)" \
|
|
|
|
AR="$$(CFG_GCCISH_CROSS)$$(AR)" \
|
2012-02-02 19:39:47 -06:00
|
|
|
BUILDTYPE=Release \
|
2011-11-01 18:50:47 -05:00
|
|
|
builddir_name="$$(CFG_BUILD_DIR)/rt/$(1)/libuv" \
|
|
|
|
V=$$(VERBOSE) FLOCK= uv
|
2011-05-01 15:18:52 -05:00
|
|
|
|
|
|
|
# These could go in rt.mk or rustllvm.mk, they're needed for both.
|
|
|
|
|
2011-11-02 16:22:07 -05:00
|
|
|
# This regexp has a single $, escaped twice
|
2011-12-30 02:18:55 -06:00
|
|
|
%.bsd.def: %.def.in $$(MKFILE_DEPS)
|
|
|
|
@$$(call E, def: $$@)
|
|
|
|
$$(Q)echo "{" > $$@
|
|
|
|
$$(Q)sed 's/.$$$$/&;/' $$< >> $$@
|
|
|
|
$$(Q)echo "};" >> $$@
|
|
|
|
|
2011-11-23 17:20:28 -06:00
|
|
|
%.linux.def: %.def.in $$(MKFILE_DEPS)
|
2011-11-01 18:50:47 -05:00
|
|
|
@$$(call E, def: $$@)
|
|
|
|
$$(Q)echo "{" > $$@
|
2011-11-02 16:22:07 -05:00
|
|
|
$$(Q)sed 's/.$$$$/&;/' $$< >> $$@
|
2011-11-01 18:50:47 -05:00
|
|
|
$$(Q)echo "};" >> $$@
|
2011-05-01 15:18:52 -05:00
|
|
|
|
2011-11-23 17:20:28 -06:00
|
|
|
%.darwin.def: %.def.in $$(MKFILE_DEPS)
|
2011-11-01 18:50:47 -05:00
|
|
|
@$$(call E, def: $$@)
|
|
|
|
$$(Q)sed 's/^./_&/' $$< > $$@
|
2011-05-01 15:18:52 -05:00
|
|
|
|
|
|
|
ifdef CFG_WINDOWSY
|
2011-11-23 17:20:28 -06:00
|
|
|
%.def: %.def.in $$(MKFILE_DEPS)
|
2011-11-01 18:50:47 -05:00
|
|
|
@$$(call E, def: $$@)
|
|
|
|
$$(Q)echo LIBRARY $$* > $$@
|
|
|
|
$$(Q)echo EXPORTS >> $$@
|
|
|
|
$$(Q)sed 's/^./ &/' $$< >> $$@
|
2011-05-01 15:18:52 -05:00
|
|
|
endif
|
2011-11-01 18:50:47 -05:00
|
|
|
|
|
|
|
endef
|
|
|
|
|
|
|
|
# Instantiate template for all stages
|
|
|
|
$(foreach target,$(CFG_TARGET_TRIPLES), \
|
|
|
|
$(eval $(call DEF_RUNTIME_TARGETS,$(target))))
|