From c167aadb27d51b7be9ee7bd582e2795061a68480 Mon Sep 17 00:00:00 2001 From: Etienne Dechamps Date: Mon, 9 Jul 2012 11:10:31 +0200 Subject: [PATCH] Add script for builtin module building. This commit introduces a "copy-builtin" script designed to prepare a kernel source tree for building SPL as a builtin module. The script makes a full copy of all needed files, thus making the kernel source tree fully independent of the spl 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 spl source package. Signed-off-by: Brian Behlendorf Issue zfsonlinux/zfs#851 --- README.markdown | 6 ++ copy-builtin | 122 +++++++++++++++++++++++++++++++++++++++ module/Makefile.in | 6 +- module/spl/Makefile.in | 6 +- module/splat/Makefile.in | 6 +- 5 files changed, 137 insertions(+), 9 deletions(-) create mode 100755 copy-builtin diff --git a/README.markdown b/README.markdown index e0d8f76b..81535aa2 100644 --- a/README.markdown +++ b/README.markdown @@ -11,5 +11,11 @@ To build packages for your distribution: $ ./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 the SPL can be found at: diff --git a/copy-builtin b/copy-builtin new file mode 100755 index 00000000..3277270d --- /dev/null +++ b/copy-builtin @@ -0,0 +1,122 @@ +#!/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 'spl_config.h' ] +then + echo >&2 + echo " $0: you did not run configure, or you're not in the SPL 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/spl" "$KERNEL_DIR/spl" +cp --recursive include "$KERNEL_DIR/include/spl" +cp --recursive module "$KERNEL_DIR/spl" +cp spl_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/spl/$MODULE/Makefile" +done + +cat > "$KERNEL_DIR/spl/Kconfig" <<"EOF" +config SPL + tristate "Solaris Porting Layer (SPL)" + help + This is the SPL library from the ZFS On Linux project. + + See http://zfsonlinux.org/ + + To compile this library as a module, choose M here. + + If unsure, say N. +EOF + +{ + cat <<-"EOF" + SPL_MODULE_CFLAGS = -I$(srctree)/include/spl + SPL_MODULE_CFLAGS += -include $(srctree)/spl_config.h + export SPL_MODULE_CFLAGS + + obj-$(CONFIG_SPL) := + EOF + + for MODULE in "${MODULES[@]}" + do + echo 'obj-$(CONFIG_SPL) += ' "$MODULE/" + done +} > "$KERNEL_DIR/spl/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/Kconfig" 'source "arch/$SRCARCH/Kconfig"' 'source "spl/Kconfig"' +# We must take care to build SPL before ZFS, else module initialization order will be wrong +sed -i 's#kernel/ mm/ fs/#kernel/ mm/ spl/ fs/#' "$KERNEL_DIR/Makefile" + +echo >&2 +echo " $0: done." >&2 +echo " $0: now you can build the kernel with SPL support." >&2 +echo " $0: make sure you enable SPL support (CONFIG_SPL) before building." >&2 +echo >&2 + diff --git a/module/Makefile.in b/module/Makefile.in index 0a7fd02a..d291951f 100644 --- a/module/Makefile.in +++ b/module/Makefile.in @@ -3,8 +3,12 @@ subdir-m += splat INSTALL=/usr/bin/install +SPL_MODULE_CFLAGS = -I@abs_top_srcdir@/include +SPL_MODULE_CFLAGS += -include @abs_top_builddir@/spl_config.h +export SPL_MODULE_CFLAGS + modules: - $(MAKE) -C @LINUX_OBJ@ SUBDIRS=`pwd` @KERNELMAKE_PARAMS@ $@ + $(MAKE) -C @LINUX_OBJ@ SUBDIRS=`pwd` @KERNELMAKE_PARAMS@ CONFIG_SPL=m $@ clean: @# Only cleanup the kernel build directories when CONFIG_KERNEL diff --git a/module/spl/Makefile.in b/module/spl/Makefile.in index 7e8aac50..34b48012 100644 --- a/module/spl/Makefile.in +++ b/module/spl/Makefile.in @@ -1,12 +1,10 @@ # Makefile.in for spl kernel module MODULE := spl -EXTRA_CFLAGS = @KERNELCPPFLAGS@ -EXTRA_CFLAGS += -I@abs_top_srcdir@/include -EXTRA_CFLAGS += -include @abs_top_builddir@/spl_config.h +EXTRA_CFLAGS = $(SPL_MODULE_CFLAGS) @KERNELCPPFLAGS@ # Solaris porting layer module -obj-m := $(MODULE).o +obj-$(CONFIG_SPL) := $(MODULE).o $(MODULE)-objs += @top_srcdir@/module/spl/spl-debug.o $(MODULE)-objs += @top_srcdir@/module/spl/spl-proc.o diff --git a/module/splat/Makefile.in b/module/splat/Makefile.in index 05007d42..f4065196 100644 --- a/module/splat/Makefile.in +++ b/module/splat/Makefile.in @@ -1,12 +1,10 @@ # Makefile.in for splat kernel module MODULE := splat -EXTRA_CFLAGS = @KERNELCPPFLAGS@ -EXTRA_CFLAGS += -I@abs_top_srcdir@/include -EXTRA_CFLAGS += -include @abs_top_builddir@/spl_config.h +EXTRA_CFLAGS = $(SPL_MODULE_CFLAGS) @KERNELCPPFLAGS@ # Solaris Porting LAyer Tests -obj-m := $(MODULE).o +obj-$(CONFIG_SPL) := $(MODULE).o $(MODULE)-objs += @top_srcdir@/module/splat/splat-ctl.o $(MODULE)-objs += @top_srcdir@/module/splat/splat-kmem.o