diff options
author | NIIBE Yutaka <gniibe@fsij.org> | 2020-04-09 14:53:59 +0900 |
---|---|---|
committer | NIIBE Yutaka <gniibe@fsij.org> | 2020-04-09 14:53:59 +0900 |
commit | 50e62b36ea01ed25d12c443088b85d4f41a2b3e1 (patch) | |
tree | b0b717c743b778d5015a8dab672bd2ae3ab0eecb /src/gen-lock-obj.sh | |
parent | 98d11eff669c042d381ee4f18a42d32bcab256ef (diff) | |
download | libgpg-error-50e62b36ea01ed25d12c443088b85d4f41a2b3e1.tar.gz |
build: Add a shell script to generate lock-obj-pub.h.
* src/gen-lock-obj.sh: New.
Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
Diffstat (limited to 'src/gen-lock-obj.sh')
-rwxr-xr-x | src/gen-lock-obj.sh | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/src/gen-lock-obj.sh b/src/gen-lock-obj.sh new file mode 100755 index 0000000..13858cf --- /dev/null +++ b/src/gen-lock-obj.sh @@ -0,0 +1,112 @@ +#! /bin/sh +# +# gen-lock-obj.sh - Build tool to construct the lock object. +# +# Copyright (C) 2020 g10 Code GmbH +# +# This file is part of libgpg-error. +# +# libgpg-error is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 of +# the License, or (at your option) any later version. +# +# libgpg-error is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, see <https://www.gnu.org/licenses/>. +# + +# +# Following variables should be defined to invoke this script +# +# CC +# OBJDUMP +# AWK +# ac_ext +# ac_object +# host +# LOCK_ABI_VERSION +# +# An example: +# +# LOCK_ABI_VERSION=1 host=x86_64-pc-linux-gnu host_alias=x86_64-linux-gnu \ +# CC=$host_alias-gcc OBJDUMP=$host_alias-objdump ac_ext=c ac_objext=o \ +# AWK=gawk ./gen-lock-obj.sh +# + +AWK_VERSION_OUTPUT=$($AWK 'BEGIN { print PROCINFO["version"] }') +if test -n "$AWK_VERSION_OUTPUT"; then + # It's GNU awk, which supports PROCINFO. + AWK_OPTION=--non-decimal-data +fi + +cat <<'EOF' >conftest.$ac_ext +#include <pthread.h> +pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; +EOF + +if $CC -c conftest.$ac_ext; then : + ac_mtx_size=$($OBJDUMP -j .bss -t conftest.$ac_objext \ + | $AWK $AWK_OPTION ' +/mtx$/ { mtx_size = int("0x" $5) } +END { print mtx_size }') +else + echo "Can't determine mutex size" + exit 1 +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +cat <<EOF +## lock-obj-pub.$host.h +## File created by gen-lock-obj.sh - DO NOT EDIT +## To be included by mkheader into gpg-error.h + +typedef struct +{ + long _vers; + union { + volatile char _priv[$ac_mtx_size]; + long _x_align; + long *_xp_align; + } u; +} gpgrt_lock_t; + +EOF + +# FIXME: Support different alignment conditions of: +# +# USE_16BYTE_ALIGNMENT +# USE_DOUBLE_FOR_ALIGNMENT +# USE_LONG_DOUBLE_FOR_ALIGNMENT +# + +echo -n "#define GPGRT_LOCK_INITIALIZER {$LOCK_ABI_VERSION,{{" + +i=0 +while test "$i" -lt $ac_mtx_size; do + if test "$i" -ne 0 -a "$(( $i % 8 ))" -eq 0; then + echo ' \' + echo -n " " + fi + echo -n '0' + if test "$i" -lt $(($ac_mtx_size - 1)); then + echo -n ',' + fi + i=$(( i + 1 )) +done + +cat <<'EOF' +}}} +## +## Local Variables: +## mode: c +## buffer-read-only: t +## End: +## +EOF + +exit 0 |