원문 보기: https://dawoum.duckdns.org/wiki/Building_Debian_Packages_with_Cargo
데비안에서 기본 데스크탑으로 제공하고 있는 그놈에서, 새롭게 개발되는 프로그램 중에 일부는 Meson을 사용하는 경우가 있고, Building Debian Packages with Meson을 통해 쉽게 패키지를 만들 수 있습니다.
또 하나는 러스트 언어의 인기로 cargo로 컴파일되는 프로그램들이 꽤 많아졌습니다.
이 기사는 cargo로 만들어지는 바이너리를 deb 패키지로 만드는 과정을 소개합니다.
실제로는 이미 이런 과정을 자동으로 처리해 주는 cargo 패키지가 존재하기 때문에, cargo-deb 바이너리 패키지를 설치하고 cargo-deb를 이용해서 자신을 deb 패키지로 만드는 과정을 소개합니다.
이렇게 하는 이유는 단지 관리의 편의를 위해서 입니다.
먼저, 2024년 8월 말 기준, 시스템 러스트의 버전이 1.71+를 요구하기 때문에, 시스템 설치된 러스트 버전이 낮을 때에는 Rust (programming language) 기사로 가셔서 rustup을 이용해서 버전 업그레이드를 먼저 하십시오.
그런-다음 cargo-deb 패키지를 설치합니다:
- cargo install cargo-deb
이제 cargo-deb 패키지 자체를 데비안 패키지로 만들기 위해 ~/.cargo/bin 디렉토리를 PATH 변수에 넣습니다. 예를 들어, Bash (Unix shell)를 사용하고 있다면 .bashrc 파일에 Z shell을 사용하고 있다면 .zshrc 파일에서 추가합니다. 그런-다음
- source ~/.bashrc (또는 .zshrc)
- echo $PATH
이제 소스를 가져옵니다:
- git clone https://github.com/kornelski/cargo-deb
- cd cargo-deb
- cargo deb
- sudo dpkg -i target/debian/cargo-deb_2.6.1-1_amd64.deb
이제 준비가 되었습니다.
다른 패키지도 잘 만들어지는지 확인하기 위해 hyprland에서 배경화면 바꾸는 데 사용되는 swww를 패키지로 만들어 보겠습니다. 패키지를 만들기 전에 전체를 먼저 컴파일합니다.
- git clone https://github.com/LGFae/swww
- cd swww
- cargo build --release --locked --all-features
- cargo deb
여러 패키지를 하나의 패키지를 만들 수 없고, -p 옵션과 함께, 가능한 패키지의 목록: common, swww, swww-daemon이 나타납니다.
- cargo deb -p common
경고 메시지가 출력되며, 아마도 더미 패키지로 보이고 수행할 필요가 없습니다.
- cargo deb -p swww
- cargo deb -p swww-daemon
단일 패키지에는 바이너리 파일을 제외하고 다른 파일이 존재하지 않습니다. 즉, 이제 데비안의 구조를 갖는 파일들을 패키지에 포함되도록 toml 파일을 수정해야 합니다.
여러 개의 workspace가 있을 때, 어차피 패키지 목록은 개별적으로 만들 것이기 때문에, cargo-deb가 수행되는 곳, swww, swww-daemon에서 목록을 만들 수 있습니다.
Package list
여기서는 client 디렉토리 안에 Cargo.toml을 보면, 이것이 swww 바이너리를 만드는 것을 알 수 있습니다.
그리고, 필요한 man 파일을 먼저 생성합니다:
- doc/gen.sh
이제 목록을 만듭니다:
- gedit client/Cargo.toml
[package.metadata.deb]
name = "swww"
maintainer = "Leonardo Gibrowski Faé"
copyright = "Leonardo Gibrowski Faé <leonardo.fae44@gmail.com>"
extended-description = """\
Efficient animated wallpaper daemon for \
wayland, controlled at runtime."""
depends = "$auto"
section = "utility"
priority = "optional"
assets = [
["target/release/swww", "usr/bin/", "755"],
["target/release/swww-daemon", "usr/bin/", "755"],
["../LICENSE", "usr/share/doc/swww/LICENSE", "644"],
["../README.md", "usr/share/doc/swww/README", "644"],
["../CHANGELOG.md", "usr/share/doc/swww/CHANGELOG", "644"],
["../completions/swww.bash", "usr/share/bash-completion/completions/swww", "644"],
["../completions/swww.fish", "usr/share/fish/vendor_completions.d/swww.fish", "644"],
["../completions/_swww", "usr/share/zsh/site-functions/_swww", "644"],
["../completions/swww.elv", "usr/share/elvish/lib/swww.elv", "644"],
["../doc/generated/swww-clear-cache.1", "usr/share/man/man1/swww-clear-cache.1", "644"],
["../doc/generated/swww-clear.1", "usr/share/man/man1/swww-clear.1", "644"],
["../doc/generated/swww-daemon.1", "usr/share/man/man1/swww-daemon.1", "644"],
["../doc/generated/swww-img.1", "usr/share/man/man1/swww-img.1", "644"],
["../doc/generated/swww-kill.1", "usr/share/man/man1/swww-kill.1", "644"],
["../doc/generated/swww-query.1", "usr/share/man/man1/swww-query.1", "644"],
["../doc/generated/swww-restore.1", "usr/share/man/man1/swww-restore.1", "644"],
]
기본 target 디렉토리를 제외하고, 현재 Cargo.toml 파일에서 상대 경로로 파일을 탐색합니다.
그런-다음 deb 패키지를 만듭니다:
- cargo deb --manifest-path client/Cargo.toml --no-build --deb-version 2.9.5-2
이제 설치합니다:
- sudo dpkg -i target/debian/swww_2.9.5-2_amd64.deb
- dpkg -L swww
파일 목록이 원하는 것과 같은지 확인을 합니다.
Troubleshootings
man 파일
자동으로 압축을 진행하기 때문에, 파일을 완전하게 그 이름으로 복사해야 합니다. 그렇지 않으면, man.1.gz으로 파일이 만들어집니다.
See also
External Resources