EnglishFrenchSpanyol

Ad


Favicon OnWorks

kontra - Dalam talian di Awan

Jalankan kontra dalam penyedia pengehosan percuma OnWorks melalui Ubuntu Online, Fedora Online, emulator dalam talian Windows atau emulator dalam talian MAC OS

Ini ialah keburukan arahan yang boleh dijalankan dalam penyedia pengehosan percuma OnWorks menggunakan salah satu daripada berbilang stesen kerja dalam talian percuma kami seperti Ubuntu Online, Fedora Online, emulator dalam talian Windows atau emulator dalam talian MAC OS.

JADUAL:

NAMA


Keburukan - Sistem Pembinaan Perisian

DESCRIPTION


Panduan dan rujukan untuk versi 2.2.0

Hak Cipta (c) 1996-2000 Free Software Foundation, Inc.

Program ini adalah perisian percuma; anda boleh mengagihkannya semula dan/atau mengubah suainya di bawah syarat
Lesen Awam Am GNU seperti yang diterbitkan oleh Yayasan Perisian Percuma; sama ada
versi 2 Lesen, atau (mengikut pilihan anda) mana-mana versi kemudian.

Program ini diedarkan dengan harapan ia akan berguna, tetapi TANPA SEBARANG WARANTI;
tanpa jaminan tersirat KEBOLEHPERDAGANGAN atau KESESUAIAN UNTUK TUJUAN TERTENTU.
Lihat Lesen Awam Am GNU untuk butiran lanjut.

Anda sepatutnya menerima salinan Lesen Awam Am GNU bersama-sama dengan program ini;
lihat fail MENYALIN. Jika tidak, tulis kepada Free Software Foundation, Inc., 59 Temple
Tempat - Suite 330, Boston, MA 02111-1307, Amerika Syarikat.

Pengenalan


Kekurangan ialah sistem untuk membina, terutamanya, perisian, tetapi agak berbeza daripada
sistem pembinaan perisian sebelumnya. Cons telah direka dari bawah ke atas untuk berurusan
mudah dengan pembinaan perisian tersebar di beberapa direktori sumber. Keburukan
memudahkan untuk mencipta skrip binaan yang mudah, boleh difahami dan boleh diselenggara.
Keburukan memastikan perisian yang kompleks boleh dihasilkan semula dengan mudah dan tepat.

Cons menggunakan beberapa teknik untuk mencapai semua ini. Skrip pembinaan adalah adil
Skrip Perl, menjadikannya mudah untuk difahami dan sangat fleksibel. Skop global bagi
pembolehubah digantikan dengan mekanisme import/eksport untuk berkongsi maklumat antara
skrip, meningkatkan kebolehbacaan dan kebolehselenggaraan setiap skrip dengan ketara.
Pembinaan persekitaran diperkenalkan: ini adalah objek Perl yang menangkap
maklumat yang diperlukan untuk mengawal proses binaan. Pelbagai persekitaran digunakan
apabila semantik berbeza diperlukan untuk menjana produk dalam pokok binaan. Keburukan
melaksanakan analisis pergantungan automatik dan menggunakan ini untuk menyusun keseluruhan secara global
membina. Binaan varian mudah dihasilkan daripada pokok sumber tunggal. Binaan pintar
subset adalah mungkin, apabila bekerja pada perubahan setempat. Penggantian boleh disediakan untuk
mengatasi arahan binaan dengan mudah tanpa mengubah suai sebarang skrip. kriptografi MD5
tandatangan dikaitkan dengan fail terbitan, dan digunakan untuk menentukan dengan tepat sama ada
fail yang diberikan perlu dibina semula.

Semasa menawarkan semua perkara di atas, dan banyak lagi, Cons tetap mudah dan mudah digunakan. ini akan,
mudah-mudahan, menjadi jelas semasa anda membaca baki dokumen ini.

Mengapa Keburukan? Mengapa tidak Buat?


Keburukan ialah a membuat penggantian. Dalam perenggan berikut, kita melihat beberapa daripada
ciri buatan yang tidak diingini--dan persekitaran binaan biasa berdasarkan buatan--itu
memotivasikan pembangunan Cons.

Membina kerumitan

Sistem berasaskan buatan tradisional dari sebarang saiz cenderung menjadi agak kompleks. Buatan asal
utiliti dan derivatifnya telah menyumbang kepada kecenderungan ini dalam beberapa cara. Buat adalah
tidak pandai berurusan dengan sistem yang tersebar di beberapa direktori. Pelbagai kerja-
sekeliling digunakan untuk mengatasi kesukaran ini; pilihan biasa adalah untuk membuat untuk memohon
sendiri secara rekursif untuk setiap sub-direktori binaan. Ini membawa kepada kod rumit, dalam
yang selalunya tidak jelas bagaimana pembolehubah ditetapkan, atau apakah kesan penetapan pembolehubah
akan ada pada binaan secara keseluruhan. Bahasa pembuatan skrip telah diperluaskan secara beransur-ansur
untuk menyediakan lebih banyak kemungkinan, tetapi ini sebahagian besarnya telah menyebabkan kekacauan
bahasa yang terlalu panjang. Selalunya, binaan dilakukan dalam berbilang pas untuk menyediakan
produk yang sesuai dari satu direktori ke direktori lain. Ini mewakili lebih jauh
peningkatan dalam kerumitan binaan.

Membina kebolehulangan

Kecelaruan semua pembuatan sentiasa adalah pengendalian kebergantungan yang betul. Selalunya, an
percubaan dibuat untuk melakukan kerja kebergantungan yang munasabah dalam satu direktori, tetapi tidak
percubaan serius dibuat untuk melakukan kerja antara direktori. Walaupun kebergantungan adalah
berfungsi dengan betul, pergantungan pada perbandingan cap masa yang mudah untuk menentukan sama ada
fail sudah lapuk berhubung dengan tanggungannya tidak, secara amnya, memadai untuk
menentukan bila fail harus diperoleh semula. Jika perpustakaan luaran, sebagai contoh, adalah
dibina semula dan kemudian ``dipotong'' pada tempatnya, cap masa pada failnya yang baru dibuat mungkin
lebih awal daripada binaan tempatan yang terakhir, kerana ia dibina sebelum ia kelihatan.

Pelbagai membina

Make hanya menyediakan kemudahan terhad untuk mengendalikan binaan varian. Dengan percambahan
platform perkakasan dan keperluan untuk kod boleh nyahpepijat vs. dioptimumkan, keupayaan untuk
mencipta varian ini dengan mudah adalah penting. Lebih penting lagi, jika varian dicipta, ia
adalah penting untuk sama ada dapat mengasingkan varian atau untuk dapat menghasilkan semula
asal atau varian sesuka hati. Dengan membuat adalah sangat sukar untuk memisahkan binaan
berbilang direktori binaan, berasingan daripada sumber. Dan jika teknik ini tidak digunakan,
ia juga hampir mustahil untuk menjamin pada bila-bila masa varian yang ada
pokok itu, tanpa perlu membina semula sepenuhnya.

Repositori

Make hanya menyediakan sokongan terhad untuk membina perisian daripada kod yang wujud dalam a
struktur direktori repositori pusat. Ciri VPATH GNU make (dan beberapa yang lain
make pelaksanaan) bertujuan untuk menyediakan ini, tetapi tidak berfungsi seperti yang diharapkan: it
menukar laluan fail sasaran kepada nama VPATH terlalu awal dalam analisisnya, dan oleh itu
mencari semua kebergantungan dalam direktori VPATH. Untuk memastikan pembangunan yang betul
membina, adalah penting untuk dapat mencipta fail dalam direktori binaan tempatan dan mempunyai
mana-mana fail dalam repositori kod (direktori VPATH, dalam istilah) yang bergantung pada tempatan
fail dibina semula dengan betul. Ini tidak boleh dilakukan dengan VPATH, tanpa banyak pengekodan
pengetahuan repositori kompleks terus ke dalam makefiles.

Penyimpanan it mudah


Beberapa kesukaran dengan membuat telah disebut di atas. Dalam ini dan seterusnya
bahagian, kami akan memperkenalkan Keburukan dan menunjukkan cara isu ini ditangani.

Perl skrip

Cons adalah berasaskan Perl. Iaitu, skrip Cons--Wajib and Bina fail, yang setara
kepada Makefile or makefile--semuanya ditulis dalam Perl. Ini memberikan faedah segera: yang
bahasa untuk menulis skrip adalah bahasa yang biasa. Walaupun anda bukan seorang Perl
pengaturcara, ia membantu mengetahui bahawa Perl pada asasnya hanyalah bahasa pengisytiharan yang mudah,
dengan aliran kawalan yang jelas, dan semantik yang biasa. Ia mempunyai pembolehubah yang berkelakuan
pada asasnya seperti yang anda harapkan, subrutin, aliran kawalan dan sebagainya. di sana
tiada sintaks khas yang diperkenalkan untuk Cons. Penggunaan Perl sebagai bahasa skrip
memudahkan tugas untuk menyatakan penyelesaian yang sesuai kepada yang sering kompleks
keperluan sesuatu binaan.

helo, Dunia!

Untuk membumikan perbincangan berikut, berikut ialah cara anda boleh membina helo, Dunia! C
aplikasi dengan Keburukan:

$env = keburukan baharu();
Program $env 'hello', 'hello.c';

Jika anda memasang skrip ini dalam direktori, menamakan skrip Bina, dan cipta
hello.c fail sumber dalam direktori yang sama, kemudian anda boleh menaip `cons hello' untuk membina fail
permohonan:

% kontra hello
cc -c hello.c -o hello.o
cc -o hello hello.o

Pembinaan persekitaran

Penyederhanaan utama Keburukan ialah idea a pembinaan persekitaran. Sebuah pembinaan
persekitaran ialah sebuah objek dicirikan oleh satu set pasangan kunci/nilai dan satu set kaedah.
Untuk memberitahu Cons cara membina sesuatu, anda menggunakan kaedah yang sesuai melalui an
persekitaran pembinaan yang sesuai. Pertimbangkan contoh berikut:

$env = keburukan baharu(
CC => 'gcc',
LIBS => 'libworld.a'
);

Program $env 'hello', 'hello.c';

Dalam kes ini, daripada menggunakan persekitaran pembinaan lalai, seperti yang kita ada
menggantikan nilai `CC' supaya GNU C Compiler setara digunakan, sebaliknya. Sejak
versi ini helo, Dunia! memerlukan perpustakaan, libworld.a, kami telah menyatakan bahawa mana-mana
program yang dipautkan dalam persekitaran ini harus dikaitkan dengan perpustakaan itu. Jika perpustakaan
sudah wujud, baik dan baik, tetapi jika tidak, maka kita juga perlu memasukkan pernyataan:

Perpustakaan $env 'libworld', 'world.c';

Sekarang jika anda menaip `cons hello', perpustakaan akan dibina sebelum program dipautkan, dan,
sudah tentu, `gcc' akan digunakan untuk menyusun kedua-dua modul:

% kontra hello
gcc -c hello.c -o hello.o
gcc -c world.c -o world.o
ar r libworld.a world.o
ar: mencipta libworld.a
ranlib libworld.a
gcc -o hello hello.o libworld.a

automatik and melengkapkan pergantungan analisis

Dengan Cons, kebergantungan dikendalikan secara automatik. Meneruskan contoh sebelumnya, perhatikan
bahawa apabila kita mengubah suai dunia.c, dunia.o disusun semula, libworld.a dicipta semula, dan hello
dipaut semula:

% vi dunia.c
[EDIT]
% kontra hello
gcc -c world.c -o world.o
ar r libworld.a world.o
ar: mencipta libworld.a
ranlib libworld.a
gcc -o hello hello.o libworld.a

Ini adalah contoh yang agak mudah: Keburukan ``tahu'' dunia.o bergantung kepada dunia.c, Kerana
kebergantungan ditetapkan secara eksplisit oleh kaedah `Perpustakaan'. Ia juga tahu itu libworld.a
bergantung kepada dunia.o dan bahawa hello bergantung kepada libworld.a, semuanya atas sebab yang sama.

Sekarang ternyata begitu hello.c juga termasuk fail definisi antara muka, dunia.h:

% dunia emacs.h
[EDIT]
% kontra hello
gcc -c hello.c -o hello.o
gcc -o hello hello.o libworld.a

Bagaimana Cons tahu itu hello.c termasuk dunia.h, dan itu hello.o oleh itu mestilah
disusun semula? Buat masa ini, cukuplah untuk mengatakan bahawa apabila mempertimbangkan sama ada atau tidak hello.o sudah bangun-
setakat ini, Cons menggunakan pengimbas untuk kebergantungannya, hello.c. Pengimbas ini menyenaraikan
fail disertakan oleh hello.c untuk menghasilkan senarai kebergantungan selanjutnya, selain daripada itu
dibuat secara eksplisit oleh skrip Cons. Proses ini adalah rekursif: mana-mana fail yang disertakan oleh
fail yang disertakan juga akan diimbas.

Bukankah ini mahal? Jawapannya adalah--ia bergantung. Jika anda melakukan binaan penuh sistem yang besar,
masa pengimbasan adalah tidak penting. Jika anda membina semula sistem yang besar, maka Cons akan melakukannya
luangkan masa yang agak lama untuk memikirkannya sebelum ia memutuskan bahawa tiada apa yang perlu dilakukan
selesai (walaupun tidak semestinya lebih masa daripada membuat!). Berita baiknya ialah Cons membuatnya
sangat mudah untuk mensubset binaan anda secara bijak, apabila anda sedang mengusahakan perubahan setempat.

automatik global membina penjujukan

Kerana Cons melakukan analisis pergantungan penuh dan tepat, dan melakukan ini secara global, untuk
keseluruhan binaan, Cons dapat menggunakan maklumat ini untuk mengawal sepenuhnya penjujukan
daripada binaan itu. Urutan ini jelas dalam contoh di atas, dan bersamaan dengan apa
anda harapkan untuk dibuat, memandangkan satu set penuh tanggungan. Dengan Keburukan, ini meluas
remeh kepada binaan berbilang direktori yang lebih besar. Akibatnya, semua kerumitan yang terlibat
dalam memastikan bahawa binaan disusun dengan betul--termasuk hierarki berbilang laluan
binaan--dihapuskan. Kami akan membincangkan perkara ini dengan lebih lanjut dalam bahagian seterusnya.

Bangunan besar pokok--masih hanya as mudah


A hierarki of membina skrip

Binaan yang lebih besar, dalam Cons, disusun dengan mencipta hierarki membina skrip. Di bahagian atas
pokok adalah skrip yang dipanggil Bina. Selebihnya skrip, mengikut konvensyen, adalah setiap satu
dipanggil Wajib. Skrip ini disambungkan bersama, sangat mudah, oleh `Build',
Perintah `Eksport' dan `Import'.

