2009-05-24 8 views
14

Probablemente la pregunta no sea la mejor para describir mi problema, pero no puedo pensar en una mejor. Mi makefile es la siguiente:¿Cómo hacer que mi archivo MAKE se compile y ejecute correctamente?

PROGRAM_NAME = prog 

OBJECT_FILES = $(PROGRAM_NAME).o 
CFLAGS = -O2 -Wall -g 

$(PROGRAM_NAME) : $(OBJECT_FILES) 
    gcc $(CFLAGS) -o [email protected] $(OBJECT_FILES) 

$(PROGRAM_NAME).o : $(PROGRAM_NAME).c data.h 
    gcc $(CFLAGS) -c $< 

clean : 
    $(RM) $(PROGRAM_NAME) 
    $(RM) $(OBJECT_FILES) 
    $(RM) *~ *.bak 

run : 
    @$(MAKE) && ./$(PROGRAM_NAME) $(ARGS) 

Cuando quiero compilar y ejecutar acabo de hacer "hacer carrera". El problema con esto es que mi programa maneja la señal producida por Ctrl + Z y si comienzo mi programa con "make run", la señal se enviará a "make run" y no a mi propio programa.

Básicamente, llamando a "hacer carrera" no es el mismo que llamar directamente "hacer & & ./prog" porque en el primer caso, "hacer carrera" no va a terminar a menos que "PROG" termina primero.

¿Hay alguna forma de evitar esto?

Respuesta

12

Ejecutar desde el archivo MAKE es un poco inusual. ¿Está tratando de duplicar el ítem del menú "Compilar y ejecutar" que proporciona algún IDE? Make no está bien equipado para hacer eso.

Todo lo que ocurre en los comandos de destino ocurre en subprocesos que no están conectados directamente al terminal, por lo que make recibe el trazo de la tecla.

Otra cosa a tener en cuenta: generalmente el objeto-archivo para la etapa ejecutable (vinculación) utiliza un conjunto diferente de indicadores (LDFLAGS y LIBS) y luego la etapa de compilación. En este sencillo ejemplo, puede salirse con la suya, pero si copia este archivo MAKE para usarlo en un caso más complicado, se encontrará con problemas.

+0

mejor no usarlo de esta manera entonces ... :) –

3

Como dijo la respuesta de dmckee, make (1) está haciendo algo, no para compilar y ejecutar.

Por supuesto, nada de lo que se detiene para la creación de una concha alias maquillaje de ejecución que hace lo pretende 'hacer & & args ./prog'.

13

Puede simplificar su objetivo de 'correr' al tener que depender de si su programa es hasta la fecha, y luego simplemente ejecutar el programa:

run: ${PROGRAM_NAME} 
     ./${PROGRAM} ${ARGS} 

No hay mucha razón para ejecutar make cuando estás ya está ejecutando make - al menos, no en este contexto. Tal vez para operaciones recursivas (en diferentes directorios), pero vea 'Recursive Make Considered Harmful'.

Además, su archivo MAKE normalmente debe proporcionar un objetivo 'all' y normalmente debería ser el primero y, por lo tanto, el objetivo predeterminado.

4

Si usted va a generar y ejecutar una y otra vez, usted puede utilizar el comando history para ayudar con esto:

# Run this once 
make && ./foo 

# Repeat last command 
!! 
+2

Incluso mejor En Bash puedes usar '! make' para repetir el último comando que comienza con" make ", incluso si ejecutas otros comandos en el medio. Ese flujo de trabajo funciona muy bien para mí. –

Cuestiones relacionadas