更改makefile中的变量值

更改makefile中的变量值,makefile,Makefile,如何在makefile中动态更改变量值? 我想根据宏的值调用特定的目标 例如 STATIC_LIB = TRUE all: makelib $(var) makelib: ifeq (${STATIC_LIB}, TRUE) var=staticlib else var=sharedlib endif 这里我想根据target的值调用staticlib目标或sharedlib目标 代码: 后缀:.cpp.hpp #节目 SHELL=bash CC=g++ LD=LD RM=

如何在makefile中动态更改变量值? 我想根据宏的值调用特定的目标

例如

STATIC_LIB = TRUE

all: makelib $(var)

makelib:
ifeq (${STATIC_LIB}, TRUE)
    var=staticlib
else
    var=sharedlib
endif
这里我想根据target的值调用staticlib目标或sharedlib目标

代码:

后缀:.cpp.hpp
#节目
SHELL=bash
CC=g++
LD=LD
RM=RM
ECHO=/bin/ECHO
猫
PRINTF=PRINTF
SED=SED
氧当量=氧当量
静态_LIB=TRUE
######################################
#项目名称(使用此名称生成可执行文件)
目标=cs296_exe_28
#项目路径
PROJECT_ROOT=$(HOME)/Desktop/cs296/cs296_base_代码
外部根=$(项目根)/外部
SRCDIR=$(项目根)/src
OBJDIR=$(项目根)/myobjs
BINDIR=$(项目根)/mybins
LIBDIR=$(项目根)/mylibs
DOCDIR=$(项目根)/doc
#库路径
BOX2D_根=$(外部_根)
GLUI_根=/usr
GL_ROOT=/usr
#图书馆
LIBS=-lBox2D-lglui-lglut-lGLU-lGL
#编译器和链接器标志
CPPFLAGS=-g-O3-墙壁
CPPFLAGS+=-I$(BOX2D\u根)/include-I$(GLUI\u根)/include
LDFLAGS+=-L$(BOX2D\u根)/lib-L$(GLUI\u根)/lib
######################################
无颜色=\e[0m
OK_COLOR=\e[1;32m
ERR_COLOR=\e[1;31m
警告颜色=\e[1;33m
平均颜色=\e[1;34米
文件颜色=\e[1;37m
OK_STRING=“[OK]”
ERR_STRING=“[ERRORS]”
WARN_STRING=“[WARNINGS]”
OK_FMT=“${OK_COLOR}%30s\n${NO_COLOR}”
ERR_FMT=“${ERR_COLOR}%30s\n${NO_COLOR}”
WARN\u FMT=“${WARN\u COLOR}%30s\n${NO\u COLOR}”
######################################
SRCS:=$(通配符$(SRCDIR)/*.cpp)
增量:=$(通配符$(SRCDIR)/*.hpp)
OBJS:=$(SRCS:$(SRCDIR)/%.cpp=$(OBJDIR)/%.o)
OBJSNMAIN:=$(过滤掉$(OBJDIR)/main.o,$(OBJS))
.PHONY:所有设置文件都是干净的
ifndef静态库
makelib:sharedlib#第5行
else ifeq(${STATIC_LIB},TRUE)
makelib:staticlib#第7行
其他的
makelib:sharedlib#第9行
恩迪夫
全部:设置makelib exelib
设置:
@$(ECHO)“设置编译…”
@mkdir-pmyobjs
@mkdir-p mybins
@mkdir-p mylibs
$(BINDIR)/$(目标):$(OBJS)
@$(PRINTF)“$(MESG_颜色)构建可执行文件:$(无颜色)$(文件颜色)%16s$(无颜色)“$(notdir$@)”
@$(CC)-o$@$(LDFLAGS)$(OBJS)$(LIBS)2>temp.log| | touch temp.err
@如果测试-e温度错误\
然后$(PRINTF)$(ERR_FMT)$(ERR_STRING)和&$(CAT)temp.log\
elif试验——s温度记录\
然后$(PRINTF)$(WARN_FMT)$(WARN_STRING)和&$(CAT)temp.log\
else$(PRINTF)$(OK\u FMT)$(OK\u字符串)\
fi;
@$(RM)-f temp.log temp.err
-包括$(OBJS:.o=.d)
$(OBJS):$(OBJDIR)/%.o:$(SRCDIR)/%.cpp

@$(PRINTF)“$(MESG_COLOR)编译:$(NO_COLOR)$(FILE_COLOR)%25s$(NO_COLOR)“$(notdir$您提出的解决方案将不起作用,因为
$(var)
将在执行
makelib
之前进行评估

相反,您可以有条件地定义makelib:

STATIC_LIB = TRUE
all : makelib

ifndef STATIC_LIB
makelib : sharedlib # line 5
else ifeq (${STATIC_LIB}, TRUE)
makelib : staticlib # line 7
else
makelib : sharedlib # line 9
endif

ifndef
条件指令保存未定义静态库时可能发生的错误。

您可以在规则定义之前设置var值:

已编辑,生成文件:

STATIC_LIB = TRUE

ifeq (${STATIC_LIB}, TRUE)
var=staticlib
else
var=sharedlib
endif

all: $(var)

staticlib:
    echo "staticlib"

sharedlib:
    echo "sharedlib"
测试

make-f Makefile

输出

echo "staticlib"
staticlib

但这不起作用,因为makelib目标不存在all@rajlaxmisahu确保您的makefile中与上面第5、7、9行对应的行中的单词
makelib
前面没有空格或制表符。剪切并粘贴到语法感知编辑器中可能会引入制表符。已尝试过。它不起作用。应该是原因all将调用makelib,但makelib不存在,因为未执行ifndef部分。我甚至尝试了生成一个目标
a:ifndef STATIC_LIB makelib else ifeq(${STATIC_LIB},TRUE)makelib:staticlib else makelib:sharedlib endif
和调用all:a makelibwork@Rajs123
ifndef
测试失败,因此看不到第5行,因此我们直接分支到
其他ifeq
部分,并看到第7行。这一行定义了
makelib
目标。
ifndef
用于保护
ifeq
测试,如果未定义变量,该测试将中断。@Rajs123请查看此处的测试用例。这不起作用,因为var=staiclib/sharedlib在bash上执行,$(var)仍然为空。我已经测试过了this@rajlaxmisahu您使用的是什么版本的make?(make-v)在GNUmake3.81上,它工作正常。但是..你是对的,var的赋值写得不正确。现在它被修复了。我的错。是的,它工作正常,但对我的文件不起作用。我正在上传它。
echo "staticlib"
staticlib