Red Hat Training

A Red Hat training course is available for RHEL 8

4.5. SPEC 파일 작업

새 소프트웨어를 패키지하려면 SPEC 파일을 생성해야 합니다.

다음과 같은 방법으로 SPEC 파일을 생성할 수 있습니다.

  • 새 SPEC 파일을 처음부터 수동으로 작성합니다.
  • rpmdev-newspec 유틸리티를 사용합니다.

    이 유틸리티는 필요한 지시문 및 필드를 채우는 채워지지 않은 SPEC 파일을 생성합니다.

참고

일부 프로그래밍 중심 텍스트 편집기는 새 . spec 파일을 자체 SPEC 템플릿으로 미리 채웁니다. rpmdev-newspec 유틸리티는 편집기와 무관한 방법을 제공합니다.

다음 섹션에서는 Hello World! 프로그램의 세 가지 예제 구현을 사용합니다.

소프트웨어 이름

예제 설명

somethingamo

원시 해석된 프로그래밍 언어로 작성된 프로그램입니다. 소스 코드를 빌드할 필요가 없으며 설치할 필요가 있는 경우를 보여줍니다. 미리 컴파일된 바이너리를 패키징해야 하는 경우 바이너리도 파일이므로 이 방법을 사용할 수도 있습니다.

pello

바이트로 컴파일된 해석된 프로그래밍 언어로 작성된 프로그램입니다. 소스 코드를 바이트로 컴파일하고 바이트 코드를 설치하여 미리 최적화된 파일을 보여줍니다.

cello

기본적으로 컴파일된 프로그래밍 언어로 작성된 프로그램입니다. 소스 코드를 머신 코드로 컴파일하고 결과 실행 파일을 설치하는 일반적인 프로세스를 보여줍니다.

Hello World 의 구현은 다음과 같습니다.

전제 조건으로 이러한 구현을 ~/rpmbuild/SOURCES 디렉토리에 배치해야 합니다.

Hello World! 프로그램 구현에 대한 자세한 내용은 소스 코드 의 내용을 참조하십시오.

다음 섹션에서는 SPEC 파일을 사용하는 방법을 알아봅니다.

4.5.1. rpmdev-newspec을 사용하여 새 SPEC 파일 만들기

rpmdev-newspec 유틸리티를 사용하여 Hello World! 프로그램의 세 가지 구현 각각에 대해 SPEC 파일을 만들려면 다음 단계를 완료하십시오.

절차

  1. ~/rpmbuild/SPECS 디렉터리로 이동하여 rpmdev-newspec 유틸리티를 사용합니다.

    $ cd ~/rpmbuild/SPECS
  2. Hello World의 세 가지 구현 각각에 대한 SPEC 파일을 만듭니다! rpmdev-newspec 유틸리티를 사용하여 프로그램:

    $ rpmdev-newspec bello
    bello.spec created; type minimal, rpm version >= 4.11.
    
    $ rpmdev-newspec cello
    cello.spec created; type minimal, rpm version >= 4.11.
    
    $ rpmdev-newspec pello
    pello.spec created; type minimal, rpm version >= 4.11.

    ~/rpmbuild/SPECS/ 디렉터리에는 이제 bello.spec,cello.specpello.spec 이라는 세 개의 SPEC 파일이 있습니다.

  3. 생성된 파일을 검사합니다.

    파일의 지시문은 What is a SPEC file.에 설명된 내용을 나타냅니다. 다음 섹션에서는 rpmdev-newspec 의 출력 파일에 특정 섹션을 채웁니다.

참고

rpmdev-newspec 유틸리티는 특정 Linux 배포판과 관련된 지침이나 규칙을 사용하지 않습니다. 그러나 이 문서는 Red Hat Enterprise Linux를 대상으로 하므로 SPEC 파일 전체에서 정의되거나 제공된 다른 모든 매크로와 일관성을 위해 RPM의 Buildroot를 참조할 때 %{buildroot} 표기법이 우선합니다.

4.5.2. RPM을 생성하기 위해 원래 SPEC 파일 수정

RPM 패키지 생성을 위해 rpmdev-newspec 유틸리티에서 제공하는 SPEC 파일을 수정하려면 다음 단계를 완료하십시오.

사전 요구 사항

  • 특정 프로그램의 소스 코드는 ~/rpmbuild/SOURCES/ 디렉토리에 배치되었습니다.
  • rpmdev-newspec 유틸리티에 의해 채워지지 않은 ~/rpmbuild/SPECS/<name>.spec SPEC 파일이 생성되었습니다.

