2012-07-05 44 views
1

假設有一個源文件a.c和一些函數func_a。我想根據某些功能定義調用func_a,並且還想將a.c包含在基於理想的相同功能定義的模塊中。有條件地包含kbuild中的源代碼

我總是存在(比如說main.c中),我可以像

#ifdef FEATURE_A 
func_a(); 
#endif 

,並在爲kbuild的模塊東西

OBJ模塊源

如此 - $(CONFIG_SAMPLE) + = sample.o 樣品的OBJ:= main.o utils.o

僅當FEATURE_A定義

,包括交流到樣品模塊

? ??

但這可能沒有意義,因爲一個是預處理器指令,另一個是編譯器/鏈接器/編譯指令。也許預處理器指令使用由kbuild定義的一些標誌的另一種方式更有意義?有什麼辦法可以做到這一點?

謝謝。

回答

1

我將指出如何支持的sysctl有條件包括NFS模塊在回答你的問題(我敢肯定還有其他的例子,但是這是我很熟悉):

內核配置系統維護一個文件 「在include/linux/autoconf.h」 暴露你的配置選項作爲C預處理器宏。因此,根據您是否配置了sysctl支持,以上列出的文件編譯方式不同。

如果sysctl的支持已啓用:頭 「包括/ LINUX/nfs_fs.h」 檢查宏CONFIG_SYSCTL,並聲明C函數nfs_register_sysctl()。這個函數在「fs/nfs/super.c」中調用。 Makefile(見nfs-y += sysctl.o)指示編譯系統在文件「fs/nfs/sysctl.c」中編譯到模塊中,該模塊定義了函數nfs_register_sysctl()

如果禁用了sysctl支持:頭文件「include/linux/nfs_fs。h「檢查宏CONFIG_SYSCTL並聲明預處理器宏nfs_register_sysctl()0。該宏在」fs/nfs/super.c「中用於繞過一些(死的)錯誤處理代碼.Makefile(見nfs-n += sysctl.o)不編譯或鏈接「fs/nfs/sysctl.c」。

1

請閱讀3.7 Compilation flags

據我所知,Kconfig選項和預處理宏之間存在鬆散的關係,在編譯時傳遞。內核開發人員需要定義在編譯期間使用哪些預處理器標誌。

例如在net/rds/Makefile

ccflags-$(CONFIG_RDS_DEBUG) :=  -DDEBUG 

這裏預處理標誌DEBUG也會在內核配置了的Kconfig選項CONFIG_RDS_DEBUG通過。