niedziela, 7 lutego 2010

Co nieco o make

Pamiętać należy, że pliki dla make, to nie skrypty wykonywane jak w interpreterze linia po linii. Polecenie make na podstawie pliku tworzy drzewo wykonania (a właściwie odwrócone drzewo).

make release WERR=0 -s
Build wynikowy (release), warningi traktowane jak błędy, cichy - wyświetlane tylko błędy, ostrzeżenia itp.

make release -k
Opcja -k (keep going) build nie zatrzymuje się przy błędach. Może być przydatne, gdy projekt jest duży, a błędy powstaję podczas budowania elementów (aplikacji, bibliotek), które niekoniecznie są nam potrzebne.

make clobber
Czyszczenie zupełne - wszystkie powstałe pliki

make clean
Czyszczenie normalne np. tylko pliki *.o


Dla make clean i clobber przydatne są "double-colon rules". np:
clean ::
@echo Usuwamy plik1
-rm plik1
clean ::
@echo Usuwamy plik2
-rm plik2
jak widać cel wraz z regułą występuje więcej niż raz. Dla zwykłych single-colon rules cel moze występować więcej niż raz, ale tylko raz z regułą. Takie reguły przydatne są np. w automatycznie generowanych plikach make lub np. przy dodawaniu do biblioteki kolejnych modułów, itp. (BTW znak '-' przed rm oznacza, że polecenie make nie zatrzyma się z powodu błędu polecenia rm np. plik nie istnieje - błąd zostanie zignorowany; natomiast znak '@' oznacza, że powłoka nie wyświetli polecenia echo - tylko jego wynik (jak zwykle)).


"Static pattern rules" - przydatne, gdy reguły do i zależności są analogiczne dla celów
targets : target-pattern : prereq-patterns
commands


Przypisanie w plikach make
'=' - recursive expansion - podstawianie za każdym razam, gdy nazwa się pojawia, np.:
CFLAGS = $(include_dirs) -O
include_dirs = -Ifoo -Ibar
tutaj kolejność nie gra roli.
Wadą jest właśnie każdorazowe podstawianie, np.
CFLAGS = $(CFLAGS) -O
powoduje powstanie nieskończonej rekurencji.
':=' - simply expanded variables - podstawianie tylko raz, podczas skanowania pliku, np.
x := foo
y := $(x) bar
x := later
daje w wyniku
y := foo bar
x := later


pliki .d - zależność od plików nagłówkowych, plików makefile i innych. Aby po zmianie któregokolwiek cel został przebudowany.
Pliki nagłówkowe dodawane są zwykle do plików .d automatycznie przez wywołanie preprocesora z opcją -M.


Sprawdzanie, czy zmienna została zdefiniowana
ifeq (,$(ZMIENNA))
...
endif


Co jeszcze warto znać:
include, call, eval


Linki odnośnie make
http://kooz.org/rkowen/howto/slides/make/slides/title.htmlhttp://make.paulandlesley.org/autodep.html

Polecenie screen

screen - uruchamia screen :)
ctrl-a c - nowe okno
Przechodznie:
ctrl-a ctrl-a - ostatnio oglądane
ctrl-a n - następne okno
ctrl-a p - poprzednie okno
ctrl-a [0-9] - wybór okna o numerze od 0 do 9
ctrl-a esc - copy mode - dobre do sprawdzania historii poleceń
ctrl-a d - detach
lista aktywnych sesji: screen -ls
przywracanie sesji: screen -r XXXXX.nazwa.server
ctrl-a ? - pomoc
więcej - http://www.rackaid.com/resources/linux-screen-tutorial-and-how-to/

Mecruliar z punktu widzenia usera