절차

  1. rpmdev-newspec 유틸리티에서 제공하는 ~/rpmbuild/SPECS/<name>.spec 파일의 출력 템플릿을 엽니다.

    1. rpmdev-newspec 이 함께 그룹화된 다음 지시문을 포함하는 SPEC 파일의 첫 번째 섹션을 채웁니다.

      이름
      Namerpmdev-newspec 에 대한 인수로 이미 지정되었습니다.
      버전
      소스 코드의 업스트림 릴리스 버전과 일치하도록 버전 을 설정합니다.
      릴리스 버전
      릴리스 가 자동으로 1%{?dist} 로 설정되어 있으며 이는 처음 1 입니다. 예를 들어 패치를 포함하는 경우 업스트림 릴리스 버전이 변경되지 않고 패키지를 업데이트할 때마다 초기 값을 늘립니다. 새 업스트림 릴리스 가 발생하면 릴리스를 1 로 재설정합니다.
      요약
      요약 은 이 소프트웨어가 무엇인지에 대한 간단한 한 줄 설명입니다.
    2. 라이센스,URLSource0 지시문을 채웁니다.

      라이센스

      라이센스 필드는 업스트림 릴리스의 소스 코드와 관련된 소프트웨어 라이센스입니다. SPEC 파일의 라이센스 레이블을 지정하는 방법에 대한 정확한 형식은 다음 RPM 기반 Linux 배포 지침에 따라 다릅니다.

      예를 들어, RuntimeClassv 3+를 사용할 수 있습니다.

      URL
      URL 필드는 업스트림 소프트웨어 웹 사이트에 URL을 제공합니다. 일관성을 위해 %{name} 의 RPM 매크로 변수를 사용하고 https://example.com/%{name} 을 사용합니다.
      소스
      Source0 필드는 업스트림 소프트웨어 소스 코드에 URL을 제공합니다. 패키지화 중인 특정 버전의 소프트웨어에 직접 연결해야 합니다. 이 문서에 제공된 예제 URL에는 향후 변경될 수 있는 하드 코딩된 값이 포함되어 있습니다. 마찬가지로 릴리스 버전도 변경될 수 있습니다. 잠재적인 변경 사항을 단순화하려면 %{name}%{version} 매크로를 사용합니다. 이를 사용하여 SPEC 파일에서 하나의 필드만 업데이트해야 합니다.
    3. BuildRequires,RequiresBuildArch 지시문을 채웁니다.

      BuildRequires
      BuildRequires 는 패키지에 대한 빌드 타임 종속성을 지정합니다.
      필수 항목
      패키지에 대한 런타임 종속 항목을 지정합니다.
      BuildArch
      이는 기본적으로 컴파일된 확장 기능 없이 해석된 프로그래밍 언어로 작성된 소프트웨어입니다. 따라서 noarch 값을 사용하여 BuildArch 지시문을 추가합니다. 이는 이 패키지가 빌드된 프로세서 아키텍처에 바인딩되지 않아도 된다고 RPM에 지시합니다.
    4. %description,%prep,%build,%install,%files, %license 지시문을 채웁니다. 이러한 지시문은 여러 줄, 다중 설명 또는 스크립팅된 작업을 수행할 수 있는 지시문이므로 섹션 제목으로 생각할 수 있습니다.

      %Description
      %description요약 보다 소프트웨어에 대한 더 긴 전체 설명입니다. 이 지시문에는 하나 이상의 단락이 포함되어 있습니다.
      %Prep
      %prep 섹션에서는 빌드 환경을 준비하는 방법을 지정합니다. 일반적으로 소스 코드의 압축 아카이브, 패치 적용 및, SPEC 파일의 이후 부분에서 사용하기 위해 소스 코드에 제공된 정보 구문 분석과 관련이 있습니다. 이 섹션에서는 내장 %setup -q 매크로를 사용할 수 있습니다.
      %build
      %build 섹션은 소프트웨어를 빌드하는 방법을 지정합니다.
      %install

      %install 섹션에는 BUILDROOT 디렉터리에 소프트웨어 설치 방법에 대한 지침이 포함되어 있습니다.

      이 디렉터리는 최종 사용자의 root 디렉터리와 유사한 빈 chroot 기본 디렉터리입니다. 여기에서 설치된 파일을 포함할 디렉토리를 만들 수 있습니다. 이러한 디렉터리를 생성하려면 경로를 하드 코딩하지 않고도 RPM 매크로를 사용할 수 있습니다.

      %files

      %files 섹션은 이 RPM에서 제공하는 파일 목록과 최종 사용자의 시스템에서 전체 경로 위치를 지정합니다.

      이 섹션에서는 내장 매크로를 사용하여 다양한 파일의 역할을 나타낼 수 있습니다. rpm 명령을 사용하여 패키지 파일 매니페스트 메타데이터를 쿼리하는 데 유용합니다. 예를 들어 LICENSE 파일이 소프트웨어 라이센스 파일임을 나타내기 위해 %license 매크로를 사용합니다.

    5. 마지막 섹션인 %changelog 는 패키지의 각 버전-Release에 대해 오염된 날짜 목록입니다. 소프트웨어 변경 사항이 아닌 패키징 변경 사항을 기록합니다. 패키징 변경의 예: %build 섹션에서 패치 추가, 빌드 절차를 변경합니다.

      * 문자가 있는 %changelog 섹션의 첫 번째 줄을 시작하고 그 뒤에 Day-of-Week Day Name Surname <email> - Version-Release 를 시작합니다.

      실제 변경 항목은 다음 규칙을 따릅니다.

      • 각 변경 항목에는 각 변경 사항에 대해 하나씩 여러 항목이 포함될 수 있습니다.
      • 각 항목은 새 줄에서 시작됩니다.
      • 각 항목은 - 문자로 시작합니다.

