【问题标题】:How to edit Makefile to make it work with NetBeans remote build?如何编辑 Makefile 以使其与 NetBeans 远程构建一起使用?
【发布时间】:2021-03-10 16:04:05
【问题描述】:

我有这样的 Makefile:

obj-m += some_kernel_module.o
all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

当我从本地构建机器运行 make 时它可以工作(当我的当前目录是 /home/myaccount/src/some_kernel_module/ 时)。

但是,当我尝试在 Netbeans 中远程编译时,我收到了这个错误:

/usr/src/linux-headers-3.16.0-6-common/scripts/Makefile.build:44: /home/myaccount/Makefile: 没有这样的文件或目录

我猜这是因为我的 Makefile 中有 M=$(PWD),而 Netbeans Build Host 当前目录是我的主目录 (/home/myaccount) 而不是项目目录 /home/myaccount/src/some_kernel_module/)。

我该如何解决这个问题?


我手动输入了路径,它可以在本地和远程工作:

obj-m += some_kernel_module.o
all:
    make -C /lib/modules/$(shell uname -r)/build M=/home/myaccount/src/some_kernel_module/ modules
clean:
    make -C /lib/modules/$(shell uname -r)/build M=/home/myaccount/src/some_kernel_module/ clean

但这不是答案。我不想在我的 Makefile 中使用这个绝对路径。

【问题讨论】:

    标签: netbeans makefile


    【解决方案1】:

    我在这里找到了答案:

    How to get current relative directory of your Makefile?

    我必须像这样获取和存储 makefile 目录:

    THIS_DIR := $(dir $(abspath $(firstword $(MAKEFILE_LIST))))
    

    并使用它代替PWD(完整的Makefile):

    obj-m += some_kernel_module.o
    THIS_DIR := $(dir $(abspath $(firstword $(MAKEFILE_LIST))))
    all:
        $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(THIS_DIR) modules
    clean:
        $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(THIS_DIR) clean
    

    编辑:正如https://stackoverflow.com/users/939557/madscientist 在下面的 cmets 中建议的那样,我将 make 更改为 $(MAKE)

    【讨论】:

    • 在调用子制作时应始终使用$(MAKE),切勿使用make
    • @MadScientist 看来我读错了内核驱动程序教程...感谢您的建议。那是因为我们不想运行多个进程或类似的东西吗?
    • 是什么?使用$(MAKE)?这样(a)如果您运行gmake(或其他)而不是make,那么您的子品牌也是gmake,(b)所有适当的命令行标志和变量覆盖都传递给子品牌, (c) 为子制作正确设置并行构建。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 2021-01-07
    • 2012-11-22
    相关资源
    最近更新 更多