İngilizceFransızcaİspanyolca

Ad


OnWorks favicon'u

makepp_extending - Bulutta Çevrimiçi

Makepp_extending'i Ubuntu Online, Fedora Online, Windows çevrimiçi emülatörü veya MAC OS çevrimiçi emülatörü üzerinden OnWorks ücretsiz barındırma sağlayıcısında çalıştırın

Bu, Ubuntu Online, Fedora Online, Windows çevrimiçi emülatörü veya MAC OS çevrimiçi emülatörü gibi birden fazla ücretsiz çevrimiçi iş istasyonumuzdan birini kullanarak OnWorks ücretsiz barındırma sağlayıcısında çalıştırılabilen makepp_extending komutudur.

Program:

ADI


makepp_extending -- Makepp Perl kullanılarak nasıl genişletilir

TANIM


Makepp dahili olarak yeterince esnektir, böylece biraz Perl kodu yazarak,
işlevler ekleyin veya bir dizi başka işlem yapın.

genel notlar on yazı yazıyor Perl kod için ile makep
Her makefile kendi paketinde yaşar. Böylece bir makefile içindeki tanımlar etkilemez
başka bir makefile içindeki tanımlar. Tüm standardı içeren ortak bir işlevler kümesi
metinsel işleme işlevleri, oluşturulduğunda pakete aktarılır.

Makefile değişkenleri bu pakette Perl skaleri olarak saklanır. (İstisnalar vardır
bu: otomatik değişkenler ve CC gibi değişkenlerin varsayılan değeri aslında
argüman içermeyen işlevler olarak uygulanır. Belirli değişkenleri hedefleyin, komut satırı değişkenlerini ve
ortam değişkenleri bu şekilde görülmez.) Böylece yazdığınız herhangi bir Perl kodunun tümüne erişimi vardır.
makefile değişkenleri. Global değişkenler "Mpp::global" paketinde saklanır. Görmek
Ayrıntılar için makefile değişkenleri.

İfadelerin her biri (ifperl / ifmakeperl, perl / makeperl, sub / makesub),
için işlevler (perl / makeperl, map / makemap) ve kural eylemi (perl / makeperl)
Perl kodunu doğrudan makefile içine yazmak iki şekilde gelir. Birincisi kesinlikle
normal Perl, bir sonraki bölümde açıklandığı gibi "f_" önekini kullanmanız gerektiği anlamına gelir.
makepp işlevlerini çağırmak istiyorsunuz. İkinci değişken ilk önce ifadeyi geçer
Make tarzı değişken genişletme, yani Perl'in görmesini istediğiniz "$"ları ikiye katlamanız gerekir.

Son işleme özeldir çünkü makepp'in çok büyük (yapı sisteminize bağlı olarak) verileri
yapıların normal bir çıkışla çöp toplaması birkaç saniye sürer. Yani biz bir
kaba kuvvet çıkışı. Ana süreçte hala "END" bloklarınız olabilir, ancak varsa
genel dosya tanıtıcıları temizlenmeyebilir. Ama modern sözlük dilini kullanıyor olmalısın.
kapsam dışına çıkarken düzgün bir şekilde kapanan kütük tanıtıcıları.

Perl kodunda, doğrudan bir kural eylemi olarak veya sizin tanımladığınız bir komutla çalıştırma,
zıt. "END" blokları çalıştırılmayacak, ancak genel kütük tanıtıcıları sizin için temizlenecek. NS
Global nesnelerin "DESTROY"u asla çalıştırılmayacaktır.

Ekleme yeni metinsel fonksiyonlar
Basitçe bir Perl alt rutini tanımlayarak makepp'in repertuarına yeni bir fonksiyon ekleyebilirsiniz.
aynı ad ancak "f_" öneki ile. Örneğin:

