Obsługa podkatalogów w Makefile

0

Cześć!

Jestem na pierwszym roku studiów i za zadanie miałem napisać program w C. Mam natomiast problem z ustawieniem makefile tak, żeby działał po mojej myśli. Dodam, że pytałem prowadzącego i nie wiedział jak to rozwiązać.

Struktura mojej aplikacji wygląda tak

/lib/gaus/ - biblioteka rozwiązująca układy równań
/lib/aprox/ - aplikacja do aproksymacji
/src/ - moje pliki źródłowe, korzystające z plików w /lib/
/test/ - proste testy jednostkowe, korzystające z plików z /src/
/resources/ - pliki konfiguracyjne, wyjściowe itd
/bin/ - pliki wykonywalne

Udało mi się napisać komendę, która kompiluje mój projekt, jednak nie mogę jej przenieść do pliku makefile. Wygląda ona mniej więcej tak:

cc -Wall -Ilib/aprox/ -Ilib/gaus lib/aprox/*.c -L lib/gaus -l ge -lm -o bin/cooling src/*.c src/*.h
./bin/cooling 

Chciałbym, żeby możliwe było wywołanie zarówno "make", który skompiluje projekt, jak i "make test", który skompiluje testy jednostkowe i uruchomi maina z katalogu /test/.

Może ktoś pokazać mi jak mniej więcej powinien wyglądać prawidłowy plik makefile? Próbowałem szukać jak dołączać katalogi, ale nic z tego.
Z góry dzięki za pomoc!

0

A to ma być biblioteka czy program/kilka programów? Bo coś mi się tu nie zgadza tbh.

Make gnu manual w google powinien znaleźć coś czego szukasz.

Jakaś ścieżka na start (nie rozwiąże twojego problemu może nakieruje);
Jak bym ja to zrobił. napisał prosty skrypcik w bashu aby we wskazanym directory znalazł wsyztskie pliki.c i zamienił je na pliki.o
następnie to przekazywał. Przyjmijmy że to się nazywa: ./getobj

Nasz make:
OBJ := $(shell ./getobj src)
OBJTEST := $(shell ./getobj test)
CFLAGS := #tu akies flagi kompilacji.

.PHONY : clear cleartest program test

to wystartuje ale musi być OBJ aby było spełnione więc wykona wsyztskie obiekty które przekazął mu nasz skrypt

program : $(OBJ)

#normalnie nie daje się obj jak nie rozróżniamy ale tu trzba przez testy ;-)
$(OBJ) : %.o : %.c
$(CC) $(CFLAGS) #tu coś się stanie pewnie użyjemy $< aby wziąć %.c bądź $@ dla %.o

test : $(OBJTEST)

$(OBJTEST) : %.o : %.c
#podobnie z testami

Prowadzący fail. Ok no coś tam pomogłem. Powodzenia.

0

Zamiast skryptu w bash'u polecam poznać funkcje: patsubst, czy wildcard.

Dziwne masz to polecnie. Po co na końcu dajesz te pliki nagłówkowe? Co do skryptu Makefile to musisz mieć dwa TARGET'y, jeden domyślny (pierwszy), buduje aplikację. Drugi wywoływany np. przez: make test buduje i uruchamia testy.

Dokumentacja do GNU Make nie jest taka długa, na jaką wygląda, a dużo się z niej dowiesz ;-)

0
Sparrow-hawk napisał(a):

Zamiast skryptu w bash'u polecam poznać funkcje: patsubst, czy wildcard.

Ja z wildcardami też się na początku bawiłem ale potem jak coś trzeba było lekko zmienić dodac to za dużo czasu się traciło.

1 użytkowników online, w tym zalogowanych: 0, gości: 1