IDA kursmaterial Informationsblad make. make

Relevanta dokument
prog: prog.c gcc -g -Wall prog.c /usr/local/bib/c/58an/modules/modul.o -o prog

TDP005: Introduktion till Make

TDP005 Projekt: Objektorienterat system

Programmering i C++ Kompilering från kommandoraden

Program. Kapitel make Program Interpreterande och kompilerande program

Programsystemkonstruktion med C++: Övning 1. Karl Palmskog september 2010

Det finns många flaggor till g++,

1 Språket C Valet av språket C++ för kompendiet. 1.2 Språket. 1.3 Att programmera. 1.4 Hello World Börja programmera

Introduktion till programmering, hösten 2011

Inledning. Vad är ett datorprogram, egentligen? Olika språk. Problemlösning och algoritmer. 1DV433 Strukturerad programmering med C Mats Loock

emopluppen Användning av "Ant" Niklas Backlund Version: 1.4 ( 2002/04/26 07:27:52 UTC)

NetBeans 5.5. Avsikt. Projektfönster

Kapitel 12. Mer om program Att rapportera buggar och problem make

Ett enkelt program i C++, hello.cpp. #include <iostream> int main() { std::cout << "Hello World\n"; return 0; } C++, Övning 1

Föreläsning 9: Förprocessorn och stora program

Eclipse. Avsikt. Nu ska ett fönster liknande figuren till höger synas.

Automatisera uppgifter med Visual Basic-makron

NetBeans 7. Avsikt. Projektfönster

grundläggande C++, funktioner m.m.

Word kortkommando. 5. I rutan till höger klickar du på kommandot eller elementet.

TDP005. Föreläsning 2. Filip Strömbäck

Introduktionslaboration

Uppgift 1 - programmet, Uppg6.m, visade jag på föreläsning 1. Luftmotståndet på ett objekt som färdas genom luft ges av formeln

Alla filer som bearbetar PHP script ska avslutas med ändelsen.php, exempelvis ska en indexsida till en hemsida heta index.php

TDIU01 - Programmering i C++, grundkurs

Uppgift 1 ( Betyg 3 uppgift )

Instruktioner för att kunna programmera på skolans datorer

Java: Utvecklingsverktyg, datatyper, kontrollstrukturer

Webbgenvägar. Krishna Tateneni Yves Arrouye Översättare: Stefan Asserhäll

Så här skriver du ditt första program i C++

Introduktionslaboration

Värmedistribution i plåt

Innehållsförteckning. Exempel. Åtkomst & användarhandledning

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Raspberry Pi och Tellstick, ett program i C.

Handbok KAppTemplate. Anne-Marie Mahfouf Översättare: Stefan Asserhäll

Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten Programmering: att instruera en maskin att utföra en uppgift, kräver olika språk:

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Handbok KWrite. T.C. Hollingsworth Christoph Cullmann Översättare: Stefan Asserhäll

Jobbschemaläggare. Morgan N. Sandquist Utvecklare: Gary Meyer Granskare: Lauri Watts Översättare: Stefan Asserhäll

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Inledande programmering med C# (1DV402) Introduktion till C#

Laboration 10 - Eclipse

Inledande programmering med C# (1DV402) Ditt första C#-program med Visual Studio

Datorövning 5 Exponentiella modeller och elasticitetssamband

Linux i Inbyggda System, 7.5hp Linux Cross Toolchain. Cross Development Toolchain binutil, glibc and gcc

Handbok för skrivbordsväljaren. Dirk Doerflinger Antonio Larrosa Jiménez Pino Toscano Matthias Elter Matthias Ettrich Översättare: Stefan Asserhäll

Objektorienterad programmering i Java I

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

Föreläsning 3. Programmering, C och programmeringsmiljö

CWPlot - Användarbeskrivning

HI1024 Programmering, grundkurs TEN

SKAPA DET FÖRSTA PROJEKTET I mikrobasic PRO for AVR

Introduktion C-programmering

