Red Hat Training

A Red Hat training course is available for RHEL 8

5.2. 매크로에 대한 추가 정보

이 섹션에서는 선택한 내장 RPM 매크로에 대해 설명합니다. 이러한 매크로의 전체 목록은 RPM 설명서 를 참조하십시오.

5.2.1. 자체 매크로 정의

다음 섹션에서는 사용자 지정 매크로를 만드는 방법을 설명합니다.

절차

  • RPM SPEC 파일에 다음 행을 포함합니다.

    %global <name>[(opts)] <body>

<body> 주변의 모든 공백이 제거됩니다. 이름은 영숫자로 구성될 수 있으며 문자 _ 문자는 3자 이상이어야 합니다. (opts) 필드를 포함하는 것은 선택 사항입니다.

  • 간단한 매크로에는 (opts) 필드가 포함되어 있지 않습니다. 이 경우 재귀적 매크로 확장만 수행됩니다.
  • Parametrized 매크로에는 (opts) 필드가 포함되어 있습니다. 괄호 사이에 선택 문자열은 매크로 호출 시작 시 argc/argv 처리를 위해 getopt(3) 에 전달됩니다.
참고

이전 RPM SPEC 파일은 대신 %define <name> <body> 매크로 패턴을 사용합니다. %define%global 매크로의 차이점은 다음과 같습니다.

  • %define 에는 지역 범위가 있습니다. 이는 SPEC 파일의 특정 부분에 적용됩니다. %define 매크로의 본문은 사용 시 확장 됩니다.
  • %global 에는 전역 범위가 있습니다. 이는 전체 SPEC 파일에 적용됩니다. %global 매크로의 본문은 정의 시간에 확장됩니다.
중요

매크로는 주석 처리된 경우에도 평가되거나 매크로의 이름이 SPEC 파일의 %changelog 섹션에 지정됩니다. 매크로를 주석 처리하려면 %% 를 사용합니다. 예: %%global.

추가 리소스

5.2.2. %setup 매크로 사용

이 섹션에서는 %setup 매크로의 다양한 변형을 사용하여 소스 코드 tarball을 사용하여 패키지를 빌드하는 방법을 설명합니다. 매크로 변형을 결합할 수 있습니다. rpmbuild 출력은 %setup 매크로의 표준 동작을 보여줍니다. 각 단계가 시작될 때 매크로는 Executing(%…​)을 출력합니다.) 는 아래 예와 같이 입니다.

예 5.1. %setup 매크로 출력 예

Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.DhddsG

쉘 출력은 set -x enabled로 설정됩니다. /var/tmp/rpm-tmp.DhddsG 의 내용을 보려면 rpmbuild 가 빌드 후 임시 파일을 삭제하므로 --debug 옵션을 사용합니다. 그러면 환경 변수 설정이 표시된 다음 예를 들면 다음과 같습니다.

cd '/builddir/build/BUILD'
rm -rf 'cello-1.0'
/usr/bin/gzip -dc '/builddir/build/SOURCES/cello-1.0.tar.gz' | /usr/bin/tar -xof -
STATUS=$?
if [ $STATUS -ne 0 ]; then
  exit $STATUS
fi
cd 'cello-1.0'
/usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .

%setup 매크로:

  • 올바른 디렉터리에서 작동하는지 확인합니다.
  • 이전 빌드의 남은 부분을 제거합니다.
  • 소스 tarball의 압축을 풉니다.
  • 몇 가지 기본 권한을 설정합니다.

5.2.2.1. %setup -q 매크로 사용

-q 옵션은 %setup 매크로의 상세 수준을 제한합니다. tar -xvvof 대신 tar -xof 만 실행됩니다. 첫 번째 옵션으로 이 옵션을 사용합니다.

5.2.2.2. %setup -n 매크로 사용

n 옵션은 확장된 tarball의 디렉터리 이름을 지정하는 데 사용됩니다.

