C语言 使用autotools和automake在/var/lib创建目录结构



我在一个C项目上使用autotools,在安装后,需要在/var/lib中设置一个特定的目录结构,如下所示:

/var/lib/my-project/
    data/
    configurations/
        local/
        extra/
    inputs/

我目前使用指令AS_MKDIR_Pconfigure.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

相关内容

最新更新