如何传递值之作,它被传递到C代码(How to pass a value to Make, whic

2019-09-21 17:27发布

我寻求帮助,让我的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; 任何的,即使可能在做什么呢?

顺便说一句,我读过有关Makefile文件,以及他们如何通过列出与标签(冒号)文件的工作,其次是他们的依赖。 但我不明白这个Makefile是如何工作以及为什么它会发出两条编译语句。 因此,一个简短的解释也将是有益的。

Answer 1:

为了调试和发行版本之间进行选择:

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

然后调用make:

make debug=1

编译与调试,或:

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


Answer 2:

例如生成文件:

...
CFLAGS = whatever
....
ifeq ("$(DEBUG)","yes")
CFLAGS += -DDEBUG=1
endif

有了这个,你可以运行make为:

make "DEBUG=yes"

基本上,你可以设置make命令行上的makefile变量。 您可以使用这些像在makefile任何其他变量,那么你也可以直接使用它们。

编辑:你必须要小心,虽然。 除非你照顾到appropiately命名目标文件,或使用不同的构建迪尔斯,运行make不同“调试”设置不会自动重新编译的事情。



Answer 3:

是的。

您可以使用gcc的-D选项来声明一个宏,在代码中使用它:

> gcc -DMYINT=8 foo.c

与foo.c的

int foo(void)
{
  int my = MYINT;
}

而在你的makefile使用:

CFLAGS    =    -DMYINT=$(MYINT)

与电话拨打:

> make MYINT=8


Answer 4:

达到你想要的一种方法是的值传递CFLAGS从外壳到你的makefile。

CFLAGS='-Wall -g -DDEBUG=1' make -e 

为你调试版本,或

CFLAGS='-Wall -g' make -e

用于非调试一个



Answer 5:

你可以指定你的CFLAGS变量作出这样:CFLAGS = -Wall -g -DDEBUG = 1

如果你运行make不带参数的命令,该CFLAGS将有一个默认值“-Wall -g -DDEBUG = 1”

而如果你运行make这样的:让CFLAGS = ' - DDEBUG = 0'

此命令将指定与值“-DDEBUG = 0”所分配的值将覆盖缺省值分配中生成文件的CFLAGS值



文章来源: How to pass a value to Make, which gets passed to C code
标签: c linux makefile