Automatyzacja kompilacji. Automatyzacja kompilacji 1/40

Podobne dokumenty
Automatyzacja kompilacji. Automatyzacja kompilacji 1/28

Make jest programem komputerowym automatyzującym proces kompilacji programów, na które składa się wiele zależnych od siebie plików.

Programowanie Proceduralne

Tworzenie oprogramowania

Programowanie w C++ Wykład 10. Katarzyna Grzelak. 21 maja K.Grzelak (Wykład 10) Programowanie w C++ 1 / 21

Tworzenie oprogramowania

Podstawy programowania. Wykład 9 Preprocesor i modularna struktura programów. Krzysztof Banaś Podstawy programowania 1

Fragment wykładu z języka C ( )

Programowanie niskopoziomowe

Kompilacja i scalanie programów w linii poleceń gcc i make

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Wstęp do Informatyki i Programowania Laboratorium: Lista 0 Środowisko programowania

Wykład. Materiały bazują częściowo na slajdach Marata Dukhana

Programowanie I. O czym będziemy mówili. Plan wykładu nieco dokładniej. Plan wykładu z lotu ptaka. Podstawy programowania w językach. Uwaga!

Zajęcia nr 1 Podstawy programowania. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

Laboratorium 2: Biblioteki statyczne i dynamiczne w języku C. mgr inż. Arkadiusz Chrobot

WPROWADZENIE DO INFORMATYKI

Programy użytkowe (utilities)

Zbuduj mi ten projekt, prosz.

