make: Nada a ser feito para 'build'

0

Estou aprendendo C ++, embora eu tenha agora uma pergunta geral, ou seja, não para programadores, mas IMHO é a melhor opção para usuários de Linux.

Eu quero o:

make

comando para sempre construir um novo binário, o que poderia ser feito facilmente criando um alias de Bash, algo como:

alias make='\make clean && \make'

Eu gostaria de não estar definindo que alias , isso pode ser alcançado no lado do Makefile ?

O mais simples Makefile , eu poderia sugerir, segue:

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}

Agora, nesse estado, diz:

make: Nothing to be done for 'build'.

Essencialmente, ele provavelmente vê o registro de data e hora recente e não cria, eu acho.

EDIT1:

Eu só vou acrescentar que este problema não é relacionado a Tab , ele é normal quando o binário não está no lugar.

EDIT2:

Depois de fazer modificações de acordo com a resposta de Sato Katsura:

O Makefile tem esta aparência:

link

(Eu fiz o upload, porque as guias não podem ser exibidas no texto)

e ainda diz como as informações acima:

make: Nothing to be done for 'build'.

EDIT3:

$ 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.
    
por Vlastimil 10.11.2017 / 15:11

2 respostas

3

Aqui está uma lista de verificação rápida:

  • use TABs para recuar linhas de ação ( rm , tar , g++ etc.)
  • use $(FOO) para expandir a variável FOO em vez de ${FOO} ou $FOO
  • adicione dependências onde for relevante.

Seu Makefile deve ser parecido com isso (novamente, as linhas são recuadas com TABs, não espaços):

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)
    
por 10.11.2017 / 16:00
0

Encontrei a resposta no StackOverflow .

cito:

Make is behaving correctly. hello already exists and is not older than the .c files, and therefore there is no more work to be done. There are four scenarios in which make will need to (re)build:

  • If you modify one of your .c files, then it will be newer than hello, and then it will have to rebuild when you run make.
  • If you delete hello, then it will obviously have to rebuild it
  • You can force make to rebuild everything with the -B option. make -B all
  • make clean all will delete hello and require a rebuild. (I suggest you look at @Mat's comment about rm -f *.o hello

Por isso, vou parar de insistir em construir sempre, a menos que eu mude o arquivo de código-fonte, que era o que eu avaliei incorretamente como uma espécie de erro antes. Se eu realmente mudar o código-fonte, na primeira vez que eu executar make , ele será construído corretamente. E obviamente não há razão para construí-lo pela segunda vez, então é inteligente, o homem pode dizer.

Para aqueles que querem reconstruir sempre sob quaisquer circunstâncias, você pode definir algo como:

alias make='make -B'

ou mais auto-explicativo:

alias make='make --always-make'

Mas cuidado, ele afirma que:

Unconditionally make all targets.

O all targets cheira mal para mim, então não vou usá-lo. Enfim, eu declaro aqui, então sabemos para referência futura.

    
por 10.11.2017 / 19:08

Tags