作者 主題: 关于makefile的一些问题请教大家  (閱讀 662 次)

0 會員 與 1 訪客 正在閱讀本文。

875205504

  • 可愛的小學生
  • *
  • 文章數: 7
    • 檢視個人資料
关于makefile的一些问题请教大家
« 於: 2017-11-30 18:27 »
里面有几个知识点有点糊涂.请多指教!最好能够举一些简单的例子。谢谢~
1.使用后缀-objs、-y识别对象文件,这句话中识别对象文件是什么意思?
2.确定一个object文件是否是另一个object的组成部分,这个是通过什么判断出来的?
3.为什么例子中ext2.o只有xattr.o组成部分? balloc.o和bitmap.o没有编译吗?

875205504

  • 可愛的小學生
  • *
  • 文章數: 7
    • 檢視個人資料
Re: 关于makefile的一些问题请教大家
« 回覆 #1 於: 2017-12-02 00:10 »
 :'( :'(有没有好心人帮帮本小白啊~现在Linux论坛都好冷清啊....这个"只有"二字不理解啊,换成"包含"就好了,急死强迫症啊~~

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17342
    • 檢視個人資料
    • http://www.study-area.org
Re: 关于makefile的一些问题请教大家
« 回覆 #2 於: 2017-12-02 16:11 »
因爲不會,所以幫不上忙...

875205504

  • 可愛的小學生
  • *
  • 文章數: 7
    • 檢視個人資料
Re: 关于makefile的一些问题请教大家
« 回覆 #3 於: 2017-12-02 23:20 »
感动,有大佬回帖了 :'(,感谢。

rainday

  • 鑽研的研究生
  • *****
  • 文章數: 737
  • 性別: 男
  • enhancing and optimizing
    • 檢視個人資料
Re: 关于makefile的一些问题请教大家
« 回覆 #4 於: 2017-12-03 01:48 »
1. 在Kbuild例子中
ext2-y  <---  -y的前方字串是 ext2 即是識別對像

2. kernel 模組有些會是object有互相相依關係, 通常是source與header裡需要使用到的 , 像ext2目錄下的ext2.h
以我的kernel ext2為例子
ext2-y := balloc.o dir.o file.o ialloc.o inode.o \
          ioctl.o namei.o super.o symlink.o
則當ext2被勾選使用時, 則定義有關聯這些 .o

3. 當CONFIG_EXT2_FS_XATTR 項目有勾選使用時,則加入 xattr,o ,
XATTR與上一行的ext2-y 不是連動的, 而是照kernel .config 裡的CONFIG_XXXX 單獨判斷

所以全部的流程如下
勾選使用 CONFIG_EXT2_FS ,  加上 ext2.o
如果CONFIG_EXT2_FS有勾選 , 則延長定義 balloc.o bitmap.o
當CONFIG_EXT2_FS_XATTR 項目有勾選使用時,則再加入 xattr,o
所以都啟用勾選下, 有 ext2.o balloc.o bitmap.o xattr.o

+= 與 := 用法不同,請參照gnu make 手冊說明
« 上次編輯: 2017-12-03 01:58 由 rainday »
<0  =_=  Don't learn to hack , hack to learn.

875205504

  • 可愛的小學生
  • *
  • 文章數: 7
    • 檢視個人資料
Re: 关于makefile的一些问题请教大家
« 回覆 #5 於: 2017-12-03 11:26 »
Thanks♪(・ω・)ノ,感谢回复!!
所以當CONFIG_EXT2_FS_XATTR 項目有勾選使用時,图片中"ext2.o只有xattr.o组成部分"不准确,应该为"ext2.o含有xattr.o组成部分"吗?或者说"含有"也不准确,他们只是依赖链接关系?请问是不是这样理解。。
« 上次編輯: 2017-12-03 12:57 由 875205504 »

rainday

  • 鑽研的研究生
  • *****
  • 文章數: 737
  • 性別: 男
  • enhancing and optimizing
    • 檢視個人資料
Re: 关于makefile的一些问题请教大家
« 回覆 #6 於: 2017-12-05 04:05 »
是的,  所以才會用到 += 的以加入方式增加
以kernel buildin來說也不能說有錯, 畢竟文章裡只要有 CONFIG_EXT2_FS , 在ext2.o裡,就必定包含balloc.o bitmap.o , 無法改動部份當做為一體的
所以啟用CONFIG_EXT2_FS_XATTR 後,的確只有 "xattr.o" 做為 "組成" 部份
我猜想這文章可能是以build kernel 控制參數CONFIG_XXXX面向來說的
ext2這例子最後編繹只會輸出一個ext2.ko

實際操作下, 可以在build kernel時看到內容如下內容
test@test1:/usr/src/linux# make V=1 fs/ext2/ext2.ko
會看到詳細的compile內容
或是看單一部份
head fs/ext2/.xattr.o.cmd
cmd_fs/ext2/xattr.o := gcc -Wp,-MD,fs/ext2/.xattr.o.d  -nostdinc -isystem /usr/lib/gcc/i386-redhat-linux/4.1.2/include -I./arch/x86/include -I./arch/x86/include/generated  -I./include -I./arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I./include/uapi -I./include/generated/uapi -include ./include/linux/kconfig.h -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -fshort-wchar -Werror-implicit-function-declaration -Wno-format-security -std=gnu89 -fno-PIE -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -m32 -msoft-float -mregparm=3 -freg-struct-return -fno-pic -mpreferred-stack-boundary=2 -march=i686 -mtune=generic -Wa,-mtune=generic32 -ffreestanding -maccumulate-outgoing-args -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -DCONFIG_AS_CFI_SECTIONS=1 -DCONFIG_AS_SSSE3=1 -DCONFIG_AS_CRC32=1 -DCONFIG_AS_AVX=1 -DCONFIG_AS_AVX2=1 -DCONFIG_AS_AVX512=1 -DCONFIG_AS_SHA1_NI=1 -DCONFIG_AS_SHA256_NI=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -fno-delete-null-pointer-checks -O2 -fno-stack-protector -fno-omit-frame-pointer -fno-optimize-sibling-calls -Wdeclaration-after-statement -Wno-pointer-sign  -DMODULE  -DKBUILD_BASENAME='"xattr"'  -DKBUILD_MODNAME='"ext2"' -c -o fs/ext2/xattr.o fs/ext2/xattr.c
...
<0  =_=  Don't learn to hack , hack to learn.

darkranger

  • 榮譽學長
  • 俺是博士!
  • *****
  • 文章數: 1352
    • 檢視個人資料
    • http://darkranger.no-ip.org
Re: 关于makefile的一些问题请教大家
« 回覆 #7 於: 2017-12-05 09:34 »
這是哪一本書的內容?書名是什麼?

875205504

  • 可愛的小學生
  • *
  • 文章數: 7
    • 檢視個人資料
Re: 关于makefile的一些问题请教大家
« 回覆 #8 於: 2017-12-05 22:54 »
<ARM嵌入式Linux系统开发详解>清华大学出版社

875205504

  • 可愛的小學生
  • *
  • 文章數: 7
    • 檢視個人資料
Re: 关于makefile的一些问题请教大家
« 回覆 #9 於: 2017-12-05 23:05 »
问题解决~最后感谢大家!么么哒

darkranger

  • 榮譽學長
  • 俺是博士!
  • *****
  • 文章數: 1352
    • 檢視個人資料
    • http://darkranger.no-ip.org
Re: 关于makefile的一些问题请教大家
« 回覆 #10 於: 2017-12-06 10:36 »
<ARM嵌入式Linux系统开发详解>清华大学出版社
又一本清華大學出版社的垃圾....
在網路上可以找到一字不差的內容,例如:
https://wenku.baidu.com/view/3c1097d5b9f3f90f76c61b15.html?re=view
是翻譯自一份陳舊的 kernel 文件:
https://lwn.net/Articles/21835/

  Kbuild recognises objects used for composite objects by the suffix
   -objs, and the suffix -y. This allows the Makefiles to use
   the value of a CONFIG_ symbol to determine if an object is part
   of a composite object.

   Example:
      #fs/ext2/Makefile
           obj-$(CONFIG_EXT2_FS)        += ext2.o
       ext2-y                       := balloc.o bitmap.o
           ext2-$(CONFIG_EXT2_FS_XATTR) += xattr.o
   
   In this example xattr.o is only part of the composite object
   ext2.o, if $(CONFIG_EXT2_FS_XATTR) evaluates to 'y'.

   Note: Of course, when you are building objects into the kernel,
   the syntax above will also work. So, if you have CONFIG_EXT2_FS=y,
   kbuild will build an ext2.o file for you out of the individual
   parts and then link this into built-in.o, as you would expect.

正確的翻譯如下(請容許我多用繁體用語):
Kbuild 是使用後綴 -objs 及 -y 來識別哪些目的檔將作為合成目的檔。
這使 Makefile 能夠藉由 CONFIG_ 符號值,來判定某目的檔是否是合成目的檔的一部分。

在這項範例裡,若 $(CONFIG_EXT2_FS_XATTR) 為 'y',
xattr.o 才會成為合成目的檔 ext2.o 的一部分。

注意:當然,若你是將目的檔組建至內核裡,前述語法也同樣有效。
所以,如果你使用 CONFIG_EXT2_FS=y,kbuild 便會將多個部分組建成一個 ext2.o
並連結至 built-in.o,正如你所期待的結果。

至於最新的原文文件在此:
https://www.kernel.org/doc/Documentation/kbuild/makefiles.txt

   Due to kbuild recognizing $(<module_name>-y) for composite objects,
   you can use the value of a CONFIG_ symbol to optionally include an
   object file as part of a composite object.

   Example:
      #fs/ext2/Makefile
           obj-$(CONFIG_EXT2_FS) += ext2.o
            ext2-y := balloc.o dir.o file.o ialloc.o inode.o ioctl.o \
                       namei.o super.o symlink.o
           ext2-$(CONFIG_EXT2_FS_XATTR) += xattr.o xattr_user.o \
                                                xattr_trusted.o

   In this example, xattr.o, xattr_user.o and xattr_trusted.o are only
   part of the composite object ext2.o if $(CONFIG_EXT2_FS_XATTR)
   evaluates to 'y'.

   Note: Of course, when you are building objects into the kernel,
   the syntax above will also work. So, if you have CONFIG_EXT2_FS=y,
   kbuild will build an ext2.o file for you out of the individual
   parts and then link this into built-in.o, as you would expect.

對應翻譯如下:
由於 kbuild 會透過 $(<module_name>-y) 來識別合成目的檔,
所以你可以使用 CONFIG_ 符號值,來選擇性的指定某個目的檔,
是否將作為合成目的檔的一部分。

在這項範例裡,只有當 $(CONFIG_EXT2_FS_XATTR) 為 'y' 時,
xattr.o、xattr_user.o 及 xattr_trusted.o 才會成為 ext2.o 合成目的檔的一部分。

注意:當然,若你是將目的檔組建至內核裡,前述語法也同樣有效。
所以,如果你使用 CONFIG_EXT2_FS=y,kbuild 便會將多個部分組建成一個 ext2.o
並連結至 built-in.o,正如你所期待的結果。
« 上次編輯: 2017-12-06 13:32 由 darkranger »

rainday

  • 鑽研的研究生
  • *****
  • 文章數: 737
  • 性別: 男
  • enhancing and optimizing
    • 檢視個人資料
Re: 关于makefile的一些问题请教大家
« 回覆 #11 於: 2017-12-07 03:30 »
感謝大大提供翻譯及來源
有時看作者原文與前後文比較好理解
<0  =_=  Don't learn to hack , hack to learn.