标签: gnu-make

取决于make文件本身

如果Makefile本身被更改,安全的赌注是将所有目标都视为过时.

有没有一种聪明的方法来添加这种依赖?还有其他选择吗?

makefile gnu-make

25
推荐指数
3
解决办法
5928
查看次数

GNU 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)

平等后的空间怎么样?

makefile gnu-make

25
推荐指数
1
解决办法
2万
查看次数

更改make变量,并从同一Makefile中的配方调用另一个规则?

我已经看过如何从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变量更改TEXENGINElualatex,然后
  • 调用与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 gnu-make

25
推荐指数
2
解决办法
1万
查看次数

强制gnu make来重建受编译器定义影响的对象

我有一个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 gnu-make

24
推荐指数
1
解决办法
6833
查看次数

并行makefile需要依赖顺序

我有以下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",那么干净的目标通常会在构建文件的过程中执行,从而导致编译失败.我的问题是如何在开始发布版本之前确保干净的目标已完成.

makefile gnu-make

24
推荐指数
2
解决办法
2万
查看次数

获取make以在特定目录中创建目标文件

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 …

makefile gnu-make

24
推荐指数
2
解决办法
7万
查看次数

Makefile模式规则没有扩展名?

我有一堆使用相同类型的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)构建规则的规则?

makefile gnu-make

24
推荐指数
2
解决办法
6960
查看次数

gnu make,microsoft nmake和posix标准有多相似/不同?

gnu make,microsoft nmake和posix标准有多相似/不同?

显然有"哪个操作系统?","哪个编译器?" 和"哪个链接器?",但我具体指的是makefile本身的语法,语义和命令行选项.

如果我根据gnu make的手册编写makefile,那么我需要注意哪些最重要的可移植性问题?

portability nmake makefile gnu-make

23
推荐指数
1
解决办法
5661
查看次数

实现`make check`或`make test`

如何使用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中添加一组规则,如下所示: …

testing makefile gnu-make regression-testing

23
推荐指数
2
解决办法
4万
查看次数

在创建顶层目标时告诉'make'忽略依赖关系

我正在运行以下类型的管道:

digestA: hugefileB hugefileC
    cat $^ > $@
    rm $^

hugefileB:
    touch $@

hugefileC:
    touch $@
Run Code Online (Sandbox Code Playgroud)

目标hugefileBhugefileC非常大,需要很长时间才能计算(并需要Make的强大功能).但是一旦创建了digestA,就不需要保留它的依赖关系:它会删除这些依赖关系以释放磁盘空间.

现在,如果我再次调用'make',将重建hugefileBhugefileC,而digestA已经可以了.

有没有办法告诉'make'避免重新编译依赖项?

注意:我不想在'digestA'的规则中构建两个依赖项.

makefile gnu-make

23
推荐指数
1
解决办法
1万
查看次数