. Membina arahan

Perintah `Build' mengambil senarai Wajib nama fail, dan mengaturkannya
termasuk dalam binaan. Sebagai contoh:

Bina qw(
pemandu / paparan / Conscript
pemandu/tetikus/Kerahan
parser/Conscript
utiliti/Conscript
);

Ini ialah hierarki dua peringkat mudah skrip binaan: semua anak syarikat Wajib fail
disebut di peringkat atasan Bina fail. Perhatikan bahawa tidak semua direktori dalam pokok
semestinya mempunyai membina skrip yang dikaitkan dengannya.

Ini juga boleh ditulis sebagai skrip pelbagai peringkat. Sebagai contoh, yang Bina fail mungkin
mengandungi arahan ini:

Bina qw(
parser/Conscript
pemandu/Konskrip
utiliti/Conscript
);

dan juga Wajib fail dalam pemandu direktori mungkin mengandungi ini:

Bina qw(
paparan / Conscript
tetikus/Conscript
);

Pengalaman telah menunjukkan bahawa model bekas lebih mudah untuk difahami, kerana
keseluruhan pokok pembinaan dibentangkan di hadapan anda, di peringkat atas. Skim hibrid ialah
juga mungkin. Komponen yang diselenggara secara berasingan yang perlu dimasukkan ke dalam a
membina pokok, sebagai contoh, mungkin menyambung ke dalam pokok binaan di satu tempat, tetapi menentukan sendiri
hierarki pembinaan.

Secara lalai, Cons tidak menukar direktori kerjanya kepada direktori yang mengandungi a
subsidiari Wajib fail ia termasuk. Tingkah laku ini boleh didayakan untuk binaan oleh
menentukan, di peringkat atasan Bina fail:

Conscript_chdir 1;

Apabila didayakan, Cons akan bertukar kepada anak syarikat Wajib fail yang mengandungi direktori
semasa membaca dalam fail itu, dan kemudian tukar kembali ke direktori peringkat atas sebaik sahaja fail itu
telah diproses.

Adalah dijangka bahawa tingkah laku ini akan menjadi lalai dalam beberapa versi Cons akan datang.
Untuk bersedia untuk peralihan ini, binaan yang menjangkakan Kontra kekal di bahagian atas binaan
manakala ia dibaca dalam anak syarikat Wajib fail harus melumpuhkan ciri ini secara eksplisit sebagai
ikut:

Conscript_chdir 0;

saudara mara, kerabat atasan, and mutlak fail nama

Anda mungkin perasan bahawa nama fail yang dinyatakan pada arahan Bina adalah relatif kepada
lokasi skrip ia digunakan. Ini biasanya benar untuk nama fail lain
hujah kepada arahan lain juga, walaupun kami mungkin juga menyebut di sini bahawa jika anda mulakan
nama fail dengan tanda cincang, ``#'', maka fail itu ditafsirkan berbanding bahagian atas-
direktori peringkat (di mana Bina fail berada). Dan, tidak menghairankan, jika anda memulakannya
dengan ``/'', maka ia dianggap sebagai nama laluan mutlak. Ini benar walaupun pada sistem
yang menggunakan garis miring belakang dan bukannya garis miring ke hadapan untuk menamakan laluan mutlak.

Menggunakan modul in membina skrip

Anda boleh menarik modul ke dalam setiap satu Wajib fail menggunakan `use' atau `require' Perl biasa
pernyataan:

menggunakan bahasa Inggeris;
memerlukan My::Module;

Setiap `penggunaan' atau `memerlukan' hanya memberi kesan kepada satu Wajib fail di mana ia muncul. Untuk menggunakan a
modul dalam pelbagai Wajib fail, anda mesti meletakkan pernyataan `use' atau `require' dalam setiap fail
yang memerlukan modul.

Skop of pembolehubah

Peringkat atasan Bina fail dan semua Wajib fail memulakan hidup dalam Perl yang sama dan berasingan
pakej. Kekurangan mengawal jadual simbol untuk pakej supaya, jadual simbol untuk
setiap skrip kosong, kecuali untuk Bina fail, yang mendapat beberapa baris arahan
hujah. Semua pembolehubah yang ditetapkan atau digunakan, oleh itu, ditetapkan oleh skrip
sendiri--bukan oleh beberapa skrip luaran.

Pembolehubah boleh secara eksplisit diimport oleh skrip daripada skrip induknya. Untuk mengimport a
berubah-ubah, ia mesti telah dieksport oleh ibu bapa dan dimulakan (jika tidak, ralat
akan berlaku).

. Eksport arahan