Laboratorium 1. I. Zainstaluj program Eclipse (wersja C/C++ w odpowiednim systemie operacyjnym

Bash - wprowadzenie. Bash - wprowadzenie 1/39

Podstawy wykorzystania bibliotek DLL w skryptach oprogramowania InTouch

SFML. (Simple and Fast Multimedia Library)

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Tworzenie oprogramowania

#line #endif #ifndef #pragma

MentorGraphics ModelSim

Sposoby wykrywania i usuwania błędów. Tomasz Borzyszkowski

Plan wykładów. Oprogramowanie i wykorzystanie stacji roboczych. Wykład 1. Konkurs programistyczny. Literatura. Dr inż. Tomasz Olas

Podstawy informatyki

Piotr Dwieczkowski. Code coverage. Mierzenie pokrycia kodu, teoria oraz praktyka w C/C++

Systemy Operacyjne. Ćwiczenia

Uruchomienie Raspberry Pi

Podstawy Programowania.

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Laboratorium 3: Preprocesor i funkcje ze zmienną liczbą argumentów. mgr inż. Arkadiusz Chrobot

Programowanie w C++ Wykład 1. Katarzyna Grzelak. 26 luty K.Grzelak (Wykład 1) Programowanie w C++ 1 / 28

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 8. Karol Tarnowski A-1 p.

Poprzedni wykład [ ] :

X P.I.W.O. Portowanie Tizena na nowe architektury na przykładzie ARMv6. Maciej Wereski Samsung R&D Institute Poland. 17 Maj Poznań, Polska

Ćwiczenie 1. Przygotowanie środowiska JAVA

Architektury Usług Internetowych. Laboratorium 2. Usługi sieciowe

Trochę o plikach wsadowych (Windows)

Wprowadzenie do biblioteki klas C++

Język Python (2) Język Python (2) 1/36

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

Podstawy Programowania

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 3. Karol Tarnowski A-1 p.

Grzegorz Cygan. Wstęp do programowania mikrosterowników w języku C

Konsolidacja (linking)

Projektowanie układów VLSI-ASIC techniką od ogółu do szczegółu (top-down) przy użyciu pakietu CADENCE

Rozdział 1. Informacje ogólne

Język JAVA podstawy. wykład 1, część 2. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

TOPIT Załącznik nr 3 Programowanie aplikacji internetowych

Informatyka I : Tworzenie projektu

Języki programowania obiektowego Nieobiektowe elementy języka C++

Java Podstawy. Michał Bereta

Programowanie w C++ Wykład 1. Katarzyna Grzelak. 25 luty K.Grzelak (Wykład 1) Programowanie w C++ 1 / 38

BIOWEB INSTRUKCJA URUCHOMIENIA W IDE ECLIPSE RATIONAL SOFTWARE ARCHITECT

Administracja sieciowymi systemami operacyjnymi III Klasa - Linux

Programowanie Urządzeń Mobilnych. Laboratorium nr 7, 8

Uruchomienie Intel Galileo

Wstęp do Programowania, laboratorium 02

Programowanie Systemów Wbudowanych

media Blitz wydajne sytemy szablonów

Cwiczenie nr 1 Pierwszy program w języku C na mikrokontroler AVR

Delphi podstawy programowania. Środowisko Delphi

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

Etapy kompilacji. Wykład 7. Przetwarzanie wstępne, str. 1. #define ILE for(i=0; i<ile; i++)...

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

PRZEWODNIK PO PRZEDMIOCIE

Programowanie obiektowe zastosowanie języka Java SE

K. Konopko; Toolchain. Jądro Linuksa. dr inż. Krzysztof Konopko

Temat zajęć: Tworzenie skryptów powłoki systemu operacyjnego.

1.Wstęp. 2.Generowanie systemu w EDK

Lifehacking dla R. Przemyślenia i rozwiązania w temacie reprodukowalności analiz i organizacji pracy

Programowanie obiektowe

Warsztaty AVR. Instalacja i konfiguracja środowiska Eclipse dla mikrokontrolerów AVR. Dariusz Wika

Bardzo krótki kurs Perla

Zaawansowane programowanie w (pakiecie) Delphi

Pracownia specjalistyczna. Materiały przygotowali: mgr inż. Wojciech Frohmberg, mgr inż. Michał Kierzynka

Podstawy programowania skrót z wykładów:

IBM SPSS Statistics - Essentials for R: Instrukcje instalacji dla Linux

#!/bin/sh. if [ "$#"!= "1" ]; then echo "Skrypt uruchamiany z parametrem (sciezka do katalogu)" exit 1 fi

Programowanie Komputerów 2FD. Materiały pomocnicze do laboratorium

Zaawansowane aplikacje internetowe - laboratorium

DOS Podstawowe komendy Przygotowanie dyskietki do pracy Praca z katalogami w systemie DOS Operacje kopiowania

Wprowadzenie. Programowanie Obiektowe Mateusz Cicheński

Język C - podstawowe informacje

Pobieranie edytora CodeLite

ANALIZA DANYCH SHOWERA. Narzędzia na wiązkę dla Shower Operatora

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL IV TI 6 godziny tygodniowo (6x15 tygodni =90 godzin ),

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

1 Zapoznanie się ze środowiskiem Xenomai.

Programowanie I C / C++ laboratorium 01 Organizacja zajęć

JAVA?? to proste!! Autor: wojtekb111111

MeetingHelper. Aplikacja Android ułatwiająca przekazywanie materiałów pomiędzy uczestnikami spotkania. Instrukcja obsługi dla programisty

Transkrypt:

Automatyzacja kompilacji Automatyzacja kompilacji 1/40

Automatyzacja kompilacji 2/40 Wstęp Polecenia kompilacji gcc -Wall -c komunikat.c -o komunikat.o gcc -Wall -c main.c -o main.o gcc -Wall -c test.c -o test.o gcc -lm komunikat.o main.o test.o -o program

Automatyzacja kompilacji 3/40 Polecenia kompilacji Prosta automatyzacja for f in *.c; do gcc -Wall -c $f -o ${f%c}o done gcc -lm *.o -o program

Automatyzacja kompilacji 4/40 Pierwszy makefile Reguła: cel: zależności polecenie gdzie cel nazwa pliku, który ma powstać z tej reguły zależności lista plików, od których zależy cel, tzn. zmiana któregokolwiek z tych plików oznacza, że cel też się zmieni, polecenie jest to polecenie, za pomocą którego ma zostać wytworzony cel.

Automatyzacja kompilacji 5/40 Pierwszy makefile Przykładowa reguła: komunikat.o: komunikat.c komunikat.h gcc -Wall -c komunikat.c -o komunikat.o Zależności gcc -MM plik.c

Automatyzacja kompilacji 6/40 Pierwszy makefile Przykładowy makefile program: komunikat.o main.o test.o gcc -lm komunikat.o main.o test.o -o program komunikat.o: komunikat.c komunikat.h gcc -Wall -c komunikat.c -o komunikat.o main.o: main.c test.h gcc -Wall -c main.c -o main.o test.o: test.c test.h komunikat.h gcc -Wall -c test.c -o test.o

Automatyzacja kompilacji 7/40 Wykorzystanie makefile Wywołanie Jeśli plik z regułami nazywa się Makefile $ make gcc -Wall -c komunikat.c -o komunikat.o gcc -Wall -c main.c -o main.o gcc -Wall -c test.c -o test.o gcc -lm komunikat.o main.o test.o -o program W innym przypadku $ make -f nazwa_pliku

Automatyzacja kompilacji 8/40 Reguły jak polecenia program: komunikat.o main.o test.o gcc -lm komunikat.o main.o test.o -o program komunikat.o: komunikat.c komunikat.h gcc -Wall -c komunikat.c -o komunikat.o main.o: main.c test.h gcc -Wall -c main.c -o main.o test.o: test.c test.h komunikat.h gcc -Wall -c test.c -o test.o clean: rm -f program komunikat.o main.o test.o

Automatyzacja kompilacji 9/40 Reguły jak polecenia program: komunikat.o main.o test.o gcc -lm komunikat.o main.o test.o -o program komunikat.o: komunikat.c komunikat.h gcc -Wall -c komunikat.c -o komunikat.o main.o: main.c test.h gcc -Wall -c main.c -o main.o test.o: test.c test.h komunikat.h gcc -Wall -c test.c -o test.o.phony: clean clean: rm -f program komunikat.o main.o test.o

Automatyzacja kompilacji 10/40 Zmienne i funkcje Zmienne objects=komunikat.o main.o test.o program: $(objects) gcc -lm $(objects) -o program komunikat.o: komunikat.c komunikat.h gcc -Wall -c komunikat.c -o komunikat.o main.o: main.c test.h gcc -Wall -c main.c -o main.o test.o: test.c test.h komunikat.h gcc -Wall -c test.c -o test.o.phony: clean clean: rm -f program $(objects)

Automatyzacja kompilacji 11/40 Zmienne i funkcje Wbudowane funkcje sources=komunikat.c main.c test.c objects=$(patsubst %.c,%.o,$(sources)) $(patsubst wz_wejściowy,wz_wynikowy,lista_wyrazów) objects=$(sources:.c=.o) sources=$(wildcard *.c)

Automatyzacja kompilacji 12/40 Zmienne automatyczne $@ nazwa pliku docelowego $< nazwa pierwszego pliku pełniącego funkcję wymagania wstępnego w danej regule $^ nazwy wszystkich plików pełniących funkcje wymagań wstępnych, bez powtórzeń $+ nazwy wszystkich plików pełniących funkcje wymagań wstępnych, z powtórzeniami $? nazwy plików pełniących funkcje wymagań wstępnych, nowszych od pliku docelowego $* w przypadku reguły przyrostkowej nazwa pliku docelowego, bez rozszerzenia

Automatyzacja kompilacji 13/40 Zmienne automatyczne wykorzystanie sources=komunikat.c main.c test.c objects=$(sources:.c=.o) program: $(objects) gcc -lm $^ -o $@ komunikat.o: komunikat.c komunikat.h gcc -Wall -c $< -o $@ main.o: main.c test.h gcc -Wall -c $< -o $@ test.o: test.c test.h komunikat.h gcc -Wall -c $< -o $@.PHONY: clean clean: rm -f program $(objects)

Automatyzacja kompilacji 14/40 Reguły wzorców Deklarowanie reguły wzorca %.o: %.c gcc -Wall -c $< -o $@ Reguła przyrostkowa.suffixes=.cxx.cxx.o: g++ -Wall -c $< -o $@

Automatyzacja kompilacji 15/40 Przykład użycia reguły wzorca sources=komunikat.c main.c test.c objects=$(sources:.c=.o) program: $(objects) gcc -lm $^ -o $@ komunikat.o: komunikat.c komunikat.h main.o: main.c test.h test.o: test.c test.h komunikat.h %.o: %.c gcc -Wall -c $< -o $@.PHONY: clean clean: rm -f program $(objects)

Automatyzacja kompilacji 16/40 Użycie wbudowanych reguł wzorców sources=komunikat.c main.c test.c objects=$(sources:.c=.o) program: $(objects) gcc -lm $^ -o $@ komunikat.o: komunikat.c komunikat.h main.o: main.c test.h test.o: test.c test.h komunikat.h.phony: clean clean: rm -f program $(objects)

Automatyzacja kompilacji 17/40 Wbudowane reguły Poprzednio wykorzystano regułę %.o: %.c $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $< Można ją modyfikować definiując zmienne CC=gcc CFLAGS=-Wall

Automatyzacja kompilacji 18/40 Typowe zmienne wykorzystywane w regułach niejawnych Zmienna Wartość domyślna Opis CC gcc Kompilator języka C CXX g++ Kompilator języka C++ CFLAGS pusta Flagi przekazywane do kompilatora C CXXFLAGS pusta Flagi przekazywane do kompilatora C++ CPPFLAGS pusta Flagi przekazywane do preprocesora C

Automatyzacja kompilacji 19/40 Domyślne reguły przyrostkowe Język Rozszerzenia Polecenie C.c $(CC) -c $(CPPFLAGS) $(CFLAGS) C++.cpp,.cc,.C $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) Asembler.s $(AS) $(ASLAGS) Asembler.S $(CPP) $(CPPLAGS) Pascal.p $(PC) -c $(PFLAGS) Fortran.f $(FC) -c $(FFLAGS) Fortran.F $(FC) -c $(FFLAGS) &(CPPFLAGS)