alt f_myfunc {
$argümanım = &arg; # Argümanı adlandırın.
my( undef, $mkfile, $mkfile_line ) = @_; # Argümanları adlandırın.

... burada bir şeyler yap

$dönüş_değerini döndür;
}

XYZ := $(işlevim benim işlev argümanlarım)

İşleviniz argüman almıyorsa, yapacak bir şey yoktur. İşleviniz bir tane alırsa
argümanı, yukarıdaki örnekte olduğu gibi, onu elde etmek için basit erişimci &arg kullanın. Eğer sen
daha fazla argüman beklerseniz, aşağıda açıklanan daha karmaşık erişimci "arg'larına" ihtiyacınız vardır.

Bu erişimciler, herhangi bir "f_" öğesine iletilmesi gereken aynı üç parametreyi işler.
işlev, yani işlev argümanları, makefile nesnesi ve için bir satır tanımlayıcı
mesajlar. Bu nedenle, ilk durumda verimli &arg formunu kullanabilirsiniz.

&arg erişimcisi sizin için aşağıdakileri halleder:
genişletilmiş (örneğin, "$(my$(function) argümanında)" fonksiyonun adını bulmak için argüman
bir dize olarak geçti ve yeni döndü. Argümanın hala genişlemeye ihtiyacı varsa, bu
olağan durumda, bunun yerine bir dizgeye referanstır. &arg erişimcisi onu sizin için genişletir,
bunun için 2. parametresi olarak makefile nesnesine ihtiyaç duyar.

Muhtemelen değişken sayıda daha fazla argüman bekliyorsanız, iş "args" tarafından gerçekleştirilir.
Bu erişimci, arg ile aynı 3 parametreyi ve ek parametreleri alır:

max: argüman sayısı (varsayılan 2): sonsuz için ~0 (maxint) verin
min: argüman sayısı (maks ~0 ise varsayılan 0, aksi takdirde maks ile aynı)
only_comma: dosya adı olmayanlar için normal olan virgüllerin etrafında boşluk yemeyin

En fazla maks, ancak genişletmeden önce mevcut olan en az minimum virgül, alanı bölmek için kullanılır.
argümanlar. makepp'in yerleşik işlevlerinden bazı örnekler:

my( $prefix, $text ) = argümanlar $_[0], $_[1], $_[2], 2, 2, 1; # addprefix
$cond ( argümanlar $_[0], undef, $_[2], ~0 ) için ... # ve, veya
benim @args= argümanlarım $_[0], $_[1], $_[2], ~0, 1, 1; # Arama
my( $filters, $words ) = argümanlar $_[0], $_[1], $_[2]; # filtre

İşlev, daha sonra diziye eklenen bir skaler dize (dizi değil) döndürmelidir.
bu noktada metin.

İşleviniz bir hatayla karşılaşırsa, olağan Perl die deyimini kullanarak ölmelidir.
Bu, makepp ve dosya adını ve satırı görüntüleyen bir hata mesajı tarafından yakalanacaktır.
Hataya neden olan ifadenin numarası yazdırılacaktır.

Fonksiyonun yapabilecekleri konusunda esasen bir sınır yoktur; dosyaya erişebilir, çalıştırabilirsiniz
kabuk komutları vb.

Şu anda, bağımlılıklarda ve kural eylemlerinde görünen ifadeler genişletildi
bir kez hedeflerde görünen ifadeler iki kez genişletilir, bu nedenle
işlevinin yan etkileri vardır ve bir hedef için bir ifadede bulunur.

İşlevin değerlendirdiği ortamın (özellikle cwd)
Makefile'deki kuralların bulunduğu ortamla mutlaka eşleşmez.
işlev değerlendirildi yürütülür. Bu sizin için bir sorunsa, işleviniz
muhtemelen şöyle görünmeli:

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

... Vb
}

