确保打在rpm包中的.so文件具有可执行权限

来源:互联网 发布:mac windows 截图 编辑:程序博客网 时间:2024/06/16 12:26

背景介绍:

有一个工程,其目录结构是:

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:           libBVersion:        0.1.0Release:        1License:        TO BE / FILLED INGroup:          TO BE / FILLED INSource0:        %{name}-%{version}.tar.gzSummary:        LibBBuildRequires:  cmakeBuildRequires:  scons%descriptionLibB%package develSummary:        Include Files and Libraries mandatory for DevelopmentGroup:          TO BE / FILED INRequires:       %{name} = %{version}-%{release}%description develThis package contains all necessary include files and libraries neededto develop applications that require these.%prep%setup -q%buildpushd .cd libAscons --prefix=%{_prefix}popdcmake . -DCMAKE_INSTALL_PREFIX=%{_prefix}make %{?jobs:-j%jobs}%installrm -rf %{buildroot}%make_install%cleanrm -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.soFIND_LIBRARY(LibA NAME A PATHS ${CMAKE_SOURCE_DIR}/libA DOC "LibA library")# 链接libA.soTARGET_LINK_LIBRARIES(${PROJECT_NAME} ${PKGS_LDFLAGS} ${LibA})# 安装libA.soINSTALL(FILES ${CMAKE_SOURCE_DIR}/libA/libA.so DESTINATION ${LIBDIR})# 安装libB.soINSTALL(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 -divcd usr/libls -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:           libBVersion:        0.1.0Release:        1License:        TO BE / FILLED INGroup:          TO BE / FILLED INSource0:        %{name}-%{version}.tar.gzSummary:        LibBBuildRequires:  cmakeBuildRequires:  scons%descriptionLibB%package develSummary:        Include Files and Libraries mandatory for DevelopmentGroup:          TO BE / FILED INRequires:       %{name} = %{version}-%{release}%description develThis package contains all necessary include files and libraries neededto develop applications that require these.%prep%setup -q%buildpushd .cd libAscons --prefix=%{_prefix}popdcmake . -DCMAKE_INSTALL_PREFIX=%{_prefix}make %{?jobs:-j%jobs}%installrm -rf %{buildroot}pushd .cd libAscons --prefix=%{_prefix} --libdir=%{_libdir} --install-sandbox=%{buildroot} installpopd%make_install%cleanrm -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.soFIND_LIBRARY(LibA NAME A PATHS ${CMAKE_SOURCE_DIR}/libA DOC "LibA library")# 链接libA.soTARGET_LINK_LIBRARIES(${PROJECT_NAME} ${PKGS_LDFLAGS} ${LibA})# 安装libA.so#INSTALL(FILES ${CMAKE_SOURCE_DIR}/libA/libA.so DESTINATION ${LIBDIR})# 安装libB.soINSTALL(TARGETS ${PROJECT_NAME} DESTINATION ${LIBDIR})

2)编译appC成功。


0 0
原创粉丝点击