Como evitar que o Make substitua aleatoriamente os arquivos?

2

Suponha que eu esteja em um diretório vazio. Se eu agora criar um Makefile contendo nada além de all: randomFilename e um arquivo vazio chamado randomFilename.sh , então o GNU Make executará cat randomFilename.sh >randomFilename; chmod a+x randomFilename quando make for chamado.

$ echo 'all: randomFilename' > Makefile
$ make
make: *** No rule to make target 'randomFilename', needed by 'all'.  Stop.
$ touch randomFilename.sh
$ make
cat randomFilename.sh >randomFilename 
chmod a+x randomFilename
$ make -v | head -n2
GNU Make 4.0
Built for x86_64-pc-linux-gnu

Pior ainda, o Make substitui um arquivo chamado randomFilename , se já existir.

$ echo "My content" > randomFilename
$ echo "My content, all gone" > randomFilename.sh
$ make -B
cat randomFilename.sh >randomFilename 
chmod a+x randomFilename
$ cat randomFilename
My content, all gone

Eu gostaria de encontrar o motivo pelo qual o Make faz isso e uma maneira de evitar o comportamento.

    
por Witiko 05.10.2015 / 14:41

2 respostas

2

Esse comportamento é o resultado das regras internas de sufixo Make (neste caso, para versões herdadas do sistema de controle de código-fonte [ 1 ]). As regras do sufixo interno podem ser desabilitadas especificando um% pseudo-alvo .SUFFIXES vazio [ 2 ]:

$ echo '.SUFFIXES:'          >  Makefile
$ echo 'all: randomFilename' >> Makefile
$ make
make: *** No rule to make target 'randomFilename', needed by 'all'.  Stop.
$ touch randomFilename.sh
$ make
make: *** No rule to make target 'randomFilename', needed by 'all'.  Stop.
    
por 05.10.2015 / 21:08
0

O comportamento que você descreve não depende do programa make, mas do shell.

Se você tiver um shell POSIX e deixar todas as linhas de comando no makefile começarem:

set -o noclobber;

os arquivos existentes não serão mais sobrescritos pelo operador > .

Observe que isso ainda não afeta outros programas que podem ser chamados e que criam arquivos.

    
por 05.10.2015 / 15:35

Tags