如果Makefile本身被更改,安全的赌注是将所有目标都视为过时.
有没有一种聪明的方法来添加这种依赖?还有其他选择吗?
如何以及何时在make文件中引用字符串?什么是最佳做法?
以下是引用方式吗?
$(warning $(shell ls -ld "$(CURDIR)" ) )
Run Code Online (Sandbox Code Playgroud)
我熟悉Bash,你通常引用变量来允许嵌入空格.你是否在makefile中这样做?
我该如何使用字符串进行赋值语句?
vara := "$(CURDIR)"
varb := $(CURDIR)
varc := /home/me/source
vard := "/home/me/source"
Run Code Online (Sandbox Code Playgroud)
平等后的空间怎么样?
我已经看过如何从make目标手动调用另一个目标?,但我的问题有点不同; 考虑这个例子(注意,stackoverflow.com将选项卡更改为显示中的空格;但如果您尝试编辑,则选项卡将保留在源代码中):
TEXENGINE=pdflatex
pdflatex:
echo the engine is $(TEXENGINE)
lualatex:
TEXENGINE=lualatex
echo Here I want to call the pdflatex rule, to check $(TEXENGINE) there!
Run Code Online (Sandbox Code Playgroud)
在这里,如果我运行默认目标(pdflatex),我得到预期的输出:
$ make pdflatex
echo the engine is pdflatex
the engine is pdflatex
Run Code Online (Sandbox Code Playgroud)
但是,有了目标lualatex,我想:
make变量更改TEXENGINE为lualatex,然后pdflatex(使用它)相同的代码.我怎么能这样做?
很明显,在我的lualatex规则中,我甚至没有设法更改TEXENGINE变量,因为我在尝试时得到了这个:
$ make lualatex
TEXENGINE=lualatex
echo Here I want to call the pdflatex rule, to check pdflatex there!
Here I want …Run Code Online (Sandbox Code Playgroud) 我有一个makefile,它在命令行中获取选项
make OPTION_1=1
Run Code Online (Sandbox Code Playgroud)
根据该值,它将向对象子集添加其他编译器定义.
ifeq ($(OPTION_1), 1)
CC_FLAGS += -DOPTION_1_ON
endif
Run Code Online (Sandbox Code Playgroud)
定义中的更改会影响包含的头文件内容 - 存根或实现会暴露给目标文件.
如何通过此选项更改来重建受影响的文件?
我有以下makefile:
CXXFLAGS = -std=c++0x -Wall
SRCS = test1.cpp test2.cpp
OBJDIR = object
OBJS = $(SRCS:%.cpp=$(OBJDIR)/%.o)
all: test1
release: clean test1
test1: $(OBJS)
$(CXX) -o $@ $(OBJS)
$(OBJDIR)/%.o: %.cpp
$(CXX) $(CXXFLAGS) -MD -c -o $@ $<
-include $(SRCS:.cpp=.d)
clean:
rm -rf $(OBJDIR)/*
.PHONY: all clean release
Run Code Online (Sandbox Code Playgroud)
现在,如果我尝试调用"make -j4 release",那么干净的目标通常会在构建文件的过程中执行,从而导致编译失败.我的问题是如何在开始发布版本之前确保干净的目标已完成.
GNU Make 3.82
gcc 4.7.2
c89
Run Code Online (Sandbox Code Playgroud)
我有以下make文件:
INC_PATH=-I/home/dev_tools/apr/include/apr-1
LIB_PATH=-L/home/dev_tools/apr/lib
LIBS=-lapr-1 -laprutil-1
RUNTIME_PATH=-Wl,-rpath,/home/dev_tools/apr/lib
CC=gcc
CFLAGS=-Wall -Wextra -g -m32 -O2 -D_DEBUG -D_THREAD_SAFE -D_REENTRANT -D_LARGEFILE64_SOURCE $(INC_PATH)
SOURCES=$(wildcard src/*.c)
OBJECTS=$(patsubst %.c, %.o, $(SOURCES))
EXECUTABLE=bin/to
all: build $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
$(CC) $(CFLAGS) -o $@ $(RUNTIME_PATH) $(OBJECTS) $(LIB_PATH) $(LIBS)
$(OBJECTS): $(SOURCES)
$(CC) $(CFLAGS) -c $(SOURCES) $(LIB_PATH) $(LIBS)
build:
@mkdir -p bin
clean:
rm -rf $(EXECUTABLE) $(OBJECTS) bin
find . -name "*~" -exec rm {} \;
find . -name "*.o" -exec rm {} \;
Run Code Online (Sandbox Code Playgroud)
我的目录结构是这样的project/src project/bin …
我有一堆使用相同类型的make规则构建的应用程序:
apps = foo bar baz
all: $(apps)
foo: foo.o $(objects)
$(link)
bar: bar.o $(objects)
$(link)
baz: baz.o $(objects)
$(link)
Run Code Online (Sandbox Code Playgroud)
如果他们有扩展名(例如.x),我可以制定一个模式规则:
%.x: %.o $(objects)
$(link)
Run Code Online (Sandbox Code Playgroud)
我不必为每个应用程序写出新规则.
但他们没有扩展,我很确定:
%: %.o $(objects)
$(link)
Run Code Online (Sandbox Code Playgroud)
将无法工作(因为它指定构建任何文件,您可以使用此规则).
反正有没有指定一个涵盖所有$(apps)构建规则的规则?
gnu make,microsoft nmake和posix标准有多相似/不同?
显然有"哪个操作系统?","哪个编译器?" 和"哪个链接器?",但我具体指的是makefile本身的语法,语义和命令行选项.
如果我根据gnu make的手册编写makefile,那么我需要注意哪些最重要的可移植性问题?
如何使用Make实现简单的回归测试框架?(如果重要的话,我正在使用GNU Make.)
我当前的makefile看起来像这样(为简单起见而编辑):
OBJS = jscheme.o utility.o model.o read.o eval.o print.o
%.o : %.c jscheme.h
gcc -c -o $@ $<
jscheme : $(OBJS)
gcc -o $@ $(OBJS)
.PHONY : clean
clean :
-rm -f jscheme $(OBJS)
Run Code Online (Sandbox Code Playgroud)
我想要进行一系列的回归测试,例如,expr.in测试一个"好"的表达式并unrecognized.in测试一个"坏的" 表达式,其中expr.cmp&unrecognized.cmp是每个的预期输出.手动测试如下所示:
$ jscheme < expr.in > expr.out 2>&1
$ jscheme < unrecognized.in > unrecognized.out 2>&1
$ diff -q expr.out expr.cmp # identical
$ diff -q unrecognized.out unrecognized.cmp
Files unrecognized.out and unrecognized.cmp differ
Run Code Online (Sandbox Code Playgroud)
我想在makefile中添加一组规则,如下所示: …
我正在运行以下类型的管道:
digestA: hugefileB hugefileC
cat $^ > $@
rm $^
hugefileB:
touch $@
hugefileC:
touch $@
Run Code Online (Sandbox Code Playgroud)
目标hugefileB和hugefileC非常大,需要很长时间才能计算(并需要Make的强大功能).但是一旦创建了digestA,就不需要保留它的依赖关系:它会删除这些依赖关系以释放磁盘空间.
现在,如果我再次调用'make',将重建hugefileB和hugefileC,而digestA已经可以了.
有没有办法告诉'make'避免重新编译依赖项?
注意:我不想在'digestA'的规则中构建两个依赖项.