Automatyzacja kompilacji 20/40 Konstrukcje warunkowe Konstrukcja ifeq ifneq ifdef ifndef Znaczenie Sprawdza, czy dwie wartości są sobie równe Sprawdza, czy dwie wartości są od siebie różne Sprawdza, czy zdefiniowano daną zmienną Sprawdza, czy nie zdefiniowano danej zmiennej

Automatyzacja kompilacji 21/40 Konstrukcje warunkowe Przykład konstrukcji if ifeq ($(shell uname -o), "GNU/Linux") CPPFLAGS += -DLINUX else CPPFLAGS += -DOS_UNKNOWN endif

Automatyzacja kompilacji 22/40 Konstrukcje warunkowe Testowanie definicji zmiennych ifdef debug CFLAGS += -g else CFLAGS += -O2 endif Wywołanie $ make debug=1

Automatyzacja kompilacji 23/40 Narzędzia alternatywne do make SCons ant nm imake CMake

Automatyzacja kompilacji 24/40 Narzędzie CMake Właściwości CMake: Jest wieloplatformowe Wspiera natywny sposób budowy oprogramowania: Linux makefile Windows VSProject Apple XCode Jest darmowe, o otwartym kodzie

Automatyzacja kompilacji 25/40 Narzędzie CMake Dalsza charakterystyka : Wykorzystywane w dużych projektach (np. KDE4, VTK) Wsparcie dla makr Moduły do automatycznego wyszukiwania/konfigurowania oprogramowania Własne cele kompilacji lub komendy Uruchamianie zewnętrznych programów Prosta składnia Wsparcie dla wyrażeń regularnych Wsparcie dla budowy In-source oraz Out-of-source

