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 make
espacios 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 OBJ
valor 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 make
para 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 make
para 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 make
para 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 make
para 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 make
para 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 Makefile
variables 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 Makefile
del 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 make
tiempo, make
reconocerá automáticamente los comandos de las variables automáticas, y reemplazará el valor de las variables de automatización de forma automática.
make
Estas variables se agregan en el carácter D
o F
la formación de una serie de variantes de variables de automatización, estas variables pueden operar en nombre de archivo automático.
4. Anulación de anulación variable
La función es hacer que las Makefile
variables se definan para cubrir el make
parámetro de la variable especificado en el comando
gramática:
override <variable> = <value>
override <variable> := <value>
override <variable> += <value>
Experiencia siguiendo un ejemplo override
del efecto:
Makefile
Contenido (no útiloverride
)
SRCS = a.cpp b.cpp
all:
echo "SRCS is $(SRCS)"
La implementación de make
los resultados:
wohu@ubuntu:~/cpp/func$ make SRCS=c.cpp
echo "SRCS is c.cpp"
SRCS is c.cpp
wohu@ubuntu:~/cpp/func$
Makefile
Contenido (usadooverride
)
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