EnglezăFrancezăSpaniolă

Ad


Favicon OnWorks

metaconfig - Online în cloud

Rulați metaconfig în furnizorul de găzduire gratuit OnWorks prin Ubuntu Online, Fedora Online, emulator online Windows sau emulator online MAC OS

Aceasta este comanda metaconfig care poate fi rulată în furnizorul de găzduire gratuit OnWorks folosind una dintre multiplele noastre stații de lucru online gratuite, cum ar fi Ubuntu Online, Fedora Online, emulator online Windows sau emulator online MAC OS

PROGRAM:

NUME


metaconfig - un generator de script Configurare

REZUMAT


metaconfig [-dhkmostvwGMV ] [ -L dir ]

DESCRIERE


Metaconfig este un program care generează scripturi de configurare. Dacă nu știi ce a
Configurarea scriptului este, vă rugăm să treceți la TUTORIAL secțiunea acestei pagini de manual. Daca vrei
o descriere completă (formală) a modului de utilizare metaconfig și unitățile sale, vă rugăm să priviți
REFERINȚE secțiune. Următoarea este o introducere rapidă și o referință pentru cunoscători
utilizatori.

Metaconfig operează din set de de unităţi care definesc tot ceea ce știe metaconfig
portabilitate. Fiecare unitate este autonomă și nu trebuie să fie înregistrată nicăieri
altfel decât prin includerea fie în directorul U public, fie în directorul U privat. Dacă
pachetul dist (din care metaconfig face parte) este instalat în LIB, apoi U
directorul este LIB/dist/mcon/U. Pe această mașină, directorul LIB este /usr/share/dist. Ta
directorul privat U, dacă aveți unul, se află în directorul de nivel superior al pachetului dvs.
Înainte să poți fugi metaconfig trebuie să faci câteva lucruri:

· Creați un fișier .package în directorul de nivel superior al pachetului, rulând packinit.
Acest program vă va întreba despre pachetul dvs. și vă va aminti ce îi spuneți, astfel încât
toate programele dist pot fi inteligente.

· Consultați glosarul (în LIB/dist/mcon) și scrieți-vă scripturile shell și programele C
în ceea ce privește simbolurile pe care metaconfig știe să le definească. Nu trebuie să spui
metaconfig ce simboluri ai folosit, deoarece metaconfig va descoperi asta pentru tine.

· Generați orice scripturi .SH necesare pentru a scrie Makefile sau scripturi shell care vor depinde
pe valorile definite de Configurare. Există un program numit faceSH asta te va ajuta
converti un script simplu într-un șablon script.SH; va mai trebui să fie ceva editat
efectuată pe fișierul .SH rezultat pentru a muta partea de configurare variabilă în
partea de sus a scriptului (vezi comentariile inline generate de faceSH în .SH-ul tău
fişier).

· Creați un fișier MANIFEST.new în directorul dvs. de nivel superior care listează toate fișierele din
pachetul dvs. Acest fișier va rămâne privat și nu va face parte din finală
distributie. (Pentru comoditate, fișierul MANIFEST va fi folosit de metaconfig if
nu există încă un fișier MANIFEST.new.) Numele fișierului ar trebui să fie primul câmp de pe fiecare
linia. După câteva spații albe, puteți adăuga un scurt comentariu care descrie fișierul dvs. Numai
fișierele sursă ar trebui să fie listate acolo. Dosarul special patchlevel.h (care este
manipulate și întreținute de instrumentele de corecție -- vezi bătaie(1)) ar trebui să facă parte din
FIșier MANIFEST.new, dar poate fi ignorat în tăcere de unele instrumente. Ca regulă generală,
numai fișierele menținute de RCS ar trebui să fie listate acolo, the patchlevel.h dosar fiind
o excepție importantă.

· Opțional, ați putea dori să creați un fișier MANIFEST, care va fi o versiune exportată
de MANIFESTUL tău.nou. Acel fișier trebuie să facă parte din ediție, adică să fie listat în ambele
MANIFESTUL tău.nou și MANIFESTUL însuși. Unul dintre metaconfig unitățile știe despre asta
fișier și va forța Configurarea să efectueze o verificare a eliberării, asigurând toate fișierele
listate acolo sunt o parte din distribuție. Fișierele MANIFEST și MANIFEST.new ar trebui
fie distincte, nu link-uri.

· Copiați toate fișierele .U pe care doriți să le modificați în directorul U privat. Orice fișier .U
din directorul dvs. privat U va fi folosit de preferință față de cel din U public
director. De exemplu, o modalitate de a forța includerea oricărei unități este de a copia fișierul End.U
fișier în directorul dvs. .U și adăugați numele unității de care doriți ca dependență
sfârşitul liniei ?MAKE:. Anumite unități pot fi forțate NUMAI în acest fel și anume
cele de forma Warn_*.U si Chk_*.U. De asemenea, puteți personaliza anumite implicite
Configurați variabilele prin copierea Myinit.U în directorul privat U al pachetului dvs. și
stabilirea variabilelor în acea unitate.

Acum ești gata să alergi metaconfig. Asta va crea un Configurare fișier și, opțional, a
config_h.SH fișier (dacă sursele dvs. folosesc simboluri C). Fișierele generate vor
să fie adăugat automat la MANIFEST.new dacă este necesar. Nu uitați să vă actualizați
Fișierul MANIFEST totuși.

Pentru a crea unități noi, procedați în felul următor:

· Copiați o unitate similară într-un fișier .U nou. Numele pe care îl alegeți ar trebui să fie numele unui
variabilă generată de unitate, deși aceasta este doar o comoditate pentru dvs., nu o
cerinţă. Ar trebui să aibă 12 caractere sau mai puțin pentru a preveni tăierea numelui de fișier.
De fapt, ar trebui să fie probabil 10 sau mai puțin, pentru ca cei care doresc să folosească RCS să aibă
a .U,v la capăt fără tocat. Metaconfig folosește majusculele primei litere pentru
determinați dacă vreo variabilă este de fapt produsă de această unitate, așa că nu vă capitalizați
numele unității dacă se presupune că va produce o variabilă shell.

· Editați noul fișier .U pentru a face ceea ce doriți. Prima linie ?MAKE: indică
dependențe; înainte de lista finală două puncte toate variabilele pe care le definește această unitate și
după două puncte finale toate variabilele (sau alte unităţi) de care depinde această unitate.
Este foarte important ca aceste liste să fie corecte. Dacă o dependență este opțională și a
valoarea implicită poate fi utilizată, ar trebui să prefixați dependența cu semnul „+”. The
unitatea corespunzătoare nu va fi încărcată pentru a calcula simbolul, decât dacă este într-adevăr necesar
de o altă unitate.

· În măsura posibilului, parametrizați-vă unitatea pe baza variabilei shell definite pe
?INIT: linii. Aceasta va muta definițiile variabilelor în unitatea Init.U, unde
acestea pot fi înlocuite de definițiile din Myinit.U, care este inclus după Init.U.

· Adăugați definiția oricăror simboluri C dorite ca linii ?H:. O linie care începe cu
?H:?%<: în fișierul .U va fi adăugat la eventualul fișier config.h dacă și numai dacă
metaconfig decide că această unitate este necesară. %< reprezintă numele unității,
care se întâmplă să fie și numele fișierului (fără .U) dacă ați urmat
convenţie. Pune întotdeauna un comentariu pe fiecare linie ?H: în cazul în care una dintre variabile
înlocuiri mai devreme pe linie începe un comentariu fără a-l termina. Orice coajă
variabila care începe cu d_ poate face acest lucru, așa că aveți grijă. Dacă omiteți ?%<:, atunci
metaconfig va încerca să intuiască simbolul a cărui definiție este necesară înainte de oricare
includerea în config.h.

· Adăugați definiții de glosar ca ?S: linii pentru variabilele shell și ?C: linii pentru C
variabilele preprocesorului. Vedeți o unitate curentă pentru exemple. Este FOARTE important să
începeți fiecare intrare cu un nume de simbol justificat la stânga și încheiați fiecare intrare cu un ?C:. sau
?S:. linia. Algoritmul care traduce intrările simbolului preprocesorului C pentru
Glosarul în comentarii pentru config.h depinde de asta.

· Asiguraţi-vă că ordinea tuturor ? liniile sunt corecte. Ordinea corectă este:

?RCS: și ?X: practic doar comentarii
?MAKE: dependențe metaconfig
?Y: directivă de aspect al unității
?S: definiţiile shell glosar
?C: glosar C definiţii
?H: definiţii config.h
?M: definiţii confmagic.h
?W: simboluri dorite
?V: simboluri vizibile
?F: fișiere create de această unitate
?T: simboluri shell temporare utilizate
?D: dependențe opționale valoarea implicită
?O: folosit pentru a marca unități învechite
?LINT: sugestii de metalint
?INIT: inițializări de simboluri shell

Iată un exemplu pentru a arăta ordonarea liniilor și diferitele formate permise:

?RCS: $RCS-Id$
?RCS: Informaţii privind drepturile de autor
?RCS: $RCS-Log$
?X:
?X: Un exemplu inventat
?X:
?MAKE:d_unu doi: trei +patru Cinci
?FACEȚI: -alegeți adăugați $@ %
?Y: IMPLICIT
?S:d_one:
?S: Primul simbol shell, definește în mod condiționat UNUL.
?S:.
?S:doi:
?S: Al doilea simbol shell, valoare pentru DOI.
?S:.
?CON:
?C: Primul simbol C.
?C:.
?C:DOI:
?C: Al doilea simbol C.
?C:.
?H:#$d_one UNU /**/
?H:#definiți DOI „$două”
?H:#$d_one ONE_TWO „$două”
?H:.
?M:flip: HAS_FLIP
?M:#ifndef HAS_FLIP
?M:#define flip(x) flop(x)
?M:#endif
?M:.
?W:%<:one_two
?V:p_one p_two:p_trei
?F:fișier ./ftest !tmp
?T:tmp var
?D:two='undef'
?LINT:schimbă trei
?INIT:two_init='2'
: codul shell care implementează unitatea urmează
p_one='unu'
p_two='două'
p_three=""

Permiteți-mi să o mai spun încă o dată: definiția unității de mai sus este a fals unul pentru a arăta doar
posibilități diferite. O astfel de unitate oricum nu ar servi pentru nimic... Mai multe
caracteristicile avansate nu sunt descrise aici. Vă rugăm să consultați REFERINȚE secțiune pentru mai multe
informatii complete.

· Introduceți unitatea în directorul U public sau privat, după caz.

· Reluare metaconfig.

· Trimiteți unitatea la [e-mail protejat] (Raphael Manfredi) pentru includerea în copia master,
dacă crezi că este de interes general.

Pentru a adăuga un nou program care să fie localizat:

· Editați Loc.U și adăugați numele programului atât la linia ?MAKE: (între
două puncte) și fie la loclist, fie la lista de încercări (în funcție de dacă programul este
obligatoriu sau nu).

· Reluați metaconfig.

· Trimite-mi unitatea ta pentru a fi inclusă în copia principală, dacă crezi că este generală
interes.

Note pentru scrierea fișierelor .U:

* Folosiți întotdeauna „rm -f” deoarece există sisteme în care rm este interactiv implicit.

* Nu utilizați „set -- ...” deoarece „--” nu funcționează cu fiecare shell. Folosiți „set x ...;
schimb".

* Nu utilizați „unset ENV” deoarece dezactivat nu este complet portabil. Spuneți „ENV=''” în schimb.

* Folosiți întotdeauna echo " " (cu un spațiu) din cauza sistemelor Eunice.

* Folosiți numai test cu -r, -w, -f sau -d, deoarece acestea sunt singurele comutatoare portabile. În
în special, evitați „testul -x”.

* Folosiți numai programe care au venit cu V7, astfel încât să știți că toată lumea le are.

