Makefile - Diretivas

Existem inúmeras diretivas disponíveis em várias formas. omakeprograma em seu sistema pode não suportar todas as diretivas. Portanto, verifique se o seumake apoia as diretrizes que estamos explicando aqui. GNU make suporta essas diretivas.

Diretivas Condicionais

As diretivas condicionais são -

  • o ifeqdiretiva começa a condicional e especifica a condição. Ele contém dois argumentos, separados por vírgula e entre parênteses. A substituição de variável é realizada em ambos os argumentos e, em seguida, eles são comparados. As linhas do makefile após o ifeq são obedecidas se os dois argumentos corresponderem; caso contrário, eles são ignorados.

  • o ifneqdiretiva começa a condicional e especifica a condição. Ele contém dois argumentos, separados por vírgula e entre parênteses. A substituição de variável é realizada em ambos os argumentos e, em seguida, eles são comparados. As linhas do makefile após o ifneq serão obedecidas se os dois argumentos não corresponderem; caso contrário, eles são ignorados.

  • o ifdefdiretiva começa a condicional e especifica a condição. Ele contém um único argumento. Se o argumento fornecido for verdadeiro, a condição se torna verdadeira.

  • o ifndefdiretiva começa a condicional e especifica a condição. Ele contém um único argumento. Se o argumento fornecido for falso, a condição se tornará verdadeira.

  • o elsediretiva faz com que as seguintes linhas sejam obedecidas se a condicional anterior falhar. No exemplo acima, isso significa que o segundo comando alternativo de vinculação é usado sempre que a primeira alternativa não é usada. É opcional ter um else em uma condicional.

  • o endifdiretiva termina o condicional. Cada condicional deve terminar com um endif.

Sintaxe das diretivas condicionais

A sintaxe de uma condicional simples sem outra é a seguinte -

conditional-directive
   text-if-true
endif

O text-if-true pode ser qualquer linha de texto, a ser considerada como parte do makefile se a condição for verdadeira. Se a condição for falsa, nenhum texto será usado.

A sintaxe de uma condicional complexa é a seguinte -

conditional-directive
   text-if-true
else
   text-if-false
endif

Se a condição for verdadeira, text-if-true será usado; caso contrário, text-if-false é usado. O text-if-false pode ser qualquer número de linhas de texto.

A sintaxe da diretiva condicional é a mesma, seja a condicional simples ou complexa. Existem quatro diretivas diferentes que testam várias condições. Eles são dados -

ifeq (arg1, arg2)
ifeq 'arg1' 'arg2'
ifeq "arg1" "arg2"
ifeq "arg1" 'arg2'
ifeq 'arg1' "arg2"

As diretivas opostas das condições acima são as seguintes -

ifneq (arg1, arg2)
ifneq 'arg1' 'arg2'
ifneq "arg1" "arg2"
ifneq "arg1" 'arg2'
ifneq 'arg1' "arg2"

Exemplo de diretivas condicionais

libs_for_gcc = -lgnu
normal_libs =

foo: $(objects)
ifeq ($(CC),gcc)
   $(CC) -o foo $(objects) $(libs_for_gcc)
else
   $(CC) -o foo $(objects) $(normal_libs)
endif

A incluir diretiva

o include directive permite makepara suspender a leitura do makefile atual e ler um ou mais makefiles antes de continuar. A diretiva é uma linha no makefile que parece a seguir -

include filenames...

Os nomes de arquivo podem conter padrões de nome de arquivo shell. Espaços extras são permitidos e ignorados no início da linha, mas uma tabulação não é permitida. Por exemplo, se você tiver três arquivos `.mk ', a saber,` a.mk', `b.mk 'e` c.mk', e $ (bar), então ele se expande para bish bash, e então o seguinte expressão.

include foo *.mk $(bar)

is equivalent to:

include foo a.mk b.mk c.mk bish bash

Quando o makeprocessa uma diretiva de inclusão, ele suspende a leitura do makefile e lê cada arquivo listado por vez. Quando terminar,make continua lendo o makefile no qual a diretiva aparece.

A diretiva de substituição

Se uma variável foi definida com um argumento de comando, então as atribuições comuns no makefile são ignoradas. Se você quiser definir a variável no makefile mesmo que tenha sido definida com um argumento de comando, você pode usar uma diretiva de substituição, que é uma linha que parece a seguir -

override variable = value

or

override variable := value