1#!/bin/sh 2 3# Copyright (c) 2012 The Chromium OS Authors. All rights reserved. 4# Use of this source code is governed by a BSD-style license that can be 5# found in the LICENSE file. 6 7# Generates a header file with a system call table made up of "name", 8# syscall_nr entries by including the build target <asm/unistd.h> and 9# emitting the list of defines. Use of the compiler is needed to 10# dereference the actual provider of syscall definitions. 11# E.g., asm/unistd_32.h or asm/unistd_64.h, etc. 12 13set -e 14 15if [ $# -ne 1 ] && [ $# -ne 2 ]; then 16 echo "Usage: $(basename "$0") OUTFILE" 17 echo "Usage: $(basename "$0") CC OUTFILE" 18 exit 1 19fi 20 21if [ $# -eq 2 ]; then 22 CC="$1" 23 shift 24fi 25OUTFILE="$1" 26 27# Generate a dependency file which helps the build tool to see when it 28# should regenerate ${OUTFILE}. 29echo '#include <asm/unistd.h>' | ${CC} - -E -M -MF "${OUTFILE}.d.tmp" 30# Correct the output filename. 31(echo "${OUTFILE}: \\" ; sed -e 's/^-\.o://' -e 's/^-://' "${OUTFILE}.d.tmp") \ 32 > "${OUTFILE}.d" 33rm "${OUTFILE}.d.tmp" 34 35# sed expression which extracts system calls that are 36# defined via asm/unistd.h. It converts them from: 37# #define __NR_read foo 38# to: 39# #ifdef __NR_read 40# { "read", __NR_read }, 41# #endif 42SED_MULTILINE='s/#define __(ARM_)?(NR_)([[:lower:]0-9_]*) (.*)$/#ifdef __\1\2\3\ 43{ "\1\3", __\1\2\3 },\ 44#endif/g p;' 45 46cat <<-EOF > "${OUTFILE}" 47/* GENERATED BY MAKEFILE */ 48#include <stddef.h> 49#include <asm/unistd.h> 50#include "libsyscalls.h" 51const struct syscall_entry syscall_table[] = { 52$(echo '#include <asm/unistd.h>' | \ 53 ${CC} -dD - -E | sed -Ene "${SED_MULTILINE}") 54 { NULL, -1 }, 55}; 56EOF 57