在C和C+的自动生成宏中调用子shell(通过“backticks”)的目的+;汇编 < P>某些C和C++ IDE通过解析的输出,使支持基于GNU的项目。因此,他们基本上运行make-wnk,从所述日志中提取编译器调用(gcc-c-o file.o file.c)以及进入目录…/离开目录…消息,并基于此构建项目模型。这种IDE的一个显著例子是,当然还有其他的

在C和C+的自动生成宏中调用子shell(通过“backticks”)的目的+;汇编 < P>某些C和C++ IDE通过解析的输出,使支持基于GNU的项目。因此,他们基本上运行make-wnk,从所述日志中提取编译器调用(gcc-c-o file.o file.c)以及进入目录…/离开目录…消息,并基于此构建项目模型。这种IDE的一个显著例子是,当然还有其他的,c,shell,sh,gnu-make,automake,C,Shell,Sh,Gnu Make,Automake,现在,每当项目同时使用autoconf和automake时,确切的命令行如下所示(取自源代码): gcc-DHAVE\u CONFIG\u H-I./linux/x86\u 64-I./linux/x86\u 64-I./linux-I./linux-I-I-DIN\MPERS-DMPERS\u IS\u mx32-I./MPERS-mx32-Wall-Wempty-body-Wformat-security-wigned限定符-Wimplicit fallthrough=5-Winit sel

现在,每当项目同时使用
autoconf
automake
时,确切的命令行如下所示(取自源代码):

gcc-DHAVE\u CONFIG\u H-I./linux/x86\u 64-I./linux/x86\u 64-I./linux-I./linux-I-I-DIN\MPERS-DMPERS\u IS\u mx32-I./MPERS-mx32-Wall-Wempty-body-Wformat-security-wigned限定符-Wimplicit fallthrough=5-Winit self-Wlogical op-Wmissing参数类型-Wnested externs-Wold样式声明-Wold样式定义-Woverride init-Wsign compare-Wtype limits-Wwrite strings-Werror-g-O2-MT libmpers_mx32_a-v4l2.o-MD-MP-MF.deps/libmpers_mx32_a-v4l2.Tpo-c-o libmpers_mx32_a-v4l2.o`test-f'v4l2.c'.\124; echo'/`v4l2.c
因此,每个正在编译的源文件都在命令行上引用为

`test-f'file.c'| | echo'/'`file.c
这意味着只要文件在当前目录中存在(或是常规文件的符号链接),它就会编译为

gcc -c file.c
不存在的文件被编译为

gcc -c ./file.c
我觉得这可能与此有关,但无法正确解释。我问这个问题的原因是NetBeans(以及其他一些类似的工具)无法解析这样的命令行(带有反勾号和子shell调用),并且无法为基于
automake
的项目构建适当的项目模型

再深入一点,我发现这样的shell结构首先不存在于
Makefile.am
文件中——只存在于
Makefile.in
automake
生成中。现在,看看
/usr/share/automake-1.16/am/depend2.am
(确切路径可能会有所不同),以下是原始宏的定义:

?!GENERIC?      %VERBOSE%%COMPILE% -MT %OBJ% -MD -MP -MF %DEPBASE%.Tpo %-c% -o %OBJ% %SOURCEFLAG%`test -f '%SOURCE%' || echo '$(srcdir)/'`%SOURCE%
?-o?    %VERBOSE-NODEP%%COMPILE% %-c% %-o% %OBJ% %SOURCEFLAG%`test -f '%SOURCE%' || echo '$(srcdir)/'`%SOURCE%
?!-o?   %VERBOSE-NODEP%%COMPILE% %-c% %SOURCEFLAG%`test -f '%SOURCE%' || echo '$(srcdir)/'`%SOURCE%
?!GENERIC?      %VERBOSE%%LTCOMPILE% -MT %LTOBJ% -MD -MP -MF %DEPBASE%.Tpo %-c% -o %LTOBJ% %SOURCEFLAG%`test -f '%SOURCE%' || echo '$(srcdir)/'`%SOURCE%
?!GENERIC?      %VERBOSE-NODEP%%LTCOMPILE% %-c% -o %LTOBJ% %SOURCEFLAG%`test -f '%SOURCE%' || echo '$(srcdir)/'`%SOURCE%
问题
  • 你能解释一下这种子shell调用的目的吗
  • 在构建项目模型时,是否可以安全地删除背景标记之间的任何内容,或者是否存在任何转角情况

  • 当项目构建在与源代码所在位置不同的单独目录中时,它可能会起作用。尝试从源代码树外部运行
    configure
    。例如,创建一个单独的构建区域并运行
    mkdir build;cd-build/配置
    而不是通常的
    /configure
    。要求任何工具了解automake的输出可能都是徒劳的。在
    Makefile
    Makefile.in
    中有大量自动生成的垃圾和兼容性垫片。作为一个人,我只处理源文件:
    configure.ac
    Makefile.am
    。你说得对。例如,对于树内构建,将
    fchownat.c
    文件编译为
    $(test-f'fchownat.c'| | echo'/')fchownat.c
    ,其计算结果仅为
    fchownat.c
    ,而对于树外构建,同一文件现在编译为
    $(test-f'fchownat.c'| echo'../strace/)fchownat.c
    现在计算为
    。/strace/fchownat.c
    。约翰说了什么。20年前,我的工作围绕着autoconf和automake(为嵌入式Linux发行版移植和打包userland)。如果没有兼容的shell,我永远不会尝试编写执行其输出的程序;如果一个人真的必须做一些事情而不是按照设计执行它,那么最好(尽管不是很多)自己处理它的输入。NetBeans正在尝试在这里做一些事情。autoconf努力构建可笑的向后兼容输出。这意味着您所需要的工具(包括兼容POSIX的Shell——尽管autoconf也可以为Herelombourne构建输出)随处可见,包括Windows。我想不出一个好的理由为什么他们不使用真正的外壳。