确保打在rpm包中的.so文件具有可执行权限
2016-05-19 18:35
381 查看
背景介绍:
有一个工程,其目录结构是:
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:
LibB CMAKELists.txt:
编译出错:
appC: nothing provides libA.so needed by libB
原因分析:明明libB.rpm里已经包括了libA.so 和libB.so, 为什么说没有提供libA,so?
我们解开rpm看看:
原因是 以FILES安装的文件会去除可执行权限
解决方案2:
1)编译安装libA都通过scons。
libB.spec:
LibB CMAKELists.txt: 去除安装libA.so步骤。
2)编译appC成功。
有一个工程,其目录结构是:
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.solibA.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成功。
相关文章推荐
- Shell脚本解压rpm软件包
- Linux rpm tar 操作系统下软件的安装与卸载方法
- Linux RPM命令参数
- Linux 下rpm命令参数详解
- SUSE Linux下通过RPM方式卸载MySQL 5过程笔记
- Linux rpm 命令参数使用详解
- Linux下 rpm 命令查询方法
- Python自动化构建工具scons使用入门笔记
- Linux rpm命令参数使用大全(经典)
- linux命令详解之rpm命令参数使用方法
- 解压rpm包的linux命令及rpm命令使用简介
- 详解Linux 操作系统下安装rpm包的方法步骤
- 强制删除rpm包的方法
- Linux 中 RPM包 安装 查询 卸载命令小结及yum命令详解
- cmake clion 构建cocos2dx 应用程序并编译ios mac android
- [Linux学习笔记] Linux软件包管理
- 使用CMake来构建STM32工程
- linux下rpm安装和卸载jdk
- OpenCV配置,从来没有这么简单!
- Redis: You need tcl 8.5 or newer in order to run