Necesito generar un directorio en mi archivo MAKE y me gustaría no obtener el "error de directorio ya existe" una y otra vez, aunque puedo ignorarlo fácilmente.
Utilizo principalmente mingw / msys, pero me gustaría algo que también funcione en otros shells / sistemas.
Intenté esto pero no funcionó, ¿alguna idea?
ifeq (,$(findstring $(OBJDIR),$(wildcard $(OBJDIR) )))
-mkdir $(OBJDIR)
endif
-p
no funciona en Windows, que es presumiblemente de lo que se trata la pregunta. No estoy seguro de cómo esto fue aceptado.make -p
Unix o Linux?Mirando la documentación oficial de make , aquí hay una buena manera de hacerlo:
Debería ver aquí el uso de | operador de tubería, definiendo un prerrequisito exclusivo de pedido. Lo que significa que el
$(OBJDIR)
objetivo debería existir (en lugar de ser más reciente ) para construir el objetivo actual.Tenga en cuenta que usé
mkdir -p
. La-p
bandera se agregó en comparación con el ejemplo de los documentos. Vea otras respuestas para otra alternativa.fuente
$(OBJDIR)
objetivo debe ser inexistente " . Verifique la presencia de archivos (y marcas de tiempo) para decidir si es necesario construir el destino. Por lo tanto, aquí, si$(OBJDIR)
está ausente, lo construirá, de modo que existe para construir el objetivo actual$(OBJS)
, que se creará dentro.Puede usar el comando de prueba:
fuente
make -j
) debido a una condición de carrera entre el momento en que se prueba la existencia del directorio y se crea. Un trabajo puede probar que no está allí, pero antes de crearlo, otro trabajo crea el directorio. Luego, cuando el primero intente hacerlo, fallará porque el directorio ya existe. La mejor solución en este caso es usar solo los requisitos previos de orden como se menciona en la respuesta de @ TeKa (que debería ser la respuesta aceptada).Aquí hay un truco que uso con GNU make para crear directorios de salida del compilador. Primero defina esta regla:
Luego, haga que todos los archivos que van al directorio dependan del archivo .d en ese directorio:
Tenga en cuenta el uso de $ <en lugar de $ ^.
Finalmente, evite que los archivos .d se eliminen automáticamente:
Omitir el archivo .d, y dependiendo directamente del directorio, no funcionará, ya que la hora de modificación del directorio se actualiza cada vez que se escribe un archivo en ese directorio, lo que forzaría la reconstrucción en cada invocación de make.
fuente
Si tener el directorio ya existente no es un problema para usted, simplemente puede redirigir stderr para ese comando, deshaciéndose del mensaje de error:
fuente
Dentro de su archivo MAKE:
fuente
En Windows
En Unix | Linux
fuente
/bin/sh: 1: Syntax error: end of file unexpected (expecting "then")
fuente
Lo que también funciona para varios directorios, por ejemplo.
Agregar
$(OBJDIR)
como primer objetivo funciona bien.fuente
Funciona bajo mingw32 / msys / cygwin / linux
fuente
Si ignora explícitamente el código de retorno y descarga el flujo de error, su marca ignorará el error si ocurre:
Esto no debería causar un peligro de carrera en una marca paralela, pero no lo he probado para estar seguro.
fuente
Un poco más simple que la respuesta de Lars:
y regla genérica:
No hay archivos táctiles para limpiar o hacer. PRECIOSO :-)
Si desea ver otro pequeño truco genérico de gmake, o si está interesado en la creación no recursiva con un mínimo de andamios, le recomendamos que consulte Dos trucos más baratos de gmake y las otras publicaciones relacionadas con la creación en ese blog.
fuente