]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - android-sdk/platform-bionic.git/blob - libc/kernel/tools/generate_uapi_headers.sh
Merge "make stack_protector_DeathTest work for gcc4.9"
[android-sdk/platform-bionic.git] / libc / kernel / tools / generate_uapi_headers.sh
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.
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>.
34 # Terminate the script if any command fails.
35 set -eE
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
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 }
54 function usage () {
55   grep '^###' $0 | sed -e 's/^###//'
56 }
58 function copy_hdrs () {
59   local src_dir=$1
60   local tgt_dir=$2
61   local dont_copy_dirs=$3
63   mkdir -p ${tgt_dir}
65   local search_dirs=()
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
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 }
83 function copy_if_exists () {
84   local check_dir=$1
85   local src_dir=$2
86   local tgt_dir=$3
88   mkdir -p ${tgt_dir}
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
102 trap cleanup EXIT
103 # This automatically triggers a call to cleanup.
104 trap "exit 1" HUP INT TERM TSTP
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
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
151 if [[ -d "${KERNEL_DIR}/linux-stable" ]]; then
152   src_dir="linux-stable"
153 else
154   src_dir="common"
155 fi
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 "${src_dir}"
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
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
183 cd ${ANDROID_BUILD_TOP}
185 # Copy all of the include/uapi files to the kernel headers uapi directory.
186 copy_hdrs "${KERNEL_DIR}/${src_dir}/include/uapi" "${ANDROID_KERNEL_DIR}/uapi"
188 # Copy the staging files to uapi/linux.
189 copy_hdrs "${KERNEL_DIR}/${src_dir}/drivers/staging/android/uapi" \
190           "${ANDROID_KERNEL_DIR}/uapi/linux" "no-copy-dirs"
192 # Copy the generated headers.
193 copy_hdrs "${KERNEL_DIR}/${src_dir}/include/generated/uapi" \
194           "${ANDROID_KERNEL_DIR}/uapi"
196 for arch in "${ARCH_LIST[@]}"; do
197   # Copy arch headers.
198   copy_hdrs "${KERNEL_DIR}/${src_dir}/arch/${arch}/include/uapi" \
199             "${ANDROID_KERNEL_DIR}/uapi/asm-${arch}"
200   # Copy the generated arch headers.
201   copy_hdrs "${KERNEL_DIR}/${src_dir}/arch/${arch}/include/generated/uapi" \
202             "${ANDROID_KERNEL_DIR}/uapi/asm-${arch}"
204   # Special copy of generated header files from arch/<ARCH>/generated/asm that
205   # also exist in uapi/asm-generic.
206   copy_if_exists "${KERNEL_DIR}/${src_dir}/include/uapi/asm-generic" \
207                  "${KERNEL_DIR}/${src_dir}/arch/${arch}/include/generated/asm" \
208                  "${ANDROID_KERNEL_DIR}/uapi/asm-${arch}/asm"
209 done