Angielskifrancuskihiszpański

Ad


Ulubiona usługa OnWorks

makepp_extending — online w chmurze

Uruchom makepp_extending w darmowym dostawcy hostingu OnWorks przez Ubuntu Online, Fedora Online, emulator online Windows lub emulator online MAC OS

Jest to polecenie makepp_extending, które można uruchomić w darmowym dostawcy usług hostingowych OnWorks przy użyciu jednej z wielu naszych bezpłatnych stacji roboczych online, takich jak Ubuntu Online, Fedora Online, emulator online systemu Windows lub emulator online systemu MAC OS

PROGRAM:

IMIĘ


makepp_extending — Jak rozszerzyć makepp za pomocą Perla

OPIS


Makepp wewnętrznie jest na tyle elastyczny, że wystarczy napisać trochę kodu Perla
dodawać funkcje lub wykonywać szereg innych operacji.

Ogólne zauważa on pisanie Perl kod do praca w makijaż
Każdy makefile żyje we własnym pakiecie. Zatem definicje w jednym pliku makefile nie mają wpływu
definicje w innym pliku makefile. Wspólny zestaw funkcji obejmujący wszystkie standardowe
Funkcje manipulacji tekstem są importowane do pakietu podczas jego tworzenia.

Zmienne Makefile są przechowywane jako skalary Perla w tym pakiecie. (Istnieją wyjątki
to: zmienne automatyczne i domyślna wartość zmiennych, takich jak CC, są w rzeczywistości
zaimplementowane jako funkcje bez argumentów. Celuj w określone zmienne, zmienne wiersza poleceń i
zmienne środowiska nie są widoczne w ten sposób.) Tak więc każdy napisany przez ciebie kod Perla ma dostęp do wszystkich
zmienne makefile. Zmienne globalne są przechowywane w pakiecie „Mpp::global”. Widzieć
Zmienne Makefile dla szczegółów.

Każda z instrukcji (ifperl / ifmakeperl, perl / makeperl, sub / makesub),
funkcje (perl / makeperl, map / makemap) i działanie reguły (perl / makeperl) dla
pisanie kodu Perla bezpośrednio w makefile ma dwa warianty. Pierwsza to absolutnie
normalny Perl, co oznacza, że ​​musisz użyć przedrostka „f_”, jak wyjaśniono w następnej sekcji, if
chcesz wywołać funkcje makepp. Drugi wariant najpierw przekazuje instrukcję
Ekspansja zmiennej w stylu make, co oznacza, że ​​musisz podwoić „$”, które chcesz widzieć w Perlu.

Obsługa końcowa jest wyjątkowa, ponieważ makepp zawiera ogromne (w zależności od systemu kompilacji) dane
struktury zabrałyby kilka sekund, aby zebrać śmieci przy normalnym wyjściu. Więc robimy A
brutalne wyjście. W głównym procesie nadal możesz mieć bloki „END”, ale jeśli takie masz
globalne uchwyty plików mogą nie zostać opróżnione. Ale powinieneś używać nowoczesnego leksykalnego
uchwyty plików, które zamykają się poprawnie, gdy wykraczają poza zakres.

W kodzie Perla uruchamianym bezpośrednio jako akcja reguły lub za pomocą zdefiniowanego polecenia jest to
naprzeciwko. Bloki „END” nie będą uruchamiane, ale globalne uchwyty plików zostaną dla ciebie opróżnione. The
„DESTROY” obiektów globalnych nigdy nie zostanie uruchomione.

Dodawanie nowa tekstowy Funkcje
Możesz dodać nową funkcję do repertuaru makepp, po prostu definiując podprogram Perla
o tej samej nazwie, ale z przedrostkiem „f_”. Na przykład:

sub f_myfunc {
mój $argument = &arg; # Nazwij argument.
my( undef, $mkfile, $mkfile_line ) = @_; # Nazwij argumenty.

...zrób coś tutaj

zwróć $wartość_zwrotu;
}

XYZ := $(myfunc moje argumenty func)

Jeśli twoja funkcja nie przyjmuje argumentów, nie ma nic do zrobienia. Jeśli twoja funkcja zajmuje jeden
argument, jak w powyższym przykładzie, użyj prostego akcesorium &arg, aby go uzyskać. Jeśli ty
spodziewaj się więcej argumentów, potrzebujesz bardziej złożonego akcesorium „args” opisanego poniżej.