* Folosiți $contains când doriți să grepți condiționat, deoarece nu toate grepurile returnează a
statut rezonabil. Asigurați-vă că redirecționați rezultatul către /dev/null, folosind „>/dev/null
2>&1'.

* Folosiți „dacă testează” mai degrabă decât „dacă [...]”, deoarece nu fiecare sh cunoaște ultimul construct.

* Utilizați scriptul myread pentru intrări, astfel încât acestea să poată face shell escapes și implicite
evaluare. Forma generală este

cazul „$grimble” în
'') dflt=452;;
*) dflt="$grimble";;
ESAC
rp='Câte grimbles ai?'
. ./citirea mea
grimble="$ans"

* Folosiți scriptul getfile când cereți o cale de fișier pentru a avea opțional
~ extinderea numelui și verificări de sănătate. Consultați unitatea Getfile.U pentru o descriere completă.

* Pune întotdeauna a

$startsh

în partea de sus a fiecărui script generat care va fi lansat sau preluat de
Configurare.

* Nu presupuneți niciodată UNIX-isme obișnuite, cum ar fi faptul că un fișier obiect se termină cu a .o și
cu care se termină un nume de bibliotecă .a. Folosește $_o și $_a variabile în schimb (vezi
Unix.U).

* Când faceți un test de compilare-link-execuție, scrieți-l întotdeauna astfel:

$cc $ccflags $ldflags try.c -o try $libs

deoarece unele sisteme necesită ca steagurile de legătură să fie specificate înainte de compilare
țintă (cu excepția bibliotecilor de legături finale).

* Emite mesaje importante pe descriptorul de fișier #4, folosind „>&4” pentru a redirecționa ieșirea.
Numai acele mesaje vor apărea atunci când -s comutatorul este dat la Configurare pe
linie de comandă (mod silențios).

* Încercați întotdeauna să determinați dacă o caracteristică este prezentă în modul cel mai specific - nu
spuneți „dacă bsd” când puteți grep libc. Există multe sisteme hibride acolo și
fiecare caracteristică ar trebui să stea sau să cadă de la sine.

* Încercați întotdeauna să determinați dacă o caracteristică este prezentă în modul cel mai general, astfel încât
alte pachete pot folosi unitatea dvs.

* Când aveți îndoieli, setați o valoare implicită și întrebați. Nu presupune nimic.

* Dacă credeți că utilizatorul greșește, luați în considerare faptul că poate avea dreptate. Pentru
de exemplu, ar putea rula Configure pe un alt sistem decât va folosi
produsul final pe.

Metaconfig rezervă următoarele nume în directorul dvs. și, dacă utilizați un astfel de nume, acesta
poate deveni ciufulit sau poate avea alte efecte neprevăzute:

.MT/*
Configurare
Dorit
învechit
configura
config_h.SH
confmagic.h
U/*
MANIFEST.nou

În plus, Configure poate bloca aceste nume în directorul în care rulează:

UU/*
config.sh
config.h

OPŢIUNI


Următoarele opțiuni sunt recunoscute de metaconfig:

-d Activați modul de depanare. Nu este cu adevărat util decât dacă depanați metaconfig
însăși.

-h Imprimați mesajul de ajutor și ieșiți.

-k Păstrați directorul temporar, astfel încât să puteți examina fișierele de lucru utilizate de
metaconfig să-ți construiești Configurare scenariu. Util numai la depanarea
de unități.

-m Asumați multă memorie și spațiu de schimb. Acest lucru va accelera căutarea simbolurilor
fișierele sursă într-o perioadă semnificativă de timp, în detrimentul memoriei
consum...

-o Hartă simboluri învechite pe altele noi. Folosiți acest comutator dacă mai aveți
simboluri învechite din codul sursă și nu doriți (sau nu pot) elimina
ei deocamdată. Simbolurile învechite sunt de altfel ignorate, deși asta
vă va da un avertisment de la metaconfig.

-s Activați modul silențios.

-t Urmează simbolurile pe măsură ce sunt găsite.

-v Activați modul pronunțat.

-w Să presupunem că fișierul dorit este actualizat. Acest lucru va sări peste timpul și memoria
faza consumatoare a scanării codului sursă, căutând simboluri cunoscute. Foloseste-l
numai atunci când știți că fișierul sursă nu s-a modificat în ceea ce privește
bazin de metaconfig simboluri folosite.

-G Furnizați și un GNU configura-ca front end la generat Configurare
script, pentru a fi inclus și în distribuție. Acesta este doar un înveliș
în jurul valorii de Configurare script în mod natural, dar le permite oamenilor să se familiarizeze cu
Instrumentul GNU pentru a nu fi pierdut atunci când vă confruntați cu o nouă distribuție.

-L dir Ignorați locația implicită a bibliotecii. În mod normal, este util doar pentru metaconfig
întreținerii să utilizeze la nivel local unitățile dezvoltate în loc de
cele disponibile publicului. The dir specificat este cel care conține unitățile
U director.

-M Permite producerea unui confmagic.h fișier pentru a remapa automat unele bine-
simboluri cunoscute la alte alternative, cum ar fi bcopy() fiind remapată
transparent la memcpy() când nu este disponibil. Această opțiune este activată
automat când a confmagic.h fișierul există în directorul de nivel superior.
Pur și simplu eliminați acel fișier dacă doriți să dezactivați această opțiune definitiv.

-V Tipăriți numărul versiunii și ieșiți.

TUTORIAL


Această secțiune (lungă) este o introducere la metaconfig, în care vom învăța toate
elementele de bază. Dacă știi deja să folosești metaconfig, puteți sări în siguranță la următoarea
secţiune.

Descriere
De obicei, atunci când doriți să obțineți un pachet sursă de compilat pe o anumită platformă pe care o aveți
pentru a edita Makefile-ul principal (presupunând că există unul!), alegeți un compilator C, asigurați-vă că
au bibliotecile adecvate și apoi declanșează face comanda. Dacă pachetul este rezonabil
bine scris, se va compila (fara ca un avertisment sa fie o optiune :-). În sine, ultimul
sentence este o performanță reală, deoarece având în vedere varietatea de platforme UNIX disponibile în prezent
și diversitatea aromelor, asta înseamnă că autorul pachetului a intrat în adâncime
probleme în a-ți da seama de alegerile potrivite, având în vedere unele încercări standard, ghiciri și încurcături
în jurul cu sistem include și tipuri.

Cu toate acestea, în ciuda întregului său talent, autorul nu poate ști că un sistem are un
apel de sistem întrerupt sau că unei structuri de sistem îi lipsește un câmp standard, sau
pur și simplu dacă un anumit fișier include există sau nu. Și nu iau în considerare implicitul
ipoteze, cum ar fi tipul returnat de malloc () funcția sau prezența
redenumește() apel de sistem pentru a numi câteva. Dar aceste cunoștințe sunt necesare pentru a obține realitatea
portabilitate.

Acum să nu ne abuzăm pe noi înșine. Utilizarea acestor informații necesită abilități mai mari, dar se poate
conduce la mai multe programe portabile, deoarece apoi este scris într-un mod independent de sistem
și se bazează doar pe faptul că o anumită presupunere este adevărată sau falsă pentru un anumit sistem,
fiecare presupunere nefiind legată una cu cealaltă. Adică, nu spunem: Suntem pe a
Sistem BSD sau suntem pe un sistem USG. Oricum e prea neclar în zilele noastre. Nu, vrem
spune la codul sursă: acest sistem nu are redenumește() apel de sistem și malloc ()
returnează a (nud *) valoare.

Metaconfig este un instrument care vă va permite să faceți exact asta, cu avantajul suplimentar de a nu
trebuind să editeze manual Makefile-ul dacă totul merge bine. Prin alergare metaconfig, tu creezi un
script shell numit Configurare. S-au dedicat multe eforturi scriptului Configurare
interne pentru a se asigura că va funcționa pe 99% din carcasele existente disponibile până acum
scris. Configurare va sonda sistemul țintă, punând întrebări atunci când aveți îndoieli și
adunați toate răspunsurile într-un singur fișier shell, care, la rândul său, poate fi folosit
generează automat fișiere Makefile configurate și C include fișiere.

Există doar un set limitat (dar destul de mare) de simboluri disponibile pentru scripturile dumneavoastră shell
și programe C. Toate sunt documentate în fișierul Glosar. Tot ce trebuie să faci este să înveți
despre ele și începeți să le utilizați pentru a rezolva problemele de portabilitate și configurare. Atunci,
prin alergare metaconfig, va fi generat un script Configurare adecvat pentru pachetul dvs.

Scriptul Configurare este construit din mai multe unități (mai mult de 300), fiecare unitate fiind
responsabil pentru definirea unui număr mic de simboluri shell și/sau C. Unitățile sunt asamblate
împreună în etapa finală, respectând graficul de dependență (o unitate poate avea nevoie de rezultat
a mai multor alte unități care sunt apoi plasate înainte în scenariu).

Simboluri
Simbolurile sunt cel mai important lucru în metaconfig lume. Sunt cei mai mici
entitate recunoscută, de obicei un cuvânt, și i se poate acorda o valoare la sfârșitul Configurației
execuţie. De exemplu, simbolul C pre-procesor HAS_RENAME este metaconfig simbol că
este garantat a fi definit dacă și numai dacă redenumește() apelul de sistem este prezent. De asemenea,
il $ranlib Variabila shell va fi setată fie la „:” fie la „ranlib”, în funcție de situația
apel la ranlib programul este necesar pentru a comanda un fișier de bibliotecă. Cum funcționează asta nu este
important pentru moment, ceea ce este important este să înțelegem că acele simboluri sunt date a viaţă
(adică o valoare) pe Configurare execuţie.

Utilizarea simbolurilor este relativ simplă. Într-un fișier sursă C, pur și simplu utilizați simbolul
valoare, ca o directivă pre-procesor (de exemplu: #ifdef HAS_RENAME) sau, dacă simbolul
value este un șir, direct așa cum ați folosi o macrocomandă în C. Și într-un fișier shell sau a
Makefile, puteți face referire direct la un simbol shell.

De fapt, mint, pentru că asta nu este complet la fel de magic ca în paragraful anterior
ar putea suna. Într-un fișier C, trebuie să includeți fișierul produs de Configurare config.h dosar, și
trebuie să împachetați scriptul shell sau Makefile într-un fișier .SH și puteți face referire la shell
simbol numai în partea de substituție variabilă a acelui fișier .SH. Mai multe despre asta mai târziu.

Sursă Fişiere
Simbolurile pot apărea doar într-un set limitat de fișiere sursă, deoarece metaconfig numai va
scanați-le atunci când căutați simboluri cunoscute, încercând să vă dați seama de ce unități va avea nevoie.
Puteți utiliza simboluri C în fișierele sursă C, adică fișiere cu a .c, .h, .y or .l extensie și
Simbolurile shell sunt căutate numai în fișierele .SH.

Pentru a obține valoarea unui simbol, un fișier C trebuie să includă special config.h
fișier, care este produs de Configurare când simbolurile C sunt prezente. Și fișierele .SH sunt rulate
printr-un shell, producând un nou fișier. Cu toate acestea, în secțiunea de sus a fișierului .SH, fișierul
special config.sh fișier (produs și prin rularea Configurare) este sursă și variabilă
se aplică substituții. De fapt, config.h este produs prin rularea metaconfig-produs
config_h.SH fișier, folosind din nou înlocuirea variabilelor. Deci ne vom uita la a
puțin mai aproape, deoarece aceasta este inima întregului configuraţie sistem...

Variabil Înlocuire
Există un construct numit shell aici document care permite unei comenzi să preia o intrare
specificat în scriptul însuși. Acea intrare este interpretată de shell ca un dublu
șir citat sau un singur șir ghilimeleu, în funcție de forma documentului de aici
specificație.

Pentru a specifica un document aici, se folosește simbolul „<<”, urmat de un singur identificator. Din
apoi, liniile de script rămase formează intrarea pentru comandă, până aici
documentul se găsește singur pe o linie. Înlocuirea shell (inclusiv variabila shell
substituții) se face cu excepția cazului în care identificatorul este înconjurat de ghilimele simple. De exemplu:

var='primul'
tar='al doilea'
echo "--> primul aici document:"
pisica <
var='$var'
tar='$tar'
MOA
echo "--> al doilea document aici:"
pisica <<'EOM'
echo $var
echo $tar
MOA
ecou „--> sfârşit”.

va produce, atunci când rulează printr-un shell:

--> mai întâi aici documentul:
var='primul'
tar='al doilea'
--> al doilea document aici:
echo $var
echo $tar
--> sfârşitul.

Primul document de aici are conținutul interpretat, în timp ce al doilea este scos ca atare.
Ambele sunt utile într-un script .SH, după cum urmează să vedem.

Utilizarea .SH Script-uri
Un script .SH este de obicei produs prin rularea programului FaceSH script alt fișier existent,
transformare fişier într-o dosar.SH. Să luăm un singur exemplu. Iată un mic scenariu
(să-i spunem intsize) care tipărește un singur mesaj, de dimensiunea int tipul de date în C.
Din păcate, are valoarea cablată în el, astfel:

#!/ Bin / sh
intsize='4'
echo „Pe această mașină, tipul int este $intsize octeți”

Să fugim faceSH pe el tastând „faceSH intsize'. Primim un singur intsize.SH fișier care
arata asa:

caz $CONFIG în
'')
if test -f config.sh; apoi TOP=.;
elif test -f ../config.sh; apoi TOP=..;
elif test -f ../../config.sh; apoi TOP=../ ..;
elif test -f ../../../config.sh; apoi TOP=../../..;
elif test -f ../../../../config.sh; apoi TOP=../../../..;
altfel
echo „Nu găsesc config.sh.”; iesirea 1
fi
. $TOP/config.sh
;;
ESAC
: Acest lucru forțează fișierele SH să creeze țintă în același director ca fișierul SH.
: Acest lucru este pentru ca make depend să știe întotdeauna unde să găsească derivate SH.
cazul „0 $” în
*/*) cd `expr X$0 : 'X\(.*\)/'` ;;
ESAC
echo „Extragerea intsize (cu substituții variabile)”
: Această secțiune a fișierului va avea înlocuiri de variabile efectuate pe ea.
: Mută ​​orice are nevoie de subconfig de la !NO!SUBS! secțiunea către !GROK!ACEST!.
: Protejați orice semn de dolar și backtick pe care nu doriți să le interpretați
: punând o bară oblică inversă în față. Puteți șterge aceste comentarii.
$spitshell >intsize <
$startsh
!GROK!ACESTA!

