标签: gnu-make

Makefile 忽略模式中子目录的模式规则

考虑以下目录结构:

.
  bar/
    foo/
      test.ext1
  _foo/
Run Code Online (Sandbox Code Playgroud)

我用以下规则编写了一个 makefile:

_%.ext2: bar/%.ext1 # % should match foo/test
    echo $*
Run Code Online (Sandbox Code Playgroud)

然而运行make _foo/test.ext2给出:

make: *** No rule to make target '_foo/test.ext2'.  Stop.
Run Code Online (Sandbox Code Playgroud)

当我查看时make -d _foo/test.ext2,它甚至没有考虑上述规则,即它直接跳到尝试内置规则。我不明白这里发生了什么,有人可以向我解释一下吗?

编辑:我希望能够从 中的任意文件生成bar,例如:

  • bar/foo/test-2.ext1->_foo/test-2.ext2
  • bar/baz/another.ext1->_baz/another.ext2
  • ETC。

_foo和的存在_baz是有保证的。

makefile gnu-make

5
推荐指数
1
解决办法
1392
查看次数

与 GNU Make 链接时参数列表太长

我有一个相当大的项目(4272 .o 文件),但无法将其与 GNU Make 链接。我遇到了make: /bin/sh: Argument list too long。这是一个使用 qmake 生成 makefile 的 Qt 5 项目。

我知道有很多关于此的问题,但我不知道如何将任何解决方案应用于我的问题。我也不完全确定为什么我在链接步骤中遇到这个问题。我得到的错误是:

make: /bin/sh: Argument list too long

用于链接我的项目的 makefile 条目如下所示:

build/debug/my_target/my_target:  $(OBJECTS)  
    @test -d build/debug/my_target/ || mkdir -p build/debug/my_target/
    $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS)
Run Code Online (Sandbox Code Playgroud)

它扩展到类似:

@echo linking /build/debug/my_target/my_target && clang++ -ccc-gcc-name g++ -lc++ -L/path/to/licensing/lib -Wl,-rpath,/path/to/qt/lib -Wl,-rpath-link,/path/to/qt/lib -o build/debug/my_target/my_target build/debug/my_target/obj/object1.o build/debug/my_target/obj/object2.o ... build/debug/my_target/obj/object4272.o  ... [ a bunch of moc_X.o ] ... [ a bunch of libs ] …
Run Code Online (Sandbox Code Playgroud)

linux makefile gnu-make clang++

5
推荐指数
1
解决办法
5641
查看次数

自动生成模块的依赖关系

我现在开始了解模块

如果我们想使用import <iostream>;而不是旧的样式,#include <iostream>我们需要“预编译”iostream头文件。我们可以通过简单地调用 g++ 来手动完成:

g++ -xc++-system-header -std=c++20 -fmodules-ts iostream

但这需要为所有使用的系统头文件手动创建一组规则,并将gnu make所有依赖项指向gcm.cache目录结构。

对于旧样式#include指令,我们只需使用-M-MM标志即可自动生成此类依赖项make

问:我们如何自动从导入的模块g++中获取此类依赖关系来设置规则?gnu make

目标非常简单:.gcm在构建系统需要导入这些文件之前预编译所有需要的文件。

c++ dependencies module gnu-make c++20

5
推荐指数
0
解决办法
292
查看次数

如何在make模式规则中的依赖项中使用依赖于模式的变量

我想在依赖于模式的变量中定义具有依赖关系的GNU make模式规则.我想要的是这样的:

%.exe : $(%_EXE_SOURCES) $(%_EXE_RESOURCES)
    $(CSC_V)$(CSC) $(CSCFLAGS) $($*_EXE_CSCFLAGS) -target:exe \
            -out:$@ $($*_EXE_SOURCES) $($*_EXE_RESOURCES)
Run Code Online (Sandbox Code Playgroud)

并在以后定义类似的东西

FOO_EXE_SOURCES = src/Foo.cs
all: Foo.exe
Run Code Online (Sandbox Code Playgroud)

提出的规则有助于建立; 在规则的主体中,$($*_EXE_SOURCES)变量被扩展为$(FOO_EXE_SOURCES),扩展为src/Foo.cs.但是,依赖关系不能正确扩展; 更改src/Foo.cs不会导致重建Foo.exe.

我怀疑这实际上不能在make中完成,但也许有人有一个类似工作的make片段?

makefile gnu-make

4
推荐指数
1
解决办法
3039
查看次数

在GNU Make中强制变量扩展

如何强制GNU Make变量立即评估?请考虑以下示例:

TARGET:=fred
wilma:
    mkdir -p $(TARGET)
TARGET:=barney
betty:
    mkdir -p $(TARGET)
all: one two
.PHONY: one two all
Run Code Online (Sandbox Code Playgroud)

使用make all,Make只会创建"barney",因为只有在读取了makefile并分配了最终值("barney")后才会计算配方字符串.

在这种情况下,我需要创建"fred"和"barney".

makefile gnu-make

4
推荐指数
1
解决办法
1168
查看次数

空白和makefile

我试图用白色空间编译一个项目到路径目录.在这里你有我的Makefile:

NAME    =       ./Release/Online_pricer

SRCS    =       ./Online_pricer/main.cpp                        \
                ./Online_pricer/Currency.cpp                    \
                ./Online_pricer/Curve.cpp                       \
                ./Online_pricer/Environment.cpp                 \
                ./Online_pricer/My_convert.cpp                  \
                ./Online_pricer/My_exception.cpp                \
                ./Online_pricer/ParserTab.cpp                   \
                ./Online_pricer/Spot.cpp                        \
                ./Online_pricer/Volatility.cpp                  \
                ./Online_pricer/VolatilityCapFloor.cpp          \
                ./Online_pricer/VolatilitySwaption.cpp          \
                ../Files\\ cpp/Functions.cpp                    \
                ../Files\\ cpp/UtilitiesWeb.cpp

