효율성을 높인다는 명분을 내걸고 정당한 절차를 무시해서는 안 된다. "효율적"인 정부라면 독재정치를 해도 된단 말인가 ―투어굿 마설(美 흑인대법관)
* 원문링크 :
http://www.whiterabbitpress.com/osp/unix/patch.html
http://www.whiterabbitpress.com/osp/unix/patch.html
- 저자 : 전정호 (
mahajjh@myscan.org) (2001년 12월 4일)
Copyright (c) 2001 Jeon, Jeongho. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
GNU patch는 원본과 수정본사이의 차이를 기록한 patchfile을 가지고 원본을 수정본과 같이 수정하는 프로그램으로, 리눅스 커널 소스코드와 같이 규모가 큰 소프트웨어의 버전간의 차이를 배포하는데 사용한다. patchfile은 보통 diff로 만든다.
처음 Larry Wall이 만든 후, 수정을 거치며 바이너리 파일 지원 등 여러 기능이 추가되었다. 그래서 기존의 patch, GNU patch, POSIX patch는 세부적인 기능과 옵션에서 차이가 난다. 여기서는 GNU patch (2.5.4)를 다룬다.
patchfile 만들기 #
기본적으로 diff로 원본 디렉토리와 수정본 디렉토리의 차이를 어떻게든 얻어내면 된다. 구체적인 예는 다음과 같다.
$ LC_ALL=C TZ=UTC0 diff -Naur gcc-2.7 gcc-2.8
$ LC_ALL=C TZ=UTC0 diff -rc2P gcc-2.3.2 gcc-2.3.3 | \ > gzip -9 >gcc-2.3.2-2.3.3.patch.gz
위는 manpage의 예이고, 아래는 Information For Maintainers of GNU Software의 예이다. 여기서 앞에 사용한 LC_ALL=C TZ=UTC0은 patchfile에 기록될 시간 형식을 고정시키기 위해서이다. 또 CVS와 같은 프로그램으로도 patchfile을 만들 수 있다.
patchfile 적용하기 #
patch는 patchfile에 기록된 파일을 찾기 위해 여러가지 방법을 시도한다. 또 현재 가지고 있는 원본이 patchfile을 만들때 사용한 것과 동일하지 않은 경우에도 여러가지 추측을 하여 처리하려고 시도한다. 이런 방법들은 manpage에 설명되있다. 그러나 보통 -p 옵션을 사용하여 파일의 정확한 위치를 알려주기 때문에 patch가 실수로 다른 파일을 수정하는 경우는 걱정하지 않아도 된다.
patch가 실패한 경우, 파일명 뒤에 .rej를 붙인 파일을 생성한다. patch를 실행한 후 이런 파일들이 생긴다면 무엇이 문제인지 살펴봐야 한다.
이미 patch를 실행한 원본에 또다시 patch를 실행하면 patch는 다시 원본으로 되돌릴지를 물어본다. 이는 -R (--reverse) 옵션을 직접 사용한 것과 같다.
또 patch는 diff 결과가 아닌 부분을 앞뒤로 무시하므로, patchfile 내용이 메일이나 뉴스 메세지에 포함된 경우 그 글 전체를 입력으로 사용해도 된다. 메일 리더나 뉴스 리더에서 메세지 내용을 가지고 외부프로그램을 실행시키는 기능이 있다면 편하게 사용할 수 있다.
수정할 파일을 아규먼트로 직접 지정해줄 수 있지만 보통 다음과 같이 사용한다. 아래는 많이 사용하는 옵션들이다.
$ patch -pnum < patchfile
-b (--backup) 원본 내용을 다른 파일에 저장해둔다. -B (--prefix), -Y (--basename-prefix), -z (--suffix) 옵션으로 파일명을 지정할 수 있다. -d dir (--directory) dir로 옮겨가서 작업을 한다. -D define (--ifdef) 수정한 내용을 #ifdef ... #endif로 묶는다. -N (--forward) 이미 patchfile이 적용된 경우 원본으로 되돌리지 않는다. -R (--reverse)의 반대. --dry-run 실행은 하되 실제로 파일을 수정하지는 않는다. 테스트시 사용. -pnum (--strip) patchfile에 기록된 경로에서 무시할 "/" 개수. 아래 참조. -s (--silent, --quiet) 오류만 출력한다. 보통은 추측하여 처리한 내용 등도 같이 출력한다.
- -p는 patchfile에 기록된 경로를 처리할때 사용된다. 예를 들어 original과 updated란 두 디렉토리를 diff하여 patchfile에 dif -Naur original/foo/bar.c updated/foo/bar.c와 같은 내용이 있다고 하자. (original과 updated 디렉토리를 담고있는) patchfile을 만든 디렉토리에서 patch를 실행한다면 -p0 옵션을 사용한다. 만약 original 디렉토리 안에서 patch를 실행한다면 -p1 옵션으로 original/foo/bar.c 대신 foo/bar.c를 사용하게 한다. 또 -p 옵션은 patchfile에 절대경로가 쓰인 경우에도 유용하다. -p 옵션을 사용하지 않는다면 경로에서 마지막 파일명만으로 파일을 찾기때문에 patch를 실행할때에는 보통 -p 옵션은 지정하는 것이 좋다.








