Özet
pp [ -ABCEFILMPTSVXacdefghilmnoprsuvxz ] [ parfile | scriptfile ]...
Örnekler
Not: Microsoft Windows üzerinde çalıştırıldığında, aşağıdaki a.out yerine a.exe gelecektir.
% pp hello.pl # 'hello.pl' dosyasını 'a.out' yürütülebilir dosyası olarak paketler
% pp -o hello hello.pl # 'hello.pl' dosyasını 'hello' yürütülebilir dosyası olarak paketler
# (Win32 üzerinde 'hello.exe')
% pp -o foo foo.pl bar.pl # 'foo.pl' ve 'bar.pl' dosyalarını 'foo' içinde paketler
% ./foo # 'foo' içindeki 'foo.pl' betiğini çalıştırır
% mv foo bar; ./bar # 'foo' içindeki 'bar.pl' betiğini çalıştırır
% mv bar baz; ./baz # Hata: "baz" perl betiği açılamıyor
% pp -p file # Bir PAR dosyası olan 'a.par' dosyasını oluşturur
% pp -o hello a.par # 'a.par' dosyasını 'hello' yürütülebilir dosyası olarak paketler
% pp -S -o hello file # Yukarıdaki iki adımı birleştirir
% pp -p -o out.par file # 'file' dosyasından 'out.par' oluşturur
% pp -B -p -o out.par file # yukarıdakinin aynısıdır, ancak çekirdek modülleri paketler
# ve @INC içindeki tüm yerel yolları kaldırır
% pp -P -o out.pl file # 'file' dosyasından 'out.pl' oluşturur
% pp -B -p -o out.pl file # yukarıdakinin aynısıdır, ancak çekirdek modülleri paketler
# ve @INC içindeki tüm yerel yolları kaldırır
# (yürütülebilir dosyalar oluşturulurken -B varsayılır)
% pp -e "print 123" # Tek satırlık bir kod bloğunu 'a.out' içine paketler
% pp -p -e "print 123" # Bir 'a.par' PAR dosyası oluşturur
% pp -P -e "print 123" # Bir 'a.pl' perl betiği oluşturur
% pp -c hello # "perl -c hello" çıktısından bağımlılıkları kontrol eder
% pp -x hello # "perl hello" çıktısından bağımlılıkları kontrol eder
% pp -n -x hello # yukarıdakinin aynısıdır, ancak statik taramayı atlar
% pp -I /foo hello # Ek include yolları
% pp -M Foo::Bar hello # Include yolundaki ek modüller
% pp -M abbrev.pl hello # Include yolundaki ek kütüphaneler
% pp -X Foo::Bar hello # Hariç tutulacak modüller
% pp -a data.txt hello # Ek veri dosyaları
% pp -r hello # 'hello' dosyasını 'a.out' içine paketler ve 'a.out'u çalıştırır
% pp -r hello a b c # 'hello' dosyasını 'a.out' içine paketler ve 'a.out'u
# 'a b c' argümanlarıyla çalıştırır
% pp hello --log=c # 'hello' dosyasını 'a.out' içine paketler, mesajları
# 'c' dosyasına kaydeder
# 'hello' dosyasını konsolsuz bir 'out.exe' içine paketler (yalnızca Win32)
% pp --gui -o out.exe hello
% pp @file hello.pl # 'hello.pl' dosyasını paketler ancak _ek_
# seçenekleri 'file' dosyasından okur
Açıklama
pp, PAR tarafından sağlanan sıkıştırılmış paketleyiciyi ve Module::ScanDeps tarafından sunulan bağımlılık algılama sezgisellerini kullanarak Perl programlarından bağımsız yürütülebilir dosyalar oluşturur. Kaynak dosyalar derlenmeden aynen sıkıştırılır.
pp aracını "zahmetsizce çalışan bir perlcc" olarak düşünebilirsiniz. :-)
Ayrıca tkpp komutu olarak bir GUI arayüzü de mevcuttur.
perlcc tarafından sağlanan derleme adımı hızlandırmasını sunmaz (ancak bayt derlemeli, kaynak gizleme teknikleri için aşağıdaki -f seçeneğine bakın), fakat bunu daha iyi güvenilirlik, daha küçük yürütülebilir dosya boyutu ve orijinal kaynak kodunun tamamen geri alınabilmesi ile telafi eder.
Tek bir girdi programı belirtildiğinde, ortaya çıkan yürütülebilir dosya o programla tamamen aynı şekilde davranacaktır. Ancak, birden fazla program paketlendiğinde, üretilen yürütülebilir dosya, $0 ile aynı temel ada (yani çağrılmak için kullanılan dosya adı) sahip olanı çalıştıracaktır. Eşleşen bir şey bulunamazsa, "Can't open perl script "$0"" hatasıyla sonlanır.
Seçenekler
Seçeneklerin kısa ve uzun formları mevcuttur. Örneğin, aşağıdaki üç satırın hepsi eşdeğerdir:
% pp -o output.exe input.pl % pp --output output.exe input.pl % pp --output=output.exe input.pl
Komut satırları bazı kabukların sınırlarına ulaşacak kadar uzayabileceğinden, pp'nin bazı seçeneklerini bir veya daha fazla metin dosyasından okumasını sağlamak mümkündür. Temel kullanım, yalnızca 'et' (@) işaretiyle başlayan bir argüman eklemektir. Bu argüman, seçeneklerin okunacağı bir dosya olarak yorumlanacaktır. Normal seçenekler ile @dosya seçeneklerini karıştırmak mümkündür. Bu işlem Getopt::ArgvFile modülü kullanılarak gerçekleştirilmiştir, bu nedenle gelişmiş kullanım için ilgili belgelere bakın.
-a, --addfile=FILE|DIR Pakete fazladan bir dosya ekler. Eğer dosya bir dizin ise, o dizinin içindeki tüm dosyaları özyinelemeli (recursive) olarak ekler ve sembolik bağları gerçek dosyalara dönüştürür.
Varsayılan olarak dosyalar, orijinal adlarıyla paket içindeki "/" dizini altına yerleştirilir. Bunu, hedef dosya adını ";" işaretinden sonra ekleyerek şu şekilde geçersiz kılabilirsiniz:
% pp -a "old_filename.txt;new_filename.txt" % pp -a "old_dirname;new_dirname"
"-a" seçeneğini birden fazla kez belirtebilirsiniz.
-A, --addlist=FILE DOSYA'dan dosya/dizin adlarının bir listesini okur ve bunları pakete ekler. DOSYA içindeki her satır, yukarıdaki -a seçeneği için bir argüman olarak kabul edilir.
"-A" seçeneğini birden fazla kez belirtebilirsiniz.
-B, --bundle Çekirdek modülleri ortaya çıkan pakete dahil eder. "-p" veya "-P" belirtilmediği sürece bu seçenek varsayılan olarak etkindir.
PAR sürüm 0.953'ten beri bu seçenek, içerilen betiği çalıştırmadan önce modül arama yolları listesi olan @INC'den tüm yerel yolları da temizler.
-C, --clean Çalışma zamanında uygulamadan çıkarılan geçici dosyaları temizler. Varsayılan olarak bu dosyalar geçici dizinde önbelleğe alınır; bu, programın bir sonraki açılışta daha hızlı başlamasını sağlar.
-c, --compile Ek çalışma zamanı bağımlılıklarını belirlemek için "perl -c inputfile" komutunu çalıştırır.
-cd, --cachedeps=FILE Algılanan bağımlılıkları önbelleğe almak için DOSYA kullanır. Mevcut değilse DOSYA'yı oluşturur. Bu, sonraki çalıştırmalarda tarama sürecini hızlandıracaktır.
-d, --dependent Perl yorumlayıcısının bir kopyasını dahil etmeyerek yürütülebilir dosya boyutunu azaltır. Bu şekilde derlenen yürütülebilir dosyaların düzgün çalışması için ayrı bir perl5x.dll veya libperl.so dosyasına ihtiyacı olacaktır. Bu seçenek yalnızca perl paylaşılan bir kitaplık (shared library) olarak derlenmişse kullanılabilir.
-e, --eval=STRING "perl -e '...'" ile hemen hemen aynı şekilde, tek satırlık bir kod bloğunu paketler.
-E, --evalfeature=STRING Perl 5.10 ve sonraki sürümlerinde (ana derleme birimindeki) tüm isteğe bağlı özellikleri örtük olarak etkinleştirmesi dışında, tıpkı "-e" gibi davranır. Bkz. feature.
-x, --execute Ek çalışma zamanı bağımlılıklarını belirlemek için "perl inputfile" komutunu çalıştırır.
Bu seçenek kullanıldığında pp, "inputfile" dosyasının statik analiziyle belirlenemeyen modüllerin kullanımını algılayabilir. Örnek olarak Module::Runtime gibi çalışma zamanı yükleyicileri veya Module::Loader gibi "eklenti" (plugin) yükleyicileri tarafından yüklenen şeyler verilebilir. Algılanan modüllerin, "inputfile" çalıştırıldığında programınızın hangi bölümlerinin çalıştırıldığına bağlı olduğunu unutmayın. Örneğin, zorunlu argümanları olmadığı için programınız "perl inputfile" olarak çalıştırıldığında hemen sonlanıyorsa, bu seçeneğin muhtemelen hiçbir etkisi olmayacaktır. Bu durumda argüman sağlamak için --xargs seçeneğini kullanabilirsiniz.
--xargs=STRING Eğer -x belirtilmişse, Text::ParseWords modülündeki "shellwords" işlevini kullanarak "STRING" ifadesini böler ve "perl inputfile" çalıştırılırken sonucu @ARGV olarak iletir.
-X, --exclude=MODULE Belirtilen modülü bağımlılık arama yolundan ve paketten hariç tutar. Belirtilen dosya bir zip, par veya par yürütülebilir dosyası ise, belirtilen dosyadaki tüm dosyalar (MANIFEST, META.yml ve script/* hariç) hariç tutulacak ve çıktı dosyası çalışma zamanında belirtilen dosyayı "use" (dahil) edecektir.
-f, --filter=FILTER Kaynak betikleri bir PAR::Filter alt sınıfı ile filtreler. Bu tür birden fazla filtre belirtebilirsiniz.
Kaynak kodunu sıradan meraklı gözlerden gizlemek istiyorsanız, şu işlem işinizi görecektir:
% pp -f Bleach source.pl
Kaynak kodunuzu gizleme konusunda daha ciddiyseniz, Steve Hay'in PAR::Filter::Crypto modülüne bir göz atmalısınız. Filter::Crypto uyarılarını/kısıtlamalarını anladığınızdan emin olun!
-g, --gui Konsol penceresi olmayan bir yürütülebilir dosya derler. Bu seçenek MSWin32 dışındaki platformlarda veya "-p" belirtildiğinde yoksayılır.
-h, --help Temel kullanım bilgilerini gösterir.
-I, --lib=DIR Belirtilen dizini perl modülü arama yoluna ekler. Birden fazla kez belirtilebilir.
-l, --link=FILE|LIBRARY Belirtilen paylaşılan kitaplığı (diğer adıyla paylaşılan nesne veya DLL) paketlenmiş dosyaya ekler. Ayrıca kitaplık yolları altındaki adları da kabul eder; yani çoğu Unix sisteminde "-l ncurses", "-l libncurses.so" veya "-l /usr/local/lib/libncurses.so" ile aynı anlama gelir. Birden fazla kez belirtilebilir.
-L, --log=FILE Paketleme çıktısını stdout yerine bir dosyaya kaydeder.
-F, --modfilter=FILTER[=REGEX], Dahil edilen perl modüllerini bir PAR::Filter alt sınıfı ile filtreler. Bu tür birden fazla filtre belirtebilirsiniz.
Varsayılan olarak PodStrip filtresi uygulanır. Bunun sorun çıkarması durumunda, "PAR_VERBATIM" ortam değişkenini 1 olarak ayarlayarak bu özelliği kapatabilirsiniz.
PAR 0.958'den beri, arşivdeki hangi dosyaların filtreleneceğini seçmek için isteğe bağlı bir düzenli ifade (yukarıdaki REGEX) kullanabilirsiniz. Örnek:
pp -o foo.exe -F Bleach=warnings.pm$ foo.pl
Bu, "warnings.pm" ile biten ve PAR::Filter::Bleach ile filtrelenen dosyalar hariç tüm dosyaları normal şekilde paketleyerek foo.pl dosyasından ikili (binary) bir yürütülebilir foo.exe dosyası oluşturur.
-M, --module=MODULE Belirtilen modülü bağımlılıklarıyla birlikte pakete ekler.
Tüm modül ad alanlarını (namespaces) eklemek için aşağıdaki varyantlar kullanılabilir:
-M Foo::** "Foo" ad alanındaki "Foo"nun kendisi hariç her modülü ekler, yani herhangi bir derinliğe kadar "Foo::Bar", "Foo::Bar::Quux" vb. ekler.
-M Foo::* "Foo" ad alanındaki 1. seviyedeki her modülü ekler, yani "Foo::Bar"ı ekler, ancak ne "Foo::Bar::Quux"ı ne de "Foo"yu ekler.
-M Foo:: "-M Foo -M Foo::**" için kısayoldur: "Foo"nun kendisi da dahil olmak üzere "Foo" ad alanındaki her modül.
Bir modül adı yerine MODULE, @INC yoluna göre bir dosya adı olarak da belirtilebilir, yani "-M Module/ScanDeps.pm", "-M Module::ScanDeps" ile aynı anlama gelir.
Eğer MODULE, ".pm"/".ix"/".al" olmayan bir uzantıya sahipse, bağımlılıklar için taranmayacak ve PAR dosyasının içinde "/lib/" yerine "/" altına yerleştirilecektir. Bu kullanım artık önerilmemektedir (deprecated) -- bunun yerine -a seçeneğini kullanmayı düşünün.
"-M" seçeneğini birden fazla kez belirtebilirsiniz.
-m, --multiarch Çoklu mimariye sahip (multi-architecture) bir PAR dosyası derler. -p seçeneğini ima eder.
-n, --noscan Varsayılan statik taramayı tamamen atlar, yalnızca -c veya -x seçeneklerinden gelen çalışma zamanı bağımlılıklarını kullanır.
-N, --namespace=NAMESPACE Ad alanındaki tüm modülleri bağımlılıklarıyla birlikte pakete ekler. Eğer "NAMESPACE", "Foo::Bar" gibi bir şeyse, modül arama yolunuzda bulunabilen "Foo/Bar/Quux.pm", "Foo/Bar/Fred/Barnie.pm" vb. tüm modülleri ekleyecektir. Module::Loader gibi "eklenti" (plugin) yükleyicilerinin davranışını taklit eder.
Bu, "-M Foo::Bar::" kullanmaktan farklıdır, çünkü ikincisi yukarıdaki "eklenti" (plugin) senaryosunda mevcut olmayabilecek olan "Foo/Bar.pm" dosyasını eklemekte ısrar eder.
"-N" seçeneğini birden fazla kez belirtebilirsiniz.
-o, --output=FILE Nihai paketlenmiş yürütülebilir dosyanın adı.
-p, --par Yalnızca PAR arşivleri oluşturur; bağımsız bir ikili dosyaya paketlemez.
-P, --perlscript Bağımsız çalışan bir perl betiği oluşturur; bağımsız bir ikili dosyaya paketlemez.
-r, --run Paketleme işleminden sonra ortaya çıkan paketlenmiş betiği çalıştırır.
--reusable DENEYSEL
Paketlenmiş yürütülebilir dosyayı, paketin bir parçasıymış gibi keyfi, harici Perl betiklerini çalıştırmak için yeniden kullanılabilir hale getirir:
pp -o myapp --reusable someapp.pl ./myapp --par-options --reuse otherapp.pl
İkinci satır, someapp.pl yerine otherapp.pl dosyasını çalıştıracaktır.
-S, --save Paketlemeden sonra oluşturulan PAR dosyasını silmez.
-s, --sign Oluşturulan PAR veya ikili dosyayı Module::Signature kullanarak kriptografik olarak imzalar.
-T, --tempcache Program -C olmadan çalıştırıldığında kullanılan önbellek dizini adının programa özgü benzersiz kısmını ayarlar. Ayarlanmazsa, yürütülebilir dosyanın bir karması (hash) kullanılır.
Program çalıştırıldığında, içeriği geçici bir dizine çıkarılır. Unix sistemlerinde bu genellikle /tmp/par-USER/cache-XXXXXXX şeklindedir. KULLANICI, programı çalıştıran kullanıcının adıyla değiştirilir, ancak onaltılık (hex) düzende yazılır. XXXXXXX, yürütülebilir dosyanın karması veya "-T" ya da "--tempcache" seçeneğine iletilen değerdir.
-u, --unicode Unicode desteğini paketler (esasen perl kitaplığınızdaki utf8_heavy.pl dosyası ve unicore dizininin altındaki her şey).
Bu seçenek, programınızın çalışma zamanında Unicode desteğine ihtiyacı olup olmadığını statik analiz kullanarak tespit etmenin imkansız olması nedeniyle mevcuttur. (Not: Programınızın "use utf8" içermesi, Unicode desteğine ihtiyacı olduğu anlamına gelmez. Yalnızca programınızın UTF-8 ile yazıldığını belirtir.)
Eğer paketlenmiş programınız aşağıdaki gibi bir hata mesajıyla sonlanırsa:
Can't locate utf8_heavy.pl in @INC (@INC contains: ...)
"-u" ile paketlemeyi deneyin (veya "-x" kullanın).
-v, --verbose[=NUMBER] Çıktının ayrıntı düzeyini artırır; NUMBER, 1 ile 3 arasında bir tam sayıdır ve 3 en ayrıntılısıdır. Bir argüman olmadan belirtilirse varsayılan olarak 1 olur. Alternatif olarak, -vv ayrıntı seviyesini 2'ye, -vvv ise 3'ye ayarlar.
-V, --version Bu programın sürüm numarasını ve telif haklarını gösterir.
-z, --compress=NUMBER Zip sıkıştırma düzeyini ayarlar; NUMBER, 0 ile 9 arasında bir tam sayıdır, 0 = sıkıştırma yok, 9 = maksimum sıkıştırma. -z kullanılmazsa varsayılan olarak 6'dır.
Ortam
PP_OPTS Komut satırı seçenekleri (parametreler). Bu değişkendeki parametreler, her pp komut satırındaymış gibi kabul edilir.
Notlar
Farklı beklentileri olan hedef makinelerde, source.pl dosyasını tüm bağımlılıklarıyla birlikte paketlemek için pp aracının nasıl kullanılacağını gösteren bazı tarifler aşağıdadır:
Stone-alone (Tamamen bağımsız) kurulum: Perl kurulu olmayan bir makinede çalıştırılmaya uygun, bağımsız bir yürütülebilir dosya oluşturmak için:
% pp -o packed.exe source.pl # packed.exe oluşturur
Şimdi, 'packed.exe' dosyasını hedef makineye dağıtın...
$ packed.exe # çalıştırın
Yalnızca Perl yorumlayıcısı, çekirdek modüller olmadan: Perl yorumlayıcısı olan bir makinede çalıştırılmaya uygun, ancak programınızın kullandığı çekirdek modüllerin sürümlerinden emin olmak istediğinizde, çekirdek modülleri de içeren paketlenmiş bir .pl dosyası oluşturmak için:
% pp -B -P -o packed.pl source.pl # packed.pl oluşturur
Şimdi, 'packed.pl' dosyasını hedef makineye dağıtın...
$ perl packed.pl # çalıştırın
Çekirdek modülleri kurulu Perl: Çekirdek modüller olmadan, hedef makinenin perl yorumlayıcısına ve çekirdek kitaplıklarına güvenerek paketlenmiş bir .pl dosyası oluşturmak için. Bu, önceki sürüme göre önemli ölçüde daha küçük bir dosya üretir:
% pp -P -o packed.pl source.pl # packed.pl oluşturur
Şimdi, 'packed.pl' dosyasını hedef makineye dağıtın...
$ perl packed.pl # çalıştırın
PAR.pm ve bağımlılıkları kurulu Perl: Arşivi kullanan ayrı bir arşiv ve yürütülebilir dosya oluşturun. Bu, hedef makinedeki perl yorumlayıcısına ve kitaplıklarına dayanır.
% pp -p source.pl # source.par oluşturur % echo "use PAR 'source.par';" > packed.pl; % cat source.pl >> packed.pl; # packed.pl oluşturur
Şimdi, 'source.par' ve 'packed.pl' dosyalarını hedef makineye dağıtın...
$ perl packed.pl # çalıştırın, perl + çekirdek modüller gereklidir
Perl'iniz paylaşılan bir kitaplık (shared library) ile derlenmiş olsa bile, yukarıdaki 'Bağımsız yürütülebilir dosyanın' düzgün çalışması için ayrı bir perl5x.dll veya libperl.so dosyasına ihtiyacı duymayacağını unutmayın. Ancak bu durumda bile, libc gibi temel sistem kitaplıklarının kaynak ve hedef makineler arasında uyumlu olması gerekir. Paylaşılan kitaplığı uygulamayla birlikte göndermeyi kabul ediyorsanız "--dependent" seçeneğini kullanın, bu yürütülebilir dosya boyutunu önemli ölçüde azaltabilir.
Ayrıca Bakınız
tkpp, par.pl, parl, perlcc
PAR, PAR::Packer, Module::ScanDeps
Getopt::Long, Getopt::ArgvFile
Teşekkürler
perlcc'yi yazdıkları için Simon Cozens, Tom Christiansen ve Edward Peschko'ya teşekkürler; bu program onun arayüzünü mümkün olduğunca yakından taklit etmeye çalışmış ve kodlarından bolca alıntı yapmıştır.
"-g" bayrağına kısmen uyarlanan exetype.pl aracını yazdığı için Jan Dubois'ya teşekkürler.
"myldr" ikili yükleyici kodunu sağladığı için Mattia Barbon'a teşekkürler.
pp adını önerdiği için Jeff Goff'a teşekkürler.
Yazarlar
Audrey Tang cpan@audreyt.org, Steffen Mueller smueller@cpan.org Roderich Schupp rschupp@cpan.org
Tartışmaya katılmak için par@perl.org adresindeki e-posta listesine yazabilir veya par-subscribe@perl.org adresine boş bir e-posta gönderebilirsiniz.
Lütfen hata raporlarını bug-par-packer@rt.cpan.org adresine gönderin.
Telif Hakkı
Copyright 2002-2009 by Audrey Tang cpan@audreyt.org.
Ne bu program ne de onunla ilişkili parl programı, Artistic License'ın (Artistik Lisans) 8. maddesi uyarınca, çalıştırılmalarıyla oluşturulan dosyalar üzerinde herhangi bir lisans kısıtlaması getirmez:
"Bu Paketin ticari bir dağıtımla birleştirilmesine, bu Paketin kullanımının gömülü olması şartıyla her zaman izin verilir; yani, bu Paketin arayüzlerini ticari dağıtımın son kullanıcısına görünür kılmak için açık bir girişimde bulunulmadığında. Bu tür bir kullanım, bu Paketin bir dağıtımı olarak yorumlanamaz."
Bu nedenle, paketlenmiş 3. taraf kütüphaneler de Artistic License kapsamında mevcut olduğu sürece, ortaya çıkan yürütülebilir dosyaya herhangi bir lisans yerleştirmekte tamamen özgürsünüz.
Bu program özgür bir yazılımdır; Perl'in kendi koşulları altında yeniden dağıtabilir ve/veye değiştirebilirsiniz.
Bkz. LICENSE.