起源于我看到/usr/下有diagnose-tools目录,且可以执行diagnose-tools命令,但是在我理解的makefile中并没有做这些事情,我看用户态makefile只是在在目录下生成diagnose-tools可执行文件,内核态只是在目录下生成.ko可插入模块,不明白这里是怎么做的。
他用的是dpkg和rpm两种方式安装。Ubuntu使用.deb格式软件包,其他使用.rpm(原因是红帽支持rpm,其他不支持)。统一生成.rpm软件包,如果是Ubuntu,则使用alien软件将.rpm转换成.deb使用dpkg安装。在顶层Makefile中:
(1)pkg伪指令用于构建软件包:
只做了两件事情,执行./rpmbuild/rpmbuild.sh、如果是Ubuntu转成.deb。
pkg: cd rpmbuild; sh rpmbuild.sh # 执行rpmbuild.sh ls rpmbuild/RPMS/*/* ifneq ($(findstring Ubuntu,$(UNAME_A) $(shell test -e /etc/os-release && head -1 /etc/os-release)),) # 如果是Ubuntu,先删原有.deb再转成.deb #sudo dpkg-reconfigure dash !!!!!!!!!!!!!!!!!!!!!!!!!!!!! cd rpmbuild; rm -f diagnose-tools*.deb ifneq ($(findstring aarch64,$(ARCH)),) cd rpmbuild; sudo alien -d --target=arm64 ./RPMS/aarch64/diagnose-tools*.rpm else cd rpmbuild; sudo alien -d ./RPMS/x86_64/diagnose-tools*.rpm endif endif
看一下./rebuild/rpmbuild.sh文件
-
删除原有目录结构,建立目录结构(为了清空)
-
写一个文件diagnose-tools.spec,在rpm中,会根据spec中的文件内容来生成和安装软件包。
cat > $RPMBUILD_DIR/diagnose-tools.spec <<EOF .....(文件内容) EOF
-
构建软件包.rpm。该命令会根据.spec文件的内容去构建软件包,并存放在./rebuild/RPMS/$(uname -i)/目录下。
rpmbuild -bb $RPMBUILD_DIR/diagnose-tools.spec --define "%_topdir $RPMBUILD_DIR"
(2)all伪指令下安装软件包
删除原有安装;Ubuntu采用dpkg安装,其他采用rpm安装。
这里只了解了rpm,执行指令后会执行原.spec文件中%install中的内容。
all: module tools java_agent pkg ifneq ($(findstring Ubuntu,$(UNAME_A) $(shell test -e /etc/os-release && head -1 /etc/os-release)),) dpkg -P diagnose-tools || echo "remove diagnose-tools error" cd rpmbuild; sudo dpkg -i diagnose-tools*.deb else yum remove -y diagnose-tools yum localinstall -y rpmbuild/RPMS/${ARCH}/diagnose-tools-*.rpm diagnose-tools -v endif
(3)查看.spec文件内容
.spec文件内容是rpm软件包构建的核心,其实整个过程就是执行了这个代码。
%install mkdir -p $RPM_BUILD_ROOT/usr/diagnose-tools/ mkdir -p $RPM_BUILD_ROOT/usr/bin/ /bin/cp -rf /home/yj/project/diagnose-tools/build/lib $RPM_BUILD_ROOT/usr/diagnose-tools/ /bin/cp -rf /home/yj/project/diagnose-tools/build/bin $RPM_BUILD_ROOT/usr/diagnose-tools/ /bin/cp -rf /home/yj/project/diagnose-tools/rpmbuild/../SOURCE/diagnose-tools/diagnose-tools $RPM_BUILD_ROOT/usr/bin/ /bin/cp -rf /home/yj/project/diagnose-tools/rpmbuild/../prebuild/modules/* $RPM_BUILD_ROOT/usr/diagnose-tools/lib/ /bin/cp -rf /home/yj/project/diagnose-tools/rpmbuild/../SOURCE/diagnose-tools/java_agent/libperfmap.so $RPM_BUILD_ROOT/usr/diagnose-tools/ /bin/cp -rf /home/yj/project/diagnose-tools/rpmbuild/../SOURCE/perf-tools $RPM_BUILD_ROOT/usr/diagnose-tools/ /bin/cp -rf /home/yj/project/diagnose-tools/rpmbuild/../SOURCE/script/diagnose-tools.sh $RPM_BUILD_ROOT/usr/diagnose-tools/ ...
这里主要看%install的内容,可以看到:
-
创建了/usr/diagnose-tools目录,将一些脚本等文件放到里面了。
-
将tool生成的可执行文件diagnose-tools移动到了/usr/bin/,所以命令才可以不加路径执行。