标签: gnu-make

如何在qmake生成的Makefile中添加自定义目标?

今天当我玩Qt时,我使用qmake生成Makefile,这非常有效.

但有时我想在生成的Makefile中添加更多内容,而不必编辑生成的Makefile.

假设我们在源代码旁边有一个Doxygen目录,在那里我需要运行一些doxygen命令来生成文档.因此,将它作为主Makefile中的目标会很好.但是作为默认情况,qmake不理解这种类型的额外内容.

那么我可以添加一些东西来告诉qmake在"doxygen"目录中包含辅助Makefile,或者可以直接在qmake配置中添加"额外目标"吗?

谢谢约翰


也许是这样的:

qmake makefile gnu-make

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

GNU make条件函数$(if ...)在用户定义的函数内总是求值为true

我正在尝试编写一个make函数来触摸/创建一个空文件和/或在可能的情况下设置权限,用户和组,或者如果没有则发出警告.但是,我的函数中的每个条件检查似乎都评估为true.

我的Makefile的基本要素是

INSTALL_USER  := fileUser
INSTALL_GROUP := fileGroup

.PHONY: test
test:
    $(call touchFile,~/test.ini)

define touchFile
$(eval fileName := $(strip $(1)))
-touch $(fileName)
-chmod -c 664 $(fileName)

$(info filename info $(fileName))
$(info $(shell stat -c "%a %U:%G" $(fileName)))

$(if ifeq  "foo" "bar", @echo match is broken, @echo match works)
$(if ifneq "foo" "bar", @echo match works, @echo match is broken)

$(if ifneq ($(shell stat -c %a $(fileName)),664), $(warning Error - $(fileName) does not have expected permissions of 664))
-chgrp -c $(INSTALL_GROUP) …
Run Code Online (Sandbox Code Playgroud)

makefile gnu-make

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

如何在多核Linux机器上使用GNU make --max-load?

从GNU make的文档:http://www.gnu.org/software/make/manual/make.html#Parallel

当系统负载很重时,您可能希望运行的作业少于轻载时的作业.您可以使用'-l'选项告诉make根据平均负载限制一次运行的作业数.'-l'或'--max-load'选项后跟一个浮点数.例如,

 -l 2.5
Run Code Online (Sandbox Code Playgroud)

如果负载平均值高于2.5,则不会让make启动多个作业.没有跟随号码的'-l'选项会删除加载限制,前提是前一个'-l'选项.

更准确地说,当make启动一项工作,并且它已经至少运行了一个工作时,它会检查当前的平均负载; 如果它不低于'-l'给出的限制,则等待直到负载平均值低于该限制,或直到所有其他作业完成.

从Linux手册页获取正常运行时间:http://www.unix.com/man-page/Linux/1/uptime/

系统负载平均值是处于可运行或不可中断状态的平均进程数.处于可运行状态的进程要么使用CPU,要么等待使用CPU.处于不可中断状态的进程正在等待某些I/O访问,例如等待磁盘.平均值是在三个时间间隔内取得的.对于系统中的CPU数量,负载平均值没有标准化,因此平均负载为1意味着单个CPU系统一直在加载,而在4 CPU系统上,这意味着它在75%的时间内处于空闲状态.

我有一个并行的makefile,我想做一个显而易见的事情:make make继续添加进程,直到我获得完整的CPU使用率,但我不会引起颠簸.

今天的许多(所有?)机器都是多核的,因此这意味着负载平均值不是应该检查的数量,因为需要针对核心数调整该数量.

这是否意味着GNU make 的--max-load(又名-l)标志现在没用了?在多核计算机上运行并行makefile的人在做什么?

multicore uptime gnu-make

12
推荐指数
2
解决办法
4477
查看次数

Makefile始终重新编译文件

我正在学习如何设置makefile,并遇到了问题.为了证明这一点,我已经创建了一个简单的"项目",包括源文件main.mtest.m.

我正在尝试设置make来编译这些文件(仅在某些事情发生变化时),并将目标文件存储在其他地方(这里build/)

我的Makefile:

OBJ = ./build

SOURCES=main.m test.m
OBJECTS=$(addprefix $(OBJ)/,$(SOURCES:.m=.o))
EXECUTABLE=test

all: $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
        gcc $(OBJECTS) -o $(EXECUTABLE)

$(OBJECTS): $(OBJ)/%.o: %.m build/
        gcc -c $< -o $@

build/:
        mkdir build
Run Code Online (Sandbox Code Playgroud)

当我第一次运行它时(只有Makefile和当前目录中的源代码)它会按照我的预期执行:

gcc -c main.m -o build/main.o
gcc -c test.m -o build/test.o
gcc ./build/main.o ./build/test.o -o test
Run Code Online (Sandbox Code Playgroud)

但是,如果我make再次运行:

gcc -c main.m -o build/main.o
gcc ./build/main.o ./build/test.o -o test
Run Code Online (Sandbox Code Playgroud)

我做错了什么?还要注意Makefile中的任何其他错误,因为我正在努力学习创建"好"的Makefile.

编辑:

我发现了什么make -d:

Finished prerequisites of target file `build/main.o'.
Prerequisite `main.m' …
Run Code Online (Sandbox Code Playgroud)

c c++ makefile gnu-make

12
推荐指数
1
解决办法
3764
查看次数

如何在Makefile中出错后清理?

