我想要一个像这样的makefile:
cudaLib :
# Create shared library with nvcc
ocelotLib :
# Create shared library for gpuocelot
build-cuda : cudaLib
make build
build-ocelot : ocelotLib
make build
build :
# build and link with the shared library
Run Code Online (Sandbox Code Playgroud)
即*Lib任务创建一个直接在设备上运行cuda的库,或者分别在gpuocelot上运行cuda.
对于这两个构建任务,我需要运行相同的构建步骤,只创建库不同.
是否有替代直接运行make?
make build
Run Code Online (Sandbox Code Playgroud)
有什么后必备条件?
GNU Make手册的4.13节描述了所谓的双冒号规则:
双冒号规则是在目标名称后面用'::'而不是':'编写的规则.当同一目标出现在多个规则中时,它们的处理方式与普通规则不同.
当目标出现在多个规则中时,所有规则必须是相同的类型:所有规则或所有双冒号.如果它们是双冒号,则每个都是独立的.如果目标比该规则的任何先决条件更旧,则执行每个双冒号规则的命令.如果该规则没有先决条件,则始终执行其命令(即使目标已存在).这可能导致执行任何,任何或所有双冒号规则.
具有相同目标的双冒号规则实际上彼此完全分离.每个双冒号规则都是单独处理的,就像处理具有不同目标的规则一样.
目标的双冒号规则按它们在makefile中出现的顺序执行.但是,双冒号规则确实有意义的情况是执行命令的顺序无关紧要的情况.
双冒号规则有点模糊,通常不太有用; 它们为用于更新目标的方法根据导致更新的先决条件文件而不同的情况提供了一种机制,这种情况很少见.
每个双冒号规则应指定命令; 如果没有,则使用隐式规则(如果适用).请参阅使用隐式规则部分.
我有点单独理解本节每个句子的含义,但我仍然不清楚双冒号规则是什么.至于是罕见的,我还没有看到任何的开源项目,其Makefile文件并没有开头
all::
Run Code Online (Sandbox Code Playgroud)
因此:Makefile中双冒号规则的目的是什么?
有没有办法从字符串中删除前缀(在我的情况下是一个路径名)make?
举个例子,假设我有字符串:
FILES = a/b/c.d a/b/e.f
Run Code Online (Sandbox Code Playgroud)
我想删除a/,并留下b/c.d b/e.f
我一直在使用的各种组合尝试dir,notdir并basename从GNU使手动,但没有似乎提供了一个很好的解决方案.
$(dir $(FILE)) # a/b a/b
$(notdir $(FILE)) # c.d e.f
$(basename $(FILE)) # a/b/c a/b/e
Run Code Online (Sandbox Code Playgroud)
到目前为止,我发现这样做的唯一方法是:
$( join $(basename $(dir $(FILE))), $(notdir $(FILE)) )
Run Code Online (Sandbox Code Playgroud)
哪个真的很难看,也很啰嗦.我真正需要的是某种$(removeprefix ...)功能.假设我知道a/要删除的prefix(),可以通过某种字符串操作来完成吗?
我想在ifGNU make文件的循环中检查多个条件.这是一个例子:
ifeq ($(TEST_FLAG),TRUE && ($(DEBUG_FLAG),FALSE))
true statement
else
false statement
endif
Run Code Online (Sandbox Code Playgroud)
什么是正确的方法呢?
我正在学习使用GNU make并且我正在阅读手册(这是非常好的)但我错过了一个备忘单以供快速参考.有什么好处吗?
注意:很难找到谷歌这个.
虽然两个名字都可以完成这项工作,但是makefile的正确名称是什么?
GNU`make'主页使用Makefile,我想这是命名它的好方法.在大写字母中键入前M的任何原因?
我想在GNUmake文件运行期间将当前目录放入make变量中.
这样做的语法是什么?像这样的东西?
DIR := $(PWD)
Run Code Online (Sandbox Code Playgroud) 有没有办法使用GNU Make将目录中的所有C文件编译成单独的程序,每个程序都被命名为没有.c扩展名的源文件?
有时,make的输出填满了屏幕.识别所有警告和错误消息行有点困难.我知道可能壳颜色输出可以帮助任何人都可以帮助我?
我正在尝试创建一个Makefile,它将我的.o文件放在与源文件不同的目录中.我正在尝试使用模式规则,因此我不必为每个源和目标文件创建相同的规则.
我的项目结构看起来像:
project/
+ Makefile
+ src/
+ main.cpp
+ video.cpp
+ Debug/
+ src/ [contents built via Makefile:]
+ main.o
+ video.o
Run Code Online (Sandbox Code Playgroud)
我的Makefile看起来像:
OBJDIR_DEBUG = Debug
OBJ_DEBUG = $(OBJDIR_DEBUG)/src/main.o $(OBJDIR_DEBUG)/src/video.o
all: $(OBJ_DEBUG)
$(OBJ_DEBUG): %.o: %.cpp
$(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c $< -o $@
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为它在我的源文件中查找Debug/src/*.cpp.
我尝试过以下方法:
# Broken: make: *** No rule to make target `Debug/src/main.cpp', needed by `Debug/src/main.o'. Stop.
# As a test, works if I change "%.cpp" to "Debug/src/main.cpp", though it obv. builds the wrong …Run Code Online (Sandbox Code Playgroud)