天天看點

編譯核心指定子產品,篩選目前子產品依賴的元件

關于核心子產品編譯的過程中,往往我們僅僅需要其中一個小的子產品,但是卻因為核心源碼的龐雜而止步與子產品依賴的篩選過程中。

為了更加便捷得對核心各個子產品進行管理,這裡提供一個小腳本來進行指定子產品相關得子產品留存,不相關的子產品代碼自動清除。

單獨對核心指定子產品進行編譯,主要使用如下指令:

在相對目錄為:​​

​../rpmbuild/BUILD/kernel-3.10.0-957.5.1.el7/linux-3.10.0-957.5.1.el7.x86_64​

​​的目錄下執行指令​

​make M=fs/ceph​

​​,M為指定子產品代碼的路徑,我這裡編譯的是ceph的核心子產品ceph.ko,是以指定路徑為​

​fs/ceph​

總體思路是:

  1. 重命名相對目錄下第一個檔案夾中的一個檔案或者檔案夾
  2. 編譯需要編譯的KO,如果目前驅動依賴備份的檔案夾,則會傳回編譯失敗;
  3. 編譯成功,則删除備份的檔案夾或者檔案

以下腳本的運作路徑同樣為以上的相對目錄下

PS:有一個檔案​​

​Module.symvers​

​可以提前備份,該檔案并不影響編譯,但影響最終的驅動資訊,它決定驅動的依賴和版本

#!/bin/bash

path=$1 #腳本輸入要編譯的驅動,僅支援篩選一個,如果要篩選多個,可以增加外層循環,一個一個嘗試

for i in `/usr/bin/ls`
do
  if [ -d "$i" ];then
    for j in `/usr/bin/ls $i` #核心驅動檔案夾僅為一級目錄,其次的目錄可以不用深入
    do 
      /bin/rm $path/*.o 2>/dev/null #編譯前将已存在的o二進制檔案删除,防止僅僅連結.o檔案
      /usr/bin/mv $i/$j $i/$j-bak  #重命名一個檔案夾或者檔案
      /usr/bin/make M=$path  #進行編譯
      if [ $? -ne 0 ];then
        /usr/bin/mv $i/"$j"-bak "$i"/"$j"
        echo -e "$i/$j is neccessary for $path\n " >> "$path"_necessary_file 
      else
        /bin/rm  $i/"$j"-bak 2>/dev/null
      fi
    done
  else #不為目錄的則檢測檔案是否被我們要編譯到驅動依賴
    /usr/bin/rm $path/*.o 2>/dev/null
    /usr/bin/mv $i/$j $i/"$j"-bak
    /usr/bin/make M=$path
    if [ $? -ne 0 ];then
      /usr/bin/mv $i/"$j"-bak $i/$j
      echo -e "$i/$j is neccessary for $path\n " >> "$path"_necessary_file 
    else
      /usr/bin/rm -r $i/"$j"-bak 2>/dev/null
    fi
  fi
done      
[root@node1 linux-3.10.0-957.5.1.el7.x86_64]# ls
arch                CREDITS             firmware         Kbuild                Makefile        REPORTING-BUGS    sound    vmlinux.id
block               crypto              fs               Kconfig               Makefile.qlock  samples           test     x509.genkey
centos-kpatch.x509  Documentation       hdrwarnings.txt  kernel                mm              scripts           test.sh
centos-ldup.x509    drivers             include          ldconfig-kernel.conf  Module.symvers  security          tools
configs             drivers.undef       init             lib                   net             signing_key.priv  usr
COPYING             extra_certificates  ipc              MAINTAINERS           README          signing_key.x509  virt      
[root@node1 linux-3.10.0-957.5.1.el7.x86_64]# ls
arch  fs  include  Makefile  Module.symvers  net  scripts  tools      

繼續閱讀