背景介紹:
有一個工程,其目錄結構是:
libB
-- libA
-- src
-- packaging
目錄libA通過scons編譯生成libA.so,目錄src中的源代碼通過 CMAKE編譯生成libB.so, 且libB.so 依賴 libA.so. 另外有個應用程式 appC,依賴 libB.so。請問如何libB如何打包成rpm。libB.rpm
方案一:
1) 先隻編譯LibA,生成的libA.so在libA/libA.so,然後在libB的CMAKE檔案中連結LibA.so, 并用FILES安裝LibA.so.
libB.spec:
Name: libB
Version: 0.1.0
Release: 1
License: TO BE / FILLED IN
Group: TO BE / FILLED IN
Source0: %{name}-%{version}.tar.gz
Summary: LibB
BuildRequires: cmake
BuildRequires: scons
%description
LibB
%package devel
Summary: Include Files and Libraries mandatory for Development
Group: TO BE / FILED IN
Requires: %{name} = %{version}-%{release}
%description devel
This package contains all necessary include files and libraries needed
to develop applications that require these.
%prep
%setup -q
%build
pushd .
cd libA
scons --prefix=%{_prefix}
popd
cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix}
make %{?jobs:-j%jobs}
%install
rm -rf %{buildroot}
%make_install
%clean
rm -rf %{buildroot}
%post
%postun
%files
%defattr(-,root,root,-)
%{_libdir}/libA.so
%{_libdir}/LibB.so
%files devel
%defattr(-,root,root,-)
%{_includedir}/*
%{_libdir}/pkgconfig/%{name}.pc
%{_libdir}/pkgconfig/libA.pc
LibB CMAKELists.txt:
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
PROJECT(libB)
ADD_LIBRARY(${PROJECT_NAME} SHARED src/libB.c)
# 尋找libA.so
FIND_LIBRARY(LibA NAME A PATHS ${CMAKE_SOURCE_DIR}/libA DOC "LibA library")
# 連結libA.so
TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${PKGS_LDFLAGS} ${LibA})
# 安裝libA.so
INSTALL(FILES ${CMAKE_SOURCE_DIR}/libA/libA.so DESTINATION ${LIBDIR})
# 安裝libB.so
INSTALL(TARGETS ${PROJECT_NAME} DESTINATION ${LIBDIR})
2)編譯appC
編譯出錯:
appC: nothing provides libA.so needed by libB
原因分析:明明libB.rpm裡已經包括了libA.so 和libB.so, 為什麼說沒有提供libA,so?
我們解開rpm看看:
rpm2cpio libB.rpm | cpio -div
cd usr/lib
ls -l
-rwxr-xr-x 1 root root 1637738 19 18:27 libB.so
-rw-r--r-- 1 root root 1674522 19 18:27 libA.so
libA.so的可執行權限沒有了。
原因是 以FILES安裝的檔案會去除可執行權限
INSTALL(FILES ${CMAKE_SOURCE_DIR}/libA/libA.so DESTINATION ${LIBDIR})
解決方案2:
1)編譯安裝libA都通過scons。
libB.spec:
Name: libB
Version: 0.1.0
Release: 1
License: TO BE / FILLED IN
Group: TO BE / FILLED IN
Source0: %{name}-%{version}.tar.gz
Summary: LibB
BuildRequires: cmake
BuildRequires: scons
%description
LibB
%package devel
Summary: Include Files and Libraries mandatory for Development
Group: TO BE / FILED IN
Requires: %{name} = %{version}-%{release}
%description devel
This package contains all necessary include files and libraries needed
to develop applications that require these.
%prep
%setup -q
%build
pushd .
cd libA
scons --prefix=%{_prefix}
popd
cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix}
make %{?jobs:-j%jobs}
%install
rm -rf %{buildroot}
pushd .
cd libA
scons --prefix=%{_prefix} --libdir=%{_libdir} --install-sandbox=%{buildroot} install
popd
%make_install
%clean
rm -rf %{buildroot}
%post
%postun
%files
%defattr(-,root,root,-)
%{_libdir}/libA.so
%{_libdir}/LibB.so
%files devel
%defattr(-,root,root,-)
%{_includedir}/*
%{_libdir}/pkgconfig/%{name}.pc
%{_libdir}/pkgconfig/libA.pc
LibB CMAKELists.txt: 去除安裝libA.so步驟。
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
PROJECT(libB)
ADD_LIBRARY(${PROJECT_NAME} SHARED src/libB.c)
# 尋找libA.so
FIND_LIBRARY(LibA NAME A PATHS ${CMAKE_SOURCE_DIR}/libA DOC "LibA library")
# 連結libA.so
TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${PKGS_LDFLAGS} ${LibA})
# 安裝libA.so
#INSTALL(FILES ${CMAKE_SOURCE_DIR}/libA/libA.so DESTINATION ${LIBDIR})
# 安裝libB.so
INSTALL(TARGETS ${PROJECT_NAME} DESTINATION ${LIBDIR})
2)編譯appC成功。