이는 확장된 tarball의 디렉터리가 예상 것과 다른 이름(%{name}-%{version})과 다른 이름이 있어 %setup 매크로의 오류로 이어질 수 있는 경우에 사용됩니다.

예를 들어 패키지 이름이 cello 이지만 소스 코드가 hello-1.0.tgz 에 보관되고 hello/ 디렉터리가 포함된 경우 SPEC 파일 콘텐츠는 다음과 같아야 합니다.

Name: cello
Source0: https://example.com/%{name}/release/hello-%{version}.tar.gz
…
%prep
%setup -n hello

5.2.2.3. %setup -c 매크로 사용

소스 코드 tarball에 하위 디렉터리가 포함되어 있지 않고 압축을 푼 후 아카이브의 파일이 현재 디렉터리를 채우는 경우 -c 옵션이 사용됩니다.

그런 다음 -c 옵션은 다음과 같이 디렉터리 및 단계를 아카이브 확장에 생성합니다.

/usr/bin/mkdir -p cello-1.0
cd 'cello-1.0'

아카이브 확장 후에는 디렉터리가 변경되지 않습니다.

5.2.2.4. %setup -D 및 %setup -T 매크로 사용

-D 옵션은 소스 코드 디렉터리 삭제를 비활성화하고 %setup 매크로가 여러 번 사용되는 경우 특히 유용합니다. d 옵션을 사용하면 다음 행이 사용되지 않습니다.

rm -rf 'cello-1.0'

-T 옵션은 스크립트에서 다음 행을 제거하여 소스 코드 tarball 확장을 비활성화합니다.

/usr/bin/gzip -dc '/builddir/build/SOURCES/cello-1.0.tar.gz' | /usr/bin/tar -xvvof -

5.2.2.5. %setup -a 및 %setup -b 매크로 사용

a 및 - b 옵션은 특정 소스를 확장합니다.

  • b 옵션은 이전 을 나타냅니다. 이 옵션은 작업 디렉터리를 입력하기 전에 특정 소스를 확장합니다.
  • a 옵션은 이후 를 나타냅니다. 이 옵션은 입력 후 해당 소스를 확장합니다. 해당 인수는 SPEC 파일의 소스 번호입니다.

다음 예에서 cello-1.0.tar.gz 아카이브에는 빈 예제 디렉터리가 포함되어 있습니다. 예제는 별도의 examples.tar.gz tarball에 포함되어 있으며 동일한 이름의 디렉토리로 확장됩니다. 이 경우 작업 디렉터리를 입력한 후 Source1 을 확장하려면 -a 1 을 사용합니다.

Source0: https://example.com/%{name}/release/%{name}-%{version}.tar.gz
Source1: examples.tar.gz
…
%prep
%setup -a 1

다음 예에서 예제는 cello-1.0/examples 로 확장되는 별도의 cello-1.0-examples.tar.gz tarball에 제공되어 있습니다. 이 경우 작업 디렉터리를 입력하기 전에 -b 1 을 사용하여 Source1 을 확장합니다.

Source0: https://example.com/%{name}/release/%{name}-%{version}.tar.gz
Source1: %{name}-%{version}-examples.tar.gz
…
%prep
%setup -b 1

5.2.3. %files 섹션의 공통 RPM 매크로

다음 표에는 SPEC 파일의 %files 섹션에 필요한 고급 RPM 매크로가 나열되어 있습니다.

표 5.1. %files 섹션의 고급 RPM 매크로

macro정의

% license

%license 매크로는 LICENSE 파일로 나열된 파일을 식별하고 RPM과 같이 설치 및 레이블이 지정됩니다. 예: %license LICENSE.

%doc

%doc 매크로는 문서로 나열된 파일을 식별하고 RPM에 따라 설치 및 레이블이 지정됩니다. %doc 매크로는 패키지 소프트웨어에 대한 문서와 코드 예제 및 다양한 관련 항목에도 사용됩니다. 코드 예제가 포함된 경우 파일에서 실행 모드를 제거하려면 주의해야 합니다. 예: %doc README

