Huhus,
und nun etwas detaillierter, weil da ein paar klitze-kleine Stolperfallen lauern ^^ Ich beschreibe hier mal den Ablauf auf einer openSUSE 13.2 Linux-Distribution. Hinweise für andere Distros (z.B. Windows^^) können dann bei Bedarf ergänzt werden... ACHTUNG: es wird technisch!
1) Vorbereiten der MaschineDamit wir Quältexte in Binärcode übersetzen können benötigen wir einen Compiler und etwas Entwicklungsumgebung. Bei openSUSE geht das relativ einfach mit YaST:
Software installieren oder löschen - Anzeigen - Schemata - .NET-Entwicklung (oder Kernel-Entwicklung oder C/C++-Entwicklung) auswählen - Suche: nant eingeben, Bestätigen und warten^^
Hinweise für andere Distributionen finden sich im Opensimulator-Wiki:
http://opensimulator.org/wiki/Build_Instructions2) Download und Vorbereiten des QuellcodesFür den ersten Versuch nehmen wir den Download der letzten Stable-Version von OpenSimulator:
Qullcode-Download hier:
http://opensimulator.org/wiki/Download/de oder die Originaladresse:
http://opensimulator.org/wiki/Download. Unter Linux ist die Datei mit der Endung tar.gz üblicher, .zip ginge aber auch ... Der Download landet bei mir im Verzeichnis ~/Downloads
- Code: Alles auswählen
sheera@schleppi:~> mkdir OpenSimulator
sheera@schleppi:~> cd OpenSimulator
sheera@schleppi:~/Opensimulator> mv ~/Downloads/opensim-0.8.2.1-source.tar.gz .
sheera@schleppi:~/Opensimulator> tar xvf opensim-0.8.2.1-source.tar.gz
sheera@schleppi:~/Opensimulator> cd opensim-0.8.2.1-source/
sheera@schleppi:~/Opensimulator/opensim-0.8.2.1-source> ./runprebuild.sh
3) Änderungen an den QuelltextenHier greife ich mal die Beispiele von Moni aus dem o.g. Forumsbeitrag auf. Der Simulator-Quellcode muss an drei Stellen geändert werden:
a - Die Implementation der eigentlichen Funktion
b - Die Signatur des Methodenaufrufs muss der API hinzugefügt werden (das sog. Interface)
c - Der ScriptBaseClass muss eine Methode hinzugefügt werden, die die obige Implementation der Funktion aufruft (der sog. Stub)
(Anm. d. Red.: Ich habe mal C programmiert... ich finde das hier unglaublich umständlich^^ Aber bei größeren Projekten macht es trotzdem Sinn...)
a - Die ImplementationDer Quellcode der beiden Funktionen (oops - Methoden^^) selbst ist vergleichsweise selbsterklärend. Dieser muss nun an geeigneter Stelle in den Quellcode des Simulators integriert werden. Dazu bearbeiten wir die Datei OSSL_Api.cs mit dem Texteditor des Vertrauens (ja, in meinem Fall ist das der vi):
- Code: Alles auswählen
sheera@schleppi:~/Opensimulator/opensim-0.8.2.1-source> vi ./OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
Ich habe Monis Quellcode fast ganz am Ende der Datei eingefügt zusammen mit kleinen Kommentaren. Jeder Programmierer weiß, wie wichtig es ist, die richtige Klammer-Ebene zu treffen^^. Daher habe ich jeweils ein paar Zeilen vor und nach dem einzufügenden Quelltext mit aufgenommen. Der Anweisungsblock gehört also vor die letzten beiden schließenden Klammern in der Datei.
- Code: Alles auswählen
. . .
}
}
// Erweiterungen (nach MoniTill, 10.04.2016, http://www.gridtalk.de/showthread.php?tid=2062&pid=24589#pid24589)
public string osMessageRead (int kanal)
{
CheckThreatLevel(ThreatLevel.VeryHigh, "osMessageRead");
m_host.AddScriptLPS(1);
string verzeichnis ="./tmpMessage/"; // /bin/tmpMessage
int maxmessage = 10; // Maximale Datei-/Kanalnummer
if (kanal < 0 || kanal > maxmessage)
{
return "";
}
string theXFiles = verzeichnis+kanal.ToString();
StreamReader file = File.OpenText(theXFiles);
string s = file.ReadToEnd();
file.Close();
StreamWriter writer = new StreamWriter(theXFiles);
writer.Write("");
writer.Close();
return s;
}
public int osMessageWrite (int kanal,string message)
{
CheckThreatLevel(ThreatLevel.VeryHigh, "osMessageWrite");
m_host.AddScriptLPS(1);
string verzeichnis ="./tmpMessage/"; // /bin/tmpMessage
int maxmessage = 10; // Maximale Datei-/Kanalnummer
if (kanal < 0 || kanal > maxmessage)
{
return -1;
}
string theXFiles =verzeichnis+kanal.ToString();
StreamWriter writer = new StreamWriter(theXFiles);
writer.Write(message);
writer.Close();
return 0;
}
// Ende der Erweiterungen
}
}
b - Die SignaturAls nächtes kommt die Bekanntgabe der Syntax der neu hinzugefügten Methodenaufruf in der API dran, die sog. Signaturen der Methoden. Dazu muss wieder eine Datei bearbeitet werden:
- Code: Alles auswählen
sheera@schleppi:~/Opensimulator/opensim-0.8.2.1-source> vi ./OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
Wieder müssen ein paar Zeilen an der korrekten Position ergänzt werden. Auch hier entscheide ich mich für das Dateiende und begrenze den Block mit Kommentaren:
- Code: Alles auswählen
. . .
LSL_Integer osRegexIsMatch(string input, string pattern);
// Erweiterungen (nach MoniTill, 10.04.2016, http://www.gridtalk.de/showthread.php?tid=2062&pid=24589#pid24589)
string osMessageRead (int kanal);
int osMessageWrite (int kanal,string message);
// Ende der Erweiterungen
}
}
c - Der StubZu guter Letzt müssen noch zwei Stubs für die beiden neu erstellten Methoden angelegt werden, die gemäß der soeben deklarierten API aufgerufen werden und dann die eigentlichen Funktionen - err Methoden - aufrufen...
- Code: Alles auswählen
sheera@schleppi:~/Opensimulator/opensim-0.8.2.1-source> vi ./OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
Auch hier bleibe ich bei meinem Schema, dass die eigenen Ergänzungen durch Kommentare begrenzt am Ende der Datei eingefügt werden. Wieder ist auf die korrekte Platzierung des Code-Blocks innerhalb der Verschachtelung zu achten:
- Code: Alles auswählen
. . .
}
// Erweiterungen (nach MoniTill, 10.04.2016, http://www.gridtalk.de/showthread.php?tid=2062&pid=24589#pid24589)
public string osMessageRead(int kanal)
{
return m_OSSL_Functions.osMessageRead(kanal);
}
public int osMessageWrite(int kanal,string message)
{
return m_OSSL_Functions.osMessageWrite(kanal,message);
}
// Ende der Erweiterungen
}
}
Damit sind die Arbeiten am Quellcode selbst abgeschlossen.
4) Übersetzen des Quellcodes in BinärcodeVorausgesetzt alle benötigte Software ist installiert ist dies hier der einfachste Teil des Projekts. Es reicht der Aufruf des Kommandos nant:
- Code: Alles auswählen
sheera@schleppi:~/Opensimulator/opensim-0.8.2.1-source> nant
. . .
BUILD SUCCEEDED
Total time: 8 seconds.
sheera@schleppi:~/Opensimulator/opensim-0.8.2.1-source>
Wegen der Begrenzung der Größe von Forumposts mache ich hier an dieser Stelle eine kurze Unterbrechung
