3.2. SPEC 파일 작업
이 섹션에서는 SPEC 파일을 만들고 수정하는 방법에 대해 설명합니다.
사전 요구 사항
이 섹션에서는 2.1.1절. “소스 코드 예” 에 설명된 Hello World!
프로그램의 세 가지 예제 구현을 사용합니다.
각 프로그램은 아래 표에 설명되어 있습니다.
소프트웨어 이름 | 예를 들어 설명 |
Bello | 원시 해석 프로그래밍 언어로 작성된 프로그램입니다. 소스 코드를 빌드할 필요가 없는 경우를 나타내지만 설치만 하면 됩니다. pre-ECDHE 바이너리를 패키징해야 하는 경우 바이너리도 파일이므로 이 방법을 사용할 수도 있습니다. |
pello | 바이트로 해석되는 프로그래밍 언어로 작성된 프로그램입니다. 소스 코드를 바이트로 컴파일하고 바이트 코드를 설치하며, 그 결과 미리 최적화된 파일을 보여줍니다. |
cello | 기본적으로 컴파일된 프로그래밍 언어로 작성된 프로그램입니다. 소스 코드를 머신 코드로 컴파일하고 결과 실행 파일을 설치하는 일반적인 프로세스를 보여줍니다. |
Hello World!
의 구현은 다음과 같습니다.
사전 요구 사항으로 이러한 구현을 ~/rpmbuild/SOURCES
디렉터리에 배치해야 합니다.
3.2.1. 새로운 SPEC 파일을 만드는 방법
새 소프트웨어를 패키지하려면 새로운 SPEC 파일을 만들어야 합니다.
이를 위해서는 두 가지가 있습니다.
- 새 SPEC 파일을 처음부터 수동으로 작성
rpmdev-newspec
유틸리티 사용이 유틸리티는 채워지지 않은 SPEC 파일을 만들고 필요한 지시문과 필드를 작성합니다.
일부것에 중점을 둔 텍스트 편집기는 새로운 .spec
파일을 자체 SPEC 템플릿으로 미리 채웁니다. rpmdev-newspec
유틸리티는 편집기와 무관한 방법을 제공합니다.
3.2.2. rpmdev-newspec을 사용하여 새 SPEC 파일 생성
다음 절차에서는 rpmdev-newspec
유틸리티를 사용하여 앞서 언급한 세 가지 Hello World!
프로그램 각각에 대해 SPEC 파일을 생성하는 방법을 보여줍니다.
절차
~/rpmbuild/SPECS
디렉터리로 변경하고rpmdev-newspec
유틸리티를 사용합니다.$ cd ~/rpmbuild/SPECS $ 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.spec
및pello.spec
이라는 세 개의 SPEC 파일이 포함되어 있습니다.
fd. 파일을 확인합니다.
+
rpmdev-newspec
유틸리티는 특정 Linux 배포판과 관련된 지침이나 규칙을 사용하지 않습니다. 그러나 이 문서를 대상으로 하는 이 문서는 이므로 RPM의 Build root를 참조하는 경우
root 표기법을 우선하여 다른 모든 정의된 또는 제공된 매크로와의 일관성을 참조합니다.
$RPM_BUILD_ROOT
표기법을 통해 %{build
3.2.3. RPM을 생성하기 위한 원본 SPEC 파일 수정
다음 절차에서는 RPM을 생성하기 위해 rpmdev-newspec
에서 제공하는 output SPEC 파일을 수정하는 방법을 보여줍니다.
사전 요구 사항
다음을 확인하십시오.
-
특정 프로그램의 소스 코드가
~/rpmbuild/SOURCES/
디렉터리에 배치됩니다. -
채워지지 않은 SPEC 파일
~/rpmbuild/SPECS/<name>.spec
파일은rpmdev-newspec
유틸리티에 의해 생성되었습니다.
절차
-
rpmdev-newspec
유틸리티에서 제공하는~/rpmbuild/SPECS/<name>.spec
파일의 출력 템플릿을 엽니다. SPEC 파일의 첫 번째 섹션을 채웁니다.
첫 번째 섹션에는
rpmdev-newspec
이 함께 그룹화된 다음 지시문이 포함되어 있습니다.-
이름
-
버전
-
릴리스 버전
요약
이름은
이미
rpmdev-newspec
에 인수로 지정되어 있습니다.소스 코드의 업스트림 릴리스 버전과 일치하도록
Version
을 설정합니다.릴리스
는 자동으로1
%인1%{?dist}
로 설정됩니다. 업스트림 릴리스 버전이 변경되지 않고 패키지를 업데이트할 때마다(예: 패치 포함 시) 초기 값을 늘립니다.새로운 업스트림 릴리스가 발생하면
릴리스
를1
로 재설정합니다.요약
은 이 소프트웨어가 무엇인지에 대한 간단한 한 줄 설명입니다.
-
라이센스
,URL
,Source0
지시문을 채웁니다.License
필드는 업스트림 릴리스의 소스 코드와 관련된 소프트웨어 라이센스입니다. SPEC 파일에서라이센스
레이블을 지정하는 방법에 대한 정확한 형식은 다음과 같은 특정 RPM 기반 Linux 배포 지침에 따라 다릅니다.예를 들어, GPLv3+ 를 사용할 수 있습니다.
URL
필드는 업스트림 소프트웨어 웹 사이트에 URL을 제공합니다. 일관성을 위해%{name}
의 RPM 매크로 변수를 사용하고 https://example.com/%{name} 을 사용합니다.Source0
필드는 업스트림 소프트웨어 소스 코드에 URL을 제공합니다. 패키지화 중인 특정 버전의 소프트웨어에 직접 연결되어야 합니다. 이 문서에 제공된 예제 URL에는 나중에 변경될 수 있는 하드 코드된 값이 포함되어 있습니다. 마찬가지로 릴리스 버전도 변경될 수 있습니다. 이러한 잠재적인 향후 변경 사항을 단순화하려면%{name}
및%{version}
매크로를 사용합니다. 이 값을 사용하면 SPEC 파일에서 필드 하나만 업데이트해야 합니다.BuildRequires
,Requires
및BuildArch
지시문을 채웁니다.BuildRequires
는 패키지에 대한 빌드 타임 종속 항목을 지정합니다.패키지에 대한 런타임 종속성을 지정합니다.
이는 기본적으로 컴파일된 확장없이 해석된 프로그래밍 언어로 작성된 소프트웨어입니다. 따라서
noarch
값을 사용하여BuildArch
지시문을 추가합니다. RPM에 이 패키지가 빌드된 프로세서 아키텍처에 바인딩할 필요가 없음을 나타냅니다.%description
,%prep
,%build
,%install
,%files
,%license
지시문을 채우십시오.이러한 지시문은 다중 줄, 다중 구조 또는 스크립트 작업을 수행할 수 있는 지시문이므로 섹션 제목으로 간주할 수 있습니다.
%description
은 하나 이상의 단락을 포함하는Summary
보다 소프트웨어에 대한 더 긴 전체 설명입니다.%prep
섹션에서는 빌드 환경을 준비하는 방법을 지정합니다. 일반적으로 소스 코드의 압축 아카이브 확장, 패치 적용, 소스 코드에 제공된 정보의 구문 분석을 통해 SPEC 파일의 뒷부분에서 사용할 수 있습니다. 이 섹션에서는 내장된%setup -q
매크로를 사용할 수 있습니다.%build
섹션은 소프트웨어 빌드 방법을 지정합니다.%install
섹션에는 소프트웨어를 빌드한 후BUILDROOT
디렉터리에 설치하는 방법에 대한rpmbuild
지침이 포함되어 있습니다.이 디렉토리는 최종 사용자의 root 디렉토리와 유사한 빈 chroot 기본 디렉터리입니다. 여기에서 설치된 파일이 포함될 모든 디렉터리를 만들 수 있습니다. 이러한 디렉터리를 생성하려면 경로를 하드 코딩하지 않고도 RPM 매크로를 사용할 수 있습니다.
%files
섹션은 이 RPM에서 제공하는 파일 목록과 최종 사용자의 시스템의 전체 경로 위치를 지정합니다.이 섹션에서는 기본 제공 매크로를 사용하여 다양한 파일의 역할을 나타낼 수 있습니다. 이 명령은 command[]
rpm
명령을 사용하여 패키지 파일 매니페스트 메타데이터를 쿼리하는 데 유용합니다. 예를 들어 LICENSE 파일이 소프트웨어 라이센스 파일임을 나타내려면%license
매크로를 사용합니다.마지막 섹션인
%changelog
는 패키지의 각 버전 릴리스에 대한 datetamped 항목 목록입니다. 소프트웨어 변경 사항이 아닌 패키지 변경 사항을 기록합니다. 패키징 변경 사항의 예: 패치 추가,%build
섹션의 빌드 절차를 변경합니다.첫 번째 줄에 대해 다음 형식을 따르십시오.
*
문자로 시작한 다음Day-of-Week Month Name Surname <email> - Version-Release
로 시작합니다.실제 변경 항목에 대해서는 다음 형식을 따릅니다.
- 각 변경 항목은 변경할 때마다 하나씩 여러 항목을 포함할 수 있습니다.
- 각 항목은 새 줄에서 시작됩니다.
-
각 항목은
-
문자로 시작합니다.
이제 필요한 프로그램에 대한 전체 SPEC 파일을 작성했습니다.
다른 프로그래밍 언어로 작성된 SPEC 파일의 예는 다음을 참조하십시오.
3.2.4. bash로 작성된 프로그램에 대한 SPEC 파일의 예
이 섹션에서는 bash로 작성된 bello 프로그램에 대한 SPEC 파일의 예를 보여줍니다. bello 에 대한 자세한 내용은 2.1.1절. “소스 코드 예” 을 참조하십시오.
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
bello
에 대한 빌드 단계가 없기 때문에 패키지에 대한 빌드 타임 종속 항목을 지정하는 BuildRequires
지시문이 삭제되었습니다. Bash는 원시 해석 프로그래밍 언어이며 파일은 시스템의 위치에만 설치됩니다.
패키지에 대한 런타임 종속성을 지정하는 Requires
지시문에는 bello
스크립트만 실행할 bash
쉘 환경만 포함하므로 bash
만 포함합니다.
bash
를 빌드할 필요가 없으므로 소프트웨어 빌드 방법을 지정하는 %build
섹션이 비어 있습니다.
bello
를 설치하려면 대상 디렉터리를 생성하고 실행 가능한 bash
스크립트 파일만 설치해야 합니다. 따라서 %install
섹션에서 install
명령을 사용할 수 있습니다. RPM 매크로를 사용하면 하드 코딩 경로 없이 이 작업을 수행할 수 있습니다.
3.2.5. Python으로 작성된 프로그램의 SPEC 파일 예
이 섹션에서는 Python 프로그래밍 언어로 작성된 pello 프로그램에 대한 SPEC 파일의 예를 보여줍니다. pello 에 대한 자세한 내용은 2.1.1절. “소스 코드 예” 을 참조하십시오.
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 프로그램은 바이트로 해석되는 언어로 작성됩니다. 따라서 결과 파일에 항목이 포함되어 있지 않기 때문에hebang이 적용되지 않습니다.
Beanbang은 적용되지 않기 때문에 다음 방법 중 하나를 적용하는 것이 좋습니다.
- 실행 파일을 호출할 바이트가 아닌 쉘 스크립트를 생성합니다.
- 프로그램의 실행 진입점으로 바이트가 아닌 Python 코드의 작은 비트를 제공합니다.
이러한 접근 방식은 수천 줄의 코드가 있는 대규모 소프트웨어 프로젝트에 특히 유용하며, 이 경우 사전 바이트 단위 코드의 성능 향상이 가능합니다.
패키지에 대한 빌드 타임 종속 항목을 지정하는 BuildRequires
지시문에는 다음 두 가지 패키지가 포함됩니다.
-
바이트-컴파일 빌드 프로세스를 수행하려면
python
패키지가 필요합니다. -
작은 진입점 스크립트를 실행하려면
bash
패키지가 필요합니다.
패키지에 대한 런타임 종속성을 지정하는 Requires
지시문에는 python
패키지만 포함됩니다. pello
프로그램을 사용하려면 런타임 시 python
패키지가 바이트-ECDHE 코드를 실행해야 합니다.
소프트웨어를 빌드하는 방법을 지정하는 %build
섹션은 소프트웨어가 바이트 단위라는 사실에 해당합니다.
pello
를 설치하려면hebang이 바이트-ECDHE 언어로 적용되지 않기 때문에 래퍼 스크립트를 생성해야 합니다. 다음과 같은 다양한 옵션을 사용할 수 있습니다.
-
별도의 스크립트를 작성하고 이를 별도의
SourceX
지시문으로 사용합니다. - SPEC 파일에서 인라인으로 파일 만들기.
이 예제에서는 SPEC 파일 자체를 스크립팅할 수 있음을 설명하기 위해 SPEC 파일에서 래퍼 스크립트 생성을 보여줍니다. 이 래퍼 스크립트는 여기에
있는 문서를 사용하여 Python 바이트-ECDHE 코드를 실행합니다.
이 예제의 %install
섹션은 바이트 파일 을 액세스할 수 있도록 시스템의 라이브러리 디렉터리에 설치해야 한다는 사실에도 해당합니다.
3.2.6. C로 작성된 프로그램에 대한 SPEC 파일의 예
이 섹션에서는 C 프로그래밍 언어로 작성된 cello 프로그램에 대한 SPEC 파일의 예를 보여줍니다. cello 에 대한 자세한 내용은 2.1.1절. “소스 코드 예” 을 참조하십시오.
C로 작성된 cello 프로그램에 대한 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
에 대한 호출을 제거해야 합니다.
cello 프로그램의 설치는 rpmdev-newspec
명령에서 제공한 %make_install
매크로를 사용하여 수행할 수 있습니다. 이는 cello 프로그램의 Makefile
을 사용할 수 있기 때문에 가능합니다.