某些应用程序包含由位于/ 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中。所以这行不通,而且我看不到有什么好的方法可以使它工作。