Skip to content

Commit 74fedf3

Browse files
committed
auto merge of #11787 : alexcrichton/rust/refactor, r=brson
It was decided a long, long time ago that libextra should not exist, but rather its modules should be split out into smaller independent libraries maintained outside of the compiler itself. The theory was to use `rustpkg` to manage dependencies in order to move everything out of the compiler, but maintain an ease of usability. Sadly, the work on `rustpkg` isn't making progress as quickly as expected, but the need for dissolving libextra is becoming more and more pressing. Because of this, we've thought that a good interim solution would be to simply package more libraries with the rust distribution itself. Instead of dissolving libextra into libraries outside of the mozilla/rust repo, we can dissolve libraries into the mozilla/rust repo for now. Work on this has been excruciatingly painful in the past because the makefiles are completely opaque to all but a few. Adding a new library involved adding about 100 lines spread out across 8 files (incredibly error prone). The first commit of this pull request targets this pain point. It does not rewrite the build system, but rather refactors large portions of it. Afterwards, adding a new library is as simple as modifying 2 lines (easy, right?). The build system automatically keeps track of dependencies between crates (rust *and* native), promotes binaries between stages, tracks dependencies of installed tools, etc, etc. With this newfound buildsystem power, I chose the `extra::flate` module as the first candidate for removal from libextra. While a small module, this module is relative complex in that is has a C dependency and the compiler requires it (messing with the dependency graph a bit). Albeit I modified more than 2 lines of makefiles to accomodate libflate (the native dependency required 2 extra lines of modifications), but the removal process was easy to do and straightforward. --- Testing-wise, I've cross-compiled, run tests, built some docs, installed, uninstalled, etc. I'm still working out a few kinks, and I'm sure that there's gonna be built system issues after this, but it should be working well for basic use! cc #8784
2 parents d3f70f5 + cdfdc1e commit 74fedf3

File tree

18 files changed

+569
-1049
lines changed

18 files changed

+569
-1049
lines changed

Makefile.in

Lines changed: 29 additions & 182 deletions
Original file line numberDiff line numberDiff line change
@@ -222,72 +222,27 @@ GENERATED :=
222222

223223

224224
######################################################################
225-
# Crates
225+
# Cleaning out old crates
226226
######################################################################
227227

