본문 바로가기

릴리즈 프로필 설정

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

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

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

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

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

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

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

dev와 release의 설정은 각각 덮어쓸 수 있습니다. 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

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

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

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

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

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

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

[profile.release]
opt-level = 3

RUST · PROFILE SELECTION

프로필은 빌드 설정을 고르고, 성능은 측정으로 확인한다

아래는 Cargo.toml·설정에서 덮어쓰기 전의 주요 기본값입니다. 본문의 dev 최적화 변경과 release-lto 상속도 같은 선택 규칙을 따릅니다.

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나 디버그 설정을 분리해 측정한다.

본문의 dev 변경

[profile.dev]
opt-level = 1

cargo build에 적용됩니다. 기본 0을 이 키 하나만 1로 바꿉니다.

본문의 사용자 정의 프로필

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

cargo build --profile release-lto로 선택합니다. release 기본값을 상속하고 LTO만 변경합니다.

test는 dev, bench는 release를 상속합니다. workspace의 profile 설정은 루트 manifest에서 정합니다. 높은 opt-level이 항상 더 빠르거나 더 작지는 않으므로 실제 빌드·실행 결과를 비교합니다.

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

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

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

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

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

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

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

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

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

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

이미 앞의 [profile.dev] 표를 넣었다면 같은 표를 두 번 선언하지 말고, 그 안의 opt-level = 0을 1로 바꿉니다. 이 예제에서는 Cargo 설정 파일이나 환경 변수의 별도 덮어쓰기가 없다고 가정합니다. 실제 설정에는 그런 입력도 영향을 줄 수 있으므로 manifest 하나만 보고 모든 빌드의 유효 값을 단정하지 않습니다.

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

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

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

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

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

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

스스로 선택하기

루트 manifest에서 dev의 opt-level만 1로 바꾸고 release-lto는 위 정의 그대로 둡니다. 다른 프로필 덮어쓰기는 없습니다. cargo build, cargo build --release, cargo test, cargo build --profile release-lto가 고르는 프로필과 최적화 수준을 각각 적으세요. 마지막 빌드에서 thin LTO를 켰다는 사실만으로 가장 짧은 실행 시간을 보장할 수 있나요?

설정과 판단 확인

차례로 dev·1, release·3, test·1, release-lto·3입니다. test는 이 조건에서 dev를, 사용자 정의 프로필은 release를 상속합니다. 마지막에는 상속한 설정에 lto = "thin"을 덮습니다. 이는 컴파일 설정의 선택이지 측정 결과가 아니므로, 입력과 타깃을 맞추어 실행 시간·컴파일 시간·결과의 정확성을 비교해야 합니다.