이제 필요한 프로그램에 대한 전체 SPEC 파일을 작성했습니다.

4.5.3. bash로 작성된 프로그램의 SPEC 파일 예제

참조를 위해 bash로 작성된 벨로 프로그램에 다음 예제 SPEC 파일을 사용할 수 있습니다.

bash로 작성된 bello 프로그램의 SPEC 파일 예제

Name:           bello
Version:        0.1
Release:        1%{?dist}
Summary:        Hello World example implemented in bash script

License:        GPLv3+
URL:            https://www.example.com/%{name}
Source0:        https://www.example.com/%{name}/releases/%{name}-%{version}.tar.gz

Requires:       bash

BuildArch:      noarch

%description
The long-tail description for our Hello World Example implemented in
bash script.

%prep
%setup -q

%build

%install

mkdir -p %{buildroot}/%{_bindir}

install -m 0755 %{name} %{buildroot}/%{_bindir}/%{name}

%files
%license LICENSE
%{_bindir}/%{name}

%changelog
* Tue May 31 2016 Adam Miller <maxamillion@fedoraproject.org> - 0.1-1
- First bello package
- Example second item in the changelog for version-release 0.1-1

  • 패키지에 대한 빌드 시간 종속성을 지정하는 BuildRequires 지시문이 bello 빌드 단계가 없기 때문에 삭제되었습니다. Bash는 원시 해석된 프로그래밍 언어이며 파일은 시스템의 위치에만 설치됩니다.
  • bello 스크립트에는 bash 쉘 환경만 필요하므로 패키지에 대한 런타임 종속성을 지정하는 Requires 지시문은 bash 만 포함합니다.
  • 소프트웨어 빌드 방법을 지정하는 %build 섹션은 bash 를 빌드할 필요가 없으므로 비어 있습니다.
참고

bello 를 설치하려면 대상 디렉터리를 만들고 실행 가능한 bash 스크립트 파일만 설치해야 합니다. 따라서 %install 섹션에서 install 명령을 사용할 수 있습니다. RPM 매크로를 사용하여 하드 코딩 경로 없이 이 작업을 수행할 수 있습니다.

추가 리소스

4.5.4. Python으로 작성된 프로그램의 SPEC 파일 예제

참조용으로 Python 프로그래밍 언어로 작성된 pello 프로그램에 다음 예제 SPEC 파일을 사용할 수 있습니다.

Python으로 작성된 pello 프로그램의 SPEC 파일 예제

Name:           pello
Version:        0.1.1
Release:        1%{?dist}
Summary:        Hello World example implemented in Python

License:        GPLv3+
URL:            https://www.example.com/%{name}
Source0:        https://www.example.com/%{name}/releases/%{name}-%{version}.tar.gz

BuildRequires:  python
Requires:       python
Requires:       bash

BuildArch:      noarch

%description
The long-tail description for our Hello World Example implemented in Python.

%prep
%setup -q

%build

python -m compileall %{name}.py

%install

mkdir -p %{buildroot}/%{_bindir}
mkdir -p %{buildroot}/usr/lib/%{name}

cat > %{buildroot}/%{_bindir}/%{name} <<EOF
#!/bin/bash
/usr/bin/python /usr/lib/%{name}/%{name}.pyc
EOF

chmod 0755 %{buildroot}/%{_bindir}/%{name}

install -m 0644 %{name}.py* %{buildroot}/usr/lib/%{name}/

%files
%license LICENSE
%dir /usr/lib/%{name}/
%{_bindir}/%{name}
/usr/lib/%{name}/%{name}.py*

%changelog
* Tue May 31 2016 Adam Miller <maxamillion@fedoraproject.org> - 0.1.1-1
  - First pello package

중요