Perintah `Eksport' digunakan seperti dalam contoh berikut:

$env = keburukan baharu();
$INCLUDE = "#eksport/include";
$LIB = "#eksport/lib";
Eksport qw( env INCLUDE LIB );
Bina qw( util/Conscript );

Nilai pembolehubah mudah yang disebut dalam senarai `Eksport' akan hilang
oleh mana-mana arahan `Build' berikutnya. Perintah `Eksport' hanya akan mengeksport Perl skalar
pembolehubah, iaitu pembolehubah yang namanya bermula dengan `$'. Pembolehubah lain, objek, dsb.
boleh dieksport melalui rujukan--tetapi semua skrip akan merujuk kepada objek yang sama, dan ini
objek harus dianggap sebagai baca sahaja oleh skrip subsidiari dan oleh skrip asal
mengeksport skrip. Walau bagaimanapun, boleh diterima untuk menetapkan nilai baharu kepada skalar yang dieksport
pembolehubah--yang tidak akan mengubah pembolehubah asas yang dirujuk. Urutan ini, untuk
contoh, adalah OK:

$env = keburukan baharu();
Eksport qw( env INCLUDE LIB );
Bina qw( util/Conscript );
$env = keburukan baharu(CFLAGS => '-O');
Bina qw(lain/Conscript);

Tidak kira sama ada pembolehubah ditetapkan sebelum atau selepas arahan `Eksport'. The
yang penting ialah nilai pembolehubah pada masa arahan `Build' dilaksanakan.
Inilah yang menjadi tupai. Sebarang arahan `Eksport' berikutnya, dengan cara itu,
batalkan yang pertama: anda mesti menyebut semua pembolehubah yang anda ingin eksport pada setiap satu
Perintah `Eksport'.

. Mengimport arahan

Pembolehubah yang dieksport oleh arahan `Eksport' boleh diimport ke dalam skrip subsidiari oleh
Perintah `Import'. Skrip subsidiari sentiasa mengimport pembolehubah terus daripada
skrip unggul. Pertimbangkan contoh ini:

Import qw( env INCLUDE );

Ini hanya sah jika skrip induk mengeksport kedua-dua `$env' dan `$INCLUDE'. Ia juga mesti
telah memberikan setiap nilai pembolehubah ini. Adalah OK untuk skrip subsidiari sahaja
import subset pembolehubah yang dieksport (dalam contoh ini, `$LIB', yang telah dieksport oleh
contoh sebelumnya, tidak diimport).

Semua pembolehubah yang diimport dieksport semula secara automatik, jadi urutannya:

Import qw ( env TERMASUK );
Bina qw ( beneath-me/Conscript );

akan membekalkan kedua-dua `$env' dan `$INCLUDE' kepada fail subsidiari. Jika hanya `$env' menjadi
dieksport, maka yang berikut akan mencukupi:

Import qw ( env TERMASUK );
Eksport qw ( env );
Bina qw ( beneath-me/Conscript );

Tidak perlu dikatakan, pembolehubah boleh diubah suai secara tempatan sebelum menggunakan `Bina' pada
skrip anak syarikat.

Membina skrip penilaian bagi

Satu-satunya kekangan pada susunan skrip binaan ialah skrip unggul adalah
dinilai sebelum skrip rendah mereka. Peringkat atasan Bina fail, sebagai contoh, ialah
dinilai dahulu, diikuti dengan mana-mana skrip yang lebih rendah. Ini sahaja yang anda perlu tahu
tentang susunan penilaian, kerana susunan biasanya tidak relevan. Pertimbangkan perkara berikut
Perintah `Bina':

Bina qw(
pemandu / paparan / Conscript
pemandu/tetikus/Kerahan
parser/Conscript
utiliti/Conscript
);

Kami telah memilih untuk meletakkan nama skrip dalam susunan abjad, semata-mata kerana itulah yang paling banyak
mudah untuk tujuan penyelenggaraan. Menukar pesanan tidak akan memberi sebarang perbezaan kepada
membina.

A model Untuk berkongsi fail


Sesetengah mudah konvensyen

Dalam mana-mana sistem perisian yang kompleks, kaedah untuk berkongsi produk binaan perlu ada
ditubuhkan. Kami mencadangkan satu set konvensyen mudah yang tidak penting untuk dilaksanakan
Keburukan, tetapi sangat berkesan.

Peraturan asasnya ialah menghendaki semua membina produk yang perlu dikongsi antara
direktori dikongsi melalui direktori perantaraan. Kami biasanya memanggil ini
mengeksport, dan, dalam persekitaran C, menyediakan sub-direktori konvensional direktori ini,
seperti termasuk, lib, bin, Dll

Direktori ini ditakrifkan oleh peringkat atasan Bina fail. Yang mudah Bina fail untuk
a helo, Dunia! aplikasi, dianjurkan menggunakan berbilang direktori, mungkin kelihatan seperti ini:

# Bina fail untuk Hello, World!

# Di mana untuk meletakkan semua produk kongsi kami.
$EXPORT = '#eksport';

Eksport qw( CONS INCLUDE LIB BIN );

# Direktori standard untuk berkongsi produk.
$INCLUDE = "$EXPORT/include";
$LIB = "$EXPORT/lib";
$BIN = "$EXPORT/bin";

# Persekitaran pembinaan standard.
$CONS = kontra baharu (
CPPPATH => $INCLUDE, # Include path untuk C Compilations
LIBPATH => $LIB, # Laluan perpustakaan untuk memautkan atur cara
LIBS => '-lworld', # Senarai perpustakaan standard
);

Bina qw(
hello/Conscript
dunia/Kerahan tentera
);

. dunia direktori Wajib fail kelihatan seperti ini:

# Fail Conscript untuk dunia direktori
Import qw( CONS INCLUDE LIB );

# Pasang produk direktori ini
Pasang $CONS $LIB, 'libworld.a';
Pasang $CONS $INCLUDE, 'world.h';

# Produk dalaman
Perpustakaan $CONS 'libworld.a', 'world.c';

dan juga hello direktori Wajib fail kelihatan seperti ini:

# Fail Conscript untuk direktori hello
Import qw( CONS BIN );

# Produk yang dieksport
Pasang $CONS $BIN, 'hello';

# Produk dalaman
Program $CONS 'hello', 'hello.c';

Untuk membina a helo, Dunia! program dengan struktur direktori ini, pergi ke peringkat atas
direktori, dan gunakan `cons' dengan hujah yang sesuai. Dalam contoh berikut, kita
beritahu Cons untuk membina direktori mengeksport. Untuk membina direktori, Cons membina semua secara rekursif
produk yang diketahui dalam direktori itu (hanya jika mereka memerlukan pembinaan semula, sudah tentu). Jika mana-mana
produk tersebut bergantung pada produk lain dalam direktori lain, maka produk tersebut akan dibina,
juga.

% keburukan eksport
Pasang world/world.h sebagai eksport/include/world.h
cc -Iexport/include -c hello/hello.c -o hello/hello.o
cc -Ieksport/termasuk -c dunia/dunia.c -o dunia/dunia.o
ar r dunia/libworld.a world/world.o
ar: mencipta dunia/libworld.a
dunia ranlib/libworld.a
Pasang world/libworld.a sebagai export/lib/libworld.a
cc -o hello/hello hello/hello.o -Lexport/lib -lworld
Pasang hello/hello sebagai eksport/bin/hello

Bersih, boleh difahami, bebas lokasi skrip

Anda akan perhatikan bahawa kedua-duanya Wajib fail sangat bersih dan tepat sasaran. Mereka hanya
nyatakan produk direktori dan cara membina produk tersebut. Arahan binaan
adalah minimum: mereka menentukan persekitaran pembinaan yang hendak digunakan, nama produk,
dan nama input. Ambil perhatian juga bahawa skrip adalah bebas lokasi: jika anda
ingin menyusun semula pokok sumber anda, anda bebas berbuat demikian: anda hanya perlu menukar
Bina fail (dalam contoh ini), untuk menentukan lokasi baharu fail Wajib fail. The
penggunaan pokok eksport menjadikan matlamat ini mudah.

Perhatikan juga, bagaimana Cons menjaga butiran kecil untuk anda. Semua mengeksport direktori, untuk
contohnya, dibuat secara automatik. Dan fail yang dipasang benar-benar dipautkan keras ke dalam
direktori eksport masing-masing, untuk menjimatkan ruang dan masa. Perhatian terhadap perincian ini menjimatkan
kerja yang banyak, dan menjadikannya lebih mudah untuk menghasilkan skrip yang mudah dan boleh diselenggara.

Memisahkan sumber and membina pokok


Selalunya wajar untuk menyimpan sebarang fail yang diperoleh daripada binaan sepenuhnya berasingan daripada fail
fail sumber. Ini menjadikannya lebih mudah untuk menjejaki apa itu fail sumber, dan
juga menjadikannya lebih mudah untuk dikendalikan pelbagai binaan, terutamanya jika anda mahukan varian dibina
untuk wujud bersama.

Memisahkan membina and sumber direktori menggunakan yang pautan arahan

Cons menyediakan mekanisme mudah yang mengendalikan semua keperluan ini. `Pautan'
arahan digunakan seperti dalam contoh ini:

Pautan 'build' => 'src';

Direktori yang ditentukan adalah ``dipaut'' kepada direktori sumber yang ditentukan. Anggaplah
bahawa anda menyediakan direktori sumber, src, dengan sub-direktori dunia and hello di bawahnya,
seperti dalam contoh sebelum ini. Anda kemudiannya boleh menggantikan baris binaan asal
Berikut:

Bina qw(
bina/dunia/Conscript
bina/hello/Conscript
);

Perhatikan bahawa anda merawat Wajib fail seolah-olah ia wujud dalam direktori binaan. Sekarang jika
anda menaip arahan yang sama seperti sebelumnya, anda akan mendapat keputusan berikut:

% keburukan eksport
Pasang build/world/world.h sebagai eksport/include/world.h
cc -Iexport/include -c build/hello/hello.c -o build/hello/hello.o
cc -Iexport/include -c build/world/world.c -o build/world/world.o
ar r build/world/libworld.a build/world/world.o
ar: mencipta build/world/libworld.a
ranlib build/world/libworld.a
Pasang build/world/libworld.a sebagai export/lib/libworld.a
cc -o build/hello/hello build/hello/hello.o -Lexport/lib -lworld
Pasang build/hello/hello sebagai eksport/bin/hello

Sekali lagi, Cons telah menjaga butiran untuk anda. Khususnya, anda akan melihat bahawa semua
binaan dilakukan menggunakan fail sumber dan fail objek daripada direktori binaan. Untuk
contohnya, bina/dunia/dunia.o disusun daripada bina/dunia/dunia.c, dan
eksport/termasuk/dunia.h dipasang dari bina/dunia/dunia.h. Ini dicapai pada kebanyakan
sistem dengan cara mudah ``keras'' memautkan fail yang diperlukan daripada setiap sumber
direktori ke dalam direktori binaan yang sesuai.

Pautan dikekalkan dengan betul oleh Cons, tidak kira apa yang anda lakukan pada direktori sumber.
Jika anda mengubah suai fail sumber, editor anda boleh melakukan ini ``di tempat'' atau ia mungkin menamakannya semula
dahulu dan buat fail baharu. Dalam kes kedua, sebarang pautan keras akan hilang. Keburukan akan
mengesan keadaan ini apabila fail sumber diperlukan dan akan memautkannya semula
dengan tepat.

Anda juga akan perasan, dengan cara itu, itu tidak perubahan diperlukan kepada yang mendasari Wajib
fail. Dan kita boleh pergi lebih jauh, seperti yang akan kita lihat dalam bahagian seterusnya.

Pelbagai membina


helo, Dunia! Untuk baNaNa and peAcH OS

Binaan varian hanya memerlukan satu lagi sambungan mudah. Kita ambil sebagai contoh a
keperluan untuk membenarkan binaan untuk kedua-dua sistem pengendalian baNaNa dan peAcH. Dalam kes ini,
kami menggunakan sistem fail teragih, seperti NFS untuk mengakses sistem tertentu, dan
hanya satu atau satu lagi sistem yang perlu disusun untuk sebarang permohonan tertentu
`kontra'. Berikut ialah satu cara kami boleh menyediakan Bina fail untuk kami helo, Dunia!
permohonan:

# Bina fail untuk Hello, World!

die qq(OS mesti dinyatakan) melainkan $OS = $ARG{OS};
die qq(OS mestilah "pic" atau "pisang")
jika $OS tiada "pic" && $OS tiada "pisang";

# Di mana untuk meletakkan semua produk kongsi kami.
$EXPORT = "#export/$OS";

Eksport qw( CONS INCLUDE LIB BIN );

# Direktori standard untuk berkongsi produk.
$INCLUDE = "$EXPORT/include";
$LIB = "$EXPORT/lib";
$BIN = "$EXPORT/bin";

# Persekitaran pembinaan standard.
$CONS = kontra baharu (
CPPPATH => $INCLUDE, # Include path untuk C Compilations
LIBPATH => $LIB, # Laluan perpustakaan untuk memautkan atur cara
LIBS => '-lworld', # Senarai perpustakaan standard
);

# $BUILD ialah tempat kami akan memperoleh segala-galanya.
$BUILD = "#build/$OS";

# Beritahu keburukan di mana fail sumber untuk $BUILD berada.
Pautan $BUILD => 'src';

Membina (
"$BUILD/hello/Conscript",
"$BUILD/world/Conscript",
);

Sekarang jika kita log masuk ke sistem peAcH, kita boleh membina sistem kita helo, Dunia! permohonan untuk itu
platform:

% kontra eksport OS=pic
Pasang build/peach/world/world.h sebagai eksport/peach/include/world.h
cc -Iexport/peach/include -c build/peach/hello/hello.c -o build/peach/hello/hello.o
cc -Iexport/pic/include -c build/peach/world/world.c -o build/peach/world/world.o
ar r build/peach/world/libworld.a build/peach/world/world.o
ar: mencipta build/peach/world/libworld.a
ranlib build/peach/world/libworld.a
Pasang build/peach/world/libworld.a sebagai export/peach/lib/libworld.a
cc -o build/peach/hello/hello build/peach/hello/hello.o -Lexport/peach/lib -lworld
Pasang build/peach/hello/hello sebagai eksport/peach/bin/hello

Variasi on a tema

Variasi lain model ini mungkin. Sebagai contoh, anda mungkin memutuskan bahawa anda mahu
untuk memisahkan fail sertakan anda kepada fail bergantung pada platform dan fail bebas platform.
Dalam kes ini, anda perlu menentukan alternatif kepada `$INCLUDE' untuk bergantung pada platform
fail. Paling Wajib fail, menjana semata-mata bebas platform termasuk fail, akan
tidak perlu berubah.

Anda juga mungkin mahu dapat menyusun keseluruhan sistem anda dengan penyahpepijatan atau pemprofilan,
sebagai contoh, didayakan. Anda boleh melakukan ini dengan pilihan baris arahan yang sesuai, seperti
`DEBUG=on'. Ini kemudiannya akan diterjemahkan ke dalam platform khusus yang sesuai
keperluan untuk mendayakan penyahpepijatan (ini mungkin termasuk mematikan pengoptimuman, untuk
contoh). Anda boleh mengubah ruang nama secara pilihan untuk jenis sistem yang berbeza ini,
tetapi, seperti yang akan kita lihat dalam bahagian seterusnya, ia tidak sangat penting untuk melakukan ini, kerana Cons cantik
bijak membina semula perkara apabila anda menukar pilihan.

Tandatangan


MD5 kriptografi tandatangan

Apabila Cons mencipta fail terbitan, ia menyimpan a tanda tangan untuk fail itu. tandatangan
disimpan dalam fail berasingan, satu bagi setiap direktori. Selepas contoh sebelumnya disusun,
yang .menghantar fail dalam bina/pic/dunia direktori kelihatan seperti ini:

world.o:834179303 23844c0b102ecdc0b4548d1cd1cbd8c6
libworld.a:834179304 9bf6587fa06ec49d864811a105222c00

Nombor pertama ialah cap masa--untuk sistem UNIX, ini biasanya bilangan
saat sejak 1 Januari 1970. Nilai kedua ialah MD5 checksum. The Mesej Anda Digest
Algoritma ialah algoritma yang, diberi rentetan input, mengira kriptografi yang kuat
tandatangan untuk rentetan itu. Checksum MD5 yang disimpan dalam .menghantar fail adalah, sebenarnya, a
mencerna semua maklumat pergantungan untuk fail yang ditentukan. Jadi, sebagai contoh, untuk
dunia.o fail, ini termasuk sekurang-kurangnya dunia.c fail, dan juga sebarang fail pengepala yang Cons
tahu tentang itu disertakan, secara langsung atau tidak langsung oleh dunia.c. Bukan itu sahaja, tetapi
baris arahan sebenar yang digunakan untuk menjana dunia.o juga dimasukkan ke dalam pengiraan
tandatangan. Begitu juga, libworld.a mendapat tandatangan yang ``termasuk'' semua
tandatangan konstituennya (dan oleh itu, secara transitif, tandatangan perkhidmatan
juzuk), serta baris arahan yang mencipta fail.

Tandatangan fail bukan terbitan dikira, secara lalai, dengan mengambil arus
masa pengubahsuaian fail dan nama kemasukan fail (melainkan terdapat a
semasa .menghantar entri untuk fail itu, dalam hal ini tandatangan itu digunakan).

Perhatikan bahawa tidak ada keperluan untuk fail terbitan bergantung pada mana-mana tertentu Bina or
Wajib fail--jika perubahan pada fail ini menjejaskan fail yang dipersoalkan, maka ini akan menjadi
secara automatik ditunjukkan dalam tandatangannya, kerana bahagian baris arahan yang berkaitan adalah
disertakan dalam tandatangan. Perubahan yang tidak berkaitan tidak akan memberi kesan.

Apabila Cons mempertimbangkan sama ada untuk mendapatkan fail tertentu, maka, ia mula-mula mengira
tandatangan fail yang dijangkakan. Ia kemudian membandingkan masa pengubahsuaian terakhir fail dengan
masa yang dicatatkan dalam .menghantar kemasukan, jika ada. Jika masa ini sepadan, maka
tandatangan disimpan dalam .menghantar fail dianggap tepat. Jika fail sebelumnya
tandatangan tidak sepadan dengan tandatangan baharu yang dijangkakan, maka fail mesti diperoleh semula.

Perhatikan bahawa fail akan diperoleh semula apabila apa-apa tentang fail bergantung berubah. Dalam
khususnya, perhatikan itu mana-mana tukar kepada masa pengubahsuaian tanggungan (ke hadapan atau
ke belakang dalam masa) akan memaksa penyusunan semula fail terbitan.

Penggunaan tandatangan ini adalah kaedah yang sangat mudah, cekap dan berkesan
menambah baik--secara dramatik--kebolehulangan sistem.

Kami akan menunjukkan ini dengan contoh mudah:

# Mudah "Hello, Dunia!" Bina fail
$CFLAGS = '-g' jika $ARG{DEBUG} eq 'on';
$CONS = keburukan baharu(CFLAGS => $CFLAGS);
Program $CONS 'hello', 'hello.c';

Perhatikan bagaimana Cons menyusun semula pada masa yang sesuai:

% kontra hello
cc -c hello.c -o hello.o
cc -o hello hello.o
% kontra hello
kontra: "hello" adalah terkini.
% kontra DEBUG=pada hello
cc -g -c hello.c -o hello.o
cc -o hello hello.o
% kontra DEBUG=pada hello
kontra: "hello" adalah terkini.
% kontra hello
cc -c hello.c -o hello.o
cc -o hello hello.o

Kod Repositori


Banyak organisasi pembangunan perisian akan mempunyai satu atau lebih direktori repositori pusat
pokok yang mengandungi kod sumber semasa untuk satu atau lebih projek, serta terbitan
fail objek, perpustakaan dan boleh laku. Untuk mengurangkan penyusunan semula yang tidak perlu,
adalah berguna untuk menggunakan fail dari repositori untuk membina perisian pembangunan--dengan andaian, daripada
sudah tentu, tiada fail pergantungan yang lebih baharu wujud dalam pokok binaan tempatan.

Repositori

Cons menyediakan mekanisme untuk menentukan senarai repositori kod yang akan dicari,
mengikut urutan, untuk fail sumber dan fail terbitan yang tidak ditemui dalam pepohon direktori binaan tempatan.

Baris berikut dalam a Bina fail akan mengarahkan Cons untuk melihat dahulu di bawah
/usr/experiment/repository direktori dan kemudian di bawah /usr/product/repository direktori:

Repositori qw (
/usr/experiment/repository
/usr/product/repository
);

Direktori repositori yang ditentukan mungkin mengandungi fail sumber, fail terbitan (objek,
perpustakaan dan boleh laku), atau kedua-duanya. Jika tiada fail tempatan (sumber atau terbitan) di bawah
direktori di mana Cons dilaksanakan, kemudian salinan pertama fail bernama sama ditemui
di bawah direktori repositori akan digunakan untuk membina sebarang fail terbitan tempatan.

Cons mengekalkan satu senarai global direktori repositori. Keburukan akan menghapuskan
direktori semasa, dan mana-mana direktori yang tidak wujud, daripada senarai.

Mencari yang Bina fail in a Repositori

Kontra juga akan mencari Bina and Wajib fail dalam pokok atau pokok repositori.
Ini membawa kepada situasi ayam-dan-telur, walaupun: bagaimana anda melihat dalam pokok repositori
bagi Bina fail jika Bina fail memberitahu anda di mana repositori itu? Untuk mendapatkan
sekitar ini, repositori boleh ditentukan melalui pilihan `-R' pada baris arahan:

% kontra -R /usr/experiment/repository -R /usr/product/repository .

Mana-mana direktori repositori yang dinyatakan dalam Bina or Wajib fail akan ditambah
ke direktori repositori yang ditentukan oleh pilihan baris arahan `-R'.

Repositori sumber fail

Jika kod sumber (termasuk Wajib fail) untuk versi perpustakaan helo,
Dunia! Aplikasi C berada dalam repositori (tanpa fail terbitan), Cons akan menggunakan
fail sumber repositori untuk mencipta fail objek tempatan dan fail boleh laku:

% kontra -R /usr/src_only/repository hello
gcc -c /usr/src_only/repository/hello.c -o hello.o
gcc -c /usr/src_only/repository/world.c -o world.o
ar r libworld.a world.o
ar: mencipta libworld.a
ranlib libworld.a
gcc -o hello hello.o libworld.a

Mencipta fail sumber tempatan akan menyebabkan Cons membina semula fail terbitan yang sesuai atau
fail:

% dunia pico.c
[EDIT]
% kontra -R /usr/src_only/repository hello
gcc -c world.c -o world.o
ar r libworld.a world.o
ar: mencipta libworld.a
ranlib libworld.a
gcc -o hello hello.o libworld.a

Dan mengalih keluar fail sumber tempatan akan menyebabkan Cons kembali kepada membina yang diperolehi
fail dari sumber repositori:

% rm dunia.c
% kontra -R /usr/src_only/repository hello
gcc -c /usr/src_only/repository/world.c -o world.o
ar r libworld.a world.o
ar: mencipta libworld.a
ranlib libworld.a
gcc -o hello hello.o libworld.a

Repositori diperolehi fail

Jika pepohon repositori mengandungi fail terbitan (biasanya fail objek, perpustakaan atau
boleh laku), Cons akan melakukan pengiraan tandatangan biasa untuk memutuskan sama ada
fail repositori adalah terkini atau fail terbitan mesti dibina secara setempat. Ini bermakna,
untuk memastikan pengiraan tandatangan yang betul, pokok repositori juga mesti mengandungi
.menghantar fail yang dicipta oleh Cons semasa menjana fail terbitan.

Ini biasanya akan dicapai dengan membina perisian dalam repositori (atau,
sebagai alternatif, dalam direktori binaan, dan kemudian salin hasilnya ke repositori):

% cd /usr/all/repository
% kontra hello
gcc -c hello.c -o hello.o
gcc -c world.c -o world.o
ar r libworld.a world.o
ar: mencipta libworld.a
ranlib libworld.a
gcc -o hello hello.o libworld.a

(Ini selamat walaupun jika Bina fail menyenaraikan /usr/all/repository direktori dalam a
Perintah `Repository' kerana Cons akan mengalih keluar direktori semasa daripada repositori
senarai.)

Sekarang jika kita ingin membina salinan aplikasi dengan kita sendiri hello.c fail, kami hanya perlukan
untuk mencipta satu fail sumber yang diperlukan, dan gunakan pilihan `-R' untuk meminta Cons menggunakan yang lain
fail dari repositori:

% mkdir $HOME/build1
% cd $HOME/build1
% ed hello.c
[EDIT]
% kontra -R /usr/all/repository hello
gcc -c hello.c -o hello.o
gcc -o hello hello.o /usr/all/repository/libworld.a

Perhatikan bahawa Cons tidak peduli untuk mencipta semula tempatan libworld.a perpustakaan (atau susun semula
dunia.o modul), tetapi sebaliknya menggunakan versi yang telah disusun daripada repositori.

Kerana tandatangan MD5 yang Cons letakkan di dalam .menghantar fail mengandungi cap masa untuk
fail terbitan, cap masa tandatangan mesti sepadan dengan cap masa fail untuk tandatangan
dianggap sah.

Sesetengah sistem perisian boleh mengubah cap masa pada fail repositori (dengan menyalinnya,
cth), dalam hal ini Kontra akan, secara lalai, menganggap tandatangan repositori tidak sah
dan membina semula fail tanpa perlu. Tingkah laku ini boleh diubah dengan menyatakan:

Repository_Sig_Times_OK 0;

Ini memberitahu Kontra untuk mengabaikan cap masa apabila memutuskan sama ada tandatangan adalah sah. (Nota
bahawa mengelakkan pemeriksaan kewarasan ini bermakna mesti ada kawalan yang betul ke atas repositori
tree untuk memastikan bahawa fail yang diperoleh tidak boleh diubah suai tanpa mengemas kini fail .menghantar
tandatangan.)

Tempatan salinan of fail

Jika pokok repositori mengandungi hasil lengkap binaan, dan kami cuba membina daripada
repositori tanpa sebarang fail dalam pokok tempatan kami, sesuatu yang agak mengejutkan
berlaku:

% mkdir $HOME/build2
% cd $HOME/build2
% kontra -R /usr/all/repository hello
kontra: "hello" adalah terkini.

Mengapa Cons mengatakan bahawa hello program adalah terkini apabila tiada hello program di Malaysia
direktori binaan tempatan? Kerana repositori (bukan direktori tempatan) mengandungi
up-to-date hello program, dan Kontra dengan betul menentukan bahawa tiada apa yang perlu dilakukan untuk
bina semula salinan fail yang terkini ini.

Walau bagaimanapun, terdapat banyak masa yang sesuai untuk memastikan bahawa salinan tempatan a
fail sentiasa wujud. Skrip pembungkusan atau ujian, sebagai contoh, mungkin menganggap bahawa tertentu
fail yang dijana wujud secara tempatan. Daripada membuat skrip subsidiari ini menyedari tentang
direktori repositori, arahan `Tempatan' boleh ditambah pada a Bina or Wajib memfailkan untuk
tentukan bahawa fail atau fail tertentu mesti muncul dalam direktori binaan tempatan:

qw tempatan(
hello
);

Kemudian, jika kita menjalankan semula arahan yang sama, Cons akan membuat salinan tempatan program daripada
salinan repositori (memberitahu anda bahawa ia berbuat demikian):

% kontra -R /usr/all/repository hello
Salinan tempatan hello dari /usr/all/repository/hello
kontra: "hello" adalah terkini.

Perhatikan bahawa, kerana tindakan membuat salinan tempatan tidak dianggap sebagai "binaan" daripada
hello fail, Cons masih melaporkan bahawa ia adalah terkini.

Mencipta salinan tempatan adalah paling berguna untuk fail yang sedang dipasang ke dalam
direktori perantaraan (untuk berkongsi dengan direktori lain) melalui arahan `Pasang'.
Mengiringi arahan `Install' untuk fail dengan arahan `Local' pendamping adalah begitu
biasa bahawa Cons menyediakan arahan `Install_Local' sebagai cara yang mudah untuk melakukan kedua-duanya:

Install_Local $env, '#export', 'hello';

betul-betul bersamaan dengan:

Pasang $env '#export', 'hello';
'#eksport/hello' tempatan;

Kedua-dua arahan `Local' dan `Install_Local' mengemas kini setempat .menghantar fail dengan
tandatangan fail yang sesuai, supaya binaan masa hadapan dilakukan dengan betul.

Repositori pergantungan analisis

Disebabkan pengimbasan terbina dalamnya, Cons akan mencari pepohon repositori yang ditentukan untuk disertakan
.h fail. Melainkan pengkompil juga tahu tentang pokok repositori, walaupun, ia akan menjadi
tidak dapat mencari .h fail yang hanya wujud dalam repositori. Jika, sebagai contoh, hello.c
fail termasuk Hello H fail dalam direktori semasanya:

% kontra -R /usr/all/repository hello
gcc -c /usr/all/repository/hello.c -o hello.o
/usr/all/repository/hello.c:1: hello.h: Tiada fail atau direktori sedemikian

Menyelesaikan masalah ini memaksa beberapa keperluan mengikut cara persekitaran pembinaan
ditakrifkan dan ke cara arahan prapemproses C `#include' digunakan untuk memasukkan fail.

Untuk memaklumkan pengkompil tentang pokok repositori, Cons akan menambah `-I' yang sesuai
bendera kepada arahan kompilasi. Ini bermakna pembolehubah `CPPPATH' dalam
persekitaran bina mesti menyatakan secara eksplisit semua subdirektori yang hendak dicari
untuk fail yang disertakan, termasuk direktori semasa. Akibatnya, kita boleh membetulkan perkara di atas
contoh dengan mengubah penciptaan persekitaran dalam Bina fail seperti berikut:

$env = keburukan baharu(
CC => 'gcc',
CPPPATH => '.',
LIBS => 'libworld.a',
);

Disebabkan oleh takrifan pembolehubah `CPPPATH', ini menghasilkan, apabila kita melaksanakan semula
arahan:

% kontra -R /usr/all/repository hello
gcc -c -I. -I/usr/all/repository /usr/all/repository/hello.c -o hello.o
gcc -o hello hello.o /usr/all/repository/libworld.a

Susunan bendera `-I' mereplikasi, untuk prapemproses C, repositori yang sama-
laluan carian direktori yang Cons gunakan untuk analisis kebergantungannya sendiri. Jika ada
berbilang repositori dan berbilang direktori `CPPPATH', Cons akan menambahkan repositori
direktori ke permulaan setiap direktori `CPPPATH', dengan cepat mendarabkan nombor
daripada bendera `-I'. Sebagai contoh yang melampau, a Bina fail yang mengandungi:

Repositori qw(
/u1
/u2
);

$env = keburukan baharu(
CPPPATH => 'a:b:c',
);

Akan menghasilkan arahan kompilasi:

cc -Ia -I/u1/a -I/u2/a -Ib -I/u1/b -I/u2/b -Ic -I/u1/c -I/u2/c -c hello.c -o hello.o

Kerana Cons bergantung pada bendera `-I' pengkompil untuk menyampaikan susunannya
direktori repositori mesti dicari, pengendalian direktori repositori Kontra adalah
pada asasnya tidak serasi dengan menggunakan petikan berganda pada arahan `#include' dalam C anda
kod sumber:

#include "file.h" /* JANGAN GUNA PETIKAN BERGANDA SEPERTI INI */

Ini kerana kebanyakan prapemproses C, apabila berhadapan dengan arahan sedemikian, akan sentiasa terlebih dahulu
cari direktori yang mengandungi fail sumber. Ini melemahkan `-aku' yang rumit
pilihan yang Cons bina untuk menjadikan prapemproses mematuhi carian pilihannya
laluan.

Akibatnya, apabila menggunakan pokok repositori dalam Cons, sentiasa gunakan kurungan sudut untuk disertakan
fail:

#termasuk /* GUNAKAN KURUNG SUDUT SEBALIKNYA */

Senarai_Repositori

Cons menyediakan arahan `Repository_List' untuk mengembalikan senarai semua direktori repositori
dalam susunan carian semasa mereka. Ini boleh digunakan untuk nyahpepijat, atau untuk melakukan Perl yang lebih kompleks
barangan:

@list = Repository_List;
print join(' ', @list), "\n";

Repositori interaksi bersama lain Kekurangan ciri-ciri

Pengendalian kontra terhadap pokok repositori berinteraksi dengan betul dengan ciri Kontra lain--iaitu
untuk mengatakan, ia biasanya melakukan apa yang anda harapkan.

Paling ketara, pokok repositori berinteraksi dengan betul, dan agak kuat, dengan 'Pautan'
perintah. Pokok repositori mungkin mengandungi satu atau lebih subdirektori untuk binaan versi
ditubuhkan melalui `Pautan' ke subdirektori sumber. Cons akan mencari fail terbitan dalam
binaan subdirektori yang sesuai di bawah pepohon repositori.

Lalai sasaran


Sehingga kini, kami telah menunjukkan penggunaan Kontra dengan sasaran yang jelas untuk membina:

% kontra hello

Biasanya, Cons tidak membina apa-apa melainkan sasaran ditentukan, tetapi menyatakan '.'
(direktori semasa) akan membina segala-galanya:

% kontra # tidak membina apa-apa

% keburukan . # membina segala-galanya di bawah direktori peringkat atas

Menambah kaedah `Default' kepada mana-mana Bina or Wajib fail akan menambah yang ditentukan
sasaran ke senarai sasaran lalai. Cons akan membina lalai ini jika tiada
sasaran yang ditentukan pada baris arahan. Jadi menambah baris berikut ke peringkat atas
Bina fail akan meniru tingkah laku biasa Make yang membina segala-galanya secara lalai:

Lalai '.';

Yang berikut akan menambah hello and selamat tinggal arahan (dalam direktori yang sama dengan
Bina or Wajib fail) ke senarai lalai:

lalai qw(
hello
selamat tinggal
);

Kaedah `Default' boleh digunakan lebih daripada sekali untuk menambah sasaran pada senarai lalai.

Terpilih membina


Cons menyediakan dua kaedah untuk mengurangkan saiz binaan yang diberikan. Yang pertama adalah dengan menyatakan
sasaran pada baris arahan, dan yang kedua ialah kaedah untuk memangkas pokok binaan. Kami akan
pertimbangkan spesifikasi sasaran terlebih dahulu.

Terpilih mensasarkan

Seperti make, Cons membenarkan spesifikasi ``sasaran'' pada baris arahan. Sasaran kontra
mungkin sama ada fail atau direktori. Apabila direktori ditentukan, ini hanyalah ringkasan
tatatanda tangan untuk setiap produk terbitan--yang Cons tahu tentang--dalam yang dinyatakan
direktori dan di bawah. Sebagai contoh:

% keburukan bina/hello/hello.o

bermaksud membina hello.o dan segala yang hello.o mungkin perlu. Ini adalah dari sebelumnya
versi helo, Dunia! program di mana hello.o bergantung kepada
eksport/termasuk/dunia.h. Jika fail itu tidak terkini (kerana seseorang mengubah suai
src/world/world.h), maka ia akan dibina semula, walaupun ia berada dalam direktori jauh dari
bina/hello.

Dalam contoh ini:

% keburukan binaan

Semua yang ada di membina direktori dibina, jika perlu. Sekali lagi, ini boleh menyebabkan lebih banyak fail
untuk dibina. Khususnya, kedua-duanya eksport/termasuk/dunia.h and eksport/lib/libworld.a adalah
dikehendaki oleh bina/hello direktori, dan oleh itu ia akan dibina jika ia sudah lapuk.

Jika kita melakukannya, sebaliknya:

% keburukan eksport

maka hanya fail yang sepatutnya dipasang dalam direktori eksport akan dibina semula, jika
perlu, dan kemudian dipasang di sana. Ambil perhatian bahawa `cons build' mungkin membina fail yang `cons
eksport' tidak dibina, dan sebaliknya.

Tidak ``istimewa'' sasaran

Dengan Keburukan, sasaran ``istimewa'' gaya buatan tidak diperlukan. Analog paling mudah dengan Cons
adalah menggunakan khas mengeksport direktori, sebaliknya. Katakan, sebagai contoh, anda mempunyai a
keseluruhan siri ujian unit yang dikaitkan dengan kod anda. Ujian hidup dalam
direktori sumber berhampiran kod. Biasanya, bagaimanapun, anda tidak mahu membina ujian ini.
Satu penyelesaian ialah menyediakan semua arahan binaan untuk mencipta ujian, dan kemudian kepada
pasangkan ujian ke bahagian pokok yang berasingan. Jika kami memasang ujian di peringkat teratas
direktori dipanggil ujian, maka:

% ujian kontra

akan membina semua ujian.

% keburukan eksport

akan membina versi pengeluaran sistem (tetapi bukan ujian), dan:

% keburukan binaan

mungkin harus dielakkan (kerana ia akan menyusun ujian secara tidak perlu).

Jika anda ingin membina hanya satu ujian, maka anda boleh menamakan ujian secara eksplisit (dalam
sama ada ujian direktori atau membina direktori). Anda juga boleh mengagregatkan ujian
ke dalam hierarki yang mudah dalam direktori ujian. Hierarki ini tidak perlu
semestinya sepadan dengan hierarki sumber, dengan cara yang sama seperti hierarki sertakan
mungkin tidak sepadan dengan hierarki sumber (hierarki termasuk tidak mungkin lebih
daripada dua tahap dalam, untuk program C).

Jika anda ingin membina segala-galanya di dalam pokok (tertakluk kepada apa-apa pilihan yang anda
pilih), anda boleh menggunakan:

% keburukan .

Ini tidak begitu cekap, kerana ia akan berjalan secara berlebihan pada semua pokok,
termasuk pokok sumber. Pokok sumber, sudah tentu, mungkin mempunyai objek yang boleh dibina
ia--tiada apa yang menghalang anda daripada melakukan ini, walaupun anda biasanya membina dalam binaan yang berasingan
pokok.

Membina Pemangkasan


Sempena pemilihan sasaran, membina pemangkasan boleh digunakan untuk mengurangkan skop
membina. Dalam contoh peAcH dan baNaNa sebelumnya, kita telah pun melihat cara dipacu skrip
pemangkasan binaan boleh digunakan untuk menjadikan hanya separuh daripada binaan yang berpotensi tersedia untuk mana-mana
seruan `kontra'. Cons juga menyediakan, sebagai kemudahan, konvensyen baris arahan yang
membolehkan anda menentukan yang mana Wajib fail sebenarnya mendapat ``dibina''--iaitu, diperbadankan
ke dalam pokok binaan. Sebagai contoh:

% keburukan membina +dunia

Hujah `+' memperkenalkan ungkapan biasa Perl. Ini mesti, sudah tentu, dipetik di
tahap shell jika terdapat sebarang meta-karakter shell dalam ungkapan. The
ungkapan dipadankan dengan setiap satu Wajib fail yang telah disebut dalam `Build'
penyataan, dan hanya skrip dengan nama yang sepadan sebenarnya dimasukkan ke dalam
membina pokok. Berbilang hujah sedemikian dibenarkan, dalam hal ini perlawanan terhadap mana-mana daripadanya
adalah mencukupi untuk menyebabkan skrip dimasukkan.

Dalam contoh, di atas, yang hello program tidak akan dibina, kerana Cons akan mempunyai no
pengetahuan tentang skrip hello/Conscript. Yang libworld.a arkib akan dibina, bagaimanapun, jika
perlulah.

Terdapat beberapa kegunaan untuk pemangkasan binaan melalui baris arahan. Mungkin yang paling berguna
adalah keupayaan untuk membuat perubahan tempatan, dan kemudian, dengan pengetahuan yang mencukupi tentang
akibat daripada perubahan tersebut, hadkan saiz pokok binaan untuk mempercepatkan
masa membina semula. Penggunaan kedua untuk pemangkasan binaan adalah untuk mencegah penyusunan semula secara aktif
fail tertentu yang anda tahu akan menyusun semula disebabkan, sebagai contoh, fail pengepala yang diubah suai.
Anda mungkin tahu bahawa sama ada perubahan pada fail pengepala adalah tidak penting, atau bahawa
perubahan boleh diabaikan dengan selamat untuk kebanyakan pokok, untuk tujuan ujian.Dengan Keburukan, yang
pandangan adalah bahawa adalah pragmatik untuk mengakui jenis tingkah laku ini, dengan pemahaman bahawa
pada binaan penuh seterusnya semua yang perlu dibina semula akan menjadi. Tiada yang setara
kepada arahan ``make touch'', untuk menandakan fail sebagai kemas kini secara kekal. Jadi apa-apa risiko itu
yang ditanggung oleh pemangkasan binaan dikurangkan. Untuk kerja berkualiti keluaran, jelas sekali, kami mengesyorkan
yang anda tidak gunakan pemangkasan binaan (adalah OK untuk digunakan semasa penyepaduan, walau bagaimanapun,
untuk menyemak kompilasi, dsb. Cuma pastikan anda melakukan binaan tanpa kekangan sebelum melakukan
integrasi).

Sementara mengatasi


Cons menyediakan mekanisme yang sangat mudah untuk mengatasi aspek binaan. Intipatinya ialah
bahawa anda menulis fail override yang mengandungi satu atau lebih arahan `Override' dan anda
tentukan ini pada baris arahan, apabila anda menjalankan `cons':

% kontra -o berbanding eksport

akan membina mengeksport direktori, dengan semua fail terbitan tertakluk kepada penggantian yang ada
dalam lebih fail. Jika anda meninggalkan pilihan `-o', maka semua yang perlu untuk dialih keluar
semua penggantian akan dibina semula.

Menimpa persekitaran pembolehubah

Fail override boleh mengandungi dua jenis override. Yang pertama ialah persekitaran masuk
pembolehubah. Ini biasanya boleh diakses oleh Bina fail daripada cincang `%ENV'
pembolehubah. Ini boleh ditindih secara remeh dalam fail ganti dengan menetapkan
elemen `%ENV' yang sesuai (ini juga boleh ditindih dalam persekitaran pengguna,
sudah tentu).

. Override arahan

Jenis penggantian kedua dicapai dengan perintah `Override', yang kelihatan seperti
ini:

mengatasi , => , => , ...;

Ungkapan biasa regexp dipadankan dengan setiap fail terbitan yang merupakan calon
untuk binaan. Jika fail terbitan sepadan, maka pasangan pembolehubah/nilai digunakan untuk
mengatasi nilai dalam persekitaran pembinaan yang dikaitkan dengan fail terbitan.

Katakan kita mempunyai persekitaran pembinaan seperti ini:

$CONS = kontra baharu(
COPT => '',
CDBG => '-g',
CFLAGS => '%COPT %CDBG',
);

Kemudian jika kita mempunyai fail override lebih mengandungi arahan ini:

Gantikan '\.o$', COPT => '-O', CDBG => '';

maka sebarang seruan `cons' dengan `-o over' yang terhasil .o fail melalui persekitaran ini akan
menyebabkan mereka disusun dengan `-O 'dan tiada `-g'. Penggantian itu, sudah tentu, boleh jadi
terhad kepada satu direktori dengan pemilihan ungkapan biasa yang sesuai.

Inilah versi asal Hello, World! program, dibina dengan persekitaran ini.
Ambil perhatian bahawa Cons membina semula bahagian yang sesuai apabila penggantian digunakan atau dialih keluar:

% kontra hello
cc -g -c hello.c -o hello.o
cc -o hello hello.o
% kontra -o over hello
cc -O -c hello.c -o hello.o
cc -o hello hello.o
% kontra -o over hello
kontra: "hello" adalah terkini.
% kontra hello
cc -g -c hello.c -o hello.o
cc -o hello hello.o

Adalah penting bahawa arahan `Override' hanya digunakan untuk sementara, semasa dalam perjalanan
penggantian perlu untuk pembangunan kerana penggantian bukan platform bebas dan
kerana mereka terlalu bergantung pada pengetahuan intim tentang cara kerja skrip. Untuk
penggunaan sementara, bagaimanapun, ia adalah apa yang anda mahukan.

Ambil perhatian bahawa ia masih berguna untuk menyediakan, katakan, keupayaan untuk mencipta yang dioptimumkan sepenuhnya
versi sistem untuk kegunaan pengeluaran--daripada Bina and Wajib fail. dengan cara ini
anda boleh menyesuaikan sistem yang dioptimumkan kepada platform. Di mana pertukaran pengoptimum perlu
dibuat (fail tertentu mungkin tidak disusun dengan pengoptimuman penuh, contohnya), kemudian
ini boleh direkodkan untuk anak cucu (dan kebolehulangan) secara langsung dalam skrip.

lebih on pembinaan persekitaran


Lalai pembinaan pembolehubah

Kami telah menyebut, dan menggunakan, konsep a pembinaan persekitaran, berkali-kali dalam
muka surat sebelumnya. Kini tiba masanya untuk membuat ini sedikit lebih konkrit. Dengan yang berikut
penyataan:

$env = keburukan baharu();

rujukan kepada persekitaran pembinaan lalai baharu dicipta. Ini mengandungi nombor
pembolehubah pembinaan dan beberapa kaedah. Pada penulisan sekarang, senarai lalai bagi
pembolehubah pembinaan ditakrifkan seperti berikut:

CC => 'cc',
CFLAGS => '',
CCCOM => '%CC %CFLAGS %_IFLAGS -c %< -o %>',
INCDIRPREFIX => '-Saya',
CXX => '%CC',
CXXFLAGS => '%CFLAGS',
CXXCOM => '%CXX %CXXFLAGS %_IFLAGS -c %< -o %>',
LINK => '%CXX',
LINKCOM => '%LINK %LDFLAGS -o %> %< %_LDIRS %LIBS',
LINKMODULECOM => '%LD -r -o %> %<',
LIBDIRPREFIX => '-L',
AR => 'ar',
ARFLAGS => 'r',
ARCOM => "%AR %ARFLAGS %> %<\n%RANLIB %>",
RANLIB => 'ranlib',
AS => 'sebagai',
ASFLAGS => '',
ASCOM => '%AS %ASFLAGS %< -o %>',
LD => 'ld',
LDFLAGS => '',
PREFLIB => 'lib',
SUFLIB => '.a',
SUFLIBS => '.so:.a',
SUFOBJ => '.o',
ENV => { 'PATH' => '/ bin:/ usr / bin'},

Pada sistem Win32 (Windows NT), pembolehubah pembinaan berikut ditindih dalam
lalai:

CC => 'cl',
CFLAGS => '/nologo',
CCCOM => '%CC %CFLAGS %_IFLAGS /c %< /Fo%>',
CXXCOM => '%CXX %CXXFLAGS %_IFLAGS /c %< /Fo%>',
INCDIRPREFIX => '/I',
LINK => 'pautan',
LINKCOM => '%LINK %LDFLAGS /out:%> %< %_LDIRS %LIBS',
LINKMODULECOM => '%LD /r /o %> %<',
LIBDIRPREFIX => '/LIBPATH:',
AR => 'lib',
ARFLAGS => '/nologo ',
ARCOM => "%AR %ARFLAGS /out:%> %<",
RANLIB => '',
LD => 'pautan',
LDFLAGS => '/nologo ',
PREFLIB => '',
SUFEXE => '.exe',
SUFLIB => '.lib',
SUFLIBS => '.dll:.lib',
SUFOBJ => '.obj',

Pembolehubah ini digunakan oleh pelbagai kaedah yang berkaitan dengan persekitaran, dalam
khususnya mana-mana kaedah yang akhirnya menggunakan arahan luaran akan menggantikannya
pembolehubah ke dalam perintah akhir, mengikut kesesuaian. Sebagai contoh, kaedah `Objek' mengambil
beberapa fail sumber dan mengatur untuk memperoleh, jika perlu, objek yang sepadan
fail. Sebagai contoh:

Objek $env 'foo.c', 'bar.c';

Ini akan mengatur untuk menghasilkan, jika perlu, foo.o and bar.o. Perintah yang digunakan adalah mudah
`%CCCOM', yang berkembang melalui penggantian, kepada arahan luaran yang sesuai yang diperlukan
untuk membina setiap objek. Kami akan meneroka peraturan penggantian dengan lebih lanjut di bawah `Perintah'
kaedah, di bawah.

Pembolehubah pembinaan juga digunakan untuk tujuan lain. Contohnya, `CPPPATH' ialah
digunakan untuk menentukan laluan dipisahkan bertindih bagi direktori sertakan. Ini bertujuan untuk menjadi
dihantar ke prapemproses C dan juga digunakan oleh jentera pengimbasan fail C untuk
tentukan kebergantungan yang terlibat dalam Kompilasi C. Pembolehubah bermula dengan
garis bawah, dicipta dengan pelbagai kaedah, dan biasanya harus dianggap ``dalaman''
pembolehubah. Sebagai contoh, apabila kaedah dipanggil yang memerlukan penciptaan objek
daripada sumber C, pembolehubah `_IFLAGS' dicipta: ini sepadan dengan suis `-I'
diperlukan oleh pengkompil C untuk mewakili direktori yang ditentukan oleh `CPPPATH'.

Ambil perhatian bahawa, untuk mana-mana persekitaran tertentu, nilai pembolehubah ditetapkan sekali, dan kemudian
jangan sekali-kali menetapkan semula (untuk menukar pembolehubah, anda mesti mencipta persekitaran baharu. Kaedah disediakan
untuk menyalin persekitaran sedia ada untuk tujuan ini). Beberapa pembolehubah dalaman, seperti
`_IFLAGS' dicipta atas permintaan, tetapi setelah ditetapkan, ia tetap kekal seumur hidup
persekitaran.

Pembolehubah `CFLAGS', `LDFLAGS' dan `ARFLAGS' semuanya membekalkan tempat untuk menghantar pilihan kepada
pengkompil, pemuat, dan pengarkib, masing-masing. Kurang jelas, `INCDIRPREFIX'
pembolehubah menentukan rentetan pilihan untuk dilampirkan pada permulaan setiap termasuk
direktori supaya pengkompil tahu di mana hendak dicari .h fail. Begitu juga dengan
Pembolehubah `LIBDIRPREFIX' menentukan rentetan pilihan untuk dilampirkan pada permulaan
setiap direktori yang harus dicari oleh pemaut untuk perpustakaan.

Satu lagi pembolehubah, `ENV', digunakan untuk menentukan persekitaran sistem semasa pelaksanaan
daripada arahan luaran. Secara lalai, satu-satunya pembolehubah persekitaran yang ditetapkan ialah `PATH',
yang merupakan laluan pelaksanaan untuk arahan UNIX. Untuk kebolehulangan sepenuhnya, anda harus
benar-benar mengatur untuk menetapkan laluan pelaksanaan anda sendiri, di peringkat teratas anda Bina fail (atau
mungkin dengan mengimport pakej pembinaan yang sesuai dengan arahan `use' Perl). The
pembolehubah lalai bertujuan untuk membawa anda keluar dari tanah.

Interpolasi pembinaan pembolehubah

Pembolehubah persekitaran pembinaan boleh diinterpolasi dalam nama fail sumber dan sasaran
dengan memberi awalan nama pembolehubah binaan dengan `%'.

$env = keburukan baharu(
DESTDIR => 'program',
SRCDIR => 'src',
);
Program $env '%DESTDIR/hello', '%SRCDIR/hello.c';

Peluasan pembolehubah pembinaan adalah rekursif--iaitu, fail nama(s) akan di-
dikembangkan sehingga tiada lagi penggantian boleh dibuat. Jika pembolehubah pembinaan tidak
ditakrifkan dalam persekitaran, maka rentetan nol akan digantikan.

Lalai pembinaan kaedah


Senarai kaedah pembinaan lalai termasuk yang berikut:

. `baru' pembina

Kaedah `baru' ialah pembina objek Perl. Iaitu, ia tidak dipanggil melalui rujukan
kepada persekitaran pembinaan sedia ada rujukan, tetapi, secara statik, menggunakan nama
daripada Perl pakej di mana pembina ditakrifkan. Kaedah ini digunakan seperti ini:

$env = keburukan baharu( );

Persekitaran yang anda dapat kembali diberkati ke dalam pakej `keburukan', yang bermaksud bahawa ia akan
telah mengaitkannya dengan kaedah lalai yang diterangkan di bawah. Pembinaan individu
pembolehubah boleh diganti dengan memberikan pasangan nama/nilai dalam senarai ganti. Perhatikan bahawa
untuk mengatasi sebarang pembolehubah persekitaran arahan (iaitu apa-apa di bawah `ENV'), anda perlu melakukannya
mengatasi kesemuanya. Anda boleh mengatasi kesukaran ini dengan menggunakan kaedah `copy' pada
persekitaran pembinaan sedia ada.

. `klon' kaedah

Kaedah `klon' mencipta klon persekitaran pembinaan sedia ada, dan boleh
dipanggil seperti dalam contoh berikut:

$env2 = $env1->klon( );

Anda boleh memberikan penggantian dengan cara biasa untuk mencipta persekitaran yang berbeza daripada
asal. Jika anda hanya mahukan nama baharu untuk persekitaran yang sama (yang mungkin berguna apabila
mengeksport persekitaran ke komponen sedia ada), anda hanya boleh menggunakan tugasan mudah.

. `salinan' kaedah

Kaedah `copy' mengekstrak pembolehubah pembinaan yang ditakrifkan secara luaran daripada an
persekitaran dan mengembalikannya sebagai senarai pasangan nama/nilai. Override juga boleh
dengan syarat, dalam hal ini, nilai yang diganti akan dikembalikan, mengikut kesesuaian. The
senarai yang dikembalikan boleh diberikan kepada cincang, seperti yang ditunjukkan dalam prototaip, di bawah, tetapi ia juga boleh
dimanipulasi dengan cara lain:

%env = $env1->copy( );

Nilai `ENV', yang merupakan cincangan sendiri, juga disalin ke cincang baharu, jadi ini mungkin
berubah tanpa rasa takut menjejaskan persekitaran asal. Jadi, sebagai contoh, jika anda benar-benar
ingin mengatasi hanya pembolehubah `PATH' dalam persekitaran lalai, anda boleh melakukan
Berikut:

%cons = new cons()->copy();
$cons{ENV}{PATH} = " ";
$cons = new cons(%cons);

Ini akan meninggalkan apa-apa lagi yang mungkin berada dalam persekitaran pelaksanaan lalai
tidak terganggu.

. `Pasang' kaedah

Kaedah `Install' mengatur agar fail yang ditentukan dipasang dalam yang ditentukan
direktori. Pemasangan dioptimumkan: fail tidak disalin jika ia boleh dipautkan. Jika
ini bukan tingkah laku yang diingini, anda perlu menggunakan kaedah yang berbeza untuk memasang
fail. Ia dipanggil seperti berikut:

Pasang $env , ;

Ambil perhatian bahawa, walaupun fail yang akan dipasang mungkin dinamakan sewenang-wenangnya, hanya yang terakhir
komponen setiap nama digunakan untuk nama sasaran yang dipasang. Jadi, sebagai contoh, jika anda
mengatur untuk memasang foo/bar in asas, ini akan mewujudkan a bar fail dalam asas direktori (bukan
foo/bar).

. `InstallAs' kaedah

Kaedah `InstallAs' mengatur sumber yang ditentukan fail(s) untuk dipasang sebagai
sasaran yang ditetapkan fail(s). Berbilang fail hendaklah dinyatakan sebagai senarai fail. The
pemasangan dioptimumkan: fail tidak disalin jika ia boleh dipautkan. Jika ini bukan
tingkah laku yang diingini, anda perlu menggunakan kaedah yang berbeza untuk memasang fail. Ia adalah
dipanggil seperti berikut:

`InstallAs' berfungsi dalam dua cara:

Pemasangan fail tunggal:

InstallAs $env TgtFile, SrcFile;

Pemasangan berbilang fail:

InstallAs $env ['tgt1', 'tgt2'], ['src1', 'src2'];

Atau, walaupun sebagai:

@srcs = qw(src1 src2 src3);
@tgts = qw(tgt1 tgt2 tgt3);
InstallAs $env [@tgts], [@srcs];

Kedua-dua sasaran dan senarai sumber hendaklah mempunyai panjang yang sama.

. `Berharga' kaedah

Kaedah `Precious' meminta kontra untuk tidak memadam fail atau senarai fail yang ditentukan sebelum ini
membina mereka semula. Ia dipanggil sebagai:

berharga ;

Ini amat berguna untuk membenarkan kemas kini tambahan kepada perpustakaan atau nyahpepijat
fail maklumat yang dikemas kini dan bukannya dibina semula setiap kali. Cons akan tetap
padam fail apabila bendera `-r' ditentukan.

. `Perintah' kaedah

Kaedah `Command' ialah kaedah catchall yang boleh digunakan untuk mengatur sebarang luaran
arahan untuk dipanggil untuk mengemas kini sasaran. Untuk arahan ini, fail sasaran dan senarai
input disediakan. Di samping itu baris arahan pembinaan, atau baris, disediakan sebagai a
rentetan (rentetan ini mungkin mempunyai berbilang perintah yang tertanam di dalamnya, dipisahkan oleh new
baris). `Perintah' dipanggil seperti berikut:

Perintah $env , , ;

Sasaran dibuat bergantung pada senarai fail input yang ditentukan, dan input mesti
dibina dengan jayanya atau Keburukan tidak akan cuba membina sasaran.

Dalam arahan pembinaan, sebarang pembolehubah dari persekitaran pembinaan mungkin
diperkenalkan dengan memberi awalan nama pembolehubah binaan dengan `%'. Ini adalah rekursif:
arahan diperluaskan sehingga tiada lagi penggantian boleh dibuat. Jika pembinaan
pembolehubah tidak ditakrifkan dalam persekitaran, maka rentetan nol akan digantikan. A
`%%' dua kali ganda akan digantikan dengan `%' tunggal dalam arahan pembinaan.

Terdapat beberapa pembolehubah pseudo yang juga akan dikembangkan:

%> Nama fail sasaran (dalam arahan berbilang sasaran, ini sentiasa menjadi sasaran pertama
disebutkan).

%0 Sama seperti `%>'.

% 1, % 2, ..., % 9
Ini merujuk kepada fail input pertama hingga kesembilan, masing-masing.

%< Set penuh input. Jika mana-mana daripada ini telah digunakan di tempat lain dalam
baris arahan semasa (melalui `%1', `%2', dsb.), maka baris tersebut akan dipadamkan daripada
senarai disediakan oleh `%<'. Pertimbangkan arahan berikut yang terdapat dalam a Wajib fail
dalam ujian direktori:

Perintah $env 'tgt', qw(foo bar baz), qq(
gema %< -i %1 > %>
gema %< -i %2 >> %>
gema %< -i %3 >> %>
);

If tgt perlu dikemas kini, maka ini akan mengakibatkan pelaksanaan
arahan berikut, dengan mengandaikan bahawa tiada pemetaan semula telah ditetapkan untuk ujian
direktori:

ujian gema/ujian bar/baz -i test/foo > test/tgt
ujian gema/ujian foo/ujian baz -i/bar >> ujian/tgt
ujian gema/ujian foo/ujian bar -i/baz >> ujian/tgt

Mana-mana pembolehubah pseudo di atas boleh diikuti dengan segera oleh salah satu daripada yang berikut
akhiran untuk memilih sebahagian daripada nama laluan dikembangkan:

:a laluan mutlak ke nama fail
:b direktori ditambah nama fail yang dilucutkan daripada sebarang akhiran
:d direktori
:f nama fail
:s nama fail akhiran
:F nama fail yang dilucutkan daripada sebarang akhiran

Meneruskan contoh di atas, `%<:f' akan berkembang kepada `foo bar baz' dan `%':d> akan
berkembang kepada `ujian'.

Adalah mungkin untuk menulis semula sebahagian daripada arahan secara pemrograman dengan melampirkan sebahagian daripadanya
antara `%[' dan `%]'. Ini akan memanggil pembolehubah binaan yang dinamakan sebagai perkataan pertama
disertakan dalam kurungan sebagai rujukan kod Perl; keputusan panggilan ini akan digunakan
untuk menggantikan kandungan kurungan dalam baris arahan. Sebagai contoh, diberikan an
fail input sedia ada bernama tgt.in:

