[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