标签: gnu-make

跳过某些目标的makefile依赖项生成(例如`clean`)

我有几个C和C++项目都遵循我已经使用了一段时间的基本结构.我的源文件进入src/*.c,中间文件进入obj/*.[do],顶级目录中的实际可执行文件.

我的makefile大致遵循这个模板:

# The final executable
TARGET := something
# Source files (without src/)
INPUTS := foo.c bar.c baz.c

# OBJECTS will contain: obj/foo.o obj/bar.o obj/baz.o
OBJECTS := $(INPUTS:%.cpp=obj/%.o)
# DEPFILES will contain: obj/foo.d obj/bar.d obj/baz.d
DEPFILES := $(OBJECTS:%.o=%.d)

all: $(TARGET)

obj/%.o: src/%.cpp
    $(CC) $(CFLAGS) -c -o $@ $<

obj/%.d: src/%.cpp
    $(CC) $(CFLAGS) -M -MF $@ -MT $(@:%.d=%.o) $<

$(TARGET): $(OBJECTS)
    $(LD) $(LDFLAGS) -o $@ $(OBJECTS)

.PHONY: clean
clean:
    -rm -f $(OBJECTS) $(DEPFILES) $(RPOFILES) $(TARGET)

-include …
Run Code Online (Sandbox Code Playgroud)

debian dependencies makefile gnu-make

7
推荐指数
1
解决办法
2992
查看次数

为什么/何时需要"清洁"目标?

有时似乎没有构建新的可执行文件,即使我需要一个,但我不明白为什么.例如,当我更改Makefile时,但是已经存在可执行文件,并且当我执行'make'时,它不会创建更新的可执行文件.

Makefile的目的不是为了让我不再担心那些东西吗?

makefile gnu-make

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

判断 make 是在 windows 还是 linux 上运行

有没有办法在 makefile 中知道 GNU make 是在 linux 操作系统还是 windows 操作系统上运行?

我已经构建了一个 bash 脚本,它生成一个用于构建我的应用程序的 makefile,它在我的 Debian 机器上运行良好。我想尝试在 MinGW/MSYS 上构建它,但问题是我必须构建和运行一些测试程序来检查源代码中的错误,而要在 Windows 上运行它,我必须添加 .exe 后缀。

makefile gnu-make os-agnostic os-detection

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

文件是为不受支持的文件格式构建的,而不是链接的体系结构(x86_64)

我在OSX Lion上有一个构建文件

VPATH = src include
CFLAGS ="-I include -std=gnu99"

hello: hello.o
    gcc $^ -o $@

hello.o: hello.h hello.c
    gcc $(CFLAGS) -c $< -o $@
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试运行此make文件时,我收到以下错误

    ld: warning: ignoring file hello.o, file was built for unsupported file format which is not the architecture being linked (x86_64)
Undefined symbols for architecture x86_64:
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

我已尝试使用该标志-arch x86_64但仍然得到相同的错误.

运行arch命令给出:i386.

uname …

macos gcc makefile gnu-make

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

使用MinGW下的makefile编译所有CPP文件

我的C++项目的目录结构是

/..
   makefile     <- the makefile is in root
   /include     <- subdirectory that has to be included while compiling
   /obj         <- target place for all *.o and final executable
   /src         <- sources
Run Code Online (Sandbox Code Playgroud)

我目前的makefile是:

CC=g++
CFLAGS=-c -Wall -std=c++11

INC=-Iinclude
SRC=src
TGT=obj

all: myapp

myapp: myapp.o
    $(CC) $(TGT)/myapp.o -o $(TGT)/myapp

myapp.o:
    $(CC) $(CFLAGS) $(INC) $(SRC)/myapp.cpp -o $(TGT)/myapp.o

clean:
    rm -rf $(TGT)
    mkdir $(TGT)
Run Code Online (Sandbox Code Playgroud)

这适用于我的第一个文件.我是一个总的makefile新手 - 请帮我编译目录下的所有文件/src,并将它们链接到/obj目录中的可执行文件.

makefile必须在Windows下工作,我使用的是MinGW和MSYS

c++ mingw makefile gnu-make

7
推荐指数
1
解决办法
7008
查看次数

Makefile:can'罐头食谱'有参数吗?

我的问题涉及GNU的制作.

如果您有一系列命令可用作多个目标的配方,则罐装配方会派上用场.我可能看起来像这样:

define run-foo
# Here comes a
# sequence of commands that are
# executed line by line
endef
Run Code Online (Sandbox Code Playgroud)

现在您可以像这样使用罐装配方:

file1: input1:
    $(run-foo)

$(pattern) : sub/% : %.inp
    $(run-foo)
Run Code Online (Sandbox Code Playgroud)

等等.我想知道是否有可能定义带参数的罐装食谱(或类似的东西),以便我可以像这样执行它们:

file2: input2
    $(run-foo) specific-parameter2 "additional"

file3: input3
    $(run-foo) another-parameter3 "text"
Run Code Online (Sandbox Code Playgroud)

这可能吗?任何提示欢迎:)

dependencies build-process makefile gnu-make

7
推荐指数
1
解决办法
1409
查看次数

在 OS X 上使用 Bash 命令生成文件 ifeq

我正在尝试编写一个 Makefile 来评估 Bash 命令的结果,例如uname.

生成文件:

OS1 = $(uname)
OS2 = Darwin

all:
    @echo $(value OS1)

ifeq ($(uname),Darwin)
    @echo "OK"
else
    @echo "Fail"
endif

ifeq ($(OS1),Darwin)
    @echo "OK"
else
    @echo "Fail"
endif

ifeq ($(OS2),Darwin)
    @echo "OK"
else
    @echo "Fail"
endif
Run Code Online (Sandbox Code Playgroud)

输出:

Darwin
Fail
Fail
OK
Run Code Online (Sandbox Code Playgroud)

如何将变量OS1或命令$(uname)Darwinan 中的文字进行比较ifeq?从我读过的内容来看ifeq,我的 Makefile 中的第二个应该可以工作,但它没有。

我在 OS X 10.9.3 上为 i386-apple-darwin11.3.0 使用 GNU Make 3.81。

macos bash makefile gnu-make

7
推荐指数
1
解决办法
7616
查看次数

makefile中%和*之间的区别是什么

GNU make手册在解释这一部分不擅长,我找不到解释或者我不能推断其他地方的信息.

我知道%是一种通配符,但之间有什么区别%*的背景下targets,dependenciescommands?我在哪里可以使用它,到处都有相同的含义?

target: dependencies ...
    commands
Run Code Online (Sandbox Code Playgroud)

makefile pattern-matching gnu-make

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

如何使用GNU Make为每个目标运行预配方和后配方?

在中make,是否可以为每个目标定义前食谱和后食谱?

我想(隐式)在显式配方的第一行上方插入前食谱,然后(隐式)在显式配方的最后一行之后插入后食谱。

使用正则表达式插入行会很容易,但是隐式行会更干净。

c++ makefile gnu-make

7
推荐指数
1
解决办法
1241
查看次数

如何在make目标之间传递ENV变量

我在makefile中喜欢这个

target1:
       export var1=test
       $(MAKE) target2

target2:
       echo $(var1)
Run Code Online (Sandbox Code Playgroud)

这是空的

我有其他依赖项,所以我想在第一个目标中设置变量,然后所有子项依赖项应该能够访问它

编辑:

.ONESHELL:

target1:
        export var1=test
        echo $(var1)
Run Code Online (Sandbox Code Playgroud)

产量

make target1
export var1=test
echo
Run Code Online (Sandbox Code Playgroud)

linux bash makefile gnu-make

7
推荐指数
1
解决办法
2139
查看次数