Eu tenho o seguinte makefile para o meu projeto e gostaria de configurá-lo para versões de lançamento e depuração. No meu código, eu tenho muitas #ifdef DEBUG
macros, então é simplesmente uma questão de definir essa macro e adicionar os -g3 -gdwarf2
sinalizadores aos compiladores. Como posso fazer isso?
$(CC) = g++ -g3 -gdwarf2
$(cc) = gcc -g3 -gdwarf2
all: executable
executable: CommandParser.tab.o CommandParser.yy.o Command.o
g++ -g -o output CommandParser.yy.o CommandParser.tab.o Command.o -lfl
CommandParser.yy.o: CommandParser.l
flex -o CommandParser.yy.c CommandParser.l
gcc -g -c CommandParser.yy.c
CommandParser.tab.o: CommandParser.y
bison -d CommandParser.y
g++ -g -c CommandParser.tab.c
Command.o: Command.cpp
g++ -g -c Command.cpp
clean:
rm -f CommandParser.tab.* CommandParser.yy.* output *.o
Apenas para esclarecer, quando digo compilações de liberação / depuração, quero poder digitar make
e obter uma compilação de liberação ou make debug
obter uma compilação de depuração, sem comentar manualmente as coisas no makefile.
.PHONY
Respostas:
Você pode usar valores variáveis específicos do destino . Exemplo:
Lembre-se de usar $ (CXX) ou $ (CC) em todos os seus comandos de compilação.
Então, 'make debug' terá sinalizadores extras como -DDEBUG e -g onde 'make' não terá.
Em uma nota lateral, você pode tornar seu Makefile muito mais conciso, como outras postagens sugeriram.
fonte
Essa pergunta apareceu com frequência ao procurar um problema semelhante, portanto, acho que uma solução totalmente implementada é necessária. Especialmente porque eu (e eu diria que outros) lutam para reunir todas as várias respostas.
Abaixo está um Makefile de amostra que suporta vários tipos de compilação em diretórios separados. O exemplo ilustrado mostra compilações de depuração e lançamento.
Apoia ...
fonte
src
, modifique a linhaSRCS = file1.c file2.c file3.c file4.c
para lerSRCS = src/file1.c src/file2.c src/file3.c src/file4.c
.Se por configurar release / build, você quer dizer que você só precisa de uma configuração por makefile, é simplesmente uma questão e desacoplar CC e CFLAGS:
Dependendo se você pode usar o gnu makefile, é possível usar o condicional para tornar isso um pouco mais sofisticado e controlá-lo na linha de comando:
e então use:
Se você precisar controlar as duas configurações ao mesmo tempo, acho melhor ter diretórios de construção e um diretório de configuração / configuração.
fonte
ifeq (DEBUG, 1)
) para mim, aDEBUG
variável precisava ser envolto em parênteses assim:ifeq ($(DEBUG), 1)
.Observe que você também pode tornar seu Makefile mais simples, ao mesmo tempo:
Agora você não precisa repetir os nomes de arquivos em todo o lugar. Quaisquer arquivos .l serão passados pelo flex e gcc, quaisquer arquivos .y serão passados pelo bison e g ++, e quaisquer arquivos .cpp apenas pelo g ++.
Basta listar os arquivos .o que você espera que acabem, e o Make fará o trabalho de descobrir quais regras podem satisfazer as necessidades ...
para o registro:
$@
O nome do arquivo de destino (aquele antes dos dois pontos)$<
O nome do primeiro (ou único) arquivo de pré-requisito (o primeiro após os dois pontos)$^
Os nomes de todos os arquivos de pré-requisito (separados por espaço)$*
A raiz (o bit que corresponde ao%
curinga na definição de regra.fonte
$^
é para todos os arquivos de pré-requisito.você pode ter uma variável
então você pode usar uma declaração condicional
fonte
Concluindo as respostas anteriores ... Você precisa fazer referência às variáveis que definem informações em seus comandos ...
fonte
ifeq (DEBUG, 1)
deveria ser anotadaifeq ($(DEBUG), 1)
. Suponho que possa estar se referindo à sua resposta aqui.Você também pode adicionar algo simples ao seu Makefile, como
Em seguida, compile-o para depuração
make DEBUG=1
fonte