某些应用程序包含由位于/ usr / libexec中的主应用程序运行的脚本。但是,autoconf脚本可以通过将--libexecdir传递给configure脚本来更改该目录。

例如,当在./configure源代码中运行git时,我可以将--libexecdir设置为所需的任何目录,该程序仍然可以运行。

为了使此功能正常工作,我需要添加什么到C++?换句话说,如何通过编译到程序中的配置脚本来设置目录名称?

最佳答案

您需要将@libexecdir@替换变量的值(例如Makefile.in中使用的值)公开给您的C++代码。最简单,最可靠的方法是在编译器命令行上使用-D开关来查找需要了解的目标文件:

foo.o: CPPFLAGS += -DLIBEXECDIR='"$(libexecdir)"'

然后在foo.cc中,LIBEXECDIR将是一个预处理器宏,扩展为具有所需路径的字符串常量。不过,有两个警告:上面的Makefile片段使用了GNU make功能target-specific variables。在其他Make实现中将无法使用。另外,在$(libexecdir)的扩展中,我也不用引号。完全防御性的报价如下所示:
foo.o: CPPFLAGS += \
  -DLIBEXECDIR='"$(subst ",\",$(subst ','\'',$(subst \,\\,$(libexecdir))))"'

如果您希望能够使用Windows路径名,那么肯定肯定至少需要最里面的$(subst ...)构造,而斜杠的方式却是错误的。人们通常不会在路径名中使用“或”,因此除非有人抱怨,否则我可能不会打扰外部两个。

对于不是@whatever@的任何AC_DEFINE替换变量,也可以使用相同的技术。

您可能认为您可以以某种方式使用AC_DEFINE_UNQUOTED$(libexecdir)的值转换为config.h,因此避免在命令行中 SCSS 。不幸的是,Autoconf在配置时并未完全计算其@*dir@替换的值:
# near the top of the generated 'configure':
exec_prefix=NONE
libexecdir='${exec_prefix}/libexec'

# much, much later -- as part of AC_OUTPUT:
test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'

因此,如果您使用AC_DEFINE_UNQUOTED做明显的事情,您将得到类似
#define LIBEXECDIR "${exec_prefix}/libexec"

在您的config.h中。所以这行不通,而且我看不到有什么好的方法可以使它工作。

09-04 13:14