#####################################################                                          

OBJS                    =       $(SRCS:.cpp=.o)
CC                      =       g++
RM                      =       rm -f
CFLAGS                  =       -g -W -Wall -Werror
INCL                    =       ../Files\ .h/

#####################################################                                          

$(NAME) :       $(OBJS)
        @$(CC) $(OBJS) -I$(INCL) $(LIB) -o $(NAME)
        @printf "\n \033[33m[Message]\033[39m Compilation under Linux done\n"

.cpp.o  :
        @$(CC) -I$(INCL) $(CFLAGS) -c $< -o $@ …
Run Code Online (Sandbox Code Playgroud)

c++ makefile compilation g++ gnu-make

4
推荐指数
1
解决办法
4841
查看次数

Makefile改进,依赖关系生成不起作用

我正在尝试构建一个正确的Makefile.

我想要的是完全控制正在发生的事情,所以我不想要任何第三方软件.

我当前的尝试对我来说似乎是逻辑,但由于依赖关系生成无效,我有点卡住了.

为了更好的可读性,完整的Makefile被分成几小块.如果有什么需要改进,我将不胜感激任何评论.

首先,我有以下静态定义

CXX = g++
CXXFLAGS = -Wall \
           -Wextra \
           -Wuninitialized \
           -Wmissing-declarations \
           -pedantic \
           -O3 \
           -p -g -pg
LDFLAGS =  -p -g -pg
DEPFLAGS = -MM
Run Code Online (Sandbox Code Playgroud)

Afaik这应该没问题.使分析标志可选是完美的,但这并不重要.

SRC_DIR = ./src
OBJ_DIR = ./obj
SRC_EXT = .cpp
OBJ_EXT = .o

TARGET = ./bin/my_target

SRCS = $(wildcard $(SRC_DIR)/*$(SRC_EXT))
OBJS = $(subst $(SRC_DIR), $(OBJ_DIR), $(SRCS:$(SRC_EXT)=$(OBJ_EXT)))
DEP = depend.main
Run Code Online (Sandbox Code Playgroud)

基本上,这应该只是提取所有*.cpp文件出的子文件夹中src,另外更换./src./obj,并.cpp.o作为对象的名称.

.PHONY: clean all depend

all: …
Run Code Online (Sandbox Code Playgroud)

c++ makefile gnu-make

4
推荐指数
1
解决办法
1237
查看次数

为什么跟随makefile每次都重建目标"build"

我有以下代码来解压缩目录中的所有文件并将其移动到构建目录.如果我多次调用make,它会尝试每次都执行"build"目标,即使build目录已经存在.有没有人碰到过这个?

我发现了这个问题,但不一样. Makefile始终运行目标

操作系统:Ubuntu 12.04程序:GNU Make 3.81

build: mkBuildDir untar 
    chmod 700 build

.PHONY: mkBuildDir untar 

mkBuildDir: 
    mkdir build 

untar: *.tar.gz
    for prefix in *.tar.gz; do \
        tar xvf $$prefix --directory=build; \
    done

clean: 
    rm -Rf build
Run Code Online (Sandbox Code Playgroud)

makefile gnu-make

4
推荐指数
1
解决办法
3019
查看次数

在makefile中设置环境变量

我有这样的makefile:

setup:
  setenv var1 "$(var1)"; \
  setenv var2 "$(var2)";

task1: setup
  source task1.csh

task2: setup
  source task2.csh
Run Code Online (Sandbox Code Playgroud)

我使用这个命令调用makefile:

make var1=value1 var2=value2 task1
Run Code Online (Sandbox Code Playgroud)

我想要环境变量var1var2task1.csh和中可见task2.csh,但除非我将makefile更改为:否则我无法这样做

task1:
  setenv var1 "$(var1)"; \
  setenv var2 "$(var2)"; \
  source task1.csh

task2:
  setenv var1 "$(var1)"; \
  setenv var2 "$(var2)"; \
  source task2.csh
Run Code Online (Sandbox Code Playgroud)

为什么第一种方法不起作用,我该如何解决?

makefile environment-variables gnu-make

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

Makefile:重用配方中模式规则的%值

在Makefile中我有:

images/schematic.pdf:images/schematic.svg

  inkscape -D -z --file=$^ --export-pdf=$@ --export-latex

  sed -i "s:schematic:images/schematic:g" $@_tex
Run Code Online (Sandbox Code Playgroud)

这条规则的作用是:

  • 使用inkscape转换为可用于乳胶的.pdfPDF文件及其相应的.pdf_tex文本文件(请参阅此答案:https://tex.stackexchange.com/a/2107/104581)
  • 修改提到的.pdf_tex文件,以便它不会破坏"更高"目录中的乳胶编译(即..pdf_tex文件在时./images)

我的问题:

我有很多这种形式的规则,即只有schematic改变的地方.我想用一个模式规则替换schematic%.并%在配方中使用(在sed命令中).

但是规则:

images /%.pdf:images /%.svg

  inkscape -D -z --file=$^ --export-pdf=$@ --export-latex

  sed -i "s:%:images/%:g" $@_tex
Run Code Online (Sandbox Code Playgroud)

不起作用:%在食谱中按字面解释.

我还尝试用$%替换配方中的%,但这个变量似乎是空的.

不满意的解决方案:

在配方中添加一行来创建一个(make)变量,该变量将保存结果notdir(removeprefix($<))(使用此问题或调用bash,因为GNU Make中没有removeprefix).

makefile code-cleanup pattern-matching gnu-make

4
推荐指数
1
解决办法
1479
查看次数