From: Etienne Dechamps Date: Mon, 9 Jul 2012 09:23:00 +0000 (+0200) Subject: Add script for builtin module building. X-Git-Url: https://git.camperquake.de/gitweb.cgi?a=commitdiff_plain;ds=sidebyside;h=2ee4a18b2ac9c155e099db06cec320bd8cee3150;p=zfs.git Add script for builtin module building. This commit introduces a "copy-builtin" script designed to prepare a kernel source tree for building ZFS as a builtin module. The script makes a full copy of all needed files, thus making the kernel source tree fully independent of the zfs source package. To achieve that, some compilation flags (-include, -I) have been moved to module/Makefile. This Makefile is only used when compiling external modules; when compiling builtin modules, a Kbuild file generated by the configure-builtin script is used instead. This makes sure Makefiles inside the kernel source tree does not contain references to the zfs source package. Signed-off-by: Brian Behlendorf Issue #851 --- diff --git a/README.markdown b/README.markdown index 739370c..a8abb00 100644 --- a/README.markdown +++ b/README.markdown @@ -7,5 +7,11 @@ and ZVOL with a ZFS Posix Layer (ZPL) on the way! $ ./configure $ make pkg +To copy the kernel code inside your kernel source tree for builtin +compilation: + + $ ./configure --enable-linux-builtin --with-linux=/usr/src/linux-... + $ ./copy-builtin /usr/src/linux-... + Full documentation for building, configuring, and using ZFS can be found at: diff --git a/copy-builtin b/copy-builtin new file mode 100755 index 0000000..a053fd8 --- /dev/null +++ b/copy-builtin @@ -0,0 +1,121 @@ +#!/bin/bash + +set -e + +usage() +{ + echo "usage: $0 " >&2 + exit 1 +} + +[ "$#" -eq 1 ] || usage +KERNEL_DIR="$(readlink --canonicalize-existing "$1")" + +MODULES=() +for MODULE_DIR in module/* +do + [ -d "$MODULE_DIR" ] || continue + MODULES+=("${MODULE_DIR##*/}") +done + +if ! [ -e 'zfs_config.h' ] +then + echo >&2 + echo " $0: you did not run configure, or you're not in the ZFS source directory." >&2 + echo " $0: run configure with --with-linux=$KERNEL_DIR and --enable-linux-builtin." >&2 + echo >&2 + exit 1 +fi + +make clean || true + +rm -rf "$KERNEL_DIR/include/zfs" "$KERNEL_DIR/fs/zfs" +cp --recursive include "$KERNEL_DIR/include/zfs" +cp --recursive module "$KERNEL_DIR/fs/zfs" +cp zfs_config.h "$KERNEL_DIR/" + +adjust_obj_paths() +{ + local FILE="$1" + local LINE OBJPATH + + while IFS='' read -r LINE + do + OBJPATH="${LINE#\$(MODULE)-objs += }" + if [ "$OBJPATH" = "$LINE" ] + then + echo "$LINE" + else + echo "\$(MODULE)-objs += ${OBJPATH##*/}" + fi + done < "$FILE" > "$FILE.new" + mv "$FILE.new" "$FILE" +} + +for MODULE in "${MODULES[@]}" +do + adjust_obj_paths "$KERNEL_DIR/fs/zfs/$MODULE/Makefile" +done + +cat > "$KERNEL_DIR/fs/zfs/Kconfig" <<"EOF" +config ZFS + tristate "ZFS" + depends on SPL + help + This is the ZFS filesystem from the ZFS On Linux project. + + See http://zfsonlinux.org/ + + To compile this file system support as a module, choose M here. + + If unsure, say N. +EOF + +{ + cat <<-"EOF" + ZFS_MODULE_CFLAGS = -I$(srctree)/include/zfs -I$(srctree)/include/spl + ZFS_MODULE_CFLAGS += -include $(srctree)/spl_config.h -include $(srctree)/zfs_config.h + export ZFS_MODULE_CFLAGS + + obj-$(CONFIG_ZFS) := + EOF + + for MODULE in "${MODULES[@]}" + do + echo 'obj-$(CONFIG_ZFS) += ' "$MODULE/" + done +} > "$KERNEL_DIR/fs/zfs/Kbuild" + +add_after() +{ + local FILE="$1" + local MARKER="$2" + local NEW="$3" + local LINE + + while IFS='' read -r LINE + do + echo "$LINE" + + if [ -n "$MARKER" -a "$LINE" = "$MARKER" ] + then + echo "$NEW" + MARKER='' + if IFS='' read -r LINE + then + [ "$LINE" != "$NEW" ] && echo "$LINE" + fi + fi + done < "$FILE" > "$FILE.new" + + mv "$FILE.new" "$FILE" +} + +add_after "$KERNEL_DIR/fs/Kconfig" 'if BLOCK' 'source "fs/zfs/Kconfig"' +add_after "$KERNEL_DIR/fs/Makefile" 'endif' 'obj-$(CONFIG_ZFS) += zfs/' + +echo >&2 +echo " $0: done." >&2 +echo " $0: now you can build the kernel with ZFS support." >&2 +echo " $0: make sure you enable ZFS support (CONFIG_ZFS) before building." >&2 +echo >&2 diff --git a/module/Makefile.in b/module/Makefile.in index 50cbb58..c69b8a3 100644 --- a/module/Makefile.in +++ b/module/Makefile.in @@ -5,6 +5,11 @@ subdir-m += zcommon subdir-m += zfs subdir-m += zpios +ZFS_MODULE_CFLAGS += -include @SPL_OBJ@/spl_config.h +ZFS_MODULE_CFLAGS += -include @abs_top_builddir@/zfs_config.h +ZFS_MODULE_CFLAGS += -I@abs_top_srcdir@/include -I@SPL@/include -I@SPL@ +export ZFS_MODULE_CFLAGS + modules: @# Make the exported SPL symbols available to these modules. @# They may be in the root of SPL_OBJ when building against @@ -21,7 +26,7 @@ modules: "*** - @SPL_OBJ@/module/@SPL_SYMBOLS@\n"; \ exit 1; \ fi - $(MAKE) -C @LINUX_OBJ@ SUBDIRS=`pwd` @KERNELMAKE_PARAMS@ $@ + $(MAKE) -C @LINUX_OBJ@ SUBDIRS=`pwd` @KERNELMAKE_PARAMS@ CONFIG_ZFS=m $@ clean: @# Only cleanup the kernel build directories when CONFIG_KERNEL diff --git a/module/avl/Makefile.in b/module/avl/Makefile.in index efa4148..27f9e4a 100644 --- a/module/avl/Makefile.in +++ b/module/avl/Makefile.in @@ -1,10 +1,7 @@ MODULE := zavl -EXTRA_CFLAGS = @KERNELCPPFLAGS@ -EXTRA_CFLAGS += -include @SPL_OBJ@/spl_config.h -EXTRA_CFLAGS += -include @abs_top_builddir@/zfs_config.h -EXTRA_CFLAGS += -I@abs_top_srcdir@/include -I@SPL@/include -I@SPL@ +EXTRA_CFLAGS = $(ZFS_MODULE_CFLAGS) @KERNELCPPFLAGS@ -obj-m := $(MODULE).o +obj-$(CONFIG_ZFS) := $(MODULE).o $(MODULE)-objs += @top_srcdir@/module/avl/avl.o diff --git a/module/nvpair/Makefile.in b/module/nvpair/Makefile.in index 71c748e..b53381f 100644 --- a/module/nvpair/Makefile.in +++ b/module/nvpair/Makefile.in @@ -1,11 +1,8 @@ MODULE := znvpair -EXTRA_CFLAGS = @KERNELCPPFLAGS@ -EXTRA_CFLAGS += -include @SPL_OBJ@/spl_config.h -EXTRA_CFLAGS += -include @abs_top_builddir@/zfs_config.h -EXTRA_CFLAGS += -I@abs_top_srcdir@/include -I@SPL@/include -I@SPL@ +EXTRA_CFLAGS = $(ZFS_MODULE_CFLAGS) @KERNELCPPFLAGS@ -obj-m := $(MODULE).o +obj-$(CONFIG_ZFS) := $(MODULE).o $(MODULE)-objs += @top_srcdir@/module/nvpair/nvpair.o $(MODULE)-objs += @top_srcdir@/module/nvpair/nvpair_alloc_spl.o diff --git a/module/unicode/Makefile.in b/module/unicode/Makefile.in index 14a46b2..226e23b 100644 --- a/module/unicode/Makefile.in +++ b/module/unicode/Makefile.in @@ -1,11 +1,8 @@ MODULE := zunicode -EXTRA_CFLAGS = @KERNELCPPFLAGS@ -EXTRA_CFLAGS += -include @SPL_OBJ@/spl_config.h -EXTRA_CFLAGS += -include @abs_top_builddir@/zfs_config.h -EXTRA_CFLAGS += -I@abs_top_srcdir@/include -I@SPL@/include -I@SPL@ +EXTRA_CFLAGS = $(ZFS_MODULE_CFLAGS) @KERNELCPPFLAGS@ -obj-m := $(MODULE).o +obj-$(CONFIG_ZFS) := $(MODULE).o $(MODULE)-objs += @top_srcdir@/module/unicode/u8_textprep.o $(MODULE)-objs += @top_srcdir@/module/unicode/uconv.o diff --git a/module/zcommon/Makefile.in b/module/zcommon/Makefile.in index e564b77..d4f5ba7 100644 --- a/module/zcommon/Makefile.in +++ b/module/zcommon/Makefile.in @@ -1,11 +1,8 @@ MODULE := zcommon -EXTRA_CFLAGS = @KERNELCPPFLAGS@ -EXTRA_CFLAGS += -include @SPL_OBJ@/spl_config.h -EXTRA_CFLAGS += -include @abs_top_builddir@/zfs_config.h -EXTRA_CFLAGS += -I@abs_top_srcdir@/include -I@SPL@/include -I@SPL@ +EXTRA_CFLAGS = $(ZFS_MODULE_CFLAGS) @KERNELCPPFLAGS@ -obj-m := $(MODULE).o +obj-$(CONFIG_ZFS) := $(MODULE).o $(MODULE)-objs += @top_srcdir@/module/zcommon/zfs_deleg.o $(MODULE)-objs += @top_srcdir@/module/zcommon/zfs_prop.o diff --git a/module/zfs/Makefile.in b/module/zfs/Makefile.in index 5ec75a0..98576d1 100644 --- a/module/zfs/Makefile.in +++ b/module/zfs/Makefile.in @@ -1,11 +1,8 @@ MODULE := zfs -EXTRA_CFLAGS += @KERNELCPPFLAGS@ -EXTRA_CFLAGS += -include @SPL_OBJ@/spl_config.h -EXTRA_CFLAGS += -include @abs_top_builddir@/zfs_config.h -EXTRA_CFLAGS += -I@abs_top_srcdir@/include -I@SPL@/include -I@SPL@ +EXTRA_CFLAGS = $(ZFS_MODULE_CFLAGS) @KERNELCPPFLAGS@ -obj-m := $(MODULE).o +obj-$(CONFIG_ZFS) := $(MODULE).o $(MODULE)-objs += @top_srcdir@/module/zfs/arc.o $(MODULE)-objs += @top_srcdir@/module/zfs/bplist.o diff --git a/module/zpios/Makefile.in b/module/zpios/Makefile.in index 93a89a9..437bf22 100644 --- a/module/zpios/Makefile.in +++ b/module/zpios/Makefile.in @@ -1,10 +1,7 @@ MODULE := zpios -EXTRA_CFLAGS = @KERNELCPPFLAGS@ -EXTRA_CFLAGS += -include @SPL_OBJ@/spl_config.h -EXTRA_CFLAGS += -include @abs_top_builddir@/zfs_config.h -EXTRA_CFLAGS += -I@abs_top_srcdir@/include -I@SPL@/include -I@SPL@ +EXTRA_CFLAGS = $(ZFS_MODULE_CFLAGS) @KERNELCPPFLAGS@ -obj-m := $(MODULE).o +obj-$(CONFIG_ZFS) := $(MODULE).o $(MODULE)-objs += @top_srcdir@/module/zpios/pios.o