Gcc Makefile中的ccflag选项

Gcc Makefile中的ccflag选项,gcc,makefile,linux-kernel,kernel-module,kbuild,Gcc,Makefile,Linux Kernel,Kernel Module,Kbuild,我想编译我的c代码(在内核中),它需要包含来自另一个目录的一些头文件 我希望在Makefile中指定include路径,而不是在c文件中指定头文件的完整路径 启用配置选项config\u FEATURE\u X时,我的c文件将被编译。 我在Makefile中编写了以下内容: obj-$(CONFIG_FEATURE_X) += my_file.o ccflags-$(CONFIG_FEATURE_X) += -I$(obj)/../../path 当使用make menuconfig在.CO

我想编译我的c代码(在内核中),它需要包含来自另一个目录的一些头文件

我希望在Makefile中指定include路径,而不是在c文件中指定头文件的完整路径

启用配置选项
config\u FEATURE\u X
时,我的c文件将被编译。 我在Makefile中编写了以下内容:

obj-$(CONFIG_FEATURE_X) += my_file.o

ccflags-$(CONFIG_FEATURE_X) += -I$(obj)/../../path
  • 当使用make menuconfig在.CONFIG中启用(Y)配置功能时,它工作正常

  • 但是当.CONFIG中的
    CONFIG_功能_X
    作为模块(m)启用时,这不包括指定路径中的头文件,并导致文件未找到错误

  • 我该怎么做

    当使用make menuconfig在.CONFIG中启用(Y)配置功能时,它可以正常工作

    那是因为

    ccflags-$(CONFIG_FEATURE_X) += -I$(obj)/../../path  
    
    ccflags-$(CONFIG_FEATURE_X) += -I$(obj)/../../path  
    
    将评估为

    ccflags-y += -I$(obj)/../../path
    
    ccflags-m += -I$(obj)/../../path
    
    根据:

    因此,您已经为内置案例定义了一个有效的编译标志


    但是,当CONFIG_功能_X作为.CONFIG中的模块(m)启用时,这不包括来自指定路径的头文件,并导致文件未找到错误

    那是因为

    ccflags-$(CONFIG_FEATURE_X) += -I$(obj)/../../path  
    
    ccflags-$(CONFIG_FEATURE_X) += -I$(obj)/../../path  
    
    将评估为

    ccflags-y += -I$(obj)/../../path
    
    ccflags-m += -I$(obj)/../../path
    
    根据的当前版本,没有“ccflags-m”这样的编译标志。
    因此,路径规范从未用于可加载模块


    我该怎么做

    您可以尝试使用CFLAGS_$@,这是$(CC)的每个文件选项,而不是ccflags-$()标志

    因此,在您的生成文件中

    CFLAGS_my_file.o =   -I$(obj)/../../path
    
    当使用make menuconfig在.CONFIG中启用(Y)配置功能时,它可以正常工作

    那是因为

    ccflags-$(CONFIG_FEATURE_X) += -I$(obj)/../../path  
    
    ccflags-$(CONFIG_FEATURE_X) += -I$(obj)/../../path  
    
    将评估为

    ccflags-y += -I$(obj)/../../path
    
    ccflags-m += -I$(obj)/../../path
    
    根据:

    因此,您已经为内置案例定义了一个有效的编译标志


    但是,当CONFIG_功能_X作为.CONFIG中的模块(m)启用时,这不包括来自指定路径的头文件,并导致文件未找到错误

    那是因为

    ccflags-$(CONFIG_FEATURE_X) += -I$(obj)/../../path  
    
    ccflags-$(CONFIG_FEATURE_X) += -I$(obj)/../../path  
    
    将评估为

    ccflags-y += -I$(obj)/../../path
    
    ccflags-m += -I$(obj)/../../path
    
    根据的当前版本,没有“ccflags-m”这样的编译标志。
    因此,路径规范从未用于可加载模块


    我该怎么做

    您可以尝试使用CFLAGS_$@,这是$(CC)的每个文件选项,而不是ccflags-$()标志

    因此,在您的生成文件中

    CFLAGS_my_file.o =   -I$(obj)/../../path
    
    如所述,似乎(根据)只支持
    ccflags-y
    变量,而不支持
    ccflags-m
    变量

    然而,为了让事情顺利进行,你可以使用“技巧”:

    完整代码:

    obj-$(CONFIG_FEATURE_X) += my_file.o
    
    ccflags-$(CONFIG_FEATURE_X) += -I$(obj)/../../path
    
    # After all, add content of 'ccflags-m' variable to 'ccflags-y' one.
    ccflags-y += ${ccflags-m}
    
    如所述,似乎(根据)只支持
    ccflags-y
    变量,而不支持
    ccflags-m
    变量

    然而,为了让事情顺利进行,你可以使用“技巧”:

    完整代码:

    obj-$(CONFIG_FEATURE_X) += my_file.o
    
    ccflags-$(CONFIG_FEATURE_X) += -I$(obj)/../../path
    
    # After all, add content of 'ccflags-m' variable to 'ccflags-y' one.
    ccflags-y += ${ccflags-m}
    

    如何在基于配置功能或配置功能模块的MAKEFILE中添加ccflags选项?是否可以在Makefile中同时使用这两个配置?如何基于CONFIG_FEATURE_X或CONFIG_FEATURE_X_模块在Makefile中添加ccflags选项?上游是否可以在Makefile中同时使用这两种配置?虽然文档只记录了
    ccflags-y
    ,但通过谷歌搜索
    ccflags-m
    可以发现2.6.39内核的changelog,它也记录了这些标志。但是,我不确定
    ccflags-m
    是否适用于最新内核。@Tsyvarev“我不确定ccflags-m是否适用于最新内核。”--无论如何,OP提供了一些证据表明它似乎不适用于他使用的内核版本。这个CFLAGS\u my_file.o=-I$(obj)/../path是否有效,如果my_file.c编译依赖于include路径?@UditAgarwal“这个CFLAGS_my_file.o=-I$(obj)/../../../../path工作”——内核文档建议这样做,但您是唯一拥有makefile和源代码的人。因此,您是必须测试它的人。您还可以使用
    subst
    将m转换为y。虽然文档仅说明
    ccflags-y
    ,但通过谷歌搜索
    ccflags-m
    会发现2.6.39内核的changelog,它也会说明这些标志。但是,我不确定
    ccflags-m
    是否适用于最新内核。@Tsyvarev“我不确定ccflags-m是否适用于最新内核。”--无论如何,OP提供了一些证据表明它似乎不适用于他使用的内核版本。这个CFLAGS\u my_file.o=-I$(obj)/../path是否有效,如果my_file.c编译依赖于include路径?@UditAgarwal“这个CFLAGS_my_file.o=-I$(obj)/../../../../path工作”——内核文档建议这样做,但您是唯一拥有makefile和源代码的人。所以你是必须测试它的人。你也可以使用
    subst
    将m转换为y。当有一行常规解决方案时,为什么要使用两行“技巧”呢?这个CFLAGS_my_file.o=-I$(obj)/../../../path有效吗,如果my_file.c编译依赖于包含路径,则@sawdust:Variable
    CFLAGS_$@
    将应用于单个源文件。所以,若可选组件(取决于某些选项)由10个文件组成,那个么您需要10行来分配CCFLAGS变量。无论可选组件中的文件数量如何,甚至无论可选组件的数量如何,“技巧”都需要额外的一行。所以它在某些情况下是有用的。@UditAgarwal:你的答案似乎是另一个。你能从这里删除注释吗(因为你已经为另一个答案添加了注释)?@Tsyvarev--很好,对于其他情况,这种方法可能有优势。当有一行常规解决方案时,为什么要使用两行“技巧”呢?这个CFLAGS_my_file.o=-I$(obj)/../../../path有效吗,如果my_file.c编译依赖于包含路径,则@sawdust:Variable
    CFLAGS_$@
    将应用于单个源文件。所以,如果可选组件(取决于某些选项)由10个fil组成