如何将 autoconf 集成到内核 Makefile 中?
How to integrate autoconf into a kernel Makfile?
我有一个内核模块工程,在内核模块中使用autoconf生成Makefile文件。并且这样的 autoconf 使用破坏了树源代码构建中的内核,因为内核 Makefile 不支持 autoconf 因此无法为模块生成配置文件。有没有办法使内核 Makefile 和 autoconf 兼容?谢谢!
我过去经常使用的一个技巧是有两个 Makefile - 一个自动生成的一个和一个内核生成的,然后在 "make" 期间切换它们。
这是一个例子:
Makefile.am
## Process this file with automake to produce Makefile.in
## this is so that Automake includes the C compiling definitions, and
## includes the source files in the distribution.
## [@]kerneldir[@] is the kernel build directory.
## [@]kernelext[@] is the kernel module extension `ko`.
## [@]moduledir[@] is the module installation directory.
## [@]depmod[@] is the depmod program.
EXTRA_PROGRAMS = automake_dummy
automake_dummy_SOURCES = mymodule.c Makefile.kernel
generated_sources =
## there is no *just* object file support in automake. This is close enough
module_DATA = mymodule.o
export_objs = mymodule.o
# where the kernel build is located
KERNEL_LOCATION=@kerneldir@
MYMODULE_TOP_SRCDIR = @abs_top_srcdir@
MYMODULE_TOP_BUILDDIR = @abs_top_builddir@
MYMODULE_BUILDDIR = @abs_builddir@
# some magic for using linux kernel settings
# when compiling module(s)
MYMODULE_EXTRA_CFLAGS = -DEXPORT_SYMTAB $(DEFS) -I$(MYMODULE_BUILDDIR) \
-I$(MYMODULE_TOP_BUILDDIR) -I$(MYMODULE_TOP_SRCDIR)/include
export MYMODULE_EXTRA_CFLAGS KERNEL_LOCATION module_DATA export_objs
.PHONY: FORCE
$(automake_dummy_SOURCES): FORCE
@test "$(srcdir)" == "." || test -e "$@" || ln -vs "$(srcdir)/$@" .
# Add FORCE in case the kernel has changed.
$(module_DATA): $(generated_sources) $(automake_dummy_SOURCES) FORCE
mv Makefile Makefile.automake
cp Makefile.kernel Makefile
$(MAKE) -C $(KERNEL_LOCATION) SUBDIRS=$(MYMODULE_BUILDDIR) M=$(MYMODULE_BUILDDIR) modules
mv Makefile.automake Makefile
install-moduleDATA: $(module_DATA)
$(mkinstalldirs) $(DESTDIR)$(moduledir)
@list='$(module_DATA:.o=.@kernelext@)'; for p in $$list; do \
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
f="`echo $$p | sed -e 's|^.*/||'`"; \
echo " $(INSTALL_DATA) $$d$$p $(DESTDIR)$(moduledir)/$$f"; \
$(INSTALL_DATA) $$d$$p $(DESTDIR)$(moduledir)/$$f; \
done
uninstall-moduleDATA:
@list='$(module_DATA:.o=.@kernelext@)'; for p in $$list; do \
f="`echo $$p | sed -e 's|^.*/||'`"; \
echo " rm -f $(DESTDIR)$(moduledir)/$$f"; \
rm -f $(DESTDIR)$(moduledir)/$$f; \
done
if SANDBOXED
else
install-data-local: install-moduleDATA
-@depmod@ -a
endif
MOSTLYCLEANFILES = $(module_DATA) $(module_DATA:.o=.@kernelext@) \
Modules.symvers Module.symvers Module.markers modules.order
CLEANFILES = $(module_DATA:.o=.mod.c) $(generated_sources)
clean-local:
-rm -f .*.cmd .*.flags
-rm -rf .tmp_versions
-if test "$(srcdir)" != "."; then \
for f in $(automake_dummy_SOURCES); do \
if test "$$f" -ef "$(srcdir)/$$f"; then \
rm -f "$$f"; \
fi; \
done; \
fi
FORCE:
它使用了一些 automake 替换:
kerneldir
是内核构建目录,例如/lib/modules/${version}/build
kernelext
是模块扩展名,应该是ko
.
moduledir
为模块安装目录,如/lib/modules/${version}/extra
depmod
是 depmod 程序,例如由 AC_PATH_PROG(depmod, depmod, /sbin/depmod, $PATH:/sbin)
设置
(如果需要,您可以将 Makefile.am 中的所有 @kernelext@
实例替换为 ko
。)
可以根据需要调整 automake_dummy_SOURCES
、module_DATA
、export_objs
和 MYMODULE_EXTRA_CFLAGS
变量。
注意目标 $(module_DATA)
的规则如何在调用内核的 Makefile 之前和之后复制 Makefile。原来的 (automake-generated) Makefile 被重命名为 Makefile.automake,另一个 Makefile (Makefile.kernel) 被复制到它的位置。当 sub-make 没有错误地完成时,Makefile.automake 被移回 Makefile。当 sub-make 没有成功完成时,这不起作用,但由另一个 Makefile 处理。
Makefile.kernel
EXTRA_CFLAGS += $(MYMODULE_EXTRA_CFLAGS)
obj-m := $(module_DATA)
ifeq ($(VERSION).$(PATCHLEVEL), 2.4)
export-objs := $(export_objs)
endif
all mostlyclean clean maintainer-clean distclean:
$(warning **************************************************)
$(warning *** Makefile trick not undone, trying to recover *)
$(warning **************************************************)
mv Makefile.automake Makefile
$(MAKE) $@
# The following is needed for 2.5 kernels and also let's the makefile work
# when things get screwed.
ifneq (,$(wildcard $(KERNEL_LOCATION)/Rules.make))
include $(KERNEL_LOCATION)/Rules.make
endif
内核 automake-generated Makefile 规则将其重命名为 Makefile sub-make,之后又重命名回 Makefile.kernel。
all mostlyclean clean maintainer-clean distclean:
规则用于在先前的 make 以错误结束时进行恢复,留下 Makefile.kernel 代替 Makefile。它将原始 automake-generated Makefile(现在在 Makefile.automake 中)移回 Makefile 并自动再次运行 make。
我有一个内核模块工程,在内核模块中使用autoconf生成Makefile文件。并且这样的 autoconf 使用破坏了树源代码构建中的内核,因为内核 Makefile 不支持 autoconf 因此无法为模块生成配置文件。有没有办法使内核 Makefile 和 autoconf 兼容?谢谢!
我过去经常使用的一个技巧是有两个 Makefile - 一个自动生成的一个和一个内核生成的,然后在 "make" 期间切换它们。
这是一个例子:
Makefile.am
## Process this file with automake to produce Makefile.in
## this is so that Automake includes the C compiling definitions, and
## includes the source files in the distribution.
## [@]kerneldir[@] is the kernel build directory.
## [@]kernelext[@] is the kernel module extension `ko`.
## [@]moduledir[@] is the module installation directory.
## [@]depmod[@] is the depmod program.
EXTRA_PROGRAMS = automake_dummy
automake_dummy_SOURCES = mymodule.c Makefile.kernel
generated_sources =
## there is no *just* object file support in automake. This is close enough
module_DATA = mymodule.o
export_objs = mymodule.o
# where the kernel build is located
KERNEL_LOCATION=@kerneldir@
MYMODULE_TOP_SRCDIR = @abs_top_srcdir@
MYMODULE_TOP_BUILDDIR = @abs_top_builddir@
MYMODULE_BUILDDIR = @abs_builddir@
# some magic for using linux kernel settings
# when compiling module(s)
MYMODULE_EXTRA_CFLAGS = -DEXPORT_SYMTAB $(DEFS) -I$(MYMODULE_BUILDDIR) \
-I$(MYMODULE_TOP_BUILDDIR) -I$(MYMODULE_TOP_SRCDIR)/include
export MYMODULE_EXTRA_CFLAGS KERNEL_LOCATION module_DATA export_objs
.PHONY: FORCE
$(automake_dummy_SOURCES): FORCE
@test "$(srcdir)" == "." || test -e "$@" || ln -vs "$(srcdir)/$@" .
# Add FORCE in case the kernel has changed.
$(module_DATA): $(generated_sources) $(automake_dummy_SOURCES) FORCE
mv Makefile Makefile.automake
cp Makefile.kernel Makefile
$(MAKE) -C $(KERNEL_LOCATION) SUBDIRS=$(MYMODULE_BUILDDIR) M=$(MYMODULE_BUILDDIR) modules
mv Makefile.automake Makefile
install-moduleDATA: $(module_DATA)
$(mkinstalldirs) $(DESTDIR)$(moduledir)
@list='$(module_DATA:.o=.@kernelext@)'; for p in $$list; do \
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
f="`echo $$p | sed -e 's|^.*/||'`"; \
echo " $(INSTALL_DATA) $$d$$p $(DESTDIR)$(moduledir)/$$f"; \
$(INSTALL_DATA) $$d$$p $(DESTDIR)$(moduledir)/$$f; \
done
uninstall-moduleDATA:
@list='$(module_DATA:.o=.@kernelext@)'; for p in $$list; do \
f="`echo $$p | sed -e 's|^.*/||'`"; \
echo " rm -f $(DESTDIR)$(moduledir)/$$f"; \
rm -f $(DESTDIR)$(moduledir)/$$f; \
done
if SANDBOXED
else
install-data-local: install-moduleDATA
-@depmod@ -a
endif
MOSTLYCLEANFILES = $(module_DATA) $(module_DATA:.o=.@kernelext@) \
Modules.symvers Module.symvers Module.markers modules.order
CLEANFILES = $(module_DATA:.o=.mod.c) $(generated_sources)
clean-local:
-rm -f .*.cmd .*.flags
-rm -rf .tmp_versions
-if test "$(srcdir)" != "."; then \
for f in $(automake_dummy_SOURCES); do \
if test "$$f" -ef "$(srcdir)/$$f"; then \
rm -f "$$f"; \
fi; \
done; \
fi
FORCE:
它使用了一些 automake 替换:
kerneldir
是内核构建目录,例如/lib/modules/${version}/buildkernelext
是模块扩展名,应该是ko
.moduledir
为模块安装目录,如/lib/modules/${version}/extradepmod
是 depmod 程序,例如由AC_PATH_PROG(depmod, depmod, /sbin/depmod, $PATH:/sbin)
设置
(如果需要,您可以将 Makefile.am 中的所有 @kernelext@
实例替换为 ko
。)
可以根据需要调整 automake_dummy_SOURCES
、module_DATA
、export_objs
和 MYMODULE_EXTRA_CFLAGS
变量。
注意目标 $(module_DATA)
的规则如何在调用内核的 Makefile 之前和之后复制 Makefile。原来的 (automake-generated) Makefile 被重命名为 Makefile.automake,另一个 Makefile (Makefile.kernel) 被复制到它的位置。当 sub-make 没有错误地完成时,Makefile.automake 被移回 Makefile。当 sub-make 没有成功完成时,这不起作用,但由另一个 Makefile 处理。
Makefile.kernel
EXTRA_CFLAGS += $(MYMODULE_EXTRA_CFLAGS)
obj-m := $(module_DATA)
ifeq ($(VERSION).$(PATCHLEVEL), 2.4)
export-objs := $(export_objs)
endif
all mostlyclean clean maintainer-clean distclean:
$(warning **************************************************)
$(warning *** Makefile trick not undone, trying to recover *)
$(warning **************************************************)
mv Makefile.automake Makefile
$(MAKE) $@
# The following is needed for 2.5 kernels and also let's the makefile work
# when things get screwed.
ifneq (,$(wildcard $(KERNEL_LOCATION)/Rules.make))
include $(KERNEL_LOCATION)/Rules.make
endif
内核 automake-generated Makefile 规则将其重命名为 Makefile sub-make,之后又重命名回 Makefile.kernel。
all mostlyclean clean maintainer-clean distclean:
规则用于在先前的 make 以错误结束时进行恢复,留下 Makefile.kernel 代替 Makefile。它将原始 automake-generated Makefile(现在在 Makefile.automake 中)移回 Makefile 并自动再次运行 make。