: În următorii dolari și backticks nu au nevoie de backslash suplimentar.
$spitshell >>intsize <<'!NU!SUBS!'
intsize='4'
echo „Pe această mașină, tipul int este $intsize octeți”
!NU!SUBS!
chmod 755 intsize
$eunicefix intsize

Prima parte a acestui script (în caz declarație) încearcă să localizeze config.sh
fișier, pentru a-l găsi. The $CONFIG variabila este false în mod implicit, în mod adevărat când
config.sh a fost deja preluat (ceea ce ar fi cazul dacă acest fișier ar fi executat din
în Configurare în sine, dar să nu confundăm problema aici).

Odată ce config.sh fișierul a fost surse, toate simbolurile shell definite de Configurare sunt
a stabilit. Știm ajunge la o a doua declarație de caz, folosită pentru a schimba directorul curent ar trebui a
calea să fie folosită pentru a ajunge la acest program (de exemplu, dacă am spus „sh ../scripts/intsize.SH', noi
ar alerga mai întâicd ../scripte' înainte de a continua). Dacă nu înțelegeți asta, nu înțelegeți
vă faceți griji.

Aici vin chestiile interesante. Acest script folosește $spitshell variabilă și nu este
ceva despre care știm... încă. Dacă te uiți prin fișierul Glosar, vei vedea asta
aceasta este o variabilă cunoscută de metaconfig. Dacă faceți acest fișier parte a distribuției dvs
(incluzându-l în fișierul MANIFEST.new, vom reveni la asta mai târziu) și rulăm
metaconfig, apoi Configurare scriptul va determina o valoare potrivită pentru această variabilă
și va fi instalat config.sh. Același lucru este valabil și pentru $startsh iar misteriosul $eunicefix at
sfarsit. Într-un sistem rezonabil, partea relevantă a config.sh ar arata asa:

spitshell='pisica'
startsh='#!/ Bin / sh'
eunicefix=':'

Ah! Ajungem acolo. Acum pare familiar. Ne confruntăm cu un singur pisică comanda al cărui
intrarea provine dintr-un document interpolat aici și a cărui ieșire este redirecționată
intsize. Valoarea va fi cea a $startsh, adică „#!/ Bin / sh'. Bine până acum.

Apoi ajungem la a doua extindere a documentului aici, pentru a obține restul scriptului. Acest
timp, simbolul documentului de aici este înconjurat de ghilimele simple, astfel încât conținutul va fi
atasat textual la intsize fişier. Deci, alergând 'sh intsize.SH', primim
urmatoarea iesire:

Extragerea intsize (cu substituții variabile)

și uitându-ne la fișierul intsize produs, vedem:

#!/ Bin / sh
intsize='4'
echo „Pe această mașină, tipul int este $intsize octeți”

care este exact ceea ce aveam la început. Până acum, este o procedură fără operație...
Dar, ce minunat! Se întâmplă așa (pură coincidență, crede-mă!), că metaconfig știe
despre $intsize simbolul cochiliei. Prin mutarea inițializării intsize la variabila-
zona interpolată a scriptului .SH și inițializarea acesteia cu Configurare-valoare calculată,
și eliminând comentariile acum inutile adăugate de faceSH, primim:

caz $CONFIG în
'')
if test -f config.sh; apoi TOP=.;
elif test -f ../config.sh; apoi TOP=..;
elif test -f ../../config.sh; apoi TOP=../ ..;
elif test -f ../../../config.sh; apoi TOP=../../..;
elif test -f ../../../../config.sh; apoi TOP=../../../..;
altfel
echo „Nu găsesc config.sh.”; iesirea 1
fi
. $TOP/config.sh
;;
ESAC
cazul „0 $” în
*/*) cd `expr X$0 : 'X\(.*\)/'` ;;
ESAC
echo „Extragerea intsize (cu substituții variabile)”
$spitshell >intsize <
$startsh
intsize='$intsize'
!GROK!ACESTA!

$spitshell >>intsize <<'!NU!SUBS!'
echo „Pe această mașină, tipul int este $intsize octeți”
!NU!SUBS!
chmod 755 intsize
$eunicefix intsize

Desigur, rularea acestui script printr-un shell va scoate din nou același script. Dar dacă
noi fugim Configurare pe o mașină unde an int este stocat ca o cantitate de 64 de biți, config.sh voi
set intsize la 8 și intsize scriptul va avea valoarea corectă și va tipări:

Pe această mașină, tipul int este de 8 octeți

care este corect. Felicitări! Tocmai am configurat un script shell!!

producând config.h
Acum putem arunca o privire asupra drumului config.h este produs din config_h.SH. Noi stim aia
funcţionare Configurare produce o config.sh script-ul (cum exact se face acest lucru nu este strict
relevante aici, dar pentru curioși, este o altă înlocuire de documente aici
Configurare însuși). The config_h.SH în sine este construit de metaconfig în același timp,
Configurare este, cu condiția să utilizați cel puțin un simbol C în sursele dvs.

Să aruncăm o privire la unele aleatorii config_h.SH fișier pentru a vedea ce se întâmplă cu adevărat:

caz $CONFIG în
'')
if test -f config.sh; apoi TOP=.;
elif test -f ../config.sh; apoi TOP=..;
elif test -f ../../config.sh; apoi TOP=../ ..;
elif test -f ../../../config.sh; apoi TOP=../../..;
elif test -f ../../../../config.sh; apoi TOP=../../../..;
altfel
echo „Nu găsesc config.sh.”; iesirea 1
fi
. $TOP/config.sh
;;
ESAC
cazul „0 $” în
*/*) cd `expr X$0 : 'X\(.*\)/'` ;;
ESAC
echo „Se extrage config.h (cu substituții de variabile)”
sed < config.h -e 's!^#undef!/define!' -e 's!^#un-def!#undef!'
/*
* Acest fișier a fost produs prin rularea scriptului config_h.SH, care
* își primește valorile din config.sh, care este în general produs de
* rulează Configurare.
*
* Simțiți-vă liber să modificați oricare dintre acestea în funcție de necesitate. Rețineți, totuși,
* că rularea config.h.SH din nou va șterge orice modificări pe care le-ați făcut.
* Pentru o modificare mai permanentă, editați config.sh și rulați din nou config.h.SH.
*/

/* Timp de configurare: $cf_time
* Configurat de: $cf_by
* Sistem țintă: $myuname
*/

#ifndef _config_h_
#define _config_h_

/* bcopy:
* Acest simbol este mapat la memcpy dacă rutina bcopy() nu este
* disponibil pentru a copia șiruri.
*/
/* HAS_BCOPY:
* Acest simbol este definit dacă rutina bcopy() este disponibilă
* copiați blocuri de memorie. Nu ar trebui să utilizați acest simbol sub
* circumstanțe normale și folosiți bcopy() direct în schimb, care
* va fi mapat la memcpy() dacă bcopy nu este disponibil.
*/
#$d_bcopy HAS_BCOPY /**/
#ifndef HAS_BCOPY
#ifdef bcopy
#un-def bcopy
#endif
#define bcopy(s,d,l) memcpy((d),(s),(l)) /* mapat la memcpy */
#endif

/* HAS_DUP2:
* Acest simbol, dacă este definit, indică faptul că rutina dup2 este
* disponibil pentru duplicarea descriptorilor de fișiere.
*/
#$d_dup2 HAS_DUP2 /**/

/* I_STRING:
* Acest simbol, dacă este definit, indică programului C că ar trebui
* include (sisteme USG) în loc de (sisteme BSD).
*/
#$i_string I_STRING /**/

#endif
!GROK!ACESTA!

În partea de sus a fișierului, recunoaștem construcția standard .SH pe care o avem deja
studiate în detaliu. Urmează extragerea fișierului în sine, printr-un document aici cu
substituții variabile. Totuși, aici nu folosim o câmpie pisică dar a sete în schimb, din moment ce
trebuie să facem câteva editări suplimentare din mers. Vom vedea de ce mai târziu, așa că să uităm
despre asta chiar acum.

Ajungem acum la comentariul principal, iar fișierul este etichetat cu ora de configurare, the
sistemul țintă etc... (acele variabile care provin din sursă config.sh dosarul au fost
înființat de Configurare). Acel antet de comentariu este urmat de o protecție „#ifndef” de protejat
împotriva includerilor multiple ale acestui fișier. Apoi vine inima dosarului...

Ajută să știi asta $d_* și $i_* variabilele sunt setate fie la „defini' sau 'undef' de
Configurare, în funcție de faptul dacă o funcție sau un fișier include este prezent în sistem sau
nu. Asta înseamnă:

#$d_bcopy HAS_BCOPY /**/

linia va fi extinsă la:

#define HAS_BCOPY /**/

dacă variabila $d_bcopy este setată la „define” sau:

#undef HAS_BCOPY /**/

dacă $d_bcopy a fost setat la „undef”, deoarece caracteristica nu era acolo. Cu toate acestea, nu este
ce este scris în config.h dosar din cauza sete filtrul pe care l-am văzut deja,
care va transforma a doua formă în:

/*#define HAS_BCOPY /**/

