【发布时间】: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冲突。) -
更新了有关问题的更多详细信息。