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