Automatyzacja kompilacji 26/40 Działanie CMake Rysunek : Sposób działania CMake

Automatyzacja kompilacji 27/40 Podstawowe pojęcia CMake CmakeLists.txt Plik tekstowy opisujący parametry projektu oraz opisujący przebieg budowy projektu napisany w prostym języku CMake. Moduły CMake Specjalne pliki CMake napisane z przeznaczeniem znajdowania specyficznych plików wymaganych przez projekt, np. biblioteki, czy pliki nagłówkowe. Powstały po to, aby wykorzystywać je w wielu projektach. Przykłady: FindJava.cmake, FindZLIB.cmake, FindQt4.cmake.

Automatyzacja kompilacji 28/40 Podstawowe pojęcia CMake Source Tree zawiera: pliki wejściowe CMake (CmakeLists.txt) pliki źródłowe projektu (hello.cpp) pliki nagłówkowe projektu (hello.h) Binary Tree zawiera: natywne pliki budowy projektu (makefiles) efekty procesu budowy: biblioteki, pliki wykonywalne i inne Source Tree i Binary Tree: mogą być w jednym katalogu nadrzędnym (In-source) mogą być w różnych katalogach nadrzędnych (Out-of-source)

Automatyzacja kompilacji 29/40 Podstawowe pojęcia CMake CMAKE MODULE PATH Ścieżka do modułów CMake CMAKE INSTALL PREFIX Ścieżka do umiejscowienia plików po wywołaniu make install CMAKE BUILD TYPE Typ budowy (Debug, Release,...) BUILD SHARED LIBS Przełącznik pomiędzy bibliotekami współdzielonymi i statycznymi Zmienne moga być definiowane w pliku CmakeLists.txt lub jako argument polecenia cmake, np.: cmake -DBUILD SHARED LIBS=OFF lub przez GUI: ccmake

