dudas con make

Iniciado por Drewermerc, 14 Mayo 2014, 01:51 AM

0 Miembros y 3 Visitantes están viendo este tema.

Drewermerc

hola a todos.
bueno el problema que tengo es que cree un makefile pero cuando lo ejecuto no se ejcutan todos los target que hago y si pongo todas las intrucciones en un solo target si se ejecuta.
a la unica manera que encontre de que se ejcute todo bien es poniendo:
make object && make clean
pero como e visto ejemplos de make con varios target por eso quisiera saber si tengo alun error o me falta algo.


    CC = gcc
     
    CFLAGS=-I/home/bugtraq/progc/make2/funcion.h \
        -I/home/bugtraq/progc/make2/funciondos.h
     
    nombre= prueba
     
    valores=-Wall -m32 -g -c
     
    clean=rm -f
     
    object: $(nombre).c $(nombre).o
        $(CC)  $(valores) $(nombre).c  -o  $(nombre).o
        $(CC)  $(nombre).o  -o  $(nombre)
     
    clean: $(nombre).o
        $(clean) $(nombre).o

saludos.
drewermerc.

Gh057

hola Drewermerc, a simple vista veo un par de cosas, primer punto es que un makefile es una sucesión de reglas para gestionar la compilación de una aplicación, en donde dichas reglas se definen como:

objetivo: dependencias (archivos objetos)
          comandos o sentencias para compilar los .c asociados a ellos

veo que luego de tu objetivo tienes como dependecia un solo objeto, debes detallar todos para que los enlace, si llamas a una variable para ello, debería definirse arriba todos los .o necesarios; luego asociarlo a sus respectivas fuentes. (puedes hacer uso de %.o y %.c).

con lo cual, lo correcto sería mediante variables definidas o bien con %, para cada .o que dependa de .c (%.o : %.c) aplicar la regla CC.....

una regla podría ser para ello
Citar$(CC)   $(valores) -c $< -o $@

lo que tendrías que hacer simplemente es a tu variable nombre, asignarle prueba, otra_prueba, etc.

Citarnombre= prueba  otra_prueba

para clean otra opción es hacer un *.o, si quieres limpiar todos por ejemplo...

Citar
clean:
   rm -f *.o

espero haber sido claro, es más facil verlo que explicarlo jajaaa saludos!
4 d0nd3 1r4 3l gh057? l4 r3d 3s 74n v4s74 3 1nf1n1t4...

Drewermerc

hola Gh057.

bueno gracias por responder, pues segun yo con lo que me dijiste tiene que quedar el codigo asi.


        CC = gcc
     
       CFLAGS=-I/home/bugtraq/progc/make2/funcion.h \
           -I/home/bugtraq/progc/make2/funciondos.h
     
       nombre= prueba
     
       valores=-Wall -m32 -g -c
     
       clean=rm -f
     
       object: $(nombre).c $(nombre).o %.o : %.c
           $(CC)   $(valores) -c $< -o $@
           $(CC)  $(nombre).o  -o  $(nombre)
     
       clean: $(nombre).o
           $(clean) $(nombre).o

pero me dice lo siguiente.
Makefile:17: *** hay varios patrones de objetivos.  Alto.
y lo intente poniendolo asi:

       object: $(nombre).c $(nombre).o %.o
           $(CC)   $(valores) -c $< -o $@
           $(CC)  $(nombre).o  -o  $(nombre)


pero medecia.
make: *** No hay ninguna regla para construir el objetivo `%.o', necesario para `object'.  Alto.

entonces se lo quite pero me sigue ejecutando solo un objetivo y el clean ya no se ejecuta.
nose si este mal alomejor  y me equivoque con la sintaxis si es asi corrigeme porfavor.

Gh057

#3
hola  , no no a ver podrías hacer algo así..

Citar

        CC = gcc
        CFLAGS=-Wall -m32 -g -c  //agregas parámetros como el debugger
        LDFLAGS=-I (ruta a...)/funcion.h  -I (ruta a...)funciondos.h                           //bibliotecas externas
         
        OBJECTS=(ruta a proyecto...)/prueba.o (ruta a proyecto...)/otra_prueba.o  //objetos de prueba..
        SOURCES=(ruta a proyecto..)/prueba.c (ruta a proyecto...)/otra_prueba.c  //fuentes del proyecto

        proyecto: $(OBJECTS)
            $(CC) $(OBJECTS) -o proyecto
   
        depend:
            makedepend $(LDFLAGS) $(OBJECTS) $(SOURCES)//se ejecuta si solamente si se modifican

        clean:
           rm -f $(OBJECTS)

luego haz make depend y make.

obviamente podrías extraer también las rutas a un PATH... como te darás cuenta tienes muchísimas formas de hacerlo.

un cordial saludo

(agrego) el hecho de hacerlo así y no solamente con la sentencia de compilación, que de esa forma si no se modifica no compila toooodo el proyecto... puede seguir mejorándose por ejemplo: si las bibliotecas también se están desarrollando, debes linkearlas los .a por separado -puedes hasta hacer un make para automatizar dentro de cada una- y de esa manera tu trabajo avanzará más rápido.

toda la  info necesaria en gnu.org, bueno un paneo muy bueno también en la wiki, etc etc.
4 d0nd3 1r4 3l gh057? l4 r3d 3s 74n v4s74 3 1nf1n1t4...

Drewermerc

bueno pues lo ejecuto y sigue igual solo ejecuta el primer objetivo en este caso proyecto y los demas ya no.
cuando make depende me dice esto.
makedepend -I/home/bugtraq/progc/make2/funcion.h -I/home/bugtraq/progc/make2/funciondos.h /home/bugtraq/progc/make2/prueba.o  /home/bugtraq/progc/make2/prueba.c
make: makedepend: No se encontr� el programa
make: *** [depend] Error 127

que crees que este fallando.
bueno gracias revisare las paginas para aprender mas de lo makefile

Gh057

hola Drewermerc, una cosa son los objetos y otra los objetivos... yo te amplié a varios objetos, y agregué lo de las dependencias, pero sigues teniendo un solo objetivo como tal, por ejemplo proyecto (o el nombre que quieras para el ejecutable) cuando es para diferentes .o ( o sea compilas por separado) ahí le agregas diferentes targets...

(bueno no es del todo cierto... depend y clean también son targets! solo que no dependen de nadie,  se ejecuta el comando o sentencia asociada al llamado de los mismos)
.
en la wiki tienes un ejemplo con variables y el uso del comodín %, como te indicaba al inicio; 
por favor mírate también el enlace que te pasé por mp basante similar aunque mejor explicado como el que luego te propuse.

otro lugar por donde puede ayudarte a entender el mecanismo es  usando la ide anjuta, el mismo te genera automáticamente un make para tu proyecto; luego abres el makefile generado y verás que es muy similar la sintaxis, solo agrega algunos detalles como por ejemplo el uso de sufijos como .c .cpp etc...

saludos
4 d0nd3 1r4 3l gh057? l4 r3d 3s 74n v4s74 3 1nf1n1t4...

Drewermerc

hola bueno pues muchas gracias y perdon es que no habia visto que me habias enviado un mensaje lo siento.
bueno gracias revisare todo.
nos vemos.
saludos.
drewermerc.  :)