【发布时间】:2012-08-21 18:53:45
【问题描述】:
我正在寻求帮助,让我的 Makefile 做我想做的事。
我已经弄清楚如何将预处理代码添加到我的 C 源代码中,只有在我为调试而编译时才会编译:
#if DEBUG
printf("main()\n");
{
/* Pauses execution so gdb can attach. */
int i=9;
pid_t PID;
char hostname[256];
gethostname(hostname, sizeof(hostname));
printf("PID %d on %s ready for attach.\n", PID=getpid(), hostname);
fflush(stdout);
while (i>0) {
sleep(5);
i--;
}
}
#endif
而且我发现如果我将-DDEBUG=1 添加到我的编译语句中,上面的代码将被编译(否则它不会被编译)。
接下来,我想向我的 Makefile 传递一个标志,该标志将包含或不包含 -D 选项。目前,我有两个单独的编译行,我酌情评论和取消评论。这是我的 Makefile(我从某人那里继承的,我很难理解)。看看上面写着CFLAGS?的行:
SHELL = /bin/sh
prefix = /home/schwarz/sundials/instdir
exec_prefix = ${prefix}
includedir = ${prefix}/include
libdir = ${exec_prefix}/lib
CPP = cc -E
CPPFLAGS =
CC = cc
# CFLAGS = -Wall -g
CFLAGS = -Wall -g -DDEBUG=1
# CFLAGS = -g -O2
LDFLAGS =
LIBS = -lm
MPICC = /usr/local/mpi/bin/mpicc
MPI_INC_DIR = /usr/local/mpi/bin/../include
MPI_LIB_DIR = /usr/local/mpi/bin/../lib
MPI_LIBS =
MPI_FLAGS =
INCLUDES = -I${includedir} -I${MPI_INC_DIR}
LIBRARIES = -lsundials_cvode -lsundials_nvecparallel ${LIBS}
LIBRARIES_BL =
EXAMPLES = FPU # cvAdvDiff_non_p cvDiurnal_kry_bbd_p cvDiurnal_kry_p
OBJECTS = ${EXAMPLES:=.o}
# -----------------------------------------------------------------------------------------
.SUFFIXES : .o .c
.c.o :
${MPICC} ${CPPFLAGS} ${CFLAGS} ${MPI_FLAGS} ${INCLUDES} -c $<
# -----------------------------------------------------------------------------------------
all: ${OBJECTS}
@for i in ${EXAMPLES} ; do \
echo "${MPICC} -o $${i} $${i}.o ${MPI_FLAGS} ${CFLAGS} ${LDFLAGS} -L${libdir} ${LIBRARIES} -L${MPI_LIB_DIR} ${MPI_LIBS} ${LIBRARIES_BL}" ; \
${MPICC} -o $${i} $${i}.o ${MPI_FLAGS} ${CFLAGS} ${LDFLAGS} -L${libdir} ${LIBRARIES} -L${MPI_LIB_DIR} ${MPI_LIBS} ${LIBRARIES_BL}; \
done
clean:
rm -f ${OBJECTS}
rm -f ${EXAMPLES}
我已经搜索过网络 - 我发誓! - 但无法弄清楚如何将参数传递到makefile。 如何设置我的 Makefile,以便它针对不同的编译需求对同一代码进行不同类型的编译? 如果我可以将特定值传递给 Makefile,这将传递一个编译的特定值,我可以用它来初始化代码中的i。 (IOW,我编译为make 8,C 编译为int i=8;)。在 Make 中是否有可能?
顺便说一句,我通过列出带有标签(冒号)的文件以及它们的依赖项来了解 Makefile 以及它们如何工作。但我不明白这个 Makefile 是如何工作的,或者为什么它会发出两个编译语句。因此,简短的解释也会有所帮助。
【问题讨论】:
-
您阅读过手册的this section 吗?另外,尽可能不要使用
=,而是使用:=。 -
@KerrekSB 很好的链接,虽然例子不多。我仍然需要如何将值传递给 make。谢谢。