228-
define DEF_LIBS
229-
230-
CFG_RUNTIME_$(1) :=$(call CFG_STATIC_LIB_NAME_$(1),rustrt)
231-
CFG_RUSTLLVM_$(1) :=$(call CFG_STATIC_LIB_NAME_$(1),rustllvm)
232-
CFG_STDLIB_$(1) :=$(call CFG_LIB_NAME_$(1),std)
233-
CFG_EXTRALIB_$(1) :=$(call CFG_LIB_NAME_$(1),extra)
234-
CFG_LIBRUSTC_$(1) :=$(call CFG_LIB_NAME_$(1),rustc)
235-
CFG_LIBSYNTAX_$(1) :=$(call CFG_LIB_NAME_$(1),syntax)
236-
CFG_LIBRUSTPKG_$(1) :=$(call CFG_LIB_NAME_$(1),rustpkg)
237-
CFG_LIBRUSTDOC_$(1) :=$(call CFG_LIB_NAME_$(1),rustdoc)
238-
CFG_LIBRUSTUV_$(1) :=$(call CFG_LIB_NAME_$(1),rustuv)
239-
CFG_LIBGREEN_$(1) :=$(call CFG_LIB_NAME_$(1),green)
240-
CFG_LIBNATIVE_$(1) :=$(call CFG_LIB_NAME_$(1),native)
241-
242-
EXTRALIB_GLOB_$(1) :=$(call CFG_LIB_GLOB_$(1),extra)
243-
STDLIB_GLOB_$(1) :=$(call CFG_LIB_GLOB_$(1),std)
244-
LIBRUSTC_GLOB_$(1) :=$(call CFG_LIB_GLOB_$(1),rustc)
245-
LIBSYNTAX_GLOB_$(1) :=$(call CFG_LIB_GLOB_$(1),syntax)
246-
LIBRUSTPKG_GLOB_$(1) :=$(call CFG_LIB_GLOB_$(1),rustpkg)
247-
LIBRUSTDOC_GLOB_$(1) :=$(call CFG_LIB_GLOB_$(1),rustdoc)
248-
LIBRUSTUV_GLOB_$(1) :=$(call CFG_LIB_GLOB_$(1),rustuv)
249-
LIBGREEN_GLOB_$(1) :=$(call CFG_LIB_GLOB_$(1),green)
250-
LIBNATIVE_GLOB_$(1) :=$(call CFG_LIB_GLOB_$(1),native)
251-
EXTRALIB_DSYM_GLOB_$(1) :=$(call CFG_LIB_DSYM_GLOB_$(1),extra)
252-
STDLIB_DSYM_GLOB_$(1) :=$(call CFG_LIB_DSYM_GLOB_$(1),std)
253-
LIBRUSTC_DSYM_GLOB_$(1) :=$(call CFG_LIB_DSYM_GLOB_$(1),rustc)
254-
LIBSYNTAX_DSYM_GLOB_$(1) :=$(call CFG_LIB_DSYM_GLOB_$(1),syntax)
255-
LIBRUSTPKG_DSYM_GLOB_$(1) :=$(call CFG_LIB_DSYM_GLOB_$(1),rustpkg)
256-
LIBRUSTDOC_DSYM_GLOB_$(1) :=$(call CFG_LIB_DSYM_GLOB_$(1),rustdoc)
257-
LIBRUSTUV_DSYM_GLOB_$(1) :=$(call CFG_LIB_DSYM_GLOB_$(1),rustuv)
258-
LIBGREEN_DSYM_GLOB_$(1) :=$(call CFG_LIB_DSYM_GLOB_$(1),green)
259-
LIBNATIVE_DSYM_GLOB_$(1) :=$(call CFG_LIB_DSYM_GLOB_$(1),native)
260-
261-
EXTRALIB_RGLOB_$(1) :=$(call CFG_RLIB_GLOB,extra)
262-
STDLIB_RGLOB_$(1) :=$(call CFG_RLIB_GLOB,std)
263-
LIBRUSTUV_RGLOB_$(1) :=$(call CFG_RLIB_GLOB,rustuv)
264-
LIBSYNTAX_RGLOB_$(1) :=$(call CFG_RLIB_GLOB,syntax)
265-
LIBRUSTC_RGLOB_$(1) :=$(call CFG_RLIB_GLOB,rustc)
266-
LIBNATIVE_RGLOB_$(1) :=$(call CFG_RLIB_GLOB,native)
267-
LIBGREEN_RGLOB_$(1) :=$(call CFG_RLIB_GLOB,green)
268-
269-
endef
270-
271228
# $(1) is the path for directory to match against
272229
# $(2) is the glob to use in the match
273-
# $(3) is filename (usually the target being created) to filter out from match
274-
# (i.e. filename is not out-of-date artifact from prior Rust version/build)
275230
#
276231
# Note that a common bug is to accidentally construct the glob denoted
277232
# by $(2) with a space character prefix, which invalidates the
278233
# construction $(1)$(2).
279-
define CHECK_FOR_OLD_GLOB_MATCHES_EXCEPT
280-
$(Q)MATCHES="$(filter-out %$(3),$(wildcard $(1)/$(2)))"; if [ -n "$$MATCHES" ] ; then echo "warning: there are previous" \'$(2)\' "libraries:" $$MATCHES; fi
234+
define CHECK_FOR_OLD_GLOB_MATCHES
235+
$(Q)MATCHES="$(wildcard $(1))"; if [ -n "$$MATCHES" ] ; then echo "warning: there are previous" \'$(notdir $(2))\' "libraries:" $$MATCHES; fi
281236
endef
282237

