Dom 18 Agosto, 06:37:03 - 2019

Autore Topic: Esercizi makefile del 31/03/11  (Letto 1444 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline Zoso

  • Studente di Dottorato
  • ***
  • Post: 205
  • FeedBack: +52/-7
  • Oh captain, my captain!
    • Mostra profilo
    • LineHeight
Esercizi makefile del 31/03/11
« il: Dom 03 Aprile, 18:55:33 - 2011 »
Primo esercizio:

Codice: [Seleziona]
CC = gcc
EXEC = versione1
OBJECTS = A.o B.o main.o

$(EXEC): $(OBJECTS)
$(CC) -o $(EXEC) $(OBJECTS)

A.o: A.c A.h B.h F.h
$(CC) -c A.c

B.o: B.c B.h F.h
$(CC) -c B.c

main.o: main.c A.h F.h
$(CC) -c main.c

clean:
\rm *.o $(EXEC)

Secondo esercizio:

Codice: [Seleziona]
CC = gcc
EXEC1 = versione1
EXEC2 = versione2
FLAGS = -DMESSAGE="\"[versione 2] \""
OBJECTS1 = A1.o B1.o main1.o
OBJECTS2 = A2.o B2.o main2.o

# versione1

$(EXEC1): $(OBJECTS1)
$(CC) -o $(EXEC1) $(OBJECTS1)

A1.o: A.c A.h B.h F.h
$(CC) -c A.c -o A1.o

B1.o: B.c B.h F.h
$(CC) -c B.c -o B1.o

main1.o: main.c A.h F.h
$(CC) -c main.c -o main1.o

# versione2

$(EXEC2): $(OBJECTS2)
$(CC) -o $(EXEC2) $(OBJECTS2)

A2.o: A.c A.h B.h F.h
$(CC) -c A.c $(FLAGS) -o A2.o

B2.o: B.c B.h F.h
$(CC) -c B.c $(FLAGS) -o B2.o

main2.o: main.c A.h F.h
$(CC) -c main.c $(FLAGS) -o main2.o

# generale

all: $(EXEC1) $(EXEC2)

clean:
\rm *.o $(EXEC)

Terzo esercizio (un po' incasinata a dir a verità, credo esistano modi migliori...):

Codice: [Seleziona]
CC = gcc
EXEC1 = versione1
EXEC2 = versione2
FLAGS = -DMESSAGE="\"[versione 2] \""
OBJECTS1 = $(BIN)/A1.o $(BIN)/B1.o $(BIN)/main1.o
OBJECTS2 = $(BIN)/A2.o $(BIN)/B2.o $(BIN)/main2.o
SRC = src
INCLUDE = include
BIN = bin
PATHS = -I$(INCLUDE)

# versione1

$(EXEC1): $(OBJECTS1)
$(CC) -o $(BIN)/$(EXEC1) $(OBJECTS1)

$(BIN)/A1.o: $(SRC)/A.c $(INCLUDE)/A.h $(INCLUDE)/B.h $(INCLUDE)/F.h
$(CC) -c $(PATHS) $(SRC)/A.c -o $(BIN)/A1.o

$(BIN)/B1.o: $(SRC)/B.c $(INCLUDE)/B.h $(INCLUDE)/F.h
$(CC) -c $(PATHS) $(SRC)/B.c -o $(BIN)/B1.o

$(BIN)/main1.o: $(SRC)/main.c $(INCLUDE)/A.h $(INCLUDE)/F.h
$(CC) -c $(PATHS) $(SRC)/main.c -o $(BIN)/main1.o

# versione2

$(EXEC2): $(OBJECTS2)
$(CC) -o $(BIN)/$(EXEC2) $(OBJECTS2)

$(BIN)/A2.o: $(SRC)/A.c $(INCLUDE)/A.h $(INCLUDE)/B.h $(INCLUDE)/F.h
$(CC) -c $(PATHS) $(SRC)/A.c $(FLAGS) -o $(BIN)/A2.o

$(BIN)/B2.o: $(SRC)/B.c $(INCLUDE)/B.h $(INCLUDE)/F.h
$(CC) -c $(PATHS) $(SRC)/B.c $(FLAGS) -o $(BIN)/B2.o

$(BIN)/main2.o: $(SRC)/main.c $(INCLUDE)/A.h $(INCLUDE)/F.h
$(CC) -c $(PATHS) $(SRC)/main.c $(FLAGS) -o $(BIN)/main2.o

# generale

all: $(EXEC1) $(EXEC2)

clean:
\rm $(BIN)/*

Offline Tom89

  • Professore Ordinario
  • **
  • Post: 703
  • FeedBack: +145/-79
    • Mostra profilo
Re: Esercizi makefile del 31/03/11
« Risposta #1 il: Lun 04 Aprile, 23:24:37 - 2011 »
Ecco il secondo esercizio (non funziona):
Codice: [Seleziona]
OBJS = A.o B.o main.o
CC = gcc
DEBUG = -g
CFLAGS := -Wall -c $(DEBUG)
LFLAGS = -Wall $(DEBUG)

VER = "[versione 2] "

setversion2 :
CFLAGS += -DMESSAGE=$(VER)

versione1 : $(OBJS)
$(CC) $(LFLAGS) $(OBJS) -o versione1

versione2 : setversion2 $(OBJS)
$(CC) $(LFLAGS) $(OBJS) -o versione2

clean:
\rm *.o *~ versione1 versione2

A.h : F.h

B.h : F.h

A.o : A.c A.h B.h
$(CC) $(CFLAGS) A.c

B.o : B.c B.h
$(CC) $(CFLAGS) B.c

main.o : main.c A.h
$(CC) $(CFLAGS) main.c

Il mio ragionamento è stato: versione1 funziona come al solito; versione2 invece prima di chiamare qualsiasi dipendenza modifica il valore di CFLAGS per inserire -DMESSAGE="[versione 2] ".
Stando al log di make in effetti l'ordine delle azioni è giusto... ma make rimane sempre uguale.

Roba trovata online dice che con := si definisce una variabile e con += la si può modificare... ma non va.
Lumi?

Offline Seril

  • Direttore di Dipartimento
  • ***
  • Post: 2729
  • FeedBack: +263/-467
    • Mostra profilo
Re: Esercizi makefile del 31/03/11
« Risposta #2 il: Mer 06 Aprile, 18:25:49 - 2011 »
primo esercizio fatto però non ho usato le macro

Codice: [Seleziona]
versione1: main.o A.o B.o
gcc -o versione1 main.o A.o B.o

main.o: main.c A.h
gcc -c main.c A.h

A.o: A.c A.h B.h F.h
gcc -c A.c A.h B.h F.h

B.o: B.c B.h F.h
gcc -c B.c B.h F.h
secondo e terzo esercizio
Codice: [Seleziona]
all:versione1 versione2

#versione1

versione1: bin/main.o bin/A.o bin/B.o
gcc -o bin/versione1 bin/main.o bin/A.o bin/B.o

bin/main.o: src/main.c include/A.h include/F.h
gcc -c -Iinclude src/main.c -o bin/main.o

bin/A.o: src/A.c include/A.h include/B.h include/F.h
gcc -c -Iinclude src/A.c -o bin/A.o

bin/B.o: src/B.c include/B.h include/F.h
gcc -c -Iinclude src/B.c -o bin/B.o

#versione2

versione2: bin/main2.o bin/A2.o bin/B2.o
gcc -o bin/versione2 bin/main2.o bin/A2.o bin/B2.o

bin/main2.o: src/main.c include/A.h include/F.h
gcc -c -Iinclude src/main.c -DMESSAGE="\"[versione 2]\"" -o bin/main2.o

bin/A2.o: src/A.c include/A.h include/B.h include/F.h
gcc -c -Iinclude src/A.c -DMESSAGE="\"[versione 2]\""  -o bin/A2.o

bin/B2.o: src/B.c include/B.h include/F.h
gcc -c -Iinclude src/B.c -DMESSAGE="\"[versione 2]\""  -o bin/B2.o
« Ultima modifica: Mer 06 Aprile, 20:35:20 - 2011 da Seril »

Offline yellow

  • Neo-Laureato
  • **
  • Post: 59
  • FeedBack: +1/-0
    • Mostra profilo
Re:Esercizi makefile del 31/03/11
« Risposta #3 il: Mar 04 Novembre, 23:05:27 - 2014 »
Vado un secondo OT, come faccio a eseguire il make da linea di comando dalla cartella progetto nell'esercizio3? Grazie.

Offline yellow

  • Neo-Laureato
  • **
  • Post: 59
  • FeedBack: +1/-0
    • Mostra profilo
Re:Esercizi makefile del 31/03/11
« Risposta #4 il: Mer 05 Novembre, 16:11:00 - 2014 »
please! help me!

Offline MarvinPuppets

  • Neo-Laureato
  • **
  • Post: 60
  • FeedBack: +2/-0
    • Mostra profilo
Re:Esercizi makefile del 31/03/11
« Risposta #5 il: Mer 05 Novembre, 17:13:36 - 2014 »
Nella cartella ci deve essere un file di nome Makefile altrimenti non funziona, su linux se hai make installato è sufficiente entrare nella cartella "cd /percorso/alla/cartella" digitare "make" e premere invio. Se sei su windows la procedura non cambia molto, tranne che devi installare mingw, e forse settare qualche PATH, puoi comunque fare la prova digitando make nel terminale e se non ti trova il comando c'è qualcosa che non va.

Offline yellow

  • Neo-Laureato
  • **
  • Post: 59
  • FeedBack: +1/-0
    • Mostra profilo
Re:Esercizi makefile del 31/03/11
« Risposta #6 il: Mer 05 Novembre, 17:38:36 - 2014 »
sono su Ubuntu. Il punto è che nel'esercizio di cui sopra il makefile è all'interno della cartella makefile e quindi facendo partire il make dalla cartella makefile non mi trova le cartelle con i file da compilare. la struttura è questa:
-progetto
--include
--src
--bin
--makefile(dove dentro ho il makefile)

se do da cartella progetto comando make non me lo trova, se lo da da makefile non mi trova le cartelle poichè sono al livello superiore della struttura! :P

Offline MarvinPuppets

  • Neo-Laureato
  • **
  • Post: 60
  • FeedBack: +2/-0
    • Mostra profilo
Re:Esercizi makefile del 31/03/11
« Risposta #7 il: Mer 05 Novembre, 19:14:15 - 2014 »
Guarda io non seguo il corso quindi non ho idea degli esercizi, ma uso make da vario tempo per i miei progetti. Comunque prova a spostare il makefile nella cartella dove ci sono i sorgenti (mv Makefile ../Makefile per capirci), perché a giudicare dallo script cerca i file allo stesso livello del makefile. Così facendo dovrebbe andare.

Offline yellow

  • Neo-Laureato
  • **
  • Post: 59
  • FeedBack: +1/-0
    • Mostra profilo
Re:Esercizi makefile del 31/03/11
« Risposta #8 il: Sab 08 Novembre, 16:34:09 - 2014 »
credo che bisogni per forza invocarlo dalla cartella di root, grazie per l'aiuto! ;)