make on työkalu, jota käytetään ohjelmistokehityksessä erityisesti C- ja C++-projektien kokoamiseen. Se helpottaa projektien hallintaa ja automatisoi käännösprosessin.
CMake ja qmake ovat build-järjestelmien generaattoreita, jotka voivat käyttää makea tai muita työkaluja taustalla.
Makefile on tekstitiedosto, joka kertoo make
-työkalulle,
miten projekti pitää kääntää. Siinä määritellään riippuvuudet, käännöskomennot ja säännöt,
jotka kertovat mitä pitää tehdä, kun tiedosto muuttuu.
target: dependencies
command
Jokainen sääntö koostuu kohteesta (target), sen riippuvuuksista
(dependencies) ja komennosta, joka suoritetaan.
Tärkeää: komennon edessä täytyy olla TAB
-merkki.
Seuraavassa esimerkissä käännetään yksinkertainen C++-projekti, jossa on kolme tiedostoa: main.cpp
, utils.cpp
ja utils.h
.
//main.cpp #include <iostream> #include "utils.h" int main() { std::cout << "Tulos: " << kerroKahdella(5) << std::endl; return 0; }
//utils.h #ifndef UTILS_H #define UTILS_H int kerroKahdella(int luku); #endif
//utils.cpp #include "utils.h" int kerroKahdella(int luku) { return luku * 2; }Jotta saadaan toimiva sovellus pitäisi suorittaa komento:
CXX = g++
#Windowsissa:
#CXX = C:\Qt\Tools\mingw1310_64\bin\g++
CXXFLAGS = -Wall -std=c++17
TARGET = myapp
OBJS = main.o utils.o
all: $(TARGET)
$(TARGET): $(OBJS)
$(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJS)
%.o: %.cpp
$(CXX) $(CXXFLAGS) -c $< -o $@
clean:
rm -f *.o $(TARGET)
make
– kokoaa ohjelman oletuskohteen mukaan (yleensä "all")make clean
– poistaa väliaikaiset tiedostot (esim. .o-tiedostot ja lopullisen ohjelman)Jos edellisen esimerkin sovellus halutaan rakentaa cmake:lla voidaan luoda tiedosto CMakeLists.txt:
cmake_minimum_required(VERSION 3.10) project(myapp LANGUAGES CXX) # C++-standardin asetus ja varoitukset set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") # Lähdekoodit set(SOURCES main.cpp utils.cpp ) # Luo suoritettava tiedosto add_executable(${PROJECT_NAME} ${SOURCES})
Ominaisuus | Make | CMake |
---|---|---|
Abstraktiotaso | Pienempi — kirjoitat suoraan säännöt (komennot, riippuvuudet). | Korkeampi — kuvaat projektin (lähteet, kohteet, asetukset) ja CMake generoi build-järjestelmän. |
Siirrettävyys | Hyvä paikallisissa unix-ympäristöissä, mutta Makefile voi olla sidottu tiettyihin työkaluversioihin. | Erinomainen — yksi CMakeLists.txt voi tuottaa Makefilet, Visual Studio -projektit, Xcode-projektit, jne. |
Monimutkaiset projektit | Hankala ylläpitää, koska kaiken logiikan pitää olla Makefilessä. | Luotu monimutkaisiin projekteihin: kirjastot, alikansiot, testit, paketointi, konfigurointi. |
Riippuvuuksien hallinta | Usein käsin määriteltävä (.o-riippuvuudet ym.). | Automaattinen; CMake tietää mitä kääntää ja miten linkittää kohteet. |
Kääntäjä- ja alusta-abstrahointi | Kirjoitat suoraan komennot kuten g++ — ei automaattista vaihtoa eri kääntäjien välillä. |
Tuntee GCC:n, Clangin, MSVC:n ym., ja muokkaa liput oikeiksi kullakin kääntäjällä. |
Oppimiskäyrä | Helppo aloittaa — suorat komennot ja säännöt. | Vaatii opettelua (CMake-syntaksi ja käsitteet), mutta hyöty kasvaa projektin koon myötä. |
Konfigurointi & lisäominaisuudet | Rajoitetumpaa; monimutkaiset asetukset voivat vaatia paljon käsin työtä. | Tukee globaaleja vaihtoehtoja, -D -muuttujia, testejä, pakkausta ja ulkoisia riippuvuuksia (find_package). |
Kun kannattaa käyttää | Pienet projektit, nopea prototypointi tai kun haluat täydellisen kontrollin yksittäisistä komennoista. | Monialustaiset projektit, suuret koodikannat, kirjastot ja tapaukset joissa haluat automaattisia generointeja ja integraatioita. |
Tein videot joilla käyn läpi edelliset esimerkit. Ensimmäisellä videolla asennan Windowsiin Ubuntun käyttäen WSL-systeemiä: