c - 用于 C 和 C++ 编译的 Automake 宏中子 shell 调用(通过“反引号”)的目的
问题描述
某些 C 和 C++ IDE通过解析make
. 所以他们基本上运行make -wnk
,从所述日志中提取编译器调用(gcc -c -o file.o file.c
)以及Entering directory ...
/Leaving directory ...
消息,并基于此构建项目模型。这种 IDE 的一个值得注意的例子是NetBeans,当然还有其他的。
现在,每当一个项目同时使用autoconf
andautomake
时,确切的命令行如下所示(取自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 automake
generate. 现在,看看/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调用的目的吗?
- 在构建项目模型时,是否可以安全地删除反引号之间的任何内容,或者是否有任何极端情况?
解决方案
推荐阅读
- javascript - react native在固定时间段内重新加载setInterval中的api数据
- python - 在 Azure 上使用 Jupyter Notebooks 使用 Active Directory 身份验证托管 Pytorch 环境
- c++ - 在构造函数上传递参数或在每个方法上传递它们
- docker - HTTP 客户端(声明式或低级)无法从 pod [Micronaut 1.1.4] 访问互联网
- python - 比较 CSV 并删除从第一个出现的所有重复项
- c# - 我可以在没有唯一外键的两个对象之间设置导航属性吗?
- python - Django:生产环境中的编码问题
- node.js - vue和node配置nginx
- c++ - epoll_ctl() 返回 EINVAL
- python - 键在字典 python 中显示为 nan