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 »

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: 3343
Rejestracja: 2004-06-14, 21:58
Lokalizacja: Linux 5.x x86_64
Kontakt:

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

Post autor: mina86 »

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 code name ‘mina86’ in response to the previous one.
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 »

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