%dir

%dir 매크로는 경로가 이 RPM이 소유한 디렉터리인지 확인합니다. RPM 파일 매니페스트에서 설치 제거할 디렉토리를 정확하게 파악할 수 있도록 하는 것이 중요합니다. 예: %dir %{_libdir}/%{name}

%config(noreplace)

%config(noreplace) 매크로는 다음 파일이 구성 파일임을 확인하므로 원래 설치 체크섬에서 파일을 수정한 경우 패키지 설치 또는 업데이트에서 덮어쓰거나 교체해서는 안 됩니다. 변경 사항이 있는 경우 대상 시스템의 기존 또는 수정된 파일이 수정되지 않도록 업그레이드 또는 설치 시 파일 이름 끝에 .rpmnew 가 추가됩니다. 예: %config(noreplace) %{_sysconfdir}/%{name}/%{name}.conf

5.2.4. 내장 매크로 표시

Red Hat Enterprise Linux는 여러 개의 내장 RPM 매크로를 제공합니다.

절차

  1. 기본 제공 RPM 매크로를 모두 표시하려면 다음을 실행합니다.

    rpm --showrc
    참고

    출력은 매우 크기 조정 가능합니다. 결과를 좁히려면 위의 명령을 grep 명령과 함께 사용합니다.

  2. 시스템 RPM 버전의 RPM에 대한 RPM에 대한 정보를 찾으려면 다음을 실행합니다.

    rpm -ql rpm
    참고

    RPM 매크로는 출력 디렉토리 구조에서 매크로 라는 이름의 파일입니다.

5.2.5. RPM 배포 매크로

다른 배포에서는 패키지화된 소프트웨어의 언어 구현 또는 배포의 특정 지침에 따라 다양한 권장 RPM 매크로 세트를 제공합니다.

권장되는 RPM 매크로 세트는 종종 RPM 패키지로 제공되며 yum 패키지 관리자와 함께 설치할 수 있습니다.

설치한 후 매크로 파일은 /usr/lib/rpm/macros.d/ 디렉토리에서 찾을 수 있습니다.

절차

  • 원시 RPM 매크로 정의를 표시하려면 다음을 실행합니다.

    rpm --showrc

위의 출력에는 원시 RPM 매크로 정의가 표시됩니다.

  • 매크로가 수행하는 작업과 RPM을 패키징할 때 도움이 되는 방법을 확인하려면 인수로 사용되는 매크로 이름으로 rpm --eval 명령을 실행합니다.

    rpm --eval %{_MACRO}

추가 리소스

  • RPM 도움말 페이지

5.2.6. 사용자 정의 매크로 생성

사용자 지정 매크로를 사용하여 ~/.rpmmacros 파일에서 배포 매크로를 재정의할 수 있습니다. 변경 사항은 시스템의 모든 빌드에 영향을 미칩니다.

주의

~/.rpmmacros 파일에서 새 매크로를 정의하는 것은 권장되지 않습니다. 이러한 매크로는 다른 시스템에는 존재하지 않으며, 사용자는 패키지를 다시 빌드하려고 할 수 있습니다.

절차

  • 매크로를 재정의하려면 다음을 실행합니다.

    %_topdir /opt/some/working/directory/rpmbuild

rpmdev-setuptree 유틸리티를 통해 모든 하위 디렉터리를 포함하여 위 예제에서 디렉터리를 생성할 수 있습니다. 이 매크로의 값은 기본적으로 ~/rpmbuild 입니다.

%_smp_mflags -l3

위의 매크로는 대부분 Makefile에 전달하는 데 사용됩니다(예: %{?_smp_mflags}, 빌드 단계에서 여러 개의 동시 프로세스 설정). 기본적으로 -jX 로 설정됩니다. 여기서 X 는 여러 코어입니다. 코어 수를 변경하면 패키지 빌드 속도를 높이거나 느려질 수 있습니다.