2015-01-20 2 views
1

저는 회사 내부에서 사용되는 작은 프로그램을 위해 rpm을 만들고 있습니다. rpm 프로세스의 % 빌드 섹션이 작동합니다. 설치 섹션에 문제가 있습니다. this article response을 참조했으며 % {_ buildroot}와 관련하여 대상 위치를 제대로 참조하고 있다고 생각합니다.rpm 빌드 빌드 루트 디렉토리를 만들 수 없습니다.

내가 만들고있는 프로그램이 시스템 서비스로 설치됩니다. rpm이 실제로이 단계를 위해 생성 된 후 init.d 위치에 설치된 스크립트를 포함하고 설치를 실행하는 설치 프로세스에서 다음 단계를 추가해야합니다. 한 번에 한 걸음.

빌드 오류는 다음과 같이 (% 설치를 제외한 모든 것을 생략)은 다음과 같습니다

Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.eUDaCK 
+ umask 022 
+ cd /home/packager/rpmbuild/BUILD 
+ '[' /home/packager/rpmbuild/BUILDROOT/o2arbitord-1.0-1.el6.x86_64 '!='/']' 
+ rm -rf /home/packager/rpmbuild/BUILDROOT/o2arbitord-1.0-1.el6.x86_64 
++ dirname /home/packager/rpmbuild/BUILDROOT/o2arbitord-1.0-1.el6.x86_64 
+ mkdir -p /home/packager/rpmbuild/BUILDROOT 
+ mkdir /home/packager/rpmbuild/BUILDROOT/o2arbitord-1.0-1.el6.x86_64 
+ cd o2arbitord-1.0 
+ LANG=C 
+ export LANG 
+ unset DISPLAY 
+ install -m 555 /home/packager/rpmbuild/BUILD/o2arbitord-1.0/o2arbitord /home/packager/rpmbuild/BUILDROOT/o2arbitord-1.0-1.el6.x86_64/usr/sbin 
install: cannot create regular file `/home/packager/rpmbuild/BUILDROOT/o2arbitord-1.0-1.el6.x86_64/usr/sbin': No such file or directory 
error: Bad exit status from /var/tmp/rpm-tmp.eUDaCK (%install) 

지금, 내 rpmbuild 디렉토리는 디렉토리 /home/packager/rpmbuild/BUILDROOT/o2arbitord-1.0-1.el6.x86_64/usr/sbin이 없습니다. 문제의 일부인 것을 알고 있지만 rpmbuild 프로세스는 디렉토리를 /home/packager/rpmbuild/BUILDROOT/o2arbitord-1.0-1.el6.x86_64으로 만들지 않습니다. 내가 그것에 대해 이해하지 못하는 것은 : 왜? 위 스크립트 출력을 보면 다음 줄을 명확하게 볼 수 있습니다 : mkdir /home/packager/rpmbuild/BUILDROOT/o2arbitord-1.0-1.el6.x86_64. 그래서, 왜 디렉토리가 만들어지지 않았습니까?

BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)은 % {_ buildroot}의 정의와 어떤 관계가 있습니까? 나는 이것이 그 정의라고 생각했지만, 그것은 다른 것으로 보인다. 참고로

, 당신은 (아직) 존재하지 않는 디렉토리에 파일을 설치하려고

Name:  o2arbitord 
Version: 1.0 
Release: 1%{?dist} 
Summary: a daemon 

Group:  Applications/System 
License: GPL 
URL:  http://My.site 
Source0: %{name}-%{version}.tar.gz 
BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) 
BuildArch: x86_64 

BuildRequires: libusb1-devel 
#Requires: 

%description 


%prep 
%setup -q 


%build 
make -f o2arbitord.mk 


%install 
install -m 555 %{_builddir}/%{name}-%{version}/%{name} %{buildroot}%{_sbindir} 

%clean 
rm -rf %{buildroot} 


%files 
%defattr(-,root,root,-) 
/usr/sbin/o2arbitord 

%changelog 
+0

당신은 당신이 그것으로 파일을 설치하기 전에 디렉토리를 작성해야

%{__install} -d '%{buildroot}%{_sbindir}' 

. '% {__ mkdir_p} % {buildroot} % {_ sbindir}'또는'% {__ install} -d % {buildroot} % {_ sbindir}' –

+0

@EtanReisner 감사합니다. 나는이 두 매크로에 대해 몰랐다. % prep 섹션에서 디렉토리를 만들려고했지만 실패했습니다. 귀하의 두 가지 제안 중 첫 번째를 % install에 넣었고 물론 작동했습니다. 나도 대답으로 의견을 수락 할 수 없다. –

답변

1

내 spec 파일.

RPM은 자동으로 %{buildroot}만을 생성합니다. 그 밑에는 너 자신을 만들어야 만하는 모든 것. %{buildroot}%{_sbindir}은 이미 당신을 위해 /home/packager/rpmbuild/BUILDROOT/o2arbitord-1.0-1.el6.x86_64를 만들었습니다 /home/packager/rpmbuild/BUILDROOT/o2arbitord-1.0-1.el6.x86_64/usr/sbin RPM으로 확장 곳

그래서 당신은

install -m 555 %{_builddir}/%{name}-%{version}/%{name} %{buildroot}%{_sbindir} 

을 실행할 때.

경로의 일부인 /usr/sbin을 만든 다음 파일을 복사해야합니다.

당신은 할 수와 하나

%{__mkdir_p} '%{buildroot}%{_sbindir}' 

또는

$ rpm -E '__mkdir_p = %{__mkdir_p}' 
__mkdir_p = /bin/mkdir -p 
$ rpm -E '__install = %{__install}' 
__install = /usr/bin/install 
+0

그건 이상한 일 이었어. 나는 그 과정이'/ home/packager/rpmbuild/BUILDROOT/o2arbitord-1.0-1.el6.x86_64'을 만들었다는 것을 알았다. 그러나 그 디렉토리는 존재하지 않았습니다. 여기에 언급 된 첫 번째 줄을 추가하면 필자가 필요로하는 모든 디렉토리를 만들 수 있습니다. 감사합니다. –

+0

그 디렉토리가 존재하지 않았습니까? RPM은 실패한 빌드에서 사용자를 정리합니다.빌드 중에 존재 했어야하고 빌드가 실패한 후에는 없었을 것입니다. 또한 CentOS 6에서는'BuildRoot'를 수동으로 설정할 필요가 없으며 일반적으로 사용하지 않아야합니다 (일반적인 위치를 제어하려는 경우 _buildrootdir를 설정할 수 있습니다). –

관련 문제