今天当我玩Qt时,我使用qmake生成Makefile,这非常有效.
但有时我想在生成的Makefile中添加更多内容,而不必编辑生成的Makefile.
假设我们在源代码旁边有一个Doxygen目录,在那里我需要运行一些doxygen命令来生成文档.因此,将它作为主Makefile中的目标会很好.但是作为默认情况,qmake不理解这种类型的额外内容.
那么我可以添加一些东西来告诉qmake在"doxygen"目录中包含辅助Makefile,或者可以直接在qmake配置中添加"额外目标"吗?
谢谢约翰
也许是这样的:
我正在尝试编写一个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) 从GNU make的文档:http://www.gnu.org/software/make/manual/make.html#Parallel
当系统负载很重时,您可能希望运行的作业少于轻载时的作业.您可以使用'-l'选项告诉make根据平均负载限制一次运行的作业数.'-l'或'--max-load'选项后跟一个浮点数.例如,
Run Code Online (Sandbox Code Playgroud)-l 2.5如果负载平均值高于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的人在做什么?
我正在学习如何设置makefile,并遇到了问题.为了证明这一点,我已经创建了一个简单的"项目",包括源文件main.m和test.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) foobar 即使失败也可以创建输出文件,所以在这种情况下我需要删除它.
我可以做这个:
foo: bar baz
foobar $^ -o $@ || (rm -f $@ && exit 1)
Run Code Online (Sandbox Code Playgroud)
但是这不会传播返回的相同退出代码foobar(然后由其输出make).有没有办法在Makefile中捕获错误而不是在shell中?
我正在使用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.如果有必要帮我,我可以发布更多信息.
我想使用单个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,用于本机和交叉编译.它们之间唯一的区别是编译器名称:
# 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++
我有以下简化的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)
我假设变量在我认为应该扩展时没有扩展,但我无法弄清楚如何改变这种行为.
我所拥有的是一个包含3个子目录的目录.src/for .c和.h文件,bin /编译后的可执行文件应该去的地方和obj /我希望.obj文件去的地方.
现在我希望makefile从src编译每个.c文件(不需要在makefile中列出所有文件)并将.o文件放在obj中,将从foo.c构建的可执行文件保存为bin/foo.
有人可以帮我吗?每当我使用通配符时,抱怨规则不存在,当我使用隐式规则时,它不会将目标文件放在单独的文件夹中.