">obj-y";或">xxx对象";标签可以手动写入Makefile中,如下所示:
obj-y += aaa.o bbb.o ccc.o ddd.o
xxx-objs += aaa.o bbb.o ccc.o ddd.o
当domakecmd时,它工作得很好。
但是!!!:当我更改此Makefile时,如下所示:
SRCS := $(wildcard *.c)
OBJS := $(foreach f,$(SRCS),$(f:%.c=%.o))
obj-y += $(OBJS)
不幸的是,这个Makefile不起作用!
我想知道为什么以及如何自动填充这些标签?
新问题:
此外,我在下面的答案中发现了一些url中的方法。我就是喜欢这样。但我遇到了一些奇怪的东西。我的文件\目录如下:
.
├── Makefile
├── moduleA
│ ├── a0.c
│ ├── a0.h
│ ├── a1.c
│ ├── a1.h
│ └── Makefile
└── moduleB
├── b0.c
├── b0.h
├── b1.c
├── b1.h
└── Makefile
顶级Makefile是:
dirs := $(shell ls -d */)
obj-y := moduleA/ moduleB/
all:
make -C common/
$(MAKE) -C /lib/modules/`uname -r`/build M=$(shell pwd) modules
$(foreach N,$(dirs),cat Module.symvers > $(N)Module.symvers;)
@make clean_this
clean_this:
rm -rf Module.symvers modules.order .tmp_versions .cache.mk
clean: clean_this
$(foreach N,$(dirs),make -C $(N) clean;)
和目录模块A:中的Makefile
MODULE_NAME += module-a
obj-m += $(MODULE_NAME).o
SRCS := $(notdir $(wildcard $M/*.c))
OBJS := $(SRCS:.c=.o)
$(MODULE_NAME)-objs += $(OBJS)
$(MODULE_NAME)-objs += ../common/libcommon.a
all:
$(MAKE) -C /lib/modules/`uname -r`/build M=$(shell pwd)
clean:
rm -rf *.o *.m* *.ko *.t* .*.t* *.s* *.o* .*_* .*cm .*.cmd .*.mk *.a .*.o.d
目录模块B中的Makefile也像这样:
MODULE_NAME += module-b
obj-m += $(MODULE_NAME).o
SRCS := $(notdir $(wildcard $M/*.c))
OBJS := $(SRCS:.c=.o)
$(MODULE_NAME)-objs += $(OBJS)
$(MODULE_NAME)-objs += ../common/libcommon.a
all:
$(MAKE) -C /lib/modules/`uname -r`/build M=$(shell pwd)
clean:
rm -rf *.o *.m* *.ko *.t* .*.t* *.s* *.o* .*_* .*cm .*.cmd .*.mk *.a .*.o.d
----------------------------------------------------------------------------
奇怪的事情,当我在subdirmoduleA或module B中执行make
命令时,所有事情都很好。
但是,当我在top dir中执行make
cmd时,结果*.ko不包含它真正需要的.o文件。
请参阅以下代码作为示例:我不确定linux内核模块makefile如何与通配符一起工作
SRCS := $(notdir $(wildcard $M/*.c))
#SRCS = $(wildcard *.c)
OBJS = $(SRCS:.c=.o)
obj-y += $(OBJS)