Acesta este un formular util pentru editarea ulterioară config.h pentru că trebuie doar să eliminați
conducând „/*” dacă doriți să înlocuiți Configurarealegerea lui. De asemenea, puteți adăuga unul singur
„/*” la începutul unei linii „#define” pentru a evita definirea unui anumit simbol.
Acesta este motivul pentru care fiecare definiție de simbol este protejată de un „/**/” în urmă, pentru a închide primul
comentariu deschis prin „/*” (comentariile nu sunt imbricate în C).

Acum transformarea „#undef” în „/*#define” este plăcută, dar dacă vrem să scriem de fapt un
„#undef”, suntem blocați... dacă nu îl scriem ca „#un-def” și lăsăm sete remediați asta la „#undef”
în timp ce produce config.h, ceea ce se face de fapt aici.

Același tip de raționament se aplică acestor două linii:

#$d_dup2 HAS_DUP2 /**/
#$i_string I_STRING /**/

şi presupunând config.sh defineste:

d_dup2='definiți'
i_string='undef'

vom intra în produs config.h:

#define HAS_DUP2 /**/
/*#define I_STRING /**/

Limpede ca apa curgătoare? Bun!

Acum ar trebui să fie evident că prin includerea config.h în toate fișierele sursă C, ajungi la
stii ce Configurare a ghicit pe sistemul dvs. De fapt, folosind acele simboluri, ești
scrierea codului C configurat, din moment ce metaconfig va ști că aveți nevoie de acele simboluri și voință
generează un adecvat config_h.SH fișier, precum și tot codul necesar în Configurare la
calculați o valoare adecvată pentru ele (prin atribuirea de valori variabilelor shell asociate).

Alergare Metaconfig
Să ne concentrăm pe metaconfig program pentru o vreme pentru a înțelege cum își folosește unitățile și
codul sursă pentru a produce toate fișierele de configurare necesare. Dacă intenționați să scrieți noi
unități, ar trebui să aveți o bună înțelegere a întregii scheme.

Dacă nu există fișier MANIFEST.new, metaconfig va încerca să folosească fișierul MANIFEST în schimb,
pentru confort. Oriunde menționăm MANIFEST.new, poate fi înțeles ca MANIFEST
cu condiția să nu se găsească niciun fișier MANIFEST.new la rădăcina pachetului dumneavoastră.

Presupunând că fișierul MANIFEST.new este setat corect și listează toate fișierele sursă pe care doriți să le faceți
configurați și pe care l-ați rulat packint în directorul sursă rădăcină pentru a crea un
.pachet fișier, puteți rula metaconfig și veți obține următoarele:

$ metaconfig
Se localizează unitățile...
Se extrag liste de dependențe din 312 unități...
Se extrag nume de fișiere (*.[chyl] și *.SH) din MANIFEST.new...
Crearea unui fișier dorit...
Se scanează fișierele .[chyl] pentru simboluri...
Se scanează fișierele .SH pentru simboluri...
Se calculează graficul dependenței optime...
Se construiește fișierul de realizare privat...
Se determină unitățile încărcate...
Se actualizează fișierul make...
Determinarea ordinii corecte a unităților...
Se creează Configurare...
Doneaza.

Prima fază caută toate fișierele unităților (se termină cu .U) în directorul public
mai întâi, apoi în cel privat. Dacă copiați un fișier public în directorul U privat
(adică un director numit U la nivelul superior al pachetului dvs.), acesta va suprascrie publicul
versiune. Odată ce are o listă cu toate unitățile disponibile, le analizează și le extrage pe toate
liniile ?MAKE: pentru a ști despre dependențe și simbolurile shell cunoscute. De asemenea
se concentrează pe liniile ?H: pentru a afla despre simbolurile C și ce simboluri shell trebuie să fie
calculat pentru a obține o valoare adecvată pentru acel simbol C (deci avem un alt nivel de dependențe
aici).

Apoi, numele de fișiere adecvate sunt extrase din fișierele MANIFEST.new și a Dorit fișierul este
construit: acel fișier listează toate simbolurile C și simbolurile shell necesare pentru acel pachet. Noi
mai întâi scanați fișierele de tip C pentru simboluri C, apoi propagați dependențele la acestea
simboluri shell asociate (adunate din ?H: linii). În continuare, fișierele .SH sunt scanate și în cele din urmă
toate simbolurile shell sunt cunoscute.

Un Makefile temporar este construit și metaconfig încearcă face toate simbolurile shell de văzut
ce comenzi (enumerate pe al doilea ?MAKE: linii) sunt executate și, astfel, ce unități sunt
chiar nevoie. Unitățile opționale care nu sunt necesare altfel sunt eliminate și un al doilea Makefile este
generate. De data aceasta, știm despre toate unitățile și comenzile respective, opțional
au fost eliminate unitățile și au fost calculate valorile implicite pentru simbolurile lor shell. The
Configurare scriptul poate fi apoi generat, împreună cu config_h.SH. Au fost efectuate.

Convenții
Trebuie respectate convențiile adecvate pentru ca întregul proces să sune. Există un caz
convenție pentru unități și o convenție de denumire a variabilelor.

Toate unitățile ar trebui să aibă prima literă cu minuscule, cu excepția cazului în care sunt unități speciale. De
special, ne referim că nu definesc cu adevărat noi variabile shell care pot fi utilizate de către
utilizator în fișierele sale .SH, ci mai degrabă unități care produc scripturi sau variabile shell care sunt să
să fie utilizat intern de către Configurare scenariu. Exemple tipice sunt Init.U dosar care este
inițializarea variabilei principale sau Myread.U care produce am citit script folosit aproape
peste tot în Configurare atunci când o întrebare trebuie adresată utilizatorului.

Unitățile nespeciale se subdivizează apoi în două grupuri distincte: unități care definesc variabile
asociat unui simbol C și unităților care definesc variabilele shell proprii. Primul grup
este împărțit în continuare în variabile legate de fișierele incluse (numele lor începe cu i_) Şi
variabile legate de alte definiții (numele care începe cu d_). Al doilea grup are
nume care reprezintă ele însele, de exemplu cc.U definește $cc variabilă shell a cărei valoare este
compilatorul C care urmează să fie utilizat.

Unitățile speciale își rezervă uneori o variabilă predefinită și returnează „rezultate”
în alte variabile cunoscute. De exemplu, cel am citit scenariu produs de Myread.U
așteaptă promptul în $rp, răspunsul implicit în $dflt și plasează răspunsul utilizatorului în $ans.
Acest lucru nu este documentat în această pagină de manual: trebuie să vă uitați la unitatea în sine
înțelegeți ce variabile sunt utilizate și cum urmează să fie utilizată unitatea.

Utilizarea Glosar
Fișierul Glosar este produs automat de către makegloss scriptul, care extrage fișierul
informații de la liniile ?S:, ?C: și ?MAKE: și le reformatează în ordine alfabetică
glosar sortat. Este important să citiți Glosarul pentru a ști despre simbolurile care sunteți
permis să utilizeze. Cu toate acestea, Glosarul nu vă va spune cum să le utilizați. De obicei, asta e
depinde de tine.

Într-o zi, probabil că vei scrie propriile tale unități și vei ști suficient despre metaconfig
pentru a face acest lucru rapid și eficient. Cu toate acestea, nu uitați niciodată să vă documentați în mod corespunzător munca
liniile ?S: și ?C: sau alte persoane nu le vor putea reutiliza. Amintiți-vă despre
timp în care aveai doar Glosarul și această pagină de manual pentru a începe.

Concluzie
Acum că știți metaconfig elementele de bază, ar trebui să citiți DESCRIERE secțiunea, atunci
sari la REFERINȚE secțiune pentru a afla despre toate detaliile sângeroase, cum ar fi cele permise
sintaxa pentru liniile de control al unității (liniile care încep cu „?”) sau comenzile distincte MAKE
ai voie sa folosesti.

REFERINȚE


Această secțiune documentează elementele interne ale metaconfig, practic sintaxa unității, specialul
unitățile pe care ar trebui să le cunoașteți și fișierele indicii.

General Unitate Sintaxă
O unitate metaconfig este împărțită în două părți distincte. Secțiunea antet (liniile care încep
cu „?’) și o secțiune shell (codul care trebuie inclus în Configurare scenariu). Este
este posibil să adăugați comentarii „?X:” oriunde în unitate, dar celelalte „?” linii (de asemenea
denumit Control linii) au o politică strictă de comandă.

Dacă o linie de control este prea lungă, este posibil să se folosească o continuare prin evadarea finală
linie nouă cu o bară oblică inversă și continuă pe linia următoare (care ar trebui apoi să fie indentată
prin spații sau file).

Mai jos este o descriere formală a fiecăreia dintre liniile de control. Dacă nu este specificat
în caz contrar, ordinea acestei prezentări este ordinea care va fi utilizată în cadrul unității.

?RCS: gratuit a) Sport and Nutrition Awareness Day in Manasia Around XNUMX people from the rural commune Manasia have participated in a sports and healthy nutrition oriented activity in one of the community’s sports ready yards. This activity was meant to gather, mainly, middle-aged people from a Romanian rural community and teach them about the benefits that sports have on both their mental and physical health and on how sporting activities can be used to bring people from a community closer together. Three trainers were made available for this event, so that the participants would get the best possible experience physically and so that they could have the best access possible to correct information and good sports/nutrition practices. b) Sports Awareness Day in Poiana Țapului A group of young participants have taken part in sporting activities meant to teach them about sporting conduct, fairplay, and safe physical activities. The day culminated with a football match.
Pentru a fi folosit pentru comentariile RCS, în partea de sus a unității.

?X: Orice a) Sport and Nutrition Awareness Day in Manasia Around XNUMX people from the rural commune Manasia have participated in a sports and healthy nutrition oriented activity in one of the community’s sports ready yards. This activity was meant to gather, mainly, middle-aged people from a Romanian rural community and teach them about the benefits that sports have on both their mental and physical health and on how sporting activities can be used to bring people from a community closer together. Three trainers were made available for this event, so that the participants would get the best possible experience physically and so that they could have the best access possible to correct information and good sports/nutrition practices. b) Sports Awareness Day in Poiana Țapului A group of young participants have taken part in sporting activities meant to teach them about sporting conduct, fairplay, and safe physical activities. The day culminated with a football match.
Comentarii cu scop general. Poate apărea oriunde în unitate, dar trebuie lăsat justificat.
Pentru comentarii RCS, vă rugăm să utilizați formularul de comentarii ?RCS:.

?FACE:simbol listă: dependenţă listă [+opțional]
Aceasta este prima linie de dependență. Primul simbol listă ar trebui să enumere toate simbolurile
construit de această unitate (adică a cărei valoare este calculată de secțiunea shell a unității).
Simbolurile ar trebui să fie separate prin spațiu. Dacă un simbol definit este numai pentru uz intern și
nu ar trebui să apară în generat config.sh fișier, atunci ar trebui să fie precedat de a
„+” (a nu se confunda cu dependențele opționale definite în continuare). Al doilea
o parte a listei (după mijlocul „:”) este dependența de unitate. Ar trebui să enumere toate
unitățile speciale necesare, precum și toate simbolurile folosite de shell
implementare. Dacă un simbol este adăugat, dar valoarea sa de configurare nu este critică, acesta
poate fi precedat de un „+”, caz în care se numește dependență condiționată: its
unitatea corespunzătoare va fi încărcată dacă și numai dacă acel simbol este altfel
dorit; în caz contrar, se va folosi valoarea implicită.

?FACE:fila comandă
Pot exista una sau mai multe linii de comandă după liniile inițiale de dependență. Acestea
comenzile vor fi executate atunci când unitatea se dorește să le încarce Configurare. Vedea
paragraful despre comenzi make pentru mai multe informații. Rețineți că liderul fila
caracterul este necesar înainte de comandă.

?Y:aspect
Declarați o directivă de aspect pentru această unitate. Această directivă poate fi unul dintre șiruri
top, lipsă or de jos (cazul nu contează, stilul recomandat este să le scrieți
cu majuscule). Dacă este omis, lipsă este asumat.

