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
ます。現在、2 つの別個のコンパイル行があり、必要に応じてコメントとコメント解除を行っています。これが私の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でもそれは可能ですか?
余談ですが、私は Makefiles と、それらがどのように機能するかについて、ラベル (コロン) を付けてファイルをリストし、その後に依存関係を続ける方法について読んだことがあります。しかし、この Makefile がどのように機能するのか、または 2 つのコンパイル ステートメントを発行する理由がわかりません。そのため、簡単な説明も役立ちます。