Automatyzacja kompilacji 30/40 CMake cache Utrzymywany w Build Tree (CMakeCache.txt) zawiera wpisy typy VAR:TYPE=VALUE zapełniany/aktualizowany podczas fazy konfiguracji przyspiesza proces budowy może być zainicjalizowany poleceniem cmake -C <plik> z reguły nie ma potrzeby ręcznej edycji można zmieniać wartości z poziomu GUI

Struktura plików Source Tree Automatyzacja kompilacji 31/40

Automatyzacja kompilacji 32/40 Użycie CMake utworzenie katalogu budowy projektu mkdir build; cd build konfiguracja cmake [opcje] <source tree> budowa make instalacja make install

Automatyzacja kompilacji 33/40 Hello World w CMake Katalog projektu CMakeLists.txt podkatalog Hello: CMakeLists.txt hello.h hello.cc podkatalog Test: CMakeLists.txt test.cc

Automatyzacja kompilacji 34/40 Hello World w CMake # CmakeLists.txt z katalogu głównego PROJECT( HELLO ) ADD_SUBDIRECTORY( Hello ) ADD_SUBDIRECTORY( Test ) # CmakeLists.txt z katalogu Hello # Dodaje bibliotekę o nazwie Hello (libhello.a # pod Linuksem) na podstawie pliku źródłowego hello.cc ADD_LIBRARY( Hello hello )

Automatyzacja kompilacji 35/40 Hello World w CMake # CmakeLists.txt z katalogu Test # Upenienie się, że kompilator znajdzie pliki # nagłówkowe z katalogu Hello INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/Hello) # Dodanie pliku wykonywalnego "helloworld", # który tworzony jest na podstawie pliku # źródłowego "test.cc". Odpowiednia końcówka # jest dodawana automatycznie. ADD_EXECUTABLE(helloWorld test) # Linkowanie biblioteki Hello z plikiem wykonywalnym TARGET_LINK_LIBRARIES(helloWorld Hello)

Automatyzacja kompilacji 36/40 Składnia plików CmakeLists.txt Komentarz: # to jest komentarz wywołanie polecenia: COMMAND(arg1 arg2...) listy wartości: A; B; C zmienne ${VAR} instrukcje warunkowe: IF()... ELSE()/ELSEIF()... ENDIF() WHILE()... ENDWHILE() FOREACH()... ENDFOREACH() wyrażenia regularne

Automatyzacja kompilacji 37/40 Składnia plików CmakeLists.txt Polecenia: INCLUDE DIRECTORIES( dir1 dir2... ) AUX SOURCE DIRECTORY( source ) ADD EXECUTABLE ADD LIBRARY ADD CUSTOM TARGET ADD DEPENDENCIES( target1 t2 t3 ) ADD DEFINITIONS( -Wall -ansi -pedantic ) TARGET LINK LIBRARIES( target-name lib1 lib2...)

Automatyzacja kompilacji 38/40 Składnia plików CmakeLists.txt Polecenia, cd.: SET TARGET PROPERTIES(... ) przykładowe właściwości: OUTPUT NAME, VERSION,... MESSAGE( STATUS, FATAL ERROR,... message ) INSTALL( FILES f1 f2 f3 DESTINATION. ) FIND FILE FIND LIBRARY

Automatyzacja kompilacji 39/40 Podsumowanie CMake Zawartość pliku CMakeLists.txt PROJECT(MyProject C) ADD_LIBRARY(MyLibrary STATIC libsource.c) ADD_EXECUTABLE(MyProgram main.c) TARGET_LINK_LIBRARIES(MyProgram MyLibrary) Użycie programu CMake $ cmake sciezka_do_zrodel $ make

Automatyzacja kompilacji 40/40 W wykładzie wykorzystano materiały J. Fusco, Linux. Niezbędnik programisty, Helion, 2009 Środowisko programisty, http://mediawiki.ilab.pl/ index.php/%c5%9arodowisko_programisty http://www-flc.desy.de/ldcoptimization/documents/ talks/cmake_tutorial.pdf