@kata kunci = qw(foo bar baz);
$env = kontra baharu(X_COMMA => sub { join(",", @_) });
Perintah $env 'tgt', 'tgt.in', qq(
echo '# Kata kunci: %[X_COMMA @kata kunci %]' > %>
kucing %< >> %>
);

Ini akan melaksanakan:

echo '# Kata kunci: foo,bar,baz' > tgt
kucing tgt.in >> tgt

Selepas penggantian berlaku, rentetan ruang putih ditukar menjadi kosong tunggal, dan
ruang putih mendahului dan mengekori dihapuskan. Oleh itu tidak mungkin untuk memperkenalkan
ruang putih panjang berubah dalam rentetan dihantar ke dalam perintah, tanpa menggunakan beberapa
macam shell quoting.

Jika rentetan arahan berbilang baris disediakan, arahan tersebut dilaksanakan secara berurutan. Jika ada
daripada arahan gagal, maka tiada satu pun daripada yang lain dilaksanakan, dan sasaran tidak ditanda sebagai
dikemas kini, iaitu tandatangan baharu tidak disimpan untuk sasaran.

Biasanya, jika semua arahan berjaya, dan mengembalikan status sifar (atau apa sahaja platform-
petunjuk khusus kejayaan diperlukan), kemudian tandatangan baru disimpan untuk
sasaran. Jika arahan tersilap melaporkan kejayaan walaupun selepas kegagalan, maka Cons akan
menganggap bahawa fail sasaran yang dicipta oleh arahan itu adalah tepat dan terkini.