Această directivă este necesară numai dacă doriți să forțați o unitate în partea de sus sau de jos
a celor generate Configurare script, deoarece dependențele de unitate o permit. Important
întrebările pot fi astfel forțate la început. În cadrul aceleiași clase de layout, unități
sunt sortate alfabetic cu două cazuri speciale pentru unitățile d_* și i_*, forțate
respectiv în partea de sus și de jos a claselor lor (dar acestea ar trebui să aparțină
clasa implicită).

Dacă forțați în partea de sus o unitate ale cărei dependențe necesită toate celelalte unități
precedă, nu obții nimic interesant. Prin urmare, directiva respectivă ar trebui într-adevăr
poate fi folosit pentru a crește prioritatea unor unități interactive care nu depind de multe
alte simboluri vizibile de utilizator, cum ar fi întrebări legate de cale.

?S:nume_simbol [(învechit simbol listă)]:
Introduce un simbol shell. Această primă linie denumește simbolul, urmat opțional de a
listă cuprinsă între paranteze și dând echivalentul învechit. Cele învechite
simbolurile vor fi remapate la noul nume_simbol dacă -o se acordă opțiunea
metaconfig.

?S:Orice text, pentru Glosar
Practic, un comentariu care descrie simbolul shell, care va fi extras de makegloss
în fișierul Glosar.

?S:. Închide comentariul simbolului shell.

?C:nume_simbol [~ alias] [(învechit simbol listă)]:
Introduce un nou simbol C. The alias nume este numele sub care simbolul C va fi
fi controlat, adică dacă alias se dorește simbolul, atunci acel simbol C va fi scris
în config_h.SH fişier. De obicei, alias-ul este doar „%<” (reprezintă numele unității)
și există, de asemenea, o linie ?W: care mapează un simbol C la alias. De asemenea, părțile relevante
din liniile ?H: sunt protejate în mod explicit de o condiție „?%<”. Vezi simbolul
alias paragraf pentru mai multe detalii. Restul liniei este opțional
învechit simbol listă, care listează vechi echivalente pentru noul nume_simbol.

?C:Orice text, pentru Glosar și config_h.SH
Practic, un comentariu care descrie simbolul C, care va fi extras de makegloss
în fișierul Glosar și prin metaconfig în config_h.SH fișier dacă simbolul este
dorit (sau dacă aliasul său este dorit atunci când este utilizat aliasarea simbolului).

?C:. Închide comentariul simbolului C.

?H:?simbol:config_h.SH chestii
Aceasta este cererea generală de includere în config_h.SH. Rândul este scris doar când
paza simbol este cu adevărat dorită. Această formă generală este necesară când simbolul C
a fost folosit aliasing. În caz contrar, dacă utilizați una dintre celelalte forme „standard”,
paza se face automat de metaconfig însăși.

?H:#$d_var VAR "$var"
Definește în mod condiționat VAR simbolul C în $var când este setat la 'defini'. implică a
'?VAR:' starea de pază, și metaconfig se leagă automat VAR la cele două cochilie ale ei
dependențe variabile (adică ambele $d_var și $var va fi marcat ca dorit if VAR is
folosit în sursele C).

?H:#defini VAR [facultativ a) Sport and Nutrition Awareness Day in Manasia Around XNUMX people from the rural commune Manasia have participated in a sports and healthy nutrition oriented activity in one of the community’s sports ready yards. This activity was meant to gather, mainly, middle-aged people from a Romanian rural community and teach them about the benefits that sports have on both their mental and physical health and on how sporting activities can be used to bring people from a community closer together. Three trainers were made available for this event, so that the participants would get the best possible experience physically and so that they could have the best access possible to correct information and good sports/nutrition practices. b) Sports Awareness Day in Poiana Țapului A group of young participants have taken part in sporting activities meant to teach them about sporting conduct, fairplay, and safe physical activities. The day culminated with a football match. ]
Întotdeauna definește VAR simbolul C la o anumită valoare. Implica un '?VAR:' starea de pază.
O dependență automată de shell este creată de unitatea în sine.

?H:#defini VAR(x,y,z) $var
Definește întotdeauna macro-ul VAR să fie valoarea $var variabil. Depinde de
unitate pentru a asigura $var deține o valoare sensibilă. O dependență automată între C
macro VAR iar variabila shell este stabilită, iar întreaga linie este păzită de an
implicit '?VAR:'.

?H:#$d_var VAR
Definește condiționat VAR if $d_var este setat sa 'defini'. Implica un '?VAR:' paza
condiție. Se generează o dependență automată de shell către $d_war.

?H:#defini VAR "$var"
Atribuie o valoare configurată pentru VAR simbolul C. Implica un '?VAR:' stare de gurading.
Este generată o dependență automată de shell pentru a lega VAR și $var.

?H:. Închide config_h.SH cereri de includere.

?M:C simbol: C dependențe
Introduce definiția magică referitoare la simbolul C, pentru confmagic.h, și definește
simbol de pază pentru restul ?M: definiții. Această linie implică în tăcere
'?W:%<:C simbol', adică unitatea va fi încărcată în Configurare dacă apare simbolul C
în sursele C, indiferent dacă magia este folosită sau nu. Dependențele C sunt activate
când se folosește magia, pentru a forța definirea lor config_h.SH. Cu toate acestea, dacă
magia este nu folosit, dar simbolul C apare în sursă fără C-ul necesar
dependențe, veți fi avertizat de fiecare dată când fișierul Wanted este construit, deoarece poate fi
o problemă de portabilitate (și, de asemenea, pentru că unitatea este încărcată necondiționat în
Configurați ori de câte ori este utilizat simbolul C, indiferent de celelalte linii ?C: din
unitate).

?M:cpp def
Definește maparea magică cpp care urmează să fie introdusă în confmagic.h ori de câte ori este în cauză
este folosit simbolul. Există un implicit „?sym' pazind unde sym este numele simbolului
definit de linia de conducere ?M:.

?M:. Închide confmagic.h cerere de includere.

?W:coajă simbol listă:C simbol listă
Leagă destinul simbolurilor shell cu cel al simbolurilor C: dacă vreunul dintre simbolurile C
simbolurile listate sunt dorite, apoi toate simbolurile shell sunt marcate ca dorite. Util pentru
forțați includerea unei unități (lista de simboluri shell setată la „%<”) atunci când prezența unui C
simbolul este detectat. Lista de simboluri shell poate fi lăsată goală, pentru a beneficia de latură
efectul locației simbolului C în pre-procesorul încorporat (simbolul fiind definit
pentru acel pre-procesor dacă se află în sursă). Pentru a căuta modele cu un spațiu
în ele, trebuie să citați simbolurile C între ghilimele simple, ca în „struct
fus orar'.

?V:read-only simboluri:Citeste, scrie simboluri
Aceasta este o metalint indiciu și ar trebui să fie folosit numai în unități speciale care exportă unele shell
variabile. Variabilele înainte de mijlocul „:” sunt exportate doar în citire (schimbându-le
va emite un avertisment), în timp ce alte simboluri pot fi citite și modificate liber.

?F:fișiere a creat
Această linie are două scopuri: este a metalint indiciu și, de asemenea, un substituent pentru
viitor jmake utilizare. Trebuie să enumere trei tipuri de fișiere: cel temporar care sunt
create pentru un test, cele private UU create în directorul UU pentru mai târziu
citire, iar cele publice lăsate în directorul rădăcină al pachetului. Temporar
fișierele trebuie listate cu un „!” caracter (adică „nu! nu sunt reutilizate
mai târziu!”), fișierele private UU ar trebui să fie precedate de un „./” (adică: a le folosi, să zicem
./fişier, Nu doar fişier), iar cele publice ar trebui să fie denumite așa cum sunt.

?T:coajă temporare
O alta metalint aluzie. Această linie listează toate variabilele shell utilizate ca temporare
în secțiunea de înveliș a acestei unități.

?D:simbol='valoare'
Valoarea de inițializare pentru simbolurile utilizate ca dependențe condiționate. Dacă nu ?D: linia este
găsit, atunci se folosește o valoare nulă. The metalint programul vă va avertiza dacă a
simbolul este folosit cel puțin o dată ca dependență condiționată și nu are un propriu
?D: initializare. Este o practică bună să adăugați acele linii chiar și pentru un nul
inițializarea deoarece accentuează caracterul eventual opțional al unui simbol.

?O:Orice mesaj tu vrea
Această directivă indică faptul că această unitate este învechită în ansamblu. Ori de câte ori se utilizează oricare
a simbolurilor sale este făcută (sau utilizarea indirectă prin dependențe), mesajul este afișat
ecranul (pe stderr). Puteți pune una sau mai multe linii, caz în care fiecare linie va face
fi tipărit, în ordine.

?PUF:metalint sugestii
A se vedea metalint pagina de manual pentru o explicație a indicii distincte care pot fi
folosit.

?INIT:inițializare cod
Codul de inițializare specificat de această linie va fi încărcat în partea de sus a
Configurare script, cu condiția ca unitatea să fie necesară.

C Simbol Alianta
Uneori nu este posibil să te bazezi pe metaconfigpropria selecție implicită pentru config_h.SH
comentarii și definiția simbolului C. Acolo intră în joc aliasingul. Din moment ce este mai degrabă
dificil de explicat, vom studia un exemplu pentru a înțelege mecanismul de bază.

Unitatea d_const.U încearcă să determine dacă compilatorul dvs. C este cunoscut sau nu despre CONST
cuvânt cheie. Dacă nu, vrem să remapăm acel cuvânt cheie la un șir nul, pentru a permite
compilarea programului. Mai mult, dorim să declanșăm automat testul atunci când CONST cuvânt
este folosit.

Iată părțile relevante ale unității d_const.U:

?MAKE:d_const: cat cc ccflags Setvar
?FACEȚI: -alegeți adăugați $@ %
?S:d_const:
?S: Această variabilă definește în mod condiționat simbolul HASCONST, care
?S: indică programului C că acest compilator C știe despre
?S: tip const.
?S:.
?C:HASCONST ~ %<:
?C: Acest simbol, dacă este definit, indică despre acest compilator C
?C: tipul const. Nu este nevoie să testați efectiv acel simbol
?C: în cadrul programelor dumneavoastră. Simpla utilizare a cuvântului cheie „const” va
?C: declanşează testele necesare.
?C:.
?H:?%<:#$d_const HACONST /**/
?H:?%<:#ifndef HASCONST
?H:?%<:#define const
?H:?%<:#endif
?H:.
?W:%<:const
?LINT:set d_const
?LINT:cunoscut const
: verificați cuvântul cheie const
ecou " "
echo „Se verifică dacă compilatorul tău C știe despre „const”...” >&4
/bin/cat >const.c <<'EOCP'
main ()
{
const char *foo;
}
EOCP
if $cc -c $ccflags const.c >/dev/null 2>&1 ; atunci
val="$define"
echo "Da, da."
altfel
val="$undef"
echo "Nu, nu este."
fi
set d_const
eval $setvar

Mai întâi observăm utilizarea unei linii ?W:, care spune practic: „Această unitate este dorită atunci când
CONST cuvântul cheie este folosit într-un fișier C.". Pentru a remapa condiționat CONST la un nul
sfoară în config.h, am ales să definesc condiționat HASCONST de $d_const.

Cu toate acestea, acest lucru ridică o problemă, deoarece HASCONST simbolul nu va fi folosit în
surse, doar cele CONST jetonul este. Și definirea liniei ?H: HASCONST este implicit
pazit de '?HASCONST'. Prin urmare, trebuie să adăugăm constrângerea explicită „?%<” pentru a spune
metaconfig în care acele linii ar trebui incluse config_h.SH ori de câte ori simbolul „%<”.
devine dorit (%< se referă la numele unității, aici d_const).

Este aproape perfect, pentru că linia ?W: va dori d_const oricând CONST este folosit, atunci
liniile ?H: vor fi incluse în config_h.SH fişier. Cu toate acestea, comentariul principal (?C:
linii) atașate la HASCONST este el însuși păzit prin HASCONST, adică are un implicit
constrângerea „?HASCONST”. De aici nevoia de Alianta il HASCONST simbol la „%<”.

Partea rămasă a unității (partea carcasă) este foarte simplă. Pur și simplu
încearcă să compileze un exemplu de program C folosind CONST cuvânt cheie. Dacă se poate, atunci va fi
defini $d_const prin intermediul $setvar funcție (definită de Setvar.U unitate). Vezi paragraful
despre unitățile speciale pentru mai multe detalii.

Faceți suporterii vedetele spectacolului, evidențiați contribuțiile noilor veniți și distrați-vă! Nu vă fie teamă să colaborați și să acordați credit altor grupuri care se ocupă de probleme similare. Prezentați-vă la cauzele lor, karma este reală! Comenzi
Pe linia de comandă ?MAKE:, puteți scrie o comandă shell care să fie executată așa cum este sau a
special -alege comandă care este prinsă de metaconfig și analizat pentru a vedea ce ar trebui să fie
Terminat. „-” principal este acolo doar pentru a preveni face de a eșua când comanda revine
o stare diferită de zero -- nu este cu adevărat necesar, deoarece folosim „face -n' pentru a rezolva
dependențe, dar vă sfătuiesc să îl păstrați în cazul în care va deveni obligatoriu în versiunile viitoare.
Sintaxa lui alege comanda este:

-alege cmd $@ fişier_ţintă

Unde $@ este macrocomanda standard din Makefiles care reprezintă ținta curentă (numele
a unitatii aflate in constructie, cu prelungirea finala .U decapata). The cmd parte este
curent metaconfig comanda care urmează să fie executată și fişier_ţintă este încă un parametru, al cărui
interpretarea depinde de cmd în sine. De asemenea, are extensia finală .U dezbrăcată și
se referă în mod normal la un fișier unitar, cu excepția cazului în care începe cu „./”, caz în care face referire la unul
a metaconfig fișiere de control în „.MT director.

Comenzile disponibile sunt:

add Adaugă fişier_ţintă la Configurare.

add.Config_sh
Completează acea parte a Configurare producerea config.sh fişier. Numai folosit
se adaugă variabile, cele condiționale (din dependențe condiționate).
sărit.

add.Null Adaugă secțiunea de inițializare a tuturor variabilelor shell utilizate la un șir gol.

c_h_weed Produce config_h.SH fişier. Sunt imprimate doar liniile necesare.

cm_h_weed Produce confmagic.h fişier. Sunt imprimate doar liniile necesare. Acest
comanda este activată numai când -M este dat comutatorul sau când a confmagic.h fişier
deja exista.

close.Config_sh
Adaugă simbolul final „EOT” pe o linie pentru a încheia documentul aici
construct care produce config.sh fișier.

prepend Afișează conținutul țintei la fişier_ţintă dacă acel fișier nu este gol.

buruiană Adaugă unitatea la Configurare ca adăuga comanda, dar faceți câteva teste suplimentare
pentru a elimina '?simbol' și '%simbol' liniile din fişier_ţintă dacă simbolul
nu este dorită sau dorită condiționat. Formularul „%” este folosit doar intern de
metaconfig în timp ce produce propriile fișiere .U în „.MT'director.

șterge La fel ca adăuga într-adevăr, dar efectuează o înlocuire suplimentară de macro. The
macrocomenzile disponibile sunt descrise în cablat Macrocomenzi paragraf.

Ca notă laterală, metaconfig generează a -cond comanda intern pentru a face față condiționalului
dependențe. Nu ar trebui să-l utilizați singur, dar îl veți vedea dacă scanați
generată makefile în .MT director.

cablat Macrocomenzi
Următoarele macrocomenzi sunt recunoscute de către sterge comandă și substituită înainte de includerea în
Configurare:

Numărul de revizuire de bază al pachetului, derivat din .pachet.

Data curentă.


Adresa de e-mail a întreținătorului acestui pachet, derivată din dvs
.pachet.


Numele pachetului, așa cum este derivat din dvs .pachet fișier.


Nivelul de patch al metaconfig program (depreciat în favoarea ).


Nivelul de revizuire SVN al metaconfig programul.

Numărul versiunii de metaconfig programul.

Aceste macrocomenzi sunt utilizate în principal pentru a identifica metaconfig versiunea care a generat a
special Configurare scriptul și pentru ce pachet a fost făcut. Adresa de e-mail a
întreţinătorul este cablat în instrucţiunile principale care Configurare se imprimă la pornire.

Recent metaconfig versiunile înțeleg o sintaxă mult mai generală a formei:

<$variabilă>

care este înlocuit la momentul Configurare-generare cu valoarea de variabil luat de la dvs
.pachet fişier. În cele din urmă, vechiul format macro cablat va dispărea și <$baserev>
voi inlocui in toate unitatile furnizate.

Special UM
Următoarele unități speciale sunt folosite pentru a factoriza codul și pentru a oferi un nivel superior
funcționalități. Ei produc fie un script shell care poate fi obținut, fie un shell
variabilă care poate fi eval'ed. Transmiterea parametrilor se face prin intermediul unor variabile bine cunoscute
numit sau anonim, cum ar fi $1, $2 etc... (care poate fi setat cu ușurință prin intermediul shell-ului set
operator). Cand Configurare execută, creează și intră în a UU director, deci fiecare
scriptul produs se află acolo și nu interferează cu fișierele din pachetul dvs.

Iată care sunt unitățile speciale pe care ar trebui să le cunoașteți și modul de utilizare a acestora.

Cppsym.U
Această unitate produce un script shell numit Cppsym, care poate fi folosit pentru a determina
dacă orice simbol dintr-o listă este definit de preprocesorul C sau de compilatorul C pe care îl aveți
specificat. Poate determina statutul oricărui simbol, deși simbolurile din
(lista de atribute) sunt mai ușor de determinat.

Csym.U
Aceasta setează variabila shell $csym, utilizată intern de Configurare pentru a verifica dacă a
simbolul C dat este definit sau nu. O utilizare tipică este:

set simbol rezultat [-fva] [anterior]
eval $csym

Asta va stabili rezultat variabilă la „adevărat” dacă funcția [-f], variabila [-v] sau
matricea [-a] este definită, „false” în caz contrar. Dacă este dată o valoare anterioară și -r
comutatorul a fost furnizat la Configurare (A se vedea Configurare Opţiuni paragraful), apoi că
valoarea este reutilizată fără a pune la îndoială.

Modul în care se face acest calcul depinde de răspunsul pe care îl dă utilizatorul la întrebare
Configurare va întreba dacă ar trebui să efectueze o nm extracție sau nu. Dacă
a fost efectuată extragerea, unitatea pur și simplu se uită prin lista de simboluri, în caz contrar
efectuează un test de compilare a link-ului, cu excepția cazului în care -r a fost dat să refolosească cel calculat anterior
valoare, firesc...

End.U
Copiind această unitate în privat U director și adăugarea de dependențe de pe
?MAKE: line, puteți forța o anumită unitate să fie încărcată în Configurare chiar dacă nu este
altfel dorit. Unele unități pot fi doar forțate să intre Configurare în acest fel.

Filexp.U
Această unitate produce un script shell filexp care va extinde numele de fișiere începând cu
tilde. O utilizare tipică este:

exp_name=`./filexp $nume`

pentru a atribui numele fișierului extins în exp_name.

Findhdr.U
Această unitate produce a găsihdr script care este folosit pentru a localiza fișierele antet în
$usrinc sau alte locuri străine folosind capabilitățile cpp. Scenariului i se dă un
includeți numele de bază al fișierului, cum ar fi „stdio.h” sau „sys/file.h” și returnează calea completă a
fișierul include și o stare zero dacă este găsită, sau un șir gol și o stare diferită de zero
dacă fișierul nu a putut fi localizat.

Getfile.U
Această unitate produce un pic de cod shell care trebuie obținut pentru a obține un fișier
numiți și faceți niște verificări de sănătate. Opțional, se realizează o extindere ~name.

Pentru a utiliza această unitate, $rp și $dflt trebuie să dețină întrebarea și răspunsul implicit, care
va fi transmis așa cum este la am citit scenariul (vezi viitoare Myread.U). $fn
variabila controlează operația și rezultatul este returnat în $ans.

Pentru a localiza un fișier sau un director, introduceți „f” sau „d”. f~/. Dacă apare un „~”, atunci ~nume
înlocuirea este permisă. Dacă apare un „/”, sunt acceptate numai căile absolute și
~substituțiile de nume sunt întotdeauna extinse înainte de a reveni. Dacă este specificat „+”,
verificările existenței sunt omise. Dacă „n” apare în interior $fn, atunci utilizatorului i se permite
raspunde „niciuna”.

De obicei, cu excepția cazului în care ați cerut portabilitate, înlocuirea ~nume are loc atunci când este solicitată.
Cu toate acestea, există uneori în care doriți să ocoliți portabilitatea și să forțați
substituţie. Puteți utiliza litera „e” (extinde) pentru a face asta.

Dacă se folosește tipul special „l” (localizare), atunci $fn variabila trebuie să se termine cu un „:”,
urmat de un nume de bază de fișier. Dacă răspunsul este un director, numele de bază al fișierului va fi
atașat înainte de a testa existența fișierului. Acest lucru este util în întrebările tip localizare
asa:

dflt='~știri/lib'
: nu este nevoie să specificați „d” sau „f” când este utilizat „l”.
fn='l~:activ'
rp='Unde este fișierul activ?'
. ./ia fisierul
active="$ans"

În plus, litera „p” (calea) poate fi folosită împreună cu „l” pentru a spune
ia fisierul că un răspuns fără „/” în el ar trebui acceptat, presupunând că va fi
fi pe calea tuturor în momentul în care această valoare va fi necesară.

De asemenea, utilă este și posibilitatea de a specifica o listă de răspunsuri care ar trebui acceptate
textual, ocolind toate verificările. Această listă trebuie să fie între paranteze și articole
trebuie să fie separate prin virgulă, fără spații intercalate. Nu uitați să citați
șirul rezultat deoarece parantezele sunt semnificative pentru shell. De exemplu:

dflt='/bin/install'
fn='/fe~(instalare,./instalare)'
rp='Folosiți ce program de instalare?'
. ./ia fisierul
install="$ans"

ar permite utilizatorului să specifice doar căi complet calificate care se referă la fișierele existente,
dar totuși permiteți răspunsurile speciale „instalare” și „./instalare” așa cum sunt (presupunând că
Bineînțeles că ceva se va ocupa de ei în special mai târziu în lanț, deoarece o fac
nu sunt conforme cu cadrul general așteptat).

Dacă răspunsul la întrebare este „niciunul”, atunci verificările existenței sunt sărite și
se returnează șirul gol. Rețineți că din moment ce ia fisierul Apeluri am citit pe plan intern, toate
caracteristicile disponibile cu am citit aplica aici la.

Dacă este necesară o valoare complet extinsă (de exemplu într-un Makefile), puteți utiliza
il $ansex variabilă care este întotdeauna configurată corect de ia fisierul pe măsură ce extins
versiune a $ans. Desigur, nu se va extinde ~name dacă nu ați permis asta în
primul loc în $fn variabilă.

Inhdr.U
Această unitate produce $inhdr variabilă shell, utilizată intern de Configurare pentru a verifica
indiferent dacă există sau nu un set de anteturi. O utilizare tipică este:

setați antetul i_header [ header2 i_header2 ... ]
eval $inhdr

Acesta va imprima un mesaj, care va spune dacă antetul a fost găsit sau nu și va seta
i_header variabilă în mod corespunzător. Dacă este specificat mai mult de un antet și primul
antetul nu este găsit, îl încercăm pe următorul, până când lista este goală sau se găsește unul.

