본문 바로가기
리눅스

Debian Packaging using Arch Linux PKGBUILD files

by 다움위키 2025. 4. 9.

원문 보기: https://dawoum.duckdns.org/wiki/Debian/Debian_Packaging_using_Arch_Linux_PKGBUILD_files

 

데비안 저장소는 굉장히 큰 저장소를 가지고 있을지라도, 최근에 개발된 프로그램은 저장소에서 찾기 힘들 수 있습니다.

반면에, 아치 리눅스는 공식 저장소의 패키지는 데비안의 저장소와 비교해서 작을지라도, AUR(Arch User Repository)은 데비안 저정소에서 찾기 힘든 프로그램들도 패키지를 제공합니다.

저장소의 관리 정책은 배포판마다 다르지만, 사용자의 입장에서는 프로그램을 컴파일하는 과정이 쉽지 않을 수 있기 때문에 도움을 받을 정보가 필요합니다.

우선, 데비안 Salsa 는 개발자들의 공간이긴 해도 아직 공식 저장소에 들어오지 않은 패키지들의 정보를 얻을 수 있고, 여기에 패키징과 관련된 정보가 있으면, 이를 이용하는 것이 바람직합니다.

어쨌든, 데비안 Salsa에도 없는 패키지는 데비안 패키징 도구, dh_make 등을 통해 패키징을 시도할 수 있지만, 패키징에 실패하는 것들도 있습니다 (아니면 다른 도구가 있을지도 모르겠습니다).

한편, 데비안 패키징 도구를 사용하고도 실패하는 것들은 Building binary deb packages 방법을 통해 컴파일 후에 최소한의 정보를 갖는 control 파일만으로 패키징을 시도할 수 있습니다.

여기서도 문제가 발생하며, 주로 정보의 부족으로 컴파일 자체를 수행하기 어려운 것들입니다.

이 문제만 해결하면, Building binary deb packages를 통해 어떠한 프로그램도 데비안 패키지로 만들어서 관리할 수 있습니다.

Arch PKGBUILD

아치 패키징 파일 PKGBUILD는 데비안 패키징에 비해 만들기 쉽습니다.

비록 하나의 프로그램을 여러 개의 패키지로 분리할 수 있을지라도, 대체로 그냥 하나의 패키지로 구성할 수 있기 때문에, 라이브러리, 헤드 파일, 문서 등으로 패키지를 나눌 필요가 없기 때문입니다.

이런 편의성으로 인해, AUR에는 최신 프로그램의 PKGBUILD 파일이 거의 대부분 있습니다. 더구나, 상용 프로그램도 바이너리를 제공하지 않아도 되기 때문에, AUR에 PKGBUILD 파일이 존재합니다.

Debian packaging using PKGBUILD

사실, 관리를 편하기 위해 패키징을 시도하는데, 오히려 패키징 자체에 너무 시간을 소모하는 것은 바람직하지 않을 수 있습니다.

데비안 패키징 파일을 구할 수 없을 때에는, 앞에서도 언급했듯이, 아치의 PKGBUILD 파일에서 컴파일 방법을 알아내서 컴파일 후에 Building binary deb packages를 통해 데비안 패키지를 만들 수 있습니다.

이 과정은 몇 개의 명령으로 가능하긴 하지만, 이것마저 귀찮습니다!

이와 관련하여, 이미 makedeb와 같은 프로젝트가 진행되었지만, 크게 호응을 얻지 못했는지, 2023년 8월을 끝으로 더 이상 개발되지 않습니다 (더구나, 최근의 의존성 프로그램에서는 해당 프로그램이 컴파일 되지 않고, 이전 버전을 설치해서 컴파일할 수 있지만, 추천할 만한 방법은 아닙니다).

한편, 다른 도구로는 instantDEB라는 스크립트-기반 프로그램입니다. 이 도구도 2020년 11월을 마지막으로 더 이상 개발되지 않지만, 여전히 동작하는 PKGBUILD 파일이 있습니다.

using instantDEB

이전에 데비안 바이너리 패키징 방법의 순서는 다음과 같습니다:

  1. 소스 파일을 가져옵니다
  2. 컴파일을 해서 바이너리를 만듭니다
  3. 바이너리를 설치합니다
  4. control 파일을 만듭니다
  5. 패키지로 묶습니다

instantDEB 스크립트는 이를 자동으로 수행하지만, 패키징에 실패할 경우, 전체 과정을 지우고 새롭게 시작합니다.

이는 상당한 시간 낭비입니다!

보통, 패키지를 컴파일할 때, 데비안 패키징에서는 필요한 모든 의존성 패키지를 적어두기 때문에 자동으로 처리하지만, 일반적으로 컴파일 오류를 보고 라이브러리, 헤드 파일을 설치한 후에 다시 진행합니다.

