[LUNGO e TECNICO] 2 gravi errori nello script missing-entities.php
| From: | Mirko Tebaldi \(Indirizzo Pubblico\) | Date: | Mon, 06 Sep 2004 09:57:35 +0000 |
| Subject: | [LUNGO e TECNICO] 2 gravi errori nello script missing-entities.php | ||
| Groups: | php.doc.it | ||
| Request: | Send a blank email to doc-it+get-668@lists.php.net to get a copy of this message | ||
Quello che sto per spiegarvi vale solo per utenti windows + cygwin:
(il messaggio è indirizzato alla ML doc-it ed è in CC a simone cortesi, che
ringrazio vivamente in pubblico per gli sforzi che sta facendo per aiutarmi)
Spero che qualcuno possa girare in inglese la mia segnalazione, sempre che
abbia senso, a quelli di phpdoc@lists.php.net
come sapete eseguendo ./configure si vanno ad eseguire in automatico alcuni
comandi. Da giormi mi lamento che uno di questi script
(missing-entities.php) a me dava errore di un fantomatico percorso non
trovato.
Finalmente credo di avere centrato il punto. Ci sono 2 errori, non 1. si
basano entrambi su presupposti errati da parte dei creatori degli script.
Ora cerco di illustrarvelo, poi voi ditemi se quello che dico ha senso
oppure no:
Prologo
Come forse sapete, usando le cygwin la shell bash considera 'user home' la
cartella c:\documents and settings\<utente>. Nel mio caso <utente> è
Administrator.
Le cygwin sono installate nel mio caso sotto c:\cygiwn.
Eseguendo il cvs checkout di phpdoc-it la cartella phpdoc-it mi è
'ovviamente' finita in c:\documents and settings\phpdoc-it e al suo interno
vi è la mitica cartella scripts dove risiede il mitico missing-entities.php
.
Ora passiamo alla pratica. mi posiziono in phpdoc-it ed eseguo prima
autoconf, poi ./configure.
questo script tra le altre richiama proprio missing-entities.php, il quale
ad un certo punto recita quanto segue (gli echo di debug gli ho inseriti
ovviamente io !). Abbiate pazienza dopo il copia incollo vi spiego tutto
passo-passo.
--- Codice ----
// Print out info for the viewer and log files
echo "\nTesting the manual for missing elements...\n";
// If we are in a scripts dir, go one dir up
// (because the NSGMLS path is relative to that directory!)
$wrkdir = getcwd();
echo "** Debug: $wrkdir \n";
if (strpos($wrkdir, "scripts") !== FALSE) {
chdir("..");
echo "** Debug: $wrkdir \n";
}
$NSGMLS = "/usr/bin/onsgmls";
$NSGMLS_OUTPUT = "missing-entities.out";
echo "** Debug: ora NSGMLS vale $NSGMLS\n";
// Support for Windows systems
if (substr(PHP_OS, 0, 3) == 'WIN') {
$NSGMLS = str_replace("/", "\\", "$NSGMLS");
}
echo "** Debug: ora NSGMLS vale $NSGMLS\n";
echo "** Debug 1\n";
// Execute a test of the manual
if("" == "") {
echo "**** Debug *** \n";
$dbgstring = "$NSGMLS -f $NSGMLS_OUTPUT -i lang-it -D . " .
"-s ./dtds/dbxml-4.1.2/phpdocxml.dcl manual.xml";
echo $dbgstring . "\n";
echo "**** Debug ***\n";
exec(
"$NSGMLS -f $NSGMLS_OUTPUT -i lang-it -D . " .
"-s ./dtds/dbxml-4.1.2/phpdocxml.dcl manual.xml"
);
echo "** Debug 2\n";
}
else {
exec(
" $NSGMLS -f $NSGMLS_OUTPUT -i lang-it -D . " .
"-s ./dtds/dbxml-4.1.2/phpdocxml.dcl manual.xml"
);
}
--- Fine Codice ---
Praticamente lo scirpt a un certo punto ha bisogno di verificare se PER
QUALCHE STRANA RAGIONE viene eseguito da phpdoc-it/script invece di essere
in phpdoc-it come gli serve. Per cui memorizza la direcory di lavoro in
$wrkdir
--- Codice ----
// If we are in a scripts dir, go one dir up
// (because the NSGMLS path is relative to that directory!)
$wrkdir = getcwd();
echo "** Debug: $wrkdir \n";
--- Fine Codice ---
L'echo mi resitutisce : c:\Documents and Settings\Administrator\phpdoc-it.
Dopo ciò il codice passa a cercare l'sgml parser. E qui comincian le beghe.
Il primo errore è che cerca il file onsgmls.exe nel percorso RELATIVO
/usr/bin/. Il fatto è che ora ci troviamo in c:\Documents and
Settings\Administrator\phpdoc-it !!!!
Difatti il seguente codice:
--- Codice ----
$NSGMLS = "/usr/bin/onsgmls";
$NSGMLS_OUTPUT = "missing-entities.out";
echo "** Debug: ora NSGMLS vale $NSGMLS\n";
--- Fine Codice ---
mi da come valore: /usr/bin/onsgmls
Ok, mi sono detto, aggiriamo l'ostacolo. ho creato sotto phpdoc-it la
cartella usr e la sottocartella bin e ci ho messo onsgmls.exe
Rieseguo lo script ed ancora non va! ma il problema non era il mio. Ora vi s
piego...
dopo l'ultimo snippet di codice riportato sopra viene quanto segue (e forser
gli autori si sono sentiti dei geni per averci pensato:) Questo è il secondo
grave errore dello script
--- Codice ----
// Support for Windows systems
if (substr(PHP_OS, 0, 3) == 'WIN') {
$NSGMLS = str_replace("/", "\\", "$NSGMLS");
}
echo "** Debug: Ed ora NSGMLS vale $NSGMLS\n";
--- Fine Codice ----
a questo punto il percorso che va a cercare diventa identico ma usando le
barre Windows \ invece delle Unix /. Il problema è che SI sotto sotto
windows, ma le cygwin mi danno un ambiente bash. per cui il seguente codice,
subito dopo, fallisce.
--- Fine Codice ----
if("" == "") {
echo "**** Debug *** \n";
$dbgstring = "$NSGMLS -f $NSGMLS_OUTPUT -i lang-it -D . " .
"-s ./dtds/dbxml-4.1.2/phpdocxml.dcl manual.xml";
echo $dbgstring . "\n";
echo "**** Debug ***\n";
exec(
"$NSGMLS -f $NSGMLS_OUTPUT -i lang-it -D . " .
"-s ./dtds/dbxml-4.1.2/phpdocxml.dcl manual.xml"
);
echo "** Debug 2\n";
}
else {
exec(
" $NSGMLS -f $NSGMLS_OUTPUT -i lang-it -D . " .
"-s ./dtds/dbxml-4.1.2/phpdocxml.dcl manual.xml"
);
}
--- Fine Codice ----
sappiate che l'IF da esito positivo, per cui viene eseguito il primo caso .
vedete l'exec ? il lungo comando che cerca di eseguire, sotituite le
rispettive variabili, è:
\usr\bin\onsgmls -f missing-entities.out -i lang-it -D . -s
./dtds/dbxml-4.1.2/phpdocxml.dcl manual.xml
questo comando fallisce !
ho provato ad eseguire a mano
/usr/bin/onsgmls -f missing-entities.out -i lang-it -D . -s
./dtds/dbxml-4.1.2/phpdocxml.dcl manual.xml
e questo viene eseguito !
-----------------------------------------
Riassumendo gli errori:
1) Cerca la dir usr/bin sotto phpdoc invece che sotto la radice. Questo ha
senso in Linux, ma non sotto le cygwin.
Soluzione: Basterebbe forse impostare la radice delle cygwin come directory
utente, così /usr sarebbe quelle della directory dove risiedono le cygwin, e
/bin esiste già, ed al suo interno davvero risiede onsgmls.exe
Se mi spiegate come si fa per impostare in bash un nuovo path per la user
home lo faccio e dovrebbe risolversi.
Naturalmente bisogna aggiungere questa nota nell'how-to: o si crea una
usr/bin sotto phpdoc-it e ci si mette il parser o si cambia la user home
2) L'errore della sostituzione delle / con \. Questo è valido solo per chi
usa dei parser windows direttamente sotto Windows. Non funziona invece sotto
win+cygwin in quanto le regole grammaticali dei percorsi ora le detta bash e
non Windows
soluzione: o si aggiunge una verifica aggiuntiva (ma qui non so proprio
come) o si toglie questa sostituzione.
----------------------------------------------------------------------------
---
Ok, amici. Io ho finito. Rimane il fatto che cmq non mi riesce di compilare
il manuale. in attesa... cordiali saluti. Io rimango iscritto alla lista
così seguo le vostre conversazioni.
Naturalmente può darsi che tutto questo sia una enorme cagata ed io abbia
commesso un errore stupido nel configurare qualcosa , però intanto dopo una
settimana di lavoro ho capito dove sta il problema. (Voglio il premio del
miglior niubbino, tenendo conto che 7 giorni fa non conoscevo ne le cygwin
ne bash, per fortuna conosco benissimo php !)
saluti