Perkataan pertama bagi setiap rentetan arahan, selepas pengembangan, diandaikan sebagai boleh laku
arahan mencari pembolehubah persekitaran `PATH' (yang, seterusnya, ditentukan oleh
pembolehubah pembinaan `ENV'). Jika arahan ini ditemui pada laluan, maka sasaran akan
bergantung padanya: arahan itu akan dibina secara automatik, seperti yang diperlukan. ia adalah
mungkin untuk menulis arahan berbilang bahagian pada beberapa cangkerang, dipisahkan oleh koma bertitik. Hanya yang
perkataan perintah pertama akan bergantung, bagaimanapun, jadi jika anda menulis rentetan arahan anda
dengan cara ini, anda mesti sama ada secara eksplisit menyediakan kebergantungan (dengan kaedah `Bergantung'), atau
pastikan bahawa arahan yang anda gunakan adalah arahan sistem yang dijangkakan
tersedia. Jika ia tidak tersedia, sudah tentu anda akan mendapat ralat.

Jika mana-mana arahan (walaupun satu dalam perintah berbilang baris) bermula dengan `[perl]', bakinya
baris arahan itu akan dinilai oleh Perl yang sedang berjalan dan bukannya dicabang oleh
cangkerang. Jika ralat berlaku dalam menghuraikan Perl atau jika ungkapan Perl mengembalikan 0 atau
undef, arahan itu akan dianggap gagal. Sebagai contoh, berikut adalah mudah
arahan yang mencipta fail `foo' terus daripada Perl:

$env = keburukan baharu();
Perintah $env 'foo',
qq([perl] buka(FOO,'>foo');cetak FOO "hi\\n"; tutup(FOO); 1);

Ambil perhatian bahawa apabila arahan itu dilaksanakan, anda berada dalam pakej yang sama seperti semasa Bina
or Wajib fail telah dibaca, jadi anda boleh memanggil fungsi Perl yang anda tentukan dalam perkara yang sama
Bina or Wajib fail di mana `Perintah' muncul:

$env = keburukan baharu();
sub create_file {
my $file = shift;
open(FILE, ">$file");
cetak FAIL "hi\n";
tutup(FAIL);
1 kembali;
}
Perintah $env 'foo', "[perl] &create_file('%>')";

Rentetan Perl akan digunakan untuk menjana tandatangan untuk fail terbitan, jadi jika anda
tukar rentetan, fail akan dibina semula. Kandungan mana-mana subrutin yang anda panggil,
bagaimanapun, bukan sebahagian daripada tandatangan, jadi jika anda mengubah suai subrutin yang dipanggil seperti
`create_file' di atas, sasaran akan tidak dibina semula. pengguna kaveat.

Cons biasanya mencetak arahan sebelum melaksanakannya. Tingkah laku ini ditindas jika
aksara pertama arahan ialah `@'. Ambil perhatian bahawa anda mungkin perlu mengasingkan `@' daripada
nama arahan atau melarikannya untuk menghalang `@cmd' daripada kelihatan seperti tatasusunan kepada petikan Perl
operator yang melakukan interpolasi:

# Baris arahan pertama tidak betul,
# kerana "@cp" kelihatan seperti tatasusunan
# kepada fungsi Perl qq//.
# Gunakan borang kedua sebagai ganti.
Perintah $env 'foo', 'foo.in', qq(
@cp %< tempfile
@ cp tempfile %>
);

Jika terdapat aksara meta shell di mana-mana dalam baris arahan yang dikembangkan, seperti `<',
`>', petikan atau koma bertitik, maka arahan itu sebenarnya akan dilaksanakan dengan menggunakan
cangkerang. Ini bermakna bahawa perintah seperti:

cd foo

sahaja biasanya akan gagal, kerana tiada arahan `cd' pada laluan. Tetapi perintah
tali:

cd $<:d; tar cf $>:f $<:f

apabila dikembangkan masih akan mengandungi koma bertindih aksara meta shell, dan shell akan menjadi
dipanggil untuk mentafsir perintah itu. Oleh kerana `cd' ditafsirkan oleh sub-kulit ini, arahan
akan melaksanakan seperti yang diharapkan.

Untuk menentukan arahan dengan berbilang sasaran, anda boleh menentukan rujukan kepada senarai
sasaran. Dalam Perl, rujukan senarai boleh dibuat dengan melampirkan senarai dalam kurungan segi empat sama.
Oleh itu perintah berikut:

Perintah $env ['foo.h', 'foo.c'], 'foo.template', q(
gen % 1
);

boleh digunakan dalam kes di mana arahan `gen' mencipta dua fail, kedua-duanya foo.h and foo.c.

. `Objek' kaedah

Kaedah `Objects' mengatur untuk mencipta fail objek yang sepadan dengan yang ditentukan
fail sumber. Ia dipanggil seperti yang ditunjukkan di bawah:

@files = Objek $env ;

Di bawah Unix, fail sumber berakhir dengan .s and .c sedang disokong, dan akan disusun
ke dalam nama fail yang sama berakhir dengan .o. Secara lalai, semua fail dibuat dengan menggunakan
arahan luaran yang terhasil daripada mengembangkan pembolehubah pembinaan `CCCOM', dengan
`%<' dan `%>' masing-masing ditetapkan kepada fail sumber dan objek (lihat kaedah `Command'
untuk butiran pengembangan). Pembolehubah `CPPPATH' juga digunakan semasa mengimbas fail sumber
untuk tanggungan. Ini ialah senarai nama laluan yang dipisahkan bertindih, dan juga digunakan untuk mencipta
pembolehubah pembinaan `_IFLAGS,' yang akan mengandungi senarai yang sesuai bagi -`I'
pilihan untuk kompilasi. Mana-mana nama laluan relatif dalam `CPPPATH' ditafsirkan secara relatif
ke direktori di mana persekitaran pembinaan yang berkaitan telah dicipta (absolute
dan nama kerabat teratas juga boleh digunakan). Pembolehubah ini digunakan oleh `CCCOM'. Tingkah laku
arahan ini boleh diubah suai dengan menukar mana-mana pembolehubah yang diinterpolasi
ke dalam `CCCOM', seperti `CC', `CFLAGS', dan, secara tidak langsung, `CPPPATH'. Ia juga boleh
menggantikan nilai `CCCOM', itu sendiri. Sebagai kemudahan, fail ini mengembalikan senarai
nama fail objek.

. `Program' kaedah

Kaedah `Program' mengatur untuk memautkan program yang ditentukan dengan objek yang ditentukan
fail. Ia dipanggil dengan cara berikut:

Program $env , ;

Nama program akan mempunyai nilai pembolehubah pembinaan `SUFEXE' yang dilampirkan (oleh
lalai, `.exe' pada sistem Win32, tiada pada sistem Unix) jika akhiran belum ada
Sekarang.

Fail sumber boleh ditentukan sebagai ganti fail objek--kaedah `Objek' akan menjadi
dipanggil untuk mengatur penukaran semua fail ke dalam fail objek, dan oleh itu semua fail
pemerhatian tentang kaedah `Objek', di atas, juga digunakan untuk kaedah ini.

Pautan sebenar program akan dikendalikan oleh arahan luaran yang terhasil
daripada mengembangkan pembolehubah binaan `LINKCOM', dengan `%<' ditetapkan kepada fail objek kepada
dipautkan (dalam susunan yang dibentangkan), dan `%>' ditetapkan kepada sasaran (lihat kaedah `Command'
untuk butiran pengembangan). Pengguna boleh menetapkan pembolehubah tambahan dalam pembinaan
persekitaran, termasuk `LINK', untuk menentukan program yang hendak digunakan untuk memaut, `LIBPATH', a
senarai laluan carian perpustakaan yang dipisahkan dengan kolon, untuk digunakan dengan spesifikasi perpustakaan bagi
bentuk -llib, dan `LIBS', menyatakan senarai perpustakaan untuk dipautkan (dalam sama ada -llib
bentuk atau hanya sebagai nama laluan. Nama laluan relatif dalam kedua-dua `LIBPATH' dan `LIBS' ditafsirkan
berbanding dengan direktori di mana persekitaran pembinaan yang berkaitan dicipta
(nama mutlak dan kerabat teratas juga boleh digunakan). Cons disediakan secara automatik
kebergantungan pada mana-mana perpustakaan yang disebut dalam `LIBS': perpustakaan tersebut akan dibina sebelum ini
arahan itu dipautkan.

. `Perpustakaan' kaedah

Kaedah `Library' mengatur untuk mencipta perpustakaan yang ditentukan daripada objek yang ditentukan
fail. Ia dipanggil seperti berikut:

Perpustakaan $env , ;

Nama perpustakaan akan mempunyai nilai pembolehubah pembinaan `SUFLIB' yang dilampirkan (oleh
lalai, `.lib' pada sistem Win32, `.a' pada sistem Unix) jika akhiran belum
Sekarang.

Fail sumber boleh ditentukan sebagai ganti fail objek--kaedah `Objek' akan menjadi
dipanggil untuk mengatur penukaran semua fail ke dalam fail objek, dan oleh itu semua fail
pemerhatian tentang kaedah `Objek', di atas, juga digunakan untuk kaedah ini.

Penciptaan perpustakaan sebenar akan dikendalikan oleh arahan luaran yang terhasil
daripada mengembangkan pembolehubah pembinaan `ARCOM', dengan `%<' ditetapkan kepada ahli perpustakaan (dalam
susunan yang dibentangkan), dan `%>' kepada pustaka yang akan dibuat (lihat kaedah `Command' untuk
butiran pengembangan). Pengguna boleh menetapkan pembolehubah dalam persekitaran pembinaan yang akan
menjejaskan operasi arahan. Ini termasuk `AR', program arkib untuk digunakan,
`ARFLAGS', yang boleh digunakan untuk mengubah suai bendera yang diberikan kepada program yang ditentukan oleh `AR',
dan `RANLIB', nama program penjanaan indeks arkib, jika perlu (jika perlu
keperluan tidak memerlukan fungsi yang terakhir, maka `ARCOM' mesti ditakrifkan semula kepada tidak
rujukan `RANLIB').

Kaedah `Library' membenarkan perpustakaan yang sama dinyatakan dalam pelbagai kaedah
seruan. Semua objek penyumbang daripada semua seruan (yang mungkin daripada
direktori yang berbeza) digabungkan dan dijana oleh satu arahan arkib. Nota,
walau bagaimanapun, jika anda memangkas binaan supaya hanya sebahagian daripada perpustakaan ditentukan, maka hanya
bahagian perpustakaan itu akan dijana (selebihnya akan hilang!).