Home Nerladdning typsnitt Ladda Ladda fonter Menyn Skrivare Menyn teckensnitt Menyn Verktygsfält Menyn Hjälp Snabbtangenter

tentamensdags och lab 3

Kom igång med Topocad ArcGIS

Repetition C-programmering

Avslutning. Kapitel Komprimering av filer

Introduktion till programmering och Python Grundkurs i programmering med Python

Kör som root handbok. Geert Jansen Översättare: Stefan Asserhäll

Anteckningar 1: Grundläggande saker

HI1024 Programmering, grundkurs TEN

1 Modulär programutveckling.

DATORÖVNING 3: EXPERIMENT MED

KPP053, HT2016 MATLAB, Föreläsning 1. Introduktion till MATLAB Skript Inläsning och utskrift av variabler Ekvationssystem Anonyma funktioner

Objektorienterad programmering i Java I. Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6

En klass behöver både deklaration och definition. Daniel Aarno Globala funktioner och variabler är OK.

DATORÖVNING 6: CENTRALA GRÄNSVÄRDES-

Dokumentation. Avancerade Wordfunktioner

Omkoppling av in- och utmatning. In- och utmatning i Unix. Kommando exempel, ls, pipe forts. Kommando exempel, ls, pipe

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

Handbok KWatchGnuPG. Marc Mutz Utvecklare: Steffen Hansen Utvecklare: David Faure Översättare: Stefan Asserhäll

Föreläsning 5 5DV086 - Programspråk

DATORÖVNING 2: STATISTISK INFERENS.

Handicom. Symbol for Windows. Encyklopedi. Version 3.4

Datorer och datoranvändning Föreläsningar 2014/15. Föreläsning 1 Unix. Operativsystem. Unix

Handbok Artikulate. Andreas Cord-Landwehr Ondrila Gupta Översättare: Stefan Asserhäll

Övningsuppgifter kapitel 8

Hur man kompilerar och kör IT++-program med MinGW. 1 Sammanfattning. 2 Om dokumentet. 3 Om min konfiguration

Kompilera och exekvera Javakod

Föreläsning 2. Operativsystem och programmering

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

Filbindningar. Mike McBride Översättare: Stefan Asserhäll

Handbok KSystemLog. Nicolas Ternisien

Bygg din egen verktygslåda till PC-DMIS. Workshop, PC-DMIS dagar 2015

Handbok Förstoringsglaset. Sarang Lakare Olaf Schmidt Översättare: Stefan Asserhäll

ADOBE FLASH PLAYER 10.3 Lokal inställningshanterare

DATORÖVNING 5: SANNOLIKHETSFÖRDELNINGAR FÖR

Migrera till Word 2010

Linjär algebra med tillämpningar, lab 1

Din egen webserver med Apache

Viktigt! Vill du ha möjligheten att återställa originalbilarna utan hemladdning läs nedan om återställning innan du börjar med installationen!

DRAFT. CVS kurs laboration 1 Checka in, ut och uppdatera. Marcus Rejås. 17 november 2002

Handbok Fjärranslutning till skrivbord. Brad Hards Urs Wolfer Översättare: Stefan Asserhäll

Menyhantering i AutoCAD 2000.

Migrera till Access 2010

Egna genvägar. Subhashish Pradhan T.C. Hollingsworth Översättare: Stefan Asserhäll

Juni 2003 PlanCon Viewer Handledning PlanCon PROJEKT

1 Logga in 1. 2 Byta lösenord 1. 3 Hemkatalog 1. 4 Unixintroduktion Viktiga kommandon Läsa 3

Transkript:

