@@ -2070,6 +2070,38 @@ The currently implemented features of the compiler are:
2070
2070
closure as ` once ` is unlikely to be supported going forward. So
2071
2071
they are hidden behind this feature until they are to be removed.
2072
2072
2073
+ * ` managed_boxes ` - Usage of ` @ ` pointers is gated due to many
2074
+ planned changes to this feature. In the past, this has meant
2075
+ "a GC pointer", but the current implementation uses
2076
+ reference counting and will likely change drastically over
2077
+ time. Additionally, the ` @ ` syntax will no longer be used to
2078
+ create GC boxes.
2079
+
2080
+ * ` asm ` - The ` asm! ` macro provides a means for inline assembly. This is often
2081
+ useful, but the exact syntax for this feature along with its semantics
2082
+ are likely to change, so this macro usage must be opted into.
2083
+
2084
+ * ` non_ascii_idents ` - The compiler supports the use of non-ascii identifiers,
2085
+ but the implementation is a little rough around the
2086
+ edges, so this can be seen as an experimental feature for
2087
+ now until the specification of identifiers is fully
2088
+ fleshed out.
2089
+
2090
+ * ` thread_local ` - The usage of the ` #[thread_local] ` attribute is experimental
2091
+ and should be seen as unstable. This attribute is used to
2092
+ declare a ` static ` as being unique per-thread leveraging
2093
+ LLVM's implementation which works in concert with the kernel
2094
+ loader and dynamic linker. This is not necessarily available
2095
+ on all platforms, and usage of it is discouraged (rust
2096
+ focuses more on task-local data instead of thread-local
2097
+ data).
2098
+
2099
+ * ` link_args ` - This attribute is used to specify custom flags to the linker,
2100
+ but usage is strongly discouraged. The compiler's usage of the
2101
+ system linker is not guaranteed to continue in the future, and
2102
+ if the system linker is not used then specifying custom flags
2103
+ doesn't have much meaning.
2104
+
2073
2105
If a feature is promoted to a language feature, then all existing programs will
2074
2106
start to receive compilation warnings about #[ feature] directives which enabled
2075
2107
the new feature (because the directive is no longer necessary). However, if
@@ -3611,6 +3643,111 @@ queues, as well as code to copy values between queues and their recipients and
3611
3643
to serialize values for transmission over operating-system inter-process
3612
3644
communication facilities.
3613
3645
3646
+ ### Linkage
3647
+
3648
+ The Rust compiler supports various methods to link crates together both
3649
+ statically and dynamically. This section will explore the various methods to
3650
+ link Rust crates together, and more information about native libraries can be
3651
+ found in the [ ffi tutorial] [ ffi ] .
3652
+
3653
+ In one session of compilation, the compiler can generate multiple artifacts
3654
+ through the usage of command line flags and the ` crate_type ` attribute.
3655
+
3656
+ * ` --bin ` , ` #[crate_type = "bin"] ` - A runnable executable will be produced.
3657
+ This requires that there is a ` main ` function in the crate which will be run
3658
+ when the program begins executing. This will link in all Rust and native
3659
+ dependencies, producing a distributable binary.
3660
+
3661
+ * ` --lib ` , ` #[crate_type = "lib"] ` - A Rust library will be produced. This is
3662
+ an ambiguous concept as to what exactly is produced because a library can
3663
+ manifest itself in several forms. The purpose of this generic ` lib ` option is
3664
+ to generate the "compiler recommended" style of library. The output library
3665
+ will always be usable by rustc, but the actual type of library may change
3666
+ from time-to-time. The remaining output types are all different flavors of
3667
+ libraries, and the ` lib ` type can be seen as an alias for one of them (but
3668
+ the actual one is compiler-defined).
3669
+
3670
+ * ` --dylib ` , ` #[crate_type = "dylib"] ` - A dynamic Rust library will be
3671
+ produced. This is different from the ` lib ` output type in that this forces
3672
+ dynamic library generation. The resulting dynamic library can be used as a
3673
+ dependency for other libraries and/or executables. This output type will
3674
+ create ` *.so ` files on linux, ` *.dylib ` files on osx, and ` *.dll ` files on
3675
+ windows.
3676
+
3677
+ * ` --staticlib ` , ` #[crate_type = "staticlib"] ` - A static system library will
3678
+ be produced. This is different from other library outputs in that the Rust
3679
+ compiler will never attempt to link to ` staticlib ` outputs. The purpose of
3680
+ this output type is to create a static library containing all of the local
3681
+ crate's code along with all upstream dependencies. The static library is
3682
+ actually a ` *.a ` archive on linux and osx and a ` *.lib ` file on windows. This
3683
+ format is recommended for use in situtations such as linking Rust code into an
3684
+ existing non-Rust application because it will not have dynamic dependencies on
3685
+ other Rust code.
3686
+
3687
+ * ` --rlib ` , ` #[crate_type = "rlib"] ` - A "Rust library" file will be produced.
3688
+ This is used as an intermediate artifact and can be thought of as a "static
3689
+ Rust library". These ` rlib ` files, unlike ` staticlib ` files, are interpreted
3690
+ by the Rust compiler in future linkage. This essentially means that ` rustc `
3691
+ will look for metadata in ` rlib ` files like it looks for metadata in dynamic
3692
+ libraries. This form of output is used to produce statically linked
3693
+ executables as well as ` staticlib ` outputs.
3694
+
3695
+ Note that these outputs are stackable in the sense that if multiple are
3696
+ specified, then the compiler will produce each form of output at once without
3697
+ having to recompile.
3698
+
3699
+ With all these different kinds of outputs, if crate A depends on crate B, then
3700
+ the compiler could find B in various different forms throughout the system. The
3701
+ only forms looked for by the compiler, however, are the ` rlib ` format and the
3702
+ dynamic library format. With these two options for a dependent library, the
3703
+ compiler must at some point make a choice between these two formats. With this
3704
+ in mind, the compiler follows these rules when determining what format of
3705
+ dependencies will be used:
3706
+
3707
+ 1 . If a dynamic library is being produced, then it is required for all upstream
3708
+ Rust dependencies to also be dynamic. This is a limitation of the current
3709
+ implementation of the linkage model. The reason behind this limitation is to
3710
+ prevent multiple copies of the same upstream library from showing up, and in
3711
+ the future it is planned to support a mixture of dynamic and static linking.
3712
+
3713
+ When producing a dynamic library, the compiler will generate an error if an
3714
+ upstream dependency could not be found, and also if an upstream dependency
3715
+ could only be found in an ` rlib ` format. Remember that ` staticlib ` formats
3716
+ are always ignored by ` rustc ` for crate-linking purposes.
3717
+
3718
+ 2 . If a static library is being produced, all upstream dependecies are
3719
+ required to be available in ` rlib ` formats. This requirement stems from the
3720
+ same reasons that a dynamic library must have all dynamic dependencies.
3721
+
3722
+ Note that it is impossible to link in native dynamic dependencies to a static
3723
+ library, and in this case warnings will be printed about all unlinked native
3724
+ dynamic dependencies.
3725
+
3726
+ 3 . If an ` rlib ` file is being produced, then there are no restrictions on what
3727
+ format the upstream dependencies are available in. It is simply required that
3728
+ all upstream dependencies be available for reading metadata from.
3729
+
3730
+ The reason for this is that ` rlib ` files do not contain any of their upstream
3731
+ dependencies. It wouldn't be very efficient for all ` rlib ` files to contain a
3732
+ copy of ` libstd.rlib ` !
3733
+
3734
+ 4 . If an executable is being produced, then things get a little interesting. As
3735
+ with the above limitations in dynamic and static libraries, it is required
3736
+ for all upstream dependencies to be in the same format. The next question is
3737
+ whether to prefer a dynamic or a static format. The compiler currently favors
3738
+ static linking over dynamic linking, but this can be inverted with the `-Z
3739
+ prefer-dynamic` flag to the compiler.
3740
+
3741
+ What this means is that first the compiler will attempt to find all upstream
3742
+ dependencies as ` rlib ` files, and if successful, it will create a statically
3743
+ linked executable. If an upstream dependency is missing as an ` rlib ` file,
3744
+ then the compiler will force all dependencies to be dynamic and will generate
3745
+ errors if dynamic versions could not be found.
3746
+
3747
+ In general, ` --bin ` or ` --lib ` should be sufficient for all compilation needs,
3748
+ and the other options are just available if more fine-grained control is desired
3749
+ over the output format of a Rust crate.
3750
+
3614
3751
### Logging system
3615
3752
3616
3753
The runtime contains a system for directing [ logging
@@ -3762,3 +3899,5 @@ Additional specific influences can be seen from the following languages:
3762
3899
* The typeclass system of Haskell.
3763
3900
* The lexical identifier rule of Python.
3764
3901
* The block syntax of Ruby.
3902
+
3903
+ [ ffi ] : tutorial-ffi.html
0 commit comments