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