首页 > 解决方案 > 用于 C 和 C++ 编译的 Automake 宏中子 shell 调用(通过“反引号”)的目的

问题描述

某些 C 和 C++ IDE通过解析make. 所以他们基本上运行make -wnk,从所述日志中提取编译器调用(gcc -c -o file.o file.c)以及Entering directory .../Leaving directory ...消息,并基于此构建项目模型。这种 IDE 的一个值得注意的例子是NetBeans,当然还有其他的。

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

gcc -DHAVE_CONFIG_H   -I./linux/x86_64 -I./linux/x86_64 -I./linux -I./linux -I. -I.     -DIN_MPERS -DMPERS_IS_mx32 -I./mpers-mx32  -Wall -Wempty-body -Wformat-security -Wignored-qualifiers -Wimplicit-fallthrough=5 -Winit-self -Wlogical-op -Wmissing-parameter-type -Wnested-externs -Wold-style-declaration -Wold-style-definition -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' || echo './'`v4l2.c

因此,正在编译的每个源文件都在命令行中被引用为

`test -f 'file.c' || echo './'`file.c

这意味着只要文件存在于当前目录中(或者是常规文件的符号链接),它就会被编译为

gcc -c file.c

而一个不存在的文件被编译为

gcc -c ./file.c

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

再深入一点,我发现这样的 shell 结构Makefile.am首先不存在于文件中——只存在于Makefile.in's automakegenerate. 现在,看看/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%

问题

  1. 你能解释一下这种子shell调用的目的吗?
  2. 在构建项目模型时,是否可以安全地删除反引号之间的任何内容,或者是否有任何极端情况?

标签: cshellshgnu-makeautomake

解决方案


推荐阅读