rt.mk 6.8 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
# 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). 

N
Niko Matsakis 已提交
26
# Hack for passing flags into LIBUV, see below.
27 28
LIBUV_FLAGS_i386 = -m32 -fPIC
LIBUV_FLAGS_x86_64 = -m64 -fPIC
N
Niko Matsakis 已提交
29

30 31 32 33 34 35 36 37 38
# when we're doing a snapshot build, we intentionally degrade as many
# features in libuv and the runtime as possible, to ease portability.

SNAP_DEFINES:=
ifneq ($(strip $(findstring snap,$(MAKECMDGOALS))),)
	SNAP_DEFINES=-DRUST_SNAPSHOT
endif


39 40
define DEF_RUNTIME_TARGETS

G
Graydon Hoare 已提交
41 42 43 44
######################################################################
# Runtime (C++) library variables
######################################################################

45
RUNTIME_CXXS_$(1) := \
46
              rt/sync/timer.cpp \
G
Graydon Hoare 已提交
47
              rt/sync/lock_and_signal.cpp \
48
              rt/sync/rust_thread.cpp \
G
Graydon Hoare 已提交
49 50 51
              rt/rust.cpp \
              rt/rust_builtin.cpp \
              rt/rust_run_program.cpp \
52
              rt/rust_env.cpp \
53
              rt/rust_sched_loop.cpp \
54
              rt/rust_sched_launcher.cpp \
55
              rt/rust_sched_driver.cpp \
56
              rt/rust_scheduler.cpp \
B
Brian Anderson 已提交
57
              rt/rust_sched_reaper.cpp \
G
Graydon Hoare 已提交
58
              rt/rust_task.cpp \
59
              rt/rust_stack.cpp \
G
Graydon Hoare 已提交
60
              rt/rust_upcall.cpp \
61
              rt/rust_uv.cpp \
62
              rt/rust_crate_map.cpp \
G
Graydon Hoare 已提交
63
              rt/rust_log.cpp \
64
              rt/rust_gc_metadata.cpp \
65
              rt/rust_util.cpp \
66
              rt/rust_exchange_alloc.cpp \
G
Graydon Hoare 已提交
67
              rt/isaac/randport.cpp \
68
              rt/miniz.cpp \
G
Graydon Hoare 已提交
69
              rt/rust_kernel.cpp \
70
              rt/rust_abi.cpp \
71
              rt/rust_debug.cpp \
G
Graydon Hoare 已提交
72
              rt/memory_region.cpp \
73
              rt/boxed_region.cpp \
74 75
              rt/arch/$$(HOST_$(1))/context.cpp \
              rt/arch/$$(HOST_$(1))/gpr.cpp
76

77
RUNTIME_CS_$(1) := rt/linenoise/linenoise.c rt/linenoise/utf8.c
78

79 80
RUNTIME_S_$(1) := rt/arch/$$(HOST_$(1))/_context.S \
                  rt/arch/$$(HOST_$(1))/ccall.S \
81
                  rt/arch/$$(HOST_$(1))/record_sp.S
82

83 84
ifeq ($$(HOST_$(1)), i386)
  LIBUV_ARCH_$(1) := ia32
E
Erick Tryzelaar 已提交
85
else
86
  LIBUV_ARCH_$(1) := x86_64
E
Erick Tryzelaar 已提交
87 88
endif

89 90
ifeq ($$(CFG_WINDOWSY), 1)
  LIBUV_OSTYPE_$(1) := win
G
Graydon Hoare 已提交
91
  LIBUV_LIB_$(1) := rt/$(1)/libuv/Release/obj.target/src/libuv/libuv.a
92 93
else ifeq ($(CFG_OSTYPE), apple-darwin)
  LIBUV_OSTYPE_$(1) := mac
G
Graydon Hoare 已提交
94
  LIBUV_LIB_$(1) := rt/$(1)/libuv/Release/libuv.a
U
User Jyyou 已提交
95
else ifeq ($(CFG_OSTYPE), unknown-freebsd)
J
Jyun-Yan You 已提交
96
  LIBUV_OSTYPE_$(1) := unix/freebsd
G
Graydon Hoare 已提交
97
  LIBUV_LIB_$(1) := rt/$(1)/libuv/Release/obj.target/src/libuv/libuv.a
98
else
J
Jyun-Yan You 已提交
99
  LIBUV_OSTYPE_$(1) := unix/linux
G
Graydon Hoare 已提交
100
  LIBUV_LIB_$(1) := rt/$(1)/libuv/Release/obj.target/src/libuv/libuv.a
101
endif
G
Graydon Hoare 已提交
102

103
RUNTIME_DEF_$(1) := rt/rustrt$$(CFG_DEF_SUFFIX)
104
RUNTIME_INCS_$(1) := -I $$(S)src/rt -I $$(S)src/rt/isaac -I $$(S)src/rt/uthash \
105 106 107 108 109
                     -I $$(S)src/rt/arch/$$(HOST_$(1)) \
                     -I $$(S)src/rt/linenoise \
                     -I $$(S)src/libuv/include
RUNTIME_OBJS_$(1) := $$(RUNTIME_CXXS_$(1):rt/%.cpp=rt/$(1)/%.o) \
                     $$(RUNTIME_CS_$(1):rt/%.c=rt/$(1)/%.o) \
110
                     $$(RUNTIME_S_$(1):rt/%.S=rt/$(1)/%.o)
111 112 113 114 115
ALL_OBJ_FILES += $$(RUNTIME_OBJS_$(1))

