Entrada de Makefile simple y fácil de entender (02): variable común y definición automática de variable, uso (función $ @, $ ^, $ <), anulación de variable, el origen de la variable

1. Definición de variables

Makefile La sintaxis básica para definir variables en el archivo es la siguiente:

 变量的名称=值列表

El nombre de la variable puede estar compuesto por letras mayúsculas y minúsculas, números arábigos y guiones bajos. Los makeespacios en blanco alrededor del signo igual no son un requisito claro porque el tiempo de ejecución de los espacios en blanco adicionales se eliminará automáticamente. En cuanto a la lista de valores, puede ser cero elementos, un elemento o varios elementos. Tal como:

 name_list = aa bb cc

Las variables se pueden usar al llamar $(name_list)o ${name_list}para reemplazar, que son referencias de variables. Ejemplos:

OBJ=main.o test1.o test2.o test3.o
test:$(OBJ)
      gcc -o test $(OBJ)

Cuando desee agregar o eliminar un archivo dependiente, solo necesitamos cambiar el OBJvalor de la variable en él.

2. Asignación de variable

Makefile Cuatro métodos básicos de asignación de variables:

  • Asignación simple ( :=) El método de asignación comúnmente entendido en lenguaje de programación solo es válido para las variables de la declaración actual.
  • Asignación recursiva ( =) Las declaraciones de asignación pueden afectar a múltiples variables y todas las demás variables relacionadas con la variable de destino se ven afectadas.
  • Asignación condicional ( ?=) Si la variable no está definida, use el valor en el símbolo para definir la variable. Si la variable ya ha sido asignada, la declaración de asignación no es válida.
  • +=Agregar asignación ( ) Agrega un nuevo valor a la variable original separada por espacios.

2.1 Asignación simple

escribir Makefile

x := a
y := $(x)b
x := cc
all:
	echo "x=>$(x)"
	echo "y=>$(y)"

Terminal de entrada makepara ver los resultados

echo "x=>cc"
x=>cc
echo "y=>ab"
y=>ab

La variable y solo está relacionada con la x previamente definida, independientemente de si hay un cambio después de x.

2.2 Asignación recursiva

escribir Makefile

x = a
y = $(x)b
x = cc
test:
	echo "x=>$(x)"
	echo "y=>$(y)"

Terminal de entrada makepara ver los resultados

echo "x=>cc"
x=>cc
echo "y=>ccb"
y=>ccb

La variable y está relacionada con el último valor de x.

2.3 Asignación condicional

escribir Makefile

x = a
y = $(x)b
x ?= cc
test:
	echo "x=>$(x)"
	echo "y=>$(y)"

Terminal de entrada makepara ver los resultados

echo "x=>a"
x=>a
echo "y=>ab"
y=>ab

Antes de la definición de x? = Cc, se ha definido x, por lo que esta línea no tiene efecto.

escribir Makefile

#x = a
y = $(x)b
x ?= cc
test:
	echo "x=>$(x)"
	echo "y=>$(y)"

Terminal de entrada makepara ver los resultados

echo "x=>cc"
x=>cc
echo "y=>ccb"
y=>ccb

2.4 Adjuntar asignación

escribir Makefile

x = a
y = $(x)b
x += cc
test:
	echo "x=>$(x)"
	echo "y=>$(y)"

Terminal de entrada makepara ver los resultados

echo "x=>a cc"
x=>a cc
echo "y=>a ccb"
y=>a ccb

3. Variables automáticas

Acerca de las bases de las variables de automatización se puede entender que las Makefilevariables se generan automáticamente. El valor de la variable de automatización se determina de acuerdo con la regla ejecutada y depende del archivo de destino y del archivo dependiente de la regla ejecutada. La siguiente es una descripción de todas las variables de automatización:

Variables de automatización Descripción
PS Indica el nombre del archivo de destino de la regla. Si el destino es un archivo de documento (en Linux, el archivo .a es generalmente un archivo de documento y también un archivo de biblioteca estática), entonces representa el nombre de archivo del documento. En una regla de modo de objetivos múltiples, representa el nombre del archivo que desencadenó la ejecución de la regla.
PS Cuando el archivo de destino es un archivo de biblioteca estática, representa un nombre de miembro de la biblioteca estática.
$ < El primer nombre de archivo dependiente de la regla. Si un archivo de destino se reconstruye usando reglas implícitas, representa el primer archivo dependiente agregado por las reglas implícitas.
PS Una lista de todos los archivos dependientes que son más recientes que el archivo de destino, separados por espacios. Si el archivo de destino es un archivo de biblioteca estático, representa un archivo de biblioteca (archivo .o).
$ ^ Representa una lista de todos los archivos dependientes, separados por espacios. Si el destino es un archivo de biblioteca estático, solo puede representar los nombres de todos los miembros de la biblioteca (archivos .o). Un archivo repetible aparece en función del objetivo, la variable $^solo registra su primer caso citado. Es decir, la variable $^eliminará los archivos dependientes duplicados.
$ + Similar $^, pero conserva los archivos que se repiten en los archivos dependientes. Se utiliza principalmente en la ocasión de referencia cruzada de la biblioteca cuando el programa está vinculado.
PS En reglas de patrones y reglas de patrones estáticos, significa "raíz". "Stem" es la parte representada por "%" en el patrón de destino (cuando hay un directorio en el nombre del archivo, "stem" también incluye la parte del directorio).
main: main.o   name.o greeting.o
	g++ $^ -o $@
main.o: main.cpp
	g++ -c $^ -o $@
name.o: name.cpp
	g++ -c $< -o $@
greeting.o: greeting.cpp greeting.h
	g++ -c $< -o $@

Contraste escrito antes Makefiledel comando, podemos encontrar

  • $@ Representa el archivo de destino;
  • $^ Representa todos los archivos dependientes;
  • $< Representa el primero en el archivo dependiente;

En el cumplimiento de nuestro maketiempo, makereconocerá automáticamente los comandos de las variables automáticas, y reemplazará el valor de las variables de automatización de forma automática.

makeEstas variables se agregan en el carácter Do Fla formación de una serie de variantes de variables de automatización, estas variables pueden operar en nombre de archivo automático.

Variable extendida

4. Anulación de anulación variable

La función es hacer que las Makefilevariables se definan para cubrir el makeparámetro de la variable especificado en el comando

gramática:

override <variable> = <value>
override <variable> := <value>
override <variable> += <value>

Experiencia siguiendo un ejemplo overridedel efecto:

  1. MakefileContenido (no útil override)

SRCS = a.cpp b.cpp 

all:
	echo "SRCS is $(SRCS)"

La implementación de makelos resultados:

wohu@ubuntu:~/cpp/func$ make SRCS=c.cpp
echo "SRCS is c.cpp"
SRCS is c.cpp
wohu@ubuntu:~/cpp/func$ 
  1. MakefileContenido (usado override)
override SRCS = a.cpp b.cpp 

all:
	echo "SRCS is $(SRCS)"

El resultado de ejecutar make:

wohu@ubuntu:~/cpp/func$ make SRCS=c.cpp
echo "SRCS is a.cpp b.cpp "
SRCS is a.cpp b.cpp 
wohu@ubuntu:~/cpp/func$ 

5. Determine la fuente de la variable.

gramática:

$(origin <variable>)

El valor de retorno tiene los siguientes tipos:

Tipos de sentido
indefinido No definida
defecto Es una definición predeterminada, como variable CC.
medio ambiente Es una variable de entorno y el parámetro -e no se usa en make
expediente Definido en Makefile
línea de comando Definido en la línea de comando
anular Redefinido por anulación
automático Es una variable de automatización

Ejemplo:

# Makefile 内容
val-in-file := test-file
override val-override := test-override

all:
    @echo $(origin not-define)    # not-define 没有定义
    @echo $(origin CC)            # CC 是Makefile默认定义的变量
    @echo $(origin PATH)         # PATH 是 bash 环境变量
    @echo $(origin val-in-file)    # 此Makefile中定义的变量
    @echo $(origin val-in-cmd)    # 这个变量会加在 make 的参数中
    @echo $(origin val-override) # 此Makefile中定义的override变量
    @echo $(origin @)             # 自动变量, 具体前面的介绍

llevado a cabo make

$ make val-in-cmd=val-cmd
undefined
default
environment
file
command line
override
automatic

Supongo que te gusta

Origin blog.csdn.net/wohu1104/article/details/110942518
Recomendado
Clasificación