즉, PKGBUILD에 makedeps가 있더라도 instantDEB에서 자동으로 처리해 주지 않기 때문에, 더구나 데비안 저장소에 해당 프로그램이 없을 수도 있기 때문에, 오류 메시지를 보고 대처하는 것이 바람직합니다.

따라서, 소스 파일을 가져온 디렉토리 자체를 지워버리는 것은 계속해서 네트워크 자원을 낭비하는 결과를 초래합니다.

이를 방지하기 위해, 주어진 build.sh 파일에서 수행하는 3개의 단계로 분해하는 것이 바람직해 보입니다.

  1. 소스 가져오기 (fetch.sh)
  2. 컴파일 하기 (compile.sh)
  3. 패키지 만들기 (package.sh)

fetch.sh

원본 파일에서 제공되지 않는 것들을 새롭게 추가해야 합니다.

  • 소스 파일이 여러 개 존재합니다.
  • git에서 branch 외에 tag로 지정된 것을 받을 수 있어야 합니다.
  • 소스 파일의 경로가 제공되지 않습니다.

원래 스크립트는 source에서만 찾기 때문에, source와 source_x86_64를 합칠 필요가 있습니다 :

sources+=( "${source[@]}" "${source_x86_64[@]}" )

원래 스크립트에서 git 소스로부터 branch에서 받는 것 외에 tag를 지정해서 받을 수 있어야 합니다:

            elif grep -q 'tag=.*$' <<<"$src"; then
                GITSOURCE="${GITSOURCE%\#*}"
                BRANCHNAME=$(grep -o 'tag=.*' <<<"$src" | grep -o '[^=]*$')

아치 서버에서 제공하는 파일은 경로가 제공되지 않고, 파일 이름만 제공됩니다. 배쉬를 잘 모르기 때문에, https, http, ftp가 있으면, 원래 스크립트로 동작하고, 없으면, 아치 서버에서 받도록 수정할 수 있습니다:

          SOURCENAME2=$(grep -o '^[^:]*' <<<"$src")
          echo "$SOURCENAME2"
          if [ "$SOURCENAME2" == "https" ] || [ "$SOURCENAME2" == "http" ] || [ "$SOURCENAME2" == "ftp" ]; then
            wget -O itempfile "$LINK"
          else
           wget -O itempfile "https://gitlab.archlinux.org/archlinux/packaging/packages/$pkgname/-/raw/main/$LINK?ref_type=heads&inline=false"
          fi

마찬가지로, AUR에서 받을 때에는 해당 스크립트를 다른 이름으로 복사한 후에, 그것을 실행합니다: (PKGBUILD를 어디서 가져오는지는 이미 알고 있기 때문에)

          SOURCENAME2=$(grep -o '^[^:]*' <<<"$src")
          echo "$SOURCENAME2"
          if [ "$SOURCENAME2" == "https" ] || [ "$SOURCENAME2" == "http" ] || [ "$SOURCENAME2" == "ftp" ]; then
            wget -O itempfile "$LINK"
          else
            wget -O itempfile "https://aur.archlinux.org/cgit/aur.git/plain/$LINK?h=$pkgname"
          fi

for 루프 마지막에 새로운 변수를 unset합니다.

    [ -n "$SOURCENAME2" ] && unset SOURCENAME2

compile.sh

원래 스크립트에서는 prepare, build, package 함수만 실행하기 때문에, 다른 함수가 있을 경우에 실행하도록 추가해야 합니다.

package.sh

원래 스크립트에서 제공하는 controlgen.sh 파일을 자신의 정보로 바꾸고, 쓸모없는 줄들은 지웁니다.

몇 개의 PKGBUILD 파일을 받아서 수행해 보니, 생각보다 잘 작동합니다!

Unexpected problem

데비안 저장소에 없는 패키지는 이 방법으로 더 이상 PKGBUILD 파일의 수정 없이 그리고 control의 수동 편집 없이 데비안 패키징이 가능합니다.

문제는 데비안 저장소에 있는 패키지를 컴파일 옵션 변경으로 새롭게 패키징을 만들고 싶을 경우에 발생합니다. 다행히, debian/rules 파일을 쉽게 이해할 수 있을 때에는 그것을 수정해서 패키징을 시도할 수 있지만, 불행하게도 이해할 수 없으면, 그런 방법으로 패키징을 시도할 수 없습니다.

즉, 위의 방법으로 컴파일까지는 쉽게 처리할 수 있지만, 각각의 패키지는 수동으로 바로잡아야 한다는 것입니다. 예를 들어, CachyOS에서 제공하는 pgo 관련된 패키지, lz4, xz-utils, zstd는 마지막 단계에서 별도의 패키지 처리 스크립트가 필요할 수 있습니다.