| patch -p0 와 patch -p1 차이 & patch 사용 (글 동쪽하늘) | 작성일 : 2003/10/29 19:15 |
| 조회수 : 18401 |
|
패치(patch) 사용에 대한 글입니다. 모두 리눅스 사랑넷(옛 적수네)에 답변으로 올라온 글로, 하나는 동쪽하늘님, 다른 하나는 세이님이 답변한 것입니다. ---------------------------------------------------------------------------- 출처 : 리눅스사랑넷, http://linux-sarang.net/board/?p=read&table=qa&no=197418 103830번 글의 답장글: RE: patch -p0 와 patch -p1 의 차이점은? 글쓴이: 동쪽하늘 글쓴날: 2003-08-13 11:01:05 읽은수: 114 : 제목 그대로 입니다. : : 어떤때 -p0를 쓰고 어떤때 -p1 을 쓰는지 궁금합니다. : 그리고 -p? 의 숫자는 0과 1뿐인가요? : : 방금 하나를 패치해봤는데, -p1 을 썼더니 : File to patch : : 라고 뜨더군요. 그래서 -p0를 썼더니 묻지 않고 잘 됩니다. : 커널패치할때는 -p1으로 했었던거 같은데.. 갑자기 두개의 차이가 궁금해서... -pNUM 옵션은 패치 파일에 명시되어 있는 '패치할 파일의 위치'를 제대로 찾아주게 하기위한, 'path에서 제거할 prefix의 개수'정도 의 의미를 지닌다고 할 수 있습니다. --strip=NUM 과 같습니다. 예를 들어, 패치 파일에 '패치할 파일의 위치(이름)'가 /home/dcpark/idst/src/test.c 와 같이 적혀 있을 경우... -p0 는 '하나도 수정하지 않은' 전 path가 포함된 것을, -p1 은 '첫번째 슬래쉬가 빠진' home/dcpark/idst/src/test.c를, -p4 는 '내번째 슬래쉬 앞까지 빠진' src/test.c를 '패치할 파일의 이름'으로 인식하게 합니다. -p 옵션을 주지않는 다면, test.c 만 파일이름으로 간주하고 패치를 시도합니다. 보통의 경우, 소스 디렉토리 전체를 백업해두고 (cp -rf /home/dcpark/package /home/dcpark/package.orig) 소스(예: /home/dcpark/package/src/test.c)를 수정해서 패치파일을 만들기때문에 (diff -uNr package.orig package > patch.diff)... 패치할 소스 패키지의 루트디렉토리에서 -p1 을 사용하여 패치를 하는 것입니다. (cd /home/dcpark/package/ && pach -p1 < where/patch.diff) : 그리고 패치후에 나오는 메시지중에 : Hunk #1 succeeded at 1 with fuzz 2 : Hunk #2 failed at 353 : Hunk #3 failed at 374 : 2 out of 3 hunks failed : : 이것이 무슨 뜻인지도 좀 알려주시면 고맙겠습니다. Hunk는 패치파일에 기록되어 있는 '패치할 조각(덩어리)'입니다. 보통 패치할 때, 위와 같은 메시지가 없어야 문제없이 정상적으로 처리가 된 것이지만, fuzz(퍼지, 껴맞추기)로 시도하여 성공하는 경우에는 위의 첫번째 메시지와 같은 것을 보여주게 됩니다. 위의 메시지에서 '두번째와 세번째 패치 조각'은 실패를 했네요. :) 자세한 것은 man patch 를 참고하세요. ---------------------------------------------------------------------------- 출처 : 리눅스사랑넷, http://linux-sarang.net/board/?p=read&table=qa&no=190326 100602번 글의 답장글: RE: patch 라는걸 한번두 안해봤는데..이렇게 하면 되나요??^^ 글쓴이: 세이 글쓴날: 2003-02-03 12:01:44 읽은수: 152 : patch를 해보려고 합니다. : 근데 개념이 마니 햇갈리네요..역시 첨하는건 어렵고..공부의 필요성입니 다.^^ : : 일단 다음과 같은 패치를 얻었습니다. : 밑에 보시면 RCS file: /home/wine/wine/controls/edit.c,v라고 적혀 있습 니다 : 그럼...이걸 패치하기 위해선 : : 1. 제 소스가../home/wine/wine에 존재해야하는 겁니까? -> 위치는 아무 곳이나 상관 없습니다. 소스 압축파일에 있는 내용이 그대 로 풀려있으면 됩니다. : 2. 그리고 아래 패치를 하나의 파일에 저장해야하나요? : 아니면 index별로 따로 저장해야하나요? : index: controls/edit.c : Index: dlls/x11drv/keyboard.c : . : . : . : 이런 식으로 되어 있는 인덱스들을 edit.patch keyboard.path로 따로 : 저장을 해서 각각 패치를 해줘야 하는 겁니까? : : 아니면 wine_xim.patch이런 식으로 하나로 저장해서 패치해줘야하는 겁니 까? 일반적으로 패치는 하나의 파일에 저장되어 배포됩니다. 위와 같은 경우에 는 wine-xim.patch처럼 하나의 파일로 존재합니다. 별도로 index별로 분리 할 필요없습니다. : 3. 마지막으로 패치 방법 입니다. : : p0 옵션과 p1옵션의 차이점이 무엇인가요? 찾아서 읽어 봤는데도 햇갈리네 요 : : patch -p1 < ******.patch : : 이렇게 하면 되는 건가요? http://www.linux.sarang.net/paper/package에서 %patch로 찾아보시면 두번 째 발견되는 %patch에 답이 있습니다. -------------------- 원문 ------------------------------------------- 역시 나우에 답이 있었다. "없앨 슬래쉬 갯수" 라고 하는데 도데체 먼 말 인가 예가 있으니 한번 다시 긁어와 봐야징. 흐음 도저히 긁어서 이해할 글 이 아니다.한번 그냥 적어 봐야지 ^^; patch 파일을 보면 맨 위쯤에서 이러 한 줄을 발견할 수 있을것이다. --- usr/src/foobar/foobar.c.orig Mon Aug 11 02:10:23 1997 +++ usr/src/foobar/foobar.c Mon Aug 11 02:03:59 1997 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 패치할 파일의 위치를 나타네는데 만약 우리가 /usr/src/foobar 라는 디 렉토리에 위치하고 있다면 patch < foobar.patch 이런식으로 아무리 해봐도 파일을 찾을수 없다는 에러가 날것이다. 죽어라 현재 위치에서 usr/src/foobar 란 디렉토리를 찾을테니까 말이다. 이런식으로 하면 된다. patch -p3 < foobar.patch 이해가 가는가? usr/src/foobar/foobar.c 라는 파일을 찾으라는 것을 p3 을 줌으로써 슬래쉬 3개 만큼 투욱 잘라내고 foobar.c 를 찾으라고 하는것이다. 이것이 왜 rpm 패키징에서 자주 쓰이는가? 기본적으로 %patch 명령을 실 행하는 위치는 BUILD 아래에 압축이 풀린 디렉토리이다. patch 파일의 내용 을 보면 보통 foobar/src/foobar.c 이런식으로 프로그램이 풀릴 디렉토리까 지 포함되어 있다. (도데체 내가 먼 말을 하는거지? 그냥 가자.) 그래서 foobar/ 란 부분 을 스윽 잘라서 src/foobar.c 로 만들어야 하는 일이 많을것이다. (이전 버젼부터 쓰던 patch 를 계속 쓰는 경우도 많고 디렉토리의 이름이 틀릴때 도 많고 하니까) 그래서 보통 %patch -p1 명령을 주고 사용한다. 직접 해 보면서 몸에 익히면 된다. ---------------------------------------------------------------------- 이 patch에서는 -p0를 사용해야 하는 것으로 보인다. 소스가 풀려있는 디렉토리에 controls/edit.c파일이 있는데 patch에도 controls/edit.c라고 되어 있기 때문이다. patch부분중에서 --- controls/edit.c ~~~ +++ controls/edit.c ~~~ 줄을 보면 알 수 있습니다. |
|||||||||
|
|