pello 프로그램은 바이트로 컴파일된 해석된 언어로 작성됩니다. 따라서 결과 파일에 항목이 포함되어 있지 않기 때문에 shebang은 적용되지 않습니다.

shebang이 적용되지 않기 때문에 다음 방법 중 하나를 적용해야 할 수 있습니다.

  • 실행 파일을 호출할 바이트가 아닌 쉘 스크립트를 만듭니다.
  • 바이트가 아닌 Python 코드의 작은 비트를 프로그램 실행의 진입점으로 제공합니다.

이러한 접근 방식은 특히 코드 수천 개가 있는 대규모 소프트웨어 프로젝트에 유용합니다. 이 경우 사전 바이트로 컴파일된 코드의 성능 증가의 크기를 조정할 수 있습니다.

  • 패키지의 런타임 종속 항목을 지정하는 Requires 지시문에는 다음 두 가지 패키지가 포함되어 있습니다.

    • python 패키지는 런타임 시 바이트- compiled 코드를 실행하는 데 필요합니다.
    • 작은 진입점 스크립트를 실행하려면 bash 패키지가 필요합니다.
  • 패키지의 빌드 시간 종속성을 지정하는 BuildRequires 지시문에는 python 패키지만 포함됩니다. pello 프로그램은 바이트-compile 빌드 프로세스를 수행하기 위해 python 패키지가 필요합니다.
  • 소프트웨어를 빌드하는 방법을 지정하는 %build 섹션은 소프트웨어가 바이트- compiled라는 사실과 일치합니다.

pello 를 설치하려면 shebang이 바이트로 컴파일된 언어로는 적용되지 않기 때문에 래퍼 스크립트를 만들어야 합니다. 다음 방법 중 하나를 사용하여 이 스크립트를 생성할 수 있습니다.

  • 별도의 스크립트를 만들고 별도의 SourceX 지시문으로 사용합니다.
  • SPEC 파일에 파일을 인라인으로 만듭니다.

이 예제에서는 SPEC 파일 자체를 스크립팅할 수 있음을 증명하기 위해 SPEC 파일에 래퍼 스크립트를 작성하는 방법을 보여줍니다. 이 래퍼 스크립트는 이 문서를 사용하여 Python 바이트로 컴파일된 코드를 실행합니다.

이 예제의 %install 섹션은 액세스할 수 있도록 시스템의 라이브러리 디렉터리에 바이트- compiled 파일을 설치해야 한다는 점에도 해당합니다.

추가 리소스

4.5.5. C로 작성된 프로그램의 SPEC 파일 예제

참조용으로 C 프로그래밍 언어로 작성된 셀 프로그램에 대해 다음 예제 SPEC 파일을 사용할 수 있습니다.

C로 작성된 셀오 프로그램의 SPEC 파일 예제

Name:           cello
Version:        1.0
Release:        1%{?dist}
Summary:        Hello World example implemented in C

License:        GPLv3+
URL:            https://www.example.com/%{name}
Source0:        https://www.example.com/%{name}/releases/%{name}-%{version}.tar.gz

Patch0:         cello-output-first-patch.patch

BuildRequires:  gcc
BuildRequires:  make

%description
The long-tail description for our Hello World Example implemented in
C.

%prep
%setup -q

%patch0

%build
make %{?_smp_mflags}

%install
%make_install

%files
%license LICENSE
%{_bindir}/%{name}

%changelog
* Tue May 31 2016 Adam Miller <maxamillion@fedoraproject.org> - 1.0-1
- First cello package

  • 패키지에 대한 빌드 시간 종속성을 지정하는 BuildRequires 지시문에는 컴파일 빌드 프로세스를 수행하는 데 필요한 두 개의 패키지가 포함되어 있습니다.

    • gcc 패키지
    • make 패키지
  • 패키지에 대한 런타임 종속성을 지정하는 Requires 지시문은 이 예에서 생략됩니다. 모든 런타임 요구 사항은 rpmbuild 에 의해 처리되며 cello 프로그램에는 코어 C 표준 라이브러리 외부에 아무것도 필요하지 않습니다.
  • %build 섹션은 이 예제에서 cello 프로그램에 대한 Makefile 이 작성되었으므로 rpmdev-newspec 유틸리티에서 제공하는 GNU make 명령을 사용할 수 있다는 사실을 반영합니다. 그러나 구성 스크립트를 제공하지 않았기 때문에 %configure 호출을 제거해야 합니다.

rpmdev-newspec 명령에서 제공하는 %make_install 매크로를 사용하여 cello 프로그램을 설치할 수 있습니다. 이는 셀러 프로그램에 대한 Makefile 이 사용 가능하기 때문에 가능합니다.

추가 리소스