make make är ett verktyg som främst används för att underhålla, uppdatera och återskapa program och filer. Det är dock ett generellt verktyg som kan användas även i många andra sammanhang. En avancerad sida av make är att make har en hel del inbyggd kunskap om hur kommandon ska ges för att översätta program skrivna i olika programspråk till körbara program. Normal skriver man dock s.k. make-filer, i vilka man anger hur make ska utföra olika slags bearbetningar. make-filer En make-fil är en textfil som make läser. Då make används för att generera ett körbart program från källkod, innehåller make-filen typiskt kompileringskommandon för att skapa objektkodsmoduler och länkkommando för att sätta samman objektkodsmodulerna det körbara programmet. Make-filen kan även innehålla kommandon för hur programmet och eventuell tillhörande dokumentation ska installeras, liksom kommandon för att städa upp efter översättning och installation. Det finns två standardnamn för make-filer, makefile och Makefile. En make-fil kan ha ett godtyckligt namn, men det underlättar att använder dessa standardnamn. Köra make make körs i det enklaste fallet med skalkommandot: % make make söker då i arbetsmappen efter i första hand makefile, och om ingen sådan fil finns, i andra hand efter Makefile. Finns ingen av dessa filer avslutas make. Man kan köra make och med växeln -f för att uttryckligen ange namnet på den make-fil som make ska använda: % make -f makefil I detta fall kan make-filen ha ett godtyckligt namn. Det finns många fler växlar som kan ges till make, se manualsidan för make(1). Konstruktion av make-filer En make-fil kan vara mycket avancerad och make har en hel del inbyggd kunskap, t.ex. hur källkodsfiler för ett programspråk ska kompileras och hur körbara program ska genereras. Här finns endast utrymme för att översiktligt beskriva hur enkla make-filer kan konstrueras. Några avancerade möjligheter beskrivs dock kort avslutningsvis. Det finns tre grundläggande begrepp då det gäller make-filer: mål (target), beroende (dependency) och regel (rule). Dessutom är makron (macros) något som är mycket användbart och det finns en stor mängd fördefinierade makron i make. Dessa fyra begrepp beskrivs översiktligt nedan. Mål Ett mål (target) är ofta en fil (module) som ska konstrueras av make. Det kan vara en objektkodsmodul, som då är ett delmål (sekundärt mål) eller ett körbart program som är slutmålet. Om man har ett program som är uppdelat på flera källkodsfiler, av vilka en fil innehåller huvudprogrammet, kan delmålen vara att kompilera varje enskild källkodsfil till objektkod, och slutmålet att länka dess objektkodsmoduler till det körbara programmet. Vissa mål kan innebära att en följd av kommandon utförs utan att någon modul eller annat skapas. Ett exempel på ett sådant mål kan vara att radera alla objektkodsmoduler som skapats vid kompilering av ett program, efter det att programmet genererats och installerats. I en make-fil anges ett mål först på en rad och efter målet skrivs ett kolon. Om det finns beroenden anges dessa efter kolonet, annars ingenting ytterligare på målraden. Exempel ges nedan. 1(6)

