Makefile.am - 手动目标先决条件+ addprefix?

时间:2010-11-12 18:33:07

标签: makefile autotools

我有一个autotool项目,其中部分源代码是从网上动态下载的(因为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.
...

西尔

1 个答案:

答案 0 :(得分:1)

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

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

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