makefile - special - Cómo incluir el prefijo de ruta en GNU Make rule rule
makefile $@ (1)
Puede leer sobre cómo coinciden los patrones :
Cuando el patrón de destino no contiene una barra inclinada (y generalmente no lo hace), los nombres de directorio en los nombres de archivo se eliminan del nombre del archivo antes de que se compare con el prefijo y el sufijo de destino. Después de comparar el nombre del archivo con el patrón objetivo, los nombres del directorio, junto con la barra que los finaliza, se agregan a los nombres de los requisitos previos generados a partir de los patrones de requisitos previos de la regla de patrones y el nombre del archivo. Los directorios son ignorados solo con el propósito de encontrar una regla implícita para usar, no en la aplicación de esa regla. Por lo tanto, ''e% t'' coincide con el nombre del archivo src / eat, con ''src / a'' como el tallo. Cuando los requisitos previos se convierten en nombres de archivo, los directorios del tallo se agregan al frente, mientras que el resto del tallo se sustituye por el ''%''. La raíz ''src / a'' con un patrón de requisito previo ''c% r'' proporciona el nombre de archivo src / car.
Lo anterior explica por qué nice/path/
se antepone al prerrequisito /project/something/1.bar
.
Una solución sería usar nombres de archivo completos en las reglas, por ejemplo:
${CURDIR}/nice/path/%.foo: /project/something/%.bar
Considera lo siguiente:
%.foo: %.bar
echo $< > $@
Suponiendo que tenemos un archivo 1.bar
, el comando ejecutado es simplemente echo 1.bar > 1.foo
. Sin embargo, cuando %
contiene una ruta, en lugar de solo un nombre de archivo, comienza a ser meticuloso. Mi problema es que quiero anteponer otra ruta a %.bar
, el patrón se vuelve completamente destrozado. Es decir, cuando %.bar
es nice/path/1.bar
, esto se vuelve imposible:
%.foo: /project/something/%.bar
echo $< > $@
Esto se ejecutará, pero ejecuta echo nice/path//project/something/1.bar > 1.foo
en lugar de echo /project/something/nice/path1.bar > 1.foo
La razón de esto está en cómo hace que su patrón gobierne. De los documentos:
Cuando el patrón de destino no contiene una barra inclinada (y generalmente no lo hace), los nombres de directorio en los nombres de archivo se eliminan del nombre del archivo antes de que se compare con el prefijo y el sufijo de destino. [...] Los directorios son ignorados solo con el propósito de encontrar una regla implícita para usar, no en la aplicación de esa regla. Por lo tanto, ''e% t'' coincide con el nombre del archivo src / eat, con ''src / a'' como el tallo. Cuando los requisitos previos se convierten en nombres de archivo, los directorios del tallo se agregan al frente, mientras que el resto del tallo se sustituye por el ''%''. La raíz ''src / a'' con un patrón de requisito previo ''c% r'' da el nombre de archivo src / car
¿Hay alguna manera de desactivar esto para una regla específica?