Home | History | Annotate | Download | only in tools
      1 #!/bin/bash
      2 #
      3 # Copyright (C) 2013 The Android Open Source Project
      4 #
      5 # Licensed under the Apache License, Version 2.0 (the "License");
      6 # you may not use this file except in compliance with the License.
      7 # You may obtain a copy of the License at
      8 #
      9 #      http://www.apache.org/licenses/LICENSE-2.0
     10 #
     11 # Unless required by applicable law or agreed to in writing, software
     12 # distributed under the License is distributed on an "AS IS" BASIS,
     13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14 # See the License for the specific language governing permissions and
     15 # limitations under the License.
     16 
     17 ###  Usage: generate_uapi_headers.sh [<options>]
     18 ###
     19 ###  This script is used to get a copy of the uapi kernel headers
     20 ###  from an android kernel tree and copies them into an android source
     21 ###  tree without any processing. The script also creates all of the
     22 ###  generated headers and copies them into the android source tree.
     23 ###
     24 ###  Options:
     25 ###   --skip-generation
     26 ###     Skip the step that generates all of the include files.
     27 ###   --download-kernel
     28 ###     Automatically create a temporary git repository and check out the
     29 ###     Android kernel source code.
     30 ###   --use-kernel-dir <DIR>
     31 ###     Do not check out the kernel source, use the kernel directory
     32 ###     pointed to by <DIR>.
     33 
     34 # Terminate the script if any command fails.
     35 set -eE
     36 
     37 TMPDIR=""
     38 ANDROID_DIR=""
     39 KERNEL_VERSION="android-3.10"
     40 KERNEL_DIR=""
     41 KERNEL_DOWNLOAD=0
     42 ARCH_LIST=("arm" "arm64" "mips" "x86")
     43 ANDROID_KERNEL_DIR="external/kernel-headers/original"
     44 SKIP_GENERATION=0
     45 
     46 function cleanup () {
     47   if [[ "${TMPDIR}" =~ /tmp ]] && [[ -d "${TMPDIR}" ]]; then
     48     echo "Removing temporary directory ${TMPDIR}"
     49     rm -rf "${TMPDIR}"
     50     TMPDIR=""
     51   fi
     52 }
     53 
     54 function usage () {
     55   grep '^###' $0 | sed -e 's/^###//'
     56 }
     57 
     58 function copy_hdrs () {
     59   local src_dir=$1
     60   local tgt_dir=$2
     61   local dont_copy_dirs=$3
     62 
     63   mkdir -p ${tgt_dir}
     64 
     65   local search_dirs=()
     66 
     67   # This only works if none of the filenames have spaces.
     68   for file in $(ls -d ${src_dir}/* 2> /dev/null); do
     69     if [[ -d "${file}" ]]; then
     70       search_dirs+=("${file}")
     71     elif [[ -f  "${file}" ]] && [[ "${file}" =~ .h$ ]]; then
     72       cp ${file} ${tgt_dir}
     73     fi
     74   done
     75 
     76   if [[ "${dont_copy_dirs}" == "" ]]; then
     77     for dir in "${search_dirs[@]}"; do
     78       copy_hdrs "${dir}" ${tgt_dir}/$(basename ${dir})
     79     done
     80   fi
     81 }
     82 
     83 function copy_if_exists () {
     84   local check_dir=$1
     85   local src_dir=$2
     86   local tgt_dir=$3
     87 
     88   mkdir -p ${tgt_dir}
     89 
     90   # This only works if none of the filenames have spaces.
     91   for file in $(ls -d ${src_dir}/* 2> /dev/null); do
     92     if [[ -f  "${file}" ]] && [[ "${file}" =~ .h$ ]]; then
     93       # Check that this file exists in check_dir.
     94       header=$(basename ${file})
     95       if [[ -f "${check_dir}/${header}" ]]; then
     96         cp ${file} ${tgt_dir}
     97       fi
     98     fi
     99   done
    100 }
    101 
    102 trap cleanup EXIT
    103 # This automatically triggers a call to cleanup.
    104 trap "exit 1" HUP INT TERM TSTP
    105 
    106 while [ $# -gt 0 ]; do
    107   case "$1" in
    108     "--skip-generation")
    109       SKIP_GENERATION=1
    110       ;;
    111     "--download-kernel")
    112       KERNEL_DOWNLOAD=1
    113       ;;
    114     "--use-kernel-dir")
    115       if [[ $# -lt 2 ]]; then
    116         echo "--use-kernel-dir requires an argument."
    117         exit 1
    118       fi
    119       shift
    120       KERNEL_DIR="$1"
    121       KERNEL_DOWNLOAD=0
    122       ;;
    123     "-h" | "--help")
    124       usage
    125       exit 1
    126       ;;
    127     "-"*)
    128       echo "Error: Unrecognized option $1"
    129       usage
    130       exit 1
    131       ;;
    132     *)
    133       echo "Error: Extra arguments on the command-line."
    134       usage
    135       exit 1
    136       ;;
    137   esac
    138   shift
    139 done
    140 
    141 ANDROID_KERNEL_DIR="${ANDROID_BUILD_TOP}/${ANDROID_KERNEL_DIR}"
    142 if [[ "${ANDROID_BUILD_TOP}" == "" ]]; then
    143   echo "ANDROID_BUILD_TOP is not set, did you run lunch?"
    144   exit 1
    145 elif [[ ! -d "${ANDROID_KERNEL_DIR}" ]]; then
    146   echo "${ANDROID_BUILD_TOP} doesn't appear to be the root of an android tree."
    147   echo "  ${ANDROID_KERNEL_DIR} is not a directory."
    148   exit 1
    149 fi
    150 
    151 if [[ -d "${KERNEL_DIR}/linux-stable" ]]; then
    152   src_dir="linux-stable"
    153 else
    154   src_dir="common"
    155 fi
    156 
    157 if [[ ${KERNEL_DOWNLOAD} -eq 1 ]]; then
    158   TMPDIR=$(mktemp -d /tmp/android_kernelXXXXXXXX)
    159   cd "${TMPDIR}"
    160   echo "Fetching android kernel source ${KERNEL_VERSION}"
    161   git clone https://android.googlesource.com/kernel/common.git
    162   cd "${COMMON}"
    163   git checkout "${KERNEL_VERSION}"
    164   KERNEL_DIR="${TMPDIR}"
    165 elif [[ "${KERNEL_DIR}" == "" ]]; then
    166   echo "Must specify one of --use-kernel-dir or --download-kernel."
    167   exit 1
    168 elif [[ ! -d "${KERNEL_DIR}" ]] || [[ ! -d "${KERNEL_DIR}/${src_dir}" ]]; then
    169   echo "The kernel directory $KERNEL_DIR or $KERNEL_DIR/${src_dir} does not exist."
    170   exit 1
    171 else
    172   cd "${KERNEL_DIR}/${src_dir}"
    173 fi
    174 
    175 if [[ ${SKIP_GENERATION} -eq 0 ]]; then
    176   # Build all of the generated headers.
    177   for arch in "${ARCH_LIST[@]}"; do
    178     echo "Generating headers for arch ${arch}"
    179     make ARCH=${arch} headers_install
    180   done
    181 fi
    182 
    183 # Copy all of the include/uapi files to the kernel headers uapi directory.
    184 copy_hdrs "${KERNEL_DIR}/${src_dir}/include/uapi" "${ANDROID_KERNEL_DIR}/uapi"
    185 
    186 # Copy the staging files to uapi/linux.
    187 copy_hdrs "${KERNEL_DIR}/${src_dir}/drivers/staging/android/uapi" \
    188           "${ANDROID_KERNEL_DIR}/uapi/linux" "no-copy-dirs"
    189 
    190 # Copy the generated headers.
    191 copy_hdrs "${KERNEL_DIR}/${src_dir}/include/generated/uapi" \
    192           "${ANDROID_KERNEL_DIR}/uapi"
    193 
    194 for arch in "${ARCH_LIST[@]}"; do
    195   # Copy arch headers.
    196   copy_hdrs "${KERNEL_DIR}/${src_dir}/arch/${arch}/include/uapi" \
    197             "${ANDROID_KERNEL_DIR}/uapi/asm-${arch}"
    198   # Copy the generated arch headers.
    199   copy_hdrs "${KERNEL_DIR}/${src_dir}/arch/${arch}/include/generated/uapi" \
    200             "${ANDROID_KERNEL_DIR}/uapi/asm-${arch}"
    201 
    202   # Special copy of generated header files from arch/<ARCH>/generated/asm that
    203   # also exist in uapi/asm-generic.
    204   copy_if_exists "${KERNEL_DIR}/${src_dir}/include/uapi/asm-generic" \
    205                  "${KERNEL_DIR}/${src_dir}/arch/${arch}/include/generated/asm" \
    206                  "${ANDROID_KERNEL_DIR}/uapi/asm-${arch}/asm"
    207 done
    208