如何将值传递给Make,它将传递给C代码

我正在寻找帮助让我的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是如何工作的,或者为什么它会发出两个编译语句.所以简短的解释也会有所帮助.

最佳答案
要在调试版和发行版之间进行选择:

ifeq($(debug),1)
  CFLAGS      = -Wall -g -DDEBUG=1
else
  CFLAGS      = -Wall -g
endif

然后调用make:

make debug=1

用DEBUG编译,或者:

make

无需调试即可编译.

对于初始化i:

#include <stdio.h>

#ifndef INIT_I
# define INIT_I 9
#endif
int main() {
  int i = INIT_I;
  return 0;
}

和makefile:

ifneq ($(init_i),)
CFLAGS = "-DINIT_I=$(init_i)"
endif

all:
  gcc d.c $(CFLAGS) -E

设置初始i:

make init_i=10

或使用默认值:

make

转载注明原文:如何将值传递给Make,它将传递给C代码 - 代码日志