MORESTACK_OBJ_$(1) := rt/$(1)/arch/$$(HOST_$(1))/morestack.o
ALL_OBJ_FILES += $$(MORESTACK_OBJS_$(1))

116 117
RUNTIME_LIBS_$(1) := $$(LIBUV_LIB_$(1))

118
rt/$(1)/%.o: rt/%.cpp $$(MKFILE_DEPS)
119
	@$$(call E, compile: $$@)
120
	$$(Q)$$(call CFG_COMPILE_CXX_$(1), $$@, $$(RUNTIME_INCS_$(1)) \
121
                 $$(SNAP_DEFINES)) $$<
122

123
rt/$(1)/%.o: rt/%.c $$(MKFILE_DEPS)
124
	@$$(call E, compile: $$@)
125 126
	$$(Q)$$(call CFG_COMPILE_C_$(1), $$@, $$(RUNTIME_INCS_$(1)) \
                 $$(SNAP_DEFINES)) $$<
127

128
rt/$(1)/%.o: rt/%.S  $$(MKFILE_DEPS) \
G
Graydon Hoare 已提交
129
                     $$(LLVM_CONFIG_$$(CFG_HOST_TRIPLE))
130
	@$$(call E, compile: $$@)
131
	$$(Q)$$(call CFG_ASSEMBLE_$(1),$$@,$$<)
132

133
rt/$(1)/arch/$$(HOST_$(1))/libmorestack.a: $$(MORESTACK_OBJ_$(1))
134 135 136
	@$$(call E, link: $$@)
	$$(Q)ar rcs $$@ $$<

137 138 139
rt/$(1)/$(CFG_RUNTIME): $$(RUNTIME_OBJS_$(1)) $$(MKFILE_DEPS) \
                        $$(RUNTIME_DEF_$(1)) \
                        $$(RUNTIME_LIBS_$(1))
140
	@$$(call E, link: $$@)
141
	$$(Q)$$(call CFG_LINK_CXX_$(1),$$@, $$(RUNTIME_OBJS_$(1)) \
142 143
	  $$(CFG_GCCISH_POST_LIB_FLAGS) $$(RUNTIME_LIBS_$(1)) \
	  $$(CFG_LIBUV_LINK_FLAGS),$$(RUNTIME_DEF_$(1)),$$(CFG_RUNTIME))
144

M
Michael Sullivan 已提交
145 146 147 148
# 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
149 150 151 152 153 154 155 156 157 158 159 160

ifdef CFG_ENABLE_FAST_MAKE
LIBUV_DEPS := $$(S)/.gitmodules
else
LIBUV_DEPS := $$(wildcard \
              $$(S)src/libuv/* \
              $$(S)src/libuv/*/* \
              $$(S)src/libuv/*/*/* \
              $$(S)src/libuv/*/*/*/*)
endif

$$(LIBUV_LIB_$(1)): $$(LIBUV_DEPS)
161
	$$(Q)$$(MAKE) -C $$(S)mk/libuv/$$(LIBUV_ARCH_$(1))/$$(LIBUV_OSTYPE_$(1)) \
162
		CFLAGS="$$(LIBUV_FLAGS_$$(HOST_$(1))) $$(SNAP_DEFINES)" \
N
Niko Matsakis 已提交
163
        LDFLAGS="$$(LIBUV_FLAGS_$$(HOST_$(1)))" \
164 165 166
		CC="$$(CFG_GCCISH_CROSS)$$(CC)" \
		CXX="$$(CFG_GCCISH_CROSS)$$(CXX)" \
		AR="$$(CFG_GCCISH_CROSS)$$(AR)" \
G
Graydon Hoare 已提交
167
		BUILDTYPE=Release \
168 169
		builddir_name="$$(CFG_BUILD_DIR)/rt/$(1)/libuv" \
		V=$$(VERBOSE) FLOCK= uv
G
Graydon Hoare 已提交
170 171 172

# These could go in rt.mk or rustllvm.mk, they're needed for both.

173
# This regexp has a single $, escaped twice
U
User Jyyou 已提交
174 175 176 177 178 179
%.bsd.def:    %.def.in $$(MKFILE_DEPS)
	@$$(call E, def: $$@)
	$$(Q)echo "{" > $$@
	$$(Q)sed 's/.$$$$/&;/' $$< >> $$@
	$$(Q)echo "};" >> $$@

180
%.linux.def:    %.def.in $$(MKFILE_DEPS)
181 182
	@$$(call E, def: $$@)
	$$(Q)echo "{" > $$@
183
	$$(Q)sed 's/.$$$$/&;/' $$< >> $$@
184
	$$(Q)echo "};" >> $$@
G
Graydon Hoare 已提交
185

186
%.darwin.def:	%.def.in $$(MKFILE_DEPS)
187 188
	@$$(call E, def: $$@)
	$$(Q)sed 's/^./_&/' $$< > $$@
G
Graydon Hoare 已提交
189 190

ifdef CFG_WINDOWSY
191
%.def:	%.def.in $$(MKFILE_DEPS)
192 193 194 195
	@$$(call E, def: $$@)
	$$(Q)echo LIBRARY $$* > $$@
	$$(Q)echo EXPORTS >> $$@
	$$(Q)sed 's/^./    &/' $$< >> $$@
G
Graydon Hoare 已提交
196
endif
197 198 199 200 201 202

endef

# Instantiate template for all stages
$(foreach target,$(CFG_TARGET_TRIPLES), \
 $(eval $(call DEF_RUNTIME_TARGETS,$(target))))