. `Modul' kaedah

Kaedah `Modul' ialah gabungan kaedah `Program' dan `Command'. Daripada
menjana program boleh laku secara langsung, arahan ini membolehkan anda menentukan sendiri
arahan untuk benar-benar menjana modul. Kaedah ini digunakan seperti berikut:

Modul $env , , ;

Perintah ini berguna dalam keadaan di mana anda ingin mencipta, contohnya, secara dinamik
modul dimuatkan, atau perpustakaan kod yang dipautkan secara statik.

. `Bergantung' kaedah

Kaedah `Depends' membolehkan anda menentukan kebergantungan tambahan untuk sasaran. Ia adalah
dipanggil seperti berikut:

Bergantung $env , ;

Ini mungkin berguna sekali-sekala, terutamanya dalam kes di mana tiada pengimbas wujud (atau is
boleh ditulis) untuk jenis fail tertentu. Biasanya, kebergantungan dikira
secara automatik daripada gabungan kebergantungan eksplisit yang disediakan oleh kaedah
seruan atau dengan mengimbas fail sumber.

Satu set kebergantungan yang sama untuk berbilang sasaran boleh ditentukan menggunakan rujukan kepada
senarai sasaran. Dalam Perl, rujukan senarai boleh dibuat dengan melampirkan senarai dalam petak
kurungan. Oleh itu perintah berikut:

Bergantung $env ['foo', 'bar'], 'input_file_1', 'input_file_2';

menyatakan bahawa kedua-dua foo and bar fail bergantung pada fail input yang disenaraikan.

. `Abaikan' kaedah

Kaedah `Abaikan' membolehkan anda mengabaikan kebergantungan secara eksplisit yang disimpulkan oleh Cons padanya
milik sendiri. Ia dipanggil seperti berikut:

Abai ;

Ini boleh digunakan untuk mengelakkan penyusunan semula kerana perubahan dalam fail pengepala sistem atau
utiliti yang diketahui tidak menjejaskan sasaran yang dihasilkan.

Jika, sebagai contoh, program dibina dalam direktori yang dipasang NFS pada berbilang sistem yang
mempunyai salinan yang berbeza stdio.h, perbezaan akan menjejaskan tandatangan semua
sasaran yang diperolehi dibina daripada fail sumber yang `#termasuk '. Ini akan menyebabkan semua
sasaran tersebut untuk dibina semula apabila menukar sistem. Jika ini bukan tingkah laku yang diingini,
maka baris berikut akan mengalih keluar kebergantungan pada stdio.h fail:

Abaikan '^/usr/include/stdio\.h$';

Ambil perhatian bahawa hujah kepada kaedah `Abaikan' adalah ungkapan biasa, sangat istimewa
aksara mesti dilepaskan dan anda mungkin ingin melabuhkan permulaan atau akhir
ungkapan dengan aksara `^' atau `$'.

. `Garam' kaedah

Kaedah `Garam' menambah nilai tetap pada pengiraan tandatangan untuk setiap terbitan
fail. Ia dipanggil seperti berikut:

Garam $tali;

Menukar nilai Garam akan memaksa pembinaan semula lengkap setiap fail terbitan. Ini boleh jadi
digunakan untuk memaksa pembinaan semula dalam keadaan tertentu yang dikehendaki. Sebagai contoh,

Garam `uname -s`;

Akan memaksa pembinaan semula lengkap setiap fail terbitan apabila sistem pengendalian dihidupkan
yang binaan dilakukan (seperti yang dilaporkan oleh `uname -s') berubah.

. `UseCache' kaedah

Kaedah `UseCache' mengarahkan Cons untuk mengekalkan cache fail terbitan, untuk dikongsi
antara pokok binaan berasingan bagi projek yang sama.

UseCache("cache/ ") ⎪⎪ warn("direktori cache tidak dijumpai");

. `SourcePath' kaedah

Kaedah `SourcePath' mengembalikan nama laluan sumber sebenar bagi fail, bertentangan dengan
nama laluan dalam direktori binaan. Ia dipanggil seperti berikut:

$path = SourcePath ;

. `ConsPath' kaedah

Kaedah `ConsPath' mengembalikan benar jika laluan yang dibekalkan ialah fail terbitan dan mengembalikan
undef (false) sebaliknya. Ia dipanggil seperti berikut:

$result = ConsPath ;

. `SplitPath' kaedah

Kaedah `SplitPath' mencari berbilang nama laluan dalam rentetan yang dipisahkan oleh lalai
pemisah laluan untuk sistem pengendalian (':' pada sistem UNIX, ';' pada Windows NT), dan
mengembalikan nama yang layak sepenuhnya. Ia dipanggil seperti berikut:

@paths = SplitPath ;

Kaedah `SplitPath' akan menukar nama awalan '#' kepada binaan peringkat atas yang sesuai
nama (tanpa '#') dan akan menukar nama relatif kepada nama peringkat atasan.

. `DirPath' kaedah

Kaedah `DirPath' mengembalikan laluan binaan nama(s) direktori atau senarai direktori.
Ia dipanggil seperti berikut:

$cwd = DirPath ;

Penggunaan yang paling biasa untuk kaedah `DirPath' ialah:

$cwd = DirPath '.';

untuk mengambil laluan ke direktori semasa anak syarikat Wajib fail.

. `FilePath' kaedah

Kaedah `FilePath' mengembalikan laluan binaan nama(s) fail atau senarai fail. Ia adalah
dipanggil seperti berikut:

$file = FilePath ;

. `Bantuan' kaedah

Kaedah `Help' menentukan teks bantuan yang akan dipaparkan apabila pengguna memanggil `cons
-h'. Ini boleh digunakan untuk menyediakan dokumentasi sasaran, nilai, binaan tertentu
pilihan, dsb. untuk pokok binaan. Ia dipanggil seperti berikut:

Tolong ;

Kaedah `Bantuan' hanya boleh dipanggil sekali, dan biasanya harus dinyatakan di bahagian atas-
tahap Bina fail.

Memperluas Kekurangan


Menimpa pembinaan pembolehubah

Terdapat beberapa cara untuk melanjutkan Kontra, yang berbeza-beza dalam tahap kesukaran. Yang paling mudah
kaedah adalah untuk menentukan persekitaran pembinaan anda sendiri, berdasarkan persekitaran lalai,
tetapi diubah suai untuk mencerminkan keperluan khusus anda. Ini selalunya mencukupi untuk berasaskan C
aplikasi. Anda boleh menggunakan pembina `baru', dan kaedah `klon' dan `salin' untuk
mewujudkan persekitaran hibrid. Perubahan ini boleh telus sepenuhnya kepada asas
Wajib fail.

Menambah baru kaedah

Untuk perubahan yang lebih mencabar, anda mungkin ingin menambah kaedah baharu pada `keburukan'
pakej. Berikut ialah contoh sambungan yang sangat mudah, `InstallScript', yang memasang a
skrip tcl di lokasi yang diminta, tetapi mengedit skrip terlebih dahulu untuk mencerminkan platform-
laluan bergantung yang perlu dipasang dalam skrip:

# cons::InstallScript - Cipta versi shell bergantung pada platform
# skrip dengan menggantikan rentetan ``#!your-path-here'' dengan platform khusus
# laluan $BIN_DIR.

sub kontra::InstallScript {
my ($env, $dst, $src) = @_;
Perintah $env $dst, $src, qq(
sed s+your-path-here+$BIN_DIR+ %< > %>
chmod oug+x %>
);
}

Perhatikan bahawa kaedah ini ditakrifkan secara langsung dalam pakej `cons' (dengan memberi awalan nama
dengan `keburukan::'). Perubahan yang dibuat dengan cara ini akan dapat dilihat secara global kepada semua persekitaran,
dan boleh dipanggil seperti dalam contoh berikut:

InstallScript $env "$BIN/foo", "foo.tcl";

Untuk penambahbaikan kecil dari segi umum, pembolehubah `BINDIR' boleh dihantar sebagai
hujah atau diambil daripada persekitaran pembinaan--sebagai `%BINDIR'.

Menimpa kaedah

Daripada menambah kaedah pada ruang nama `cons', anda boleh menentukan pakej baharu
yang mewarisi kaedah sedia ada daripada pakej `cons' dan mengatasi atau menambah yang lain. ini
boleh dilakukan menggunakan mekanisme pewarisan Perl.

Contoh berikut mentakrifkan pakej baharu `cons::switch' yang mengatasi standard
kaedah `Perpustakaan'. Kaedah ganti membina modul perpustakaan terpaut, bukannya perpustakaan
arkib. Pembina baharu disediakan. Persekitaran yang dicipta dengan pembina ini akan
mempunyai kaedah perpustakaan baharu; orang lain tidak akan.

keburukan pakej::suis;
MULAKAN {@ISA = 'kontra'}

sub baru {
syif;
berkati kontra baru(@_);
}

sub Perpustakaan {
my($env) = shift;
my($lib) = shift;
my(@objs) = Objek $env @_;
Perintah $env $lib, @objs, q(
%LD -r %LDFLAGS %< -o %>
);
}

Fungsi ini boleh digunakan seperti dalam contoh berikut:

$env = kontra baharu::switch(@overrides);
...
Perpustakaan $env 'lib.o', 'foo.c', 'bar.c';

Menyerang Kekurangan


Perintah `cons' biasanya dipanggil dari akar pokok binaan. A Bina fail
mesti ada dalam direktori itu. Jika hujah `-f' digunakan, maka ganti Bina
fail boleh digunakan (dan, mungkin, akar ganti, kerana `cons' akan cd ke Bina
fail yang mengandungi direktori).