283238
# Same interface as above, but deletes rather than just listing the files.
284239
ifdef VERBOSE
285-
define REMOVE_ALL_OLD_GLOB_MATCHES_EXCEPT
286-
$(Q)MATCHES="$(filter-out %$(3),$(wildcard $(1)/$(2)))"; if [ -n "$$MATCHES" ] ; then echo "warning: removing previous" \'$(2)\' "libraries:" $$MATCHES; rm $$MATCHES ; fi
240+
define REMOVE_ALL_OLD_GLOB_MATCHES
241+
$(Q)MATCHES="$(wildcard $(1))"; if [ -n "$$MATCHES" ] ; then echo "warning: removing previous" \'$(notdir $(1))\' "libraries:" $$MATCHES; rm $$MATCHES ; fi
287242
endef
288243
else
289-
define REMOVE_ALL_OLD_GLOB_MATCHES_EXCEPT
290-
$(Q)MATCHES="$(filter-out %$(3),$(wildcard $(1)/$(2)))"; if [ -n "$$MATCHES" ] ; then rm $$MATCHES ; fi
244+
define REMOVE_ALL_OLD_GLOB_MATCHES
245+
$(Q)MATCHES="$(wildcard $(1))"; if [ -n "$$MATCHES" ] ; then rm $$MATCHES ; fi
291246
endef
292247
endif
293248

@@ -298,72 +253,15 @@ endif
298253
# soon. (This is in contrast to the macros above, which are meant to
299254
# be run at the outset of a command list in a rule.)
300255
ifdef VERBOSE
301-
define LIST_ALL_OLD_GLOB_MATCHES_EXCEPT
302-
@echo "info: now are following matches for" '$(2)' "libraries:"
303-
@( cd $(1) && ( ls $(2) 2>/dev/null || true ) | grep -v $(3) || true )
256+
define LIST_ALL_OLD_GLOB_MATCHES
257+
@echo "info: now are following matches for" '$(notdir $(1))' "libraries:"
258+
@( ls $(1) 2>/dev/null || true )
304259
endef
305260
else
306-
define LIST_ALL_OLD_GLOB_MATCHES_EXCEPT
261+
define LIST_ALL_OLD_GLOB_MATCHES
307262
endef
308263
endif
309264

