]> granicus.if.org Git - strace/commitdiff
build: generate all union bpf_attr checks automatically
authorDmitry V. Levin <ldv@altlinux.org>
Mon, 2 Apr 2018 15:56:31 +0000 (15:56 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Wed, 4 Apr 2018 12:24:19 +0000 (12:24 +0000)
Rather than list by hand some members of union bpf_attr that we check
for availability, automatically list all members of union bpf_attr we
are aware of.

* m4/gen_bpf_attr_m4.sh: New file.
* bootstrap: Invoke it.
* configure.ac (AC_CHECK_HEADERS([linux/bpf.h])): Use st_BPF_ATTR.
* m4/.gitignore: New file.

bootstrap
configure.ac
m4/.gitignore [new file with mode: 0644]
m4/gen_bpf_attr_m4.sh [new file with mode: 0755]

index 71237ab24afd8ecfcd166e562fded28c173cb6db..448543af18b60314b61edd1a3af7fe84f24ad769 100755 (executable)
--- a/bootstrap
+++ b/bootstrap
@@ -1,5 +1,6 @@
 #!/bin/sh -eu
 
+./m4/gen_bpf_attr_m4.sh
 ./generate_mpers_am.sh
 ./xlat/gen.sh
 ./tests/gen_pure_executables.sh
index 89f3f559e255b7fd47b3ed6136f5d2c5232fe781..3f356969001cd4a3b7252117b271ecb8a4b7b020 100644 (file)
@@ -464,18 +464,7 @@ AC_CHECK_HEADERS([linux/input.h], [
        AC_CHECK_MEMBERS([struct input_absinfo.resolution],,, [#include <linux/input.h>])
 ])
 
-AC_CHECK_HEADERS([linux/bpf.h], [
-       AC_CHECK_MEMBERS(m4_normalize([
-               union bpf_attr.attach_flags,
-               union bpf_attr.bpf_fd,
-               union bpf_attr.flags,
-               union bpf_attr.info.info,
-               union bpf_attr.next_id,
-               union bpf_attr.numa_node,
-               union bpf_attr.prog_flags,
-               union bpf_attr.test.duration
-       ]),,, [#include <linux/bpf.h>])
-])
+AC_CHECK_HEADERS([linux/bpf.h], [st_BPF_ATTR])
 
 AC_CHECK_TYPES(m4_normalize([
        struct br_mdb_entry,
diff --git a/m4/.gitignore b/m4/.gitignore
new file mode 100644 (file)
index 0000000..654b3df
--- /dev/null
@@ -0,0 +1 @@
+bpf_attr.m4
diff --git a/m4/gen_bpf_attr_m4.sh b/m4/gen_bpf_attr_m4.sh
new file mode 100755 (executable)
index 0000000..f3dc307
--- /dev/null
@@ -0,0 +1,73 @@
+#!/bin/sh -efu
+# Copyright (c) 2018 Dmitry V. Levin <ldv@altlinux.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+# 3. The name of the author may not be used to endorse or promote products
+#    derived from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+input=bpf_attr.h
+output="${0%/*}"/bpf_attr.m4
+exec > "$output"
+
+cat <<EOF
+dnl Generated by $0 from $input; do not edit.
+AC_DEFUN([st_BPF_ATTR], [dnl
+       AC_CHECK_MEMBERS(m4_normalize([
+EOF
+
+fetch_structs()
+{
+       local name="${1:-}"
+       local name_re=
+       [ -z "$name" ] ||
+               name_re='\/\* '"$name"' \*\/ '
+
+       sed -n '/^struct BPF_[^[:space:]]\+_struct '"$name_re"'{/,/^};/p' < "$input"
+}
+
+filter_entries()
+{
+       local name="${1:-}"
+       local subtype=
+       [ -z "$name" ] ||
+               subtype=".$name"
+       local search='^[[:space:]]\+[^;]*[[:space:]]\([^[:space:];]\+\);$'
+       local replacement='\t\tunion bpf_attr'"$subtype"'.\1,'
+       sed -n "s/$search/$replacement/p" |
+               sort -u
+}
+
+# nameless structures in union bpf_attr
+fetch_structs |
+       filter_entries
+
+# named structures in union bpf_attr
+for name in $(sed -n 's/^struct BPF_[^[:space:]]\+_struct \/\* \([^[:space:]]\+\) \*\/ {.*/\1/p' < "$input"); do
+       fetch_structs "$name" |
+               filter_entries "$name"
+done
+
+cat <<'EOF'
+               union bpf_attr.dummy
+       ]),,, [#include <linux/bpf.h>])
+])
+EOF