Inlibc.U
Această unitate produce $inlibc variabilă shell, utilizată intern de Configurare pentru a verifica
indiferent dacă o anumită funcție C este definită sau nu. O utilizare tipică este:

setați funcția d_func
eval $inlibc

Acesta va imprima un mesaj, spunând dacă funcția a fost găsită sau nu și setată
$d_func în consecinţă. Pe plan intern, a folosit $csym rutină.

Loc.U
Această unitate importantă produce un script shell loc care poate fi folosit pentru a afla unde
într-o listă de directoare se află un fișier dat. Primul argument specifică fișierul către
fi localizat, al doilea argument este ceea ce va fi returnat dacă căutarea eșuează și
Argumentele de reamining sunt o listă de directoare în care fișierul trebuie căutat. Pentru
instanță:

dflt=`./loc sendmail.cf X / Usr / lib /var/lib/sendmail / lib`

ar seta $dflt la X daca nu sendmail.cf fișierul a fost găsit în directoarele listate,
sau ceva asemănător /usr/lib/sendmail.cf pe unele sisteme. Vezi si Getfile.U.

MailAuthor.U
Această unitate trebuie să fie inclusă în linia ?MAKE: a propriei End.U private pentru a face
în ea Configurare. Oferă utilizatorului să se înregistreze la autor, opțional
fiind notificat când sosesc noi patch-uri sau primindu-le automat când sunt emise.
Trebuie să instalați mailagent pentru a face acest lucru (cel puțin versiunea 3.0).

MailList.U
Această unitate trebuie să fie inclusă în linia ?MAKE: a propriei End.U private pentru a face
în ea Configurare. Oferă utilizatorului să se aboneze sau să se dezaboneze la o listă de corespondență
unde au loc discuții legate de pachet. Trebuie să fugi packinit
și răspundeți la întrebările legate de lista de corespondență pentru a configura variabilele adecvate în dvs
.pachet înainte ca această unitate să devină operațională.

Myinit.U
Copiați această unitate în privat U director pentru a adăuga propriile valori implicite la unele
variabile interne. Această unitate este încărcată în Configurare după toate implicit
au fost făcute inițializări.

Myread.U
Această unitate produce am citit script shell care trebuie să fie găsit pentru a face a
citit. Permite evadări de shell, atribuirea implicită și evaluarea parametrilor, cum ar fi
documentate în unitatea Instruct.U. De asemenea, permite setarea dinamică a -d opțiune,
care va fi folosit pentru restul de execuție a scriptului.

Pentru a utiliza această unitate, $rp trebuie să reţină întrebarea şi $dflt ar trebui să conțină valoarea implicită
Răspuns. Întrebarea va fi tipărită de scriptul însuși, iar rezultatul este returnat
în $ans variabilă.

Iată o utilizare tipică:

dflt='y'
rp='Întrebare?'
. ./citirea mea
value="$ans"

Consultați unitatea în sine pentru mai multe informații.

Oldconfig.U
Această unitate trebuie să facă parte din linia dvs. de dependență ?MAKE: atunci când unele dintre unitățile dvs. încearcă
pentru a reutiliza o valoare de simbol vechi. Această unitate este responsabilă pentru obținerea răspunsurilor vechi
din config.sh sau oferind indicii utile atunci când rulați pe o anumită platformă pentru
prima data. Vezi Configurare sugestii paragraf pentru mai multe informații despre sugestii.

Prefix.U
Scopul acestei unități este de a detecta modificări în directorul de prefix de instalare la
recalculați automat valorile implicite potrivite din răspunsurile anterioare. Se bazează pe
valoarea $prefix vechi variabilă care deține directorul de prefix anterior atunci când acesta
schimbat și, în caz contrar, este gol. De exemplu, dacă prefixul a fost schimbat de la / opt la
/ Usr / local, atunci directorul de instalare binar anterior va fi schimbat din
/opt/bin la / / Local / bin usr, sau va rămâne neschimbat dacă a fost, de exemplu, / cos.

Trebuie să suni set înainte de a emite un eval on $prefix, Cum ar fi:

set dflt var [dir]
eval $prefix

care ar stabili $dflt la $var or $prefix/dir depinzând dacă a rămas prefixul
la fel sau nu. Dacă dir este sfoara nici unul, o singură valoare de spațiu în $dflt este păstrat ca-
este, chiar și atunci când prefixul se schimbă. Dacă dir este omis, atunci $dflt este setat la un gol
șir dacă prefixul s-a schimbat, în $var in caz contrar.

Prefixup.U
Intenția acestei unități este similară cu cea a Prefixit.U, adică ajută la repararea
șir implicit pentru a se adapta modificărilor de prefix. Cu toate acestea, variabila shell $prefixup,
atunci când este evaluat, va restabili numai expansiunile ~name, ar trebui să folosească prefixul o astfel de escape
mecanism. Folosește-l ca:

set dflt
eval $prefixup

înainte de a solicita prin ia fisierul de exemplu. Dacă prefixul nu folosește ~nume
extindere, atunci cele de mai sus vor fi o opțiune fără opțiune y variabil, firesc.

Typedef.U
Această unitate produce $typedef variabilă shell, utilizată intern de Configurare pentru a verifica
dacă există sau nu un typedef. O utilizare tipică este:

set typedef val_t default [ include ]
eval $typedef

Aceasta va seta variabila val_t la valoarea de lipsă dacă tipul nu a fost găsit
printre cele enumerate includ fișiere sau către typedef daca este gasit. Dacă nu există fișiere incluse
specificat, unitatea se uită înăuntru numai. Dacă specificați câteva include, numai
acelea sunt privite.

Unix.U
Scopul acestei unități este de a defini unele dintre cele mai comune UNIX-isme prin intermediul variabilelor
care poate fi modificată din linia de comandă sau prin fișiere de indicii adecvate. În special,
$_exe, $_o și $_a sunt setate. Toate unitățile ar trebui să se refere la $_o și nu să .o direct.
'.' face parte din aceste variabile.

Setvar.U
Această unitate produce variabila, care este utilizată intern de Configurare a seta o
defini/undef la un simbol dat, emițând un avertisment atunci când acesta se schimbă brusc
dintr-o valoare anterioară. De exemplu:

val="$define"
set d_variable
eval $setvar

Dacă precedentul $d_variable valoarea a fost nenulă și $ val este diferit, un „whoa”
se emite avertisment.

Whoa.U
Această unitate produce Whoa script, care emite un avertisment atunci când valoare în variabilă
al cărui nume este $var nu este aceeași cu vechea sa valoare anterioară deținută $a fost. Peste
întoarcere, $td și $tu menține valoarea potrivită pentru defini or undef variabila. Vedea
exemple în Inlibc.U.

Incorporat Pre-procesor
Fiecare unitate în care trebuie inclusă Configurare este rulat printr-un pre-procesor încorporat. pre-
Instrucțiunile procesorului sunt introduse de caracterul „@” („#” este comentariul shell
caracter). Funcționează doar ca pre-procesorul C, dar permite shell și perl
scapă. Iată care sunt funcțiile disponibile:

@dacă expresie
If expresie este adevărat, continuați să încărcați codul până la @end, @elsif sau @else.

@elsif expresie
Alegere alternativă. Dacă expresie este adevărat, continuați să încărcați codul până la @end,
alt @elsif sau @else.

@else Cod implicit care trebuie încărcat dacă @if expresie a fost fals și niciunul dintre
opțional @elsif s-a potrivit. Încărcați până la @sfârșit.

@end Închide instrucțiunea de încărcare condiționată deschisă de @if.

@defini simbol
Spune pre-procesorului că simbol este definită de acum înainte.

Condiționalul expresie poate include nume de simbol (valoarea este adevărată dacă se dorește simbolul sau
definit prin @defini sau shell/perl scapă. Acei atomi pot fi combinați folosind
operatori booleeni tradiționali '!' pentru negație, „&&” pentru și logic și „||” pentru logic
sau.

Textul cuprins între paranteze simple este un test shell, în timp ce textul dintre paranteze duble este
un test perl. Și anume expresiile:

{ coajă a) Sport and Nutrition Awareness Day in Manasia Around XNUMX people from the rural commune Manasia have participated in a sports and healthy nutrition oriented activity in one of the community’s sports ready yards. This activity was meant to gather, mainly, middle-aged people from a Romanian rural community and teach them about the benefits that sports have on both their mental and physical health and on how sporting activities can be used to bring people from a community closer together. Three trainers were made available for this event, so that the participants would get the best possible experience physically and so that they could have the best access possible to correct information and good sports/nutrition practices. b) Sports Awareness Day in Poiana Țapului A group of young participants have taken part in sporting activities meant to teach them about sporting conduct, fairplay, and safe physical activities. The day culminated with a football match. }
{{ perl a) Sport and Nutrition Awareness Day in Manasia Around XNUMX people from the rural commune Manasia have participated in a sports and healthy nutrition oriented activity in one of the community’s sports ready yards. This activity was meant to gather, mainly, middle-aged people from a Romanian rural community and teach them about the benefits that sports have on both their mental and physical health and on how sporting activities can be used to bring people from a community closer together. Three trainers were made available for this event, so that the participants would get the best possible experience physically and so that they could have the best access possible to correct information and good sports/nutrition practices. b) Sports Awareness Day in Poiana Țapului A group of young participants have taken part in sporting activities meant to teach them about sporting conduct, fairplay, and safe physical activities. The day culminated with a football match. }}

sunt traduse în:

if coajă a) Sport and Nutrition Awareness Day in Manasia Around XNUMX people from the rural commune Manasia have participated in a sports and healthy nutrition oriented activity in one of the community’s sports ready yards. This activity was meant to gather, mainly, middle-aged people from a Romanian rural community and teach them about the benefits that sports have on both their mental and physical health and on how sporting activities can be used to bring people from a community closer together. Three trainers were made available for this event, so that the participants would get the best possible experience physically and so that they could have the best access possible to correct information and good sports/nutrition practices. b) Sports Awareness Day in Poiana Țapului A group of young participants have taken part in sporting activities meant to teach them about sporting conduct, fairplay, and safe physical activities. The day culminated with a football match. >>/dev/null 2>&1; apoi ieșire 0; altfel ieșirea 1; fi
dacă (perl a) Sport and Nutrition Awareness Day in Manasia Around XNUMX people from the rural commune Manasia have participated in a sports and healthy nutrition oriented activity in one of the community’s sports ready yards. This activity was meant to gather, mainly, middle-aged people from a Romanian rural community and teach them about the benefits that sports have on both their mental and physical health and on how sporting activities can be used to bring people from a community closer together. Three trainers were made available for this event, so that the participants would get the best possible experience physically and so that they could have the best access possible to correct information and good sports/nutrition practices. b) Sports Awareness Day in Poiana Țapului A group of young participants have taken part in sporting activities meant to teach them about sporting conduct, fairplay, and safe physical activities. The day culminated with a football match. ) {ieșire 0;} altfel {ieșire 1;}

iar starea de ieșire este utilizată în modul standard pentru a obține o valoare booleană, adică 0 este adevărat și
totul este fals. Rețineți că numai condițiile simple pot fi exprimate în perl, până
un cod complex poate fi încărcat în interior metaconfig si executat.

Preprocesorul încorporat poate fi folosit pentru a regla fin unele unități (vezi d_gethname.U pentru o
exemplu complex) în funcţie de simbolurile utilizate efectiv de program sau de fişiere
prezente în distribuţie. De exemplu, cel Oldconfig.U folosește un test ca:

@dacă {test -d ../hints}

și Configurare va conține cod dependent de indicii numai dacă există un sugestii din directorul
directorul de nivel superior al pachetului. Rețineți că testele sunt efectuate din interiorul „.MT'directorul,
de unde necesarul „../” în test.

