2.4. 패치 소프트웨어
이 섹션에서는 소프트웨어를 패치하는 방법을 설명합니다.
RPM 패키징에서는 원래 소스 코드를 수정하는 대신 해당 코드를 보관하고 패치를 사용합니다.
패치는 다른 소스 코드를 업데이트하는 소스 코드입니다. 두 버전의 텍스트 간에 다른 것을 나타내기 때문에 diff 로 포맷됩니다. diff 는 diff
유틸리티를 사용하여 생성된 다음 patch 유틸리티를 사용하여 소스 코드에 적용됩니다.
소프트웨어 개발자는 종종 git 과 같은 버전 제어 시스템을 사용하여 코드 기반을 관리합니다. 이러한 도구는 diffs 또는 패치 소프트웨어를 만드는 자체 방법을 제공합니다.
다음 예제에서는 diff
를 사용하여 원래 소스 코드에서 패치를 생성하는 방법과 패치를 사용하여 패치
를 적용하는 방법을 보여줍니다. 패치는 RPM을 생성할 때 이후 섹션에서 사용됩니다. 3.2절. “SPEC 파일 작업” 을 참조하십시오.
이 절차에서는 cello.c
의 원래 소스 코드에서 패치를 생성하는 방법을 설명합니다.
절차
원본 소스 코드를 유지합니다.
$ cp -p cello.c cello.c.orig
-p
옵션은 모드, 소유권 및 타임스탬프를 유지하는 데 사용됩니다.필요에 따라
cello.c
를 수정합니다.#include <stdio.h> int main(void) { printf("Hello World from my very first patch!\n"); return 0; }
diff
유틸리티를 사용하여 패치를 생성합니다.$ diff -Naur cello.c.orig cello.c --- cello.c.orig 2016-05-26 17:21:30.478523360 -0500 + cello.c 2016-05-27 14:53:20.668588245 -0500 @@ -1,6 +1,6 @@ #include<stdio.h> int main(void){ - printf("Hello World!\n"); + printf("Hello World from my very first patch!\n"); return 0; } \ No newline at end of file
로 시작하는 행은 원래 소스 코드에서 제거되고
+
로 시작하는 행으로 교체됩니다.diff
명령과 함께Naur
옵션을 사용하는 것이 대부분의 일반적인 사용 사례에 적합하므로 사용하는 것이 좋습니다. 그러나 이 경우-u
옵션만 필요합니다. 특정 옵션은 다음을 보장합니다.-
-
n(또는--new-file
) - 빈 파일이 있는 것처럼 파일을 처리합니다. -
-a
(또는--text
) - 모든 파일을 텍스트로 처리합니다. 결과적으로 바이너리로 분류되는파일은
무시되지 않습니다. -
-u
(또는-U NUM
또는--unified[=NUM]
) - 출력 NUM(기본값 3) 통합 컨텍스트 라인으로 출력을 반환합니다. 이는 패치를 변경된 소스 트리에 적용할 때 유사할 수 있는 쉽게 읽을 수 있는 형식입니다. -r
(또는--recursive
) - 발견된 하위 디렉토리를 다시 비교합니다.diff
유틸리티에 대한 일반적인 인수에 대한 자세한 내용은diff
매뉴얼 페이지를 참조하십시오.
-
패치를 파일에 저장합니다.
$ diff -Naur cello.c.orig cello.c > cello-output-first-patch.patch
원래의
cello.c
를 복원 :$ cp cello.c.orig cello.c
RPM이 빌드되면 수정된 파일이 아니라 원본 파일이 사용되므로 원래
cello.c
를 유지해야 합니다. 자세한 내용은 3.2절. “SPEC 파일 작업”의 내용을 참조하십시오.
다음 절차에서는 cello-output-first-patch.patch
를 사용하여 cello.c
패치를 패치하고 패치된 프로그램을 빌드한 다음 실행하는 방법을 보여줍니다.
패치 파일을
patch
명령으로 리디렉션합니다.$ patch < cello-output-first-patch.patch patching file cello.c
cello.c
의 콘텐츠가 이제 패치를 반영하는지 확인합니다.$ cat cello.c #include<stdio.h> int main(void){ printf("Hello World from my very first patch!\n"); return 1; }
패치된
cello.c
를 빌드하고 실행합니다.$ make clean rm cello $ make gcc -g -o cello cello.c $ ./cello Hello World from my very first patch!