OSDN Git Service

Script to grab uapi headers from android kernel.
authorChristopher Ferris <cferris@google.com>
Thu, 21 Nov 2013 03:52:56 +0000 (19:52 -0800)
committerChristopher Ferris <cferris@google.com>
Thu, 21 Nov 2013 22:09:54 +0000 (14:09 -0800)
Change-Id: Ia140e3ab27fbfee6b02f04c085f3e0e351bbe68d

libc/kernel/tools/generate_uapi_headers.sh [new file with mode: 0755]

diff --git a/libc/kernel/tools/generate_uapi_headers.sh b/libc/kernel/tools/generate_uapi_headers.sh
new file mode 100755 (executable)
index 0000000..2a85630
--- /dev/null
@@ -0,0 +1,180 @@
+#!/bin/bash
+#
+# Copyright (C) 2013 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+###  Usage: generate_uapi_headers.sh [<options>]
+###
+###  This script is used to get a copy of the uapi kernel headers
+###  from an android kernel tree and copies them into an android source
+###  tree without any processing. The script also creates all of the
+###  generated headers and copies them into the android source tree.
+###
+###  Options:
+###   --skip-generation
+###     Skip the step that generates all of the include files.
+###   --download-kernel
+###     Automatically create a temporary git repository and check out the
+###     Android kernel source code.
+###   --use-kernel-dir <DIR>
+###     Do not check out the kernel source, use the kernel directory
+###     pointed to by <DIR>.
+
+# Terminate the script if any command fails.
+set -eE
+
+TMPDIR=""
+ANDROID_DIR=""
+KERNEL_VERSION="android-3.10"
+KERNEL_DIR=""
+KERNEL_DOWNLOAD=0
+ARCH_LIST=("arm" "arm64" "mips" "x86")
+ANDROID_KERNEL_DIR="external/kernel-headers/original"
+SKIP_GENERATION=0
+
+function cleanup () {
+  if [[ "${TMPDIR}" =~ /tmp ]] && [[ -d "${TMPDIR}" ]]; then
+    echo "Removing temporary directory ${TMPDIR}"
+    rm -rf "${TMPDIR}"
+    TMPDIR=""
+  fi
+}
+
+function usage () {
+  grep '^###' $0 | sed -e 's/^###//'
+}
+
+function copy_hdrs () {
+  local src_dir=$1
+  local tgt_dir=$2
+  local dont_copy_dirs=$3
+
+  mkdir -p ${tgt_dir}
+
+  local search_dirs=()
+
+  # This only works if none of the filenames have spaces.
+  for file in $(ls -d ${src_dir}/* 2> /dev/null); do
+    if [[ -d "${file}" ]]; then
+      search_dirs+=("${file}")
+    elif [[ -f  "${file}" ]] && [[ "${file}" =~ .h$ ]]; then
+      cp ${file} ${tgt_dir}
+    fi
+  done
+
+  if [[ "${dont_copy_dirs}" == "" ]]; then
+    for dir in "${search_dirs[@]}"; do
+      copy_hdrs "${dir}" ${tgt_dir}/$(basename ${dir})
+    done
+  fi
+}
+
+trap cleanup EXIT
+# This automatically triggers a call to cleanup.
+trap "exit 1" HUP INT TERM TSTP
+
+while [ $# -gt 0 ]; do
+  case "$1" in
+    "--skip-generation")
+      SKIP_GENERATION=1
+      ;;
+    "--download-kernel")
+      KERNEL_DOWNLOAD=1
+      ;;
+    "--use-kernel-dir")
+      if [[ $# -lt 2 ]]; then
+        echo "--use-kernel-dir requires an argument."
+        exit 1
+      fi
+      shift
+      KERNEL_DIR="$1"
+      KERNEL_DOWNLOAD=0
+      ;;
+    "-h" | "--help")
+      usage
+      exit 1
+      ;;
+    "-"*)
+      echo "Error: Unrecognized option $1"
+      usage
+      exit 1
+      ;;
+    *)
+      echo "Error: Extra arguments on the command-line."
+      usage
+      exit 1
+      ;;
+  esac
+  shift
+done
+
+ANDROID_KERNEL_DIR="${ANDROID_BUILD_TOP}/${ANDROID_KERNEL_DIR}"
+if [[ "${ANDROID_BUILD_TOP}" == "" ]]; then
+  echo "ANDROID_BUILD_TOP is not set, did you run lunch?"
+  exit 1
+elif [[ ! -d "${ANDROID_KERNEL_DIR}" ]]; then
+  echo "${ANDROID_BUILD_TOP} doesn't appear to be the root of an android tree."
+  echo "  ${ANDROID_KERNEL_DIR} is not a directory."
+  exit 1
+fi
+
+if [[ ${KERNEL_DOWNLOAD} -eq 1 ]]; then
+  TMPDIR=$(mktemp -d /tmp/android_kernelXXXXXXXX)
+  cd "${TMPDIR}"
+  echo "Fetching android kernel source ${KERNEL_VERSION}"
+  git clone https://android.googlesource.com/kernel/common.git
+  cd common
+  git checkout "${KERNEL_VERSION}"
+  KERNEL_DIR="${TMPDIR}"
+elif [[ "${KERNEL_DIR}" == "" ]]; then
+  echo "Must specify one of --use-kernel-dir or --download-kernel."
+  exit 1
+elif [[ ! -d "${KERNEL_DIR}" ]] || [[ ! -d "${KERNEL_DIR}/common" ]]; then
+  echo "The kernel directory $KERNEL_DIR or $KERNEL_DIR/common does not exist."
+  exit 1
+else
+  cd "${KERNEL_DIR}/common"
+fi
+
+if [[ ${SKIP_GENERATION} -eq 0 ]]; then
+  # Build all of the generated headers.
+  for arch in "${ARCH_LIST[@]}"; do
+    echo "Generating headers for arch ${arch}"
+    make ARCH=${arch} headers_install
+  done
+fi
+
+# Copy all of the include/uapi files to the kernel headers uapi directory.
+copy_hdrs "${KERNEL_DIR}/common/include/uapi" "${ANDROID_KERNEL_DIR}/uapi"
+
+copy_hdrs "${KERNEL_DIR}/common/drivers/staging/android/uapi" \
+          "${ANDROID_KERNEL_DIR}/uapi/linux" "no-copy-dirs"
+
+copy_hdrs "${KERNEL_DIR}/common/include/generated/uapi" \
+          "${ANDROID_KERNEL_DIR}/uapi"
+
+for arch in "${ARCH_LIST[@]}"; do
+  if [[ "$arch" == "arm64" ]]; then
+    # The Android headers use aarch64 as the name of the 64 bit arm headers.
+    tgt_arch="asm-aarch64"
+  else
+    tgt_arch="asm-${arch}"
+  fi
+  # Copy arch headers first.
+  copy_hdrs "${KERNEL_DIR}/common/arch/${arch}/include/uapi" \
+            "${ANDROID_KERNEL_DIR}/uapi/${tgt_arch}"
+  # Copy the generated arch header files.
+  copy_hdrs "${KERNEL_DIR}/common/arch/${arch}/include/generated/uapi" \
+            "${ANDROID_KERNEL_DIR}/uapi/${tgt_arch}"
+done