Mecruliar to rozproszony system wersjonowania. Każdy użytkownik posiada lokalnie całe repozytorium. Z repozytorium pobiera lokalną kopię roboczą.
Zwykle jest również centralne (główne) repozytorium potrzebne np. do wykonaia release-ów. Proces pobierania zmian z centralnego repozytorium jest zatem 2-etapowy: najpierw zmiany wędrują do repozytorium lokalnego (pull, fpull), a następnie do kopii roboczej (update, fupdate). Podobnie 2-etapowo przebiega umieszcznie zmian w repozytorium centralnym: commit do repozytorium lokalnego (ci), następnie wypchnięcie do centralengo (push, fpush).
Oczywiście zamiast wypychać (push, fpush) do centralnego można z centranego pobrać (pull, fpull). Analogicznie przy pobieraniu zamiast pull (fpull) z lokalnego, można push (fpush) z centranego.
Polecenia rozpoczynjące się literą 'f' oznaczają działania na całym lesie (forest) repozytoriów. Wesja polecenia bez 'f' działa tylko na jednym repozytorium.

Co daje taka lokalna kopia repozytorium poza dodatkową pracą? Przy większym projekcie (większej liczbie programistów) można wymieniać się ze współpracownikiem zmianami, nie utrudniając pracy innnym, tzn. nie umieszczając zmian w repozytorium centralnym (pull od kolegi lub koleżanki programistki:), a nie z repozytorium centralnego). Gdy wasza wspólna praca nad zadaniem jest zakończona wystarczy wysłać wszystkie zmiany do repozytorium centranego.

hg fclone ssh://hg@komputer/udostepnienie katalog
Polecenie "klonuje" las repozytoriów do katalogu 'katalog' z komputera 'komputer' user 'hg'.

hg fclone zrodlo cel
Polecenie "klonuje" las repozytoriów do katalogu 'cel' z katalogu 'zrodlo'.

hg showcofig
Wyświetla ustawienia repozytorium, w którym się znajdujemy.
Można sprawdzić jakie jest ustawione repozytorium źródłowe (globalne).

hg fpull
Pobiera zmiany ze źródła (wszystkie repozytoria) do repozytorium lokalnego. Wersja robocza nie będzie ich jeszcze zawierać (potrzebne update lub fupdate).

hg fpush
Wysyła zmiany do źródła z repozytorium lokalnego. Zmiany trzeba wcześcniej wprowadzić do lokanego repozytorium za pomocą commit (ci).

hg fin
Wyświetla listę zmian obecnych w źródle, a nieobecnych w repozytoriach lokalnych. Można je pobrać za pomocą fpull.

hg fout
Wyświetla listę zmian obecnych lokalnie, a nieobecnych w źródle.
Można je wprowadzić do źródła za pomocą fpush.

hg st
Wyświetla zmiany w lokalnym repozytorium

hg diff plik
Wyświetla zmiany w pliku w stosunku do wersji w repozytorium

hg ci -m 'Krótki opis zmian' plik1 plik2
Wprowadza zmiany (tworzy changeset) w repozytorium lokalnym.

hg merge
lub
hg merge tip
hg ci -m 'Branch merge' pliki

hg add pliki
Dodaje nowe/usuwa skasowane pliki do repozytorium lokalnego.
Można również użyć opcji -A dla ci (hg ci -A ...)

hg rollback
Cofa ostatnią operację na repozytorium (Uwaga - tylko jedną!)

hg revert
Przywraca kopię lokalną plików do stanu w repozytorium.

hg view
Wyświetla zmiany w postaci graficznej (przydatny Xming).

hg ftrees
Wyświetla repozytoria w lesie, w którym się znajdujemy.

serve -p PORT_NUM
Uruchamia usługę dostępu do naszego repozytorium. Przydatne jeżeli inna osoba nie może się z nami połączyć np. przez SSL.

hg ci -A -m 'opis' `hg st | grep -Ev '(tego_nie_chcemy)|(tego_tez)|(i_tego)|tez_nie' | cut -c3- | tr '\n' ' '`
Przyklad commit-u. Lista plików generowana jest też przez polecenie hg przefiltrowane przez grep (część wyników st jest pomijana) oraz przez cut (aby usunąć dwa pierwsze znaki w każdym wierszu) oraz przez polecenie tr (aby zamienić znaki końca linii na spacje).

hg log | grep -B 4 -A 2 Kowalski
Przyklad - wyświetlanie zmian, których dokonał użytkownik Kowalski.