| #!/bin/sh |
| |
| # Copyright (c) 2012 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| # Generates a header file with a system call table made up of "name", |
| # syscall_nr entries by including the build target <asm/unistd.h> and |
| # emitting the list of defines. Use of the compiler is needed to |
| # dereference the actual provider of syscall definitions. |
| # E.g., asm/unistd_32.h or asm/unistd_64.h, etc. |
| |
| set -e |
| |
| if [ $# -ne 1 ] && [ $# -ne 2 ]; then |
| echo "Usage: $(basename "$0") OUTFILE" |
| echo "Usage: $(basename "$0") CC OUTFILE" |
| exit 1 |
| fi |
| |
| if [ $# -eq 2 ]; then |
| CC="$1" |
| shift |
| fi |
| OUTFILE="$1" |
| |
| # sed expression which extracts system calls that are |
| # defined via asm/unistd.h. It converts them from: |
| # #define __NR_read foo |
| # to: |
| # #ifdef __NR_read |
| # { "read", __NR_read }, |
| # #endif |
| SED_MULTILINE='s/#define __(ARM_)?(NR_)([[:lower:]0-9_]*) (.*)$/#ifdef __\1\2\3\ |
| { "\1\3", __\1\2\3 },\ |
| #endif/g p;' |
| |
| cat <<-EOF > "${OUTFILE}" |
| /* GENERATED BY MAKEFILE */ |
| #include <stddef.h> |
| #include <asm/unistd.h> |
| #include "libsyscalls.h" |
| const struct syscall_entry syscall_table[] = { |
| $(echo '#include <asm/unistd.h>' | \ |
| ${CC} -dD - -E | sed -Ene "${SED_MULTILINE}") |
| { NULL, -1 }, |
| }; |
| EOF |