본문으로 건너뛰기

안동민 개발노트

본문 시작

릴리즈 프로필 설정

Cargo의 dev·release 프로필과 opt-level 같은 설정을 조정해 컴파일 속도·실행 성능·디버깅 정보의 균형을 선택합니다.

지금까지는 빌드, 실행, 코드 테스트 등 Cargo의 가장 기본적인 기능만 사용하였지만, Cargo는 훨씬 더 많은 일을 할 수 있습니다.

이번 장에서는 아래 목록의 기능을 수행하는 몇 가지 고급 기능들을 알아보도록 하겠습니다.

  • 릴리즈 프로필을 통한 빌드 커스터마이징하기
  • crates.io에 라이브러리 배포하기
  • 대규모 작업을 위한 작업공간(workspace) 구성하기
  • crates.io로부터 바이너리 설치하기
  • 커스텀 명령어로 Cargo 확장하기

Cargo는 이번 장에서 다루는 것보다 더 많은 일을 할 수 있으니, Cargo의 모든 기능에 대한 설명을 보고 싶다면 공식 문서를 참고하세요.

이제 Cargo 기능을 실전 흐름에서 어떻게 쓰는지 살펴보겠습니다.

러스트에서의 릴리즈 프로필(release profile) 이란 설정값을 가지고 있는 미리 정의된, 커스터마이징 가능한 프로필인데, 이 설정값으로 프로그래머는 코드 컴파일을 위한 다양한 옵션을 제어할 수 있습니다.

devrelease의 설정은 각각 덮어쓸 수 있습니다. Cargo에는 이 밖에도 dev를 상속하는 test, release를 상속하는 bench 프로필이 있으며, 사용자 정의 프로필은 어떤 프로필을 바탕으로 할지 inherits를 반드시 명시합니다.

Cargo는 두 개의 주요 프로필을 가지고 있습니다.

cargo build를 실행할 때 쓰는 dev 프로필과 cargo build --release를 실행할 때 쓰는 release 프로필이 바로 이 둘입니다.

dev 프로필은 개발에 적합한 기본값으로 정의되었고, release 프로필은 릴리즈 빌드용 설정을 기본값으로 가집니다.

이 프로필 이름이 빌드 출력에 나와서 익숙할 수도 있습니다.

$ cargo build
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.00s
$ cargo build --release
    Finished `release` profile [optimized] target(s) in 0.32s

여기에서의 devrelease가 바로 컴파일러에 의해 사용된 이 두 개의 프로필입니다.

Cargo에는 프로젝트의 Cargo.toml 파일에 [profile.*] 섹션을 명시적으로 추가하지 않았을 경우 적용되는 각 프로필의 기본 설정이 있습니다.

워크스페이스에서는 루트 Cargo.toml의 프로필 설정만 적용되며, 의존성에 적힌 프로필 설정은 무시됩니다.

커스터마이징을 원하는 프로필에 대해 [profile.*] 섹션을 추가하면 이 기본 설정을 덮어씌울 수 있습니다.

여기 예시로 opt-level 설정에 대한 devrelease 프로필의 기본 설정값을 보여드리겠습니다.

Cargo.toml
[profile.dev]
opt-level = 0

[profile.release]
opt-level = 3
Cargo dev와 release 및 사용자 정의 프로필의 선택 방식, 상속 또는 주요 기본값, 용도를 비교한 표
Cargo.toml에서 덮어쓰지 않았을 때의 기본 프로필 설정
프로필 선택 방식 주요 기본값 기본 목적
dev cargo build, cargo run, cargo check, cargo rustc opt-level = 0, debug = true 일반 개발과 디버깅
release --release 또는 --profile=release opt-level = 3, debug = false 릴리스·프로덕션용 최적화 산출물
사용자 정의 --profile=NAME inherits 필수, 필요한 키만 덮어쓰기 LTO·디버그·성능 비교처럼 이름 있는 별도 빌드 흐름
dev
선택 cargo build, cargo run, cargo check, cargo rustc
기본값 opt-level = 0, debug = true
목적 일반 개발과 디버깅
release
선택 --release 또는 --profile=release
기본값 opt-level = 3, debug = false
목적 릴리스·프로덕션용 최적화 산출물
사용자 정의 프로필
선택 --profile=NAME
설정 inherits를 명시하고 필요한 키만 덮어쓴다.
목적 LTO나 디버그 설정을 분리해 측정한다.
cargo testdev를 상속하는 test, cargo benchrelease를 상속하는 bench 프로필을 기본으로 사용한다. 커스텀 프로필은 --profile=NAME으로 선택할 수 있다.

예를 들어 릴리스 기본값을 물려받고 thin LTO만 켜는 별도 측정용 프로필은 다음처럼 정의합니다.

Cargo.toml
[profile.release-lto]
inherits = "release"
lto = "thin"

이 프로필은 cargo build --profile release-lto로 선택합니다. 이름이 다른 프로필은 별도 target 하위 디렉터리에 출력되므로 일반 release 결과와 나란히 비교할 수 있습니다.

opt-level 설정은 러스트가 코드에 적용할 최적화 수준입니다. 0에서 3까지의 숫자와 바이너리 크기를 최적화하는 "s", "z"를 사용할 수 있습니다.

더 높은 최적화 수준은 컴파일 시간을 늘리는 대신 더 빠른 코드를 만들 수 있지만, 항상 더 빠른 결과를 보장하지는 않습니다. 개발 중 코드를 자주 컴파일하는 상황이라면 코드의 실행 속도가 조금 느려지더라도 컴파일이 빨리 되도록 덜 최적화하길 원할 것입니다.

따라서 devopt-level 기본값은 0 으로 되어 있습니다.

릴리즈 모드는 컴파일 시간보다 실행 성능을 우선하는 기본 설정을 사용합니다.

release 프로필의 opt-level 기본값이 3으로 되어 있는 이유는 이 때문입니다.

Cargo.toml에 기본 설정과 다른 값을 넣어서 기본 설정을 덮어씌울 수 있습니다.

예를 들어 개발용 프로필에 최적화 단계 1을 사용하고 싶다면, 프로젝트의 Cargo.toml에 아래의 두 줄을 추가하면 됩니다.

Cargo.toml
[profile.dev]
opt-level = 1

프로필을 바꿀 때는 어떤 빌드 루프를 빠르게 만들고 싶은지 먼저 정한 뒤, 바꾼 값이 실제로 컴파일 시간과 실행 시간에 어떤 차이를 내는지 확인하는 순서로 접근하면 좋습니다.

이 코드는 기본 설정인 0을 덮어씌웁니다.

이제부터 cargo build를 실행할 때는 Cargo가 dev 프로필의 기본값과 커스터마이징된 opt-level을 사용하게 될 것입니다.

opt-level1로 설정했으므로 Cargo는 릴리즈 빌드만큼은 아니지만 기본값보다 많은 최적화를 적용할 것입니다.

각 프로필의 설정 옵션 및 기본값의 전체 목록을 보시려면 Cargo 공식 문서를 참고해 주시기 바랍니다.