Questo è il comando mkplan9 che può essere eseguito nel provider di hosting gratuito OnWorks utilizzando una delle nostre molteplici workstation online gratuite come Ubuntu Online, Fedora Online, emulatore online Windows o emulatore online MAC OS
PROGRAMMA:
NOME
mk - mantiene (crea) i file correlati
SINOSSI
mk [ -f mkfile ] ... [ opzione ... ] [ bersaglio ... ]
DESCRIZIONE
Mk usa le regole di dipendenza specificate in mkfile per controllare l'aggiornamento (di solito da
compilazione) di obiettivi (di solito file) dai file di origine da cui dipendono. Il
mkfile (l'impostazione predefinita contiene a regola per ogni target che identifica i file e altro
obiettivi da cui dipende e un sh(1) sceneggiatura, a ricetta, per aggiornare la destinazione. Il
lo script viene eseguito se il target non esiste o se è più vecchio di uno qualsiasi dei file che esso
dipende da. Mkfile può anche contenere meta-regole che definiscono azioni per l'aggiornamento implicito
obiettivi. se no bersaglio è specificato, l'obiettivo della prima regola (non meta-regola) in
mkfile è aggiornato.
La variabile d'ambiente $NPROC determina quanti target possono essere aggiornati contemporaneamente;
Alcuni sistemi operativi, ad es. Plan 9, set $NPROC automaticamente al numero di CPU accese
la macchina attuale.
Le opzioni sono:
-a Supponiamo che tutti gli obiettivi non siano aggiornati. Quindi, tutto è aggiornato.
-d[ad es] Produce output di debug (p è per l'analisi, g per la costruzione di grafici, e da
esecuzione).
-e Spiega perché ogni obiettivo è stato creato.
-i Forza la creazione di eventuali bersagli intermedi mancanti.
-k Fai quanto più lavoro possibile di fronte agli errori.
-n Stampa, ma non esegue, i comandi necessari per aggiornare i target.
-s Crea gli argomenti della riga di comando in sequenza anziché in parallelo.
-t Toccare (aggiornare la data modificata di) file target, senza eseguire alcuna ricetta.
-wtarget1,obiettivo2,...
Fai finta che il tempo di modifica per ciascuno bersaglio è l'ora corrente; utile insieme
con -n per sapere quali aggiornamenti verrebbero attivati modificando il obiettivi.
. mkfile
A mkfile consiste di assegnazioni (descritto in "Ambiente") e norme. Una regola
contiene obiettivi e coda. Un target è una stringa letterale e normalmente è un nome di file.
La coda contiene zero o più prerequisiti e un optional ricetta, che è un conchiglia
sceneggiatura. Ogni riga della ricetta deve iniziare con uno spazio bianco. Una regola prende la forma
obiettivo: prereq1 prereq2
ricetta utilizzando prerequisito1, prerequisito2 a costruire bersaglio
Quando la ricetta viene eseguita, il primo carattere di ogni riga viene cancellato.
Dopo i due punti sulla riga di destinazione, una regola può specificare gli attributi, descritto sotto.
A meta-regola ha un obiettivo della forma A%B where A e B sono stringhe (possibilmente vuote). UN
la meta-regola agisce come una regola per qualsiasi potenziale bersaglio il cui nome corrisponde A%B con % sostituito
da una stringa arbitraria, chiamata stelo. Nell'interpretare una meta-regola, la radice è
sostituito per tutte le occorrenze di % nei nomi dei prerequisiti. Nella ricetta di un meta-
regola, la variabile d'ambiente $radice contiene la stringa che corrisponde a %. Ad esempio, a
meta-regola per compilare un programma C usando 9c(1) potrebbe essere:
%: %.C
9c -c $radice.c
9l -o $radice $radice.o
Le meta-regole possono contenere una e commerciale & piuttosto che un segno di percentuale %. UN % corrisponde a un massimo
stringa di lunghezza di qualsiasi carattere; un & corrisponde a una stringa di lunghezza massima di qualsiasi carattere
tranne il punto o la barra.
Il testo del mkfile viene elaborato come segue. Righe che iniziano con < seguito da un file
name sono sostituiti dal contenuto del file denominato. Righe che iniziano con <| seguito da
un nome di file sono sostituiti dall'output dell'esecuzione del file nominato. Righe vuote
e commenti, che vanno da non quotati # i caratteri alla nuova riga successiva vengono eliminati.
La sequenza di caratteri barra rovesciata-nuova riga viene eliminata, quindi righe lunghe in mkfile può essere
piegato. Le righe non di ricetta vengono elaborate sostituendo `{command} l'uscita del
command quando corri da sh. I riferimenti alle variabili sono sostituiti dai valori delle variabili.
I caratteri speciali possono essere citati utilizzando le virgolette singole '' come in sh(1).
Le assegnazioni e le regole si distinguono per la prima occorrenza non quotata di : (regola) o =
(Incarico).
Una regola successiva può modificare o sovrascrivere una regola esistente nelle seguenti condizioni:
- Se gli obiettivi delle regole corrispondono esattamente e una regola contiene solo un prerequisito
clausola e nessuna ricetta, la clausola viene aggiunta ai prerequisiti dell'altra regola.
Se uno o entrambi i target sono virtuali, la ricetta viene sempre eseguita.
- Se gli obiettivi delle regole corrispondono esattamente e i prerequisiti non corrispondono e
entrambe le regole contengono ricette, mk segnala un errore di ``ricetta ambigua''.
- Se l'obiettivo e i prerequisiti di entrambe le regole corrispondono esattamente, la seconda regola
sovrascrive il primo.
Ambiente
Le regole possono fare uso di variabili d'ambiente della shell. Un riferimento legale del modulo $OBJ or
${nome} è espanso come in sh(1). Un riferimento del modulo ${nome:A%B=CD}Durante la serata, A, B, C,
D sono stringhe (possibilmente vuote), ha il valore formato espandendo $nome e sostituendo C
da A e D da B in ogni parola in $nome che corrisponde al modello A%B.
Le variabili possono essere impostate tramite assegnazioni del modulo
var=[attr=]APPREZZIAMO
spazi vuoti nel APPREZZIAMO spezzalo in parole. Tali variabili vengono esportate nell'ambiente
delle ricette man mano che vengono eseguite, a meno che U, l'unico attributo legale attra, è presente. Il
il valore iniziale di una variabile è preso (in ordine crescente di precedenza) dal default
valori inferiori, mk's ambiente, il file mke qualsiasi assegnazione della riga di comando come
argomento a mk. Un argomento di assegnazione variabile sovrascrive il primo (ma non nessuno)
successiva) assegnazione a quella variabile.
La variabile MKFLAG contiene tutti gli argomenti dell'opzione (argomenti che iniziano con o
contenente e MKARG contiene tutti i target della chiamata a mk.
La variabile MK SHELL contiene la riga di comando della shell mk utilizza per eseguire le ricette. Se il primo
la parola del comando finisce in rc or rcsh, mk usa rc(1) le regole di citazione; altrimenti usa
sh(1) di. Il MK SHELL la variabile viene consultata quando viene letto il file mk, non quando lo è
eseguito, in modo che diverse shell possano essere utilizzate all'interno di un singolo file mk:
MKSHELL=$PIANO9/bin/rc
usa-rc:V:
for(i in abc) echo $i
MKSHELL=sh
usa-sh:V:
per io in abc; fai echo $i; fatto
Mkfile inclusi tramite < or <| (qv) vedere la propria copia privata di MK SHELL, che sempre
inizia impostato su sh .
Le informazioni dinamiche possono essere incluse nel file mk utilizzando una riga del modulo
<|command args
Questo esegue il comando command con gli argomenti dati args e convoglia il suo output standard
a mk da includere come parte del file mk. Ad esempio, i kernel Inferno usano questo
tecnica per eseguire un comando shell con uno script awk e un file di configurazione come argomenti
al fine di awk script per elaborare il file e generare un insieme di variabili e le loro
valori.
Durante l'esecuzione, mk determina quali obiettivi devono essere aggiornati e in quale ordine costruire
, il nomi specificato sulla riga di comando. Quindi esegue le ricette associate.
Un obiettivo è considerato aggiornato se non ha prerequisiti o se tutti i suoi prerequisiti
sono aggiornati ed è più recente di tutti i suoi prerequisiti. Una volta che la ricetta per un bersaglio
ha eseguito, l'obiettivo è considerato aggiornato.
Il timbro della data utilizzato per determinare se un obiettivo è aggiornato viene calcolato in modo diverso per
diversi tipi di obiettivi. Se un obiettivo è virtuale (l'obiettivo di una regola con il V
attributo), la sua data è inizialmente zero; quando il target viene aggiornato il timbro della data è
impostato sulla data più recente dei suoi prerequisiti. Altrimenti, se un obiettivo non lo fa
esiste come file, la sua data è impostata sulla data più recente dei suoi prerequisiti,
o zero se non ha prerequisiti. Altrimenti, il target è il nome di un file e il
la data di destinazione è sempre la data di modifica di quel file. Il timbro della data è calcolato
quando il target è necessario nell'esecuzione di una regola; non è un valore statico.
Gli obiettivi inesistenti che hanno prerequisiti e sono essi stessi prerequisiti vengono trattati
appositamente. Tale obiettivo t viene data la data del suo prerequisito più recente e se
questo causa tutti i bersagli che hanno t come prerequisito per essere aggiornati, t is
considerato aggiornato. Altrimenti, t è fatto nel modo normale. Il -i sostituzioni bandiera
questo trattamento speciale.
I file possono essere creati in qualsiasi ordine che rispetti le restrizioni precedenti.
Una ricetta viene eseguita fornendo la ricetta come input standard al comando /bin/sh.
(Nota che a differenza di make, mk alimenta l'intera ricetta al guscio piuttosto che eseguirli ciascuno
riga della ricetta separatamente.) L'ambiente è aumentato dalle seguenti variabili:
$ tutto l'obiettivo tutti gli obiettivi di questa regola.
$nuovo prereq i prerequisiti che hanno causato l'esecuzione di questa regola.
$nuovo membro i prerequisiti che sono membri di un aggregato che ha causato questa regola per
eseguire. Quando i prerequisiti di una regola sono membri di un aggregato,
$nuovo prereq contiene il nome dei membri aggregati e scaduti, mentre
$nuovo membro contiene solo il nome dei membri.
$nproc lo slot di processo per questa ricetta. Soddisfa 0≤$nproc<$NPROC.
$pid l'ID di processo per il mk l'esecuzione della ricetta.
$ prerequisito tutti i presupposti per questa regola.
$radice se questa è una meta-regola, $radice è la stringa che corrisponde % or &. Altrimenti,
è vuoto. Per le meta-regole delle espressioni regolari (vedi sotto), le variabili
sono impostati sulle sottoespressioni corrispondenti.
$ obiettivo gli obiettivi di questa regola che devono essere rifatti.
Queste variabili sono disponibili solo durante l'esecuzione di una ricetta, non durante la valutazione
, il mkfile.
A meno che la regola non abbia il Q attributo, la ricetta viene stampata prima dell'esecuzione con
variabili di ambiente riconoscibili espanse. Comandi che restituiscono lo stato di errore causa mk a
terminare.
Ricette e backquoted rc i comandi in luoghi come i compiti vengono eseguiti in una copia di mk's
ambiente; le modifiche apportate alle variabili d'ambiente non sono visibili da mk.
La sostituzione di variabile in una regola viene eseguita quando la regola viene letta; sostituzione variabile in
la ricetta viene eseguita quando la ricetta viene eseguita. Per esempio:
bar=ac
pippo: $bar
$CC -o pippo $bar
bar=bc
compilerà bc ai miglioramenti foo, Se corrente alternata è più recente di foo.
aggregati
Nomi del modulo a(b) fare riferimento al membro b dell'aggregato a. Attualmente, l'unico
gli aggregati supportati sono 9ar (Vedi 9c(1)) archivi.
Attributi
I due punti che separano il bersaglio dai prerequisiti possono essere immediatamente seguiti da
gli attributi e un altro colon. Gli attributi sono:
D Se la ricetta esce con uno stato non nullo, il target viene eliminato.
E Continua l'esecuzione se la ricetta genera errori.
N Se non c'è nessuna ricetta, il target ha il suo tempo aggiornato.
n La regola è una meta-regola che non può essere una destinazione di una regola virtuale. Solo file
corrisponda al modello nell'obiettivo.
P I personaggi dopo il P fino alla conclusione : sono presi come un nome di programma. Esso
sarà invocato come sh -c prog 'arg1' 'arg2' e dovrebbe restituire uno stato di uscita zero se
e solo se arg1 è aggiornato rispetto a arg2. I timbri della data sono ancora
propagato in modo normale.
Q La ricetta non viene stampata prima dell'esecuzione.
R La regola è una meta-regola che utilizza le espressioni regolari. Nella regola, % non ha particolari
significato. Il target viene interpretato come un'espressione regolare come definito in
regexp(7). I prerequisiti possono contenere riferimenti a sottoespressioni in forma \n,
come nel comando sostitutivo di sete(1).
U I target si considerano aggiornati anche se la ricetta non lo ha fatto.
V Le destinazioni di questa regola sono contrassegnate come virtuali. Sono distinti dai file di
lo stesso nome.
ESEMPI
Un semplice file mk per compilare un programma:
</$objtype/mkfile
prog: a.$O b.$O c.$O
$LD $LDFLAGS -o $destinazione $prereq
%.$O: %.c
$CC $CFLAGS $stem.c
Sovrascrivi le impostazioni dei flag nel file mk:
% mk target 'CFLAGS=-S -w'
Gestire una biblioteca:
libc.a(%.$O):N: %.$O
libc.a: libc.a(abs.$O) libc.a(access.$O) libc.a(allarme.$O) ...
ar r libc.a $nuovomembro
Variabili di espressione stringa per derivare nomi da un elenco principale:
NAMES=alloc arc bquote builtin espandi la corrispondenza principale mk var word
OBJ=${NOMI:%=%.$O}
Meta-regole delle espressioni regolari:
([^/]*)/(.*)\.$O:R: \1/\2.c
cd $radice1; $CC $CFLAGS $stem2.c
Un modo corretto di affrontare sì, sì(1) grammatiche. Il file lex.c include il file x.tab.h
anziché y.tab.h per riflettere i cambiamenti nel contenuto, non solo il tempo di modifica.
lex.$O: x.tab.h
x.tab.h: y.tab.h
cmp -s x.tab.h y.tab.h || cp y.tab.h x.tab.h
y.tab.c y.tab.h: grammo.a
$YACC -d grammo.y
L'esempio sopra potrebbe anche usare il P attributo per il x.tab.h regola:
x.tab.h:Pcmp -s: y.tab.h
cp y.tab.h x.tab.h
FONTE
/src/cmd/mk
Usa mkplan9 online utilizzando i servizi onworks.net
