我在一个C项目上使用autotools,在安装后,需要在/var/lib
中设置一个特定的目录结构,如下所示:
/var/lib/my-project/
data/
configurations/
local/
extra/
inputs/
我目前使用指令AS_MKDIR_P
在configure.ac
如下:
AS_MKDIR_P(/var/lib/my-project/data)
AS_MKDIR_P(/var/lib/my-project/configurations/local)
AS_MKDIR_P(/var/lib/my-project/configurations/extra)
AS_MKDIR_P(/var/lib/my-project/inputs)
但是它需要configure
脚本以root权限运行,我认为这不是要走的路。我认为创建此目录结构的指令需要在Makefile.am
中,以便make install
创建它们而不是configure
,但我不知道如何做到这一点。
你真的,真的,真的不想要指定/var/lib/my-project
。作为项目维护者,您有权指定相对路径,但用户可以更改DESTDIR或前缀。如果您忽略了DESTDIR和prefix,只是将文件安装在/var/lib
中,而不考虑用户的请求,那么您的包就是破碎的。它不仅仅是轻微损坏,而是完全无法使用。自动工具封装必须而不是指定绝对路径;这是针对下蒸汽包装商(即那些构建*。或*.deb或*. RPM。DMG或…)。您所需要做的就是在Makefile.am:
configdir = $(pkgdatadir)/configurations
localdir = $(configdir)/local
extradir = $(configdir)/extra
inputdir = $(pkgdatadir)/inputs
mydatadir = $(pkgdatadir)/data
config_DATA = cfg.txt
local_DATA = local.txt
extra_DATA = extra.txt
input_DATA = input.txt
mydata_DATA = data.txt
这将把input.txt
放在$(DESTDIR)$(pkgdatadir)/inputs
,等等。如果您希望最终路径为/var/lib/my-project
,那么您可以在配置时适当地指定datadir。例如:
$ CONFIG_SITE= ./configure --datadir=/var/lib > /dev/null
这将把/var/lib
分配给datadir
,这样pkgdatadir
将是/var/lib/my-project
,随后的make install DESTDIR=/path/to/foo
将把文件放在/path/to/foo/var/lib/my-package/
中。您的自动工具包必须遵守prefix
(对于这些文件,datadir
在这里实际上被显式赋值覆盖了)和DESTDIR之类的内容。指定路径(如/var/lib
)的适当时机是在运行configure脚本时。例如,您可以将这些选项添加到rpm规范文件或debian/rules中的configure脚本中,或者添加到包系统使用的任何文件中。自动工具提供了一个非常灵活的包装系统,可以很容易地被许多不同的包装系统使用(不幸的是,"包装"这个词;是高度重载的!)拥抱这种灵活性。
根据autotools文档(这里和这里),您可以在Makefile.am
中指定一些钩子,它们将在安装期间的特定时间运行。根据我的需要,我将使用install-exec-hook
(或install-data-hook
),它将在所有可执行文件(或数据)安装后运行:
install-exec-hook:
$(MKDIR_P) /var/lib/my-project/data
$(MKDIR_P) /var/lib/my-project/configurations/local
$(MKDIR_P) /var/lib/my-project/configurations/extra
$(MKDIR_P) /var/lib/my-project/inputs
MKDIR_P
是一个包含命令mkdir -p
的变量,如果系统没有mkdir
,则等于它。要使其在Makefile.am
中可用,您必须在configure.ac
中使用宏AC_PROG_MKDIR_P
。