rpm 스펙파일의 %files 섹션에 대한 질문입니다.
여러번 도움을 받았는데 다시 조언을 구합니다.
%files 섹션에서 발생한 에러를 해결할 실마리를 못 찾고 있습니다.
%files 섹션에 파일을 적는 방법은
- 풀패스로 개별파일들
- globing style 의 파일
- 전체 디렉토리명 - 서브 디렉토리와 파일들 모두 포함
- %doc, %dir, %config 등등의 매크로가 있음.
이 중 전 디렉토리명을 썼거든요.
RPM 4.1 부터 $RPM_BUILD_ROOT 디렉토리 안에 있는 모든 파일들이 %files 섹션에 적혀있지 않다면, rpmbuild 는 종료(exit) 할 것이다. 이것은 Fascist build policy 라고 알려져 있다. - Red Hat RPM Guide p.200
이런 에러 안내를 찾았는데, 이 말은 무조건 %files 섹션에 $RPM_BUILD_ROOT 를 포함시키라는 뜻으로 이해합니다.
그래서 %files 섹션에 $RPM_BUILD_ROOT(Buildroot 태그값) 을 적었습니다만, 풀패스로 적었음에도 이상한 경로에서 찾다가 에러를 냅니다.
1/
BuildRoot: /var/tmp/test-2.2-root
제작할 때 디렉토리를 3개 사용합니다.
ㄱ) %prep 섹션:타르볼 소스는 /usr/src/redhat/BUILD/test-2.2 디렉토리에 언팩합니다.
ㄴ) %build 섹션: /var/tmp/test-2.2-root 디렉토리에 언팩한 소스를 모두 복사합니다.
이 디렉토리에서 compile 합니다.
ㄷ) %install 섹션: /usr/local/test 디렉토리에 오브젝트 파일들과 실행 파일들을 install 합니다.
* 스펙파일의 %files 섹션입니다.
%files %defattr(-,root,root) /var/tmp/test-2.2-root %files smp %defattr(-,root,root) /var/tmp/test-2.2-root -- 에러메세지 -- RPM 제작 오류: 파일을 찾을 수 없음: /var/tmp/test-2.2-root/var/tmp/test-2.2-root 파일을 찾을 수 없음: /var/tmp/test-2.2-root/var/tmp/test-2.2-root
/var/tmp/test-2.2-root 는 빌드루트로 지정한 디렉토리인데,
왜 이곳에서 파일들을 찾는 건지 모르겠습니다.
2/ %files 섹션에는 바이너리 rpm 패키지에 묶여질 파일들을 기재한다고 합니다.
위에서는 빌드 할 때 사용한 디렉토리의 파일들을 묶었지만,
두번째에는 install한 오브젝트 파일들, 실행파일들만을 모은 /usr/local/test 디렉토리를
%files 섹션에 기재해봤습니다.
%files %defattr(-,root,root) /usr/local/test %files smp %defattr(-,root,root) /usr/local/test -- 에러메세지 -- RPM 제작 오류: 파일을 찾을 수 없음: /var/tmp/test-2.2-root/usr/local/test-2.2-root 파일을 찾을 수 없음: /var/tmp/test-2.2-root/usr/local/test-2.2-root
왜 같은 모양새의 에러가 발생하는 건지 모르겠습니다.
*** 그리고 빌드할 때 사용한 소스파일들과 오브젝트 파일들, library 가 있는 디렉토리를 묶어야 하나요?
아니면 인스톨할 파일들을 %files 섹션에 기재해야 합니까?
혹시 %files 섹션에서는 Buildroot 태그값으로 자동적으로 확장하는건가요?
%files 에는 BuildRoot 를 적는게 아니구 빼고 나머지를 적는
%files 에는 BuildRoot 를 적는게 아니구 빼고 나머지를 적는 겁니다..
그리고 파일을 찾을수 없는거는 디렉토리 생성하는거를 빼먹으셨으면 그럴 수도 있습니다.
그냥 예시를 들어 보겠습니다..
이런식으로 하면됩니다..
감사합니다. 두가지만 더 여쭤볼께요.
이전에는 /usr/local/test/ 디렉토리에 인스톨 했습니다.
말씀해주신 것처럼 이것을 $RPM_BUILD_ROOT/usr/local/test/ 로 바꿔서 인스톨 했습니다.
%files
/usr/local/test
로 적으니, 바이너리 rpm 파일이 만들어지네요.
/var/tmp/ 디렉토리 안에 임시로 만들어지는 rpm 파일들을 보면 %build, %install 시에 $RPM_BUILD_DIR/%{name}-%{version} 디렉토리로 cd 하고 시작합니다.
그래서 저는 BuildRoot 태그는 오직 $RPM_BUILD_ROOT 환경변수 값을 셋팅하는 용도로만 사용한다고 생각했어요.
1/ $RPM_BUILD_ROOT/usr/local/test 디렉토리에 인스톨하라는 명령이 어떻게 바이너리 rpm 을 설치한 뒤에는 /usr/local/test 디렉토리에 인스톨 되는 걸까요?
RPM 이 자동으로 $RPM_BUILD_ROOT디렉토리를 /(root)로 바꿔주는 건가요?
2/ smp 와 uni-processor 를 구분해서 바이너리 패키지를 만들고 싶습니다.
둘 다 같은 파일들을 갖지만, 컴파일 할 때 플래그를 포함하면 smp이고, 제외하면 uni 입니다.
kernel-2.4.spec 모양에서 %if 매크로 안의 실행문만 바꿨습니다.
스펙파일의 %if 매크로는 0이면 참이고, 1이면 거짓이므로,
저 모양새 라면 어떤 make 명령도 수행할 수 없다는 의미입니다.
그런데 컴파일을 마쳐서 make 타겟이 만들어진것을 확인했거든요.
제가 원하는 것은 uni 바이너리 RPM 파일은 첫번째 make 문장을 수행하고, smp 바이너리 RPM 파일은 두번째 make 문장을 수행하는 것입니다.
이렇게 사용한게 맞는 건가요?
peace :)
댓글 달기