我有一个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.
...
西尔
答案 0 :(得分:1)
您似乎正在以GNUMake样式编写makefile,但实际上正在运行其他版本的Make。如果autoreconf调用的内容不明显,可以在makefile中插入一条规则:
dummy:
@echo using $(MAKE)
$(MAKE) -v
如果这个理论证明是正确的,你可以说服autoconf使用GNUMake,或者为它正在使用的版本写。