Te metody dostępu przetwarzają te same trzy parametry, które powinny zostać przekazane do dowolnego „f_”
funkcji, a mianowicie argumenty funkcji, obiekt makefile i deskryptor linii dla
wiadomości. Dlatego w pierwszym przypadku możesz użyć wydajnej formy &arg.

Akcesor &arg zajmuje się następującymi rzeczami za Ciebie: Jeśli argumenty już były
rozwinięty (np. aby znaleźć nazwę funkcji w „$(my$(function) arg)” arg to
przekazany jako ciąg znaków i właśnie zwrócony. Jeśli argument nadal wymaga rozwinięcia, to jest to
w zwykłym przypadku jest to zamiast tego odwołanie do łańcucha. Akcesor &arg rozszerza go dla Ciebie,
dla którego potrzebuje obiektu makefile jako drugiego parametru.

Jeśli oczekujesz więcej argumentów, być może w zmiennej numer, zadanie jest wykonywane przez „args”.
Ten akcesor pobiera te same 3 parametry co arg plus dodatkowe parametry:

max: liczba argumentów (domyślnie 2): podaj ~0 (maxint) dla nieskończoności
min: liczba argumentów (domyślnie 0, jeśli max to ~0, w przeciwnym razie to samo co max)
only_comma: nie jedz spacji wokół przecinków, zwykle w przypadku innych niż nazwa pliku

Co najwyżej max, ale przynajmniej min przecinki obecne przed rozszerzeniem są używane do podziału
argumenty. Kilka przykładów z wbudowanych funkcji makeppa:

my( $przedrostek, $tekst ) = argumenty $_[0], $_[1], $_[2], 2, 2, 1; # dodaj przedrostek
dla mojego $cond ( args $_[0], undef, $_[2], ~0 ) ... # i, lub
moje @args= argumenty $_[0], $_[1], $_[2], ~0, 1, 1; # dzwonić
my( $filtry, $słowa ) = argumenty $_[0], $_[1], $_[2]; # filtr

Funkcja powinna zwrócić łańcuch skalarny (nie tablicę), który jest następnie wstawiany do
tekst w tym momencie.

Jeśli twoja funkcja napotka błąd, powinna umrzeć przy użyciu zwykłej instrukcji Die Perla.
Zostanie to uwięzione przez makepp i komunikat o błędzie wyświetlający nazwę pliku i linię
wydrukowany zostanie numer wyrażenia powodującego błąd.

Zasadniczo nie ma ograniczeń co do tego, co może zrobić funkcja; możesz uzyskać dostęp do pliku, uruchom
polecenia powłoki itp.

Obecnie rozszerzone są wyrażenia występujące w zależnościach oraz w akcjach reguł
raz, podczas gdy wyrażenia pojawiające się w obiektach docelowych są rozwijane dwukrotnie, więc bądź ostrożny, jeśli twój
funkcja ma skutki uboczne i jest obecna w wyrażeniu dla elementu docelowego.

Zauważ, że środowisko (w szczególności cwd), w którym funkcja ocenia, będzie
niekoniecznie pasują do środowiska, w którym reguły z pliku Makefile, w którym
funkcja została oceniona, są wykonywane. Jeśli jest to dla ciebie problem, to twoja funkcja
prawdopodobnie powinien wyglądać mniej więcej tak:

sub f_foo {
...
chdir $makefile->{CWD};

... Etc.
}

Putting Funkcje najnowszych a Perl moduł
Jeśli umieścisz funkcje w pliku dołączanym, będziesz mieć jedną kopię na plik Makeppfile, który
używa tego. Aby tego uniknąć, możesz napisać je jako zwykły moduł Perla z „Eksporterem”
interfejs i użyj go. To załaduje się szybciej i zaoszczędzi pamięć:

perl {użyj mojego modułu}
Perl {
użyj mojego::modułu; # umieść : w nowej linii, więc z reguły nie jest to analizowane
}

Jeśli potrzebujesz którejś z funkcji normalnie dostępnych w pliku Makefile (takich jak „f_”
funkcje, „arg” lub „args”), musisz umieścić tę linię w swoim module:

użyj Mpp::Subs;

Wadą jest to, że moduł byłby w innym pakiecie niż funkcja bezpośrednio
pojawiające się w makefile. Musisz więc przekazać wszystko jako parametry lub konstrukcję
nazwy z funkcją „dzwoniącego” Perla.

powołanie zewnętrzny Perl skrypty
Jeśli wywołasz zewnętrzny skrypt Perla przez „system” lub jako akcję reguły, makepp rozwidli a
nowy proces (chyba że jest to ostatnia akcja reguły) i odpal zupełnie nowy interpreter Perla.
Nie ma w tym nic złego, poza tym, że istnieje bardziej wydajny sposób:

&komenda argumenty ...
Może to być działanie reguły. Wywoła funkcję komenda z przedrostkiem „c_” i
podaj pozostały (opcjonalnie cytowany styl makepp - nie dokładnie taki sam jak
Shell) argumenty. Jeśli nie można znaleźć takiej funkcji, to przekazuje wszystkie łańcuchy do
"uruchomić".

sub c_mycmd {moje @args = @_; ... }

$(fałszywe wywołanie cmd):
&mycmd 'arg ze spacją' arg2 "arg3" # wywołuje c_mycmd

%.wyj.: %.w
&myscript -o $(output) $(input) # wywołuje zewnętrzny myscript

Możesz pisać swoje polecenia w ramach wbudowanych, co pozwala na użycie
te same standardowe opcje, które mają, oraz zapewnianą przez nie obsługę we/wy.

Po operatorze bloku „Mpp::Cmds::frame” następuje pojedyncza litera listy opcji
wbudowane (maksymalnie "qw(fi I ​​o rs)"). Nawet jeśli określisz własną opcję
zastępując jedną z nich, nadal podajesz pojedynczą literę opcji standardowej.

Każda własna opcja jest określona jako „[qw(n nazwa), \$odnośnik, argument, pod]", Pierwsze dwa
elementy to krótka i długa nazwa, po których następuje odwołanie do zmiennej i opcjonalnie przez
wartość logiczna określająca, czy przyjąć argument. Bez argumentu zmienna jest
zwiększana za każdym razem, gdy podana jest opcja, w przeciwnym razie przechowywana jest w niej wartość opcji.

sub c_my_ocmd { # Typowy przypadek wyjścia
lokalny @ARGV = @_;
Mpp::Cmds::ramka {

... wydrukuj coś tutaj za pomocą @ARGV, z opcjami już automatycznie usuniętymi

} 'f', qw(o O);
}

sub c_my_icmd { # Typowy przypadek wprowadzania z 2 opcjami
lokalny @ARGV = @_;
mój( $krótki, $długi );
Mpp::Cmds::ramka {

... zrób coś tutaj z <>

} qw(i I rs), # s określa tylko --separator, a nie -s
[qw(s short), \$short], # Brak opcji arg -> $short == 1
[qw(l long), \$long, 1, sub { warn "got arg $long"}];
}

Oto proste polecenie, które zwiększa tylko pierwszy znak każdego wejścia
rekord (odpowiednik "&sed '$$_ = "\u\L$$_"'"):

sub c_uc {
lokalny @ARGV = @_;
Mpp::Cmds::ramka {
wypisz "\u\L$_" podczas gdy <>;
} 'f', qw(i I o rs);
}

W bloku obsługiwanym przez ramkę możesz mieć zagnieżdżone bloki do wykonywania krytycznych
operacji, takich jak otwieranie innych plików.

Mpp::Cmds::wykonaj { ... } 'wiadomość';

Spowoduje to wyświetlenie komunikatu z „--verbose” (który akceptuje każde polecenie), jeśli
polecenie zostało pomyślnie uruchomione. Ale jeśli blok zostanie oceniony jako fałszywy, umiera z
zanegowana wiadomość.

biegać scenariusz argumenty ...
Jest to normalna funkcja Perla, której możesz użyć w dowolnym kontekście Perla w swoim makefile.
Jest podobny do wieloargumentowej formy systemu, ale uruchamia wewnątrz skrypt Perla
obecny proces. W przypadku instrukcji makepp funkcja perla lub własne funkcje
to jest proces uruchamiający makepp. Ale dla reguły, która jest wykonywana przez podproces
To. Skrypt jest analizowany tyle razy, ile jest wywoływany, ale możesz umieścić prawdziwy
działa w bibliotece, tak jak robi to pod2html. Ta biblioteka może następnie zostać użyta na najwyższym poziomie, więc
że już jest:

perl { use mylib } # zostaje rozwidlony do wszystkich reguł, które nie wymagają ponownej analizy

%.wyj.: %.w
makeperl { uruchom qw'myscript -o $(wyjście) $(wejście)' }

Jeśli skrypt wywoła „exit”, zamyka standardowe deskryptory plików lub polega na systemie
aby po nim posprzątać (otwarte pliki, pamięć ...), może to stanowić problem z „uruchamianiem”. Jeśli
wywołasz „uruchom” w instrukcjach lub funkcji Perla, makepp może zostać zakłócony lub
czyszczenie odbywa się tylko na końcu makepp.

Jeśli masz jeden z wyżej wymienionych problemów, uruchom skrypt zewnętrznie, tj. od
zamiast tego wiersz poleceń. W ramach reguły sprzątanie jest mniejszym problemem, zwłaszcza nie
jako ostatnią akcję reguły, ponieważ podproces reguły i tak się później zakończy,
z wyjątkiem Windowsa.

Pisanie Twój własny podpis metody
Czasami chcesz, aby makepp obliczał metodę podpisu przy użyciu innej techniki. Dla
załóżmy na przykład, że masz plik binarny zależny od biblioteki współdzielonej. Zwykle, jeśli ty
zmienić bibliotekę współdzieloną, nie musisz ponownie łączyć plików wykonywalnych, które od niej zależą, ponieważ
łączenie odbywa się w czasie wykonywania. (Możliwe jest jednak, że ponowne połączenie pliku wykonywalnego
może być konieczne, dlatego nie ustawiłem tego jako domyślnego.) Czego chcesz makepp
zrobić, to mieć ten sam podpis dla biblioteki współdzielonej, nawet jeśli się zmieni.

Można to osiągnąć na kilka sposobów. Najprostszym sposobem jest stworzenie własnego nowego
metoda podpisu (nazwijmy ją „shared_object”). Użyłbyś tej metody podpisu
tylko na regułach łączących pliki binarne, takich jak ten:

mój program : *.o lib1/lib1.so lib2/lib2.so
: podpis udostępniony_obiekt
$(CC) $(wejścia) -o $(wyjścia)

Teraz musimy stworzyć metodę podpisu.

Wszystkie metody podpisu muszą być własną klasą, a klasa musi zawierać kilka metod specjalnych
items (szczegóły w dystrybucji Mpp/Signature.pm). Nazwa klasy musi być
z prefiksem „Mpp::Signature::”, więc w tym przypadku nasza klasa powinna zostać wywołana
„Mpp::Podpis::obiekt udostępniony”. Musimy utworzyć plik o nazwie obiekt_wspólny.pm i umieścić
to do Mpp::Podpis katalog gdzieś w ścieżce dołączania Perla; najłatwiejsze miejsce
może być w Mpp/Podpis katalog w instalacji makepp (np.
/usr/local/share/makepp/Mpp/Podpis lub gdziekolwiek go zainstalowałeś).

Aby uzyskać szczegółowe informacje na temat tego, co musi się wydarzyć w tej klasie, powinieneś dokładnie przejrzeć
plik Mpp/Podpis.pm i prawdopodobnie także Mpp/Podpis/dopasowanie_dokładne.pm w makep
dystrybucja. Ale w naszym przypadku wszystko, co chcemy zrobić, to wprowadzić bardzo małą zmianę w pliku an
istniejący mechanizm podpisu; jeśli plik jest biblioteką współdzieloną, chcemy mieć stałą
podpis, podczas gdy jeśli plik jest czymkolwiek innym, chcemy polegać na normalnym makepp
mechanizm podpisu. Najlepszym sposobem na to jest dziedziczenie po
„Mpp::Signature::c_compilation_md5”, czyli zwykle wybierana metoda podpisywania
gdy makepp rozpoznaje polecenie łącza.

Więc plik Mpp/Signature/shared_object.pm może zawierać następujące elementy:

używaj ścisłego;
pakiet Mpp::Signature::shared_object;
użyj Mpp::Signature::c_compilation_md5;
nasz @ISA = qw(Mpp::Signature::c_compilation_md5); # Wskaż dziedziczenie.
nasz $shared_object = pobłogosław \@ISA; # Kawałek magii, który pomaga makepp znaleźć
# podprogramy dla tej metody. Wszystko
# metody podpisu muszą mieć jedną z nich.
# Wartość nie jest używana, tylko dowolny obiekt.
# Oto metoda, która jest wywoływana, gdy potrzebujemy podpisu
# dowolny cel lub zależność, dla której ta metoda podpisu jest aktywna:
podpis podrzędny {
my ($self, # To będzie to samo co $shared_object.
$informacje) = @_; # Specjalna struktura, która zawiera wszystko
# makepp wie o tym pliku. Widzieć
# Mpp/File.pm, aby uzyskać szczegółowe informacje.

if ($finfo->{NAZWA} =~ /\.s[oa]$/) { # Czy nazwa pliku kończy się na .so czy .sa?
zwróć $finfo->plik_istnieje? „istnieje”: „”;
# Zawsze zwracaj ten sam podpis, jeśli plik
# istnieje. W tym przypadku podpis jest
# string "istnieje".
}

Mpp::Podpis::c_compilation_md5::podpis;
# Jeśli plik nie kończy się na .so lub .sa,
# deleguje do zwykłej metody podpisu makeppa.
}

Ten plik jest dostarczany jako przykład w dystrybucji makepp, z pewnymi dodatkowymi
komentarzy.

Nawiasem mówiąc, dlaczego nie ustawić tego jako domyślnego? Cóż, są chwile, kiedy zmienia się
biblioteka współdzielona będzie wymagać ponownego połączenia twojego programu. Jeśli kiedykolwiek zmienisz albo
symbole definiowane przez wspólną bibliotekę lub symbole zależne od innych bibliotek
ponieważ czasami może być konieczne ponowne połączenie.

Załóżmy na przykład, że biblioteka współdzielona wywołuje pewne podprogramy, które twój program
zapewnia. Np. załóżmy, że zmieniłeś bibliotekę współdzieloną, aby teraz wywoływała zewnętrzną
podprogram „xyz()”. Chyba że użyjesz opcji „-E” lub „--export-dynamic” do linkera
(dla GNU binutils; inne linkery mają różne nazwy opcji), symbol „xyz()” może nie
być dostępne dla konsolidatora czasu wykonywania, nawet jeśli istnieje w twoim programie.

Co gorsza, załóżmy, że zdefiniowałeś „xyz()” w innej bibliotece (nazwij ją libxyz), lubię to:

mój_program: main.o lib1/lib1.so xyz/libxyz.a

Ponieważ „libxyz” to a .a plik, a nie a .so plik, wówczas „xyz()” może nie zostać wciągnięty
poprawnie od libxyz.a chyba że ponownie połączysz swój plik binarny.

Metody Mpp::Signature kontrolują również nie tylko ciąg, który jest używany do określenia, czy a
plik uległ zmianie, ale algorytm używany do porównywania łańcuchów. Na przykład
metoda podpisu „target_newer” w dystrybucji makepp wymaga jedynie, aby plik
targety będą nowsze niż zależności, podczas gdy metoda podpisu „exact_match” (i
wszystko, co od niego zależy, takie jak „md5” i „c_compilation_md5”) wymaga, aby
plik ma taką samą sygnaturę jak na ostatniej kompilacji.

Oto kilka innych rodzajów metod podpisu, które mogą być przydatne, aby pomóc Ci to zrozumieć
możliwości. Jeśli ogólny cel jest wystarczający, niektóre z nich mogą w końcu być
włączone do makepp:

· Metoda podpisu dla bibliotek współdzielonych, która zwraca sumę kontrolną wszystkich wyeksportowanych
symboli, a także wszystkie symbole, których potrzebuje z innych bibliotek. To rozwiązuje
problem z powyższym przykładem i gwarantuje prawidłowe łącze w każdych okolicznościach.
Podjęto eksperymentalną próbę zrobienia tego w dystrybucji makepp (patrz
Mpp/Signature/shared_object.pm), ale będzie działać tylko z GNU binutils i ELF
biblioteki w tej chwili.

· Metoda podpisu, która ignoruje datownik zapisany w pliku. Np. jeśli ty
wygenerować .c automatycznie za pomocą jakiegoś programu, który nalega na umieszczenie ciągu znaków
w taki sposób:

static char * date_stamp = "Wygenerowane automatycznie 01 kwietnia 2004 przez nikogo";

możesz napisać metodę podpisu, która konkretnie ignoruje zmiany w znacznikach daty.
Zatem jeśli znacznik daty jest jedyną rzeczą, która się zmieniła, makepp nie zostanie odbudowany.

· Metoda podpisu, która oblicza podpisy w normalny sposób, ale ignoruje
zależność od architektury przy podejmowaniu decyzji o przebudowie. To może być przydatne dla
pliki prawdziwie niezależne od architektury; obecnie, jeśli budujesz na jednej architekturze,
makepp będzie nalegał na przebudowę nawet plików niezależnych od architektury po przełączeniu
do innej architektury.

· Metoda podpisu, która wie, jak ignorować komentarze w plikach lateksowych, jak np
Metoda „c_compilation_md5” wie, jak ignorować komentarze w plikach C.

· Metoda podpisu do automatycznego wyodrębniania dokumentacji, która sumuje kontrole tylko do
komentuje, że ekstraktor dokumentacji potrzebuje i ignoruje inne zmiany w źródle
plik.

Niedokończony
Ten dokument nie jest jeszcze gotowy. Powinien obejmować sposób pisania własnych skanerów
dołącz pliki i tym podobne rzeczy.

Korzystaj z makepp_extending online, korzystając z usług onworks.net


Darmowe serwery i stacje robocze

Pobierz aplikacje Windows i Linux

  • 1
    Wsporniki
    Wsporniki
    Brackets to darmowe, nowoczesne oprogramowanie typu open source
    edytor tekstu stworzony specjalnie dla sieci Web
    Rozwój. Napisany w HTML, CSS i
    JavaScript z ukierunkowanymi narzędziami wizualnymi i
    przygotuj...
    Pobierz wsporniki
  • 2
    Darmowy kompilator Pascala
    Darmowy kompilator Pascala
    32/64/16-bitowy kompilator Pascala dla
    Win32/64/CE, Linux, Mac OS X/iOS,
    Android, FreeBSD, OS/2, GameBoy
    Advance, Nintendo NDS i DOS;
    semantycznie zgodny z...
    Pobierz darmowy kompilator Pascala
  • 3
    Informacje cyfrowe Canon EOS
    Informacje cyfrowe Canon EOS
    Canon nie ma licznika migawki
    zawarte w informacjach EXIF ​​an
    plik obrazu, w przeciwieństwie do Nikon i
    Pentaks. Nie ma oficjalnej bazy Canon
    podanie ...
    Pobierz informacje o Canon EOS DIGITAL
  • 4
    ODNIESIENIE
    ODNIESIENIE
    rEFInd jest rozwidleniem bootowania REFIt
    menedżer. Podobnie jak rEFit, rEFInd może
    automatycznie wykryj zainstalowany rozruch EFI
    ładowarki i prezentuje ładny GUI
    menu opcji rozruchu...
    Pobierz rEFInd
  • 5
    ExpressLuke GSI
    ExpressLuke GSI
    Ta strona pobierania SourceForge miała na celu
    zezwolić użytkownikom na pobranie mojego pliku źródłowego
    GSI, oparte na phhusson's great
    praca. Buduję zarówno Android Pie, jak i
    Androida 1...
    Pobierz ExpressLuke GSI
  • 6
    Caster muzyczny
    Caster muzyczny
    Music Caster to odtwarzacz muzyki z tacy
    który pozwala przesyłać lokalną muzykę do
    Urządzenie Google Cast. Na pierwszym biegu,
    musisz kliknąć strzałkę w swoim
    tak...
    Pobierz aplikację Music Caster
  • więcej »

Komendy systemu Linux

Ad