制作:“构建”无需做任何事情

Lin*_*eak 0 linux make

我正在学习 C++,虽然我现在有一个普遍的问题,即不是针对程序员,但恕我直言最适合 Linux 用户。

我想要:

make
Run Code Online (Sandbox Code Playgroud)

命令总是构建一个新的二进制文件,这可以通过创建一个 Bash 别名来轻松完成,例如:

alias make='\make clean && \make'
Run Code Online (Sandbox Code Playgroud)

我不想定义alias,这可以在Makefile一方实现吗?

Makefile我能想到的最简单的方法如下:

PROGRAM=project

CXXFLAGS=-std=c++17 -Wall -Wextra -Werror -Wpedantic -pedantic-errors

OPTIMIZATION=-O2

.PHONY: build
.PHONY: clean
.PHONY: distrib

build: ${PROGRAM}

clean:
    rm ${PROGRAM}

distrib:
    tar -czf ${PROGRAM}.tar.gz ${PROGRAM}.cpp Makefile

${PROGRAM}:
    g++ ${PROGRAM}.cpp ${CXXFLAGS} ${OPTIMIZATION} -o ${PROGRAM}
Run Code Online (Sandbox Code Playgroud)

现在,在这种状态下,它说:

make: Nothing to be done for 'build'.
Run Code Online (Sandbox Code Playgroud)

从本质上讲,我认为它可能会看到最近的时间戳并且不会构建。

编辑1:

我只会补充一点,这个问题Tab相关,当二进制文件没有到位时它会正常构建。

编辑2:

根据佐藤桂的回答进行修改后:

Makefile如下所示:

https://www.vlastimilburian.cz/public/linux/Makefile.gz

(我上传了,因为Tabs不能用文字显示)

它仍然说如上述信息:

make: Nothing to be done for 'build'.
Run Code Online (Sandbox Code Playgroud)

编辑3:

$ make --version

GNU Make 4.1
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Run Code Online (Sandbox Code Playgroud)

Sat*_*ura 5

这是一个快速检查清单:

  • 使用标签来缩进动作线(rmtarg++等)
  • 用于$(FOO)扩展变量FOO而不是${FOO}$FOO
  • 在相关的地方添加依赖项。

Makefile应该看起来像这样(同样,行用制表符缩进,而不是空格):

PROGRAM=project
CXXFLAGS=-std=c++17 -Wall -Wextra -Werror -Wpedantic -pedantic-errors
OPTIMIZATION=-O2

.PHONY: build
.PHONY: clean
.PHONY: distrib      

build: $(PROGRAM)

clean:
        rm $(PROGRAM)

distrib:
        tar -czf $(PROGRAM).tar.gz $(PROGRAM).cpp Makefile

$(PROGRAM): $(PROGRAM).cpp
        g++ $(PROGRAM).cpp $(CXXFLAGS) $(OPTIMIZATION) -o $(PROGRAM)
Run Code Online (Sandbox Code Playgroud)