koymak fonksiyonlar içine a Perl modül
İşlevleri bir içerme dosyasına koyarsanız, Makeppfile başına bir kopyanız olur ve bu
onu kullanır. Bunu önlemek için, bunları bir "Exporter" ile normal bir Perl modülü olarak yazabilirsiniz.
arayüzü ve bunu kullanın. Bu daha hızlı yüklenecek ve bellekten tasarruf sağlayacaktır:

perl {modülümü kullan}
perl {
benim::modülümü kullan; # put : yeni bir satırda bu kural olarak ayrıştırılmaz
}

Bir Makefile'de normalde bulunan işlevlerden herhangi birine ihtiyacınız varsa ("f_" gibi)
"arg" veya "args"), bu satırı modülünüze koymalısınız:

Mpp::Subs'ı kullanın;

Dezavantajı, modülün doğrudan bir işlevden farklı bir pakette olmasıdır.
bir makefile içinde görünüyor. Bu yüzden her şeyi parametre olarak iletmeniz veya yapılandırmanız gerekir.
Perl'in "arayan" işlevine sahip isimler.

çağrı dış Perl scriptler
"Sistem" aracılığıyla veya bir kural eylemi olarak harici bir Perl betiğini çağırırsanız, makepp bir
yeni süreç (son kural eylemi olmadığı sürece) ve yepyeni bir Perl yorumlayıcısını ateşleyin.
Daha verimli bir yol olması dışında bunda yanlış bir şey yok:

&komuta argümanlar ...
Bu bir kural eylemi olabilir. Bir fonksiyon çağıracak komuta "c_" öneki ile ve
kalanını iletin (isteğe bağlı olarak alıntılanan makepp stili - tam olarak aynı değil)
Kabuk) argümanları. Böyle bir işlev bulunamazsa, bu, tüm dizeleri
"Çalıştırmak".

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

$(sahte çağrıcmd):
&mycmd 'boşluklu arg' arg2 "arg3" # c_mycmd'yi çağırır

%.çıkış: %.in
&myscript -o $(output) $(input) # harici myscript'i çağırır

Komutlarınızı yerleşikler çerçevesinde yazabilir, kullanmanıza izin verebilirsiniz.
sahip olduklarıyla aynı standart seçenekler ve sağladıkları G/Ç yönetimi.

"Mpp::Cmds::frame" blok operatörünün ardından tek harfli bir seçenek listesi gelir.
yerleşikler (maksimum "qw(fi I ​​o O rs)"). Kendi seçeneğinizi belirtseniz bile
bunlardan birini geçersiz kılarak, yine de standart seçeneğin tek harfini verirsiniz.

Her kendi seçeneği "[qw(n adı), \$başvuru, tartışma, alt]". İlk iki
öğeler kısa ve uzun addır, ardından değişken referansı ve isteğe bağlı olarak
bir argüman alıp almamak için bir boole. Arg olmadan, değişken
seçenek her verildiğinde artar, aksi takdirde seçenek değeri burada saklanır.