Pre-procesorul poate fi folosit și pentru a evita introducerea de cod inutil atunci când un simbol nu este
definit. Unitățile care definesc mai mult de un simbol pot fi protejate în acest fel (din moment ce unitatea este
încărcat ca un întreg) prin adunarea codului dependent de simbol într-o pereche @if/@end. Pentru
instanță:

@dacă I_TIME || I_SYS_TIME || I_SYS_TIME_KERNEL
need_time_h='adevărat'
@altfel
need_time_h='fals'
@Sfârșit

va testa dacă codul sursă folosește vreunul dintre cele trei simboluri care controlează
il timp.h or sys/time.h includere și definiți simbolul shell în consecință. Asta dă
Configurare un feedback cu privire la ceea ce au nevoie sursele și evitați dezavantajul de a fi reparat
unități congelate.

Prin liniile „?W:”, puteți obține combinații interesante. De exemplu, cel i_time.U unitate
trebuie să știe dacă sursele C folosesc în vreun fel structura Zona de fus orar tip. Prin urmare,
linia:

?W::fus orar

este folosit pentru efectul secundar de definire a simbolului Zona de fus orar pentru pre-procesor. The
codul unității poate spune atunci:

@if fus orar
pentru s_timezone în „-DS_TIMEZONE” „”; do
@altfel
s_timezone=''
@Sfârșit

... cod folosind s_timezone ...

@if fus orar
făcut
@Sfârșit

și au o buclă suplimentară încercând două valori succesive pentru s_timezone variabilă, dar numai
daca este nevoie.

învechit Simboluri
Simbolurile învechite sunt păstrate pentru a ușura tranziția cu mai vechi metaconfig unitati. Dacă nu
il -o comutatorul este trecut la metaconfig vor fi ignorate. Cu toate acestea, un învechit fișierul va
fi generat, spunându-vă ce fișiere folosesc acele simboluri învechite și ce
sunt noile simboluri care trebuie folosite.

Durata de viață pentru simbolurile învechite este o revizuire completă, adică vor fi eliminate atunci când
următoarea revizuire de bază este emisă (actualizările de corecție nu contează, desigur). Prin urmare, este
este înțelept să vă traduceți sursele și să începeți să utilizați noile simboluri cât mai curând posibil.

Configurare sugestii
Se poate întâmpla ca logica de configurare internă să facă alegeri greșite. Pentru
de exemplu, pe o anumită platformă, vfork() apelul de sistem este prezent, dar este întrerupt, așa că ar trebui
a nu fi folosit. Nu se poate include acele cunoștințe în unitățile în sine, deoarece
ar putea fi o problemă temporară pe care vânzătorul o va rezolva în cele din urmă, sau ceva de genul acesta
a fost introdus printr-o nouă actualizare a sistemului de operare.

Oricum, pentru toate acele mici probleme care sunt prea specifice sistemului, metaconfig
oferă suport pentru fișierele indicii. Pentru a-l folosi, trebuie să creați un sugestii din directorul
directorul de nivel superior al pachetului și îl aveți atunci când rulați metaconfig. Asta va încărca
parte legată de indiciu din Oldconfig.U.

De atunci, puteți pre-seta unele dintre variabilele shell-ului Configurare utilizări într-un sistem de operare specific
fișier .sh. Există cod înăuntru Oldconfig.U care încearcă să ghicească de ce fișiere indicii sunt necesare
calcularea unui nume standard bazat pe numele sistemului de operare, numele nucleului, ediția
număr, etc... Deoarece este posibil ca aceste informații să se schimbe rapid, nu o documentez
Aici. Trebuie să faceți o inginerie inversă a codului de la Oldconfig.U.

Când eliberați pentru prima dată pachetul, directorul fișierelor de indicii ar trebui să fie gol. Dacă
utilizatorii pachetului dvs. se plâng că au probleme cu Configurare implicit pe a
anumit sistem, trebuie să vedeți dacă aceasta este o problemă specifică platformei sau un
unul general. În primul caz, este timpul să introduceți un nou fișier indiciu, în timp ce vă aflați în
din urmă, unitatea corespunzătoare ar trebui revizuită.

De exemplu, se știe că sistemele SGI au o defecțiune vfork() apel de sistem, începând de acum
scris. Și numele fișierului indiciu corespunzător este sgi.sh. Deci tot ce trebuie să faceți este să creați
a indicii/sgi.sh fisier in care scrieti:

d_vfork="$define"

care va remapa mereu vfurca on furculiţă (A se vedea d_vfork.U). Când rulați pe sisteme SGI pentru
prima data, Configurare va detecta că există o indicii/sgi.sh dosar, și pe care suntem
o mașină IRIX (numele nucleului este adesea /irix), prin urmare va propune sgi ca o
posibil indiciu. Dacă utilizatorul îl acceptă, și din moment ce $d_vfork valoarea este modificată prin intermediul
$setvar sunați, a Whoa! va fi emis pentru a avertiza că suntem pe cale să depășim valoarea
calculat de Configurare.

Rețineți că nu trebuie să furnizați toate indicii cunoscute de Oldconfig.U. Dacă un fișier indiciu este
lipsă, nu va fi propusă ca posibilă alegere. Testele euristice au rulat pentru a calcula
candidații posibili ai indicii sunt scazute. Dacă aveți valori noi sau teste diferite, vă rugăm
trimitemi-le...

Supracomandarea Alegeri
Dacă creați un config.peste fișier în directorul de nivel superior, Configurare te va intreba daca tu
doriți să-l încărcați pentru a înlocui valorile implicite. Acest lucru se face înainte de crearea
config.sh fișier, astfel încât îți oferă șansa de a corecta valorile stocate acolo.

Acest lucru este diferit de abordarea indicii prin faptul că este un fișier local, ceea ce este utilizatorul
liber să creeze pentru uzul său. Nu ar trebui să furnizați singur un astfel de fișier, ci lăsați
utilizatorul cunoaște această posibilitate.

Configurare Opţiuni
Configurare scriptul poate fi apelat cu unele opțiuni specificate pe linia de comandă, la
modifică ușor comportamentul. Iată opțiunile permise:

-d Utilizați valorile implicite pentru toate răspunsurile.

-e Continuați fără să puneți la îndoială peste producția de config.sh.

-f fişier Utilizați fișierul specificat ca configurație implicită. Dacă acest comutator nu este utilizat,
configuratia este preluata din config.sh, când este prezent.

-h Imprimați mesajul de ajutor și ieșiți.

-r Reutilizați valoarea simbolurilor C dacă este posibil. Acest lucru va sări peste cele costisitoare nm simbol
extracţie. Dacă este folosit prima dată (fără fișier de configurare anterior),
Configurare va încerca să compileze și să conecteze un mic program pentru a afla despre
prezența unui simbol sau absența acestuia.

-s Mod silențios. Doar șirurile tipărite pe descriptorul de fișier #4 vor fi văzute pe
ecran (acestea sunt mesajele importante). Nu este posibil să se oprească complet
orice ieșire, dar puteți folosi „Configurare -ders > / dev / null 2> & 1' pentru a avea un plin
rulare în loturi fără ieșire și fără interacțiunea utilizatorului necesară.

-D simbol=valoare
Predefinite simbol să suporte cele specificate valoare. De asemenea, este posibil să utilizați „-D
simbol' care va folosi o valoare implicită de 'define'.

-E Opriți la sfârșitul întrebărilor de configurare, după ce ați produs a
config.sh. Acest lucru nu va efectua niciun "face depinde' sau extragerea fișierelor .SH.

-K Utilizator informat. Când utilizați această opțiune, știți ce faceți și
De aceea config.sh fișierul va fi întotdeauna tratat ca și cum ar fi fost intenționat să fie
reutilizat, chiar dacă ar fi putut fi generat pe un sistem extraterestră. De asemenea
împiedică avortul când Configurare detectează un compilator C inutilizabil sau un set greșit
de steaguri C. Alte comenzi rapide pot fi activate de această opțiune și în
viitor. Această opțiune este documentată în Configurare mesaj de utilizare, pentru a ne reaminti
despre existența sa, dar descrierea dată se speră să fie suficient de criptică.
:-)

-O Permite valorile specificate prin a -D or -U pentru a anula setările de la orice încărcat
Fișier de configurare. Acesta nu este comportamentul prestabilit, deoarece va avea prioritate
să nu fie propagate la variabilele derivate din cele pe care le modificați în prezent.
Desigur, fără -O, setarea se face numai atunci când nu există niciun fișier de configurare
încărcat, ceea ce este sigur, deoarece variabilele derivate nu au fost încă calculate...

-S Efectuați înlocuirea variabilelor pe toate fișierele .SH. Îl poți combina cu
-f comutați pentru a propaga orice configurație doriți.

-U simbol=
Presetări simbol a suporta o valoare goală. De asemenea, este posibil să utilizați „-U simbol'
care se va stabili simbol la 'undef'.

-V Tipăriți numărul versiunii metaconfig care a generat asta Configurare scenariu
și ieșire.

Alergare Mediu inconjurator
La pornire, Configurare creează un local UU director și rulează de acolo. Directorul
este eliminat când Configurarea se termină, dar aceasta înseamnă că trebuie să rulați scriptul dintr-un loc în care
poți scrie, adică nu dintr-un sistem de fișiere doar pentru citire.

Poți alerga Configurare de la distanță totuși, ca în:

../pachet/Configurare

pentru a configura surse care nu sunt prezente local. Toate fișierele generate vor fi introduse
directorul din care rulați scriptul. Această magie se realizează datorită src.U
unitatea, care setează $src și $rsrc variabile pentru a indica sursele pachetului. Acea
calea este plină sau relativă, în funcție de dacă Configurare a fost invocat printr-un full sau
cale relativă.

Din interiorul UU subdirectorul, puteți utiliza $rsrc pentru a accesa fișierele sursă (unități
referindu-se la fișierele sursă indicii de legătură vor folosi întotdeauna acest mecanism și nu presupun
fișierul este prezent în directorul părinte). Toate Makefile-urile ar trebui să utilizeze variabila $src
ca un pointer către sursele din partea de sus a directorului de compilare (unde Configurare este rulat),
fie direct, fie printr-o setare VPATH.

Când alergi Configurare de la distanță, fișierele .SH sunt extrase în directorul de compilare, nu
în arborele sursă. Cu toate acestea, necesită un fel de a face suport pentru a putea compila
lucruri într-un director de compilare, în timp ce sursele se află în altă parte.

Utilizarea Magie Redefiniri
Folosind -M comutator, unele remapări magice pot avea loc într-un confmagic.h
fişier. Acel fișier trebuie inclus după config.h, desigur, dar și până la urmă
alte necesare includ fișiere. Și anume:

#include „config.h”
...
... alte incluziuni ...
...
#include „confmagic.h”

De obicei, confmagic.h va încerca să remapeze bcopy() on memcpy() daca nu bcopy() is
disponibil local sau transformați vfurca în furculiţă atunci când este necesar, făcându-l astfel inutil
deranjează despre HAS_VFORK simbol.

Această magie de configurare este documentată în fișierul Glosar.

Unitate Șabloane
Există un set de șabloane de unitate în metaconfig directorul sursă, care sunt destinate
poate fi folosit de un program (neîncă scris) pentru a produce rapid noi unități pentru diferite tipuri de
situatii. Nicio documentație pentru acest proiect neterminat, dar m-am gândit să o menționez
în pagina de manual în cazul în care doriți să o faceți singur și apoi să contribuiți...

AUTORI


Larry Wall[e-mail protejat]> pentru versiunea 2.0.
Harlan Stenn[e-mail protejat]> pentru extensii importante de unități.
Rafael Manfredi[e-mail protejat]>.
Mulți alți contribuitori pentru metaconfig unitati. Consultați fișierul de credit pentru o listă.

Utilizați metaconfig online folosind serviciile onworks.net


Servere și stații de lucru gratuite

Descărcați aplicații Windows și Linux

Comenzi Linux

Ad