diff options
author | Etienne Dechamps <[email protected]> | 2012-07-09 11:23:00 +0200 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2012-07-26 13:45:09 -0700 |
commit | 2ee4a18b2ac9c155e099db06cec320bd8cee3150 (patch) | |
tree | 42add2d10f2756abb57225f56b582371dc8beb77 /copy-builtin | |
parent | 705741827ab55e7d92c3eb74f332a5ddd24971b5 (diff) |
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 <[email protected]>
Issue #851
Diffstat (limited to 'copy-builtin')
-rwxr-xr-x | copy-builtin | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/copy-builtin b/copy-builtin new file mode 100755 index 000000000..a053fd8a3 --- /dev/null +++ b/copy-builtin @@ -0,0 +1,121 @@ +#!/bin/bash + +set -e + +usage() +{ + echo "usage: $0 <kernel source tree>" >&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 |