Crate는 러스트 컴파일러에 의해 컴파일되는 하나의 원자적인 단위이다.
cargo new mylib --lib 라고 명령을 날리면 하나의 라이브러리 Crate가 생성된다. 기본적으로 src/lib.rs 파일이 라이브러리 Crate이다.
vagrant@master:~/samples/mylib$ cargo build
Compiling mylib v0.1.0 (/home/vagrant/samples/mylib)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.08s
vagrant@master:~/samples/mylib$ tree
.
├── Cargo.lock
├── Cargo.toml
├── src
│ └── lib.rs
├── target
│ ├── CACHEDIR.TAG
│ └── debug
│ ├── build
│ ├── deps
│ │ ├── libmylib-c1c6b76f9e8c0f00.rlib
│ │ ├── libmylib-c1c6b76f9e8c0f00.rmeta
│ │ └── mylib-c1c6b76f9e8c0f00.d
│ ├── examples
│ ├── incremental
│ │ └── mylib-1whsyu8f8bwb9
│ │ ├── s-h39br4isny-0kzqo7j-a093hbvjpvmnkr3052zdglxc8
│ │ │ ├── cok1kemyn5jdgnpyb5w2ca14h.o
│ │ │ ├── dep-graph.bin
│ │ │ ├── query-cache.bin
│ │ │ └── work-products.bin
│ │ └── s-h39br4isny-0kzqo7j.lock
│ ├── libmylib.d
│ └── libmylib.rlib
└── tests
└── mytest.rs
cargo new myapp --bin 은 하나의 애플리케이션(바이너리)를 생성한다. 기본적으로 src/main.rs 파일이 바이너리 크레이트 이다.
vagrant@master:~/samples$ cargo new myapp
Creating binary (application) `myapp` package
note: see more `Cargo.toml` keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
vagrant@master:~/samples$ cd myapp
vagrant@master:~/samples/myapp$ cargo build
Compiling myapp v0.1.0 (/home/vagrant/samples/myapp)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.15s
vagrant@master:~/samples/myapp$ tree
.
├── Cargo.lock
├── Cargo.toml
├── src
│ └── main.rs
└── target
├── CACHEDIR.TAG
└── debug
├── build
├── deps
│ ├── myapp-d3de11b04e7e24db
│ └── myapp-d3de11b04e7e24db.d
├── examples
├── incremental
│ └── myapp-1cw6iyvmdbnom
│ ├── s-h39bw62zrx-0hlw41u-8m2ooriqjeevcac7ztsje679v
│ │ ├── 1bk5xml1c0lahuh3f2mzrntrd.o
│ │ ├── 4nswv1h0p6zbfqip62bqyoq0e.o
│ │ ├── 96zy18jd53kfbst9vkygl63ky.o
│ │ ├── aku6fhczaf9wy532qman52e6g.o
│ │ ├── awqc18yictgz0zuy73tuiv1tj.o
│ │ ├── dep-graph.bin
│ │ ├── erjta0ouvi4wbb6xw6m9snb24.o
│ │ ├── query-cache.bin
│ │ └── work-products.bin
│ └── s-h39bw62zrx-0hlw41u.lock
├── myapp
└── myapp.d
9 directories, 18 files
러스트 라이브러리로 의존성 컴파일 코드를 포함한다. dll 파일과 다른 포맷이다. 만약 동적 dll형태로 컴파일 결과를 가지고 싶다면 Cargo.toml에 아래와 같이 설정한 후 build 한다. 이 경우 libmylib.so 파일이 함께 생성된다.
[package]
name = "mylib"
version = "0.1.0"
edition = "2021"
[lib]
crate-type = ["cdylib"]
[dependencies]
정적 dll 도 생성가능하다. 이 경우 아래처럼 설정한 후 build 한다. 생성 파일은 libmylib.a 가 된다.
[lib]
crate-type = ["staticlib"]
myapp.d는 MakeFile 호환 의존 목록이다.
vagrant@master:~/samples/myapp$ cat target/debug/myapp.d
/home/vagrant/samples/myapp/target/debug/myapp: /home/vagrant/samples/myapp/src/main.rs
myapp은 최종 애플리케이션이다. 릴리즈 모드로 빌드했을 때와 파일 크기를 비교해 보면 무려 9배의 차이가 난다. 배포 시 최적화 모드인 release 빌드를 꼭 진행해야 한다. (cargo build --release)
vagrant@master:~/samples$ du -sh myapp/target/release/myapp
412K myapp/target/release/myapp
vagrant@master:~/samples$ du -sh myapp/target/debug/myapp
3.7M myapp/target/debug/myapp
컴파일된 의존성 파일들
examples 폴더 내에서 실행된 코드 결과물로 cargo test 수행 시 컴파일된다. cargo run --example main 형태로 실행 가능하다.
중복 컴파일을 제거하여 빌드 속도를 높이기 위해 캐싱하는 파일들이다.
build 를 위한 scratch space 로 사용한다. scratch space는 사용자를 위한 임시 저장 영역이다.