[devel] pkg-config Requires.private - полчища саранчи и враги народа
Alexey Tourbin
at на altlinux.ru
Ср Мар 2 23:29:38 UTC 2011
On Sun, Feb 27, 2011 at 08:17:27PM +0300, Alexey Tourbin wrote:
> $ cpp `pkg-config --cflags xft` /usr/include/X11/Xft/Xft.h |grep ^# |head
> # 1 "/usr/include/X11/Xft/Xft.h"
> # 1 "<built-in>"
> # 1 "<command-line>"
> # 1 "/usr/include/X11/Xft/Xft.h"
> # 38 "/usr/include/X11/Xft/Xft.h"
> # 1 "/usr/lib64/gcc/x86_64-alt-linux/4.5.1/include/stdarg.h" 1 3 4
> # 40 "/usr/lib64/gcc/x86_64-alt-linux/4.5.1/include/stdarg.h" 3 4
> # 102 "/usr/lib64/gcc/x86_64-alt-linux/4.5.1/include/stdarg.h" 3 4
> # 39 "/usr/include/X11/Xft/Xft.h" 2
> # 1 "/usr/include/ft2build.h" 1 3 4
>
> Здесь показан стек включаемых файлов (см. info cpp "Preprocessor Output").
> Соответственно, нам надо взять взять файлы на первом фрейме стека - это
> и будут реально включаемые файлы.
Обнаружил интересную особенность: если файл уже включен, то он может
не появиться на первом фрейме стека (в выводе cpp). Напр.
/usr/lib64/R/library/Matrix/include/Matrix.h
3 #include <Rdefines.h>
4 #include <Rconfig.h>
5 #include "cholmod.h"
cpp.req обнаружит только зависимость на Rdefines.h, т.к. Rdefines.h
в свою очередь включает Rconfig.h. При повторном включении Rconfig.h
даёт пустой вывод, и препроцессор его не аннотирует.
Что в принципе не очень хорошо. Но я не знаю другого способа вклиниться
в cpp, и судя по cpp(1) такого способа скорее всего просто нет. Проверил
cpp -H, он обладает таким же дефектом.
$ cpp -I/usr/include/R -H /usr/lib64/R/library/Matrix/include/Matrix.h 2>&1 >/dev/null |grep /R/
. /usr/include/R/Rdefines.h
.. /usr/include/R/R_ext/Memory.h
.. /usr/include/R/R_ext/RS.h
... /usr/include/R/Rconfig.h
... /usr/include/R/R_ext/Error.h
.. /usr/include/R/Rinternals.h
... /usr/include/R/R_ext/Arith.h
.... /usr/include/R/R_ext/libextern.h
... /usr/include/R/R_ext/Boolean.h
... /usr/include/R/R_ext/Complex.h
... /usr/include/R/R_ext/PrtUtil.h
.... /usr/include/R/R_ext/Print.h
... /usr/include/R/R_ext/Utils.h
... /usr/include/R/R_ext/libextern.h
. /usr/lib64/R/library/Matrix/include/cholmod.h
$
Подробная информация о списке рассылки Devel