310-
$(foreach target,$(CFG_TARGET),\
311-
$(eval $(call DEF_LIBS,$(target))))
312-
313-
######################################################################
314-
# Standard library variables
315-
######################################################################
316-
317-
STDLIB_CRATE := $(S)src/libstd/lib.rs
318-
STDLIB_INPUTS := $(wildcard $(addprefix $(S)src/libstd/, \
319-
*.rs */*.rs */*/*rs */*/*/*rs))
320-
321-
######################################################################
322-
# Extra library variables
323-
######################################################################
324-
325-
EXTRALIB_CRATE := $(S)src/libextra/lib.rs
326-
EXTRALIB_INPUTS := $(wildcard $(addprefix $(S)src/libextra/, \
327-
*.rs */*.rs))
328-
329-
######################################################################
330-
# Rust UV library variables
331-
######################################################################
332-
333-
LIBRUSTUV_CRATE := $(S)src/librustuv/lib.rs
334-
LIBRUSTUV_INPUTS := $(wildcard $(addprefix $(S)src/librustuv/, \
335-
*.rs */*.rs))
336-
337-
######################################################################
338-
# Green threading library variables
339-
######################################################################
340-
341-
LIBGREEN_CRATE := $(S)src/libgreen/lib.rs
342-
LIBGREEN_INPUTS := $(wildcard $(addprefix $(S)src/libgreen/, \
343-
*.rs */*.rs))
344-
345-
######################################################################
346-
# Native threading library variables
347-
######################################################################
348-
349-
LIBNATIVE_CRATE := $(S)src/libnative/lib.rs
350-
LIBNATIVE_INPUTS := $(wildcard $(addprefix $(S)src/libnative/, \
351-
*.rs */*.rs))
352-
353-
######################################################################
354-
# rustc crate variables
355-
######################################################################
356-
357-
COMPILER_CRATE := $(S)src/librustc/lib.rs
358-
COMPILER_INPUTS := $(wildcard $(addprefix $(S)src/librustc/, \
359-
*.rs */*.rs */*/*.rs */*/*/*.rs))
360-
361-
LIBSYNTAX_CRATE := $(S)src/libsyntax/lib.rs
362-
LIBSYNTAX_INPUTS := $(wildcard $(addprefix $(S)src/libsyntax/, \
363-
*.rs */*.rs */*/*.rs */*/*/*.rs))
364-
365-
DRIVER_CRATE := $(S)src/driver/driver.rs
366-
367265
######################################################################
368266
# LLVM macros
369267
######################################################################
@@ -424,14 +322,12 @@ export CFG_RUSTLIBDIR
424322
export CFG_LIBDIR_RELATIVE
425323
export CFG_DISABLE_INJECT_STD_VERSION
426324

427-
######################################################################
428-
# Subprograms
429-
######################################################################
430-
431325
######################################################################
432326
# Per-stage targets and runner
433327
######################################################################
434328

329+
include $(CFG_SRC_DIR)mk/crates.mk
330+
435331
define SREQ
436332
# $(1) is the stage number
437333
# $(2) is the target triple
@@ -447,84 +343,37 @@ TROOT$(1)_T_$(2)_H_$(3) = $$(HLIB$(1)_H_$(3))/$$(CFG_RUSTLIBDIR)/$(2)
447343
TBIN$(1)_T_$(2)_H_$(3) = $$(TROOT$(1)_T_$(2)_H_$(3))/bin
448344
TLIB$(1)_T_$(2)_H_$(3) = $$(TROOT$(1)_T_$(2)_H_$(3))/lib
449345

450-
# The name of the standard and extra libraries used by rustc
451-
HSTDLIB_DEFAULT$(1)_H_$(3) = \
452-
$$(HLIB$(1)_H_$(3))/$(CFG_STDLIB_$(3))
453-
TSTDLIB_DEFAULT$(1)_T_$(2)_H_$(3) = \
454-
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_STDLIB_$(2))
455-
456-
HEXTRALIB_DEFAULT$(1)_H_$(3) = \
457-
$$(HLIB$(1)_H_$(3))/$(CFG_EXTRALIB_$(3))
458-
TEXTRALIB_DEFAULT$(1)_T_$(2)_H_$(3) = \
459-
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_EXTRALIB_$(2))
460-
461-
HLIBRUSTC_DEFAULT$(1)_H_$(3) = \
462-
$$(HLIB$(1)_H_$(3))/$(CFG_LIBRUSTC_$(3))
463-
TLIBRUSTC_DEFAULT$(1)_T_$(2)_H_$(3) = \
464-
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_LIBRUSTC_$(2))
465-
466-
HLIBRUSTUV_DEFAULT$(1)_H_$(3) = \
467-
$$(HLIB$(1)_H_$(3))/$(CFG_LIBRUSTUV_$(3))
468-
TLIBRUSTUV_DEFAULT$(1)_T_$(2)_H_$(3) = \
469-
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_LIBRUSTUV_$(2))
470-
471-
HLIBGREEN_DEFAULT$(1)_H_$(3) = \
472-
$$(HLIB$(1)_H_$(3))/$(CFG_LIBGREEN_$(3))
473-
TLIBGREEN_DEFAULT$(1)_T_$(2)_H_$(3) = \
474-
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_LIBGREEN_$(2))
475-
476-
HLIBNATIVE_DEFAULT$(1)_H_$(3) = \
477-
$$(HLIB$(1)_H_$(3))/$(CFG_LIBNATIVE_$(3))
478-
TLIBNATIVE_DEFAULT$(1)_T_$(2)_H_$(3) = \
479-
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_LIBNATIVE_$(2))
480-
481346
# Preqrequisites for using the stageN compiler
482347
ifeq ($(1),0)
483348
HSREQ$(1)_H_$(3) = $$(HBIN$(1)_H_$(3))/rustc$$(X_$(3))
484349
else
485350
HSREQ$(1)_H_$(3) = \
486351
$$(HBIN$(1)_H_$(3))/rustc$$(X_$(3)) \
487-
$$(HSTDLIB_DEFAULT$(1)_H_$(3)) \
488-
$$(HEXTRALIB_DEFAULT$(1)_H_$(3)) \
489-
$$(HLIBSYNTAX_DEFAULT$(1)_H_$(3)) \
490-
$$(HLIBRUSTC_DEFAULT$(1)_H_$(3)) \
491-
$$(HLIBRUSTUV_DEFAULT$(1)_H_$(3)) \
492-
$$(HLIBGREEN_DEFAULT$(1)_H_$(3)) \
493-
$$(HLIBNATIVE_DEFAULT$(1)_H_$(3)) \
352+
$$(HLIB$(1)_H_$(3))/stamp.rustc \
353+
$$(foreach dep,$$(RUST_DEPS_rustc),$$(HLIB$(1)_H_$(3))/stamp.$$(dep)) \
494354
$$(MKFILE_DEPS)
495355
endif
496356

497357
# Prerequisites for using the stageN compiler to build target artifacts
498358
TSREQ$(1)_T_$(2)_H_$(3) = \
499359
$$(HSREQ$(1)_H_$(3)) \
500-
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_RUNTIME_$(2)) \
501360
$$(TLIB$(1)_T_$(2)_H_$(3))/libmorestack.a
502361

503-
# Prerequisites for a working stageN compiler and libraries, for a specific target
362+
# Prerequisites for a working stageN compiler and libraries, for a specific
363+
# target
504364
SREQ$(1)_T_$(2)_H_$(3) = \
505365
$$(TSREQ$(1)_T_$(2)_H_$(3)) \
506-
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_STDLIB_$(2)) \
507-
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_EXTRALIB_$(2)) \
508-
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_LIBRUSTUV_$(2)) \
509-
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_LIBGREEN_$(2)) \
510-
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_LIBNATIVE_$(2))
366+
$$(foreach dep,$$(TARGET_CRATES),\
367+
$$(TLIB$(1)_T_$(2)_H_$(3))/stamp.$$(dep))
511368

512-
# Prerequisites for a working stageN compiler and libraries, for a specific target
369+
# Prerequisites for a working stageN compiler and complete set of target
370+
# libraries
513371
CSREQ$(1)_T_$(2)_H_$(3) = \
514372
$$(TSREQ$(1)_T_$(2)_H_$(3)) \
515373
$$(HBIN$(1)_H_$(3))/rustpkg$$(X_$(3)) \
516374
$$(HBIN$(1)_H_$(3))/rustdoc$$(X_$(3)) \
517-
$$(HLIB$(1)_H_$(3))/$(CFG_LIBRUSTPKG_$(3)) \
518-
$$(HLIB$(1)_H_$(3))/$(CFG_LIBRUSTDOC_$(3)) \
519-
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_STDLIB_$(2)) \
520-
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_EXTRALIB_$(2)) \
521-
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_LIBSYNTAX_$(2)) \
522-
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_LIBRUSTC_$(2)) \
523-
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_LIBRUSTPKG_$(2)) \
524-
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_LIBRUSTDOC_$(2)) \
525-
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_LIBRUSTUV_$(2)) \
526-
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_LIBGREEN_$(2)) \
527-
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_LIBNATIVE_$(2))
375+
$$(foreach dep,$$(CRATES),$$(TLIB$(1)_T_$(2)_H_$(3))/stamp.$$(dep)) \
376+
$$(foreach dep,$$(HOST_CRATES),$$(HLIB$(1)_H_$(3))/stamp.$$(dep))
528377

529378
ifeq ($(1),0)
530379
# Don't run the the stage0 compiler under valgrind - that ship has sailed
@@ -562,15 +411,15 @@ endif
562411
STAGE$(1)_T_$(2)_H_$(3) := \
563412
$$(Q)$$(RPATH_VAR$(1)_T_$(2)_H_$(3)) \
564413
$$(call CFG_RUN_TARG_$(3),$(1), \
565-
$$(CFG_VALGRIND_COMPILE$(1)) \
414+
$$(CFG_VALGRIND_COMPILE$(1)) \
566415
$$(HBIN$(1)_H_$(3))/rustc$$(X_$(3)) \
567416
--cfg $$(CFGFLAG$(1)_T_$(2)_H_$(3)) \
568417
$$(CFG_RUSTC_FLAGS) $$(EXTRAFLAGS_STAGE$(1)) --target=$(2)) \
569418
$$(RUSTC_FLAGS_$(2))
570419

571-
PERF_STAGE$(1)_T_$(2)_H_$(3) := \
420+
PERF_STAGE$(1)_T_$(2)_H_$(3) := \
572421
$$(Q)$$(call CFG_RUN_TARG_$(3),$(1), \
573-
$$(CFG_PERF_TOOL) \
422+
$$(CFG_PERF_TOOL) \
574423
$$(HBIN$(1)_H_$(3))/rustc$$(X_$(3)) \
575424
--cfg $$(CFGFLAG$(1)_T_$(2)_H_$(3)) \
576425
$$(CFG_RUSTC_FLAGS) $$(EXTRAFLAGS_STAGE$(1)) --target=$(2)) \
@@ -594,13 +443,12 @@ define DEF_RUSTC_STAGE_TARGET
594443
# $(2) == stage
595444

596445
rustc-stage$(2)-H-$(1): \
597-
$$(foreach target,$$(CFG_TARGET), \
598-
$$(SREQ$(2)_T_$$(target)_H_$(1)))
446+
$$(foreach target,$$(CFG_TARGET),$$(SREQ$(2)_T_$$(target)_H_$(1)))
599447

600448
endef
601449

602-
$(foreach host,$(CFG_HOST), \
603-
$(eval $(foreach stage,1 2 3, \
450+
$(foreach host,$(CFG_HOST), \
451+
$(eval $(foreach stage,1 2 3, \
604452
$(eval $(call DEF_RUSTC_STAGE_TARGET,$(host),$(stage))))))
605453

606454
rustc-stage1: rustc-stage1-H-$(CFG_BUILD)
@@ -701,7 +549,6 @@ include $(CFG_SRC_DIR)mk/target.mk
701549
include $(CFG_SRC_DIR)mk/host.mk
702550
include $(CFG_SRC_DIR)mk/stage0.mk
703551
include $(CFG_SRC_DIR)mk/rustllvm.mk
704-
include $(CFG_SRC_DIR)mk/tools.mk
705552
include $(CFG_SRC_DIR)mk/docs.mk
706553
include $(CFG_SRC_DIR)mk/llvm.mk
707554

doc/index.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ li {list-style-type: none; }
3737
* [The Rust parser, `libsyntax`](syntax/index.html)
3838
* [The Rust compiler, `librustc`](rustc/index.html)
3939

40+
* [The `flate` compression library](flate/index.html)
41+
4042
# Tooling
4143

4244
* [The `rustdoc` manual](rustdoc.html)
@@ -47,11 +49,11 @@ li {list-style-type: none; }
4749
* [Language FAQ](complement-lang-faq.html)
4850
* [Project FAQ](complement-project-faq.html)
4951
* [Usage FAQ](complement-usage-faq.html)
50-
* [Code cheatsheet](complement-cheatsheet.html) - "How do I do X?"
52+
* [Code cheatsheet](complement-cheatsheet.html) - "How do I do X?"
5153
* [How to submit a bug report](complement-bugreport.html)
5254

5355
# External resources
5456

55-
* The Rust [IRC channel](http://chat.mibbit.com/?server=irc.mozilla.org&channel=%23rust) - `#rust` on irc.mozilla.org
57+
* The Rust [IRC channel](http://chat.mibbit.com/?server=irc.mozilla.org&channel=%23rust) - `#rust` on irc.mozilla.org
5658
* The Rust community on [Reddit](http://reddit.com/r/rust)
5759
* The Rust [wiki](http://github.com/mozilla/rust/wiki)

0 commit comments

Comments
 (0)