Beroende Ett beroende (dependency) beskriver vilken eller vilka andra moduler eller delmål som ett mål är beroende av. En objektkodsfil är t.ex. beroende av den motsvarande källkodsfilen. Om ett mål är att skapa objektkodsfilen för en källkodsfil main.cc, ser målraden ut enligt följande: Målet är objektkodsfilen main.o och denna beror av källkodsfilen main.cc. Regler En regel (rule) är ett eller flera kommandon som ska utföras för att skapa ett mål. För det exempel som påbörjades ovan kan den tillhörande regeln vara: g++ -c main.cc För att generera målet, objektkodsfilen main.o, ska således källkodsfilen main.cc kompileras med kommandot g++ -c main.cc (regeln). Väljaren -c anger att kompileringen ska avbrytas innan länkningen, vilket medför att objektkod skrivs på filen main.o. Om flera kommandon behöver utföras för att skapa ett mål, skrivs varje kommando på en egen rad. Observera, varje regelrad måste inledas med ett tabulertecken! Makron Ett makro är en variabel som kan användas i beroenden och i regler. Makron definieras på formen: MAKRONAMN = sträng Ett makronamn skrivs typiskt med versaler. Strängen som makronamnet representerar är en godtycklig sträng, som kan innehålla även blanktecken och som avslutas då den rad ett makro skrivs på avslutas eller då ett kommentartecken (#) skrivs. Exempel på två enkelt makron, avslutade med kommentar: CCC = g++ CCFLAGS = -g # Suns C++-kompilator # Kompilera för avlusning Då ett makronamn används skrivs det inom parenteser och med ett inledande dollartecken. I det exempel som använts ovan skulle ovan definierade makron kunna användas enligt följande: $(CCC) $(CCFLAGS) -c main.cc Makron definieras vanligtvis inledningsvis i make-filer och används i flera syften. Makron kan användas för att parametrisera innehållet i en make-fil och därigenom förenkla ändringar man kan vilja göra. Om man t.ex. vill använda CC i stället för g++, ändrar man g++ till CC i makrot CCC. Om man ej önskar kompilera för avlusning, tar man bara bort väljaren -g på den rad makrot CCFLAGS definieras. En annan användning av makron är att ge enkla namn på kanske långa strängar man behöver skriva. Om man t.ex. har många objektkodsmoduler man vill ange, kan man definiera ett makro i stil med: OBJECTS = qsort.o bsearch.o hash.o interface.o main.o Då objektkodsmodulerna ska refereras i något sammanhang, behöver man endast ange $(OBJECTS). Ett mer komplett exempel För det exempel som använts ovan behövs ytterligare ett mål för att skapa det körbara programmet main från objektkodsmodulen main.o. Dessutom kan man vilja ha ett mål för att städa upp efter att programmet main genererats och installerats på annan plats (det är i och för inte så realistiskt...). 2(6)

En enkel make-fil för att göra detta kan se ut enligt följande. # # Makefile för att kompilera programmet main med g++ # CCC = g++ CCFLAGS = -g -std=c++98 -pedantic -Wall -Wextra main : main.o $(CCC) $(CCFLAGS) main.o -o main $(CCC) $(CCFLAGS) -c main.cc # Städa arbetsmappen clean : @ \rm -f *.o Om man ger kommandot make kommer följande utskrifter att erhållas, under förutsättning att objektkodsmodulen ej existerar eller att den är föråldrad samt att programmet kompileras utan fel: % make g++ -g -std=c++98 -pedantic -Wall -Wextra -c main.cc g++ -g -std=c++98 -pedantic -Wall -Wextra main.o -o main Om man endast vill utföra målet main.o kan man ange detta genom kommandot: % make main.o g++ -g -std=c++98 -pedantic -Wall -Wextra -c main.cc Om man därefter, utan att ändra i källkodsfilen main.cc, ger kommandot make kommer endast huvudmålet att behöva utföras; make noterar i detta fall att en aktuell objektkodsmodul redan finns: % make g++ -g -std=c++98 -pedantic -Wall -Wextra main.o -o main Detta är en klar fördel med make, endast de filer som behöver kompileras om, kompileras om. Målet clean städar bort objektkodsfilerna och används enligt: % make clean Tecknet @ medför att kommandot ej skrivs ut. Tecknet \ före kommandot rm innebär att ett eventuellt alias som införts för rm (t.ex. rm -i) ej ska användas, utan rm-kommandot i dess egentliga definition (vilket är att radera angivna filer utan begära bekräftelse på att så ska ske). Anm. Om man har ett program på en enda källkodsfil, t.ex. main.cc, kan make kompilera ett sådant program, utan att en make-fil alls existerar, om man ger kommandot: % make main Detta fungerar därför att make har fördefinierade makron, se nedan, för vanliga filnamnssuffix, t.ex..cc, och olika kompilatorer, t.ex. g++, samt kompileringskommandon som ska användas i olika fall. Argumentet main till make medför att make letar efter en fil med namnet main. Då en sådan fil hittas, main.cc, bestämmer suffixet.cc, att ett förutbestämt kompileringskommando ska utföras. 3(6)

Flera källkodsfiler Antag att vi har ett program som består av källkodsfilerna main.cc, a.cc, b.cc och c.cc, med tillhörande inkluderingsfiler. En enkel make-fil för att kompilera det programmet kan vara: CCC = g++ CCFLAGS = -g -std=c++98 -pedantic -Wall -Wextra main : main.o a.o b.o c.o $(CCC) $(CCFLAGS) main.o a.o b.o c.o -o main $(CCC) $(CCFLAGS) -c main.cc a.o : a.cc $(CCC) $(CCFLAGS) -c a.cc b.o : b.cc $(CCC) $(CCFLAGS) -c b.cc c.o : c.cc $(CCC) $(CCFLAGS) -c c.cc Varje implementeringsfil har ett eget mål för att kompilera källkoden till objektkod. Huvudmålet main är ett i grunden länkkommando för att sätta ihop objektkodsmodulerna till det körbara programmet. Fördefinierade makron För ett flertal programspråk och en del verktyg finns föredefinierade makron som anger hur olika saker ska utföras. För C++ finns fördefinierade makron som bestämmer kommandona för kompilering och länkning: CCC C++C CCFLAGS C++FLAGS CCPFLAGS LDFLAGS Kompilator (förvalt värde är CC). Alternativ till CCC, se ovan. Väljare till kompilerigskommandot (inga förvalda). Alternativ till CCFLAGS (förvalt värde -O, för optimering). Väljare till preprocessorn (inga förvalda). Väljare till länkaren, ld (inga förvalda). COMPILE.cc = $(CCC) $(CCFLAGS) $(CPPFLAGS) -c Kommandoraden för kompilering, sammansatt av värdena för CCC, CCFLAGS, CPPFLAGS, samt väljaren -c. COMPILE.C = $(C++C) $(C++FLAGS) $(CPPFLAGS) -c Alternativ till COMPILE.cc, se ovan. LINK.cc = $(CCC) $(CCFLAGS) $(CPPFLAGS) $(LDFLAGS) Kommandot för länkning, sammansatt av värdena för CCC, CCFLAGS, CPPFLAGS och LDFLAGS. LINK.C = $(C++C) $(C++FLAGS) $(CPPFLAGS) $(LDFLAGS) -target Alternativ till LINK.cc, se ovan. 4(6)

Fördefinierade makron kan användas i egna make-filer enligt följande exempel: C++FLAGS += -g -std=c++98 -pedantic -Wallx -Wextra main : main.o a.o b.o c.o $(LINK.cc) main.o a.o b.o c.o -o main $(COMPILE.cc) main.cc a.o : a.cc $(COMPILE.cc) a.cc b.o : b.cc $(COMPILE.cc) b.cc c.o : c.cc $(COMPILE.cc) c.cc Implicita regler Kommandoraderna i exemplet ovan för att kompilera main.o, a.o, b.o och.c.o från motsvarande källkodsfiler är identiska med den implicita suffixregeln.cc.o, som anger hur källkodsfiler med suffix.cc ska kompileras till objektkod,.o. Det finns också en suffixregel.cc, som anger hur källkodsfiler ska kompileras och länkas till ett körbart program. Dessa regler använder dessutom dynamiska makron (t$@ och $<, se nedan):.cc:.cc.o: $(LINK.cc) -o $@ $< $(COMPILE.cc) $(OUTPUT_OPTION) $< Dessa implicita regler innebär att delmålen i exemplet ovan, eftersom de är identiska med de implicita suffixreglerna, inte behöver anges. make-filen kan alltså skrivas: C++FLAGS += -g -std=c++98 -pedantic -Wall -Wextra main : main.o a.o b.o c.o $(LINK.cc) main.o a.o b.o c.o -o main Dynamiska makron Dynamiska makron får sina värden dynamisk, dvs då make utför make-filen, och det sker mål för mål. Dessa makron används i hög grad i implicita regler men är också mycket användbara för att själv konstruera regler. Här är några av de vanligaste dynamiska makrona: $@ Namnet på det aktuella målet. $? Listan av beroenden. $< Namnet på beroendefilen, som valts av make för användning i en implicit regel. $* Basnamnet för det aktuella målet (dvs namnet utan suffix). I t.ex. suffixregeln.cc.o ovan, ersätts $< med namnet på den beroendefil, i detta fall en.cc.fil för det aktuella målet (t.ex. main.cc om det aktuella målet valt av make är main.o). 5(6)

6(6)