【问题标题】:Makefile.am - Manual target prerequisite + addprefix?Makefile.am - 手动目标先决条件 + addprefix?
【发布时间】:2010-11-12 18:33:06
【问题描述】:

我有一个自动工具项目,其中部分源代码是从网上动态下载的(因为 IP 权利阻止直接再分发)然后构建。

我有一个可以工作的 Makefile.am,但我对它的某些方面不满意。

这里是:

INCLUDES = $(all_includes) -I$(top_srcdir)/include -I$(top_builddir)
AM_CFLAGS = -fPIC -Wall ${SYMBOL_VISIBILITY}

LIBVERSION=0:0:0

REFSRC_PATH=refsrc
REFSRC_SRC=refsrc/dtx.c refsrc/globdefs.c refsrc/host.c refsrc/mathhalf.c refsrc/sp_enc.c refsrc/sp_rom.c refsrc/vad.c refsrc/err_conc.c refsrc/homing.c refsrc/mathdp31.c refsrc/sp_dec.c refsrc/sp_frm.c refsrc/sp_sfrm.c

${REFSRC_PATH}/.downloaded:
        ./fetch_sources.py "${REFSRC_PATH}"
        for f in `ls -1 "${REFSRC_PATH}"/*.{c,h}`; do   \
                sed -i -e"s/round/round_l2s/" "$$f";    \
        done
        touch $@

${REFSRC_PATH}/dtx.c: ${REFSRC_PATH}/.downloaded

lib_LTLIBRARIES = libgsmhr.la
libgsmhr_la_SOURCES = libgsmhr.c $(REFSRC_SRC)

clean-local:
        -rm -rf ${REFSRC_PATH}

所以本质上,libgsmhr.c 是我的主要包装器,然后我将源代码下载到 refsrc/ 子目录中并对其进行一些修补。

第一个问题是,在 REFSRC_SRC 中,我希望使用 $(addprefix ...) 而不是在每个 .c 文件前面重复 refsrc/。但这似乎不起作用,并且 autoreconf 有点抱怨。

失败详情(当从 REFSRC_SRC= 中移除 refsrc/ 前缀并在依赖列表上使用 $(addprefix ${REFSRC_PATH}/, ${REFSRC_SRC}) 时):

bash$ autoreconf -i
libgsmhr/Makefile.am:19: addprefix ${REFSRC_PATH}/, ${REFSRC_SRC}: non-POSIX variable name
libgsmhr/Makefile.am:19: (probably a GNU make extension)

(configure works fine)

bash$ make
...
make[2]: Entering directory `/tmp/ram/gapk.build/libgsmhr'
  CC     libgsmhr.lo
  CCLD   libgsmhr.la
make[2]: Leaving directory `/tmp/ram/gapk.build/libgsmhr'
...

(如您所见,它不包含任何下载的 .c 文件,甚至根本没有下载它们。编译工作是因为 libgsmhr.c 是一个不使用这些文件中的符号的存根然而)

第二个问题是这条规则:

${REFSRC_PATH}/dtx.c: ${REFSRC_PATH}/.downloaded

我必须明确列出第一个文件 (dtx.c) 而不是使用通配符,例如:

${REFSRC_PATH}/%.c: ${REFSRC_PATH}/.downloaded

如果我尝试使用通配符,那么 autoreconf 会报错,而且它也不起作用……(模式不匹配)。

失败详情:

bash$ autoreconf -i
libgsmhr/Makefile.am:16: `%'-style pattern rules are a GNU make extension

(configure works fine)

bash$ make
...
make[2]: *** No rule to make target `refsrc/dtx.c', needed by `dtx.lo'.  Stop.
...

西尔万

【问题讨论】:

  • 请更具体一点:显示来自 autoreconf 的消息,并显示发生了什么而不是正常工作。 (我很确定我知道您期望在这里发生什么,但故障模式并不明显。)
  • 顺便说一句,“for f in $(ls -1 "${REFSRC_PATH}"/*.{c,h})”可以变成“for f in "${REFSRC_PATH}"/*.{c,h}”。 (反引号改为$(...)以避免与Markdown冲突。)
  • 更新了有关问题的更多详细信息。

标签: makefile autotools


【解决方案1】:

您似乎正在编写 GNUMake 风格的 makefile,但实际上运行的是其他版本的 Make。如果 autoreconf 调用的内容不明显,您可以在 makefile 中插入一条规则:

dummy:
    @echo using $(MAKE)
    $(MAKE) -v

如果这个理论被证明是正确的,你可以说服 autoconf 使用 GNUMake,或者编写它正在使用的版本。

【讨论】:

  • 如果您要为 GNU Make 编写 Makefile,您需要小心,因为自动生成的 Makefile 是可移植的。你应该测试$(MAKE)实际上是configure.ac中的GNU Make。
  • 好吧,我并不特别想要 GNUMake 语法。如果有一种可移植的方式来实现我想要的,我宁愿使用它。
  • 另外,我只安装了 gnumake,所以它必须使用它... GNU Make 3.81 版权所有 (C) 2006 Free Software Foundation, Inc. 这是免费软件;查看复制条件的来源。没有保修;甚至不考虑适销性或特定用途的适用性。这个程序是为 x86_64-pc-linux-gnu 构建的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-01
  • 1970-01-01
  • 2020-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多