Jika `cons' dipanggil daripada anak akar pokok binaan dengan hujah `-t', ia
akan berjalan ke atas hierarki direktori mencari a Bina fail. (Nama ganti boleh
masih dinyatakan dengan `-f'.) Sasaran yang dibekalkan pada baris arahan akan diubah suai
menjadi relatif kepada yang ditemui Bina fail. Sebagai contoh, daripada direktori yang mengandungi
peringkat atasan Bina fail, seruan berikut:

% cd libfoo/subdir
% kontra -t sasaran

betul-betul bersamaan dengan:

% kontra libfoo/subdir/target

Jika terdapat sebarang sasaran `Lalai' yang dinyatakan dalam hierarki direktori Bina or
Wajib fail, hanya sasaran lalai pada atau di bawah direktori dari mana `cons -t'
telah dipanggil akan dibina.

Perintah itu dipanggil seperti berikut:

keburukan --

di mana hujah boleh menjadi mana-mana yang berikut, dalam sebarang susunan:

sasaran Bina sasaran yang ditetapkan. Jika sasaran ialah direktori, kemudian bina secara rekursif
segala-galanya dalam direktori itu.

+corak Hadkan Wajib fail dianggap hanya yang sepadan pola, Yang merupakan
ungkapan biasa Perl. Berbilang hujah `+' diterima.

nama=
Set nama untuk nilai val dalam cincang `ARG' diteruskan ke peringkat atas Bina fail.

`-cc' Tunjukkan arahan yang akan dilaksanakan, apabila mendapatkan semula daripada cache. Tidak
petunjuk bahawa fail telah diambil diberikan; ini berguna untuk
menjana log binaan yang boleh dibandingkan dengan log binaan sebenar.

`-cd' Lumpuhkan semua caching. Jangan ambil dari cache atau flush ke cache.

`-cr' Bina kebergantungan dalam susunan rawak. Ini berguna apabila membina berbilang
pokok serupa dengan caching didayakan.

`-cs' Segerakkan sasaran binaan sedia ada yang didapati dikemas kini dengan cache.
Ini berguna jika caching telah dilumpuhkan dengan -cc atau baru sahaja didayakan
dengan UseCache.

`-d' Dayakan penyahpepijatan kebergantungan.

`-f'
Gunakan fail yang ditentukan dan bukannya Bina (tetapi tukar dahulu kepada mengandungi
direktori daripada fail).

`-h' Tunjukkan mesej bantuan setempat kepada binaan semasa jika yang sedemikian ditakrifkan, dan keluar.

`-k' Teruskan berjalan sejauh mungkin selepas kesilapan.

`-o'
Baca fail ganti fail.

`-p' Tunjukkan produk pembinaan dalam pokok tertentu. Tiada binaan dicuba.

`-pa' Tunjukkan produk pembinaan dan tindakan yang berkaitan. Tiada binaan dicuba.

`-pw' Tunjukkan produk dan tempat ia ditakrifkan. Tiada binaan dicuba.

`-q' Jangan bertele-tele tentang Memasang dan Mengalih Keluar sasaran.

`-r' Alih keluar produk pembinaan yang dikaitkan dengan . Tiada binaan dicuba.

`-R'
Cari fail dalam repo. Pelbagai -R repo direktori dicari dalam
pesanan ditentukan.

`-t' Melintasi hierarki direktori mencari a Bina fail, jika tiada
dalam direktori semasa. Sasaran akan diubah suai untuk menjadi relatif kepada
Bina fail.

`-v' Tunjukkan versi `cons' dan teruskan pemprosesan.

`-V' Tunjukkan versi `cons' dan keluar.

`-wf'
Tulis semua nama fail yang dipertimbangkan fail.

`-x' Tunjukkan mesej bantuan yang serupa dengan yang ini, dan keluar.

dan membina-args boleh menjadi sebarang hujah yang ingin anda proses dalam Bina fail.
Ambil perhatian bahawa perlu ada a -- mengasingkan hujah kepada kontra dan hujah yang anda
ingin memproses dalam Bina fail.

Pemprosesan daripada membina-args boleh dilakukan oleh mana-mana pakej standard seperti Getopt atau itu
varian, atau mana-mana pakej yang ditentukan pengguna. keburukan akan lulus dalam membina-args as @ARGV and
tidak akan cuba mentafsir apa-apa selepas --.

% kontra -R /usr/local/repository -d os=solaris +pemandu -- -c test -f DEBUG

akan meneruskan yang berikut kepada kontra

-R /usr/local/repository -d os=solaris +pemandu

dan yang berikut, ke peringkat atas Bina fail sebagai @ARGV

-c ujian -f DEBUG

Ambil perhatian bahawa `cons -r .' adalah bersamaan dengan rekursif penuh `membuat bersih', tetapi memerlukan tidak
sokongan dalam Bina fail atau mana-mana Wajib fail. Ini paling berguna jika anda
menyusun fail ke dalam direktori sumber (jika anda memisahkan fail membina and mengeksport direktori,
maka anda hanya boleh mengalih keluar direktori).

Pilihan `-p', `-pa', dan `-pw' amat berguna untuk digunakan sebagai alat bantu membaca
skrip atau menyahpepijatnya. Jika anda ingin tahu skrip yang dipasang eksport/termasuk/foo.h,
sebagai contoh, taip sahaja:

% keburukan -pw eksport/include/foo.h

Menggunakan and bertulis pergantungan pengimbas


QuickScan membenarkan pengimbas bebas sasaran mudah disediakan untuk fail sumber. Sahaja
satu pengimbas QuickScan mungkin dikaitkan dengan mana-mana fail sumber dan persekitaran.

QuickScan digunakan seperti berikut:

QuickScan CONSENV CODEREF, FILENAME [, PATH]

Subrutin yang dirujuk oleh CODEREF dijangka akan mengembalikan senarai nama fail yang disertakan
terus melalui FILE. Nama fail ini, seterusnya, akan diimbas. Hujah PATH pilihan
membekalkan laluan carian untuk mencari FILENAME dan/atau fail yang dikembalikan oleh pengguna yang dibekalkan
subrutin. PATH mungkin merujuk kepada tatasusunan nama direktori carian, atau a
rentetan nama yang dipisahkan oleh aksara pemisah sistem (':' pada sistem UNIX, ';' pada
Windows NT).

Subrutin dipanggil sekali untuk setiap baris dalam fail, dengan $_ ditetapkan ke baris semasa.
Jika subrutin perlu melihat baris tambahan, atau, dalam hal ini, keseluruhan fail,
maka ia boleh membacanya sendiri, daripada pemegang fail SCAN. Ia juga boleh menamatkan gelung, jika
ia mengetahui bahawa tiada lagi maklumat termasuk tersedia, dengan menutup pemegang fail.

Sama ada laluan carian disediakan atau tidak, QuickScan mula-mula cuba mencari fail
berbanding dengan direktori semasa (untuk fail peringkat atas yang dibekalkan terus ke QuickScan),
atau daripada direktori yang mengandungi fail yang merujuk fail tersebut. Ini bukan sangat
umum, tetapi nampaknya cukup bagus--terutamanya jika anda mempunyai kemewahan menulis sendiri
utiliti dan boleh mengawal penggunaan laluan carian dengan cara yang standard. Akhirnya, yang
laluan carian, pada masa ini, dipisahkan bertindih. Ini mungkin tidak menggembirakan kem NT.

Berikut ialah contoh sebenar, diambil daripada a Bina fail di sini:

sub kontra::SMFgen {
my($env, @tables) = @_;
foreach $t (@jadual) {
$env->QuickScan(sub { /\b\S*?\.smf\b/g }, "$t.smf",
$env->{SMF_INCLUDE_PATH});
$env->Command(
["$t.smdb.cc","$t.smdb.h","$t.snmp.cc","$t.ami.cc", "$t.http.cc"],
"$t.smf",
q(
smfgen %( %SMF_INCLUDE_OPT %) %
)
);
}
}

[PERHATIKAN bahawa borang `$env->QuickScan ...' dan `$env->Command ...' tidak sepatutnya
perlu, tetapi, atas sebab tertentu, diperlukan untuk doa khusus ini. Ini muncul
menjadi pepijat dalam Perl atau salah faham di pihak saya; gaya seruan ini tidak
sentiasa kelihatan perlu.]

Ini mencari semua nama borang .smf dalam fail. Ia akan mengembalikan nama walaupun
mereka ditemui dalam ulasan, tetapi itu OK (mekanismenya memaafkan fail tambahan;
mereka hanya diabaikan dengan andaian bahawa fail yang hilang akan diperhatikan apabila fail
program, dalam contoh ini, smfgen, sebenarnya digunakan).

Pengimbas hanya digunakan untuk fail sumber tertentu jika ia diperlukan oleh beberapa sasaran dalam
pokok. Ia hanya digunakan sekali untuk fail sumber tertentu.

Berikut adalah cara lain untuk membina pengimbas yang sama. Yang ini menggunakan rujukan kod eksplisit,
dan juga (tidak perlu, dalam kes ini) membaca keseluruhan fail itu sendiri:

sub myscan {
my(@includes);
buat {
push(@includes, /\b\S*?\.smf\b/g);
} sementara ;
@termasuk
}

Ambil perhatian bahawa susunan gelung diterbalikkan, dengan ujian gelung di penghujungnya. Ini adalah
kerana baris pertama sudah dibaca untuk anda. Pengimbas ini boleh dilampirkan pada sumber
fail oleh:

QuickScan $env \myscan, "$_.smf";

PERTANYAAN DAN CADANGAN


Keburukan dikekalkan oleh komuniti pengguna. Untuk melanggan, hantar mel ke kontra-bincang-
[e-mel dilindungi] dengan badan melanggan.

Sila laporkan sebarang cadangan melalui [e-mel dilindungi] senarai mel.

Gunakan kontra dalam talian menggunakan perkhidmatan onworks.net


Pelayan & Stesen Kerja Percuma

Muat turun apl Windows & Linux

  • 1
    turkdevops
    turkdevops
    TurkDevOps a ?k kaynak yaz?l?m
    geli?tirici topluluklar? Pasukan DevTurks
    Taraf?ndan desteklenmektedir..
    Ciri: https://github.com/turkdevopshttps://turkdevops.g...
    Muat turun turkdevops
  • 2
    asammdf
    asammdf
    *asammdf* ialah penghurai Python yang pantas dan
    editor untuk ASAM (Associtation for
    Penyeragaman Automasi dan
    Sistem Pengukuran) MDF / MF4
    (Format Data Pengukuran...
    Muat turun asammdf
  • 3
    LAME (Lame Bukan Pengekod MP3)
    LAME (Lame Bukan Pengekod MP3)
    LAME ialah alat pendidikan untuk digunakan
    untuk belajar tentang pengekodan MP3. The
    matlamat projek LAME adalah untuk menambah baik
    akustik psiko, kualiti dan kelajuan
    daripada MP...
    Muat turun LAME (Lame Aint an MP3 Encoder)
  • 4
    wxPython
    wxPython
    Satu set modul sambungan Python yang
    balut kelas GUI merentas platform daripada
    wxWidgets.. Khalayak: Pembangun. pengguna
    antara muka: Sistem Tetingkap X (X11), Win32 ...
    Muat turun wxPython
  • 5
    packfilemanager
    packfilemanager
    Ini ialah pengurus fail pek Total War
    projek, bermula dari versi 1.7. A
    pengenalan ringkas kepada Warscape
    pengubahsuaian: ...
    Muat turun packfilemanager
  • 6
    IPef2
    IPef2
    Alat trafik rangkaian untuk mengukur
    Prestasi TCP dan UDP dengan metrik
    sekitar kedua-dua pemprosesan dan kependaman. The
    matlamat termasuk mengekalkan aktif
    iperf cod...
    Muat turun IPrf2
  • Lebih »

Arahan Linux

Ad