Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: muu kieli: Makefile: Vain muuttuneiden kääntäminen

Teuro [30.05.2016 20:26:07]

#

Millä tavalla makefile kannattaa rakentaa, jotta monitasoisesta lähdekoodikansiosta saadaan käännettyän objektitiedostot objektikansioon? Tällä hetkellä olen rakentanut makefilen alla olevaan tapaan, jolla objektitiedostot kääntyvät kiltisti oikeaan kansioon ja linkitys toimii oikein.

Tässä kuitenkin uudelleen kääntäminen kääntää koko projektin uudestaan, mutta olisi hyvä, jos kääntäminen kohdistuisi vain muuttuneille koodilistauksille. Tämän enempää höpisemättä laitan makefilen esille.

CC          = g++
CFLAGS      = -g -c -O -Wall -Wextra -pedantic -std=gnu++11
LDFLAGS     = -lsfml-system -lsfml-window -lsfml-graphics -lsqlite3pp -lsqlite3
SOURCES     = $(wildcard src/*.cpp) $(wildcard src/*/*.cpp) $(wildcard src/*/*/*.cpp) $(wildcard src/*/*/*/*.cpp)
OBJECTS     = $(SOURCES:.cpp=.o)
OBJ			= obj/
OBJ_FILES	= $(OBJ)*.o
EXECUTABLE  = atcradar.exe
RM			= del
RM_FILES	= /s *.o

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
	$(CC) $(OBJ_FILES) $(LDFLAGS) -o bin/$(EXECUTABLE)

.cpp.o:
	$(CC) $(CFLAGS) $(LDFLAGS) $< -o $(OBJ)$(notdir $@)
clean:
	$(RM) $(RM_FILES)

Metabolix [30.05.2016 20:55:58]

#

Makefilessä on selvä virhe, joka selviää, jos tulostat kaikkien muuttujien sisällöt.

SOURCES = src/main.cpp
OBJECTS = src/main.o
OBJ_FILES = obj/*.o

Binäärin linkityksen riippuvuutena on määritelty src/main.o. Tiedostoa src/main.o ei kuitenkaan koskaan luoda, vaan sen luomiseen tarkoitettu kohta .cpp.o tuottaa oikeasti tiedoston obj/main.o. Koska make ei koskaan löydä vanhaa tiedostoa src/main.o, make ajaa käännöskomennon aina uudestaan.

Muuttujissa OBJECTS ja OBJ_FILES pitäisi olla täsmälleen sama sisältö, ts. pitäisi olla vain yksi OBJECTS-muuttuja.

Ratkaisu on käyttää .o.cpp:n sijaan %-merkintöjä:

build/%.o: src/%
	# huom, mkdir on tuunattava käyttöjärjestelmän mukaan
	mkdir -p $(dir $@)
	$(CXX) $(CXXFLAGS) $< -c -o $@

Tästäkin puuttuu vielä se ominaisuus, jolla saadaan systeemi tunnistamaan myös otsikkotiedostojen muutokset, jotka vaikuttavat muiden tiedostojen kääntämiseen. Sen osalta voit katsoa PutkaRTS:n Makefilen magiaa – ei ehkä kaunista mutta toimivaa.

Tai sitten voit vain ottaa jonkin valmiin ratkaisun, IDE:n, CMaken tms.

Teuro [30.05.2016 21:19:53]

#

Kiitoksia mainiosta selityksestäsi ja selkeän virheen osoittamisesta. PutkaRTS:n makefile on luettu ja yritetty hymmärtää parhaan taidon mukaan. Siitä saikin sopivasti muokkaamalla oikein sopivan version aikaiseksi.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta