English version

gccheaders

Une fonction Zsh intéressante, qui peut aussi être utilisée en tant que script: gccheaders. En résumé, voici ce qu'elle fait:

if [[ $# -eq 0 ]] then
  echo "Usage: gccheaders header_file | gcc_option ..." >&2
  return 1
fi
set -x
printf '#include <%s>\n' "${@:#-*}" | \
  "${CC:-gcc}" -H -E "${(M)@:#-*}" - 2>&1 >/dev/null

Le "${@:#-*}" permet de sélectionner les arguments ne commençant pas par un tiret: il s'agit d'en-têtes à inclure. La commande printf '#include <%s>\n' "${@:#-*}" génère ainsi un bout de code C, qui sera préprocessé (grâce à l'option -E) par gcc (ou autre commande indiquée par la variable d'environnement CC, qui peut être une autre version de gcc). L'option -H permet de sortir les noms de fichiers inclus, sur le flux d'erreur standard, que l'on redirige sur la sortie standard avec 2>&1; la sortie normale est supprimée avec >/dev/null. Le "${(M)@:#-*}" permet de sélectionner les arguments commençant par un tiret, qui sont utilisés comme autres options de gcc.

Voici un exemple d'utilisation de cette fonction Zsh:

$ gccheaders -std=c99 limits.h stdint.h
+gccheaders:13> printf '#include <%s>\n' limits.h stdint.h
+gccheaders:14> gcc -H -E '-std=c99' -
. /usr/lib/gcc/x86_64-linux-gnu/4.2.3/include/limits.h
.. /usr/lib/gcc/x86_64-linux-gnu/4.2.3/include/syslimits.h
... /usr/lib/gcc/x86_64-linux-gnu/4.2.3/include/limits.h
.... /usr/include/limits.h
..... /usr/include/features.h
...... /usr/include/sys/cdefs.h
....... /usr/include/bits/wordsize.h
...... /usr/include/gnu/stubs.h
....... /usr/include/bits/wordsize.h
....... /usr/include/gnu/stubs-64.h
. /usr/include/stdint.h
.. /usr/include/bits/wchar.h
.. /usr/include/bits/wordsize.h


webmaster@vinc17.org