sub c_my_ocmd { # Tipik çıktı durumu
yerel @ARGV = @_;
Mpp::Cmds::çerçeve {

... seçenekler zaten otomatik olarak kaldırılmış olarak burada @ARGV ile bir şeyler yazdırın

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

sub c_my_icmd { # 2 seçenekli tipik giriş durumu
yerel @ARGV = @_;
benim( $kısa, $uzun);
Mpp::Cmds::çerçeve {

... burada <> ile bir şeyler yap

} qw(i I rs), # s yalnızca --separator'ü belirtir, -s'yi değil
[qw(s short), \$short], # arg seçeneği yok -> $short == 1
[qw(l uzun), \$long, 1, sub { warn "var arg $uzun"}];
}

İşte her girişin yalnızca ilk karakterini büyüten basit bir komut geliyor
kayıt ("&sed '$$_ = "\u\L$$_"'" ile eşdeğer):

alt c_uc {
yerel @ARGV = @_;
Mpp::Cmds::çerçeve {
"\u\L$_" yazdırırken <>;
} 'f', qw(i I o O rs);
}

Çerçeve tarafından işlenen blok içinde, kritik işlemleri gerçekleştirmek için iç içe bloklara sahip olabilirsiniz.
diğer dosyaları açmak gibi işlemler.

Mpp::Cmds::perform { ... } 'mesaj';

Bu, "--verbose" (her komutun kabul ettiği) ile mesaj verir.
komut başarıyla çalıştırılır. Ancak blok yanlış olarak değerlendirilirse, ölür.
reddedilen mesaj

koşmak senaryo argümanlar ...
Bu, makefile içindeki herhangi bir Perl bağlamında kullanabileceğiniz normal bir Perl işlevidir.
Çok argümanlı sistem biçimine benzer, ancak Perl betiğini içinde çalıştırır.
mevcut süreç. Makepp ifadeleri için perl işlevi veya kendi işlevleriniz
makepp'i çalıştıran süreç budur. Ancak alt işlemi gerçekleştiren bir kural için
o. Komut dosyası çağrıldığı kadar ayrıştırılır, ancak gerçek
pod2html'nin yaptığı gibi bir lib'de çalışın. Bu lib daha sonra en üst düzeyde kullanılabilir, yani
zaten mevcut olduğunu:

perl { use mylib } #, yeniden ayrıştırılması gerekmeyen tüm kurallara çatallanır

%.çıkış: %.in
makeperl { qw'myscript -o $(çıktı) $(girdi)' } çalıştırın

Komut dosyası "çıkış"ı çağırırsa, standart dosya tanımlayıcılarını kapatır veya sisteme güvenir.
ondan sonra temizlemek için (dosyaları açın, bellek ...), bu "çalıştır" ile ilgili bir sorun olabilir. Eğer
deyimler veya Perl işlevi içinde "çalıştır" derseniz, makepp bozulabilir veya
temizleme yalnızca makepp sonunda gerçekleşir.

Yukarıda belirtilen sorunlardan birine sahipseniz, komut dosyasını harici olarak çalıştırın, yani
yerine komut satırı. Bir kural içinde temizleme daha az sorun yaratır, özellikle
bir kuralın son eylemi olarak, kural alt süreci zaten daha sonra çıkacağından,
Windows'ta hariç.

Yazı Yazmak senin kendi imza yöntemleri
Bazen makepp'in farklı bir teknik kullanarak bir imza yöntemini hesaplamasını istersiniz. İçin
örneğin, paylaşılan bir kitaplığa bağlı bir ikili dosyanız olduğunu varsayalım. Normalde, eğer
paylaşılan kitaplığı değiştirin, ona bağlı yürütülebilir dosyaları yeniden bağlamanız gerekmez, çünkü
bağlama çalışma zamanında yapılır. (Ancak, yürütülebilir dosyayı yeniden bağlamak mümkündür.
gerekli olabilir, bu yüzden bunu varsayılan yapmadım.) Ne istiyorsun makepp
yapılacak şey, değişse bile paylaşılan kitaplık için aynı imzaya sahip olmaktır.

Bu birkaç yolla gerçekleştirilebilir. En kolay yol, kendi yeni
imza yöntemi (haydi buna "shared_object" diyelim). Bu imza yöntemini kullanırsınız
yalnızca ikili dosyaları birbirine bağlayan kurallarda, bunun gibi:

programım: *.o lib1/lib1.so lib2/lib2.so
: imza paylaşılan_nesne
$(CC) $(girdiler) -o $(çıktı)

Şimdi imza yöntemini oluşturmamız gerekiyor.

Tüm imza yöntemleri kendi sınıfları olmalı ve sınıf birkaç özel özellik içermelidir.
öğeler (ayrıntılar için dağıtımdaki Mpp/Signature.pm'ye bakın). Sınıfın adı olmalıdır
"Mpp::Signature::" ön ekine sahiptir, bu durumda bu durumda sınıfımız çağrılmalıdır
"Mpp::İmza::shared_object". adlı bir dosya oluşturmalıyız. paylaşılan_nesne.pm ve koy
içine MPp::İmza Perl'de bir yerde bulunan dizin yolu; en kolay yer
içinde olabilir MPp/İmza makepp kurulumundaki dizin (örn.
/usr/yerel/paylaş/makepp/Mpp/İmza veya nereye yüklediyseniz).

Bu sınıfta yapılması gerekenler hakkında kesin ayrıntılar için, dikkatlice incelemelisiniz.
Dosya MPp/İmza.pm ve muhtemelen ayrıca Mpp/İmza/exact_match.pm makepp'de
dağıtım. Ama bizim durumumuzda, tek yapmak istediğimiz, çok küçük bir değişiklik yapmaktır.
mevcut imza mekanizması; dosya paylaşılan bir kitaplık ise, sabit bir dosyaya sahip olmak istiyoruz.
imza, dosya başka bir şeyse, makepp'in normaline güvenmek istiyoruz.
imza mekanizması Bunu yapmanın en iyi yolu,
Genellikle seçilen imza yöntemi olan "Mpp::Signature::c_compilation_md5"
makepp bir bağlantı komutunu tanıdığında.

yani dosya Mpp/Signature/shared_object.pm aşağıdakileri içerebilir:

sıkı kullanın;
paket Mpp::Signature::shared_object;
Mpp::Signature::c_compilation_md5 kullanın;
@ISA = qw(Mpp::Signature::c_compilation_md5); # Kalıtımı belirtin.
bizim $shared_object = korusun \@ISA; # Makepp'in bulmasına yardımcı olan bir sihir parçası
# bu yöntem için alt programlar. Tüm
# imza yöntemi bunlardan birine sahip olmalıdır.
# Değer kullanılmaz, sadece herhangi bir nesne.
# Şimdi, imzasına ihtiyacımız olduğunda çağrılan yöntem şudur:
# bu imza yönteminin etkin olduğu herhangi bir hedef veya bağımlılık:
alt imza {
my ($self, # Bu, $shared_object ile aynı olacaktır.
$finfo) = @_; # Her şeyi içeren özel bir yapı
# makepp bu dosyadan haberdardır. Görmek
# Mpp/File.pm ayrıntılar için.

if ($finfo->{NAME} =~ /\.s[oa]$/) { # Dosya adı .so veya .sa ile mi bitiyor?
$finfo->file_exists döndürür mü? 'var' : '';
# Dosya varsa her zaman aynı imzayı döndür
# var. Bu durumda imza,
# dize "var".
}

Mpp::İmza::c_compilation_md5::imza;
# Dosya .so veya .sa ile bitmediyse,
# makepp'in olağan imza yöntemine delege.
}

Bu dosya makepp dağıtımında bir örnek olarak verilmiştir, bazı ek bilgilerle birlikte
yorumlar.

Bu arada, neden bunu varsayılan yapmıyoruz? Eh, bir şeyi değiştirirken zamanlar vardır.
paylaşılan kitaplık, programınızın yeniden bağlanmasını gerektirir. ikisinden birini değiştirirseniz
paylaşılan bir kitaplığın tanımladığı semboller veya diğer kitaplıklara bağlı olduğu semboller
çünkü bazen yeniden bağlantı gerekli olabilir.

Örneğin, paylaşılan kitaplığın programınızın kullandığı bazı alt rutinleri çağırdığını varsayalım.
sağlar. Örneğin, paylaşılan kitaplığı değiştirdiğinizi varsayalım, böylece artık harici bir
"xyz()" alt programı. Bağlayıcıya "-E" veya "--export-dynamic" seçeneğini kullanmadığınız sürece
(GNU binutils için; diğer bağlayıcıların farklı seçenek adları vardır), "xyz()" sembolü
programınızda mevcut olsa bile çalışma zamanı bağlayıcısı tarafından erişilebilir olun.

Daha da kötüsü, başka bir kitaplıkta "xyz()" tanımladığınızı varsayalım (bunu libxyz), bunun gibi:

programım: main.o lib1/lib1.so xyz/libxyz.a

"libxyz" bir .a dosya ve değil .yani dosyası, ardından "xyz()" içeri çekilmeyebilir
doğru bir şekilde libxyz.a ikili dosyanızı yeniden bağlamadığınız sürece.

Mpp::Signature yöntemleri, yalnızca bir
dosya değişti, ancak dizeleri karşılaştırmak için kullanılan algoritma. Örneğin,
makepp dağıtımındaki "target_newer" imza yöntemi yalnızca
hedefler bağımlılıklardan daha yeni olurken, "exact_match" imza yöntemi (ve
"md5" ve "c_compilation_md5" gibi ona bağlı olan her şey,
dosya, son derlemedekiyle aynı imzaya sahiptir.

Farkına varmanıza yardımcı olacak, yararlı olabilecek diğer bazı imza yöntemleri şunlardır:
olasılıklar. Genel amaç yeterliyse, bunlardan bazıları sonunda olabilir.
makepp'e dahil edildi:

· Paylaşılan kitaplıklar için dışa aktarılan tüm öğelerin sağlama toplamını döndüren bir imza yöntemi
semboller ve ayrıca diğer kütüphanelerden ihtiyaç duyduğu tüm semboller. Bu çözer
yukarıdaki örnekte sorun var ve her koşulda doğru bağlantıyı garanti ediyor.
Makepp dağılımında bunu yapmak için deneysel bir girişimde bulunulmuştur (bkz.
Mpp/Signature/shared_object.pm), ancak yalnızca GNU binutils ve ELF ile çalışır
şu anda kütüphaneler.

· Bir dosyaya yazılan tarih damgasını yok sayan bir imza yöntemi. Örneğin, eğer
oluşturmak .c bir dize koymakta ısrar eden bir programı kullanarak otomatik olarak dosya
şöyle:

static char * date_stamp = "01 Nisan 2004 tarihinde hiç kimse tarafından otomatik olarak oluşturuldu";

tarih damgalarındaki değişiklikleri özellikle yok sayan bir imza yöntemi yazabilirsiniz.
Bu nedenle, değişen tek şey tarih damgasıysa, makepp yeniden oluşturulmaz.

· İmzaları normal şekilde hesaplayan ancak imzaları yok sayan bir imza yöntemi.
Yeniden inşa edilip edilmeyeceğine karar verirken mimari bağımlılık. Bunun için yararlı olabilir
gerçekten mimariden bağımsız dosyalar; şu anda bir mimari üzerine inşa ederseniz,
makepp, geçiş yaptığınızda mimariden bağımsız dosyaları bile yeniden oluşturmakta ısrar edecektir.
farklı bir mimariye.

· Lateks dosyalarındaki yorumların nasıl yok sayılacağını bilen bir imza yöntemi,
"c_compilation_md5" yöntemi, C dosyalarındaki yorumları nasıl yok sayacağını bilir.

· Yalnızca sağlama toplamını sağlayan otomatik belge çıkarma için bir imza yöntemi.
bir belge çıkarıcının ihtiyaç duyduğu ve kaynaktaki diğer değişiklikleri görmezden geldiği yorumlar
dosyası.

bitmemiş
Bu belge henüz bitmedi. için kendi tarayıcılarınızı nasıl yazacağınızı kapsamalıdır.
dosyalar ve bunun gibi şeyler içerir.

onworks.net hizmetlerini kullanarak makepp_extending çevrimiçi kullanın


Ücretsiz Sunucular ve İş İstasyonları

Windows ve Linux uygulamalarını indirin

Linux komutları

Ad