CVS
Transkrypt
CVS
Narzędzia programistyczne Tomasz Borzyszkowski Biblioteki statyczne W Linuxie istnieją dwa rodzaje bibliotek: statyczne i dzielone. Statyczne dołączane są do kodu programu w czasie linkowania, dzięki czemu plik wynikowy jest większy o dołączony kod. Biblioteki te są zbiorem plików obiektowych (*.o), utworzonych przez program ar: ar rcs nazwa_bib.a plik1.o plik2.o ... gdzie: r włącza do biblioteki plik obiektowy, zastępując inne pliki obiektowe o takiej samej nazwie znajdujące się w archiwum c tworzy bibliotekę, nie podając żadnych komunikatów, jeśli nie istnieje s uaktualnia tablicę odwzorowującą nazwy symboli na nazwy plików obiektowych patrz lib[12].{c,h}, prog_lib.c oraz stat1.sh 2 Biblioteki dzielone Pozwalają na czytanie zawartości biblioteki w czasie wykonywania. Cechy pozytywne: współdzielenie kodu przez wszystkie procesy korzystające z biblioteki dzielonej, więc jeżeli więcej niż jeden program korzysta z tego samego kodu, to lepiej umieścić go w bibliotece dzielonej Biblioteki dzielone oszczędzają pamięć systemu, dzięki czemu system działa szybciej kod biblioteki dzielonej nie jest kopiowany do pliku wykonywalnego, a zatem tylko kopia kodu znajduje się na dysku, oszczędza to miejsce na dysku i czas potrzebny na kopiowanie jeżeli w bibliotece dzielonej znajdzie się błąd, to można ją zastąpić poprawioną wersją bez potrzeby powtórnej kompilacji wszystkich programów, które z niej korzystają. Cecha negatywna: złożoność programu; program składa się z wielu niezależnych części i trzeba przenosić kod wynikowy wraz z bibliotekami 3 Biblioteki dzielone cd Standardem kodowania w Linuxie jest to, że biblioteki zachowują zgodność z poprzednimi wersjami. Program dziłający ze starą biblioteką będzie także działać z nową biblioteką. Nazwa wewnętrzna biblioteki składa się z nazwy biblioteki oraz numeru wersji (np. libc.so.6). Jest to link symboliczny do pliku, w którym biblioteka jest przechowywana (np. libc.so.6.1.3) . Ścieżki do bibliotek systemowych są przechowywane w pliku / etc/ld.so.conf. Dołączanie nowych katalogów bibliotek systemowych wymaga dodania ich do pow. pliku i uruchomienia programu ldconfig. Opcja -lnazwa_bib dołącza standardową bibliotekę o nazwie libnazwa_bib.so, która jest utworzonym przez ldconfig dowiązaniem do najnowszej wersji tej biblioteki w systemie. Tworzenie i korzystanie z bibliotek dzielonych: Patrz lib[12].{c,h}, prog_lib.c oraz dziel[12345].sh 4 make wstęp Progam make służy do zarządzania projektami informatycznymi (sterowanie kompilacją kodu źródłowego, instalacja aplikacji oraz przygotowanie stron podręcznika elektronocznego). make czyta plik makefile, który opisuje wzajemne zależności między plikami aplikacji. Zależności definiują jak każdy plik końcowej aplikacji jest powiązany z innymi plikami źródłowymi, np.: mojaapl1: main.o 1.o 2.o 3.o Reguły to akcje, które muszą zostać podjęte by zbudować dany fragment aplikacji, np.: mojaapl1: main.o 1.o 2.o 3.o gcc -o mojaapl1 main.o 1.o 2.o 3.o main.o: main.c a.h gcc -c main.c patrz Makiefile1 5 make przykład main.c 1.c 2.c 3.c a.h b.h c.h 6 make zaawansowane W plikach makefile możemy używać makr. Makro definiujemy tak: NAZWA_MAKRO=warto?? Natomiast rozwijamy makro tak: $(NAZAWA_MAKRO) lub ${NAZWA_MAKRO} Jeżeli nasza aplikacja wynikowa ma składać się z więcej niż z jednego pliku, to możemy użyć specjalnego celu all. Graf zależności jest wówczas sumą kilku drzew o różnych korzeniach. Patrz Makiefile2 Możliwe jest także zedefiniowenie celów clean i install. Wówczas komenda make clean, która zawsze kończy się sukcesem, wykona swoją sekcję. Komenda make instal, standardowo, najpierw tworzy aplikację, a następnie wykonuje przypisany jej skrypt. Patrz Makiefile3 7 make zaawansowane cd Program make posiada reguły wbudowane. Pozwalają one przeprowadzać kompilację pliku o ustalonej końcówce w sposób domyślny (przegląd reguł wbudowanych make -p). Wypróbuj komendę: make hello Możemy także zmieniać niektóre makrodefinicje: make CC=gcc CFLAGS="-Wall -g" hello gcc posiada reguły dla bibliotek statycznych, rozpoznaje je po .a Patrz Makiefile4 W wersji GNU program make udostępnia opcję -jN umożliwiającą realizację kompilacji przez N niezależnych procesów. Spróbuj: make -f Makefile4 -j3 Opcja -MM kompilatora gcc tworzy listę zależności odp. dla make, spróbuj: gcc -MM main.c 1.c 2.c 3.c 8 RCS zarządzanie kodem źródłowym RCS (Revision Control System) jest kolejnym narzędziem wspomagającym zarządzanie kodem źródłowym. System ten składa się z szeregu poleceń umożliwiających śledzenie zmian pliku źródłowego i utrzymywanie pojedynczego pliku z listą zmian zawierającą szczegóły zmian potrzebne do odtworzenia każdej poprzedniej wersji pliku źródłowego. Działanie RCS pokażemy na przykładzie prac nad programem istotny.c Inicjalizujemy program: rcs -i istotny.c wpisujemy komentarz: To jest bardzo wa?ny plik demonstracyjny Kończymy wpisując pojedynczą kropkę w wierszu lub znak końca pliku. Powstał plik istotny.c,v. 9 RCS przykład użycia Rejestujemy program: ci istotny.c Jeżeli wcześniej nie zainicjalizowaliśmy RCSa, to poprosi on o podanie komentarza. Po rejestracji plik istotny.c został usunięty. Chcemy teraz dokonać zmian w pliku istotny.c. W tym celu musimy najpierw program wyrejestrować. Wyrejestrowanie programu: co -l istotny.c Opcja -l powoduje zablokowanie pliku dla pozostałych użytkowników jest to ważne przy projektach zespołowych. Do pliku istotny.c dodajemy linię: printf("To jest dodatkowa linia ...."); Następnie ponownie przy pomocy komendy ci istotny.c rejestujemy zmiany i zapisujemy odpowiedni dla nich komentarz. 10 RCS przykład użycia Podsumowanie zmian: rlog istotny.c Różnice między wersjami: cd Powrót do wcześniejszej wersji pliku: co -r1.1 istotny.c rcsdiff -r1.1 -r1.2 istotny.c Identyfikowanie rewizji: Wyrejestrowujemy program (co -l istotny.c), następnie przed funkcją main() dodajemy linię: static char *RCSinfo = "$Id$" natomiast na jej końcu main() dodajemy: printf("RCS Id pliku: \n%s\n", RCSInfo); Rejestrujemy zmiany (ci istotny.c) podając odp. komentarz, a następnie raz jeszcze wyrejestrowujemy. Jak zmienił się plik istotny.c? RCS posiada predefiniowany zestaw makr, które można używać wewnątrz plików źródłowych. Najbardziej popularne są $Id$ - ciąg identyfikujący rewizję oraz $RCSfile$ - nazwa pliku. 11 RCS przykład użycia GNU i ident Program make w wersji GNU posiada kilka wbudowanych reguł do zarządzania pilkami RCS. Zobaczmy jak zadziałają następujące komendy: rm -f istotny.c make istotny make posiada regułę tworzenia pliku bez rozszerzenia z pliku w rozszerzeniem .c, używając cc, oraz reguły tworzenia pliku z rozszerzeniem .c z pliku .c,v wykorzystując RCS. Po kompilacji pliku .c jest on usuwany. Polecenie ident (wypróbuj): ident istotny ident pobrał z pliku wykonywalnego ciąg $Id$. Jest on ważnym narzędziem do sprawdzania, w której wersji programu klient zgłosił błąd. Istnieją także inne systemy kontroli kodu źródłowego np. komercyjny SCCS. Posiada on podobne funkcje co RCS i jest określony w standardzie X/Open. 12 CVS wstęp Nowszym i nowocześniejszym narzędziem od RCSa do zarządzania kodem źródłowym jest CVS (Concurrent Version System). CVS powstał w 1986 roku jako zestaw kilku skryptów powłoki. Obecny system opiera się na pracy Briana Berlinera rozpoczętej w 1989 roku. CVS zastępuje powoli RCS w pracach zespołów programistów, ponieważ: CVS można łatwo przystosować go do pracy w sieci, także przez Internet CVS umożliwia jednoczesną pracę wielu programistów nad tym samym kodem źródłowym i w wielu wypadkach pozwala na automatyczne dołączanie zmian wprowadzanych do projektu przez różnych programistów CVS ma znacznie lepiej działający system zarządzania zbiorami plików niż RCS 13 CVS terminologia Przed rozpoczęciem prac z CVSem musimy zapoznać się z niezbędną terminologią: Pobranie (Check Out) pobranie kopii jednego lub wielu plików z głównego źródła z zamiarem wprowadzenia zmian Zatwierdzenie (Commit) wprowadzenie zmian dokonanych lokalnie w pliku źródłowym do głównej kopii tego pliku Projekt (Project) zbiór plików wchodzących w skład aplikacji Repozytorium (Repository) miejsce przechowywania głównej kopii kodu źródłowego w systemie CVS Korekta (Revision) każda zmiana w pliku źródłowym to korekta; zgodnie ze specyfikacją CVS jest to oznakowana zmiana w pojedynczym pliku źródłowym 14 CVS repozytorium Przed uruchomieniem CVS należy utworzyć repozytorium, które posłuży do przechowywania głównych kopii plików źródłowych oraz wewnętrznych plików konfiguracyjnych. Aby utworzyć repozytorium należy: Utworzyć grupę użytkownikow repozytorium, np.: # groupadd cvs-users Utworzyć katalog repozytorium, np.: # mkdir /usr/local/cvsrep Utworzyć pliki do zarządzania repozytorium: # cvs -d /usr/local/cvsrep init Nadać prawa do repozytorium dla grupy cvs-users: # cd /usr/local/cvsrep # chmod g+w . # chgrp -R cvs-user . 15 CVS nowy projekt Przed rozpoczęcięm pracy dobrze jest ustawić zmienne środowiskowe, oto niektóre z nich: CVSROOT ścieżka do repozytorium CVSEDIT komenda wywołująca edytor CVSIGNORE lista wzorców nazw plików, które mają być ignorowane podczas wykonywania poleceń CVS W katalogu cvs-app znajduje się przykładowa aplikacja. Dodajemy wszystkie pliki do repozytorium: $ cvs import Opr1App tomek start Literki pojawiające się przed nazwami plików znaczają: C konflikt (plik już istnieje); I zignorowany; L dowiązanie (CVS nie obsługuje dowiązań); M zmodyfikowany; R usunięty; N nowy; U zaktualizowany; ? zapytanie (znaleziono niewystępujący w repozytorium plik lokalny, nieoznaczony jako ignorowany) 16 CVS praca Praca nad projektem kontrolowanym przez CVS polega na: Pobieraniu plików z repozytorium przed nanoszeniem zmian; po pobraniu plików powstanie katalog CVS, jest to katalog roboczy systemu CVS i nie wolno w nim niczego zmieniać: $ cvs checkout Opr1App Porównanie zmian dokonanych w kopiach lokalnych z repozytorium; ignorowane jest porównywanie plików lokalnych, które nie są umieszczone w repozytorium (-B ignoruje puste wiersze): $ cvs diff -B Jeżeli wprowadzone przez nas zmiany nie są satysfakcjonujące, należy usunąć plik lokalny, a następnie wykonać polecenie: $ cvs update Akceptowanie zmian dokonanych w kopiach lokalnych i aktualizacja repozytorium: $ cvs commit 17 CVS praca cd Zwalnianie projektu, gdy wstrzymujemy pracę nad projektem należy go zwolnić, tj. poinformować CVS, że w danej chwili nad nim nie pracujemy; przechodząc o katalog wyżej wykonujemy komendę: $ cvs release Przeglądanie zmian: $ cvs log nazwa_pliku Dodawanie plików do repozytorium, plik zostanie faktycznie dodany dopiero po zatwierdzeniu zmian najbliższą komendą cvs commit: $ cvs add nazwa_pliku Usuwanie plików z repozytorium, plik zostanie faktycznie usunięty dopiero po zatwierdzeniu zmian najbliższą komendą cvs commit: $ cvs remove nazwa_pliku 18 CVS słowa kluczowe CVS posiada, podobnie jak RCS, możliwość rozwijania słów kluczowych. Dostępne są następujące słowa kluczowe: $Author$ rozwinięcie do systemowej nazwy użytkownika będącego autorem pliku $Date$ rozwinięcie do daty ostatniego zatwierdzenia $Headers$ rozwinięcie do niektórych informacji nagłówkowych $Id$ rozwinięcie do informacji standardowych, bez ścieżek $Log$ rozwinięcie do cvs log danego pliku rozwinięcie do nazwy znacznika użytego przy jego pobieraniu $Revision$ rozwinięcie do numeru korekty $Name$ System CVS automatycznie aktualizuje słowa kluczowe po każdym pobraniu. 19 CVS znaczniki Jeżeli wydajemy projekt składający się z wielu plików, to zazwyczaj każdy plik ma korekty o innych numerach. Bardzo ważna jest możliwość utworzenia tzw. wydania wersji, składającego się z wielu plików o różnych numerach rewizji. W wydawaniu wersji może nam pomóc stosowanie znaczników. Znaczniki, to nazwy odnoszące się do całego zestawu plików składających się w danej chwili na aktualną wersję projektu, niezależnie od faktycznych numerów korekty tych plików. Do nadawania znaczników służy komenda: $ cvs tag nazwa_znacznika Wypróbuj komendę: $ cvs -d /?cie?ka tag -c pierwsze-wydanie Wypróbuj komendę: $ cvs -d /?cie?ka tag -h main.c 20 CVS rozgałęzienia projektu Czasami istnieje konieczność podziału projektu na dwie lub więcej wersji, które będą rozwijane niezależnie. W CVS sposobem na to jest rozgałęzianie, pozwalające na niezależną pracę ze starymi i nowymi wersjami. 1.2.1 1.2.2 Wydanie 1 Wydanie 2 1.2 1.3 1.4 1.5 1.6 1.1 By utworzyć rozgałęzienie należy wykonać komendę: $ cvs tag -b nazwa_rozga??zienia Następnie zwalniamy projekt i pobieramy rozgałęziony projekt: $ cvs release $ cvs checkout -r nazwa_rozga??zienia 21 Dokumentacja rodzaje W systemie Linux istnieje wiele sposobów uzyskania pomocy. Oto niektóre z nich: Opcje wiersza poleceń, informacje o dostępnych opcjach danej komendy możemy uzyskać uruchamiając ją z opcją --help. Np.: $ cp --help Podręcznik systemowy, zawiera więcej szczegółowych informacji. Dostęp do stron podręcznika za pomocą komendy man. Np.: $ man cp Dokumentacja kodu programu, zawiera szczegółowy opis źródeł programu. Programista nie przygotowuje tradycyjnego kodu programu, a raczej tekst zawierający części kodowe i części dokumentacyjne. Do wydzielania dokumnetacji i kodu z takiego tekstu służą takie programy jak: noweb i cweb 22 Podręcznik elektr. sekcje Podręcznik elektroniczny został stworzony dla zróżnicowanych programów, od prostych poleceń linii komend, do funkcji bibliotek standardowych. Aby pomóc użytkownikowi w znajdowaniu informacji podzielono podręcznik na następujące sekcje: 1.Programy lub polecenia dostępne dla wszystkich użytkowników 2.Wywołania systemowe (funkcje obsugiwane przez jądro) 3.Funkcje biblioteczne (zawarte w bibliotekach systemowych) 4.Pliki specjalne (zwykle umieszczone w katalogu /dev) 5.Formaty plików i konwencje nazewnicze, np. /etc/passwd 6.Gry 7.Ogólne konwencje i pakiety makropoleceń 8.Polecenia administracyjne 9.Niestandardowe funkcje jądra Spróbuj: $ man echo $ man 3 echo $ man 4 tty $ man sh-utils 23 Podręcznik elektr. elementy NAME, jedyny obowiązkowy element strony, zawiera nazwę opiswanego programu i jego krótki opis SYNOPSIS, skrótowy opis interfejsu programu lub funkcji DESCRIPTION, pełen opis programu lub funkcji REURN VALUES, wartości zwracane przez funkcję lub program EXIT STATUS, kody powrotu programu lub funkcji OPTIONS, opcje programu lub argumenty funkcji FILES, pliki używane przez program lub funkcję ENVIRONMENT, zmienne systemowe mające wpływ na działanie DIAGNOSTICS, opis komunikatów o błędach i ostrzeżeń SECURITY, lista możliwych zagrożeń wnoszonych przez program do systemu BUGS, opis znanych błędów AUTHOR, osoby uczestniczące w tworzeniu programu SEE ALSO, lista stron podręcznika o podobnej tematyce 24 Podręcznik elektr. tworzenie Najprostszą metodą rozpoczęcia pracy nad nową stroną będzie skopiowanie i modyfikacja już istniejącej. Opis języka poleceń podręcznika można uzystać pisząc: $ man 7 man Pisząc podręcznik elektroniczny należy przestrzegać kilku prostych reguł: Polecenia lub makropolecenia programu troff składają się z kropki i następujących za nią dwóch liter. Wielkość liter ma znaczenie. Polecenia występują zazwyczaj w oddzielnych wierszach, w których podawane są także argumenty tych poleceń (jeśli są wymagane) Istnieje kilka poleceń używanych wewnatrz wierszy, rozpoczynają się od znaku “\” Znaki specjalne są poprzedzone “\*” W tekście strony można stosować komentarze rozpoczynając linię znakiem \” , komentarz do końca linii Patrz: mojaappl.man 25 Podręcznik elektr. tworzenie cd W większości systemów Linuxowych strony podręcznika są formatowane poleceniem groff (GNU-odpowiednik UNIXowego nroff). Formatowanie strony, komendą: $ groff -Tascii -man mojaapl.man Aby strony były dostępne dla użytkowników, wynik formatowania należy umieścić w katalogu /usr/man/man1. Polecenie man używa zmiennej środowiskowej MANPATH. Zobacz także /etc/man.config. Wersję poscriptową strony podręcznika można uzyskać komendą: $ groff -Tps -man mojaapl.man > mojaapl.ps 26