Makefile i złożony projekt, jakieś wskazówki?

Problemy dotyczące programowania.

Moderatorzy: Moderatorzy, Administratorzy

Pajaczek
Użytkownik
Posty: 1439
Rejestracja: 2006-08-03, 13:16
Lokalizacja: Winny Gród

Makefile i złożony projekt, jakieś wskazówki?

Post autor: Pajaczek » 2013-02-28, 14:30

Przyznam że dotąd unikałem tematu i raczej robiłem dziwne konstrukcje przy większych projektach. Ale czas już by zapanować nad całością w sposób przemyślany.

Oczywiście nie obce jest mi tworzenie podstawowych Makefile'ów, dla projektów składających się z wielu plików źródłowych, ale co w przypadku gdy projekt rozrasta się znacznie. Chciałbym umieścić poszczególne części projektu w podkatalogach, czy wręcz podkatalogach zagnieżdzonych. O ile w przypadku kilkudziesięciu plików i jednego poziomu podkatalogów nie ma problemu. Tworzę reguły dla podkatalogów kompilujące bez linkowania do plik.o zaś ten plik jest użyty w katalogu głównym programu, do zbudowania (zlinkowania) ostatecznego programu. Coś jak:

Kod: Zaznacz cały

bash-4.1$ cat Makefile 
CC 	= gcc
FLAGS 	=
SUBDIRS = sub1

all: program

program: code.c code1.out code2.out sub1/sub1.out
	${CC} ${FLAGS} $^ -o program

code%.out: code%.c
	${CC} ${FLAGS} -c code$*.c -o code$*.out
	
sub1/sub1.out: subdirs

subdirs:
	make -C sub1
clean:
	rm -f -R *.out
clean_all:
	if [ -f program ]; then rm program; fi
	rm -f -R *.out

bash-4.1$ cat sub1/Makefile 
CC=gcc
CFLAGS=

all: sub1.out sub2.out

sub%.out: sub%.c
	${CC} ${CFLAGS} -c sub$*.c -o sub$*.out
clean:
	rm -r -f *.out

bash-4.1$
z wynikiem

Kod: Zaznacz cały

bash-4.1$ make
gcc  -c code1.c -o code1.out
gcc  -c code2.c -o code2.out
make -C sub1
make[1]: Entering directory `/test/sub1'
gcc  -c sub1.c -o sub1.out
gcc  -c sub2.c -o sub2.out
make[1]: Leaving directory `/test/sub1'
gcc  code.c code1.out code2.out sub1/sub1.out -o program
(tutaj sub2.out jest oczywiście zbędny, ale nie w tym rzecz). I to dla nawet sporych projektów działa. Ale co zrobić gdy projekt z jakiś względów rozrasta się, i wymaga głębszego zagnieżdżenia? Jak wykonalne jest stworzenie 3 poziomowej struktury, w której wszystkie podkatalogi mają swoje Makefile (wywoływane rekurencyjnie lub nie), Makefile katalogu tworzy jeden plik wynikowy z zawartości swoich plików źródłowych oraz ewentualnych plików wynikowych swoich podkatalogów, a dopiero w katalogu głównym łączymy (linkujemy) to w jedną całość. Czy w ogóle tędy droga? (chyba tak, bo chociażby jądro jest chyba w ten sposób składane, ale przyznam że jego Makefile jest ciężki w analizie)

Ps. Mam nadzieję, że za mocno nie zamotałem, ale przyznaję, trochę się w tym gubię ;)

Awatar użytkownika
mina86
Moderator
Posty: 3314
Rejestracja: 2004-06-14, 21:58
Lokalizacja: Linux 4.x x86_64
Kontakt:

Re: Makefile i złożony projekt, jakieś wskazówki?

Post autor: mina86 » 2013-02-28, 18:07

Osobiście rzadko bawię się w rekurencyjne Makefile i raczej wolę automatyczne generowanie zależności. Dla przykładu http://pastebin.com/4xNh6Dme, który generuje plik pokroju http://pastebin.com/a5hcu0Cs i w połączeniu z http://pastebin.com/gRngpMev daje całkiem przyjemny rezultat.

Dodanie automatycznego generowania zależności typu “binarka: lista-plików.o” nie jest jakoś tragicznie skomplikowane.
Zastrzegam sobie prawo nieanalizowania postów pisanych niepoprawną polszczyzną. :: Post generated automatically by A.I. system called “mina86” in response to the previous one. :: Tiny Applications

Pajaczek
Użytkownik
Posty: 1439
Rejestracja: 2006-08-03, 13:16
Lokalizacja: Winny Gród

Re: Makefile i złożony projekt, jakieś wskazówki?

Post autor: Pajaczek » 2013-02-28, 20:15

Dzięki mina86, przyjrzę się temu, i być może będzie to jakieś wyjście, chciałem się jednak podciągnąć trochę z tworzeniem złożonych makefile samodzielnie...

django:
Visual Studia raczej nie używam, zaś AVR Studio (bo o ten IDE Ci zapewne chodziło) nie generuje takiej złożoności Makefile'ów o jakie mi tutaj chodzi (bo i nie ma tam takiej potrzeby), więc niewiele mogę tam podejrzeć. Zresztą, nie tak dawno to dla AVR Studia trzeba było generować Makefile ;)

ODPOWIEDZ