foobar 即使失败也可以创建输出文件,所以在这种情况下我需要删除它.

我可以做这个:

foo: bar baz
        foobar $^ -o $@ || (rm -f $@ && exit 1)
Run Code Online (Sandbox Code Playgroud)

但是这不会传播返回的相同退出代码foobar(然后由其输出make).有没有办法在Makefile中捕获错误而不是在shell中?

makefile gnu-make

12
推荐指数
2
解决办法
4553
查看次数

如何解决mno cygwin错误?

我正在使用GCC和Make在Windows中编译库.当我运行时make,我收到以下错误:

unrecognized command line option '-mno-cygwin'

我在SO上看过这篇文章,但它看起来不一定是同一个问题,我不明白如何将我的系统降级到支持我需要使用的标志的GCC(或Make)版本编译.

有人可以试着指出我正确的方向,或者如果你遇到这个问题提供解决方案?

我正在运行Windows 8.1 pro,GCC 5.4.0,make 4.2.1.如果有必要帮我,我可以发布更多信息.

gcc cygwin gnu-make windows-8

12
推荐指数
1
解决办法
4663
查看次数

如何通过globbing子目录自动生成make目标列表?

我想使用单个Makefile在数百个子目录中生成目标.每个子目录都是一个日期/时间戳,如下所示:20120119_153957匹配以下模式????????_??????.没有其他子目录与此模式匹配.

我想要生成一个目标????????_??????/graph.pdf.我有一个调用的脚本make_graph,它将使图形被赋予子目录名称.但我不确定如何编写一个Makefile,它将自动为所有子目录添加并以编程方式生成这些目标.

例如,代码SUBDIRS:=????????_??????似乎正确地遍历所有子目录.我可以查看这个规则:

.PHONY: print
print:
        echo $(SUBDIRS)
Run Code Online (Sandbox Code Playgroud)

但是这个变量赋值

TARGETS:=$(SUBDIRS:%=%/graph.pdf)
Run Code Online (Sandbox Code Playgroud)

似乎没有做我期望的事情并分配了很多很多目标.相反,以下规则只打印一个目标.

.PHONY: print
print:
        echo $(TARGETS)
Run Code Online (Sandbox Code Playgroud)

SUBDIRS应该拥有正确的子目录但TARGET只有一个文件是非常令人困惑的.

makefile gnu-make

11
推荐指数
1
解决办法
9870
查看次数

两个编译器的一个makefile

我有两个makefile,用于本机和交叉编译.它们之间唯一的区别是编译器名称:

# makefile
CC = g++
...
# makefile-cc
CC = arm-linux-gnueabihf-g++
...

为了进行本机编译,我执行make,进行交叉编译,我执行make -f makefile-cc.我希望有一个makefile,应该使用make本机编译执行,并make cross进行交叉编译.这样做的正确语法是什么,例如:

# makefile (C-like pseudo-code)
if cross
    CC = arm-linux-gnueabihf-g++
else
    CC = g++

c c++ g++ cross-compiling gnu-make

11
推荐指数
2
解决办法
4262
查看次数

为什么这个makefile目标特定变量没有按预期扩展?

我有以下简化的makefile,我正在尝试根据不同的目标设置不同的路径.不幸的是,我没有得到我期望的结果.这是make版本3.81.

.SECONDEXPANSION:
all:  Debug32

# Object directory set by target
Debug32:  OBJDIR = objdir32
#OBJDIR = wrongdirectory

# ObjDir is empty here. :(
OBJS = $(addprefix $(OBJDIR)/,DirUtil.o)

$(OBJDIR)/%.o : %.cpp
            echo Compile: $@

Debug32: $(OBJS)

$(OBJS): | $(OBJDIR)

$(OBJDIR):
            echo mkdir $(OBJDIR) - $@
Run Code Online (Sandbox Code Playgroud)

结果如下,没有设置OBJDIR:

echo Compile: /DirUtil.o
Run Code Online (Sandbox Code Playgroud)

如果我取消注释"OBJDIR = wrongdirectory"行,我将得到以下结果,这是令人困惑的,因为我看到变量的两个值,我认为我应该只看到一个:

echo mkdir objdir32 - wrongdirectory -
echo Compile: wrongdirectory/DirUtil.o
Run Code Online (Sandbox Code Playgroud)

我假设变量在我认为应该扩展时没有扩展,但我无法弄清楚如何改变这种行为.

makefile gnu-make

11
推荐指数
1
解决办法
7634
查看次数

Makefile:自动编译所有c文件,将.o文件保存在单独的文件夹中

我所拥有的是一个包含3个子目录的目录.src/for .c和.h文件,bin /编译后的可执行文件应该去的地方和obj /我希望.obj文件去的地方.

现在我希望makefile从src编译每个.c文件(不需要在makefile中列出所有文件)并将.o文件放在obj中,将从foo.c构建的可执行文件保存为bin/foo.

有人可以帮我吗?每当我使用通配符时,抱怨规则不存在,当我使用隐式规则时,它不会将目标文件放在单独的文件夹中.

c makefile gnu-make

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

标签 统计

gnu-make ×10

makefile ×7

c ×3

c++ ×2

cross-compiling ×1

cygwin ×1

g++ ×1

gcc ×1

multicore ×1

qmake ×1

uptime ×1

windows-8 ×1