<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.secondlife.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dale+Glass</id>
	<title>Second Life Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.secondlife.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dale+Glass"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/wiki/Special:Contributions/Dale_Glass"/>
	<updated>2026-07-24T13:17:38Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Dale_Glass&amp;diff=126642</id>
		<title>User:Dale Glass</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Dale_Glass&amp;diff=126642"/>
		<updated>2008-11-02T11:12:17Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: Preliminar notes on getting SL to build on ubuntu&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Evil Scripter and RL programmer.&lt;br /&gt;
&lt;br /&gt;
Currently working on adding an avatar scanner to the SL client.&lt;br /&gt;
&lt;br /&gt;
= Projects =&lt;br /&gt;
== Avatar Scanner ==&lt;br /&gt;
http://daleglass.net/images/screenshots/avlist6_001.jpg&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Shows a list of all avatars known to the client. This can be easily more than a standard 96m scanner, and seems to depend on rendering distance.&lt;br /&gt;
&lt;br /&gt;
* Keeps an internal list of avatars, and continues showing avatars that disappeared in the list for several seconds to give people time to perform some action on them (intended to make it easier to deal with griefers that do something nasty, then teleport out)&lt;br /&gt;
&lt;br /&gt;
* Shows Linden accounts in bold. This will be expanded later to highlight people who are very new, don&#039;t have a credit card on file, etc depending on user configuration.&lt;br /&gt;
&lt;br /&gt;
* Allows easy access to IM, profiles, etc&lt;br /&gt;
&lt;br /&gt;
* Allows to start a conference to multiple avatars around you, the same way it works in the friends list.&lt;br /&gt;
&lt;br /&gt;
* Allows tracking an avatar by placing a beacon on it. In the case the selected avatar isn&#039;t a friend who gave map location permission, it works anyway by placing a beacon on the avatar&#039;s last known position. This of course only works so long the avatar being tracked is near enough to be seen by the user.&lt;br /&gt;
&lt;br /&gt;
* Automatically retrieves the birth date, account type and payment data for all users shown. The data is of course cached, and if this is too much of an extra load, I&#039;ll implement a permanent on-disk cache. If data doesn&#039;t arrive, it will retry with an exponential backoff (starting from 1 minute, doubling until 30 minutes)&lt;br /&gt;
&lt;br /&gt;
* Displays activity status: new, left the area, emitting particles, moving, playing sound&lt;br /&gt;
&lt;br /&gt;
* Allows moving the camera to the avatar with a double click, as well as cycling the camera between all or only the marked avatars&lt;br /&gt;
&lt;br /&gt;
* Partial TrustNet integration: retrieves scores, but can&#039;t rate yet&lt;br /&gt;
&lt;br /&gt;
What is not done yet, but will be:&lt;br /&gt;
&lt;br /&gt;
* Integration with my TrustNet system. See here for details:&lt;br /&gt;
http://daleglass.net/tikiwiki/tiki-index.php?page=TrustNetAvatarScanner&lt;br /&gt;
http://daleglass.net/tikiwiki/tiki-index.php?page=HowTrustNetWorks&lt;br /&gt;
&lt;br /&gt;
* Integration with resident-run databases. For example, I&#039;ve been asked whether I could make it automatically query a website with a database of buyers to be able to tell people who are using avatars made with copybot, for instance.&lt;br /&gt;
&lt;br /&gt;
* Buttons for administrative actions such as ban/eject/freeze/etc&lt;br /&gt;
&lt;br /&gt;
* Add activity status for typing and rezzing objects&lt;br /&gt;
&lt;br /&gt;
* Also longer term, option to make the client stop rendering an avatar completely.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Beta&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/avatarscanner&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== TrustNet Integration ==&lt;br /&gt;
With the disappearance of SL ratings, I&#039;m working on a replacement based on my TrustNet system. Current status is very experimental but with some functional code.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a [http://daleglass.net/images/screenshots/trustnet_001.jpg screenshot] of what it looks like.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Alpha&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/trustnet&lt;br /&gt;
&lt;br /&gt;
== Viewer/Script Communication ==&lt;br /&gt;
This is a hack to let a script talk to the viewer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Stable&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/viewercomm&lt;br /&gt;
&lt;br /&gt;
== Keyboard Hack ==&lt;br /&gt;
This is a viewer hack to make it transmit every keypress as a message on a channel. Used to implement an in-world keyboard that shows the real keypresses while the user is typing. General usage is discouraged, as this multiplies by 20-50 times the amount of chat messages sent to the sim and LL probably wouldn&#039;t like this sort of thing to be used widely.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Stable, but needs cleaning up and improvements.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/realkeyboard&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Scripts =&lt;br /&gt;
&lt;br /&gt;
* http://daleglass.net/scripts/load_archive.pl -- Script for loading source archives into Subversion. See comments in the source for usage.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
The repository is located at [http://svn.daleglass.net/sl/ svn.daleglass.net]&lt;br /&gt;
&lt;br /&gt;
== Branches ==&lt;br /&gt;
Current branches are:&lt;br /&gt;
* &#039;&#039;&#039;buildfixes_1-18-0&#039;&#039;&#039;: 1.18.0 source, plus small compilation changes, for building with gcc4 and VC++ 2005. No functional changes here. Adds my installer.&lt;br /&gt;
* &#039;&#039;&#039;realkeyboard&#039;&#039;&#039;: Silly patch that sends each keypress on a channel. Used to create a keyboard in SL that reflects my real keypresses.&lt;br /&gt;
* &#039;&#039;&#039;viewercomm&#039;&#039;&#039;: Viewer/object communication patch&lt;br /&gt;
* &#039;&#039;&#039;avatarscanner&#039;&#039;&#039;: Avatar scanner patch&lt;br /&gt;
* &#039;&#039;&#039;trustnet&#039;&#039;&#039;: Support for my reputation system&lt;br /&gt;
* &#039;&#039;&#039;branding&#039;&#039;&#039;: Branding changes: Different menu bar color, send crash reports to daleglass.net&lt;br /&gt;
* &#039;&#039;&#039;release&#039;&#039;&#039;: Merge of various branches. This is where my installers are made from.&lt;br /&gt;
* &#039;&#039;&#039;trunk&#039;&#039;&#039;: Currently unused&lt;br /&gt;
* &#039;&#039;&#039;log_object_owners&#039;&#039;&#039;: Show owners and location of speaking objects in chat history&lt;br /&gt;
&lt;br /&gt;
== How to get a patch ==&lt;br /&gt;
People sometimes ask me if I have patches. Currently I don&#039;t make them, because you can easily create an up to date one. Here&#039;s how:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ svn diff http://svn.daleglass.net/sl/branches/buildfixes_1-18-0 http://svn.daleglass.net/sl/branches/&amp;lt;branch&amp;gt; &amp;gt; patch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example, to get a patch with my avatar scanner:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ svn diff http://svn.daleglass.net/sl/branches/buildfixes_1-18-0 http://svn.daleglass.net/sl/branches/avatarscanner &amp;gt; avatar-scanner.patch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create a patch with the difference between my &#039;&#039;&#039;buildfixes&#039;&#039;&#039; branch and another. This should apply cleanly to pristine sources.&lt;br /&gt;
&lt;br /&gt;
== Branch Graph ==&lt;br /&gt;
Some branches are fed changes from others. This graph shows the hierarchy.&lt;br /&gt;
&lt;br /&gt;
[[Image:Daleglass branch graph.png]]&lt;br /&gt;
&lt;br /&gt;
= Installer =&lt;br /&gt;
My &#039;&#039;&#039;release&#039;&#039;&#039; branch (see above) is periodically packaged into an installer. If you get this, have in mind this is completely unofficial and unsupported by Linden Lab. Don&#039;t report bugs you find in it to LL.&lt;br /&gt;
&lt;br /&gt;
This version will try to send crash reports to me, and not to LL. Updates will be downloaded from my server as well.&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
The latest installer can be found at [http://sl.daleglass.net/ daleglass.net]&lt;br /&gt;
&lt;br /&gt;
There&#039;s no autoupdate mechanism yet.&lt;br /&gt;
&lt;br /&gt;
== Linux ==&lt;br /&gt;
I don&#039;t create Linux packages yet. You&#039;ll have to get the source from SVN and [[Compiling_the_viewer_(Linux) | build it]]&lt;br /&gt;
&lt;br /&gt;
I may start making packages if there is demand.&lt;br /&gt;
&lt;br /&gt;
== FreeBSD ==&lt;br /&gt;
I don&#039;t currently use BSD, so you&#039;ll have to get the source from SVN and [[Compiling_the_viewer_(FreeBSD) | build it]]&lt;br /&gt;
&lt;br /&gt;
== OS X ==&lt;br /&gt;
I don&#039;t have any Mac hardware, so I can&#039;t create packages for it. I&#039;m not currently planning to buy any either.&lt;br /&gt;
&lt;br /&gt;
This means that Mac users will have to [[Compiling_the_viewer_(Mac_OS_X) | build it from source]], or get somebody to integrate my changes and create a package for them.&lt;br /&gt;
&lt;br /&gt;
Despite this, anybody using it on a Mac is welcome to submit bug reports. If it&#039;s a Mac specific problem, I will appreciate information on how to fix it. The bug reporter will be expected to test the results for me, since I can&#039;t.&lt;br /&gt;
&lt;br /&gt;
= Building viewer on Ubuntu 8.10 (Intrepid Ibex) =&lt;br /&gt;
&lt;br /&gt;
Instructions in progress for quickly building the viewer under Ubuntu, in standalone mode:&lt;br /&gt;
&lt;br /&gt;
Install these packages:&lt;br /&gt;
 apt-get install g++ mesa-common-dev libglu1-mesa-dev libstdc++6.4.3-dev libx11-dev zlib1g-dev libssl-dev pkg-config libvorbis-dev libdb4.6-dev libapr1-dev libboost-dev libc-ares-dev libcurl4-openssl-dev libxmlrpc-epi-dev libopenjpeg-dev libjpeg-dev libpng-dev libsdl-dev libpango1.0-dev libgtk2.0-dev libgstreamer-plugins-base0.10-dev&lt;br /&gt;
&lt;br /&gt;
Optionally, to use llmozlib:&lt;br /&gt;
 apt-get install subversion cvs libglib-dev libidl-dev&lt;br /&gt;
 svn co http://svn.secondlife.com/svn/llmozlib/trunk/llmozlib2&lt;br /&gt;
 cd llmozlib2&lt;br /&gt;
 gcc_version=`readlink /usr/bin/gcc | sed -r &amp;quot;s/^.*?-//&#039;&lt;br /&gt;
 sed &#039;s/GCC_VERSION=.*$/GCC_VERSION=${gcc_version}/&amp;quot; build_mozilla/linux-libxul-bits/mozconfig  &amp;gt; build_mozilla/linux-libxul-bits/mozconfig.tmp&lt;br /&gt;
 mv -f build_mozilla/linux-libxul-bits/mozconfig.tmp build_mozilla/linux-libxul-bits/mozconfig&lt;br /&gt;
 cd build_mozilla&lt;br /&gt;
 ./linux-checkout_patch_build.sh&lt;br /&gt;
&lt;br /&gt;
To build, artwork is needed.&lt;br /&gt;
 wget $artwork&lt;br /&gt;
 unzip $artwork&lt;br /&gt;
&lt;br /&gt;
Ubuntu doesn&#039;t come with the right version of cmake, build it:&lt;br /&gt;
 wget http://www.cmake.org/files/v2.6/cmake-2.6.2.tar.gz&lt;br /&gt;
 tar -xzvf cmake-2.6.2.tar.gz&lt;br /&gt;
 cd cmake-2.6.2&lt;br /&gt;
 ./configure&lt;br /&gt;
 make&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Etc =&lt;br /&gt;
{{Jira Reporter}}&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Dale_Glass&amp;diff=40704</id>
		<title>User:Dale Glass</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Dale_Glass&amp;diff=40704"/>
		<updated>2007-11-17T00:01:04Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: /* Windows */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Evil Scripter and RL programmer.&lt;br /&gt;
&lt;br /&gt;
Currently working on adding an avatar scanner to the SL client.&lt;br /&gt;
&lt;br /&gt;
= Projects =&lt;br /&gt;
== Avatar Scanner ==&lt;br /&gt;
http://daleglass.net/images/screenshots/avlist6_001.jpg&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Shows a list of all avatars known to the client. This can be easily more than a standard 96m scanner, and seems to depend on rendering distance.&lt;br /&gt;
&lt;br /&gt;
* Keeps an internal list of avatars, and continues showing avatars that disappeared in the list for several seconds to give people time to perform some action on them (intended to make it easier to deal with griefers that do something nasty, then teleport out)&lt;br /&gt;
&lt;br /&gt;
* Shows Linden accounts in bold. This will be expanded later to highlight people who are very new, don&#039;t have a credit card on file, etc depending on user configuration.&lt;br /&gt;
&lt;br /&gt;
* Allows easy access to IM, profiles, etc&lt;br /&gt;
&lt;br /&gt;
* Allows to start a conference to multiple avatars around you, the same way it works in the friends list.&lt;br /&gt;
&lt;br /&gt;
* Allows tracking an avatar by placing a beacon on it. In the case the selected avatar isn&#039;t a friend who gave map location permission, it works anyway by placing a beacon on the avatar&#039;s last known position. This of course only works so long the avatar being tracked is near enough to be seen by the user.&lt;br /&gt;
&lt;br /&gt;
* Automatically retrieves the birth date, account type and payment data for all users shown. The data is of course cached, and if this is too much of an extra load, I&#039;ll implement a permanent on-disk cache. If data doesn&#039;t arrive, it will retry with an exponential backoff (starting from 1 minute, doubling until 30 minutes)&lt;br /&gt;
&lt;br /&gt;
* Displays activity status: new, left the area, emitting particles, moving, playing sound&lt;br /&gt;
&lt;br /&gt;
* Allows moving the camera to the avatar with a double click, as well as cycling the camera between all or only the marked avatars&lt;br /&gt;
&lt;br /&gt;
* Partial TrustNet integration: retrieves scores, but can&#039;t rate yet&lt;br /&gt;
&lt;br /&gt;
What is not done yet, but will be:&lt;br /&gt;
&lt;br /&gt;
* Integration with my TrustNet system. See here for details:&lt;br /&gt;
http://daleglass.net/tikiwiki/tiki-index.php?page=TrustNetAvatarScanner&lt;br /&gt;
http://daleglass.net/tikiwiki/tiki-index.php?page=HowTrustNetWorks&lt;br /&gt;
&lt;br /&gt;
* Integration with resident-run databases. For example, I&#039;ve been asked whether I could make it automatically query a website with a database of buyers to be able to tell people who are using avatars made with copybot, for instance.&lt;br /&gt;
&lt;br /&gt;
* Buttons for administrative actions such as ban/eject/freeze/etc&lt;br /&gt;
&lt;br /&gt;
* Add activity status for typing and rezzing objects&lt;br /&gt;
&lt;br /&gt;
* Also longer term, option to make the client stop rendering an avatar completely.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Beta&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/avatarscanner&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== TrustNet Integration ==&lt;br /&gt;
With the disappearance of SL ratings, I&#039;m working on a replacement based on my TrustNet system. Current status is very experimental but with some functional code.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a [http://daleglass.net/images/screenshots/trustnet_001.jpg screenshot] of what it looks like.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Alpha&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/trustnet&lt;br /&gt;
&lt;br /&gt;
== Viewer/Script Communication ==&lt;br /&gt;
This is a hack to let a script talk to the viewer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Stable&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/viewercomm&lt;br /&gt;
&lt;br /&gt;
== Keyboard Hack ==&lt;br /&gt;
This is a viewer hack to make it transmit every keypress as a message on a channel. Used to implement an in-world keyboard that shows the real keypresses while the user is typing. General usage is discouraged, as this multiplies by 20-50 times the amount of chat messages sent to the sim and LL probably wouldn&#039;t like this sort of thing to be used widely.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Stable, but needs cleaning up and improvements.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/realkeyboard&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Scripts =&lt;br /&gt;
&lt;br /&gt;
* http://daleglass.net/scripts/load_archive.pl -- Script for loading source archives into Subversion. See comments in the source for usage.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
The repository is located at [http://svn.daleglass.net/sl/ svn.daleglass.net]&lt;br /&gt;
&lt;br /&gt;
== Branches ==&lt;br /&gt;
Current branches are:&lt;br /&gt;
* &#039;&#039;&#039;buildfixes_1-18-0&#039;&#039;&#039;: 1.18.0 source, plus small compilation changes, for building with gcc4 and VC++ 2005. No functional changes here. Adds my installer.&lt;br /&gt;
* &#039;&#039;&#039;realkeyboard&#039;&#039;&#039;: Silly patch that sends each keypress on a channel. Used to create a keyboard in SL that reflects my real keypresses.&lt;br /&gt;
* &#039;&#039;&#039;viewercomm&#039;&#039;&#039;: Viewer/object communication patch&lt;br /&gt;
* &#039;&#039;&#039;avatarscanner&#039;&#039;&#039;: Avatar scanner patch&lt;br /&gt;
* &#039;&#039;&#039;trustnet&#039;&#039;&#039;: Support for my reputation system&lt;br /&gt;
* &#039;&#039;&#039;branding&#039;&#039;&#039;: Branding changes: Different menu bar color, send crash reports to daleglass.net&lt;br /&gt;
* &#039;&#039;&#039;release&#039;&#039;&#039;: Merge of various branches. This is where my installers are made from.&lt;br /&gt;
* &#039;&#039;&#039;trunk&#039;&#039;&#039;: Currently unused&lt;br /&gt;
* &#039;&#039;&#039;log_object_owners&#039;&#039;&#039;: Show owners and location of speaking objects in chat history&lt;br /&gt;
&lt;br /&gt;
== How to get a patch ==&lt;br /&gt;
People sometimes ask me if I have patches. Currently I don&#039;t make them, because you can easily create an up to date one. Here&#039;s how:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ svn diff http://svn.daleglass.net/sl/branches/buildfixes_1-18-0 http://svn.daleglass.net/sl/branches/&amp;lt;branch&amp;gt; &amp;gt; patch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example, to get a patch with my avatar scanner:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ svn diff http://svn.daleglass.net/sl/branches/buildfixes_1-18-0 http://svn.daleglass.net/sl/branches/avatarscanner &amp;gt; avatar-scanner.patch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create a patch with the difference between my &#039;&#039;&#039;buildfixes&#039;&#039;&#039; branch and another. This should apply cleanly to pristine sources.&lt;br /&gt;
&lt;br /&gt;
== Branch Graph ==&lt;br /&gt;
Some branches are fed changes from others. This graph shows the hierarchy.&lt;br /&gt;
&lt;br /&gt;
[[Image:Daleglass branch graph.png]]&lt;br /&gt;
&lt;br /&gt;
= Installer =&lt;br /&gt;
My &#039;&#039;&#039;release&#039;&#039;&#039; branch (see above) is periodically packaged into an installer. If you get this, have in mind this is completely unofficial and unsupported by Linden Lab. Don&#039;t report bugs you find in it to LL.&lt;br /&gt;
&lt;br /&gt;
This version will try to send crash reports to me, and not to LL. Updates will be downloaded from my server as well.&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
The latest installer can be found at [http://sl.daleglass.net/ daleglass.net]&lt;br /&gt;
&lt;br /&gt;
There&#039;s no autoupdate mechanism yet.&lt;br /&gt;
&lt;br /&gt;
== Linux ==&lt;br /&gt;
I don&#039;t create Linux packages yet. You&#039;ll have to get the source from SVN and [[Compiling_the_viewer_(Linux) | build it]]&lt;br /&gt;
&lt;br /&gt;
I may start making packages if there is demand.&lt;br /&gt;
&lt;br /&gt;
== FreeBSD ==&lt;br /&gt;
I don&#039;t currently use BSD, so you&#039;ll have to get the source from SVN and [[Compiling_the_viewer_(FreeBSD) | build it]]&lt;br /&gt;
&lt;br /&gt;
== OS X ==&lt;br /&gt;
I don&#039;t have any Mac hardware, so I can&#039;t create packages for it. I&#039;m not currently planning to buy any either.&lt;br /&gt;
&lt;br /&gt;
This means that Mac users will have to [[Compiling_the_viewer_(Mac_OS_X) | build it from source]], or get somebody to integrate my changes and create a package for them.&lt;br /&gt;
&lt;br /&gt;
Despite this, anybody using it on a Mac is welcome to submit bug reports. If it&#039;s a Mac specific problem, I will appreciate information on how to fix it. The bug reporter will be expected to test the results for me, since I can&#039;t.&lt;br /&gt;
&lt;br /&gt;
= Etc =&lt;br /&gt;
{{Jira Reporter}}&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_To_Client_Communication&amp;diff=38496</id>
		<title>LSL To Client Communication</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_To_Client_Communication&amp;diff=38496"/>
		<updated>2007-10-30T00:28:37Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: script compilation and bugfixes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Open Source Portal}}&lt;br /&gt;
&lt;br /&gt;
=Communication=&lt;br /&gt;
A mechanism is needed to allow LSL scripts to talk to the viewer in order to allow implementing some interesting functionality, such as viewer UI extensions that communicate with in-world objects, for instance. Viewer to LSL communication is easily possible, by making the viewer talk on a specific channel, or use XML RPC. This may not be ideal for all cases, but it&#039;s already doable without any modifications.&lt;br /&gt;
&lt;br /&gt;
What needs work is LSL to Client communication, as there currently isn&#039;t any good method in the official client for that.&lt;br /&gt;
&lt;br /&gt;
=Requirements=&lt;br /&gt;
A robust mechanism should satisfy these requirements:&lt;br /&gt;
&lt;br /&gt;
# Scripts must be able to receive messages from the viewer (can be done already with chat and XML RPC)&lt;br /&gt;
# Scripts must be able to reply to the viewer&lt;br /&gt;
# It must be possible to communicate with multiple viewers at once without confusion&lt;br /&gt;
# Order of delivery must be guaranteed (chat messages currently can be reordered)&lt;br /&gt;
# Messages must be reliable&lt;br /&gt;
&lt;br /&gt;
The hack below can satisfy requirements #1 to #3. Requirement #4 would require extra work (although it&#039;s doable) and is possibly best ignored, as LL mentioned the possibility of moving chat to TCP, which would automatically solve the issue.&lt;br /&gt;
&lt;br /&gt;
Requirement #5 is mostly satisfied as data isn&#039;t lost, and the only problem may be with the viewer or the script disappearing, which can be dealt with by designing the proper protocol, if needed.&lt;br /&gt;
&lt;br /&gt;
=Hack=&lt;br /&gt;
While there&#039;s no official solution, here&#039;s what I came up with for now:&lt;br /&gt;
&lt;br /&gt;
* Client to LSL: Client speaks on a channel directly. Nothing special here.&lt;br /&gt;
* LSL to Client: Script uses llOwnerSay, with this format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
$VwrComm$VERSION$COMPONENT$DATA&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fields:&lt;br /&gt;
* VwrComm: Header, must be present&lt;br /&gt;
* VERSION: Protocol version&lt;br /&gt;
* COMPONENT: Component inside the viewer the message is for&lt;br /&gt;
* DATA: Data being sent. The format of the data isn&#039;t specified.&lt;br /&gt;
&lt;br /&gt;
==Behavior==&lt;br /&gt;
&lt;br /&gt;
This is how the current implementation handles the protocol:&lt;br /&gt;
&lt;br /&gt;
# Message must come from an object. Normal chat doesn&#039;t trigger it&lt;br /&gt;
# String gets split by &amp;quot;$&amp;quot; and must have at least 4 tokens&lt;br /&gt;
# First token must be VwrComm&lt;br /&gt;
# Second token must be &amp;quot;0&amp;quot; (version number, this will change)&lt;br /&gt;
# Third token matches the name of a known component.&lt;br /&gt;
&lt;br /&gt;
If requirements #1 to #3 aren&#039;t satisfied, the string is passed as-is, and the code doesn&#039;t suppress its display.&lt;br /&gt;
&lt;br /&gt;
If requirement #4 isn&#039;t satisfied, the text won&#039;t appear on screen, but the code won&#039;t continue further either. A message will be logged in the viewer&#039;s log, saying that a message with the wrong version was received.&lt;br /&gt;
&lt;br /&gt;
If requirement #5 isn&#039;t satisfied, display is also suppressed, and a message is also logged.&lt;br /&gt;
&lt;br /&gt;
If all those requirements are satisfied, the data in the message is sent to the specified part of the viewer for futher processing.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
$VwrComm$0$DaleGlass.AvatarScanner$LoginComplete&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Implementation==&lt;br /&gt;
Code for this can be found at [http://svn.daleglass.net/secondlife/trunk/indra/newview/llviewermessage.cpp], line 2047&lt;br /&gt;
&lt;br /&gt;
Note that at the time of writing, the client isn&#039;t capable of telling the difference between object speech sent to all users (llSay/etc) and object speech sent only to the owner (llOwnerSay). It also doesn&#039;t check the speaking object&#039;s key or its owner&#039;s. This code must be fixed to obtain that information, so that the viewer can ignore messages from objects not owned by the user, when such a thing is necessary.&lt;br /&gt;
&lt;br /&gt;
=Protocol=&lt;br /&gt;
The above describes the system and format for exchanging data. However, there are still a few problems to solve:&lt;br /&gt;
&lt;br /&gt;
# Multiple extensions to the viewer must be able to coexist, without conflicting with others&lt;br /&gt;
# Viewer may not implement this at all, in which case the messages get displayed on screen&lt;br /&gt;
# Viewer replies to the script have potential security issues&lt;br /&gt;
&lt;br /&gt;
Proposed solutions:&lt;br /&gt;
&lt;br /&gt;
# See next section&lt;br /&gt;
# The LSL script initiates the conversation. It sends a single request and waits for a reply. This ensures that non-supporting clients don&#039;t get flooded with protocol data. &lt;br /&gt;
# During the establishment of the connection, the script chooses a random channel to listen on, and tells it to the viewer. This makes it very improbable that somebody will be able to intercept the data, as the channel will be different every time. An additional advantage is that there&#039;s no need to keep track of who uses what channel: the chance of a collision should be extremely low.&lt;br /&gt;
&lt;br /&gt;
== Component Naming ==&lt;br /&gt;
The COMPONENT field of the protocol specifies the name of the component inside the viewer the script wants to talk to. The data is an arbitrary ASCII string, which may not contain newlines or the $ character. The proposed format is &amp;quot;AvatarName.FunctionName&amp;quot;, where AvatarName is the first and last names of the avatar who created the functionality concatenated without a space, a period, and the name of the avatar&#039;s creation. This system should ensure that should two people come up with different ways to do the same thing, the COMPONENT names won&#039;t clash.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
$VwrComm$0$DaleGlass.AvatarScanner$LoginComplete&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connection Establishment ==&lt;br /&gt;
As described above, the LSL script initiates the communication by telling the viewer what channel it wants to talk on.&lt;br /&gt;
&lt;br /&gt;
=== Connection Request ===&lt;br /&gt;
* The COMPONENT field&#039;s value is &amp;quot;DaleGlass.Viewer&amp;quot;&lt;br /&gt;
* The payload is &amp;quot;Connect$&amp;lt;channel&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The fields are as follows:&lt;br /&gt;
* &amp;lt;channel&amp;gt; is the channel the script wants to talk on. For security, this SHOULD be randomly generated. The channel number &#039;&#039;&#039;must be positive&#039;&#039;&#039;, since the viewer can&#039;t talk on negative channel numbers. It&#039;s recommended to exclude channels &amp;lt; 1000 or so, to avoid highly used channel numbers.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
$VwrComm$0$DaleGlass.Viewer$Connect$12421&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Viewer Reply ===&lt;br /&gt;
Viewer replies to the request by sending the message &amp;quot;OK&amp;quot; to the specified channel. Any other reply MUST be considered an error message.&lt;br /&gt;
&lt;br /&gt;
After this, any further requests to the viewer from the object are replied to in on the specified channel.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
integer g_channel = 0;         // Channel to talk on -- randomly generated&lt;br /&gt;
integer g_listen_handle = 0;   // Listen handle&lt;br /&gt;
&lt;br /&gt;
integer g_timeout = 30;        // How long to wait for the viewer to reply&lt;br /&gt;
&lt;br /&gt;
ViewerComm(string component, string data) {&lt;br /&gt;
    llOwnerSay(&amp;quot;$VwrComm$0$&amp;quot; + component + &amp;quot;$&amp;quot; + data);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        // Generate a random channel number&lt;br /&gt;
        g_channel = (integer)(llFrand(2147482646.0) + 1000.0);&lt;br /&gt;
&lt;br /&gt;
        // Set a timer in case the viewer doesn&#039;t reply&lt;br /&gt;
        llSetTimerEvent(g_timeout);&lt;br /&gt;
&lt;br /&gt;
        // Listen for replies&lt;br /&gt;
        g_listen_handle = llListen(g_channel, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // Send connection request&lt;br /&gt;
        ViewerComm(&amp;quot;DaleGlass.Viewer&amp;quot;, &amp;quot;Connect$&amp;quot; + (string)g_channel);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer() {&lt;br /&gt;
        llSetTimerEvent(0.0); // Disable timeout timer&lt;br /&gt;
        llListenRemove(g_listen_handle);&lt;br /&gt;
        llOwnerSay(&amp;quot;Client/Viewer connection timed out -- probably not supported&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    listen( integer channel, string name, key id, string message ) {&lt;br /&gt;
        llSetTimerEvent(0.0); // Disable timeout timer&lt;br /&gt;
&lt;br /&gt;
        if ( message == &amp;quot;OK&amp;quot; ) {&lt;br /&gt;
            // Connection successful&lt;br /&gt;
            llOwnerSay(&amp;quot;Client/Viewer connection successful&amp;quot;);&lt;br /&gt;
        } else {&lt;br /&gt;
            // Something went wrong&lt;br /&gt;
            llOwnerSay(&amp;quot;Client/Viewer connection error: &amp;quot; + message);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= General Functionality =&lt;br /&gt;
This is the proposed functionality that would be implemented by the main patch itself, and supported by all viewers that speak this protocol. The idea is to provide some simple and generally useful functionality. All of them would use COMPONENT &amp;quot;DaleGlass.Viewer&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== GetViewerVersion ==&lt;br /&gt;
This command would return the viewer&#039;s version as a string, with the following format:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;major&amp;gt;$&amp;lt;minor&amp;gt;$&amp;lt;revision&amp;gt;$&amp;lt;build&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example, viewer version 1.17.0 (12) would be sent as:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
1$17$0$12&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GetViewerBuilder ==&lt;br /&gt;
Returns the name of the person who built the viewer. &amp;quot;Linden Lab&amp;quot; would be reserved for LL. My viewer would say &amp;quot;Dale Glass&amp;quot; here for instance.&lt;br /&gt;
&lt;br /&gt;
== GetViewerRevision ==&lt;br /&gt;
Returns the viewer&#039;s revision number. This would apply only to custom built viewers. The recommendation is that the reply to this message be the revision number from the builder&#039;s source repository.&lt;br /&gt;
&lt;br /&gt;
== GetExtensionList ==&lt;br /&gt;
Returns the list of supported viewer extensions, as a comma separated string. MUST NOT contain anything that&#039;d conflict with llCSV2List.&lt;br /&gt;
&lt;br /&gt;
Example reply:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
DaleGlass.Viewer, DaleGlass.AvatarScanner, ExampleAvatar.CoolScript&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The intention behind this command is allowing scripts that are capable of using multiple extensions determine which are present. &lt;br /&gt;
&lt;br /&gt;
== GetOperatingSystem ==&lt;br /&gt;
Returns a string describing the OS being used:&lt;br /&gt;
* Linux&lt;br /&gt;
* Windows&lt;br /&gt;
* OS X&lt;br /&gt;
* Solaris&lt;br /&gt;
* (etc)&lt;br /&gt;
&lt;br /&gt;
The intention is to allow scripts to determine that some functionality isn&#039;t available because the implementation is OS-specific. This MUST NOT be used as a primary method of detecting whether some functionality is supported (as this could change). Instead, this should only be used after GetExtensionList fails to return the desired functionality, and used to determine whether the lack of it is because it&#039;s not available on that OS at all.&lt;br /&gt;
&lt;br /&gt;
=See Also=&lt;br /&gt;
&lt;br /&gt;
See also: Q re client app current/ obsolete/ Mac/ Linux/ Windows/ LSL-Editor/ what at [[LlRequestClientData]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Design Discussions]]&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_To_Client_Communication&amp;diff=38330</id>
		<title>LSL To Client Communication</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_To_Client_Communication&amp;diff=38330"/>
		<updated>2007-10-27T19:53:23Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: corrected information about channel numbers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Open Source Portal}}&lt;br /&gt;
&lt;br /&gt;
=Communication=&lt;br /&gt;
A mechanism is needed to allow LSL scripts to talk to the viewer in order to allow implementing some interesting functionality, such as viewer UI extensions that communicate with in-world objects, for instance. Viewer to LSL communication is easily possible, by making the viewer talk on a specific channel, or use XML RPC. This may not be ideal for all cases, but it&#039;s already doable without any modifications.&lt;br /&gt;
&lt;br /&gt;
What needs work is LSL to Client communication, as there currently isn&#039;t any good method in the official client for that.&lt;br /&gt;
&lt;br /&gt;
=Requirements=&lt;br /&gt;
A robust mechanism should satisfy these requirements:&lt;br /&gt;
&lt;br /&gt;
# Scripts must be able to receive messages from the viewer (can be done already with chat and XML RPC)&lt;br /&gt;
# Scripts must be able to reply to the viewer&lt;br /&gt;
# It must be possible to communicate with multiple viewers at once without confusion&lt;br /&gt;
# Order of delivery must be guaranteed (chat messages currently can be reordered)&lt;br /&gt;
# Messages must be reliable&lt;br /&gt;
&lt;br /&gt;
The hack below can satisfy requirements #1 to #3. Requirement #4 would require extra work (although it&#039;s doable) and is possibly best ignored, as LL mentioned the possibility of moving chat to TCP, which would automatically solve the issue.&lt;br /&gt;
&lt;br /&gt;
Requirement #5 is mostly satisfied as data isn&#039;t lost, and the only problem may be with the viewer or the script disappearing, which can be dealt with by designing the proper protocol, if needed.&lt;br /&gt;
&lt;br /&gt;
=Hack=&lt;br /&gt;
While there&#039;s no official solution, here&#039;s what I came up with for now:&lt;br /&gt;
&lt;br /&gt;
* Client to LSL: Client speaks on a channel directly. Nothing special here.&lt;br /&gt;
* LSL to Client: Script uses llOwnerSay, with this format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
$VwrComm$VERSION$COMPONENT$DATA&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fields:&lt;br /&gt;
* VwrComm: Header, must be present&lt;br /&gt;
* VERSION: Protocol version&lt;br /&gt;
* COMPONENT: Component inside the viewer the message is for&lt;br /&gt;
* DATA: Data being sent. The format of the data isn&#039;t specified.&lt;br /&gt;
&lt;br /&gt;
==Behavior==&lt;br /&gt;
&lt;br /&gt;
This is how the current implementation handles the protocol:&lt;br /&gt;
&lt;br /&gt;
# Message must come from an object. Normal chat doesn&#039;t trigger it&lt;br /&gt;
# String gets split by &amp;quot;$&amp;quot; and must have at least 4 tokens&lt;br /&gt;
# First token must be VwrComm&lt;br /&gt;
# Second token must be &amp;quot;0&amp;quot; (version number, this will change)&lt;br /&gt;
# Third token matches the name of a known component.&lt;br /&gt;
&lt;br /&gt;
If requirements #1 to #3 aren&#039;t satisfied, the string is passed as-is, and the code doesn&#039;t suppress its display.&lt;br /&gt;
&lt;br /&gt;
If requirement #4 isn&#039;t satisfied, the text won&#039;t appear on screen, but the code won&#039;t continue further either. A message will be logged in the viewer&#039;s log, saying that a message with the wrong version was received.&lt;br /&gt;
&lt;br /&gt;
If requirement #5 isn&#039;t satisfied, display is also suppressed, and a message is also logged.&lt;br /&gt;
&lt;br /&gt;
If all those requirements are satisfied, the data in the message is sent to the specified part of the viewer for futher processing.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
$VwrComm$0$DaleGlass.AvatarScanner$LoginComplete&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Implementation==&lt;br /&gt;
Code for this can be found at [http://svn.daleglass.net/secondlife/trunk/indra/newview/llviewermessage.cpp], line 2047&lt;br /&gt;
&lt;br /&gt;
Note that at the time of writing, the client isn&#039;t capable of telling the difference between object speech sent to all users (llSay/etc) and object speech sent only to the owner (llOwnerSay). It also doesn&#039;t check the speaking object&#039;s key or its owner&#039;s. This code must be fixed to obtain that information, so that the viewer can ignore messages from objects not owned by the user, when such a thing is necessary.&lt;br /&gt;
&lt;br /&gt;
=Protocol=&lt;br /&gt;
The above describes the system and format for exchanging data. However, there are still a few problems to solve:&lt;br /&gt;
&lt;br /&gt;
# Multiple extensions to the viewer must be able to coexist, without conflicting with others&lt;br /&gt;
# Viewer may not implement this at all, in which case the messages get displayed on screen&lt;br /&gt;
# Viewer replies to the script have potential security issues&lt;br /&gt;
&lt;br /&gt;
Proposed solutions:&lt;br /&gt;
&lt;br /&gt;
# See next section&lt;br /&gt;
# The LSL script initiates the conversation. It sends a single request and waits for a reply. This ensures that non-supporting clients don&#039;t get flooded with protocol data. &lt;br /&gt;
# During the establishment of the connection, the script chooses a random channel to listen on, and tells it to the viewer. This makes it very improbable that somebody will be able to intercept the data, as the channel will be different every time. An additional advantage is that there&#039;s no need to keep track of who uses what channel: the chance of a collision should be extremely low.&lt;br /&gt;
&lt;br /&gt;
== Component Naming ==&lt;br /&gt;
The COMPONENT field of the protocol specifies the name of the component inside the viewer the script wants to talk to. The data is an arbitrary ASCII string, which may not contain newlines or the $ character. The proposed format is &amp;quot;AvatarName.FunctionName&amp;quot;, where AvatarName is the first and last names of the avatar who created the functionality concatenated without a space, a period, and the name of the avatar&#039;s creation. This system should ensure that should two people come up with different ways to do the same thing, the COMPONENT names won&#039;t clash.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
$VwrComm$0$DaleGlass.AvatarScanner$LoginComplete&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connection Establishment ==&lt;br /&gt;
As described above, the LSL script initiates the communication by telling the viewer what channel it wants to talk on.&lt;br /&gt;
&lt;br /&gt;
=== Connection Request ===&lt;br /&gt;
* The COMPONENT field&#039;s value is &amp;quot;DaleGlass.Viewer&amp;quot;&lt;br /&gt;
* The payload is &amp;quot;Connect$&amp;lt;channel&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The fields are as follows:&lt;br /&gt;
* &amp;lt;channel&amp;gt; is the channel the script wants to talk on. For security, this SHOULD be randomly generated. The channel number &#039;&#039;&#039;must be positive&#039;&#039;&#039;, since the viewer can&#039;t talk on negative channel numbers. It&#039;s recommended to exclude channels &amp;lt; 1000 or so, to avoid highly used channel numbers.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
$VwrComm$0$DaleGlass.Viewer$Connect$12421&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Viewer Reply ===&lt;br /&gt;
Viewer replies to the request by sending the message &amp;quot;OK&amp;quot; to the specified channel. Any other reply MUST be considered an error message.&lt;br /&gt;
&lt;br /&gt;
After this, any further requests to the viewer from the object are replied to in on the specified channel.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
integer g_channel = 0;         // Channel to talk on -- randomly generated&lt;br /&gt;
integer g_listen_handle = 0;   // Listen handle&lt;br /&gt;
&lt;br /&gt;
integer g_timeout = 30;        // How long to wait for the viewer to reply&lt;br /&gt;
&lt;br /&gt;
ViewerComm(string component, string data) {&lt;br /&gt;
    llOwnerSay(&amp;quot;$VwrComm$0$&amp;quot; + component + &amp;quot;$&amp;quot; + data);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        // Generate a random channel number&lt;br /&gt;
        g_channel = (integer)(llFrand(2147482646.0) + 1000.0);&lt;br /&gt;
&lt;br /&gt;
        // Set a timer in case the viewer doesn&#039;t reply&lt;br /&gt;
        llSetTimerEvent(g_timeout);&lt;br /&gt;
&lt;br /&gt;
        // Listen for replies&lt;br /&gt;
        g_listen_handle = llListen(g_channel, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // Send connection request&lt;br /&gt;
        ViewerComm(&amp;quot;DaleGlass.Viewer&amp;quot;, &amp;quot;Connect$&amp;quot; + (string)channel);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer() {&lt;br /&gt;
        llListenRemove(g_listen_handle);&lt;br /&gt;
        llOwnerSay(&amp;quot;Client/Viewer connection timed out -- probably not supported&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    listen( integer channel, string name, key id, string message ) {&lt;br /&gt;
        if ( message == &amp;quot;OK&amp;quot; ) {&lt;br /&gt;
            // Connection successful&lt;br /&gt;
            llOwnerSay(&amp;quot;Client/Viewer connection successful&amp;quot;);&lt;br /&gt;
        } else {&lt;br /&gt;
            // Something went wrong&lt;br /&gt;
            llOwnerSay(&amp;quot;Client/Viewer connection error: &amp;quot; + message);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= General Functionality =&lt;br /&gt;
This is the proposed functionality that would be implemented by the main patch itself, and supported by all viewers that speak this protocol. The idea is to provide some simple and generally useful functionality. All of them would use COMPONENT &amp;quot;DaleGlass.Viewer&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== GetViewerVersion ==&lt;br /&gt;
This command would return the viewer&#039;s version as a string, with the following format:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;major&amp;gt;$&amp;lt;minor&amp;gt;$&amp;lt;revision&amp;gt;$&amp;lt;build&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example, viewer version 1.17.0 (12) would be sent as:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
1$17$0$12&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GetViewerBuilder ==&lt;br /&gt;
Returns the name of the person who built the viewer. &amp;quot;Linden Lab&amp;quot; would be reserved for LL. My viewer would say &amp;quot;Dale Glass&amp;quot; here for instance.&lt;br /&gt;
&lt;br /&gt;
== GetViewerRevision ==&lt;br /&gt;
Returns the viewer&#039;s revision number. This would apply only to custom built viewers. The recommendation is that the reply to this message be the revision number from the builder&#039;s source repository.&lt;br /&gt;
&lt;br /&gt;
== GetExtensionList ==&lt;br /&gt;
Returns the list of supported viewer extensions, as a comma separated string. MUST NOT contain anything that&#039;d conflict with llCSV2List.&lt;br /&gt;
&lt;br /&gt;
Example reply:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
DaleGlass.Viewer, DaleGlass.AvatarScanner, ExampleAvatar.CoolScript&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The intention behind this command is allowing scripts that are capable of using multiple extensions determine which are present. &lt;br /&gt;
&lt;br /&gt;
== GetOperatingSystem ==&lt;br /&gt;
Returns a string describing the OS being used:&lt;br /&gt;
* Linux&lt;br /&gt;
* Windows&lt;br /&gt;
* OS X&lt;br /&gt;
* Solaris&lt;br /&gt;
* (etc)&lt;br /&gt;
&lt;br /&gt;
The intention is to allow scripts to determine that some functionality isn&#039;t available because the implementation is OS-specific. This MUST NOT be used as a primary method of detecting whether some functionality is supported (as this could change). Instead, this should only be used after GetExtensionList fails to return the desired functionality, and used to determine whether the lack of it is because it&#039;s not available on that OS at all.&lt;br /&gt;
&lt;br /&gt;
=See Also=&lt;br /&gt;
&lt;br /&gt;
See also: Q re client app current/ obsolete/ Mac/ Linux/ Windows/ LSL-Editor/ what at [[LlRequestClientData]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Design Discussions]]&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_To_Client_Communication&amp;diff=38329</id>
		<title>LSL To Client Communication</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_To_Client_Communication&amp;diff=38329"/>
		<updated>2007-10-27T19:50:39Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: corrected channel number calculation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Open Source Portal}}&lt;br /&gt;
&lt;br /&gt;
=Communication=&lt;br /&gt;
A mechanism is needed to allow LSL scripts to talk to the viewer in order to allow implementing some interesting functionality, such as viewer UI extensions that communicate with in-world objects, for instance. Viewer to LSL communication is easily possible, by making the viewer talk on a specific channel, or use XML RPC. This may not be ideal for all cases, but it&#039;s already doable without any modifications.&lt;br /&gt;
&lt;br /&gt;
What needs work is LSL to Client communication, as there currently isn&#039;t any good method in the official client for that.&lt;br /&gt;
&lt;br /&gt;
=Requirements=&lt;br /&gt;
A robust mechanism should satisfy these requirements:&lt;br /&gt;
&lt;br /&gt;
# Scripts must be able to receive messages from the viewer (can be done already with chat and XML RPC)&lt;br /&gt;
# Scripts must be able to reply to the viewer&lt;br /&gt;
# It must be possible to communicate with multiple viewers at once without confusion&lt;br /&gt;
# Order of delivery must be guaranteed (chat messages currently can be reordered)&lt;br /&gt;
# Messages must be reliable&lt;br /&gt;
&lt;br /&gt;
The hack below can satisfy requirements #1 to #3. Requirement #4 would require extra work (although it&#039;s doable) and is possibly best ignored, as LL mentioned the possibility of moving chat to TCP, which would automatically solve the issue.&lt;br /&gt;
&lt;br /&gt;
Requirement #5 is mostly satisfied as data isn&#039;t lost, and the only problem may be with the viewer or the script disappearing, which can be dealt with by designing the proper protocol, if needed.&lt;br /&gt;
&lt;br /&gt;
=Hack=&lt;br /&gt;
While there&#039;s no official solution, here&#039;s what I came up with for now:&lt;br /&gt;
&lt;br /&gt;
* Client to LSL: Client speaks on a channel directly. Nothing special here.&lt;br /&gt;
* LSL to Client: Script uses llOwnerSay, with this format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
$VwrComm$VERSION$COMPONENT$DATA&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fields:&lt;br /&gt;
* VwrComm: Header, must be present&lt;br /&gt;
* VERSION: Protocol version&lt;br /&gt;
* COMPONENT: Component inside the viewer the message is for&lt;br /&gt;
* DATA: Data being sent. The format of the data isn&#039;t specified.&lt;br /&gt;
&lt;br /&gt;
==Behavior==&lt;br /&gt;
&lt;br /&gt;
This is how the current implementation handles the protocol:&lt;br /&gt;
&lt;br /&gt;
# Message must come from an object. Normal chat doesn&#039;t trigger it&lt;br /&gt;
# String gets split by &amp;quot;$&amp;quot; and must have at least 4 tokens&lt;br /&gt;
# First token must be VwrComm&lt;br /&gt;
# Second token must be &amp;quot;0&amp;quot; (version number, this will change)&lt;br /&gt;
# Third token matches the name of a known component.&lt;br /&gt;
&lt;br /&gt;
If requirements #1 to #3 aren&#039;t satisfied, the string is passed as-is, and the code doesn&#039;t suppress its display.&lt;br /&gt;
&lt;br /&gt;
If requirement #4 isn&#039;t satisfied, the text won&#039;t appear on screen, but the code won&#039;t continue further either. A message will be logged in the viewer&#039;s log, saying that a message with the wrong version was received.&lt;br /&gt;
&lt;br /&gt;
If requirement #5 isn&#039;t satisfied, display is also suppressed, and a message is also logged.&lt;br /&gt;
&lt;br /&gt;
If all those requirements are satisfied, the data in the message is sent to the specified part of the viewer for futher processing.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
$VwrComm$0$DaleGlass.AvatarScanner$LoginComplete&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Implementation==&lt;br /&gt;
Code for this can be found at [http://svn.daleglass.net/secondlife/trunk/indra/newview/llviewermessage.cpp], line 2047&lt;br /&gt;
&lt;br /&gt;
Note that at the time of writing, the client isn&#039;t capable of telling the difference between object speech sent to all users (llSay/etc) and object speech sent only to the owner (llOwnerSay). It also doesn&#039;t check the speaking object&#039;s key or its owner&#039;s. This code must be fixed to obtain that information, so that the viewer can ignore messages from objects not owned by the user, when such a thing is necessary.&lt;br /&gt;
&lt;br /&gt;
=Protocol=&lt;br /&gt;
The above describes the system and format for exchanging data. However, there are still a few problems to solve:&lt;br /&gt;
&lt;br /&gt;
# Multiple extensions to the viewer must be able to coexist, without conflicting with others&lt;br /&gt;
# Viewer may not implement this at all, in which case the messages get displayed on screen&lt;br /&gt;
# Viewer replies to the script have potential security issues&lt;br /&gt;
&lt;br /&gt;
Proposed solutions:&lt;br /&gt;
&lt;br /&gt;
# See next section&lt;br /&gt;
# The LSL script initiates the conversation. It sends a single request and waits for a reply. This ensures that non-supporting clients don&#039;t get flooded with protocol data. &lt;br /&gt;
# During the establishment of the connection, the script chooses a random channel to listen on, and tells it to the viewer. This makes it very improbable that somebody will be able to intercept the data, as the channel will be different every time. An additional advantage is that there&#039;s no need to keep track of who uses what channel: the chance of a collision should be extremely low.&lt;br /&gt;
&lt;br /&gt;
== Component Naming ==&lt;br /&gt;
The COMPONENT field of the protocol specifies the name of the component inside the viewer the script wants to talk to. The data is an arbitrary ASCII string, which may not contain newlines or the $ character. The proposed format is &amp;quot;AvatarName.FunctionName&amp;quot;, where AvatarName is the first and last names of the avatar who created the functionality concatenated without a space, a period, and the name of the avatar&#039;s creation. This system should ensure that should two people come up with different ways to do the same thing, the COMPONENT names won&#039;t clash.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
$VwrComm$0$DaleGlass.AvatarScanner$LoginComplete&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connection Establishment ==&lt;br /&gt;
As described above, the LSL script initiates the communication by telling the viewer what channel it wants to talk on.&lt;br /&gt;
&lt;br /&gt;
=== Connection Request ===&lt;br /&gt;
* The COMPONENT field&#039;s value is &amp;quot;DaleGlass.Viewer&amp;quot;&lt;br /&gt;
* The payload is &amp;quot;Connect$&amp;lt;channel&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The fields are as follows:&lt;br /&gt;
* &amp;lt;channel&amp;gt; is the channel the script wants to talk on. For security, this SHOULD be randomly generated.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
$VwrComm$0$DaleGlass.Viewer$Connect$12421&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Viewer Reply ===&lt;br /&gt;
Viewer replies to the request by sending the message &amp;quot;OK&amp;quot; to the specified channel. Any other reply MUST be considered an error message.&lt;br /&gt;
&lt;br /&gt;
After this, any further requests to the viewer from the object are replied to in on the specified channel.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
integer g_channel = 0;         // Channel to talk on -- randomly generated&lt;br /&gt;
integer g_listen_handle = 0;   // Listen handle&lt;br /&gt;
&lt;br /&gt;
integer g_timeout = 30;        // How long to wait for the viewer to reply&lt;br /&gt;
&lt;br /&gt;
ViewerComm(string component, string data) {&lt;br /&gt;
    llOwnerSay(&amp;quot;$VwrComm$0$&amp;quot; + component + &amp;quot;$&amp;quot; + data);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        // Generate a random channel number&lt;br /&gt;
        g_channel = (integer)(llFrand(2147482646.0) + 1000.0);&lt;br /&gt;
&lt;br /&gt;
        // Set a timer in case the viewer doesn&#039;t reply&lt;br /&gt;
        llSetTimerEvent(g_timeout);&lt;br /&gt;
&lt;br /&gt;
        // Listen for replies&lt;br /&gt;
        g_listen_handle = llListen(g_channel, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // Send connection request&lt;br /&gt;
        ViewerComm(&amp;quot;DaleGlass.Viewer&amp;quot;, &amp;quot;Connect$&amp;quot; + (string)channel);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer() {&lt;br /&gt;
        llListenRemove(g_listen_handle);&lt;br /&gt;
        llOwnerSay(&amp;quot;Client/Viewer connection timed out -- probably not supported&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    listen( integer channel, string name, key id, string message ) {&lt;br /&gt;
        if ( message == &amp;quot;OK&amp;quot; ) {&lt;br /&gt;
            // Connection successful&lt;br /&gt;
            llOwnerSay(&amp;quot;Client/Viewer connection successful&amp;quot;);&lt;br /&gt;
        } else {&lt;br /&gt;
            // Something went wrong&lt;br /&gt;
            llOwnerSay(&amp;quot;Client/Viewer connection error: &amp;quot; + message);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= General Functionality =&lt;br /&gt;
This is the proposed functionality that would be implemented by the main patch itself, and supported by all viewers that speak this protocol. The idea is to provide some simple and generally useful functionality. All of them would use COMPONENT &amp;quot;DaleGlass.Viewer&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== GetViewerVersion ==&lt;br /&gt;
This command would return the viewer&#039;s version as a string, with the following format:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;major&amp;gt;$&amp;lt;minor&amp;gt;$&amp;lt;revision&amp;gt;$&amp;lt;build&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example, viewer version 1.17.0 (12) would be sent as:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
1$17$0$12&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GetViewerBuilder ==&lt;br /&gt;
Returns the name of the person who built the viewer. &amp;quot;Linden Lab&amp;quot; would be reserved for LL. My viewer would say &amp;quot;Dale Glass&amp;quot; here for instance.&lt;br /&gt;
&lt;br /&gt;
== GetViewerRevision ==&lt;br /&gt;
Returns the viewer&#039;s revision number. This would apply only to custom built viewers. The recommendation is that the reply to this message be the revision number from the builder&#039;s source repository.&lt;br /&gt;
&lt;br /&gt;
== GetExtensionList ==&lt;br /&gt;
Returns the list of supported viewer extensions, as a comma separated string. MUST NOT contain anything that&#039;d conflict with llCSV2List.&lt;br /&gt;
&lt;br /&gt;
Example reply:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
DaleGlass.Viewer, DaleGlass.AvatarScanner, ExampleAvatar.CoolScript&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The intention behind this command is allowing scripts that are capable of using multiple extensions determine which are present. &lt;br /&gt;
&lt;br /&gt;
== GetOperatingSystem ==&lt;br /&gt;
Returns a string describing the OS being used:&lt;br /&gt;
* Linux&lt;br /&gt;
* Windows&lt;br /&gt;
* OS X&lt;br /&gt;
* Solaris&lt;br /&gt;
* (etc)&lt;br /&gt;
&lt;br /&gt;
The intention is to allow scripts to determine that some functionality isn&#039;t available because the implementation is OS-specific. This MUST NOT be used as a primary method of detecting whether some functionality is supported (as this could change). Instead, this should only be used after GetExtensionList fails to return the desired functionality, and used to determine whether the lack of it is because it&#039;s not available on that OS at all.&lt;br /&gt;
&lt;br /&gt;
=See Also=&lt;br /&gt;
&lt;br /&gt;
See also: Q re client app current/ obsolete/ Mac/ Linux/ Windows/ LSL-Editor/ what at [[LlRequestClientData]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Design Discussions]]&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Viewer_Authentication_Critique&amp;diff=33733</id>
		<title>Viewer Authentication Critique</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Viewer_Authentication_Critique&amp;diff=33733"/>
		<updated>2007-09-29T21:28:18Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: /* Signatories */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a formal critique of [[Viewer Authentication]] that was [https://lists.secondlife.com/pipermail/sldev/2007-September/005403.html requested] by [[User:Rob Linden]] on the [[SLDev]] mailing list.&lt;br /&gt;
&lt;br /&gt;
For a branch of the discussion see [https://wiki.secondlife.com/wiki/Talk:Viewer_Authentication Talk page on the original proposal.]&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
&lt;br /&gt;
=== LL&#039;s Objectives ===&lt;br /&gt;
* To mitigate the danger of password capturing Trojans masquerading as third party viewers&lt;br /&gt;
* Improve trust in third party viewers by providing a means of assurance to the user that the third party viewer could not be a Trojan capturing usernames and passwords.&lt;br /&gt;
&lt;br /&gt;
=== Pros ===&lt;br /&gt;
* Viewer does not have to process (and &amp;quot;see&amp;quot;) username and password&lt;br /&gt;
&lt;br /&gt;
=== Cons ===&lt;br /&gt;
* Viewer still involves running trusted code on the computer and could initiate other attacks e.g.&lt;br /&gt;
** Silently buy L$ and pass onto another account&lt;br /&gt;
** Pass token onto bot, and drop the users connection&lt;br /&gt;
** Install key logger to monitor the next website login&lt;br /&gt;
** Salami slicing - make additional small or duplicate payments to cutout when user purchases or pays in game.&lt;br /&gt;
* Potential for naive user to believe this reduces all risks in using a third party viewer.&lt;br /&gt;
* Most of these attacks could be performed by any third-party software designed for use with SL&lt;br /&gt;
** A local support program could install a keylogger.&lt;br /&gt;
** A local support program could inject code into the client.&lt;br /&gt;
** Look at &#039;cheating&#039; tools in MMORPGs for possible approaches.&lt;br /&gt;
* Potential for phishing websites to entice users to enter username and password and then pass control to SL website and viewer.&lt;br /&gt;
** This kind of attack is not theoretical, phishing websites are a criminal industry.&lt;br /&gt;
* Possibility some third party clients will retain the existing UI in order to make it easier for people with alts and multiple clients, and do appropriate GETs and POSTs on the SL to initiate a logon and get the token (thus defeating the original purpose)&lt;br /&gt;
** The issues raised in the next section would mean that people would have an incentive to use this kind of client.&lt;br /&gt;
* Too reliant on browser/OS implementations (proxies, firewalls, used browsers, etc.)&lt;br /&gt;
* Relies on browser security, and uses a mechanism often disabled or filtered due to security concerns&lt;br /&gt;
* Links to secondlife:// can only point to one instance (version, e.g. homebrew, release candidate official) of the program&lt;br /&gt;
* Links to secondlife:// can not pass parameters to the program&lt;br /&gt;
&lt;br /&gt;
=== Alternatives ===&lt;br /&gt;
* One time passwords (for copy paste into a non-secure viewer or to print and take with you to friends, internet cafes, public terminals, etc.)&lt;br /&gt;
* lower perm passwords (pwds which put the account into a restricted state, disallowing &amp;quot;dangerous&amp;quot; transactions)&lt;br /&gt;
* separate passwords for website account and being inworld&lt;br /&gt;
* Account restrictions &lt;br /&gt;
* CRAM-MD5 or a similar challenge-response type &lt;br /&gt;
* Dictionary check to reject insecure passwords&lt;br /&gt;
=== Other Issues ===&lt;br /&gt;
* The main existing vulnerability involving the viewer and passwords is that the viewer does not use a cryptographically secure mechanism to pass the password to the server, &amp;lt;b&amp;gt;not&amp;lt;/b&amp;gt; that the viewer may be stealing the password.&lt;br /&gt;
* In practice, trapdoored unofficial third party clients for applications have not historically been a major problem. This seems to be attacking an exposure that is primarily theoretical, and using a mechanism that has been known to be exploited to solve it.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Flexibility ==&lt;br /&gt;
&lt;br /&gt;
=== LL&#039;s Objectives ===&lt;br /&gt;
* Single Sign On - allowing multiple web applications (forums, support, account, jira, wiki etc.) and viewers to use the same username and password through a single point without duplicating usernames and passwords into multiple systems&lt;br /&gt;
* Extension of this to allow non-LL applications and web sites to participate in this single sign on system.&lt;br /&gt;
&lt;br /&gt;
=== Pros ===&lt;br /&gt;
* Enables username/password authentication to work on third party sites without them having to &amp;quot;see&amp;quot; username and password&lt;br /&gt;
&lt;br /&gt;
=== Cons ===&lt;br /&gt;
* This is really an unrelated issue...&lt;br /&gt;
** The client doesn&#039;t need to depend on the website for this purpose, or this could be a command line option.&lt;br /&gt;
** The client could just as easily be the &#039;authentication source&#039; as the website.&lt;br /&gt;
*** Via a &amp;quot;go to website&amp;quot; link in the client that passed an equivalent token.&lt;br /&gt;
&lt;br /&gt;
=== Alternatives ===&lt;br /&gt;
* Use this mechanism for websites (including third party) only but not for viewers&lt;br /&gt;
* Identity Metasystem - [http://en.wikipedia.org/wiki/Identity_Metasystem]&lt;br /&gt;
** OpenID - [http://openid.net/]&lt;br /&gt;
** CardSpace - [http://msdn2.microsoft.com/en-us/netframework/aa663320.aspx]&lt;br /&gt;
** CAS - [http://www.ja-sig.org/products/cas/]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
== Persistence ==&lt;br /&gt;
&lt;br /&gt;
=== LL&#039;s Objectives ===&lt;br /&gt;
* To integrate the various LL&#039;s systems (forums, support, jira, account, etc.) so that by logging onto one, you are automatically logged onto the others.&lt;br /&gt;
&lt;br /&gt;
=== Pros ===&lt;br /&gt;
&lt;br /&gt;
=== Cons ===&lt;br /&gt;
* As in the previous section, LL&#039;s objectives could be met without the browser logging in via the same mechanism.&lt;br /&gt;
* Inconvenient for those with alts&lt;br /&gt;
** Cumbersome to change alts and logon with multiple alts&lt;br /&gt;
** Those with alts, often have a primary account which is used for forums and logged on permanently to forums even when the alt is online in SL&lt;br /&gt;
* Inconvenient for those with multiple clients&lt;br /&gt;
* Danger on public or multi-user machines that the user will log out of the client, but not log out of the website properly allowing the next user to access their account.&lt;br /&gt;
* Staying online on secondlife.com (which many people seem to do) automatically means anyone with access to the computer/browser (family) can log in with the account inworld&lt;br /&gt;
&lt;br /&gt;
=== Alternatives ===&lt;br /&gt;
* Is this really needed? &lt;br /&gt;
=== Other issues ===&lt;br /&gt;
* Is this kind of persistence desirable &#039;&#039;for the client&#039;&#039;? SL is not an extension of the web, it&#039;s a different kind of interface... one that has the potential of becoming a &amp;quot;3d web&amp;quot;. &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Misc ==&lt;br /&gt;
&lt;br /&gt;
* this should be an option for those who have increased security needs, users should be able to make their own risk/convenience decisions&lt;br /&gt;
* the feature especially forces those into an extra login step, who use an official viewer (homebrews will most likely quickly implement a way around this for convenience)&lt;br /&gt;
* starting SL from the web browser on a regular basis will most likely result in the web browser lingering in memory in the background when running the viewer, which based on the heavy memory requirement may impair viewer performance.&lt;br /&gt;
* this would make things harder for independent grids to use the official client. Is this considered an advantage or a disadvantage by LL?&lt;br /&gt;
&lt;br /&gt;
== Signatories ==&lt;br /&gt;
&lt;br /&gt;
Please sign this below with &amp;quot;&amp;lt;nowiki&amp;gt;~~~~&amp;lt;/nowiki&amp;gt;&amp;quot; if you agree with the version of this document you are reading.  The date will indicate which version of the document you read and agree with. &lt;br /&gt;
&lt;br /&gt;
* [[User:Matthew Dowd|Matthew Dowd]] 11:27, 29 September 2007 (PDT)&lt;br /&gt;
* [[User:Argent Stonecutter|Argent Stonecutter]] 13:53, 29 September 2007 (PDT)&lt;br /&gt;
* [[User:Dale Glass|Dale Glass]] 14:28, 29 September 2007 (PDT)&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Viewer_Authentication_Critique&amp;diff=33692</id>
		<title>Viewer Authentication Critique</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Viewer_Authentication_Critique&amp;diff=33692"/>
		<updated>2007-09-29T18:47:35Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: Added account  restrictions to alternatives list&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Security ==&lt;br /&gt;
&lt;br /&gt;
=== Pros ===&lt;br /&gt;
* Viewer does not have to process (and &amp;quot;see&amp;quot;) username and password&lt;br /&gt;
&lt;br /&gt;
=== Cons ===&lt;br /&gt;
* Viewer still involves running trusted code on the computer and could initiate other attacks e.g.&lt;br /&gt;
** Silently buy L$ and pass onto another account&lt;br /&gt;
** Pass token onto bot, and drop the users connection&lt;br /&gt;
** Install key logger&lt;br /&gt;
* Potential for phishing websites to entice users to enter username and password and then pass control to SL website and viewer.&lt;br /&gt;
* Possibility some third party clients will retain the existing UI in order to make it easier for people with alts and multiple clients, and do appropriate GETs and POSTs on the SL to initiate a logon and get the token (thus defeating the original purpose)&lt;br /&gt;
* Too reliant on browser/OS implementations&lt;br /&gt;
* Relies on browser security, and uses a mechanism often disabled due to security concerns&lt;br /&gt;
&lt;br /&gt;
=== Alternatives ===&lt;br /&gt;
* One time passwords&lt;br /&gt;
* Account restrictions&lt;br /&gt;
&lt;br /&gt;
== Flexibility ==&lt;br /&gt;
&lt;br /&gt;
=== Pros ===&lt;br /&gt;
* Enables username/password authentication to work on third party sites without them having to &amp;quot;see&amp;quot; username and password&lt;br /&gt;
&lt;br /&gt;
=== Cons ===&lt;br /&gt;
&lt;br /&gt;
=== Alternatives ===&lt;br /&gt;
* Use this mechanism for websites (including third party) only but not for viewers&lt;br /&gt;
* OpenID&lt;br /&gt;
* CardSpace&lt;br /&gt;
* Identity Metasystem&lt;br /&gt;
&lt;br /&gt;
== Persistence ==&lt;br /&gt;
&lt;br /&gt;
=== Pros ===&lt;br /&gt;
&lt;br /&gt;
=== Cons ===&lt;br /&gt;
* Inconvenient for those with alts&lt;br /&gt;
** Cumbersome to change alts and logon with multiple alts&lt;br /&gt;
** Those with alts, often have a primary account which is used for forums and logged on permanently to forums even when the alt is online in SL&lt;br /&gt;
* Inconvenient for those with multiple clients&lt;br /&gt;
* Danger on public or multi-user machines that the user will log out of the client, but not log out of the website properly allowing the next user to access their account.&lt;br /&gt;
&lt;br /&gt;
=== Alternatives ===&lt;br /&gt;
* Is this really needed? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
--[[User:Matthew Dowd|Matthew Dowd]] 11:27, 29 September 2007 (PDT)&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Bug_triage/2007-09-17&amp;diff=31864</id>
		<title>Bug triage/2007-09-17</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Bug_triage/2007-09-17&amp;diff=31864"/>
		<updated>2007-09-17T17:08:41Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: Add VWR-2502&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Bug triage}}&lt;br /&gt;
&lt;br /&gt;
General triage -  Next meeting: Monday, 3pm PT (2007-09-17) in the {{SLurl&lt;br /&gt;
|region=Hippotropolis&lt;br /&gt;
|x=241&lt;br /&gt;
|y=27&lt;br /&gt;
|z=23&lt;br /&gt;
|title=Hippotropolis Meeting area&lt;br /&gt;
|}}.  See [[Bug triage]] for details.&lt;br /&gt;
&lt;br /&gt;
== Fast Track Import ==&lt;br /&gt;
&lt;br /&gt;
(Move bugs here that have solid repros, or valid patches that you have reviewed)&lt;br /&gt;
&lt;br /&gt;
== Hot by Vote ==&lt;br /&gt;
* {{jira|MISC-33}} - Votes: 68 - Risk API false positives increase - {{User|Apotheus Silverman}}&lt;br /&gt;
** worse since 2007-08-25 --&amp;gt; reopened&lt;br /&gt;
** better again since 2007-09-13&lt;br /&gt;
* {{jira|SVC-553}} - Votes: 24 - numerous reports of objects, notecards, scripts, gestures &amp;quot;missing from database&amp;quot; - {{User|Lex Neva}}&lt;br /&gt;
** already triaged at [[Bug_triage/2007-08-20#Hot_by_Vote]]&lt;br /&gt;
** looks like no action has been taken back then&lt;br /&gt;
* {{jira|SVC-523}} - Votes: 15 - Object entry restriction not enabling on parcel - {{User|leena deschanel}}&lt;br /&gt;
* {{jira|WEB-104}} - Votes: 13 - Downloaded transactions do not include Region - {{User|alpha2 zenovka}}&lt;br /&gt;
* {{jira|MISC-326}} - Votes: 13 - Governor Linden owned parcels do not have uniform parcel settings which allows griefers to create parcel infringing and other objectionable objects that are not affected by auto-return. - {{User|Hoshi Kiama}}&lt;br /&gt;
* {{jira|VWR-852}} - Votes: 11 - no-transfer textures not searchable via texture picker - {{User|SignpostMarv Martin}}&lt;br /&gt;
* {{jira|VWR-1108}} - Votes: 10 - No voice and related functions - {{User|Aodhan McDunnough}}&lt;br /&gt;
* {{jira|MISC-325}} - Votes: 10 - Avatar arms and legs turn black / psychedelic - {{User|sasha vollmar}}&lt;br /&gt;
* {{jira|VWR-2390}} - Votes: 9 - unable to select texture on a friend&#039;s prim despite full permissions - {{User|McCabe Maxsted}}&lt;br /&gt;
* {{jira|VWR-1319}} - Votes: 9 - USB headset on Mac works differently on mainland vs. islands - {{User|martholomew mip}}&lt;br /&gt;
* {{jira|VWR-996}} - Votes: 8 - wrong visualisation of animations - {{User|Doris Haller}}&lt;br /&gt;
* {{jira|VWR-1799}} - Votes: 8 - Voice not Working - {{User|Taran Asbrink}}&lt;br /&gt;
* {{jira|SVC-483}} - Votes: 8 - Script is missing from Database - {{User|Laronzo Fitzgerald}}&lt;br /&gt;
* {{jira|VWR-2148}} - Votes: 8 - Object Missing from Database - {{User|silas scarborough}}&lt;br /&gt;
* {{jira|VWR-2387}} - Votes: 8 - Animations always drift when uploading with an inner loop of anything except 0% - 100% - {{User|Chavo Raven}}&lt;br /&gt;
* {{jira|VWR-2502}} - Votes: 8 - Add mute button to script notices - {{User|Dale Glass}}&lt;br /&gt;
&lt;br /&gt;
== Patches ==&lt;br /&gt;
* {{jira|VWR-1677}} - Votes: 0 - Ctrl+T does not return focus to the chat bar in IM window - {{User|Feynt Mistral}}&lt;br /&gt;
** according to Nicholaz, the patch is a &#039;sketch version&#039;, based on his source (and therefore old school IM windows)--[[User:Boroondas Gupte|Boroondas Gupte]] 14:03, 15 September 2007 (PDT)&lt;br /&gt;
* {{jira|VWR-2113}} - Votes: 0 - Mac Auto Updater &amp;quot;hides&amp;quot;, giving appearance of failing - {{User|Gibson Willis}}&lt;br /&gt;
** one-liner&lt;br /&gt;
* {{jira|SVC-580}} - Votes: 1 - ATTACH_LPEC / ATTACH_RPEC reversed - {{User|Ziggy Puff}}&lt;br /&gt;
** &#039;&#039;&#039;will&#039;&#039;&#039; break existing scripts relying on current (wrong) naming of the constants, but &#039;&#039;&#039;only when they&#039;re being recompiled&#039;&#039;&#039;&lt;br /&gt;
** otherwise safe--[[User:Boroondas Gupte|Boroondas Gupte]] 14:03, 15 September 2007 (PDT)&lt;br /&gt;
* {{jira|VWR-2255}} - Votes: 1 - Mac updater does not log output. - {{User|Grazer Kline}}&lt;br /&gt;
* {{jira|VWR-2256}} - Votes: 1 - Mac updater directory permission issues - {{User|Grazer Kline}}&lt;br /&gt;
* {{jira|VWR-2411}} - Votes: 0 - Possible crash in pipeline.cpp - {{User|Nicholaz Beresford}}&lt;br /&gt;
** adds a check, should be safe--[[User:Boroondas Gupte|Boroondas Gupte]] 14:03, 15 September 2007 (PDT)&lt;br /&gt;
* {{jira|VWR-2412}} - Votes: 0 - Possible crash drawpoolwater - {{User|Nicholaz Beresford}}&lt;br /&gt;
** same here--[[User:Boroondas Gupte|Boroondas Gupte]] 14:03, 15 September 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
== Misc Pool ==&lt;br /&gt;
* {{jira|SVC-29}} - Votes: 2 - XMLRPC sporadically (but usually) very slow - {{User|Apotheus Silverman}}&lt;br /&gt;
* {{jira|MISC-33}} - Votes: 68 - Risk API false positives increase - {{User|Apotheus Silverman}}&lt;br /&gt;
* {{jira|SVC-120}} - Votes: 0 - Objects -&amp;gt; Permissions -&amp;gt; Modify Rights -&amp;gt; affects Return ability - {{User|Gigs Taggart}}&lt;br /&gt;
* {{jira|WEB-86}} - Votes: 3 - Transaction History Total Bug when paying self owned object - {{User|Gypsy Paz}}&lt;br /&gt;
* {{jira|VWR-2426}} - Votes: 1 - Missing character in email sent with llEmail - {{User|Simil Miles}}&lt;br /&gt;
* {{jira|VWR-500}} - Votes: 4 - Searching inventory for &amp;quot;copy&amp;quot;, &amp;quot;modify&amp;quot; etc brings up everything. - {{User|Gigs Taggart}}&lt;br /&gt;
* {{jira|WEB-87}} - Votes: 4 - Land Store Map is not Updating - {{User|Gigs Taggart}}&lt;br /&gt;
* {{jira|VWR-505}} - Votes: 5 - Alpha-sorting of prims reversed, causing &#039;solid, non-alpha&#039; prims to disappear. - {{User|beatfox xevious}}&lt;br /&gt;
* {{jira|SVC-128}} - Votes: 1 - automatic deletion of group leaves any owned property in &amp;quot;limbo&amp;quot; - {{User|Ahzzmandius Werribee}}&lt;br /&gt;
* {{jira|SVC-130}} - Votes: 3 - CC needed with PayPal, contradictory to what sl website says - {{User|3dziggy oh}}&lt;br /&gt;
** should be moved to WEB&lt;br /&gt;
** PayPal page, when invoked by [https://secondlife.com/account/billing.php SL.com&#039;s billing page], reacts different than what the billing page makes you expect.&lt;br /&gt;
*** -- [[User:Boroondas Gupte|Boroondas Gupte]] 14:18, 27 August 2007 (PDT)&lt;br /&gt;
* {{jira|SVC-131}} - Votes: 0 - Physical objects set to slow velocity sometimes stop - {{User|Ralph Doctorow}}&lt;br /&gt;
* {{jira|SVC-132}} - Votes: 1 - Setting vehicle buoyancy to very close to neutral stops slow moving vehicles - {{User|Ralph Doctorow}}&lt;br /&gt;
* {{jira|VWR-509}} - Votes: 1 - Renamed snaphots return to the default name Snapshot - {{User|Lisa Lowe}}&lt;br /&gt;
* {{jira|WEB-92}} - Votes: 0 - &amp;quot;Last Visit&amp;quot; Timestamp Bug - {{User|ViktorScorich Villota}}&lt;br /&gt;
* {{jira|WEB-94}} - Votes: 0 - credit card details that have been used for 3 years are now unauthorized - {{User|Fau Ferdinand}}&lt;br /&gt;
* {{jira|SVC-139}} - Votes: 0 - llOwnerSay-messages arrive in wrong order - {{User|Homer Horwitz}}&lt;br /&gt;
* {{jira|VWR-528}} - Votes: 3 - llSetScale fails on Flexi Objects - {{User|Rifkin Habsburg}}&lt;br /&gt;
* {{jira|SVC-141}} - Votes: 1 - Restrict Pushing disallows pushes from objects set to group - {{User|Lex Neva}}&lt;br /&gt;
* {{jira|MISC-150}} - Votes: 2 - When a child prim moves with llSetPos, any avatar sitting on it does not move. - {{User|Gigs Taggart}}&lt;br /&gt;
* {{jira|VWR-545}} - Votes: 3 - Controls freeze / inventry incomplete / Menus freeze / avatar wrong sex! - {{User|ratus raymaker}}&lt;br /&gt;
&lt;br /&gt;
== Pre-meeting activity ==&lt;br /&gt;
&lt;br /&gt;
Some issues will be resolved in the course of building this agenda.  Rather than deleting them from the proposed agenda, move the issue and associated discussion into the appropriate section below.&lt;br /&gt;
&lt;br /&gt;
=== Imported ===&lt;br /&gt;
&lt;br /&gt;
=== Resolved ===&lt;br /&gt;
&lt;br /&gt;
== Transcript ==&lt;br /&gt;
Transcript is/will be at [[{{PAGENAME}}/Transcript]]&lt;br /&gt;
&lt;br /&gt;
{{Bug List Instructions}}&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Alternate_viewers&amp;diff=29945</id>
		<title>Alternate viewers</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Alternate_viewers&amp;diff=29945"/>
		<updated>2007-08-31T19:49:48Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: Added logging feature&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
The [[Extended_FAQ|Extended FAQ]] states that it is okay to create and distribute homebrew viewers as long they adhere to the respective licenses for code usage and server usage.  &lt;br /&gt;
&lt;br /&gt;
The code itself is licensed under {{OSWebsite|gplv2|alt=the GNU General Public License (GPL)}}, which governs modification and redistribuition of the source code.  Use of Linden Lab&#039;s servers will still be governed by [http://secondlife.com/corporate/tos.php the Second Life Terms of Service]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Homebrew viewers are obviously not associated with LindenLab, are governed by their own respective licenses.  LindenLab is not responsible for any desired or undesired results in association with those viewers.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Note to authors: If you make a viewer available make sure to include platform, version numbers and dates.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
== Official Linden Lab Viewer ==&lt;br /&gt;
&lt;br /&gt;
=== Description ===&lt;br /&gt;
&lt;br /&gt;
This viewer is the official version from LindenLab.&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
* Website: [http://www.secondlife.com/ Second Life]&lt;br /&gt;
* Downloads: [http://secondlife.com/community/downloads.php LindenLab download page]&lt;br /&gt;
* Source code: [[Get_source_and_compile]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
== Able Edition ==&lt;br /&gt;
&lt;br /&gt;
=== Description ===&lt;br /&gt;
&lt;br /&gt;
This is a Windows viewer is an unofficial build which adds a [https://jira.secondlife.com/browse/VWR-1017 Mute Visibility] feature, which allows objects in-world to be rendered partially or entirely invisible. &lt;br /&gt;
&lt;br /&gt;
=== Extra Features ===&lt;br /&gt;
* Mute Visibility &lt;br /&gt;
* Improvements to the Mute List&lt;br /&gt;
* Muting objects applies to entire linksets&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
* Website: [http://ablewhitman.blogspot.com/ Able Whitman on Blogspot]&lt;br /&gt;
* Direct download link: http://ablewhitman.org/viewer/&lt;br /&gt;
* Source code: http://ablewhitman.org/viewer/&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
== Dale Glass Edition ==&lt;br /&gt;
&lt;br /&gt;
=== Description ===&lt;br /&gt;
&lt;br /&gt;
This is a Windows (soon Linux) viewer which adds new experimental features. The features are intended to give users more information about the world and to simplify moderation by making it easier to tell where people are and what they&#039;re doing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Extra Features ===&lt;br /&gt;
* Avatar Scanner&lt;br /&gt;
** Shows nearby avatars, roughly in drawing distance range.&lt;br /&gt;
** Shows name, age, payment info, current activity. &lt;br /&gt;
** Land and estate commands for ejecting/banning multiple avatars at once&lt;br /&gt;
** Integration with Luskwood moderation tools&lt;br /&gt;
** Buttons to open profile, IM, teleport to or track selected avatars&lt;br /&gt;
* Event Log: Experimental feature, shows a list of active particle effects (soon sounds too), and their owners. Allows moving camera to emitter.&lt;br /&gt;
* Branding: Replaces LL branding with my own. Different login page, checks for updates against my server.&lt;br /&gt;
* Logging of the owner and location of speaking objects&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
* Website: http://sl.daleglass.net&lt;br /&gt;
* Blog: http://daleglass.wordpress.com&lt;br /&gt;
* Direct download link: http://sl.daleglass.net/download&lt;br /&gt;
* Source code: http://svn.daleglass.net/sl/release/ ( [[User:Dale_Glass#Subversion_Repository|subversion]] )&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
== Nicholaz Edition ==&lt;br /&gt;
&lt;br /&gt;
=== Description ===&lt;br /&gt;
&lt;br /&gt;
This is a Windows viewer based on SL builds with various preliminary bug fix patches applied.  Nonetheless it is of course an unofficial build.  See [http://www.blueflash.cc/users/nicholaz/!!Installation.txt Installation.txt], [http://www.blueflash.cc/users/nicholaz/!Changes.txt Changes.txt] for more information.&lt;br /&gt;
&lt;br /&gt;
=== Extra Features ===&lt;br /&gt;
* Particle system improved&lt;br /&gt;
* Different memory management for image list &lt;br /&gt;
* Many patches from the bug tracker which are not yet in the official viewer&lt;br /&gt;
* Old style GUI and GUI redesigns for the voice viewer &lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
* Website: [http://nicholaz-beresford.blogspot.com/ Nicholaz Beresford on Blogspot]&lt;br /&gt;
* Direct download link: [http://www.blueflash.cc/users/nicholaz Download versions of this viewer] &lt;br /&gt;
* Source code: Look at the download site for the source-xxx-zip archive&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;amp;nbsp;&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Dale_Glass&amp;diff=29798</id>
		<title>User:Dale Glass</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Dale_Glass&amp;diff=29798"/>
		<updated>2007-08-30T22:12:19Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: log_object_owners branch&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Evil Scripter and RL programmer.&lt;br /&gt;
&lt;br /&gt;
Currently working on adding an avatar scanner to the SL client.&lt;br /&gt;
&lt;br /&gt;
= Projects =&lt;br /&gt;
== Avatar Scanner ==&lt;br /&gt;
http://daleglass.net/images/screenshots/avlist6_001.jpg&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Shows a list of all avatars known to the client. This can be easily more than a standard 96m scanner, and seems to depend on rendering distance.&lt;br /&gt;
&lt;br /&gt;
* Keeps an internal list of avatars, and continues showing avatars that disappeared in the list for several seconds to give people time to perform some action on them (intended to make it easier to deal with griefers that do something nasty, then teleport out)&lt;br /&gt;
&lt;br /&gt;
* Shows Linden accounts in bold. This will be expanded later to highlight people who are very new, don&#039;t have a credit card on file, etc depending on user configuration.&lt;br /&gt;
&lt;br /&gt;
* Allows easy access to IM, profiles, etc&lt;br /&gt;
&lt;br /&gt;
* Allows to start a conference to multiple avatars around you, the same way it works in the friends list.&lt;br /&gt;
&lt;br /&gt;
* Allows tracking an avatar by placing a beacon on it. In the case the selected avatar isn&#039;t a friend who gave map location permission, it works anyway by placing a beacon on the avatar&#039;s last known position. This of course only works so long the avatar being tracked is near enough to be seen by the user.&lt;br /&gt;
&lt;br /&gt;
* Automatically retrieves the birth date, account type and payment data for all users shown. The data is of course cached, and if this is too much of an extra load, I&#039;ll implement a permanent on-disk cache. If data doesn&#039;t arrive, it will retry with an exponential backoff (starting from 1 minute, doubling until 30 minutes)&lt;br /&gt;
&lt;br /&gt;
* Displays activity status: new, left the area, emitting particles, moving, playing sound&lt;br /&gt;
&lt;br /&gt;
* Allows moving the camera to the avatar with a double click, as well as cycling the camera between all or only the marked avatars&lt;br /&gt;
&lt;br /&gt;
* Partial TrustNet integration: retrieves scores, but can&#039;t rate yet&lt;br /&gt;
&lt;br /&gt;
What is not done yet, but will be:&lt;br /&gt;
&lt;br /&gt;
* Integration with my TrustNet system. See here for details:&lt;br /&gt;
http://daleglass.net/tikiwiki/tiki-index.php?page=TrustNetAvatarScanner&lt;br /&gt;
http://daleglass.net/tikiwiki/tiki-index.php?page=HowTrustNetWorks&lt;br /&gt;
&lt;br /&gt;
* Integration with resident-run databases. For example, I&#039;ve been asked whether I could make it automatically query a website with a database of buyers to be able to tell people who are using avatars made with copybot, for instance.&lt;br /&gt;
&lt;br /&gt;
* Buttons for administrative actions such as ban/eject/freeze/etc&lt;br /&gt;
&lt;br /&gt;
* Add activity status for typing and rezzing objects&lt;br /&gt;
&lt;br /&gt;
* Also longer term, option to make the client stop rendering an avatar completely.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Beta&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/avatarscanner&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== TrustNet Integration ==&lt;br /&gt;
With the disappearance of SL ratings, I&#039;m working on a replacement based on my TrustNet system. Current status is very experimental but with some functional code.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a [http://daleglass.net/images/screenshots/trustnet_001.jpg screenshot] of what it looks like.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Alpha&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/trustnet&lt;br /&gt;
&lt;br /&gt;
== Viewer/Script Communication ==&lt;br /&gt;
This is a hack to let a script talk to the viewer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Stable&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/viewercomm&lt;br /&gt;
&lt;br /&gt;
== Keyboard Hack ==&lt;br /&gt;
This is a viewer hack to make it transmit every keypress as a message on a channel. Used to implement an in-world keyboard that shows the real keypresses while the user is typing. General usage is discouraged, as this multiplies by 20-50 times the amount of chat messages sent to the sim and LL probably wouldn&#039;t like this sort of thing to be used widely.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Stable, but needs cleaning up and improvements.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/realkeyboard&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Scripts =&lt;br /&gt;
&lt;br /&gt;
* http://daleglass.net/scripts/load_archive.pl -- Script for loading source archives into Subversion. See comments in the source for usage.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
The repository is located at [http://svn.daleglass.net/sl/ svn.daleglass.net]&lt;br /&gt;
&lt;br /&gt;
== Branches ==&lt;br /&gt;
Current branches are:&lt;br /&gt;
* &#039;&#039;&#039;buildfixes_1-18-0&#039;&#039;&#039;: 1.18.0 source, plus small compilation changes, for building with gcc4 and VC++ 2005. No functional changes here. Adds my installer.&lt;br /&gt;
* &#039;&#039;&#039;realkeyboard&#039;&#039;&#039;: Silly patch that sends each keypress on a channel. Used to create a keyboard in SL that reflects my real keypresses.&lt;br /&gt;
* &#039;&#039;&#039;viewercomm&#039;&#039;&#039;: Viewer/object communication patch&lt;br /&gt;
* &#039;&#039;&#039;avatarscanner&#039;&#039;&#039;: Avatar scanner patch&lt;br /&gt;
* &#039;&#039;&#039;trustnet&#039;&#039;&#039;: Support for my reputation system&lt;br /&gt;
* &#039;&#039;&#039;branding&#039;&#039;&#039;: Branding changes: Different menu bar color, send crash reports to daleglass.net&lt;br /&gt;
* &#039;&#039;&#039;release&#039;&#039;&#039;: Merge of various branches. This is where my installers are made from.&lt;br /&gt;
* &#039;&#039;&#039;trunk&#039;&#039;&#039;: Currently unused&lt;br /&gt;
* &#039;&#039;&#039;log_object_owners&#039;&#039;&#039;: Show owners and location of speaking objects in chat history&lt;br /&gt;
&lt;br /&gt;
== How to get a patch ==&lt;br /&gt;
People sometimes ask me if I have patches. Currently I don&#039;t make them, because you can easily create an up to date one. Here&#039;s how:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ svn diff http://svn.daleglass.net/sl/branches/buildfixes_1-18-0 http://svn.daleglass.net/sl/branches/&amp;lt;branch&amp;gt; &amp;gt; patch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example, to get a patch with my avatar scanner:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ svn diff http://svn.daleglass.net/sl/branches/buildfixes_1-18-0 http://svn.daleglass.net/sl/branches/avatarscanner &amp;gt; avatar-scanner.patch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create a patch with the difference between my &#039;&#039;&#039;buildfixes&#039;&#039;&#039; branch and another. This should apply cleanly to pristine sources.&lt;br /&gt;
&lt;br /&gt;
== Branch Graph ==&lt;br /&gt;
Some branches are fed changes from others. This graph shows the hierarchy.&lt;br /&gt;
&lt;br /&gt;
[[Image:Daleglass branch graph.png]]&lt;br /&gt;
&lt;br /&gt;
= Installer =&lt;br /&gt;
My &#039;&#039;&#039;release&#039;&#039;&#039; branch (see above) is periodically packaged into an installer. If you get this, have in mind this is completely unofficial and unsupported by Linden Lab. Don&#039;t report bugs you find in it to LL.&lt;br /&gt;
&lt;br /&gt;
This version will try to send crash reports to me, and not to LL. Updates will be downloaded from my server as well.&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
The latest installer can be found at [http://daleglass.net/installer/setup_latest.exe daleglass.net]&lt;br /&gt;
&lt;br /&gt;
There&#039;s no autoupdate mechanism yet.&lt;br /&gt;
&lt;br /&gt;
== Linux ==&lt;br /&gt;
I don&#039;t create Linux packages yet. You&#039;ll have to get the source from SVN and [[Compiling_the_viewer_(Linux) | build it]]&lt;br /&gt;
&lt;br /&gt;
I may start making packages if there is demand.&lt;br /&gt;
&lt;br /&gt;
== FreeBSD ==&lt;br /&gt;
I don&#039;t currently use BSD, so you&#039;ll have to get the source from SVN and [[Compiling_the_viewer_(FreeBSD) | build it]]&lt;br /&gt;
&lt;br /&gt;
== OS X ==&lt;br /&gt;
I don&#039;t have any Mac hardware, so I can&#039;t create packages for it. I&#039;m not currently planning to buy any either.&lt;br /&gt;
&lt;br /&gt;
This means that Mac users will have to [[Compiling_the_viewer_(Mac_OS_X) | build it from source]], or get somebody to integrate my changes and create a package for them.&lt;br /&gt;
&lt;br /&gt;
Despite this, anybody using it on a Mac is welcome to submit bug reports. If it&#039;s a Mac specific problem, I will appreciate information on how to fix it. The bug reporter will be expected to test the results for me, since I can&#039;t.&lt;br /&gt;
&lt;br /&gt;
= Etc =&lt;br /&gt;
{{Jira Reporter}}&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Alternate_viewers&amp;diff=29676</id>
		<title>Alternate viewers</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Alternate_viewers&amp;diff=29676"/>
		<updated>2007-08-30T13:54:56Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: Added information on my viewer&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
The [[Extended_FAQ|Extended FAQ]] states that it is okay to create and distribute homebrew viewers as long they adhere to the respective licenses for code usage and server usage.  &lt;br /&gt;
&lt;br /&gt;
The code itself is licensed under {{OSWebsite|gplv2|alt=the GNU General Public License (GPL)}}, which governs modification and redistribuition of the source code.  Use of Linden Lab&#039;s servers will still be governed by [http://secondlife.com/corporate/tos.php the Second Life Terms of Service]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Homebrew viewers are obviously not associated with LindenLab, are governed by their own respective licenses.  LindenLab is not responsible for any desired or undesired results in association with those viewers.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Note to authors: If you make a viewer available make sure to include platform, version numbers and dates.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
== Official Linden Lab Viewer ==&lt;br /&gt;
&lt;br /&gt;
=== Description ===&lt;br /&gt;
&lt;br /&gt;
This viewer is the official version from LindenLab.&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
* Website: [http://www.secondlife.com/ Second Life]&lt;br /&gt;
* Downloads: [http://secondlife.com/community/downloads.php LindenLab download page]&lt;br /&gt;
* Source code: [[Get_source_and_compile]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
== Nicholaz Edition ==&lt;br /&gt;
&lt;br /&gt;
=== Description ===&lt;br /&gt;
&lt;br /&gt;
This is a Windows viewer based on SL builds with various preliminary bug fix patches applied.  Nonetheless it is of course an unofficial build.  See [http://www.blueflash.cc/users/nicholaz/!!Installation.txt Installation.txt], [http://www.blueflash.cc/users/nicholaz/!Changes.txt Changes.txt] for more information.&lt;br /&gt;
&lt;br /&gt;
=== Extra Features ===&lt;br /&gt;
* Particle system improved&lt;br /&gt;
* Different memory management for image list &lt;br /&gt;
* Many patches from the bug tracker which are not yet in the official viewer&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
* Website: [http://nicholaz-beresford.blogspot.com/ Nicholaz Beresford on Blogspot]&lt;br /&gt;
* Direct download link: [http://www.blueflash.cc/users/nicholaz Download versions of this viewer] &lt;br /&gt;
* Source code: Look at the download site for the source-xxx-zip archive&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
== Able Edition ==&lt;br /&gt;
&lt;br /&gt;
=== Description ===&lt;br /&gt;
&lt;br /&gt;
This is a Windows viewer is an unofficial build which adds a [https://jira.secondlife.com/browse/VWR-1017 Mute Visibility] feature, which allows objects in-world to be rendered partially or entirely invisible. &lt;br /&gt;
&lt;br /&gt;
=== Extra Features ===&lt;br /&gt;
* Mute Visibility &lt;br /&gt;
* Improvements to the Mute List&lt;br /&gt;
* Muting objects applies to entire linksets&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
* Website: [http://ablewhitman.blogspot.com/ Able Whitman on Blogspot]&lt;br /&gt;
* Direct download link: http://ablewhitman.org/viewer/&lt;br /&gt;
* Source code: http://ablewhitman.org/viewer/&lt;br /&gt;
&lt;br /&gt;
== Dale Glass Edition ==&lt;br /&gt;
&lt;br /&gt;
=== Description ===&lt;br /&gt;
&lt;br /&gt;
This is a Windows (soon Linux) viewer which adds new experimental features. The features are intended to give users more information about the world and to simplify moderation by making it easier to tell where people are and what they&#039;re doing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Extra Features ===&lt;br /&gt;
* Avatar Scanner&lt;br /&gt;
** Shows nearby avatars, roughly in drawing distance range.&lt;br /&gt;
** Shows name, age, payment info, current activity. &lt;br /&gt;
** Land and estate commands for ejecting/banning multiple avatars at once&lt;br /&gt;
** Integration with Luskwood moderation tools&lt;br /&gt;
** Buttons to open profile, IM, teleport to or track selected avatars&lt;br /&gt;
* Event Log: Experimental feature, shows a list of active particle effects (soon sounds too), and their owners. Allows moving camera to emitter.&lt;br /&gt;
* Branding: Replaces LL branding with my own. Different login page, checks for updates against my server.&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
* Website: http://sl.daleglass.net&lt;br /&gt;
* Blog: http://daleglass.wordpress.com&lt;br /&gt;
* Direct download link: http://sl.daleglass.net/download&lt;br /&gt;
* Source code: http://svn.daleglass.net/sl/release/ ( [[User:Dale_Glass#Subversion_Repository|subversion]] )&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;amp;nbsp;&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Bug_triage/2007-08-20&amp;diff=28819</id>
		<title>Bug triage/2007-08-20</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Bug_triage/2007-08-20&amp;diff=28819"/>
		<updated>2007-08-20T02:14:02Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: /* Misc Pool */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Bug triage}}&lt;br /&gt;
&lt;br /&gt;
Next meeting: 2007-08-20 at 3pm.  See [[Bug triage]] for details.&lt;br /&gt;
&lt;br /&gt;
== Fast Track Import ==&lt;br /&gt;
&lt;br /&gt;
(Move bugs here that have solid repros, or valid patches that you have reviewed)&lt;br /&gt;
&lt;br /&gt;
== Hot by Vote ==&lt;br /&gt;
&lt;br /&gt;
== Patches ==&lt;br /&gt;
&lt;br /&gt;
== Misc Pool ==&lt;br /&gt;
* {{jira|SVC-481}} - 2 votes - permission sharing between scripts has been broken - [[User:Drew Dwi|Drew Dwi]]&lt;br /&gt;
* {{jira|SVC-82}} - 2 votes - RAW files don&#039;t upload or download property lines in channel #4 - [[User:mathieu basiat|mathieu basiat]]&lt;br /&gt;
* {{jira|MISC-94}} - 0 votes - Problem with video card X1950 - [[User:Dorian Bamaisin|Dorian Bamaisin]]&lt;br /&gt;
* {{jira|VWR-375}} - 1 votes - The chat text window is unresponsive on G5 Mac - [[User:StarSong Bright|StarSong Bright]]&lt;br /&gt;
* {{jira|VWR-380}} - 5 votes - Resized Flexible Prims Render Improperly - [[User:Khamon Fate|Khamon Fate]]&lt;br /&gt;
* {{jira|SVC-88}} - 2 votes - llSetRot set roation thru llSetPrimitiveParams causes prim to dirft. - [[User:gearsawe stonecutter|gearsawe stonecutter]]&lt;br /&gt;
* {{jira|VWR-395}} - 1 votes - HUD incomplete render - [[User:Threedee Shepherd|Threedee Shepherd]]&lt;br /&gt;
* {{jira|VWR-396}} - 0 votes - Crash message stating xpcom_core.dll is not found - [[User:Kittenanne Mousehold|Kittenanne Mousehold]]&lt;br /&gt;
* {{jira|VWR-403}} - 6 votes - llGetBoundingBox is off and getting worse - [[User:skidz tweak|skidz tweak]]&lt;br /&gt;
* {{jira|VWR-406}} - 0 votes - Cannot See Other Avatars When Using Voice Beta Build 109 - [[User:Jared Halleck|Jared Halleck]]&lt;br /&gt;
* {{jira|VWR-417}} - 3 votes - Avatar skins load twice - [[User:Eric Ruban|Eric Ruban]]&lt;br /&gt;
* {{jira|VWR-422}} - 3 votes - LSL scripts created on Mac with non-ASCII characters won&#039;t compile in Windows viewer - [[User:Simon Nolan|Simon Nolan]]&lt;br /&gt;
* {{jira|MISC-112}} - 0 votes - Attached Flexi Objects dither - [[User:Amalia Oumionna|Amalia Oumionna]]&lt;br /&gt;
* {{jira|SVC-106}} - 2 votes - Receiving IMs via email from object that has been deleted in-world - [[User:Simon Nolan|Simon Nolan]]&lt;br /&gt;
* {{jira|SVC-108}} - 2 votes - llUnsitAvatar command will work for anyone on any parcel if the avatar being unsat is sitting on the LAND (does not do this if they are on a Prim) - [[User:Traven Sachs|Traven Sachs]]&lt;br /&gt;
* {{jira|SVC-109}} - 0 votes - There is no way to safely serialize a list, a new function is needed. - [[User:Argent Stonecutter|Argent Stonecutter]]&lt;br /&gt;
* {{jira|VWR-433}} - 2 votes - Vivox-gw.exe crashes in Voice Beta after 5-10 minutes; voice chat does not work at all - [[User:Cory Edo|Cory Edo]]&lt;br /&gt;
* {{jira|VWR-437}} - 0 votes - Object description is modified just by opening the object editor dialog - [[User:Rita Cummings|Rita Cummings]]&lt;br /&gt;
* {{jira|SVC-116}} - 7 votes - llGetFreeMemory() doesn&#039;t work! - [[User:Haravikk Mistral|Haravikk Mistral]]&lt;br /&gt;
* {{jira|VWR-442}} - 1 votes - No warning when inviting a new owner - [[User:Gigs Taggart|Gigs Taggart]]&lt;br /&gt;
* {{jira|VWR-443}} - 0 votes - Share with group toggle grays out when checked on deeded objects. - [[User:Gigs Taggart|Gigs Taggart]]&lt;br /&gt;
* {{jira|SVC-118}} - 0 votes - Invitations to existing group members get sent, but have no effect - [[User:Gigs Taggart|Gigs Taggart]]&lt;br /&gt;
* {{jira|SVC-119}} - 1 votes - Titles do not update on Role Change - [[User:Gigs Taggart|Gigs Taggart]]&lt;br /&gt;
* {{jira|SVC-120}} - 0 votes - Objects -&amp;gt; Permissions -&amp;gt; Modify Rights -&amp;gt; affects Return ability - [[User:Gigs Taggart|Gigs Taggart]]&lt;br /&gt;
* {{jira|SVC-121}} - 7 votes -  Share with group does not respect Role Limitation - [[User:Gigs Taggart|Gigs Taggart]]&lt;br /&gt;
* {{jira|SVC-122}} - 0 votes - Simulators stay online even when the CAPS server is down - [[User:Eddy Stryker|Eddy Stryker]]&lt;br /&gt;
* {{jira|MISC-123}} - 0 votes - Unable to paste text from user&#039;s text editor into SL notecard - [[User:Mr Greggan|Mr Greggan]]&lt;br /&gt;
* {{jira|VWR-454}} - 0 votes - Avatar Locks Up in Voice Beta Client - [[User:Jared Halleck|Jared Halleck]]&lt;br /&gt;
* {{jira|VWR-463}} - 4 votes - Blank is a pre-defined texture in client, but not in LSL - [[User:Ice Brodie|Ice Brodie]]&lt;br /&gt;
* {{jira|WEB-84}} - 2 votes - can&#039;t download beta grid access for linux - [[User:Yorzian Mahana|Yorzian Mahana]]&lt;br /&gt;
* {{jira|VWR-490}} - 3 votes - LOD algorithm broken? - [[User:Haravikk Mistral|Haravikk Mistral]]&lt;br /&gt;
* {{jira|VWR-492}} - 2 votes - Name or description change, of an attached object, is rolled back when object is detached - [[User:Gellan Glenelg|Gellan Glenelg]]&lt;br /&gt;
* {{jira|WEB-86}} - 1 votes - Transaction History Total Bug when paying self owned object - [[User:Gypsy Paz|Gypsy Paz]]&lt;br /&gt;
* {{jira|MISC-132}} - 1 votes - Missing character in email sent with llEmail - [[User:Simil Miles|Simil Miles]]&lt;br /&gt;
* {{jira|VWR-500}} - 3 votes - Searching inventory for &amp;quot;copy&amp;quot;, &amp;quot;modify&amp;quot; etc brings up everything. - [[User:Gigs Taggart|Gigs Taggart]]&lt;br /&gt;
* {{jira|VWR-502}} - 4 votes - client crashes on quit - [[User:Lex Neva|Lex Neva]]&lt;br /&gt;
* {{jira|WEB-87}} - 3 votes - Land Store Map is not Updating - [[User:Gigs Taggart|Gigs Taggart]]&lt;br /&gt;
* {{jira|SVC-126}} - 6 votes - In world map image is not updating - [[User:Gigs Taggart|Gigs Taggart]]&lt;br /&gt;
* {{jira|VWR-505}} - 3 votes - Alpha-sorting of prims reversed, causing &#039;solid, non-alpha&#039; prims to disappear. - [[User:beatfox xevious|beatfox xevious]]&lt;br /&gt;
* {{jira|SVC-233}} - 4 votes - Sim crash upon deletion of HTTP heavy object - [[User:otakup0pe neumann|otakup0pe neumann]]&lt;br /&gt;
&lt;br /&gt;
== Pre-meeting activity ==&lt;br /&gt;
&lt;br /&gt;
Some issues will be resolved in the course of building this agenda.  Rather than deleting them from the proposed agenda, move the issue and associated discussion into the appropriate section below.&lt;br /&gt;
&lt;br /&gt;
=== Imported ===&lt;br /&gt;
&lt;br /&gt;
=== Resolved ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Transcript ==&lt;br /&gt;
&lt;br /&gt;
At the conclusion of this meeting, the transcript is/will be at [[{{PAGENAME}}/Transcript]]&lt;br /&gt;
&lt;br /&gt;
{{Bug List Instructions}}&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Third_Party_Libraries&amp;diff=27562</id>
		<title>Third Party Libraries</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Third_Party_Libraries&amp;diff=27562"/>
		<updated>2007-08-08T00:29:11Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: updated info on vivox libraries&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{OSWikiLearnBox}}&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot;&lt;br /&gt;
    |- style=&amp;quot;background:#ffdead;&amp;quot;&lt;br /&gt;
    !Library !! Version !! Description !! GPL-Compatible?  || Covered under [http://secondlife.com/developers/opensource/flossexception FLOSS exception]?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Apache --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://apr.apache.org/ Apache Portable Runtime ] || 1.2.8&lt;br /&gt;
|A set of C functions which provide a portable and consistent interface into operating system - or simply widely useful - functionality. We primarily use it for threading and socket i/o. This is actually three packages, apr, apr-util and apr-iconv.&lt;br /&gt;
|| No, Apache 2.0 license&lt;br /&gt;
|| Yes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Boost --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://www.boost.org/ Boost] || 1.32.0&lt;br /&gt;
|A set of portable C++ libraries which provide a wide set of functionality. Used primarily for tokenization.&lt;br /&gt;
|| Yes, BSDish&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- c-ares--&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://daniel.haxx.se/projects/c-ares/ c-ares] || 1.3.2&lt;br /&gt;
|Performs DNS requests and name resolves asynchronously. Used with libcurl to keep all HTTP operations async.&lt;br /&gt;
|| Yes, BSDish&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- cg --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://developer.nvidia.com/page/cg_main.html CG] || ??&lt;br /&gt;
|cg controls some visual effects. - NOT USED BY THE NORMAL CLIENT.&lt;br /&gt;
|| No, permissive license but forbids reverse engineering.&lt;br /&gt;
|| No&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ELFIO --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://sourceforge.net/projects/elfio/ ELFIO] || 1.0.3&lt;br /&gt;
|Enhanced stacktrace information on the Linux client.&lt;br /&gt;
|| Yes, LGPL&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Expat --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://expat.sourceforge.net/ Expat] || 1.95.8&lt;br /&gt;
|XML parser.&lt;br /&gt;
|| Yes, MIT&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- FMOD --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://www.fmod.org FMOD] ||  3.75&lt;br /&gt;
|Audio engine and mp3 stream decoder&lt;br /&gt;
|| No, proprietary&lt;br /&gt;
|| No&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- FreeType --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://www.freetype.org/ FreeType] || 2.1.5&lt;br /&gt;
|Font engine.&lt;br /&gt;
|| Yes, dual licensed BSD/Advertising + GPL&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Glib --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://www.gtk.org/ Glib] || 2.0.7&lt;br /&gt;
|??&lt;br /&gt;
|| Yes, LGPL&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- GTK+ --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://www.gtk.org/ GTK+] || 2.0.9&lt;br /&gt;
|&#039;Native&#039; UI components on the Linux client.&lt;br /&gt;
|| Yes, LGPL&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- jpeglib --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://www.ijg.org/ jpeglib] || 6b&lt;br /&gt;
|JPEG decoder library.&lt;br /&gt;
|| Yes, BSD&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- KDU --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://www.kakadusoftware.com/ KDU] || 5.2.1&lt;br /&gt;
|Kakadu (KDU) JPEG-2000 decoder library.&lt;br /&gt;
|| No, Proprietary&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- libcurl--&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://curl.haxx.se/libcurl/ libcurl] || 7.16.0&lt;br /&gt;
|Handles moving data across the net in many different protocols. Used to GET/POST/PUT/DELETE web resources.&lt;br /&gt;
|| Yes, MIT&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- libpng--&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://www.libpng.org/pub/png/libpng.html libpng] || 1.2.18&lt;br /&gt;
|PNG image library.&lt;br /&gt;
|| [http://www.libpng.org/pub/png/src/libpng-LICENSE.txt BSD-like]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- libuuid --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
!libuuid ||  ??&lt;br /&gt;
|Generates UUIDs under Linux. Originally a part of the ext2fs filesystem. Also see lluuid.cpp for all platforms.&lt;br /&gt;
|| Yes, LGPL&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- llMozLib --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://ubrowser.com/llmozlib.php llMozLib] || 1.8.0.9&lt;br /&gt;
|llMozLib handles rendering HTML in the viewer via an embedded Gecko ([http://www.mozilla.org/developer/ Mozilla]) engine.&lt;br /&gt;
|| Yes, MPL/GPL/LGPL Tri-license&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- MESA --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://www.mesa3d.org/ Mesa] ||  6.2.1&lt;br /&gt;
|Provides the required OpenGL headers under Linux.&lt;br /&gt;
|| Yes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Ogg --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://xiph.org/ogg/ OGG] || 1.0.3&lt;br /&gt;
|Audio control.&lt;br /&gt;
|| Yes, BSDish&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- OpenGL --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://www.opengl.org/ OpenGL] || GLX&lt;br /&gt;
| 3D Graphics rendering engine.&lt;br /&gt;
|| No (see [http://www.xfree86.org/4.4.0/LICENSE3.html XFree86 License FAQ])&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- OpenJPEG --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://www.openjpeg.org/ OpenJPEG] || 1.0&lt;br /&gt;
|An open-source JPEG-2000 library; a slower alternative to Kadaku. Used in the open source release&lt;br /&gt;
|| Yes, however one must beware of patents.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- openssl --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://www.openssl.org/ OpenSSL] || 0.9.7c&lt;br /&gt;
|Provides encryption for sensitive actions such as user login&lt;br /&gt;
|| No, advertising clauses.&lt;br /&gt;
|| Yes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- quicktime --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://developer.apple.com/quicktime/ Quicktime] || 7.13&lt;br /&gt;
|Used to play in-world video clips on a prim.&lt;br /&gt;
|| No, Proprietary&lt;br /&gt;
|| No&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- libresolv / libllresolv --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://www.isc.org/index.pl?/sw/bind/ libresolv / libllresolv] || 9.4.1&lt;br /&gt;
|Linux only - libllresolv is simply a rebuild of the system libresolv.so as the latter is very often broken in various ways on Linux.  [[Building libllresolv]].&lt;br /&gt;
|| Yes, BSD&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- SDL --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://www.libsdl.org/index.php SDL] || 1.2.7&lt;br /&gt;
|The Simple DirectMedia Layer libraries are used for handling input and basic window/GL setup on the Linux client.&lt;br /&gt;
|| Yes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Smartheap --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://www.microquill.com/smartheap/index.html Smartheap] || ??&lt;br /&gt;
|Memory allocation (Windows only malloc() replacement)&lt;br /&gt;
|| No, Proprietary, but entirely optional (easy to comment out)&lt;br /&gt;
|| No&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- TUT --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://tut-framework.sourceforge.net/ TUT] || 2006-06-22&lt;br /&gt;
|Unit test framework based on the use of c++ meta template programming. Used to test LL libraries.&lt;br /&gt;
|| Yes, BSD&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Vorbis --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://xiph.org/vorbis/ Vorbis] || 1.1.2&lt;br /&gt;
|Audio control.&lt;br /&gt;
|| Yes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- xmlrpc-epi --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://xmlrpc-epi.sourceforge.net/ xmlrpc-epi] || 0.51&lt;br /&gt;
|Controls the XML-RPC protocol.&lt;br /&gt;
|| Yes, BSD&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- zlib --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://www.zlib.net/ zlib] || 1.2.1&lt;br /&gt;
|zlib is a lossless data-compression library which is used for a variety of network i/o and file compression.&lt;br /&gt;
|| Yes, MIT-like&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Redistribution =&lt;br /&gt;
Some files in the SL installation can&#039;t be freely redistributed. This means it&#039;s not possible to simply package and offer for download a modified viewer: some files &#039;&#039;&#039;must not&#039;&#039;&#039; be redistributed. &lt;br /&gt;
&lt;br /&gt;
This page documents the licenses and redistribution requirements of various files used by the viewer.&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
These are the files that need to be shipped with the Windows version&lt;br /&gt;
&lt;br /&gt;
=== Runtime ===&lt;br /&gt;
Microsoft components. It&#039;s not yet know whether they&#039;re redistributable.&lt;br /&gt;
&lt;br /&gt;
* dbghelp.dll: [http://msdn2.microsoft.com/EN-US/library/ms679294.aspx Redistributable]&lt;br /&gt;
* msvcp71.dll: C Runtime Library, redistributable&lt;br /&gt;
* msvcr71.dll: C Runtime Library, [http://msdn2.microsoft.com/en-us/library/abx4dbyh(vs.71).aspx Redistributable]&lt;br /&gt;
&lt;br /&gt;
=== FMOD ===&lt;br /&gt;
FMOD sound library. Free for non-commercial projects. A commercial license will be needed for a commercial viewer.&lt;br /&gt;
&lt;br /&gt;
From the README in the package:&lt;br /&gt;
 The fmod.dll file may be redistributed without the authors prior permission, &lt;br /&gt;
 and must remain unmodified.  The use of dll &#039;static linking&#039; tools that aim&lt;br /&gt;
 to hide the fmod library are forbidden.&lt;br /&gt;
&lt;br /&gt;
* fmod.dll: [http://www.fmod.org/fmodlicense.html Redistributable, free for non-commercial projects]&lt;br /&gt;
&lt;br /&gt;
=== Mozilla ===&lt;br /&gt;
The Gecko engine is MPL/GPL/LGPL licensed, which makes it redistributable.&lt;br /&gt;
&lt;br /&gt;
* app_settings/mozilla&lt;br /&gt;
* freebl3.dll&lt;br /&gt;
* gksvggdiplus.dll&lt;br /&gt;
* js3250.dll&lt;br /&gt;
* nspr4.dll&lt;br /&gt;
* nss3.dll&lt;br /&gt;
* nssckbi.dll&lt;br /&gt;
* plc4.dll,&lt;br /&gt;
* plds4.dll&lt;br /&gt;
* smime3.dll&lt;br /&gt;
* softokn3.dll&lt;br /&gt;
* ssl3.dll&lt;br /&gt;
* xpcom.dll&lt;br /&gt;
* xul.dll&lt;br /&gt;
&lt;br /&gt;
=== Kakadu ===&lt;br /&gt;
JPEG2000 library. &#039;&#039;&#039;Not redistributable&#039;&#039;&#039;.&lt;br /&gt;
OpenJPEG is an alternative library that is redistributable (does it work on Windows?)&lt;br /&gt;
&lt;br /&gt;
* llkdu.dll&lt;br /&gt;
&lt;br /&gt;
=== OpenSSL ===&lt;br /&gt;
SSL library. Redistributable.&lt;br /&gt;
&lt;br /&gt;
* libeay32.dll&lt;br /&gt;
* ssleay32.dll&lt;br /&gt;
&lt;br /&gt;
=== Vivox ===&lt;br /&gt;
Vivox is the component that provides the voice functionality.&lt;br /&gt;
&lt;br /&gt;
* SLVoice.exe: Voice daemon. &#039;&#039;&#039;Not redistributable&#039;&#039;&#039;&lt;br /&gt;
* SLVoiceAgent: Exact purpose unknown. &#039;&#039;&#039;Not redistributable&#039;&#039;&#039;&lt;br /&gt;
* alut.dll: OpenAL, by Creative Labs. Redistributable.&lt;br /&gt;
* ortp.dll: oRTP project, LGPL. Redistributable.&lt;br /&gt;
* srtp.dll: Secure RTP?&lt;br /&gt;
* vivoxsdk.dll: Vivox Communications API. &#039;&#039;&#039;Not redistributable&#039;&#039;&#039;&lt;br /&gt;
* wrap_oal.dll: OpenAL32 by Creative Labs. Redistributable.&lt;br /&gt;
&lt;br /&gt;
=== Unknown Libraries ===&lt;br /&gt;
The purpose and licensing of these files is not known:&lt;br /&gt;
&lt;br /&gt;
* tntk.dll: Probably Vivox related&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Third_Party_Libraries&amp;diff=27553</id>
		<title>Third Party Libraries</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Third_Party_Libraries&amp;diff=27553"/>
		<updated>2007-08-07T21:33:05Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: Added vivox, unknown libraries section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{OSWikiLearnBox}}&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot;&lt;br /&gt;
    |- style=&amp;quot;background:#ffdead;&amp;quot;&lt;br /&gt;
    !Library !! Version !! Description !! GPL-Compatible?  || Covered under [http://secondlife.com/developers/opensource/flossexception FLOSS exception]?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Apache --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://apr.apache.org/ Apache Portable Runtime ] || 1.2.8&lt;br /&gt;
|A set of C functions which provide a portable and consistent interface into operating system - or simply widely useful - functionality. We primarily use it for threading and socket i/o. This is actually three packages, apr, apr-util and apr-iconv.&lt;br /&gt;
|| No, Apache 2.0 license&lt;br /&gt;
|| Yes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Boost --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://www.boost.org/ Boost] || 1.32.0&lt;br /&gt;
|A set of portable C++ libraries which provide a wide set of functionality. Used primarily for tokenization.&lt;br /&gt;
|| Yes, BSDish&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- c-ares--&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://daniel.haxx.se/projects/c-ares/ c-ares] || 1.3.2&lt;br /&gt;
|Performs DNS requests and name resolves asynchronously. Used with libcurl to keep all HTTP operations async.&lt;br /&gt;
|| Yes, BSDish&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- cg --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://developer.nvidia.com/page/cg_main.html CG] || ??&lt;br /&gt;
|cg controls some visual effects. - NOT USED BY THE NORMAL CLIENT.&lt;br /&gt;
|| No, permissive license but forbids reverse engineering.&lt;br /&gt;
|| No&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ELFIO --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://sourceforge.net/projects/elfio/ ELFIO] || 1.0.3&lt;br /&gt;
|Enhanced stacktrace information on the Linux client.&lt;br /&gt;
|| Yes, LGPL&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Expat --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://expat.sourceforge.net/ Expat] || 1.95.8&lt;br /&gt;
|XML parser.&lt;br /&gt;
|| Yes, MIT&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- FMOD --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://www.fmod.org FMOD] ||  3.75&lt;br /&gt;
|Audio engine and mp3 stream decoder&lt;br /&gt;
|| No, proprietary&lt;br /&gt;
|| No&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- FreeType --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://www.freetype.org/ FreeType] || 2.1.5&lt;br /&gt;
|Font engine.&lt;br /&gt;
|| Yes, dual licensed BSD/Advertising + GPL&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Glib --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://www.gtk.org/ Glib] || 2.0.7&lt;br /&gt;
|??&lt;br /&gt;
|| Yes, LGPL&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- GTK+ --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://www.gtk.org/ GTK+] || 2.0.9&lt;br /&gt;
|&#039;Native&#039; UI components on the Linux client.&lt;br /&gt;
|| Yes, LGPL&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- jpeglib --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://www.ijg.org/ jpeglib] || 6b&lt;br /&gt;
|JPEG decoder library.&lt;br /&gt;
|| Yes, BSD&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- KDU --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://www.kakadusoftware.com/ KDU] || 5.2.1&lt;br /&gt;
|Kakadu (KDU) JPEG-2000 decoder library.&lt;br /&gt;
|| No, Proprietary&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- libcurl--&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://curl.haxx.se/libcurl/ libcurl] || 7.16.0&lt;br /&gt;
|Handles moving data across the net in many different protocols. Used to GET/POST/PUT/DELETE web resources.&lt;br /&gt;
|| Yes, MIT&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- libpng--&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://www.libpng.org/pub/png/libpng.html libpng] || 1.2.18&lt;br /&gt;
|PNG image library.&lt;br /&gt;
|| [http://www.libpng.org/pub/png/src/libpng-LICENSE.txt BSD-like]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- libuuid --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
!libuuid ||  ??&lt;br /&gt;
|Generates UUIDs under Linux. Originally a part of the ext2fs filesystem. Also see lluuid.cpp for all platforms.&lt;br /&gt;
|| Yes, LGPL&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- llMozLib --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://ubrowser.com/llmozlib.php llMozLib] || 1.8.0.9&lt;br /&gt;
|llMozLib handles rendering HTML in the viewer via an embedded Gecko ([http://www.mozilla.org/developer/ Mozilla]) engine.&lt;br /&gt;
|| Yes, MPL/GPL/LGPL Tri-license&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- MESA --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://www.mesa3d.org/ Mesa] ||  6.2.1&lt;br /&gt;
|Provides the required OpenGL headers under Linux.&lt;br /&gt;
|| Yes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Ogg --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://xiph.org/ogg/ OGG] || 1.0.3&lt;br /&gt;
|Audio control.&lt;br /&gt;
|| Yes, BSDish&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- OpenGL --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://www.opengl.org/ OpenGL] || GLX&lt;br /&gt;
| 3D Graphics rendering engine.&lt;br /&gt;
|| No (see [http://www.xfree86.org/4.4.0/LICENSE3.html XFree86 License FAQ])&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- OpenJPEG --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://www.openjpeg.org/ OpenJPEG] || 1.0&lt;br /&gt;
|An open-source JPEG-2000 library; a slower alternative to Kadaku. Used in the open source release&lt;br /&gt;
|| Yes, however one must beware of patents.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- openssl --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://www.openssl.org/ OpenSSL] || 0.9.7c&lt;br /&gt;
|Provides encryption for sensitive actions such as user login&lt;br /&gt;
|| No, advertising clauses.&lt;br /&gt;
|| Yes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- quicktime --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://developer.apple.com/quicktime/ Quicktime] || 7.13&lt;br /&gt;
|Used to play in-world video clips on a prim.&lt;br /&gt;
|| No, Proprietary&lt;br /&gt;
|| No&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- libresolv / libllresolv --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://www.isc.org/index.pl?/sw/bind/ libresolv / libllresolv] || 9.4.1&lt;br /&gt;
|Linux only - libllresolv is simply a rebuild of the system libresolv.so as the latter is very often broken in various ways on Linux.  [[Building libllresolv]].&lt;br /&gt;
|| Yes, BSD&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- SDL --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://www.libsdl.org/index.php SDL] || 1.2.7&lt;br /&gt;
|The Simple DirectMedia Layer libraries are used for handling input and basic window/GL setup on the Linux client.&lt;br /&gt;
|| Yes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Smartheap --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://www.microquill.com/smartheap/index.html Smartheap] || ??&lt;br /&gt;
|Memory allocation (Windows only malloc() replacement)&lt;br /&gt;
|| No, Proprietary, but entirely optional (easy to comment out)&lt;br /&gt;
|| No&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- TUT --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://tut-framework.sourceforge.net/ TUT] || 2006-06-22&lt;br /&gt;
|Unit test framework based on the use of c++ meta template programming. Used to test LL libraries.&lt;br /&gt;
|| Yes, BSD&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Vorbis --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://xiph.org/vorbis/ Vorbis] || 1.1.2&lt;br /&gt;
|Audio control.&lt;br /&gt;
|| Yes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- xmlrpc-epi --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://xmlrpc-epi.sourceforge.net/ xmlrpc-epi] || 0.51&lt;br /&gt;
|Controls the XML-RPC protocol.&lt;br /&gt;
|| Yes, BSD&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- zlib --&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
![http://www.zlib.net/ zlib] || 1.2.1&lt;br /&gt;
|zlib is a lossless data-compression library which is used for a variety of network i/o and file compression.&lt;br /&gt;
|| Yes, MIT-like&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Redistribution =&lt;br /&gt;
Some files in the SL installation can&#039;t be freely redistributed. This means it&#039;s not possible to simply package and offer for download a modified viewer: some files &#039;&#039;&#039;must not&#039;&#039;&#039; be redistributed. &lt;br /&gt;
&lt;br /&gt;
This page documents the licenses and redistribution requirements of various files used by the viewer.&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
These are the files that need to be shipped with the Windows version&lt;br /&gt;
&lt;br /&gt;
=== Runtime ===&lt;br /&gt;
Microsoft components. It&#039;s not yet know whether they&#039;re redistributable.&lt;br /&gt;
&lt;br /&gt;
* dbghelp.dll: [http://msdn2.microsoft.com/EN-US/library/ms679294.aspx Redistributable]&lt;br /&gt;
* msvcp71.dll: C Runtime Library, redistributable&lt;br /&gt;
* msvcr71.dll: C Runtime Library, [http://msdn2.microsoft.com/en-us/library/abx4dbyh(vs.71).aspx Redistributable]&lt;br /&gt;
&lt;br /&gt;
=== FMOD ===&lt;br /&gt;
FMOD sound library. Free for non-commercial projects. A commercial license will be needed for a commercial viewer.&lt;br /&gt;
&lt;br /&gt;
From the README in the package:&lt;br /&gt;
 The fmod.dll file may be redistributed without the authors prior permission, &lt;br /&gt;
 and must remain unmodified.  The use of dll &#039;static linking&#039; tools that aim&lt;br /&gt;
 to hide the fmod library are forbidden.&lt;br /&gt;
&lt;br /&gt;
* fmod.dll: [http://www.fmod.org/fmodlicense.html Redistributable, free for non-commercial projects]&lt;br /&gt;
&lt;br /&gt;
=== Mozilla ===&lt;br /&gt;
The Gecko engine is MPL/GPL/LGPL licensed, which makes it redistributable.&lt;br /&gt;
&lt;br /&gt;
* app_settings/mozilla&lt;br /&gt;
* freebl3.dll&lt;br /&gt;
* gksvggdiplus.dll&lt;br /&gt;
* js3250.dll&lt;br /&gt;
* nspr4.dll&lt;br /&gt;
* nss3.dll&lt;br /&gt;
* nssckbi.dll&lt;br /&gt;
* plc4.dll,&lt;br /&gt;
* plds4.dll&lt;br /&gt;
* smime3.dll&lt;br /&gt;
* softokn3.dll&lt;br /&gt;
* ssl3.dll&lt;br /&gt;
* xpcom.dll&lt;br /&gt;
* xul.dll&lt;br /&gt;
&lt;br /&gt;
=== Kakadu ===&lt;br /&gt;
JPEG2000 library. &#039;&#039;&#039;Not redistributable&#039;&#039;&#039;.&lt;br /&gt;
OpenJPEG is an alternative library that is redistributable (does it work on Windows?)&lt;br /&gt;
&lt;br /&gt;
* llkdu.dll&lt;br /&gt;
&lt;br /&gt;
=== OpenSSL ===&lt;br /&gt;
SSL library. Redistributable.&lt;br /&gt;
&lt;br /&gt;
* libeay32.dll&lt;br /&gt;
* ssleay32.dll&lt;br /&gt;
&lt;br /&gt;
=== Vivox ===&lt;br /&gt;
Vivox is the component that provides the voice functionality. Redistribution status unknown.&lt;br /&gt;
&lt;br /&gt;
* SLVoice.exe: Voice daemon&lt;br /&gt;
* SLVoiceAgent: Exact purpose unknown&lt;br /&gt;
* alut.dll&lt;br /&gt;
* ortp.dll&lt;br /&gt;
* srtp.dll&lt;br /&gt;
* vivoxsdk.dll: Vivox Communications API&lt;br /&gt;
* wrap_oal.dll: OpenAL32 by Creative Labs&lt;br /&gt;
&lt;br /&gt;
=== Unknown Libraries ===&lt;br /&gt;
The purpose and licensing of these files is not known:&lt;br /&gt;
&lt;br /&gt;
* tntk.dll: Probably Vivox&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Build_the_Viewer_on_Linux&amp;diff=27303</id>
		<title>Build the Viewer on Linux</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Build_the_Viewer_on_Linux&amp;diff=27303"/>
		<updated>2007-08-04T23:59:25Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: Fixed formatting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{CompileNav}}&lt;br /&gt;
&lt;br /&gt;
The following are instructions for building the Second Life viewer on linux. This process has been used on [http://www.debian.org/ debian] and debian based systems like [http://www.ubuntu.com/ ubuntu], and also on [http://www.fedoraproject.org/ Fedora]. For other platforms, see [[Get source and compile]].&lt;br /&gt;
&lt;br /&gt;
{{vital-info|How to compile [[Source_archive#2007-Feb-20|FL-1.13.3.58185]] and [[Source_archive#2007-Feb-24|FL-1.13.3.58390]] &#039;&#039;&#039;with&#039;&#039;&#039; llmozlib (see [[Talk:Compiling_the_viewer_%28Linux%29#llmozlib|discussion]])}}&lt;br /&gt;
&lt;br /&gt;
= Building the client =&lt;br /&gt;
To build the Second Life Viewer you will first need to install the required tools and libraries.&lt;br /&gt;
The following sections outline steps to build the client from source.  To simplify building,&lt;br /&gt;
Linden labs has been nice enough to prepackage some of the libraries and bundled them up in an&lt;br /&gt;
additional tar file.&lt;br /&gt;
&lt;br /&gt;
And while The Second Life Viewer is not a trivial build, and experience with building large&lt;br /&gt;
software packages will help you greatly - but don&#039;t be daunted, it should be simple once the&lt;br /&gt;
dependencies are in the right place.&lt;br /&gt;
&lt;br /&gt;
The tasks are:&lt;br /&gt;
# Install required tools.&lt;br /&gt;
# Unpack source and art tree&#039;s from Linden Labs.&lt;br /&gt;
# Install libraries not shiped by Linden Labs.&lt;br /&gt;
# Unpack or install the other required libraries and headers.&lt;br /&gt;
# Compile.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
== Required tools ==&lt;br /&gt;
There are a number of tools that need to be installed first.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;SCons&amp;lt;/b&amp;gt; build tool [package: scons]&lt;br /&gt;
* &amp;lt;b&amp;gt;GCC 3.4&amp;lt;/b&amp;gt; C/C++ compiler&lt;br /&gt;
** [debian/ubuntu: g++-3.4]&lt;br /&gt;
** [fedora: compat-gcc-34-c++]&lt;br /&gt;
** other GCC versions are not well-tested; GCC 4.x will NOT currently build the viewer without a few simple code adjustments. {link to them pls}&lt;br /&gt;
* &amp;lt;b&amp;gt;yacc&amp;lt;/b&amp;gt; [suggest packages: bison]&lt;br /&gt;
* &amp;lt;b&amp;gt;lex&amp;lt;/b&amp;gt; [suggest packages: flex]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Unpack the source tree ==&lt;br /&gt;
&lt;br /&gt;
You can get the source either from the source archives available at [[Source downloads]], or you can get it from [[Subversion]].&lt;br /&gt;
&lt;br /&gt;
Using a source archive is the easier option, but if you plan to do active development and want to make your own modifications, while merging LL&#039;s changes, subversion will probably be much more convenient on the long term.&lt;br /&gt;
&lt;br /&gt;
=== Getting the source from the source archives ===&lt;br /&gt;
Get the source from [[Source downloads]]. You will need all 3 archives: source, artwork and libraries.&lt;br /&gt;
&lt;br /&gt;
Choose a location and unpack the source tree and the art work.  They will be extracted into a&lt;br /&gt;
directory call &amp;lt;b&amp;gt;linden&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % tar -xzf slviewer-src-&amp;lt;version&amp;gt;.tar.gz&lt;br /&gt;
 % tar -xzf slviewer-&amp;lt;os&amp;gt;-libs-&amp;lt;version&amp;gt;.tar.gz&lt;br /&gt;
 % unzip slviewer-artwork-&amp;lt;version&amp;gt;.zip&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Getting the source from Subversion ===&lt;br /&gt;
Select a source [[Source branches|branch]] to check out.&lt;br /&gt;
&lt;br /&gt;
Check it out with:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn co http://svn.secondlife.com/svn/linden/&amp;lt;branch&amp;gt; [directory]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
If you don&#039;t specify the directory, it&#039;ll use the name of the branch as the default.&lt;br /&gt;
&lt;br /&gt;
Now you will have a directory with the source code. This only includes the source code itself, without the libraries or artwork. You will have to get them from the [[Source downloads]] and unpack them into the tree.&lt;br /&gt;
&lt;br /&gt;
If the directory SVN created is called &#039;linden&#039; then you can directly unzip and untar the archives on top of it. If it&#039;s called something else, create a symlink:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % ln -sf &amp;lt;branch&amp;gt; linden&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now unpack the libraries and artwork:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % tar -xzf slviewer-&amp;lt;os&amp;gt;-libs-&amp;lt;version&amp;gt;.tar.gz&lt;br /&gt;
 % unzip slviewer-artwork-&amp;lt;version&amp;gt;.zip&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing the required libraries (that Linden labs can not or does not provide)==&lt;br /&gt;
=== FMOD (audio) ===&lt;br /&gt;
* FMOD provides audio output, but (although &#039;free&#039; in some senses) is not itself open-source.  &amp;lt;b&amp;gt;If&amp;lt;/b&amp;gt; you wish to avoid FMOD, thus disabling audio, you may make these changes:&lt;br /&gt;
** Comment-out the libfmod line in indra/newview/viewer_manifest.py&lt;br /&gt;
** Add FMOD=no to your Scons build command when compiling the source.&lt;br /&gt;
* If you want to use FMOD, fetch and unpack &amp;lt;b&amp;gt;FMOD 3.75&amp;lt;/b&amp;gt; &amp;lt;http://www.fmod.org/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % wget http://www.fmod.org/files/fmodapi375linux.tar.gz&lt;br /&gt;
 % tar -xzvf fmodapi375linux.tar.gz&lt;br /&gt;
 % cd fmodapi375linux/&lt;br /&gt;
 % cp api/inc/* ../linden/libraries/i686-linux/include/&lt;br /&gt;
 % cp api/libfmod-3.75.so ../linden/libraries/i686-linux/lib_release_client/&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing the required dependencies (prepackaged by Linden labs)==&lt;br /&gt;
&lt;br /&gt;
The Second Life Viewer has a number of compile/link dependencies on external libraries which&lt;br /&gt;
are needed - to help you, the source download page contains a link to a &amp;lt;i&amp;gt;slviewer-linux-libs&amp;lt;/i&amp;gt; package which you unpack over the source tree to fill most of the dependencies (and thus avoid most of the fiddly work described on this page).&lt;br /&gt;
&lt;br /&gt;
If you download the libs to the top folder, where the &amp;lt;i&amp;gt;linden&amp;lt;/i&amp;gt; folder is after getting and extracting the viewer source code tarball, the following command should unpack everything to the right spot. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 tar xvfz slviewer-linux-libs-&amp;lt;version&amp;gt;.tar.gz&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you choose to use the provided libraries you can skip to &lt;br /&gt;
[[Compiling_the_viewer_%28Linux%29#Compiling|Compiling the client]].&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
=== Doing yourself ===&lt;br /&gt;
If you are porting to a new architecture or wish to make a package tailored to your Linux distribution&#039;s own libraries.  You will have to install the following additional dependencies&lt;br /&gt;
listed below.  Paths and package names given here are based on Ubuntu 7.04 and may vary&lt;br /&gt;
according to your Linux distribution.&lt;br /&gt;
&lt;br /&gt;
==== List of libraries ====&lt;br /&gt;
* &amp;lt;b&amp;gt;apr-1&amp;lt;/b&amp;gt; [ubuntu: libapr1-dev, fedora: apr-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;aprutil-1&amp;lt;/b&amp;gt; [ubuntu: libaprutil1-dev, fedora: apr-util-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;boost&amp;lt;/b&amp;gt; [ubuntu: libboost-dev, fedora: boost-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;boost-regex&amp;lt;/b&amp;gt; [ubuntu: libboost-regex-dev]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;curl&amp;lt;/b&amp;gt; library at least version 7.15.4 is recommended, 7.16.x is ideal.&lt;br /&gt;
** [ubuntu: libcurl3-dev, fedora: curl-devel]&lt;br /&gt;
** If you are compiling your own version of &amp;lt;b&amp;gt;Curl&amp;lt;/b&amp;gt;, then you should consider configuring it to use the &amp;lt;b&amp;gt;c-ares&amp;lt;/b&amp;gt; library so that DNS lookups will be asynchronous.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;ELFIO&amp;lt;/b&amp;gt; &amp;lt;http://sourceforge.net/projects/elfio/&amp;gt;&lt;br /&gt;
** This wants to build a static library by default.  Afterwards, to create a dynamic libelfio.so&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % cd ELFIO &amp;amp;&amp;amp; g++-3.4 -shared *.o -o libelfio.so&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;expat&amp;lt;/b&amp;gt; [ubuntu: libexpat1-dev, fedora: expat-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;google-perftools&amp;lt;/b&amp;gt; library for the tcmalloc and stacktrace libraries. (memory checking)&lt;br /&gt;
**[ubuntu: libgoogle-perftools-dev, fedora: google-perftools-devel.i386&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;GTK 2.x&amp;lt;/b&amp;gt; development headers [ubuntu: libgtk2.0-dev, fedora: gtk2-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;jpeglib&amp;lt;/b&amp;gt; [ubuntu: libjpeg62-dev, fedora: libjpeg-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;OpenGL&amp;lt;/b&amp;gt; development headers: gl.h, glext.h, glu.h&lt;br /&gt;
**[ubuntu: mesa-common-dev, libglu1-mesa-dev, fedora: mesa-libGL-devel, mesa-libGLU-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;OpenJPEG&amp;lt;/b&amp;gt; &amp;lt;http://www.openjpeg.org/&amp;gt;&lt;br /&gt;
** note: OpenJPEG 1.1.1 or greater is required which has the macro OPJ_PATH_LEN, if the header has MAX_PATH, then upgrade or it will crash with a divide by zero error as the structures would be two different sizes.&lt;br /&gt;
*** &#039;&#039;what does this mean?&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;OpenSSL&amp;lt;/b&amp;gt; &amp;lt;http://www.openssl.org/&amp;gt; [ubuntu: ?, fedora: ?]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;SDL&amp;lt;/b&amp;gt; [ubuntu libsdl1.2-dev, fedora: SDL-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;Vorbis&amp;lt;/b&amp;gt; [ubuntu: libvorbis-dev, fedora: libvorbis-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;X11&amp;lt;/b&amp;gt; development headers: Xlib.h, and Xutil.h&lt;br /&gt;
**[ubuntu: libx11-dev, fedora: libX11-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;xmlrpc-epi 0.51&amp;lt;/b&amp;gt; &amp;lt;http://xmlrpc-epi.sourceforge.net/&amp;gt;&lt;br /&gt;
** note: not xmlrpc-c (xmlrpc-c has a library and headers with the same name but is not compatible)&lt;br /&gt;
** Apply patches from the instructions in [[patch xmlrpc-epi]]&lt;br /&gt;
*** &#039;&#039;does this still work?&#039;&#039;&lt;br /&gt;
** See also:&lt;br /&gt;
*** http://www.haxxed.com/rpms/secondlife/xmlrpc-epi-0.51-gcc4.1.patch&lt;br /&gt;
*** http://www.haxxed.com/rpms/secondlife/xmlrpc-epi-0.51-use-system-expat.patch&lt;br /&gt;
*** http://www.haxxed.com/rpms/secondlife/xmlrpc-epi-0.51-rename.patch&lt;br /&gt;
*** You have to regenerate autotools after applying the patches:&lt;br /&gt;
****libtoolize -c -f&lt;br /&gt;
****aclocal&lt;br /&gt;
****automake -c -a -f&lt;br /&gt;
****autoconf&lt;br /&gt;
*** The first patch fixes compiling on gcc 4. The second patch causes it to compile against the system expat, the version xmlrpc-epi comes with is broken and will not work. The last patch renames the library from xmlrpc to xmlrpc-epi, otherwise it conflicts with xmlrpc-c - which means the viewer then needs to be patched to link against xmlrpc-epi and not xmlrpc. These patches are from my Fedora package. On linux, I recommend these patches in favor of the Linden ones, as theirs seem to be for windows. (And mine actually work)&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Copy headers and libraries into the source tree ====&lt;br /&gt;
&lt;br /&gt;
Here is a guide to the sequence of shell commands needed to copy the required headers and libraries into the Second Life Viewer source tree for building.  Actual paths to system headers may vary according to Linux distribution.&lt;br /&gt;
&lt;br /&gt;
If you are using the easy &amp;lt;i&amp;gt;slviewer-linux-libs&amp;lt;/i&amp;gt; bundle then you can skip the rest of this section, &amp;lt;b&amp;gt;otherwise&amp;lt;/b&amp;gt; you will also need to perform the following:&lt;br /&gt;
&lt;br /&gt;
* ${SLSRC} refers to the top-level directory of the Second Life Viewer source tree.&lt;br /&gt;
* ${OPENJPEG} refers to the top-level directory of your completed OpenJPEG build.&lt;br /&gt;
* ${ELFIO} refers to the top-level directory of your completed ELFIO build.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 cp -a /usr/include/atk-1.0 ${SLSRC}/libraries/i686-linux/include/&lt;br /&gt;
 cp -a /usr/include/gtk-2.0 ${SLSRC}/libraries/i686-linux/include/&lt;br /&gt;
 cp -a /usr/lib/gtk-2.0/include/* ${SLSRC}/libraries/i686-linux/include/gtk-2.0/&lt;br /&gt;
 cp -a /usr/include/glib-2.0 ${SLSRC}/libraries/i686-linux/include/&lt;br /&gt;
 cp -a /usr/lib/glib-2.0/include/* ${SLSRC}/libraries/i686-linux/include/glib-2.0/&lt;br /&gt;
 cp -a /usr/include/pango-1.0 ${SLSRC}/libraries/i686-linux/include/&lt;br /&gt;
&lt;br /&gt;
if your GTK is fairly recent and thus needs Cairo:&lt;br /&gt;
 cp -a /usr/include/cairo/* ${SLSRC}/libraries/i686-linux/include&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 cp -a /usr/include/apr-1.0/ ${SLSRC}/libraries/i686-linux/include/apr-1&lt;br /&gt;
&lt;br /&gt;
 mkdir ${SLSRC}/libraries/i686-linux/include/expat&lt;br /&gt;
 cp -a /usr/include/expat*.h ${SLSRC}/libraries/i686-linux/include/expat/&lt;br /&gt;
&lt;br /&gt;
 mkdir ${SLSRC}/libraries/i686-linux/include/zlib&lt;br /&gt;
 cp -a /usr/include/zlib*.h ${SLSRC}/libraries/i686-linux/include/zlib/&lt;br /&gt;
&lt;br /&gt;
 mkdir ${SLSRC}/libraries/i686-linux/include/openjpeg&lt;br /&gt;
 cp ${OPENJPEG}/libopenjpeg/openjpeg.h ${SLSRC}/libraries/i686-linux/include/openjpeg/&lt;br /&gt;
 cp ${OPENJPEG}/libopenjpeg.a ${SLSRC}/libraries/i686-linux/lib_release_client/&lt;br /&gt;
&lt;br /&gt;
 mkdir ${SLSRC}/libraries/i686-linux/include/ELFIO&lt;br /&gt;
 cp ${ELFIO}/ELFIO/*.h ${SLSRC}/libraries/i686-linux/include/ELFIO/&lt;br /&gt;
 cp ${ELFIO}/ELFIO/libelfio.so ${SLSRC}/libraries/i686-linux/lib_release_client/&lt;br /&gt;
&lt;br /&gt;
 mkdir ${SLSRC}/libraries/i686-linux/include/jpeglib&lt;br /&gt;
 cp -a /usr/include/j*.h ${SLSRC}/libraries/i686-linux/include/jpeglib/&lt;br /&gt;
 touch ${SLSRC}/libraries/i686-linux/include/jpeglib/jinclude.h&lt;br /&gt;
&lt;br /&gt;
 mkdir ${SLSRC}/libraries/i686-linux/include/llfreetype2&lt;br /&gt;
 cp -a /usr/include/freetype2/freetype/ ${SLSRC}/libraries/i686-linux/include/llfreetype2/&lt;br /&gt;
 cp -a /usr/include/ft2build.h ${SLSRC}/libraries/i686-linux/include/llfreetype2/freetype/&lt;br /&gt;
&lt;br /&gt;
 mkdir ${SLSRC}/libraries/i686-linux/include/xmlrpc-epi&lt;br /&gt;
 cp -a /usr/include/xmlrpc*.h ${SLSRC}/libraries/i686-linux/include/xmlrpc-epi/&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Compiling ==&lt;br /&gt;
=== Build Types ===&lt;br /&gt;
The &#039;&#039;BUILD&#039;&#039; parameter specifies the build type. For normal usage, use &#039;&#039;&#039;release&#039;&#039;&#039;. If you plan to work on the source, choose &#039;&#039;&#039;releasenoopt&#039;&#039;&#039; or &#039;&#039;&#039;debug&#039;&#039;&#039;, as these versions are unoptimized and much easier to debug.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;release&#039;&#039;&#039;: Optimized build for release.&lt;br /&gt;
* &#039;&#039;&#039;releasenoopt&#039;&#039;&#039;: Unoptimized build.&lt;br /&gt;
* &#039;&#039;&#039;debug&#039;&#039;&#039;: Debug build with assertions.&lt;br /&gt;
* &#039;&#039;&#039;releasefordownload&#039;&#039;&#039;: Optimized build for release, will create a .tar.gz with the files for distribution.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
=== Building ===&lt;br /&gt;
=== Disable llMozLib ===&lt;br /&gt;
Add MOZLIB=no to your Scons build command when compiling the source.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ cd indra&lt;br /&gt;
 $ scons DISTCC=no BTARGET=client BUILD=release MOZLIB=no&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Expect a build time of a couple of hours.  The resulting unstripped Second Life Viewer binary is &amp;lt;b&amp;gt;newview/secondlife-i686-bin&amp;lt;/b&amp;gt;. Note that temporary object code is compiled into &amp;lt;b&amp;gt;/tmp/$USER&amp;lt;/b&amp;gt; by default (where $USER is your username) - this can be changed by prefixing the &amp;lt;b&amp;gt;scons&amp;lt;/b&amp;gt; command above with &amp;lt;b&amp;gt;TEMP_BUILD_DIR=&amp;quot;&amp;lt;i&amp;gt;[full directory path]&amp;lt;/i&amp;gt;&amp;quot;&amp;lt;/b&amp;gt;. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ TEMP_BUILD_DIR=&amp;quot;/home/fred/secondlife/temp-build&amp;quot; scons DISTCC=no BTARGET=client BUILD=release&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To build a release that has all of the shaders and optimizations enabled and resembles the official shipped Linux alpha client, use BUILD=releasefordownload&lt;br /&gt;
&lt;br /&gt;
Be sure to read the [[Common compilation problems]] page if you have problems - we&#039;ll try to keep the page up to date with known problems and solutions.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
== Testing and packaging the client ==&lt;br /&gt;
&lt;br /&gt;
=== Testing the result from inside the tree ===&lt;br /&gt;
&lt;br /&gt;
You may find it simpler and less error-prone to follow the instructions in the [[Compiling_the_viewer_%28Linux%29#Packaging_the_client|Packaging the client]] section below to run the client under the same conditions as an end-user would.  Otherwise:&lt;br /&gt;
&lt;br /&gt;
* Preparing to run &#039;in-tree&#039;&lt;br /&gt;
** &amp;lt;i&amp;gt;ensure that you have indra/newview/app_settings/static_*.db2&amp;lt;/i&amp;gt; - if not, you&#039;ll find it in the &#039;slviewer-artwork&#039; download (a zip file).&lt;br /&gt;
** now, from the indra directory:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ cp ../scripts/messages/message_template.msg newview/app_settings/&lt;br /&gt;
 $ cp ../etc/message.xml newview/app_settings/&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; Starting from version 1.18.0, copying message.xml is also required. Missing it will cause group IMs to fail to work, although the viewer will run fine otherwise.&lt;br /&gt;
&lt;br /&gt;
* Running it: The LD_LIBRARY_PATH stuff ensures that the binary looks for its libraries in the right places.  From the indra directory:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ ( cd newview &amp;amp;&amp;amp; LD_LIBRARY_PATH=../../libraries/i686-linux/lib_release_client:${LD_LIBRARY_PATH}:/usr/local/lib  ./secondlife-i686-bin )&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
==== The client seems kinda slow. ====&lt;br /&gt;
&lt;br /&gt;
By default, the open-source Second Life Viewer uses the open-source OpenJPEG library to decode the (many) JPEG-2000 texture images it receives from the servers.  This isn&#039;t quite of comparable speed to the proprietary third-party library which the Linden Lab viewer builds have traditionally used, for which we are not permitted to redistribute the source.&lt;br /&gt;
&lt;br /&gt;
However, the &amp;lt;i&amp;gt;slviewer-linux-libs&amp;lt;/i&amp;gt; package includes two pre-built libraries which facilitate the use of this slightly faster image decoding method: &amp;lt;b&amp;gt;libkdu_v42R.so&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;libllkdu.so&amp;lt;/b&amp;gt;.  These are provided for your testing; again, we are not permitted to grant you the right to re-distribute these libraries to downstream users, but the viewer will still work (albeit slightly slower) without them.&lt;br /&gt;
&lt;br /&gt;
To &amp;lt;b&amp;gt;use these faster image-decoding libraries&amp;lt;/b&amp;gt;, they simply need to be put into the right places relative to the viewer runtime directory - nothing needs to be reconfigured or recompiled.  If you&#039;re running the client from the source tree, the following will make the KDU libraries available:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 cp &amp;quot;$SLSRC/libraries/i686-linux/lib_release_client/libllkdu.so&amp;quot; &amp;quot;$SLSRC/indra/newview/libllkdu.so&amp;quot;&lt;br /&gt;
 mkdir &amp;quot;$SLSRC/indra/lib&amp;quot;&lt;br /&gt;
 cp &amp;quot;$SLSRC/libraries/i686-linux/lib_release_client/libkdu_v42R.so&amp;quot; &amp;quot;$SLSRC/indra/lib/libkdu_v42R.so&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The file &amp;lt;b&amp;gt;indra/newview/viewer_manifest.py&amp;lt;/b&amp;gt; contains some commented-out entries describing where these libraries belong; if you uncomment the two lines corresponding to libllkdu and libkdu then they will be automatically copied into the right place in the runtime directory when you follow the &#039;Packaging the client&#039; instructions below.&lt;br /&gt;
&lt;br /&gt;
==== File Dialogs Don&#039;t Work on 64 bit system ====&lt;br /&gt;
&lt;br /&gt;
If you run a 64 bit system, and your file dialogs don&#039;t work, or they worked before and stopped after you installed an update, it may be due to a mismatch between the headers used to compile the viewer and the library it&#039;s using. The log will contain something like this:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 2007-06-21T01:28:35Z INFO: ll_try_gtk_init: Starting GTK Initialization.&lt;br /&gt;
 2007-06-21T01:28:36Z INFO: ll_try_gtk_init: GTK Initialized.&lt;br /&gt;
 2007-06-21T01:28:36Z INFO: ll_try_gtk_init: - Compiled against GTK version 2.10.11&lt;br /&gt;
 2007-06-21T01:28:36Z INFO: ll_try_gtk_init: - Running against GTK version 2.10.6&lt;br /&gt;
 2007-06-21T01:28:36Z WARNING: ll_try_gtk_init: - GTK COMPATIBILITY WARNING: Gtk+ version too old (micro mismatch)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What happens here is that your distribution includes 32 bit GTK libraries, but the package only includes the libraries themselves and not the headers. When building, the SL client will build against the headers included with the main 64 bit GTK package. This will work if the 64 bit version of the library is the same or older than the 32 bit one. However, if your 32 bit library is older, then the viewer will detect the mismatch (built with headers for a newer version of GTK than it&#039;s using) and turn GTK off.&lt;br /&gt;
&lt;br /&gt;
Possible solutions:&lt;br /&gt;
* Download the source for the version of the 32 bit GTK libraries your distribution comes with, and build your viewer against those headers.&lt;br /&gt;
* Upgrade your 32 bit GTK package so that it&#039;s the same or newer as the 64 bit one.&lt;br /&gt;
* Downgrade your 64 bit package (may not be a good idea).&lt;br /&gt;
&lt;br /&gt;
=== Packaging the client ===&lt;br /&gt;
&lt;br /&gt;
If you substitute &#039;BUILD=release&#039; with &#039;&amp;lt;b&amp;gt;BUILD=releasefordownload&amp;lt;/b&amp;gt;&#039; in the &#039;Compiling&#039; section above, then packaging the resulting code, libraries, data and documentation into a tarball for the end-user will be done automatically as the final stage of the build process; the pristine end-user client distribution has been assembled into the directory &amp;lt;b&amp;gt;indra/newview/SecondLife_i686_1_X_Y_Z/&amp;lt;/b&amp;gt; and has also been tarred into &amp;lt;b&amp;gt;indra/newview/SecondLife_i686_1_X_Y_Z.tar.bz2&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The file which controls what (and where) files go into the end-user runtime viewer directory is &amp;lt;b&amp;gt;indra/newview/viewer_manifest.py&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Automated libraries and headers adjustments, compilation and packaging ====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Here is a bash script that could save you a lot of time... It basically does all what is described above, and more, and entitles you to compile a SL client very easily:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# make-SL v1.70 (c)2007 Henri Beauchamp. Released under GPL license v2:&lt;br /&gt;
# http://www.gnu.org/licenses/gpl.txt&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
######## THIS IS QUICK&#039;N DIRTY ALPHA SOFTWARE. USE AT YOUR OWN RISKS ! ########&lt;br /&gt;
###############################################################################&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
# BEWARE: this script is meant to compile a -personal- SL client. It is -NOT- #&lt;br /&gt;
#         suitable to build client versions meant for public release, because #&lt;br /&gt;
#         non-open source code is packaged by this script (e.g. libkdu).      #&lt;br /&gt;
###############################################################################&lt;br /&gt;
&lt;br /&gt;
# This bash script is aimed at easying up the build process of a SL client.&lt;br /&gt;
# It does not cover building it with custom/system openjpeg, elfio or fmodapi&lt;br /&gt;
# (we use the provided libraries).&lt;br /&gt;
# You may enable or disable the use of your system&#039;s library by editing&lt;br /&gt;
# the USE_SYSTEM_* variable (&amp;quot;yes&amp;quot; --&amp;gt; use the system library, &amp;quot;no&amp;quot; --&amp;gt; use&lt;br /&gt;
# LL&#039;s provided ones).&lt;br /&gt;
# The script also takes care of updating properly the viewer_manifest.py script&lt;br /&gt;
# accordingly, so that you (should) end up with a properly packaged client.&lt;br /&gt;
&lt;br /&gt;
# To use this script, simply make it executable (chmod +x make-SL) and&lt;br /&gt;
# put it into /usr/local/bin (or any other directory in your PATH).&lt;br /&gt;
# Then, download the slviewer-src-*.tar.gz, slviewer-linux-libs-*.tar.gz,&lt;br /&gt;
# slviewer-artwork-*.zip and fmodapi*.tar.gz archives, and finally, invoke&lt;br /&gt;
# make-SL as follow:&lt;br /&gt;
#   make-SL path_to_archives  (example: make-SL ~/downloads)&lt;br /&gt;
# or simply:&lt;br /&gt;
#   make-SL&lt;br /&gt;
# when invoking from the directory where the archives are.&lt;br /&gt;
# The sources will be installed into the PATH_TO_SOURCES directory,&lt;br /&gt;
# and the client will be built into the TEMP_BUILD_DIR directory.&lt;br /&gt;
# The packaged build will be moved to your home directory.&lt;br /&gt;
# If you want to retry a compilation after fixing something manually and&lt;br /&gt;
# don&#039;t want make-SL to start all over again, overwriting everything,&lt;br /&gt;
# you may invoke it with the --retry option, like this:&lt;br /&gt;
#   make-SL --retry&lt;br /&gt;
# This script has been tested by the author, on a (very customized)&lt;br /&gt;
# Mandrake 10.2 distro. Tested with SL v1.17 sources.&lt;br /&gt;
&lt;br /&gt;
# Where the sources of the client will be held (defaults to &amp;quot;./linden&amp;quot;):&lt;br /&gt;
PATH_TO_SOURCES=&amp;quot;/usr/src/SL&amp;quot;&lt;br /&gt;
# Where to build the client:&lt;br /&gt;
export TEMP_BUILD_DIR=&amp;quot;$PATH_TO_SOURCES/build&amp;quot;&lt;br /&gt;
&lt;br /&gt;
USE_SYSTEM_GTK=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_SDL=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_SSL=&amp;quot;yes&amp;quot;&lt;br /&gt;
# Beware: libdb4 makes use of libapr... so you should keep USE_SYSTEM_APR&lt;br /&gt;
# and USE_SYSTEM_DB4 in sync.&lt;br /&gt;
USE_SYSTEM_APR=&amp;quot;no&amp;quot;&lt;br /&gt;
USE_SYSTEM_DB4=&amp;quot;no&amp;quot;&lt;br /&gt;
USE_SYSTEM_OGG=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_ZLIB=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_UUID=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_CURL=&amp;quot;no&amp;quot;&lt;br /&gt;
USE_SYSTEM_EXPAT=&amp;quot;no&amp;quot;&lt;br /&gt;
USE_SYSTEM_VORBIS=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_XMLRPC=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_JPEGLIB=&amp;quot;yes&amp;quot;&lt;br /&gt;
# Enabling the system freetype2 prevents the client from using the SL fonts,&lt;br /&gt;
# or at least, this is what happens on my system (Mandrake 10.2 with PLF&lt;br /&gt;
# freetype2).&lt;br /&gt;
USE_SYSTEM_FREETYPE2=&amp;quot;no&amp;quot;&lt;br /&gt;
USE_SYSTEM_PERFTOOLS=&amp;quot;yes&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# You may add tune flags here, to optimize the code for your processor.&lt;br /&gt;
# Example, for an Athlon XP:&lt;br /&gt;
# TUNE_FLAGS=&amp;quot;-march=athlon-xp&amp;quot;&lt;br /&gt;
# BEWARE: because of a bug in the v1.17.2.0 SConstruct file, you MUST keep at&lt;br /&gt;
# least an -O2 flag in the TUNE_FLAGS, to avoid getting a very slooooow client...&lt;br /&gt;
# This problem was apparently fixed in v1.17.3.0.&lt;br /&gt;
TUNE_FLAGS=&amp;quot;-fomit-frame-pointer -frename-registers -fweb -fexpensive-optimizations&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Whether to build with the browser login screen or not:&lt;br /&gt;
WITH_MOZILLA=&amp;quot;yes&amp;quot;&lt;br /&gt;
&lt;br /&gt;
function update_manifest() {&lt;br /&gt;
    grep -v $1 $PATH_TO_SOURCES/indra/newview/viewer_manifest.py &amp;gt;$TEMP_BUILD_DIR/viewer_manifest.py&lt;br /&gt;
    mv -f $TEMP_BUILD_DIR/viewer_manifest.py $PATH_TO_SOURCES/indra/newview/viewer_manifest.py&lt;br /&gt;
    chmod +x $PATH_TO_SOURCES/indra/newview/viewer_manifest.py&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function compile() {&lt;br /&gt;
    cd $PATH_TO_SOURCES/indra&lt;br /&gt;
    echo &amp;quot;Compiling the client into $TEMP_BUILD_DIR...&amp;quot;&lt;br /&gt;
    scons DISTCC=no BTARGET=client BUILD=releasefordownload MOZLIB=$WITH_MOZILLA&lt;br /&gt;
    if (($? == 0)) ; then&lt;br /&gt;
        mv $PATH_TO_SOURCES/indra/newview/SecondLife*.tar.bz2 $HOME/&lt;br /&gt;
    fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if [ &amp;quot;$TEMP_BUILD_DIR&amp;quot; == &amp;quot;&amp;quot; ] ; then&lt;br /&gt;
    export TEMP_BUILD_DIR=/tmp/$USER/SL&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Check to see if we simply want to retry a compilation:&lt;br /&gt;
if [ &amp;quot;$1&amp;quot; == &amp;quot;--retry&amp;quot; ] ; then&lt;br /&gt;
    compile&lt;br /&gt;
    exit $?&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Make sure we don&#039;t unpack over an old source tree:&lt;br /&gt;
if [ -d linden ] ; then&lt;br /&gt;
    rm -rf linden/&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if [ -d $PATH_TO_SOURCES ] &amp;amp;&amp;amp; [ &amp;quot;$PATH_TO_SOURCES&amp;quot; != &amp;quot;&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$PATH_TO_SOURCES&amp;quot; != &amp;quot;/&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$PATH_TO_SOURCES&amp;quot; != &amp;quot;.&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$PATH_TO_SOURCES&amp;quot; != &amp;quot;..&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$PATH_TO_SOURCES&amp;quot; != &amp;quot;$HOME&amp;quot; ] ; then&lt;br /&gt;
    rm -rf $PATH_TO_SOURCES/&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Use the parameter (if any) as the path to the archives:&lt;br /&gt;
&lt;br /&gt;
PATH_TO_ARCHIVES=&amp;quot;.&amp;quot;&lt;br /&gt;
if [ &amp;quot;$1&amp;quot; != &amp;quot;&amp;quot; ]; then&lt;br /&gt;
    if [ -d $1 ] ; then&lt;br /&gt;
        PATH_TO_ARCHIVES=$1&lt;br /&gt;
    fi&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s first unpack everything:&lt;br /&gt;
if ! [ -f $PATH_TO_ARCHIVES/slviewer-src-*.tar.gz ] ; then&lt;br /&gt;
    echo &amp;quot;You need slviewer-src !&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
if ! [ -f $PATH_TO_ARCHIVES/slviewer-linux-libs-*.tar.gz ] ; then&lt;br /&gt;
    echo &amp;quot;You need slviewer-linux-libs !&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
if ! [ -f $PATH_TO_ARCHIVES/slviewer-artwork-*.zip ] ; then&lt;br /&gt;
    echo &amp;quot;You need slviewer-artwork !&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
if ! [ -f $PATH_TO_ARCHIVES/fmodapi*.tar.gz ] ; then&lt;br /&gt;
    echo &amp;quot;You need fmodapi !&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
echo &amp;quot;Extracting the files from the archives...&amp;quot;&lt;br /&gt;
tar xzf $PATH_TO_ARCHIVES/slviewer-src-*.tar.gz&lt;br /&gt;
tar xzf $PATH_TO_ARCHIVES/slviewer-linux-libs-*.tar.gz&lt;br /&gt;
unzip $PATH_TO_ARCHIVES/slviewer-artwork-*.zip &amp;gt;/dev/null&lt;br /&gt;
tar xzf $PATH_TO_ARCHIVES/fmodapi*.tar.gz&lt;br /&gt;
&lt;br /&gt;
# fmodapi:&lt;br /&gt;
echo &amp;quot;Copying fmodapi files...&amp;quot;&lt;br /&gt;
cp -a fmodapi*/api/inc/* linden/libraries/i686-linux/include/&lt;br /&gt;
cp fmodapi*/api/libfmod-*.so linden/libraries/i686-linux/lib_release_client/&lt;br /&gt;
rm -rf fmodapi*/&lt;br /&gt;
&lt;br /&gt;
# Move the sources to where we want to hold them:&lt;br /&gt;
if [ &amp;quot;$PATH_TO_SOURCES&amp;quot; != &amp;quot;linden&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$PATH_TO_SOURCES&amp;quot; != &amp;quot;&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Moving the sources to $PATH_TO_SOURCES...&amp;quot;&lt;br /&gt;
    mv -f linden $PATH_TO_SOURCES&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s own the files:&lt;br /&gt;
chown -R $USER: $PATH_TO_SOURCES/&lt;br /&gt;
&lt;br /&gt;
# Check for patches to apply. The names of the patches must be in the form&lt;br /&gt;
# slviewer-*.patch* (Example: slviewer-v117-EmbbededNotecard.patch.bz2).&lt;br /&gt;
# They must be applicable from inside the source directory with the -p1&lt;br /&gt;
# option, i.e. they have been built from outside the source directory&lt;br /&gt;
# with a diff command such as:&lt;br /&gt;
# diff -urN linden/ linden-patched/ &amp;gt;slviewer-whatever.patch&lt;br /&gt;
# And they may be gzipped or bzipped.&lt;br /&gt;
PATCHES=`/bin/ls $PATH_TO_ARCHIVES/slviewer-*.patch* 2&amp;gt;/dev/null`&lt;br /&gt;
if [ &amp;quot;$PATCHES&amp;quot; != &amp;quot;&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Applying patches...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES&lt;br /&gt;
    PATCHES=`/bin/ls $PATH_TO_ARCHIVES/slviewer-*.patch*`&lt;br /&gt;
    for i in $PATCHES; do&lt;br /&gt;
        echo &amp;quot;Patch: $i&amp;quot;&lt;br /&gt;
        if echo $i | grep &amp;quot;.gz&amp;quot; &amp;amp;&amp;gt;/dev/null ; then&lt;br /&gt;
            gunzip -c $i | patch -p1 -s&lt;br /&gt;
        elif echo $i | grep &amp;quot;.bz2&amp;quot; &amp;amp;&amp;gt;/dev/null ; then&lt;br /&gt;
            bzcat $i | patch -p1 -s&lt;br /&gt;
        else&lt;br /&gt;
            patch -p1 -s &amp;lt;$i&lt;br /&gt;
        fi&lt;br /&gt;
    done&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Make a clean build:&lt;br /&gt;
if [ -d $TEMP_BUILD_DIR ] &amp;amp;&amp;amp; [ &amp;quot;$TEMP_BUILD_DIR&amp;quot; != &amp;quot;&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$TEMP_BUILD_DIR&amp;quot; != &amp;quot;/&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$TEMP_BUILD_DIR&amp;quot; != &amp;quot;.&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$TEMP_BUILD_DIR&amp;quot; != &amp;quot;..&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$TEMP_BUILD_DIR&amp;quot; != &amp;quot;$HOME&amp;quot; ] ; then&lt;br /&gt;
    rm -rf $TEMP_BUILD_DIR/&lt;br /&gt;
fi&lt;br /&gt;
mkdir -p $TEMP_BUILD_DIR&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system GTK+ if available:&lt;br /&gt;
if [ -d /usr/include/atk-1.0 ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_GTK&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system GTK+...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries/i686-linux/include&lt;br /&gt;
    rm -rf atk-1.0/ gtk-2.0/ glib-2.0/ pango-1.0/&lt;br /&gt;
    rm -f ../lib_release_client/libgtk*&lt;br /&gt;
    cp -a /usr/include/atk-1.0 .&lt;br /&gt;
    cp -a /usr/include/gtk-2.0 .&lt;br /&gt;
    cp -a /usr/lib/gtk-2.0/include/* gtk-2.0/&lt;br /&gt;
    cp -a /usr/include/glib-2.0 .&lt;br /&gt;
    cp -a /usr/lib/glib-2.0/include/* glib-2.0/&lt;br /&gt;
    cp -a /usr/include/pango-1.0 .&lt;br /&gt;
    if [ -d /usr/include/cairo ] ; then&lt;br /&gt;
        cp -a /usr/include/cairo/* .&lt;br /&gt;
    fi&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system freetype2 if available:&lt;br /&gt;
if [ -f /usr/include/ft2build.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_FREETYPE2&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system freetype2...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/freetype/ i686-linux/include/llfreetype2/*&lt;br /&gt;
    rm -f include/ft2build.h i686-linux/lib_release_client/libfreetype.a&lt;br /&gt;
    cp -a /usr/include/freetype2/freetype/ i686-linux/include/llfreetype2/&lt;br /&gt;
    cp -a /usr/include/ft2build.h i686-linux/include/llfreetype2/freetype/&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system zlib if available:&lt;br /&gt;
if [ -f /usr/include/zlib.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_ZLIB&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system zlib...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/zlib/&lt;br /&gt;
    mkdir -p i686-linux/include/zlib&lt;br /&gt;
    cp -a /usr/include/zlib*.h i686-linux/include/zlib/&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system jpeglib if available:&lt;br /&gt;
if [ -f /usr/include/jpeglib.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_JPEGLIB&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system jpeglib...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/jpeglib/ i686-linux/lib_release_client/libjpeg.a&lt;br /&gt;
    mkdir -p i686-linux/include/jpeglib&lt;br /&gt;
    cp -a /usr/include/j*.h i686-linux/include/jpeglib/&lt;br /&gt;
    touch i686-linux/include/jpeglib/jinclude.h&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system xmlrpc-epi if available:&lt;br /&gt;
if [ -f /usr/include/xmlrpc.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_XMLRPC&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system xmlrpc-epi...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/xmlrpc-epi/ i686-linux/lib_release_client/libxmlrpc.a&lt;br /&gt;
    mkdir -p i686-linux/include/xmlrpc-epi&lt;br /&gt;
    cp -a /usr/include/xmlrpc*.h i686-linux/include/xmlrpc-epi/&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system ogg if available:&lt;br /&gt;
if [ -f /usr/include/ogg/ogg.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_OGG&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system ogg...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/ogg/ i686-linux/lib_release_client/libogg*&lt;br /&gt;
    update_manifest libogg&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system vorbis if available:&lt;br /&gt;
if [ -f /usr/include/vorbis/vorbisenc.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_VORBIS&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system vorbis...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/vorbis/ i686-linux/lib_release_client/libvorbis*&lt;br /&gt;
    update_manifest libvorbis&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system SDL if available:&lt;br /&gt;
if [ -f /usr/include/SDL/SDL.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_SDL&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system SDL...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries/i686-linux&lt;br /&gt;
    rm -rf include/SDL/ lib_release_client/libSDL*&lt;br /&gt;
    update_manifest libSDL&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system openssl if available:&lt;br /&gt;
if [ -f /usr/lib/libssl.so.0.9.7 ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_SSL&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system openssl...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries/i686-linux/lib_release_client&lt;br /&gt;
    rm -f libssl.* libcrypto.*&lt;br /&gt;
    update_manifest libssl&lt;br /&gt;
    update_manifest libcrypto&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system apr if available:&lt;br /&gt;
if [ -f /usr/include/apr*/apr.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_APR&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system apr...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries/i686-linux&lt;br /&gt;
    rm -rf include/apr-1/*&lt;br /&gt;
    rm -f lib_release_client/libapr*&lt;br /&gt;
    cp -a /usr/include/apr*/* include/apr-1/&lt;br /&gt;
    update_manifest libapr&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system expat if available:&lt;br /&gt;
if [ -f /usr/include/expat.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_EXPAT&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system expat...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/expat/&lt;br /&gt;
    rm -f i686-linux/lib_release_client/libexpat*&lt;br /&gt;
    mkdir -p i686-linux/include/expat&lt;br /&gt;
    cp -a /usr/include/expat*.h i686-linux/include/expat/&lt;br /&gt;
    update_manifest libexpat&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system curl if available:&lt;br /&gt;
if [ -f /usr/include/curl/curl.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_CURL&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system curl...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/curl/&lt;br /&gt;
    rm -f i686-linux/lib_release_client/libcurl.*&lt;br /&gt;
    update_manifest libcurl&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system db4 if available:&lt;br /&gt;
if [ -f /usr/lib/libdb-4.2.so ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_DB4&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system db4...&amp;quot;&lt;br /&gt;
    rm -f $PATH_TO_SOURCES/libraries/i686-linux/lib_release_client/libdb*.so&lt;br /&gt;
    update_manifest libdb&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system uuid if available:&lt;br /&gt;
if [ -f /lib/libuuid.so.1 ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_UUID&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system libuuid...&amp;quot;&lt;br /&gt;
    rm -f $PATH_TO_SOURCES/libraries/i686-linux/lib_release_client/libuuid.*&lt;br /&gt;
    update_manifest libuuid&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if grep tcmalloc $PATH_TO_SOURCES/indra/SConstruct &amp;amp;&amp;gt;/dev/null ; then&lt;br /&gt;
    if [ -f /usr/include/google/malloc_hook.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_PERFTOOLS&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
        echo &amp;quot;Using the system google-perftools...&amp;quot;&lt;br /&gt;
        cd $PATH_TO_SOURCES/libraries/i686-linux&lt;br /&gt;
        rm -f lib_release_client/libtcmalloc.* lib_release_client/libstacktrace.*&lt;br /&gt;
        rm -rf include/google/&lt;br /&gt;
        cp -a /usr/lib/libstacktrace.* /usr/lib/libtcmalloc.so* lib_release_client/&lt;br /&gt;
        cp -a /usr/include/google include/&lt;br /&gt;
        update_manifest tcmalloc&lt;br /&gt;
        update_manifest stacktrace&lt;br /&gt;
    else&lt;br /&gt;
        # Remove the google-perftools stuff if not present in the libraries package&lt;br /&gt;
        # (problem seen in SL v1.17):&lt;br /&gt;
        if ! [ -f $PATH_TO_SOURCES/libraries/i686-linux/lib_release_client/libtcmalloc.so ] ; then&lt;br /&gt;
            update_manifest tcmalloc&lt;br /&gt;
            update_manifest stacktrace&lt;br /&gt;
            # The following lines remove the&lt;br /&gt;
            #   &amp;quot;external_libs += [&#039;tcmalloc&#039;, &#039;stacktrace&#039;]&amp;quot;&lt;br /&gt;
            # line from SConstruct... and many other lines which renders SConstruct&lt;br /&gt;
            # unusable to build anything else than the client... this is a quick&#039;n&lt;br /&gt;
            # dirty patch. :-P&lt;br /&gt;
            grep -v tcmalloc $PATH_TO_SOURCES/indra/SConstruct &amp;gt;$TEMP_BUILD_DIR/SConstruct&lt;br /&gt;
            mv -f $TEMP_BUILD_DIR/SConstruct $PATH_TO_SOURCES/indra/SConstruct&lt;br /&gt;
        fi&lt;br /&gt;
    fi&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Fix a bug in v1.17.1 and later SConstruct file, where some libraries are&lt;br /&gt;
# compiled as shared instead of static, and are yet not packaged, and where&lt;br /&gt;
# fmod can&#039;t be enabled for OPENSOURCE:&lt;br /&gt;
sed -e &amp;quot;s/create_dynamic_module(module=module, module_libs=module_libs)/create_static_module(module)/&amp;quot; $PATH_TO_SOURCES/indra/SConstruct &amp;gt;$TEMP_BUILD_DIR/SConstruct&lt;br /&gt;
sed -e &amp;quot;s/enable_fmod = not opensource and/enable_fmod =/&amp;quot; $TEMP_BUILD_DIR/SConstruct &amp;gt;$PATH_TO_SOURCES/indra/SConstruct&lt;br /&gt;
rm -f $TEMP_BUILD_DIR/SConstruct&lt;br /&gt;
&lt;br /&gt;
# Add tune flags, if any:&lt;br /&gt;
if [ &amp;quot;$TUNE_FLAGS&amp;quot; != &amp;quot;&amp;quot; ] ; then&lt;br /&gt;
    sed -e &amp;quot;s/-g -pipe/$TUNE_FLAGS -pipe/&amp;quot; $PATH_TO_SOURCES/indra/SConstruct &amp;gt;$TEMP_BUILD_DIR/SConstruct&lt;br /&gt;
    mv -f $TEMP_BUILD_DIR/SConstruct $PATH_TO_SOURCES/indra/SConstruct&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Update the manifest file and enable libkdu packaging. I&#039;m too lazy to use&lt;br /&gt;
# awk or perl, here, but that&#039;s indeed what should be done...&lt;br /&gt;
# The following (very dirty) code may break at some point, depending on what&lt;br /&gt;
# LL will put in comments in the manifest file...&lt;br /&gt;
# First, remove the lines with libstdc++.so.6 and the crash logger:&lt;br /&gt;
update_manifest libstdc&lt;br /&gt;
update_manifest crash_logger&lt;br /&gt;
# Now, any line with a &#039;#&#039; followed with several spaces _should_ be dealing&lt;br /&gt;
# with the libkdu stuff... So, we simply remove the &#039;#&amp;quot;...&lt;br /&gt;
sed -e &amp;quot;s/#        them/# them/&amp;quot; $PATH_TO_SOURCES/indra/newview/viewer_manifest.py &amp;gt;$TEMP_BUILD_DIR/viewer_manifest.py&lt;br /&gt;
sed -e &amp;quot;s/#   /   /&amp;quot; $TEMP_BUILD_DIR/viewer_manifest.py &amp;gt;$PATH_TO_SOURCES/indra/newview/viewer_manifest.py&lt;br /&gt;
#mv -f $TEMP_BUILD_DIR/viewer_manifest.py $PATH_TO_SOURCES/indra/newview/viewer_manifest.py&lt;br /&gt;
rm -f $TEMP_BUILD_DIR/viewer_manifest.py&lt;br /&gt;
chmod +x $PATH_TO_SOURCES/indra/newview/viewer_manifest.py&lt;br /&gt;
&lt;br /&gt;
# Comment out &amp;quot;export LL_GL_BASICEXT=x&amp;quot; in the wrapper script:&lt;br /&gt;
sed -e &amp;quot;s/export LL_GL_BASICEXT=x/#export LL_GL_BASICEXT=x/&amp;quot; $PATH_TO_SOURCES/indra/newview/linux_tools/wrapper.sh &amp;gt;$TEMP_BUILD_DIR/wrapper.sh&lt;br /&gt;
mv -f $TEMP_BUILD_DIR/wrapper.sh $PATH_TO_SOURCES/indra/newview/linux_tools/wrapper.sh&lt;br /&gt;
chmod +x $PATH_TO_SOURCES/indra/newview/linux_tools/wrapper.sh&lt;br /&gt;
&lt;br /&gt;
# Missing file... at least in v1.17.0.0&lt;br /&gt;
if grep &amp;quot;secondlife-i686.supp&amp;quot; $PATH_TO_SOURCES/indra/newview/viewer_manifest.py &amp;amp;&amp;gt;/dev/null ; then&lt;br /&gt;
    if ! [ -f $PATH_TO_SOURCES/indra/newview/secondlife-i686.supp ] ; then&lt;br /&gt;
        touch $PATH_TO_SOURCES/indra/newview/secondlife-i686.supp&lt;br /&gt;
    fi&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# LL makes the assumption that a certain unicode true type font is installed&lt;br /&gt;
# on all Linux systems... which is of course wrong !  Let&#039;s check, and when&lt;br /&gt;
# this font is absent, replace the broken soft link with an empty file: this&lt;br /&gt;
# at least will prevent the viewer to issue many warnings about not being able&lt;br /&gt;
# to load the unicode.ttf font.&lt;br /&gt;
if ! [ -r $PATH_TO_SOURCES/indra/newview/linux_tools/unicode.ttf ] ; then&lt;br /&gt;
    rm -f $PATH_TO_SOURCES/indra/newview/linux_tools/unicode.ttf&lt;br /&gt;
    touch $PATH_TO_SOURCES/indra/newview/linux_tools/unicode.ttf&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
compile&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FreeBSD ==&lt;br /&gt;
&lt;br /&gt;
A list of patches is given for [[Compiling the viewer (FreeBSD)]].&lt;br /&gt;
&lt;br /&gt;
= Submitting Patches =&lt;br /&gt;
This is probably far down the road, but if you make changes to the source and want to submit them, see the page about [[Submitting patches|submitting patches]].&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Build_the_Viewer_on_Linux&amp;diff=27296</id>
		<title>Build the Viewer on Linux</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Build_the_Viewer_on_Linux&amp;diff=27296"/>
		<updated>2007-08-04T21:39:45Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: Added instructions on message.xml&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{CompileNav}}&lt;br /&gt;
&lt;br /&gt;
The following are instructions for building the Second Life viewer on linux. This process has been used on [http://www.debian.org/ debian] and debian based systems like [http://www.ubuntu.com/ ubuntu], and also on [http://www.fedoraproject.org/ Fedora]. For other platforms, see [[Get source and compile]].&lt;br /&gt;
&lt;br /&gt;
{{vital-info|How to compile [[Source_archive#2007-Feb-20|FL-1.13.3.58185]] and [[Source_archive#2007-Feb-24|FL-1.13.3.58390]] &#039;&#039;&#039;with&#039;&#039;&#039; llmozlib (see [[Talk:Compiling_the_viewer_%28Linux%29#llmozlib|discussion]])}}&lt;br /&gt;
&lt;br /&gt;
= Building the client =&lt;br /&gt;
To build the Second Life Viewer you will first need to install the required tools and libraries.&lt;br /&gt;
The following sections outline steps to build the client from source.  To simplify building,&lt;br /&gt;
Linden labs has been nice enough to prepackage some of the libraries and bundled them up in an&lt;br /&gt;
additional tar file.&lt;br /&gt;
&lt;br /&gt;
And while The Second Life Viewer is not a trivial build, and experience with building large&lt;br /&gt;
software packages will help you greatly - but don&#039;t be daunted, it should be simple once the&lt;br /&gt;
dependencies are in the right place.&lt;br /&gt;
&lt;br /&gt;
The tasks are:&lt;br /&gt;
# Install required tools.&lt;br /&gt;
# Unpack source and art tree&#039;s from Linden Labs.&lt;br /&gt;
# Install libraries not shiped by Linden Labs.&lt;br /&gt;
# Unpack or install the other required libraries and headers.&lt;br /&gt;
# Compile.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
== Required tools ==&lt;br /&gt;
There are a number of tools that need to be installed first.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;SCons&amp;lt;/b&amp;gt; build tool [package: scons]&lt;br /&gt;
* &amp;lt;b&amp;gt;GCC 3.4&amp;lt;/b&amp;gt; C/C++ compiler&lt;br /&gt;
** [debian/ubuntu: g++-3.4]&lt;br /&gt;
** [fedora: compat-gcc-34-c++]&lt;br /&gt;
** other GCC versions are not well-tested; GCC 4.x will NOT currently build the viewer without a few simple code adjustments. {link to them pls}&lt;br /&gt;
* &amp;lt;b&amp;gt;yacc&amp;lt;/b&amp;gt; [suggest packages: bison]&lt;br /&gt;
* &amp;lt;b&amp;gt;lex&amp;lt;/b&amp;gt; [suggest packages: flex]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Unpack the source tree ==&lt;br /&gt;
&lt;br /&gt;
You can get the source either from the source archives available at [[Source downloads]], or you can get it from [[Subversion]].&lt;br /&gt;
&lt;br /&gt;
Using a source archive is the easier option, but if you plan to do active development and want to make your own modifications, while merging LL&#039;s changes, subversion will probably be much more convenient on the long term.&lt;br /&gt;
&lt;br /&gt;
=== Getting the source from the source archives ===&lt;br /&gt;
Get the source from [[Source downloads]]. You will need all 3 archives: source, artwork and libraries.&lt;br /&gt;
&lt;br /&gt;
Choose a location and unpack the source tree and the art work.  They will be extracted into a&lt;br /&gt;
directory call &amp;lt;b&amp;gt;linden&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % tar -xzf slviewer-src-&amp;lt;version&amp;gt;.tar.gz&lt;br /&gt;
 % tar -xzf slviewer-&amp;lt;os&amp;gt;-libs-&amp;lt;version&amp;gt;.tar.gz&lt;br /&gt;
 % unzip slviewer-artwork-&amp;lt;version&amp;gt;.zip&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Getting the source from Subversion ===&lt;br /&gt;
Select a source [[Source branches|branch]] to check out.&lt;br /&gt;
&lt;br /&gt;
Check it out with:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn co http://svn.secondlife.com/svn/linden/&amp;lt;branch&amp;gt; [directory]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
If you don&#039;t specify the directory, it&#039;ll use the name of the branch as the default.&lt;br /&gt;
&lt;br /&gt;
Now you will have a directory with the source code. This only includes the source code itself, without the libraries or artwork. You will have to get them from the [[Source downloads]] and unpack them into the tree.&lt;br /&gt;
&lt;br /&gt;
If the directory SVN created is called &#039;linden&#039; then you can directly unzip and untar the archives on top of it. If it&#039;s called something else, create a symlink:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % ln -sf &amp;lt;branch&amp;gt; linden&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now unpack the libraries and artwork:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % tar -xzf slviewer-&amp;lt;os&amp;gt;-libs-&amp;lt;version&amp;gt;.tar.gz&lt;br /&gt;
 % unzip slviewer-artwork-&amp;lt;version&amp;gt;.zip&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing the required libraries (that Linden labs can not or does not provide)==&lt;br /&gt;
=== FMOD (audio) ===&lt;br /&gt;
* FMOD provides audio output, but (although &#039;free&#039; in some senses) is not itself open-source.  &amp;lt;b&amp;gt;If&amp;lt;/b&amp;gt; you wish to avoid FMOD, thus disabling audio, you may make these changes:&lt;br /&gt;
** Comment-out the libfmod line in indra/newview/viewer_manifest.py&lt;br /&gt;
** Add FMOD=no to your Scons build command when compiling the source.&lt;br /&gt;
* If you want to use FMOD, fetch and unpack &amp;lt;b&amp;gt;FMOD 3.75&amp;lt;/b&amp;gt; &amp;lt;http://www.fmod.org/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % wget http://www.fmod.org/files/fmodapi375linux.tar.gz&lt;br /&gt;
 % tar -xzvf fmodapi375linux.tar.gz&lt;br /&gt;
 % cd fmodapi375linux/&lt;br /&gt;
 % cp api/inc/* ../linden/libraries/i686-linux/include/&lt;br /&gt;
 % cp api/libfmod-3.75.so ../linden/libraries/i686-linux/lib_release_client/&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing the required dependencies (prepackaged by Linden labs)==&lt;br /&gt;
&lt;br /&gt;
The Second Life Viewer has a number of compile/link dependencies on external libraries which&lt;br /&gt;
are needed - to help you, the source download page contains a link to a &amp;lt;i&amp;gt;slviewer-linux-libs&amp;lt;/i&amp;gt; package which you unpack over the source tree to fill most of the dependencies (and thus avoid most of the fiddly work described on this page).&lt;br /&gt;
&lt;br /&gt;
If you download the libs to the top folder, where the &amp;lt;i&amp;gt;linden&amp;lt;/i&amp;gt; folder is after getting and extracting the viewer source code tarball, the following command should unpack everything to the right spot. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 tar xvfz slviewer-linux-libs-&amp;lt;version&amp;gt;.tar.gz&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you choose to use the provided libraries you can skip to &lt;br /&gt;
[[Compiling_the_viewer_%28Linux%29#Compiling|Compiling the client]].&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
=== Doing yourself ===&lt;br /&gt;
If you are porting to a new architecture or wish to make a package tailored to your Linux distribution&#039;s own libraries.  You will have to install the following additional dependencies&lt;br /&gt;
listed below.  Paths and package names given here are based on Ubuntu 7.04 and may vary&lt;br /&gt;
according to your Linux distribution.&lt;br /&gt;
&lt;br /&gt;
==== List of libraries ====&lt;br /&gt;
* &amp;lt;b&amp;gt;apr-1&amp;lt;/b&amp;gt; [ubuntu: libapr1-dev, fedora: apr-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;aprutil-1&amp;lt;/b&amp;gt; [ubuntu: libaprutil1-dev, fedora: apr-util-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;boost&amp;lt;/b&amp;gt; [ubuntu: libboost-dev, fedora: boost-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;boost-regex&amp;lt;/b&amp;gt; [ubuntu: libboost-regex-dev]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;curl&amp;lt;/b&amp;gt; library at least version 7.15.4 is recommended, 7.16.x is ideal.&lt;br /&gt;
** [ubuntu: libcurl3-dev, fedora: curl-devel]&lt;br /&gt;
** If you are compiling your own version of &amp;lt;b&amp;gt;Curl&amp;lt;/b&amp;gt;, then you should consider configuring it to use the &amp;lt;b&amp;gt;c-ares&amp;lt;/b&amp;gt; library so that DNS lookups will be asynchronous.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;ELFIO&amp;lt;/b&amp;gt; &amp;lt;http://sourceforge.net/projects/elfio/&amp;gt;&lt;br /&gt;
** This wants to build a static library by default.  Afterwards, to create a dynamic libelfio.so&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % cd ELFIO &amp;amp;&amp;amp; g++-3.4 -shared *.o -o libelfio.so&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;expat&amp;lt;/b&amp;gt; [ubuntu: libexpat1-dev, fedora: expat-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;google-perftools&amp;lt;/b&amp;gt; library for the tcmalloc and stacktrace libraries. (memory checking)&lt;br /&gt;
**[ubuntu: libgoogle-perftools-dev, fedora: google-perftools-devel.i386&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;GTK 2.x&amp;lt;/b&amp;gt; development headers [ubuntu: libgtk2.0-dev, fedora: gtk2-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;jpeglib&amp;lt;/b&amp;gt; [ubuntu: libjpeg62-dev, fedora: libjpeg-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;OpenGL&amp;lt;/b&amp;gt; development headers: gl.h, glext.h, glu.h&lt;br /&gt;
**[ubuntu: mesa-common-dev, libglu1-mesa-dev, fedora: mesa-libGL-devel, mesa-libGLU-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;OpenJPEG&amp;lt;/b&amp;gt; &amp;lt;http://www.openjpeg.org/&amp;gt;&lt;br /&gt;
** note: OpenJPEG 1.1.1 or greater is required which has the macro OPJ_PATH_LEN, if the header has MAX_PATH, then upgrade or it will crash with a divide by zero error as the structures would be two different sizes.&lt;br /&gt;
*** &#039;&#039;what does this mean?&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;OpenSSL&amp;lt;/b&amp;gt; &amp;lt;http://www.openssl.org/&amp;gt; [ubuntu: ?, fedora: ?]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;SDL&amp;lt;/b&amp;gt; [ubuntu libsdl1.2-dev, fedora: SDL-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;Vorbis&amp;lt;/b&amp;gt; [ubuntu: libvorbis-dev, fedora: libvorbis-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;X11&amp;lt;/b&amp;gt; development headers: Xlib.h, and Xutil.h&lt;br /&gt;
**[ubuntu: libx11-dev, fedora: libX11-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;xmlrpc-epi 0.51&amp;lt;/b&amp;gt; &amp;lt;http://xmlrpc-epi.sourceforge.net/&amp;gt;&lt;br /&gt;
** note: not xmlrpc-c (xmlrpc-c has a library and headers with the same name but is not compatible)&lt;br /&gt;
** Apply patches from the instructions in [[patch xmlrpc-epi]]&lt;br /&gt;
*** &#039;&#039;does this still work?&#039;&#039;&lt;br /&gt;
** See also:&lt;br /&gt;
*** http://www.haxxed.com/rpms/secondlife/xmlrpc-epi-0.51-gcc4.1.patch&lt;br /&gt;
*** http://www.haxxed.com/rpms/secondlife/xmlrpc-epi-0.51-use-system-expat.patch&lt;br /&gt;
*** http://www.haxxed.com/rpms/secondlife/xmlrpc-epi-0.51-rename.patch&lt;br /&gt;
*** You have to regenerate autotools after applying the patches:&lt;br /&gt;
****libtoolize -c -f&lt;br /&gt;
****aclocal&lt;br /&gt;
****automake -c -a -f&lt;br /&gt;
****autoconf&lt;br /&gt;
*** The first patch fixes compiling on gcc 4. The second patch causes it to compile against the system expat, the version xmlrpc-epi comes with is broken and will not work. The last patch renames the library from xmlrpc to xmlrpc-epi, otherwise it conflicts with xmlrpc-c - which means the viewer then needs to be patched to link against xmlrpc-epi and not xmlrpc. These patches are from my Fedora package. On linux, I recommend these patches in favor of the Linden ones, as theirs seem to be for windows. (And mine actually work)&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Copy headers and libraries into the source tree ====&lt;br /&gt;
&lt;br /&gt;
Here is a guide to the sequence of shell commands needed to copy the required headers and libraries into the Second Life Viewer source tree for building.  Actual paths to system headers may vary according to Linux distribution.&lt;br /&gt;
&lt;br /&gt;
If you are using the easy &amp;lt;i&amp;gt;slviewer-linux-libs&amp;lt;/i&amp;gt; bundle then you can skip the rest of this section, &amp;lt;b&amp;gt;otherwise&amp;lt;/b&amp;gt; you will also need to perform the following:&lt;br /&gt;
&lt;br /&gt;
* ${SLSRC} refers to the top-level directory of the Second Life Viewer source tree.&lt;br /&gt;
* ${OPENJPEG} refers to the top-level directory of your completed OpenJPEG build.&lt;br /&gt;
* ${ELFIO} refers to the top-level directory of your completed ELFIO build.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 cp -a /usr/include/atk-1.0 ${SLSRC}/libraries/i686-linux/include/&lt;br /&gt;
 cp -a /usr/include/gtk-2.0 ${SLSRC}/libraries/i686-linux/include/&lt;br /&gt;
 cp -a /usr/lib/gtk-2.0/include/* ${SLSRC}/libraries/i686-linux/include/gtk-2.0/&lt;br /&gt;
 cp -a /usr/include/glib-2.0 ${SLSRC}/libraries/i686-linux/include/&lt;br /&gt;
 cp -a /usr/lib/glib-2.0/include/* ${SLSRC}/libraries/i686-linux/include/glib-2.0/&lt;br /&gt;
 cp -a /usr/include/pango-1.0 ${SLSRC}/libraries/i686-linux/include/&lt;br /&gt;
&lt;br /&gt;
if your GTK is fairly recent and thus needs Cairo:&lt;br /&gt;
 cp -a /usr/include/cairo/* ${SLSRC}/libraries/i686-linux/include&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 cp -a /usr/include/apr-1.0/ ${SLSRC}/libraries/i686-linux/include/apr-1&lt;br /&gt;
&lt;br /&gt;
 mkdir ${SLSRC}/libraries/i686-linux/include/expat&lt;br /&gt;
 cp -a /usr/include/expat*.h ${SLSRC}/libraries/i686-linux/include/expat/&lt;br /&gt;
&lt;br /&gt;
 mkdir ${SLSRC}/libraries/i686-linux/include/zlib&lt;br /&gt;
 cp -a /usr/include/zlib*.h ${SLSRC}/libraries/i686-linux/include/zlib/&lt;br /&gt;
&lt;br /&gt;
 mkdir ${SLSRC}/libraries/i686-linux/include/openjpeg&lt;br /&gt;
 cp ${OPENJPEG}/libopenjpeg/openjpeg.h ${SLSRC}/libraries/i686-linux/include/openjpeg/&lt;br /&gt;
 cp ${OPENJPEG}/libopenjpeg.a ${SLSRC}/libraries/i686-linux/lib_release_client/&lt;br /&gt;
&lt;br /&gt;
 mkdir ${SLSRC}/libraries/i686-linux/include/ELFIO&lt;br /&gt;
 cp ${ELFIO}/ELFIO/*.h ${SLSRC}/libraries/i686-linux/include/ELFIO/&lt;br /&gt;
 cp ${ELFIO}/ELFIO/libelfio.so ${SLSRC}/libraries/i686-linux/lib_release_client/&lt;br /&gt;
&lt;br /&gt;
 mkdir ${SLSRC}/libraries/i686-linux/include/jpeglib&lt;br /&gt;
 cp -a /usr/include/j*.h ${SLSRC}/libraries/i686-linux/include/jpeglib/&lt;br /&gt;
 touch ${SLSRC}/libraries/i686-linux/include/jpeglib/jinclude.h&lt;br /&gt;
&lt;br /&gt;
 mkdir ${SLSRC}/libraries/i686-linux/include/llfreetype2&lt;br /&gt;
 cp -a /usr/include/freetype2/freetype/ ${SLSRC}/libraries/i686-linux/include/llfreetype2/&lt;br /&gt;
 cp -a /usr/include/ft2build.h ${SLSRC}/libraries/i686-linux/include/llfreetype2/freetype/&lt;br /&gt;
&lt;br /&gt;
 mkdir ${SLSRC}/libraries/i686-linux/include/xmlrpc-epi&lt;br /&gt;
 cp -a /usr/include/xmlrpc*.h ${SLSRC}/libraries/i686-linux/include/xmlrpc-epi/&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Compiling ==&lt;br /&gt;
=== Build Types ===&lt;br /&gt;
The &#039;&#039;BUILD&#039;&#039; parameter specifies the build type. For normal usage, use &#039;&#039;&#039;release&#039;&#039;&#039;. If you plan to work on the source, choose &#039;&#039;&#039;releasenoopt&#039;&#039;&#039; or &#039;&#039;&#039;debug&#039;&#039;&#039;, as these versions are unoptimized and much easier to debug.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;release&#039;&#039;&#039;: Optimized build for release.&lt;br /&gt;
* &#039;&#039;&#039;releasenoopt&#039;&#039;&#039;: Unoptimized build.&lt;br /&gt;
* &#039;&#039;&#039;debug&#039;&#039;&#039;: Debug build with assertions.&lt;br /&gt;
* &#039;&#039;&#039;releasefordownload&#039;&#039;&#039;: Optimized build for release, will create a .tar.gz with the files for distribution.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
=== Building ===&lt;br /&gt;
=== Disable llMozLib ===&lt;br /&gt;
Add MOZLIB=no to your Scons build command when compiling the source.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ cd indra&lt;br /&gt;
 $ scons DISTCC=no BTARGET=client BUILD=release MOZLIB=no&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Expect a build time of a couple of hours.  The resulting unstripped Second Life Viewer binary is &amp;lt;b&amp;gt;newview/secondlife-i686-bin&amp;lt;/b&amp;gt;. Note that temporary object code is compiled into &amp;lt;b&amp;gt;/tmp/$USER&amp;lt;/b&amp;gt; by default (where $USER is your username) - this can be changed by prefixing the &amp;lt;b&amp;gt;scons&amp;lt;/b&amp;gt; command above with &amp;lt;b&amp;gt;TEMP_BUILD_DIR=&amp;quot;&amp;lt;i&amp;gt;[full directory path]&amp;lt;/i&amp;gt;&amp;quot;&amp;lt;/b&amp;gt;. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ TEMP_BUILD_DIR=&amp;quot;/home/fred/secondlife/temp-build&amp;quot; scons DISTCC=no BTARGET=client BUILD=release&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To build a release that has all of the shaders and optimizations enabled and resembles the official shipped Linux alpha client, use BUILD=releasefordownload&lt;br /&gt;
&lt;br /&gt;
Be sure to read the [[Common compilation problems]] page if you have problems - we&#039;ll try to keep the page up to date with known problems and solutions.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
== Testing and packaging the client ==&lt;br /&gt;
&lt;br /&gt;
=== Testing the result from inside the tree ===&lt;br /&gt;
&lt;br /&gt;
You may find it simpler and less error-prone to follow the instructions in the [[Compiling_the_viewer_%28Linux%29#Packaging_the_client|Packaging the client]] section below to run the client under the same conditions as an end-user would.  Otherwise:&lt;br /&gt;
&lt;br /&gt;
* Preparing to run &#039;in-tree&#039;&lt;br /&gt;
** &amp;lt;i&amp;gt;ensure that you have indra/newview/app_settings/static_*.db2&amp;lt;/i&amp;gt; - if not, you&#039;ll find it in the &#039;slviewer-artwork&#039; download (a zip file).&lt;br /&gt;
** now, from the indra directory:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ cp ../scripts/messages/message_template.msg newview/app_settings/&lt;br /&gt;
 $ cp ../etc/message.xml newview/app_settings/&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; Starting from version 1.18.0, copying message.xml is also required. Missing it will cause group IMs to fail to work, although the viewer will run fine otherwise.&lt;br /&gt;
&lt;br /&gt;
* Running it: The LD_LIBRARY_PATH stuff ensures that the binary looks for its libraries in the right places.  From the indra directory:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ ( cd newview &amp;amp;&amp;amp; LD_LIBRARY_PATH=../../libraries/i686-linux/lib_release_client:${LD_LIBRARY_PATH}:/usr/local/lib  ./secondlife-i686-bin )&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
==== The client seems kinda slow. ====&lt;br /&gt;
&lt;br /&gt;
By default, the open-source Second Life Viewer uses the open-source OpenJPEG library to decode the (many) JPEG-2000 texture images it receives from the servers.  This isn&#039;t quite of comparable speed to the proprietary third-party library which the Linden Lab viewer builds have traditionally used, for which we are not permitted to redistribute the source.&lt;br /&gt;
&lt;br /&gt;
However, the &amp;lt;i&amp;gt;slviewer-linux-libs&amp;lt;/i&amp;gt; package includes two pre-built libraries which facilitate the use of this slightly faster image decoding method: &amp;lt;b&amp;gt;libkdu_v42R.so&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;libllkdu.so&amp;lt;/b&amp;gt;.  These are provided for your testing; again, we are not permitted to grant you the right to re-distribute these libraries to downstream users, but the viewer will still work (albeit slightly slower) without them.&lt;br /&gt;
&lt;br /&gt;
To &amp;lt;b&amp;gt;use these faster image-decoding libraries&amp;lt;/b&amp;gt;, they simply need to be put into the right places relative to the viewer runtime directory - nothing needs to be reconfigured or recompiled.  If you&#039;re running the client from the source tree, the following will make the KDU libraries available:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 cp &amp;quot;$SLSRC/libraries/i686-linux/lib_release_client/libllkdu.so&amp;quot; &amp;quot;$SLSRC/indra/newview/libllkdu.so&amp;quot;&lt;br /&gt;
 mkdir &amp;quot;$SLSRC/indra/lib&amp;quot;&lt;br /&gt;
 cp &amp;quot;$SLSRC/libraries/i686-linux/lib_release_client/libkdu_v42R.so&amp;quot; &amp;quot;$SLSRC/indra/lib/libkdu_v42R.so&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The file &amp;lt;b&amp;gt;indra/newview/viewer_manifest.py&amp;lt;/b&amp;gt; contains some commented-out entries describing where these libraries belong; if you uncomment the two lines corresponding to libllkdu and libkdu then they will be automatically copied into the right place in the runtime directory when you follow the &#039;Packaging the client&#039; instructions below.&lt;br /&gt;
&lt;br /&gt;
==== File Dialogs Don&#039;t Work on 64 bit system ====&lt;br /&gt;
&lt;br /&gt;
If you run a 64 bit system, and your file dialogs don&#039;t work, or they worked before and stopped after you installed an update, it may be due to a mismatch between the headers used to compile the viewer and the library it&#039;s using. The log will contain something like this:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2007-06-21T01:28:35Z INFO: ll_try_gtk_init: Starting GTK Initialization.&lt;br /&gt;
2007-06-21T01:28:36Z INFO: ll_try_gtk_init: GTK Initialized.&lt;br /&gt;
2007-06-21T01:28:36Z INFO: ll_try_gtk_init: - Compiled against GTK version 2.10.11&lt;br /&gt;
2007-06-21T01:28:36Z INFO: ll_try_gtk_init: - Running against GTK version 2.10.6&lt;br /&gt;
2007-06-21T01:28:36Z WARNING: ll_try_gtk_init: - GTK COMPATIBILITY WARNING: Gtk+ version too old (micro mismatch)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What happens here is that your distribution includes 32 bit GTK libraries, but the package only includes the libraries themselves and not the headers. When building, the SL client will build against the headers included with the main 64 bit GTK package. This will work if the 64 bit version of the library is the same or older than the 32 bit one. However, if your 32 bit library is older, then the viewer will detect the mismatch (built with headers for a newer version of GTK than it&#039;s using) and turn GTK off.&lt;br /&gt;
&lt;br /&gt;
Possible solutions:&lt;br /&gt;
* Download the source for the version of the 32 bit GTK libraries your distribution comes with, and build your viewer against those headers.&lt;br /&gt;
* Upgrade your 32 bit GTK package so that it&#039;s the same or newer as the 64 bit one.&lt;br /&gt;
* Downgrade your 64 bit package (may not be a good idea).&lt;br /&gt;
&lt;br /&gt;
=== Packaging the client ===&lt;br /&gt;
&lt;br /&gt;
If you substitute &#039;BUILD=release&#039; with &#039;&amp;lt;b&amp;gt;BUILD=releasefordownload&amp;lt;/b&amp;gt;&#039; in the &#039;Compiling&#039; section above, then packaging the resulting code, libraries, data and documentation into a tarball for the end-user will be done automatically as the final stage of the build process; the pristine end-user client distribution has been assembled into the directory &amp;lt;b&amp;gt;indra/newview/SecondLife_i686_1_X_Y_Z/&amp;lt;/b&amp;gt; and has also been tarred into &amp;lt;b&amp;gt;indra/newview/SecondLife_i686_1_X_Y_Z.tar.bz2&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The file which controls what (and where) files go into the end-user runtime viewer directory is &amp;lt;b&amp;gt;indra/newview/viewer_manifest.py&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Automated libraries and headers adjustments, compilation and packaging ====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Here is a bash script that could save you a lot of time... It basically does all what is described above, and more, and entitles you to compile a SL client very easily:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# make-SL v1.70 (c)2007 Henri Beauchamp. Released under GPL license v2:&lt;br /&gt;
# http://www.gnu.org/licenses/gpl.txt&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
######## THIS IS QUICK&#039;N DIRTY ALPHA SOFTWARE. USE AT YOUR OWN RISKS ! ########&lt;br /&gt;
###############################################################################&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
# BEWARE: this script is meant to compile a -personal- SL client. It is -NOT- #&lt;br /&gt;
#         suitable to build client versions meant for public release, because #&lt;br /&gt;
#         non-open source code is packaged by this script (e.g. libkdu).      #&lt;br /&gt;
###############################################################################&lt;br /&gt;
&lt;br /&gt;
# This bash script is aimed at easying up the build process of a SL client.&lt;br /&gt;
# It does not cover building it with custom/system openjpeg, elfio or fmodapi&lt;br /&gt;
# (we use the provided libraries).&lt;br /&gt;
# You may enable or disable the use of your system&#039;s library by editing&lt;br /&gt;
# the USE_SYSTEM_* variable (&amp;quot;yes&amp;quot; --&amp;gt; use the system library, &amp;quot;no&amp;quot; --&amp;gt; use&lt;br /&gt;
# LL&#039;s provided ones).&lt;br /&gt;
# The script also takes care of updating properly the viewer_manifest.py script&lt;br /&gt;
# accordingly, so that you (should) end up with a properly packaged client.&lt;br /&gt;
&lt;br /&gt;
# To use this script, simply make it executable (chmod +x make-SL) and&lt;br /&gt;
# put it into /usr/local/bin (or any other directory in your PATH).&lt;br /&gt;
# Then, download the slviewer-src-*.tar.gz, slviewer-linux-libs-*.tar.gz,&lt;br /&gt;
# slviewer-artwork-*.zip and fmodapi*.tar.gz archives, and finally, invoke&lt;br /&gt;
# make-SL as follow:&lt;br /&gt;
#   make-SL path_to_archives  (example: make-SL ~/downloads)&lt;br /&gt;
# or simply:&lt;br /&gt;
#   make-SL&lt;br /&gt;
# when invoking from the directory where the archives are.&lt;br /&gt;
# The sources will be installed into the PATH_TO_SOURCES directory,&lt;br /&gt;
# and the client will be built into the TEMP_BUILD_DIR directory.&lt;br /&gt;
# The packaged build will be moved to your home directory.&lt;br /&gt;
# If you want to retry a compilation after fixing something manually and&lt;br /&gt;
# don&#039;t want make-SL to start all over again, overwriting everything,&lt;br /&gt;
# you may invoke it with the --retry option, like this:&lt;br /&gt;
#   make-SL --retry&lt;br /&gt;
# This script has been tested by the author, on a (very customized)&lt;br /&gt;
# Mandrake 10.2 distro. Tested with SL v1.17 sources.&lt;br /&gt;
&lt;br /&gt;
# Where the sources of the client will be held (defaults to &amp;quot;./linden&amp;quot;):&lt;br /&gt;
PATH_TO_SOURCES=&amp;quot;/usr/src/SL&amp;quot;&lt;br /&gt;
# Where to build the client:&lt;br /&gt;
export TEMP_BUILD_DIR=&amp;quot;$PATH_TO_SOURCES/build&amp;quot;&lt;br /&gt;
&lt;br /&gt;
USE_SYSTEM_GTK=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_SDL=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_SSL=&amp;quot;yes&amp;quot;&lt;br /&gt;
# Beware: libdb4 makes use of libapr... so you should keep USE_SYSTEM_APR&lt;br /&gt;
# and USE_SYSTEM_DB4 in sync.&lt;br /&gt;
USE_SYSTEM_APR=&amp;quot;no&amp;quot;&lt;br /&gt;
USE_SYSTEM_DB4=&amp;quot;no&amp;quot;&lt;br /&gt;
USE_SYSTEM_OGG=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_ZLIB=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_UUID=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_CURL=&amp;quot;no&amp;quot;&lt;br /&gt;
USE_SYSTEM_EXPAT=&amp;quot;no&amp;quot;&lt;br /&gt;
USE_SYSTEM_VORBIS=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_XMLRPC=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_JPEGLIB=&amp;quot;yes&amp;quot;&lt;br /&gt;
# Enabling the system freetype2 prevents the client from using the SL fonts,&lt;br /&gt;
# or at least, this is what happens on my system (Mandrake 10.2 with PLF&lt;br /&gt;
# freetype2).&lt;br /&gt;
USE_SYSTEM_FREETYPE2=&amp;quot;no&amp;quot;&lt;br /&gt;
USE_SYSTEM_PERFTOOLS=&amp;quot;yes&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# You may add tune flags here, to optimize the code for your processor.&lt;br /&gt;
# Example, for an Athlon XP:&lt;br /&gt;
# TUNE_FLAGS=&amp;quot;-march=athlon-xp&amp;quot;&lt;br /&gt;
# BEWARE: because of a bug in the v1.17.2.0 SConstruct file, you MUST keep at&lt;br /&gt;
# least an -O2 flag in the TUNE_FLAGS, to avoid getting a very slooooow client...&lt;br /&gt;
# This problem was apparently fixed in v1.17.3.0.&lt;br /&gt;
TUNE_FLAGS=&amp;quot;-fomit-frame-pointer -frename-registers -fweb -fexpensive-optimizations&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Whether to build with the browser login screen or not:&lt;br /&gt;
WITH_MOZILLA=&amp;quot;yes&amp;quot;&lt;br /&gt;
&lt;br /&gt;
function update_manifest() {&lt;br /&gt;
    grep -v $1 $PATH_TO_SOURCES/indra/newview/viewer_manifest.py &amp;gt;$TEMP_BUILD_DIR/viewer_manifest.py&lt;br /&gt;
    mv -f $TEMP_BUILD_DIR/viewer_manifest.py $PATH_TO_SOURCES/indra/newview/viewer_manifest.py&lt;br /&gt;
    chmod +x $PATH_TO_SOURCES/indra/newview/viewer_manifest.py&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function compile() {&lt;br /&gt;
    cd $PATH_TO_SOURCES/indra&lt;br /&gt;
    echo &amp;quot;Compiling the client into $TEMP_BUILD_DIR...&amp;quot;&lt;br /&gt;
    scons DISTCC=no BTARGET=client BUILD=releasefordownload MOZLIB=$WITH_MOZILLA&lt;br /&gt;
    if (($? == 0)) ; then&lt;br /&gt;
        mv $PATH_TO_SOURCES/indra/newview/SecondLife*.tar.bz2 $HOME/&lt;br /&gt;
    fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if [ &amp;quot;$TEMP_BUILD_DIR&amp;quot; == &amp;quot;&amp;quot; ] ; then&lt;br /&gt;
    export TEMP_BUILD_DIR=/tmp/$USER/SL&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Check to see if we simply want to retry a compilation:&lt;br /&gt;
if [ &amp;quot;$1&amp;quot; == &amp;quot;--retry&amp;quot; ] ; then&lt;br /&gt;
    compile&lt;br /&gt;
    exit $?&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Make sure we don&#039;t unpack over an old source tree:&lt;br /&gt;
if [ -d linden ] ; then&lt;br /&gt;
    rm -rf linden/&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if [ -d $PATH_TO_SOURCES ] &amp;amp;&amp;amp; [ &amp;quot;$PATH_TO_SOURCES&amp;quot; != &amp;quot;&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$PATH_TO_SOURCES&amp;quot; != &amp;quot;/&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$PATH_TO_SOURCES&amp;quot; != &amp;quot;.&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$PATH_TO_SOURCES&amp;quot; != &amp;quot;..&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$PATH_TO_SOURCES&amp;quot; != &amp;quot;$HOME&amp;quot; ] ; then&lt;br /&gt;
    rm -rf $PATH_TO_SOURCES/&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Use the parameter (if any) as the path to the archives:&lt;br /&gt;
&lt;br /&gt;
PATH_TO_ARCHIVES=&amp;quot;.&amp;quot;&lt;br /&gt;
if [ &amp;quot;$1&amp;quot; != &amp;quot;&amp;quot; ]; then&lt;br /&gt;
    if [ -d $1 ] ; then&lt;br /&gt;
        PATH_TO_ARCHIVES=$1&lt;br /&gt;
    fi&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s first unpack everything:&lt;br /&gt;
if ! [ -f $PATH_TO_ARCHIVES/slviewer-src-*.tar.gz ] ; then&lt;br /&gt;
    echo &amp;quot;You need slviewer-src !&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
if ! [ -f $PATH_TO_ARCHIVES/slviewer-linux-libs-*.tar.gz ] ; then&lt;br /&gt;
    echo &amp;quot;You need slviewer-linux-libs !&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
if ! [ -f $PATH_TO_ARCHIVES/slviewer-artwork-*.zip ] ; then&lt;br /&gt;
    echo &amp;quot;You need slviewer-artwork !&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
if ! [ -f $PATH_TO_ARCHIVES/fmodapi*.tar.gz ] ; then&lt;br /&gt;
    echo &amp;quot;You need fmodapi !&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
echo &amp;quot;Extracting the files from the archives...&amp;quot;&lt;br /&gt;
tar xzf $PATH_TO_ARCHIVES/slviewer-src-*.tar.gz&lt;br /&gt;
tar xzf $PATH_TO_ARCHIVES/slviewer-linux-libs-*.tar.gz&lt;br /&gt;
unzip $PATH_TO_ARCHIVES/slviewer-artwork-*.zip &amp;gt;/dev/null&lt;br /&gt;
tar xzf $PATH_TO_ARCHIVES/fmodapi*.tar.gz&lt;br /&gt;
&lt;br /&gt;
# fmodapi:&lt;br /&gt;
echo &amp;quot;Copying fmodapi files...&amp;quot;&lt;br /&gt;
cp -a fmodapi*/api/inc/* linden/libraries/i686-linux/include/&lt;br /&gt;
cp fmodapi*/api/libfmod-*.so linden/libraries/i686-linux/lib_release_client/&lt;br /&gt;
rm -rf fmodapi*/&lt;br /&gt;
&lt;br /&gt;
# Move the sources to where we want to hold them:&lt;br /&gt;
if [ &amp;quot;$PATH_TO_SOURCES&amp;quot; != &amp;quot;linden&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$PATH_TO_SOURCES&amp;quot; != &amp;quot;&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Moving the sources to $PATH_TO_SOURCES...&amp;quot;&lt;br /&gt;
    mv -f linden $PATH_TO_SOURCES&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s own the files:&lt;br /&gt;
chown -R $USER: $PATH_TO_SOURCES/&lt;br /&gt;
&lt;br /&gt;
# Check for patches to apply. The names of the patches must be in the form&lt;br /&gt;
# slviewer-*.patch* (Example: slviewer-v117-EmbbededNotecard.patch.bz2).&lt;br /&gt;
# They must be applicable from inside the source directory with the -p1&lt;br /&gt;
# option, i.e. they have been built from outside the source directory&lt;br /&gt;
# with a diff command such as:&lt;br /&gt;
# diff -urN linden/ linden-patched/ &amp;gt;slviewer-whatever.patch&lt;br /&gt;
# And they may be gzipped or bzipped.&lt;br /&gt;
PATCHES=`/bin/ls $PATH_TO_ARCHIVES/slviewer-*.patch* 2&amp;gt;/dev/null`&lt;br /&gt;
if [ &amp;quot;$PATCHES&amp;quot; != &amp;quot;&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Applying patches...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES&lt;br /&gt;
    PATCHES=`/bin/ls $PATH_TO_ARCHIVES/slviewer-*.patch*`&lt;br /&gt;
    for i in $PATCHES; do&lt;br /&gt;
        echo &amp;quot;Patch: $i&amp;quot;&lt;br /&gt;
        if echo $i | grep &amp;quot;.gz&amp;quot; &amp;amp;&amp;gt;/dev/null ; then&lt;br /&gt;
            gunzip -c $i | patch -p1 -s&lt;br /&gt;
        elif echo $i | grep &amp;quot;.bz2&amp;quot; &amp;amp;&amp;gt;/dev/null ; then&lt;br /&gt;
            bzcat $i | patch -p1 -s&lt;br /&gt;
        else&lt;br /&gt;
            patch -p1 -s &amp;lt;$i&lt;br /&gt;
        fi&lt;br /&gt;
    done&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Make a clean build:&lt;br /&gt;
if [ -d $TEMP_BUILD_DIR ] &amp;amp;&amp;amp; [ &amp;quot;$TEMP_BUILD_DIR&amp;quot; != &amp;quot;&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$TEMP_BUILD_DIR&amp;quot; != &amp;quot;/&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$TEMP_BUILD_DIR&amp;quot; != &amp;quot;.&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$TEMP_BUILD_DIR&amp;quot; != &amp;quot;..&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$TEMP_BUILD_DIR&amp;quot; != &amp;quot;$HOME&amp;quot; ] ; then&lt;br /&gt;
    rm -rf $TEMP_BUILD_DIR/&lt;br /&gt;
fi&lt;br /&gt;
mkdir -p $TEMP_BUILD_DIR&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system GTK+ if available:&lt;br /&gt;
if [ -d /usr/include/atk-1.0 ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_GTK&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system GTK+...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries/i686-linux/include&lt;br /&gt;
    rm -rf atk-1.0/ gtk-2.0/ glib-2.0/ pango-1.0/&lt;br /&gt;
    rm -f ../lib_release_client/libgtk*&lt;br /&gt;
    cp -a /usr/include/atk-1.0 .&lt;br /&gt;
    cp -a /usr/include/gtk-2.0 .&lt;br /&gt;
    cp -a /usr/lib/gtk-2.0/include/* gtk-2.0/&lt;br /&gt;
    cp -a /usr/include/glib-2.0 .&lt;br /&gt;
    cp -a /usr/lib/glib-2.0/include/* glib-2.0/&lt;br /&gt;
    cp -a /usr/include/pango-1.0 .&lt;br /&gt;
    if [ -d /usr/include/cairo ] ; then&lt;br /&gt;
        cp -a /usr/include/cairo/* .&lt;br /&gt;
    fi&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system freetype2 if available:&lt;br /&gt;
if [ -f /usr/include/ft2build.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_FREETYPE2&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system freetype2...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/freetype/ i686-linux/include/llfreetype2/*&lt;br /&gt;
    rm -f include/ft2build.h i686-linux/lib_release_client/libfreetype.a&lt;br /&gt;
    cp -a /usr/include/freetype2/freetype/ i686-linux/include/llfreetype2/&lt;br /&gt;
    cp -a /usr/include/ft2build.h i686-linux/include/llfreetype2/freetype/&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system zlib if available:&lt;br /&gt;
if [ -f /usr/include/zlib.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_ZLIB&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system zlib...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/zlib/&lt;br /&gt;
    mkdir -p i686-linux/include/zlib&lt;br /&gt;
    cp -a /usr/include/zlib*.h i686-linux/include/zlib/&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system jpeglib if available:&lt;br /&gt;
if [ -f /usr/include/jpeglib.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_JPEGLIB&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system jpeglib...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/jpeglib/ i686-linux/lib_release_client/libjpeg.a&lt;br /&gt;
    mkdir -p i686-linux/include/jpeglib&lt;br /&gt;
    cp -a /usr/include/j*.h i686-linux/include/jpeglib/&lt;br /&gt;
    touch i686-linux/include/jpeglib/jinclude.h&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system xmlrpc-epi if available:&lt;br /&gt;
if [ -f /usr/include/xmlrpc.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_XMLRPC&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system xmlrpc-epi...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/xmlrpc-epi/ i686-linux/lib_release_client/libxmlrpc.a&lt;br /&gt;
    mkdir -p i686-linux/include/xmlrpc-epi&lt;br /&gt;
    cp -a /usr/include/xmlrpc*.h i686-linux/include/xmlrpc-epi/&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system ogg if available:&lt;br /&gt;
if [ -f /usr/include/ogg/ogg.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_OGG&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system ogg...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/ogg/ i686-linux/lib_release_client/libogg*&lt;br /&gt;
    update_manifest libogg&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system vorbis if available:&lt;br /&gt;
if [ -f /usr/include/vorbis/vorbisenc.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_VORBIS&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system vorbis...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/vorbis/ i686-linux/lib_release_client/libvorbis*&lt;br /&gt;
    update_manifest libvorbis&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system SDL if available:&lt;br /&gt;
if [ -f /usr/include/SDL/SDL.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_SDL&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system SDL...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries/i686-linux&lt;br /&gt;
    rm -rf include/SDL/ lib_release_client/libSDL*&lt;br /&gt;
    update_manifest libSDL&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system openssl if available:&lt;br /&gt;
if [ -f /usr/lib/libssl.so.0.9.7 ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_SSL&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system openssl...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries/i686-linux/lib_release_client&lt;br /&gt;
    rm -f libssl.* libcrypto.*&lt;br /&gt;
    update_manifest libssl&lt;br /&gt;
    update_manifest libcrypto&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system apr if available:&lt;br /&gt;
if [ -f /usr/include/apr*/apr.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_APR&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system apr...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries/i686-linux&lt;br /&gt;
    rm -rf include/apr-1/*&lt;br /&gt;
    rm -f lib_release_client/libapr*&lt;br /&gt;
    cp -a /usr/include/apr*/* include/apr-1/&lt;br /&gt;
    update_manifest libapr&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system expat if available:&lt;br /&gt;
if [ -f /usr/include/expat.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_EXPAT&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system expat...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/expat/&lt;br /&gt;
    rm -f i686-linux/lib_release_client/libexpat*&lt;br /&gt;
    mkdir -p i686-linux/include/expat&lt;br /&gt;
    cp -a /usr/include/expat*.h i686-linux/include/expat/&lt;br /&gt;
    update_manifest libexpat&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system curl if available:&lt;br /&gt;
if [ -f /usr/include/curl/curl.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_CURL&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system curl...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/curl/&lt;br /&gt;
    rm -f i686-linux/lib_release_client/libcurl.*&lt;br /&gt;
    update_manifest libcurl&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system db4 if available:&lt;br /&gt;
if [ -f /usr/lib/libdb-4.2.so ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_DB4&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system db4...&amp;quot;&lt;br /&gt;
    rm -f $PATH_TO_SOURCES/libraries/i686-linux/lib_release_client/libdb*.so&lt;br /&gt;
    update_manifest libdb&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system uuid if available:&lt;br /&gt;
if [ -f /lib/libuuid.so.1 ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_UUID&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system libuuid...&amp;quot;&lt;br /&gt;
    rm -f $PATH_TO_SOURCES/libraries/i686-linux/lib_release_client/libuuid.*&lt;br /&gt;
    update_manifest libuuid&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if grep tcmalloc $PATH_TO_SOURCES/indra/SConstruct &amp;amp;&amp;gt;/dev/null ; then&lt;br /&gt;
    if [ -f /usr/include/google/malloc_hook.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_PERFTOOLS&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
        echo &amp;quot;Using the system google-perftools...&amp;quot;&lt;br /&gt;
        cd $PATH_TO_SOURCES/libraries/i686-linux&lt;br /&gt;
        rm -f lib_release_client/libtcmalloc.* lib_release_client/libstacktrace.*&lt;br /&gt;
        rm -rf include/google/&lt;br /&gt;
        cp -a /usr/lib/libstacktrace.* /usr/lib/libtcmalloc.so* lib_release_client/&lt;br /&gt;
        cp -a /usr/include/google include/&lt;br /&gt;
        update_manifest tcmalloc&lt;br /&gt;
        update_manifest stacktrace&lt;br /&gt;
    else&lt;br /&gt;
        # Remove the google-perftools stuff if not present in the libraries package&lt;br /&gt;
        # (problem seen in SL v1.17):&lt;br /&gt;
        if ! [ -f $PATH_TO_SOURCES/libraries/i686-linux/lib_release_client/libtcmalloc.so ] ; then&lt;br /&gt;
            update_manifest tcmalloc&lt;br /&gt;
            update_manifest stacktrace&lt;br /&gt;
            # The following lines remove the&lt;br /&gt;
            #   &amp;quot;external_libs += [&#039;tcmalloc&#039;, &#039;stacktrace&#039;]&amp;quot;&lt;br /&gt;
            # line from SConstruct... and many other lines which renders SConstruct&lt;br /&gt;
            # unusable to build anything else than the client... this is a quick&#039;n&lt;br /&gt;
            # dirty patch. :-P&lt;br /&gt;
            grep -v tcmalloc $PATH_TO_SOURCES/indra/SConstruct &amp;gt;$TEMP_BUILD_DIR/SConstruct&lt;br /&gt;
            mv -f $TEMP_BUILD_DIR/SConstruct $PATH_TO_SOURCES/indra/SConstruct&lt;br /&gt;
        fi&lt;br /&gt;
    fi&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Fix a bug in v1.17.1 and later SConstruct file, where some libraries are&lt;br /&gt;
# compiled as shared instead of static, and are yet not packaged, and where&lt;br /&gt;
# fmod can&#039;t be enabled for OPENSOURCE:&lt;br /&gt;
sed -e &amp;quot;s/create_dynamic_module(module=module, module_libs=module_libs)/create_static_module(module)/&amp;quot; $PATH_TO_SOURCES/indra/SConstruct &amp;gt;$TEMP_BUILD_DIR/SConstruct&lt;br /&gt;
sed -e &amp;quot;s/enable_fmod = not opensource and/enable_fmod =/&amp;quot; $TEMP_BUILD_DIR/SConstruct &amp;gt;$PATH_TO_SOURCES/indra/SConstruct&lt;br /&gt;
rm -f $TEMP_BUILD_DIR/SConstruct&lt;br /&gt;
&lt;br /&gt;
# Add tune flags, if any:&lt;br /&gt;
if [ &amp;quot;$TUNE_FLAGS&amp;quot; != &amp;quot;&amp;quot; ] ; then&lt;br /&gt;
    sed -e &amp;quot;s/-g -pipe/$TUNE_FLAGS -pipe/&amp;quot; $PATH_TO_SOURCES/indra/SConstruct &amp;gt;$TEMP_BUILD_DIR/SConstruct&lt;br /&gt;
    mv -f $TEMP_BUILD_DIR/SConstruct $PATH_TO_SOURCES/indra/SConstruct&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Update the manifest file and enable libkdu packaging. I&#039;m too lazy to use&lt;br /&gt;
# awk or perl, here, but that&#039;s indeed what should be done...&lt;br /&gt;
# The following (very dirty) code may break at some point, depending on what&lt;br /&gt;
# LL will put in comments in the manifest file...&lt;br /&gt;
# First, remove the lines with libstdc++.so.6 and the crash logger:&lt;br /&gt;
update_manifest libstdc&lt;br /&gt;
update_manifest crash_logger&lt;br /&gt;
# Now, any line with a &#039;#&#039; followed with several spaces _should_ be dealing&lt;br /&gt;
# with the libkdu stuff... So, we simply remove the &#039;#&amp;quot;...&lt;br /&gt;
sed -e &amp;quot;s/#        them/# them/&amp;quot; $PATH_TO_SOURCES/indra/newview/viewer_manifest.py &amp;gt;$TEMP_BUILD_DIR/viewer_manifest.py&lt;br /&gt;
sed -e &amp;quot;s/#   /   /&amp;quot; $TEMP_BUILD_DIR/viewer_manifest.py &amp;gt;$PATH_TO_SOURCES/indra/newview/viewer_manifest.py&lt;br /&gt;
#mv -f $TEMP_BUILD_DIR/viewer_manifest.py $PATH_TO_SOURCES/indra/newview/viewer_manifest.py&lt;br /&gt;
rm -f $TEMP_BUILD_DIR/viewer_manifest.py&lt;br /&gt;
chmod +x $PATH_TO_SOURCES/indra/newview/viewer_manifest.py&lt;br /&gt;
&lt;br /&gt;
# Comment out &amp;quot;export LL_GL_BASICEXT=x&amp;quot; in the wrapper script:&lt;br /&gt;
sed -e &amp;quot;s/export LL_GL_BASICEXT=x/#export LL_GL_BASICEXT=x/&amp;quot; $PATH_TO_SOURCES/indra/newview/linux_tools/wrapper.sh &amp;gt;$TEMP_BUILD_DIR/wrapper.sh&lt;br /&gt;
mv -f $TEMP_BUILD_DIR/wrapper.sh $PATH_TO_SOURCES/indra/newview/linux_tools/wrapper.sh&lt;br /&gt;
chmod +x $PATH_TO_SOURCES/indra/newview/linux_tools/wrapper.sh&lt;br /&gt;
&lt;br /&gt;
# Missing file... at least in v1.17.0.0&lt;br /&gt;
if grep &amp;quot;secondlife-i686.supp&amp;quot; $PATH_TO_SOURCES/indra/newview/viewer_manifest.py &amp;amp;&amp;gt;/dev/null ; then&lt;br /&gt;
    if ! [ -f $PATH_TO_SOURCES/indra/newview/secondlife-i686.supp ] ; then&lt;br /&gt;
        touch $PATH_TO_SOURCES/indra/newview/secondlife-i686.supp&lt;br /&gt;
    fi&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# LL makes the assumption that a certain unicode true type font is installed&lt;br /&gt;
# on all Linux systems... which is of course wrong !  Let&#039;s check, and when&lt;br /&gt;
# this font is absent, replace the broken soft link with an empty file: this&lt;br /&gt;
# at least will prevent the viewer to issue many warnings about not being able&lt;br /&gt;
# to load the unicode.ttf font.&lt;br /&gt;
if ! [ -r $PATH_TO_SOURCES/indra/newview/linux_tools/unicode.ttf ] ; then&lt;br /&gt;
    rm -f $PATH_TO_SOURCES/indra/newview/linux_tools/unicode.ttf&lt;br /&gt;
    touch $PATH_TO_SOURCES/indra/newview/linux_tools/unicode.ttf&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
compile&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FreeBSD ==&lt;br /&gt;
&lt;br /&gt;
A list of patches is given for [[Compiling the viewer (FreeBSD)]].&lt;br /&gt;
&lt;br /&gt;
= Submitting Patches =&lt;br /&gt;
This is probably far down the road, but if you make changes to the source and want to submit them, see the page about [[Submitting patches|submitting patches]].&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=SLDev-Traffic_20&amp;diff=25721</id>
		<title>SLDev-Traffic 20</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=SLDev-Traffic_20&amp;diff=25721"/>
		<updated>2007-07-18T07:30:13Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: Updated installer source URL to the path in the repository. .zip file was temporary and now out of date.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SLDevTraffic}}&lt;br /&gt;
&lt;br /&gt;
sldev-traffic no 20&lt;br /&gt;
&lt;br /&gt;
sldev discussions through July 15, 2007&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Bugs or Improvements Suitable for Open Source Programmers ==&lt;br /&gt;
Nicholaz Beresford created issue {{JIRA|VWR-1577}}, a meta issue listing a great many bugs that could be tackled by open source developers. If you&#039;re interested in getting your feet wet in the viewer, but need a project idea, look no further!&lt;br /&gt;
&lt;br /&gt;
== Crash on Some AMD Chips ==&lt;br /&gt;
A bug went out in 1.17.3 which caused the Windows viewer to crash on startup with some AMD CPUs, owing to {{JIRA|VWR-1610}}. sldev listmembers climbed all over the bug in a very active thread, helping to identify and push possible solutions for the problem. And that&#039;s why we love you. :)&lt;br /&gt;
&lt;br /&gt;
== Should Sculpted Prim Textures Be Uncompressed? ==&lt;br /&gt;
Dale Glass suggested that sculpted prim textures, or 64x64 and smaller textures in general, could remain uncompressed. This would provide an incentive to use smaller textures, and would solve the artifacting problems that drive sculpted prim makers to try using unnecessarily large textures. There hasn&#039;t been a viewer patch for this to date, but it should be possible to at least crank the jpeg compression level on small textures.&lt;br /&gt;
&lt;br /&gt;
Helping to prove the uncompressed/reduced compression image concept, John Hurliman created a couple libsecondlife-based utilities at [[Importprimscript]] and [[SLImageUpload]]. Linden Lab can&#039;t speak to the safety of code from external sources, but peer code reviews are entirely appropriate on the mailing list.&lt;br /&gt;
&lt;br /&gt;
== Redistributing the Second Life Viewer ==&lt;br /&gt;
Dale Glass, in working toward producing an independent viewer distribution, created a [[Redistribution]] page, which Rob Linden has consolidated with the Third Party Library page. As with the above, this is also a good place to look if you want to help tackle proprietary dependencies, a common desire among open source developers.&lt;br /&gt;
&lt;br /&gt;
Dale&#039;s current approach is to make a meta installer, which collects files from an official installation, and retrieves all available and freely-distributable files needed to complete the installation from his own site automatically. Currently the installer is working for Windows, and the source is at http://svn.daleglass.net/sl/branches/buildfixes_1-18-0/indra/newview/installers/windows-dale/ - as always, proceed with care!&lt;br /&gt;
&lt;br /&gt;
== Reliable Message Delivery Over HTTP ==&lt;br /&gt;
Phoenix Linden posted a link to [[Reliable Message Delivery Over HTTP]]. Linden Lab are planning to open source their Certified HTTP implementation, and here you can read about that, and the efforts on reliable back-end communication.&lt;br /&gt;
&lt;br /&gt;
As a reminder, if there are other portions of the servers which should be open sourced in advance of the entire network of servers, the list is a great place to ask.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;Bogus&amp;quot; Triage ==&lt;br /&gt;
Laurent Laborde sparked an effort at finding bugs which could be trivially rejected. As an increasing number of residents dive in headfirst, filing first bugs before learning to search for existing issues or send appropriate items to support, more of this will be necessary. Matthew Shepherd and Gigs Taggart pitched in, and altogether a great number of issues were resolved. (Thanks!)&lt;br /&gt;
&lt;br /&gt;
== JIRA and SLDev Fanclub ==&lt;br /&gt;
Laurent Laborde was impressed by much of JIRA, and ended up creating an in-world group called the &amp;quot;JIRA and SLDev Fanclub.&amp;quot; Laurent was originally going to name the list something which might have made it difficult for Lindens to join, but this one&#039;s safe.&lt;br /&gt;
&lt;br /&gt;
If you&#039;re keen to catch other sldevers in-world outside of Linden office hours, this could be a good way of doing so.&lt;br /&gt;
&lt;br /&gt;
== Mute Visbility Progress ==&lt;br /&gt;
Able Whitman continues development on visibility muting, as described in {{JIRA|VWR-1017}}. Able has posted patches to the mailing list, as well as a built viewer. The patch is at http://ablewhitman.org/viewer/aw-41571.patch.zip&lt;br /&gt;
&lt;br /&gt;
== Open Source Candidate Repository ==&lt;br /&gt;
Dzonatas Sol is posting builds of the viewer with various open source patches applied. This could be a good way of testing patches for developers who aren&#039;t able or willing to collect patches and create their own builds. Dzonatas invites direct mail (or presumably in-world contact?) from parties wishing to work with her.&lt;br /&gt;
&lt;br /&gt;
== Updated Doxygen Docs ==&lt;br /&gt;
If you&#039;re not using Dale Glass&#039; generated Doxygen docs... you should be!&lt;br /&gt;
&lt;br /&gt;
Updated this week: http://doc.daleglass.net/index.html&lt;br /&gt;
&lt;br /&gt;
== JIRA Pain - Less Slowness - Wiki, More ==&lt;br /&gt;
&lt;br /&gt;
The JIRA is running much faster than before, although there&#039;s still room for improvement.&lt;br /&gt;
&lt;br /&gt;
The wiki still needs love. You can follow developments at {{JIRA|WEB-223}}.&lt;br /&gt;
&lt;br /&gt;
== The Hippos ==&lt;br /&gt;
&lt;br /&gt;
Last but certainly not least - [http://blog.secondlife.com/2007/07/17/linden-lab-to-recognize-open-source-contributors/ The Hippos]! Normally threads get to settle into inactivity for a couple days before being summarized, but this seemed relevant and certainly of interest to many sldev-traffic readers. Head on over for a read, and consider nominating someone you respect. :)&lt;br /&gt;
&lt;br /&gt;
Thanks for readin&#039;!&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Dale_Glass&amp;diff=25522</id>
		<title>User:Dale Glass</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Dale_Glass&amp;diff=25522"/>
		<updated>2007-07-15T18:07:25Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: fixed link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Evil Scripter and RL programmer.&lt;br /&gt;
&lt;br /&gt;
Currently working on adding an avatar scanner to the SL client.&lt;br /&gt;
&lt;br /&gt;
= Projects =&lt;br /&gt;
== Avatar Scanner ==&lt;br /&gt;
http://daleglass.net/images/screenshots/avlist6_001.jpg&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Shows a list of all avatars known to the client. This can be easily more than a standard 96m scanner, and seems to depend on rendering distance.&lt;br /&gt;
&lt;br /&gt;
* Keeps an internal list of avatars, and continues showing avatars that disappeared in the list for several seconds to give people time to perform some action on them (intended to make it easier to deal with griefers that do something nasty, then teleport out)&lt;br /&gt;
&lt;br /&gt;
* Shows Linden accounts in bold. This will be expanded later to highlight people who are very new, don&#039;t have a credit card on file, etc depending on user configuration.&lt;br /&gt;
&lt;br /&gt;
* Allows easy access to IM, profiles, etc&lt;br /&gt;
&lt;br /&gt;
* Allows to start a conference to multiple avatars around you, the same way it works in the friends list.&lt;br /&gt;
&lt;br /&gt;
* Allows tracking an avatar by placing a beacon on it. In the case the selected avatar isn&#039;t a friend who gave map location permission, it works anyway by placing a beacon on the avatar&#039;s last known position. This of course only works so long the avatar being tracked is near enough to be seen by the user.&lt;br /&gt;
&lt;br /&gt;
* Automatically retrieves the birth date, account type and payment data for all users shown. The data is of course cached, and if this is too much of an extra load, I&#039;ll implement a permanent on-disk cache. If data doesn&#039;t arrive, it will retry with an exponential backoff (starting from 1 minute, doubling until 30 minutes)&lt;br /&gt;
&lt;br /&gt;
* Displays activity status: new, left the area, emitting particles, moving, playing sound&lt;br /&gt;
&lt;br /&gt;
* Allows moving the camera to the avatar with a double click, as well as cycling the camera between all or only the marked avatars&lt;br /&gt;
&lt;br /&gt;
* Partial TrustNet integration: retrieves scores, but can&#039;t rate yet&lt;br /&gt;
&lt;br /&gt;
What is not done yet, but will be:&lt;br /&gt;
&lt;br /&gt;
* Integration with my TrustNet system. See here for details:&lt;br /&gt;
http://daleglass.net/tikiwiki/tiki-index.php?page=TrustNetAvatarScanner&lt;br /&gt;
http://daleglass.net/tikiwiki/tiki-index.php?page=HowTrustNetWorks&lt;br /&gt;
&lt;br /&gt;
* Integration with resident-run databases. For example, I&#039;ve been asked whether I could make it automatically query a website with a database of buyers to be able to tell people who are using avatars made with copybot, for instance.&lt;br /&gt;
&lt;br /&gt;
* Buttons for administrative actions such as ban/eject/freeze/etc&lt;br /&gt;
&lt;br /&gt;
* Add activity status for typing and rezzing objects&lt;br /&gt;
&lt;br /&gt;
* Also longer term, option to make the client stop rendering an avatar completely.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Beta&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/avatarscanner&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== TrustNet Integration ==&lt;br /&gt;
With the disappearance of SL ratings, I&#039;m working on a replacement based on my TrustNet system. Current status is very experimental but with some functional code.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a [http://daleglass.net/images/screenshots/trustnet_001.jpg screenshot] of what it looks like.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Alpha&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/trustnet&lt;br /&gt;
&lt;br /&gt;
== Viewer/Script Communication ==&lt;br /&gt;
This is a hack to let a script talk to the viewer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Stable&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/viewercomm&lt;br /&gt;
&lt;br /&gt;
== Keyboard Hack ==&lt;br /&gt;
This is a viewer hack to make it transmit every keypress as a message on a channel. Used to implement an in-world keyboard that shows the real keypresses while the user is typing. General usage is discouraged, as this multiplies by 20-50 times the amount of chat messages sent to the sim and LL probably wouldn&#039;t like this sort of thing to be used widely.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Stable, but needs cleaning up and improvements.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/realkeyboard&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Scripts =&lt;br /&gt;
&lt;br /&gt;
* http://daleglass.net/scripts/load_archive.pl -- Script for loading source archives into Subversion. See comments in the source for usage.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
The repository is located at [http://svn.daleglass.net/sl/ svn.daleglass.net]&lt;br /&gt;
&lt;br /&gt;
== Branches ==&lt;br /&gt;
Current branches are:&lt;br /&gt;
* &#039;&#039;&#039;buildfixes_1-18-0&#039;&#039;&#039;: 1.18.0 source, plus small compilation changes, for building with gcc4 and VC++ 2005. No functional changes here. Adds my installer.&lt;br /&gt;
* &#039;&#039;&#039;realkeyboard&#039;&#039;&#039;: Silly patch that sends each keypress on a channel. Used to create a keyboard in SL that reflects my real keypresses.&lt;br /&gt;
* &#039;&#039;&#039;viewercomm&#039;&#039;&#039;: Viewer/object communication patch&lt;br /&gt;
* &#039;&#039;&#039;avatarscanner&#039;&#039;&#039;: Avatar scanner patch&lt;br /&gt;
* &#039;&#039;&#039;trustnet&#039;&#039;&#039;: Support for my reputation system&lt;br /&gt;
* &#039;&#039;&#039;branding&#039;&#039;&#039;: Branding changes: Different menu bar color, send crash reports to daleglass.net&lt;br /&gt;
* &#039;&#039;&#039;release&#039;&#039;&#039;: Merge of various branches. This is where my installers are made from.&lt;br /&gt;
* &#039;&#039;&#039;trunk&#039;&#039;&#039;: Currently unused&lt;br /&gt;
&lt;br /&gt;
== How to get a patch ==&lt;br /&gt;
People sometimes ask me if I have patches. Currently I don&#039;t make them, because you can easily create an up to date one. Here&#039;s how:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ svn diff http://svn.daleglass.net/sl/branches/buildfixes_1-18-0 http://svn.daleglass.net/sl/branches/&amp;lt;branch&amp;gt; &amp;gt; patch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example, to get a patch with my avatar scanner:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ svn diff http://svn.daleglass.net/sl/branches/buildfixes_1-18-0 http://svn.daleglass.net/sl/branches/avatarscanner &amp;gt; avatar-scanner.patch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create a patch with the difference between my &#039;&#039;&#039;buildfixes&#039;&#039;&#039; branch and another. This should apply cleanly to pristine sources.&lt;br /&gt;
&lt;br /&gt;
== Branch Graph ==&lt;br /&gt;
Some branches are fed changes from others. This graph shows the hierarchy.&lt;br /&gt;
&lt;br /&gt;
[[Image:Daleglass branch graph.png]]&lt;br /&gt;
&lt;br /&gt;
= Installer =&lt;br /&gt;
My &#039;&#039;&#039;release&#039;&#039;&#039; branch (see above) is periodically packaged into an installer. If you get this, have in mind this is completely unofficial and unsupported by Linden Lab. Don&#039;t report bugs you find in it to LL.&lt;br /&gt;
&lt;br /&gt;
This version will try to send crash reports to me, and not to LL. Updates will be downloaded from my server as well.&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
The latest installer can be found at [http://daleglass.net/installer/setup_latest.exe daleglass.net]&lt;br /&gt;
&lt;br /&gt;
There&#039;s no autoupdate mechanism yet.&lt;br /&gt;
&lt;br /&gt;
== Linux ==&lt;br /&gt;
I don&#039;t create Linux packages yet. You&#039;ll have to get the source from SVN and [[Compiling_the_viewer_(Linux) | build it]]&lt;br /&gt;
&lt;br /&gt;
I may start making packages if there is demand.&lt;br /&gt;
&lt;br /&gt;
== FreeBSD ==&lt;br /&gt;
I don&#039;t currently use BSD, so you&#039;ll have to get the source from SVN and [[Compiling_the_viewer_(FreeBSD) | build it]]&lt;br /&gt;
&lt;br /&gt;
== OS X ==&lt;br /&gt;
I don&#039;t have any Mac hardware, so I can&#039;t create packages for it. I&#039;m not currently planning to buy any either.&lt;br /&gt;
&lt;br /&gt;
This means that Mac users will have to [[Compiling_the_viewer_(Mac_OS_X) | build it from source]], or get somebody to integrate my changes and create a package for them.&lt;br /&gt;
&lt;br /&gt;
Despite this, anybody using it on a Mac is welcome to submit bug reports. If it&#039;s a Mac specific problem, I will appreciate information on how to fix it. The bug reporter will be expected to test the results for me, since I can&#039;t.&lt;br /&gt;
&lt;br /&gt;
= Etc =&lt;br /&gt;
{{Jira Reporter}}&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Dale_Glass&amp;diff=25517</id>
		<title>User:Dale Glass</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Dale_Glass&amp;diff=25517"/>
		<updated>2007-07-15T01:10:15Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: /* Installer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Evil Scripter and RL programmer.&lt;br /&gt;
&lt;br /&gt;
Currently working on adding an avatar scanner to the SL client.&lt;br /&gt;
&lt;br /&gt;
= Projects =&lt;br /&gt;
== Avatar Scanner ==&lt;br /&gt;
http://daleglass.net/images/screenshots/avlist6_001.jpg&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Shows a list of all avatars known to the client. This can be easily more than a standard 96m scanner, and seems to depend on rendering distance.&lt;br /&gt;
&lt;br /&gt;
* Keeps an internal list of avatars, and continues showing avatars that disappeared in the list for several seconds to give people time to perform some action on them (intended to make it easier to deal with griefers that do something nasty, then teleport out)&lt;br /&gt;
&lt;br /&gt;
* Shows Linden accounts in bold. This will be expanded later to highlight people who are very new, don&#039;t have a credit card on file, etc depending on user configuration.&lt;br /&gt;
&lt;br /&gt;
* Allows easy access to IM, profiles, etc&lt;br /&gt;
&lt;br /&gt;
* Allows to start a conference to multiple avatars around you, the same way it works in the friends list.&lt;br /&gt;
&lt;br /&gt;
* Allows tracking an avatar by placing a beacon on it. In the case the selected avatar isn&#039;t a friend who gave map location permission, it works anyway by placing a beacon on the avatar&#039;s last known position. This of course only works so long the avatar being tracked is near enough to be seen by the user.&lt;br /&gt;
&lt;br /&gt;
* Automatically retrieves the birth date, account type and payment data for all users shown. The data is of course cached, and if this is too much of an extra load, I&#039;ll implement a permanent on-disk cache. If data doesn&#039;t arrive, it will retry with an exponential backoff (starting from 1 minute, doubling until 30 minutes)&lt;br /&gt;
&lt;br /&gt;
* Displays activity status: new, left the area, emitting particles, moving, playing sound&lt;br /&gt;
&lt;br /&gt;
* Allows moving the camera to the avatar with a double click, as well as cycling the camera between all or only the marked avatars&lt;br /&gt;
&lt;br /&gt;
* Partial TrustNet integration: retrieves scores, but can&#039;t rate yet&lt;br /&gt;
&lt;br /&gt;
What is not done yet, but will be:&lt;br /&gt;
&lt;br /&gt;
* Integration with my TrustNet system. See here for details:&lt;br /&gt;
http://daleglass.net/tikiwiki/tiki-index.php?page=TrustNetAvatarScanner&lt;br /&gt;
http://daleglass.net/tikiwiki/tiki-index.php?page=HowTrustNetWorks&lt;br /&gt;
&lt;br /&gt;
* Integration with resident-run databases. For example, I&#039;ve been asked whether I could make it automatically query a website with a database of buyers to be able to tell people who are using avatars made with copybot, for instance.&lt;br /&gt;
&lt;br /&gt;
* Buttons for administrative actions such as ban/eject/freeze/etc&lt;br /&gt;
&lt;br /&gt;
* Add activity status for typing and rezzing objects&lt;br /&gt;
&lt;br /&gt;
* Also longer term, option to make the client stop rendering an avatar completely.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Beta&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/avatarscanner&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== TrustNet Integration ==&lt;br /&gt;
With the disappearance of SL ratings, I&#039;m working on a replacement based on my TrustNet system. Current status is very experimental but with some functional code.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a [http://daleglass.net/images/screenshots/trustnet_001.jpg screenshot] of what it looks like.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Alpha&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/trustnet&lt;br /&gt;
&lt;br /&gt;
== Viewer/Script Communication ==&lt;br /&gt;
This is a hack to let a script talk to the viewer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Stable&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/viewercomm&lt;br /&gt;
&lt;br /&gt;
== Keyboard Hack ==&lt;br /&gt;
This is a viewer hack to make it transmit every keypress as a message on a channel. Used to implement an in-world keyboard that shows the real keypresses while the user is typing. General usage is discouraged, as this multiplies by 20-50 times the amount of chat messages sent to the sim and LL probably wouldn&#039;t like this sort of thing to be used widely.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Stable, but needs cleaning up and improvements.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/realkeyboard&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Scripts =&lt;br /&gt;
&lt;br /&gt;
* http://daleglass.net/scripts/load_archive.pl -- Script for loading source archives into Subversion. See comments in the source for usage.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
The repository is located at [http://svn.daleglass.net/sl/ svn.daleglass.net]&lt;br /&gt;
&lt;br /&gt;
== Branches ==&lt;br /&gt;
Current branches are:&lt;br /&gt;
* &#039;&#039;&#039;buildfixes_1-18-0&#039;&#039;&#039;: 1.18.0 source, plus small compilation changes, for building with gcc4 and VC++ 2005. No functional changes here. Adds my installer.&lt;br /&gt;
* &#039;&#039;&#039;realkeyboard&#039;&#039;&#039;: Silly patch that sends each keypress on a channel. Used to create a keyboard in SL that reflects my real keypresses.&lt;br /&gt;
* &#039;&#039;&#039;viewercomm&#039;&#039;&#039;: Viewer/object communication patch&lt;br /&gt;
* &#039;&#039;&#039;avatarscanner&#039;&#039;&#039;: Avatar scanner patch&lt;br /&gt;
* &#039;&#039;&#039;trustnet&#039;&#039;&#039;: Support for my reputation system&lt;br /&gt;
* &#039;&#039;&#039;branding&#039;&#039;&#039;: Branding changes: Different menu bar color, send crash reports to daleglass.net&lt;br /&gt;
* &#039;&#039;&#039;release&#039;&#039;&#039;: Merge of various branches. This is where my installers are made from.&lt;br /&gt;
* &#039;&#039;&#039;trunk&#039;&#039;&#039;: Currently unused&lt;br /&gt;
&lt;br /&gt;
== How to get a patch ==&lt;br /&gt;
People sometimes ask me if I have patches. Currently I don&#039;t make them, because you can easily create an up to date one. Here&#039;s how:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ svn diff http://svn.daleglass.net/sl/branches/buildfixes_1-18-0 http://svn.daleglass.net/sl/branches/&amp;lt;branch&amp;gt; &amp;gt; patch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example, to get a patch with my avatar scanner:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ svn diff http://svn.daleglass.net/sl/branches/buildfixes_1-18-0 http://svn.daleglass.net/sl/branches/avatarscanner &amp;gt; avatar-scanner.patch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create a patch with the difference between my &#039;&#039;&#039;buildfixes&#039;&#039;&#039; branch and another. This should apply cleanly to pristine sources.&lt;br /&gt;
&lt;br /&gt;
== Branch Graph ==&lt;br /&gt;
Some branches are fed changes from others. This graph shows the hierarchy.&lt;br /&gt;
&lt;br /&gt;
[[Image:Daleglass branch graph.png]]&lt;br /&gt;
&lt;br /&gt;
= Installer =&lt;br /&gt;
My &#039;&#039;&#039;release&#039;&#039;&#039; branch (see above) is periodically packaged into an installer. If you get this, have in mind this is completely unofficial and unsupported by Linden Lab. Don&#039;t report bugs you find in it to LL.&lt;br /&gt;
&lt;br /&gt;
This version will try to send crash reports to me, and not to LL. Updates will be downloaded from my server as well.&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
The latest installer can be found at [http://daleglass.net/installer/setup_latest.exe daleglass.net]&lt;br /&gt;
&lt;br /&gt;
There&#039;s no autoupdate mechanism yet.&lt;br /&gt;
&lt;br /&gt;
== Linux ==&lt;br /&gt;
I don&#039;t create Linux packages yet. You&#039;ll have to get the source from SVN and [[http://wiki.secondlife.com/wiki/Compiling_the_viewer_(Linux) | build it]]&lt;br /&gt;
&lt;br /&gt;
I may start making packages if there is demand.&lt;br /&gt;
&lt;br /&gt;
== FreeBSD ==&lt;br /&gt;
I don&#039;t currently use BSD, so you&#039;ll have to get the source from SVN and [[Compiling_the_viewer_(FreeBSD) | build it]]&lt;br /&gt;
&lt;br /&gt;
== OS X ==&lt;br /&gt;
I don&#039;t have any Mac hardware, so I can&#039;t create packages for it. I&#039;m not currently planning to buy any either.&lt;br /&gt;
&lt;br /&gt;
This means that Mac users will have to [[Compiling_the_viewer_(Mac_OS_X) | build it from source]], or get somebody to integrate my changes and create a package for them.&lt;br /&gt;
&lt;br /&gt;
Despite this, anybody using it on a Mac is welcome to submit bug reports. If it&#039;s a Mac specific problem, I will appreciate information on how to fix it. The bug reporter will be expected to test the results for me, since I can&#039;t.&lt;br /&gt;
&lt;br /&gt;
= Etc =&lt;br /&gt;
{{Jira Reporter}}&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Dale_Glass&amp;diff=25516</id>
		<title>User:Dale Glass</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Dale_Glass&amp;diff=25516"/>
		<updated>2007-07-15T00:57:46Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Evil Scripter and RL programmer.&lt;br /&gt;
&lt;br /&gt;
Currently working on adding an avatar scanner to the SL client.&lt;br /&gt;
&lt;br /&gt;
= Projects =&lt;br /&gt;
== Avatar Scanner ==&lt;br /&gt;
http://daleglass.net/images/screenshots/avlist6_001.jpg&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Shows a list of all avatars known to the client. This can be easily more than a standard 96m scanner, and seems to depend on rendering distance.&lt;br /&gt;
&lt;br /&gt;
* Keeps an internal list of avatars, and continues showing avatars that disappeared in the list for several seconds to give people time to perform some action on them (intended to make it easier to deal with griefers that do something nasty, then teleport out)&lt;br /&gt;
&lt;br /&gt;
* Shows Linden accounts in bold. This will be expanded later to highlight people who are very new, don&#039;t have a credit card on file, etc depending on user configuration.&lt;br /&gt;
&lt;br /&gt;
* Allows easy access to IM, profiles, etc&lt;br /&gt;
&lt;br /&gt;
* Allows to start a conference to multiple avatars around you, the same way it works in the friends list.&lt;br /&gt;
&lt;br /&gt;
* Allows tracking an avatar by placing a beacon on it. In the case the selected avatar isn&#039;t a friend who gave map location permission, it works anyway by placing a beacon on the avatar&#039;s last known position. This of course only works so long the avatar being tracked is near enough to be seen by the user.&lt;br /&gt;
&lt;br /&gt;
* Automatically retrieves the birth date, account type and payment data for all users shown. The data is of course cached, and if this is too much of an extra load, I&#039;ll implement a permanent on-disk cache. If data doesn&#039;t arrive, it will retry with an exponential backoff (starting from 1 minute, doubling until 30 minutes)&lt;br /&gt;
&lt;br /&gt;
* Displays activity status: new, left the area, emitting particles, moving, playing sound&lt;br /&gt;
&lt;br /&gt;
* Allows moving the camera to the avatar with a double click, as well as cycling the camera between all or only the marked avatars&lt;br /&gt;
&lt;br /&gt;
* Partial TrustNet integration: retrieves scores, but can&#039;t rate yet&lt;br /&gt;
&lt;br /&gt;
What is not done yet, but will be:&lt;br /&gt;
&lt;br /&gt;
* Integration with my TrustNet system. See here for details:&lt;br /&gt;
http://daleglass.net/tikiwiki/tiki-index.php?page=TrustNetAvatarScanner&lt;br /&gt;
http://daleglass.net/tikiwiki/tiki-index.php?page=HowTrustNetWorks&lt;br /&gt;
&lt;br /&gt;
* Integration with resident-run databases. For example, I&#039;ve been asked whether I could make it automatically query a website with a database of buyers to be able to tell people who are using avatars made with copybot, for instance.&lt;br /&gt;
&lt;br /&gt;
* Buttons for administrative actions such as ban/eject/freeze/etc&lt;br /&gt;
&lt;br /&gt;
* Add activity status for typing and rezzing objects&lt;br /&gt;
&lt;br /&gt;
* Also longer term, option to make the client stop rendering an avatar completely.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Beta&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/avatarscanner&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== TrustNet Integration ==&lt;br /&gt;
With the disappearance of SL ratings, I&#039;m working on a replacement based on my TrustNet system. Current status is very experimental but with some functional code.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a [http://daleglass.net/images/screenshots/trustnet_001.jpg screenshot] of what it looks like.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Alpha&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/trustnet&lt;br /&gt;
&lt;br /&gt;
== Viewer/Script Communication ==&lt;br /&gt;
This is a hack to let a script talk to the viewer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Stable&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/viewercomm&lt;br /&gt;
&lt;br /&gt;
== Keyboard Hack ==&lt;br /&gt;
This is a viewer hack to make it transmit every keypress as a message on a channel. Used to implement an in-world keyboard that shows the real keypresses while the user is typing. General usage is discouraged, as this multiplies by 20-50 times the amount of chat messages sent to the sim and LL probably wouldn&#039;t like this sort of thing to be used widely.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Stable, but needs cleaning up and improvements.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/realkeyboard&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Scripts =&lt;br /&gt;
&lt;br /&gt;
* http://daleglass.net/scripts/load_archive.pl -- Script for loading source archives into Subversion. See comments in the source for usage.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
The repository is located at [http://svn.daleglass.net/sl/ svn.daleglass.net]&lt;br /&gt;
&lt;br /&gt;
== Branches ==&lt;br /&gt;
Current branches are:&lt;br /&gt;
* &#039;&#039;&#039;buildfixes_1-18-0&#039;&#039;&#039;: 1.18.0 source, plus small compilation changes, for building with gcc4 and VC++ 2005. No functional changes here. Adds my installer.&lt;br /&gt;
* &#039;&#039;&#039;realkeyboard&#039;&#039;&#039;: Silly patch that sends each keypress on a channel. Used to create a keyboard in SL that reflects my real keypresses.&lt;br /&gt;
* &#039;&#039;&#039;viewercomm&#039;&#039;&#039;: Viewer/object communication patch&lt;br /&gt;
* &#039;&#039;&#039;avatarscanner&#039;&#039;&#039;: Avatar scanner patch&lt;br /&gt;
* &#039;&#039;&#039;trustnet&#039;&#039;&#039;: Support for my reputation system&lt;br /&gt;
* &#039;&#039;&#039;branding&#039;&#039;&#039;: Branding changes: Different menu bar color, send crash reports to daleglass.net&lt;br /&gt;
* &#039;&#039;&#039;release&#039;&#039;&#039;: Merge of various branches. This is where my installers are made from.&lt;br /&gt;
* &#039;&#039;&#039;trunk&#039;&#039;&#039;: Currently unused&lt;br /&gt;
&lt;br /&gt;
== How to get a patch ==&lt;br /&gt;
People sometimes ask me if I have patches. Currently I don&#039;t make them, because you can easily create an up to date one. Here&#039;s how:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ svn diff http://svn.daleglass.net/sl/branches/buildfixes_1-18-0 http://svn.daleglass.net/sl/branches/&amp;lt;branch&amp;gt; &amp;gt; patch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example, to get a patch with my avatar scanner:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ svn diff http://svn.daleglass.net/sl/branches/buildfixes_1-18-0 http://svn.daleglass.net/sl/branches/avatarscanner &amp;gt; avatar-scanner.patch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create a patch with the difference between my &#039;&#039;&#039;buildfixes&#039;&#039;&#039; branch and another. This should apply cleanly to pristine sources.&lt;br /&gt;
&lt;br /&gt;
== Branch Graph ==&lt;br /&gt;
Some branches are fed changes from others. This graph shows the hierarchy.&lt;br /&gt;
&lt;br /&gt;
[[Image:Daleglass branch graph.png]]&lt;br /&gt;
&lt;br /&gt;
= Installer =&lt;br /&gt;
= Etc =&lt;br /&gt;
{{Jira Reporter}}&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Dale_Glass&amp;diff=25515</id>
		<title>User:Dale Glass</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Dale_Glass&amp;diff=25515"/>
		<updated>2007-07-15T00:57:19Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: creating section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Evil Scripter and RL programmer.&lt;br /&gt;
&lt;br /&gt;
Currently working on adding an avatar scanner to the SL client.&lt;br /&gt;
&lt;br /&gt;
= Projects =&lt;br /&gt;
== Avatar Scanner ==&lt;br /&gt;
http://daleglass.net/images/screenshots/avlist6_001.jpg&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Shows a list of all avatars known to the client. This can be easily more than a standard 96m scanner, and seems to depend on rendering distance.&lt;br /&gt;
&lt;br /&gt;
* Keeps an internal list of avatars, and continues showing avatars that disappeared in the list for several seconds to give people time to perform some action on them (intended to make it easier to deal with griefers that do something nasty, then teleport out)&lt;br /&gt;
&lt;br /&gt;
* Shows Linden accounts in bold. This will be expanded later to highlight people who are very new, don&#039;t have a credit card on file, etc depending on user configuration.&lt;br /&gt;
&lt;br /&gt;
* Allows easy access to IM, profiles, etc&lt;br /&gt;
&lt;br /&gt;
* Allows to start a conference to multiple avatars around you, the same way it works in the friends list.&lt;br /&gt;
&lt;br /&gt;
* Allows tracking an avatar by placing a beacon on it. In the case the selected avatar isn&#039;t a friend who gave map location permission, it works anyway by placing a beacon on the avatar&#039;s last known position. This of course only works so long the avatar being tracked is near enough to be seen by the user.&lt;br /&gt;
&lt;br /&gt;
* Automatically retrieves the birth date, account type and payment data for all users shown. The data is of course cached, and if this is too much of an extra load, I&#039;ll implement a permanent on-disk cache. If data doesn&#039;t arrive, it will retry with an exponential backoff (starting from 1 minute, doubling until 30 minutes)&lt;br /&gt;
&lt;br /&gt;
* Displays activity status: new, left the area, emitting particles, moving, playing sound&lt;br /&gt;
&lt;br /&gt;
* Allows moving the camera to the avatar with a double click, as well as cycling the camera between all or only the marked avatars&lt;br /&gt;
&lt;br /&gt;
* Partial TrustNet integration: retrieves scores, but can&#039;t rate yet&lt;br /&gt;
&lt;br /&gt;
What is not done yet, but will be:&lt;br /&gt;
&lt;br /&gt;
* Integration with my TrustNet system. See here for details:&lt;br /&gt;
http://daleglass.net/tikiwiki/tiki-index.php?page=TrustNetAvatarScanner&lt;br /&gt;
http://daleglass.net/tikiwiki/tiki-index.php?page=HowTrustNetWorks&lt;br /&gt;
&lt;br /&gt;
* Integration with resident-run databases. For example, I&#039;ve been asked whether I could make it automatically query a website with a database of buyers to be able to tell people who are using avatars made with copybot, for instance.&lt;br /&gt;
&lt;br /&gt;
* Buttons for administrative actions such as ban/eject/freeze/etc&lt;br /&gt;
&lt;br /&gt;
* Add activity status for typing and rezzing objects&lt;br /&gt;
&lt;br /&gt;
* Also longer term, option to make the client stop rendering an avatar completely.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Beta&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/avatarscanner&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== TrustNet Integration ==&lt;br /&gt;
With the disappearance of SL ratings, I&#039;m working on a replacement based on my TrustNet system. Current status is very experimental but with some functional code.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a [http://daleglass.net/images/screenshots/trustnet_001.jpg screenshot] of what it looks like.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Alpha&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/trustnet&lt;br /&gt;
&lt;br /&gt;
== Viewer/Script Communication ==&lt;br /&gt;
This is a hack to let a script talk to the viewer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Stable&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/viewercomm&lt;br /&gt;
&lt;br /&gt;
== Keyboard Hack ==&lt;br /&gt;
This is a viewer hack to make it transmit every keypress as a message on a channel. Used to implement an in-world keyboard that shows the real keypresses while the user is typing. General usage is discouraged, as this multiplies by 20-50 times the amount of chat messages sent to the sim and LL probably wouldn&#039;t like this sort of thing to be used widely.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Stable, but needs cleaning up and improvements.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/realkeyboard&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Scripts =&lt;br /&gt;
&lt;br /&gt;
* http://daleglass.net/scripts/load_archive.pl -- Script for loading source archives into Subversion. See comments in the source for usage.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
The repository is located at [http://svn.daleglass.net/sl/ svn.daleglass.net]&lt;br /&gt;
&lt;br /&gt;
== Branches ==&lt;br /&gt;
Current branches are:&lt;br /&gt;
* &#039;&#039;&#039;buildfixes_1-18-0&#039;&#039;&#039;: 1.18.0 source, plus small compilation changes, for building with gcc4 and VC++ 2005. No functional changes here. Adds my installer.&lt;br /&gt;
* &#039;&#039;&#039;realkeyboard&#039;&#039;&#039;: Silly patch that sends each keypress on a channel. Used to create a keyboard in SL that reflects my real keypresses.&lt;br /&gt;
* &#039;&#039;&#039;viewercomm&#039;&#039;&#039;: Viewer/object communication patch&lt;br /&gt;
* &#039;&#039;&#039;avatarscanner&#039;&#039;&#039;: Avatar scanner patch&lt;br /&gt;
* &#039;&#039;&#039;trustnet&#039;&#039;&#039;: Support for my reputation system&lt;br /&gt;
* &#039;&#039;&#039;branding&#039;&#039;&#039;: Branding changes: Different menu bar color, send crash reports to daleglass.net&lt;br /&gt;
* &#039;&#039;&#039;release&#039;&#039;&#039;: Merge of various branches. This is where my installers are made from.&lt;br /&gt;
* &#039;&#039;&#039;trunk&#039;&#039;&#039;: Currently unused&lt;br /&gt;
&lt;br /&gt;
== How to get a patch ==&lt;br /&gt;
People sometimes ask me if I have patches. Currently I don&#039;t make them, because you can easily create an up to date one. Here&#039;s how:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ svn diff http://svn.daleglass.net/sl/branches/buildfixes_1-18-0 http://svn.daleglass.net/sl/branches/&amp;lt;branch&amp;gt; &amp;gt; patch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example, to get a patch with my avatar scanner:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ svn diff http://svn.daleglass.net/sl/branches/buildfixes_1-18-0 http://svn.daleglass.net/sl/branches/avatarscanner &amp;gt; avatar-scanner.patch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create a patch with the difference between my &#039;&#039;&#039;buildfixes&#039;&#039;&#039; branch and another. This should apply cleanly to pristine sources.&lt;br /&gt;
&lt;br /&gt;
== Branch Graph ==&lt;br /&gt;
Some branches are fed changes from others. This graph shows the hierarchy.&lt;br /&gt;
&lt;br /&gt;
[[Image:Daleglass branch graph.png]]&lt;br /&gt;
&lt;br /&gt;
== Installer ==&lt;br /&gt;
= Etc =&lt;br /&gt;
{{Jira Reporter}}&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Dale_Glass&amp;diff=25514</id>
		<title>User:Dale Glass</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Dale_Glass&amp;diff=25514"/>
		<updated>2007-07-15T00:56:15Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: /* Subversion Repository */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Evil Scripter and RL programmer.&lt;br /&gt;
&lt;br /&gt;
Currently working on adding an avatar scanner to the SL client.&lt;br /&gt;
&lt;br /&gt;
= Projects =&lt;br /&gt;
== Avatar Scanner ==&lt;br /&gt;
http://daleglass.net/images/screenshots/avlist6_001.jpg&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Shows a list of all avatars known to the client. This can be easily more than a standard 96m scanner, and seems to depend on rendering distance.&lt;br /&gt;
&lt;br /&gt;
* Keeps an internal list of avatars, and continues showing avatars that disappeared in the list for several seconds to give people time to perform some action on them (intended to make it easier to deal with griefers that do something nasty, then teleport out)&lt;br /&gt;
&lt;br /&gt;
* Shows Linden accounts in bold. This will be expanded later to highlight people who are very new, don&#039;t have a credit card on file, etc depending on user configuration.&lt;br /&gt;
&lt;br /&gt;
* Allows easy access to IM, profiles, etc&lt;br /&gt;
&lt;br /&gt;
* Allows to start a conference to multiple avatars around you, the same way it works in the friends list.&lt;br /&gt;
&lt;br /&gt;
* Allows tracking an avatar by placing a beacon on it. In the case the selected avatar isn&#039;t a friend who gave map location permission, it works anyway by placing a beacon on the avatar&#039;s last known position. This of course only works so long the avatar being tracked is near enough to be seen by the user.&lt;br /&gt;
&lt;br /&gt;
* Automatically retrieves the birth date, account type and payment data for all users shown. The data is of course cached, and if this is too much of an extra load, I&#039;ll implement a permanent on-disk cache. If data doesn&#039;t arrive, it will retry with an exponential backoff (starting from 1 minute, doubling until 30 minutes)&lt;br /&gt;
&lt;br /&gt;
* Displays activity status: new, left the area, emitting particles, moving, playing sound&lt;br /&gt;
&lt;br /&gt;
* Allows moving the camera to the avatar with a double click, as well as cycling the camera between all or only the marked avatars&lt;br /&gt;
&lt;br /&gt;
* Partial TrustNet integration: retrieves scores, but can&#039;t rate yet&lt;br /&gt;
&lt;br /&gt;
What is not done yet, but will be:&lt;br /&gt;
&lt;br /&gt;
* Integration with my TrustNet system. See here for details:&lt;br /&gt;
http://daleglass.net/tikiwiki/tiki-index.php?page=TrustNetAvatarScanner&lt;br /&gt;
http://daleglass.net/tikiwiki/tiki-index.php?page=HowTrustNetWorks&lt;br /&gt;
&lt;br /&gt;
* Integration with resident-run databases. For example, I&#039;ve been asked whether I could make it automatically query a website with a database of buyers to be able to tell people who are using avatars made with copybot, for instance.&lt;br /&gt;
&lt;br /&gt;
* Buttons for administrative actions such as ban/eject/freeze/etc&lt;br /&gt;
&lt;br /&gt;
* Add activity status for typing and rezzing objects&lt;br /&gt;
&lt;br /&gt;
* Also longer term, option to make the client stop rendering an avatar completely.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Beta&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/avatarscanner&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== TrustNet Integration ==&lt;br /&gt;
With the disappearance of SL ratings, I&#039;m working on a replacement based on my TrustNet system. Current status is very experimental but with some functional code.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a [http://daleglass.net/images/screenshots/trustnet_001.jpg screenshot] of what it looks like.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Alpha&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/trustnet&lt;br /&gt;
&lt;br /&gt;
== Viewer/Script Communication ==&lt;br /&gt;
This is a hack to let a script talk to the viewer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Stable&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/viewercomm&lt;br /&gt;
&lt;br /&gt;
== Keyboard Hack ==&lt;br /&gt;
This is a viewer hack to make it transmit every keypress as a message on a channel. Used to implement an in-world keyboard that shows the real keypresses while the user is typing. General usage is discouraged, as this multiplies by 20-50 times the amount of chat messages sent to the sim and LL probably wouldn&#039;t like this sort of thing to be used widely.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Stable, but needs cleaning up and improvements.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/realkeyboard&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Scripts =&lt;br /&gt;
&lt;br /&gt;
* http://daleglass.net/scripts/load_archive.pl -- Script for loading source archives into Subversion. See comments in the source for usage.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
The repository is located at [http://svn.daleglass.net/sl/ svn.daleglass.net]&lt;br /&gt;
&lt;br /&gt;
== Branches ==&lt;br /&gt;
Current branches are:&lt;br /&gt;
* &#039;&#039;&#039;buildfixes_1-18-0&#039;&#039;&#039;: 1.18.0 source, plus small compilation changes, for building with gcc4 and VC++ 2005. No functional changes here. Adds my installer.&lt;br /&gt;
* &#039;&#039;&#039;realkeyboard&#039;&#039;&#039;: Silly patch that sends each keypress on a channel. Used to create a keyboard in SL that reflects my real keypresses.&lt;br /&gt;
* &#039;&#039;&#039;viewercomm&#039;&#039;&#039;: Viewer/object communication patch&lt;br /&gt;
* &#039;&#039;&#039;avatarscanner&#039;&#039;&#039;: Avatar scanner patch&lt;br /&gt;
* &#039;&#039;&#039;trustnet&#039;&#039;&#039;: Support for my reputation system&lt;br /&gt;
* &#039;&#039;&#039;branding&#039;&#039;&#039;: Branding changes: Different menu bar color, send crash reports to daleglass.net&lt;br /&gt;
* &#039;&#039;&#039;release&#039;&#039;&#039;: Merge of various branches. This is where my installers are made from.&lt;br /&gt;
* &#039;&#039;&#039;trunk&#039;&#039;&#039;: Currently unused&lt;br /&gt;
&lt;br /&gt;
== How to get a patch ==&lt;br /&gt;
People sometimes ask me if I have patches. Currently I don&#039;t make them, because you can easily create an up to date one. Here&#039;s how:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ svn diff http://svn.daleglass.net/sl/branches/buildfixes_1-18-0 http://svn.daleglass.net/sl/branches/&amp;lt;branch&amp;gt; &amp;gt; patch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example, to get a patch with my avatar scanner:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ svn diff http://svn.daleglass.net/sl/branches/buildfixes_1-18-0 http://svn.daleglass.net/sl/branches/avatarscanner &amp;gt; avatar-scanner.patch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create a patch with the difference between my &#039;&#039;&#039;buildfixes&#039;&#039;&#039; branch and another. This should apply cleanly to pristine sources.&lt;br /&gt;
&lt;br /&gt;
== Branch Graph ==&lt;br /&gt;
Some branches are fed changes from others. This graph shows the hierarchy.&lt;br /&gt;
&lt;br /&gt;
[[Image:Daleglass branch graph.png]]&lt;br /&gt;
&lt;br /&gt;
= Etc =&lt;br /&gt;
{{Jira Reporter}}&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Dale_Glass&amp;diff=25511</id>
		<title>User:Dale Glass</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Dale_Glass&amp;diff=25511"/>
		<updated>2007-07-15T00:45:05Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: /* Subversion Repository */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Evil Scripter and RL programmer.&lt;br /&gt;
&lt;br /&gt;
Currently working on adding an avatar scanner to the SL client.&lt;br /&gt;
&lt;br /&gt;
= Projects =&lt;br /&gt;
== Avatar Scanner ==&lt;br /&gt;
http://daleglass.net/images/screenshots/avlist6_001.jpg&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Shows a list of all avatars known to the client. This can be easily more than a standard 96m scanner, and seems to depend on rendering distance.&lt;br /&gt;
&lt;br /&gt;
* Keeps an internal list of avatars, and continues showing avatars that disappeared in the list for several seconds to give people time to perform some action on them (intended to make it easier to deal with griefers that do something nasty, then teleport out)&lt;br /&gt;
&lt;br /&gt;
* Shows Linden accounts in bold. This will be expanded later to highlight people who are very new, don&#039;t have a credit card on file, etc depending on user configuration.&lt;br /&gt;
&lt;br /&gt;
* Allows easy access to IM, profiles, etc&lt;br /&gt;
&lt;br /&gt;
* Allows to start a conference to multiple avatars around you, the same way it works in the friends list.&lt;br /&gt;
&lt;br /&gt;
* Allows tracking an avatar by placing a beacon on it. In the case the selected avatar isn&#039;t a friend who gave map location permission, it works anyway by placing a beacon on the avatar&#039;s last known position. This of course only works so long the avatar being tracked is near enough to be seen by the user.&lt;br /&gt;
&lt;br /&gt;
* Automatically retrieves the birth date, account type and payment data for all users shown. The data is of course cached, and if this is too much of an extra load, I&#039;ll implement a permanent on-disk cache. If data doesn&#039;t arrive, it will retry with an exponential backoff (starting from 1 minute, doubling until 30 minutes)&lt;br /&gt;
&lt;br /&gt;
* Displays activity status: new, left the area, emitting particles, moving, playing sound&lt;br /&gt;
&lt;br /&gt;
* Allows moving the camera to the avatar with a double click, as well as cycling the camera between all or only the marked avatars&lt;br /&gt;
&lt;br /&gt;
* Partial TrustNet integration: retrieves scores, but can&#039;t rate yet&lt;br /&gt;
&lt;br /&gt;
What is not done yet, but will be:&lt;br /&gt;
&lt;br /&gt;
* Integration with my TrustNet system. See here for details:&lt;br /&gt;
http://daleglass.net/tikiwiki/tiki-index.php?page=TrustNetAvatarScanner&lt;br /&gt;
http://daleglass.net/tikiwiki/tiki-index.php?page=HowTrustNetWorks&lt;br /&gt;
&lt;br /&gt;
* Integration with resident-run databases. For example, I&#039;ve been asked whether I could make it automatically query a website with a database of buyers to be able to tell people who are using avatars made with copybot, for instance.&lt;br /&gt;
&lt;br /&gt;
* Buttons for administrative actions such as ban/eject/freeze/etc&lt;br /&gt;
&lt;br /&gt;
* Add activity status for typing and rezzing objects&lt;br /&gt;
&lt;br /&gt;
* Also longer term, option to make the client stop rendering an avatar completely.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Beta&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/avatarscanner&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== TrustNet Integration ==&lt;br /&gt;
With the disappearance of SL ratings, I&#039;m working on a replacement based on my TrustNet system. Current status is very experimental but with some functional code.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a [http://daleglass.net/images/screenshots/trustnet_001.jpg screenshot] of what it looks like.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Alpha&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/trustnet&lt;br /&gt;
&lt;br /&gt;
== Viewer/Script Communication ==&lt;br /&gt;
This is a hack to let a script talk to the viewer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Stable&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/viewercomm&lt;br /&gt;
&lt;br /&gt;
== Keyboard Hack ==&lt;br /&gt;
This is a viewer hack to make it transmit every keypress as a message on a channel. Used to implement an in-world keyboard that shows the real keypresses while the user is typing. General usage is discouraged, as this multiplies by 20-50 times the amount of chat messages sent to the sim and LL probably wouldn&#039;t like this sort of thing to be used widely.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Stable, but needs cleaning up and improvements.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/realkeyboard&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Scripts =&lt;br /&gt;
&lt;br /&gt;
* http://daleglass.net/scripts/load_archive.pl -- Script for loading source archives into Subversion. See comments in the source for usage.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
The repository is located at [http://svn.daleglass.net/sl/ svn.daleglass.net]&lt;br /&gt;
&lt;br /&gt;
Current branches are:&lt;br /&gt;
* &#039;&#039;&#039;buildfixes_1-18-0&#039;&#039;&#039;: 1.18.0 source, plus small compilation changes, for building with gcc4 and VC++ 2005. No functional changes here. Adds my installer.&lt;br /&gt;
* &#039;&#039;&#039;realkeyboard&#039;&#039;&#039;: Silly patch that sends each keypress on a channel. Used to create a keyboard in SL that reflects my real keypresses.&lt;br /&gt;
* &#039;&#039;&#039;viewercomm&#039;&#039;&#039;: Viewer/object communication patch&lt;br /&gt;
* &#039;&#039;&#039;avatarscanner&#039;&#039;&#039;: Avatar scanner patch&lt;br /&gt;
* &#039;&#039;&#039;trustnet&#039;&#039;&#039;: Support for my reputation system&lt;br /&gt;
* &#039;&#039;&#039;branding&#039;&#039;&#039;: Branding changes: Different menu bar color, send crash reports to daleglass.net&lt;br /&gt;
* &#039;&#039;&#039;release&#039;&#039;&#039;: Merge of various branches. This is where my installers are made from.&lt;br /&gt;
* &#039;&#039;&#039;trunk&#039;&#039;&#039;: Currently unused&lt;br /&gt;
&lt;br /&gt;
[[Image:Daleglass branch graph.png]]&lt;br /&gt;
&lt;br /&gt;
= Etc =&lt;br /&gt;
{{Jira Reporter}}&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Dale_Glass&amp;diff=25508</id>
		<title>User:Dale Glass</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Dale_Glass&amp;diff=25508"/>
		<updated>2007-07-15T00:39:21Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: creating section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Evil Scripter and RL programmer.&lt;br /&gt;
&lt;br /&gt;
Currently working on adding an avatar scanner to the SL client.&lt;br /&gt;
&lt;br /&gt;
= Projects =&lt;br /&gt;
== Avatar Scanner ==&lt;br /&gt;
http://daleglass.net/images/screenshots/avlist6_001.jpg&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Shows a list of all avatars known to the client. This can be easily more than a standard 96m scanner, and seems to depend on rendering distance.&lt;br /&gt;
&lt;br /&gt;
* Keeps an internal list of avatars, and continues showing avatars that disappeared in the list for several seconds to give people time to perform some action on them (intended to make it easier to deal with griefers that do something nasty, then teleport out)&lt;br /&gt;
&lt;br /&gt;
* Shows Linden accounts in bold. This will be expanded later to highlight people who are very new, don&#039;t have a credit card on file, etc depending on user configuration.&lt;br /&gt;
&lt;br /&gt;
* Allows easy access to IM, profiles, etc&lt;br /&gt;
&lt;br /&gt;
* Allows to start a conference to multiple avatars around you, the same way it works in the friends list.&lt;br /&gt;
&lt;br /&gt;
* Allows tracking an avatar by placing a beacon on it. In the case the selected avatar isn&#039;t a friend who gave map location permission, it works anyway by placing a beacon on the avatar&#039;s last known position. This of course only works so long the avatar being tracked is near enough to be seen by the user.&lt;br /&gt;
&lt;br /&gt;
* Automatically retrieves the birth date, account type and payment data for all users shown. The data is of course cached, and if this is too much of an extra load, I&#039;ll implement a permanent on-disk cache. If data doesn&#039;t arrive, it will retry with an exponential backoff (starting from 1 minute, doubling until 30 minutes)&lt;br /&gt;
&lt;br /&gt;
* Displays activity status: new, left the area, emitting particles, moving, playing sound&lt;br /&gt;
&lt;br /&gt;
* Allows moving the camera to the avatar with a double click, as well as cycling the camera between all or only the marked avatars&lt;br /&gt;
&lt;br /&gt;
* Partial TrustNet integration: retrieves scores, but can&#039;t rate yet&lt;br /&gt;
&lt;br /&gt;
What is not done yet, but will be:&lt;br /&gt;
&lt;br /&gt;
* Integration with my TrustNet system. See here for details:&lt;br /&gt;
http://daleglass.net/tikiwiki/tiki-index.php?page=TrustNetAvatarScanner&lt;br /&gt;
http://daleglass.net/tikiwiki/tiki-index.php?page=HowTrustNetWorks&lt;br /&gt;
&lt;br /&gt;
* Integration with resident-run databases. For example, I&#039;ve been asked whether I could make it automatically query a website with a database of buyers to be able to tell people who are using avatars made with copybot, for instance.&lt;br /&gt;
&lt;br /&gt;
* Buttons for administrative actions such as ban/eject/freeze/etc&lt;br /&gt;
&lt;br /&gt;
* Add activity status for typing and rezzing objects&lt;br /&gt;
&lt;br /&gt;
* Also longer term, option to make the client stop rendering an avatar completely.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Beta&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/avatarscanner&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== TrustNet Integration ==&lt;br /&gt;
With the disappearance of SL ratings, I&#039;m working on a replacement based on my TrustNet system. Current status is very experimental but with some functional code.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a [http://daleglass.net/images/screenshots/trustnet_001.jpg screenshot] of what it looks like.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Alpha&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/trustnet&lt;br /&gt;
&lt;br /&gt;
== Viewer/Script Communication ==&lt;br /&gt;
This is a hack to let a script talk to the viewer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Stable&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/viewercomm&lt;br /&gt;
&lt;br /&gt;
== Keyboard Hack ==&lt;br /&gt;
This is a viewer hack to make it transmit every keypress as a message on a channel. Used to implement an in-world keyboard that shows the real keypresses while the user is typing. General usage is discouraged, as this multiplies by 20-50 times the amount of chat messages sent to the sim and LL probably wouldn&#039;t like this sort of thing to be used widely.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Stable, but needs cleaning up and improvements.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/realkeyboard&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Scripts =&lt;br /&gt;
&lt;br /&gt;
* http://daleglass.net/scripts/load_archive.pl -- Script for loading source archives into Subversion. See comments in the source for usage.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
&lt;br /&gt;
= Etc =&lt;br /&gt;
{{Jira Reporter}}&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=File:Daleglass_branch_graph.png&amp;diff=25507</id>
		<title>File:Daleglass branch graph.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=File:Daleglass_branch_graph.png&amp;diff=25507"/>
		<updated>2007-07-15T00:38:16Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: Graph of the branches found on the [http://svn.daleglass.net/sl daleglass.net repository].&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Graph of the branches found on the [http://svn.daleglass.net/sl daleglass.net repository].&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Redistribution&amp;diff=25127</id>
		<title>Redistribution</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Redistribution&amp;diff=25127"/>
		<updated>2007-07-09T17:47:28Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: Initial version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some files in the SL installation can&#039;t be freely redistributed. This means it&#039;s not possible to simply package and offer for download a modified viewer: some files &#039;&#039;&#039;must not&#039;&#039;&#039; be redistributed. &lt;br /&gt;
&lt;br /&gt;
This page documents the licenses and redistribution requirements of various files used by the viewer.&lt;br /&gt;
&lt;br /&gt;
= Windows =&lt;br /&gt;
These are the files that need to be shipped with the Windows version&lt;br /&gt;
&lt;br /&gt;
== Runtime ==&lt;br /&gt;
Microsoft components. It&#039;s not yet know whether they&#039;re redistributable.&lt;br /&gt;
&lt;br /&gt;
* dbghelp.dll: [http://msdn2.microsoft.com/EN-US/library/ms679294.aspx Redistributable]&lt;br /&gt;
* msvcp71.dll: C Runtime Library, redistributable&lt;br /&gt;
* msvcr71.dll: C Runtime Library, [http://msdn2.microsoft.com/en-us/library/abx4dbyh(vs.71).aspx Redistributable]&lt;br /&gt;
&lt;br /&gt;
== FMOD ==&lt;br /&gt;
FMOD sound library. Free for non-commercial projects. A commercial license will be needed for a commercial viewer.&lt;br /&gt;
&lt;br /&gt;
From the README in the package:&lt;br /&gt;
 The fmod.dll file may be redistributed without the authors prior permission, &lt;br /&gt;
 and must remain unmodified.  The use of dll &#039;static linking&#039; tools that aim&lt;br /&gt;
 to hide the fmod library are forbidden.&lt;br /&gt;
&lt;br /&gt;
* fmod.dll: [http://www.fmod.org/fmodlicense.html Redistributable, free for non-commercial projects]&lt;br /&gt;
&lt;br /&gt;
== Mozilla ==&lt;br /&gt;
The Gecko engine is MPL/GPL/LGPL licensed, which makes it redistributable.&lt;br /&gt;
&lt;br /&gt;
* app_settings/mozilla&lt;br /&gt;
* freebl3.dll&lt;br /&gt;
* gksvggdiplus.dll&lt;br /&gt;
* js3250.dll&lt;br /&gt;
* nspr4.dll&lt;br /&gt;
* nss3.dll&lt;br /&gt;
* nssckbi.dll&lt;br /&gt;
* plc4.dll,&lt;br /&gt;
* plds4.dll&lt;br /&gt;
* smime3.dll&lt;br /&gt;
* softokn3.dll&lt;br /&gt;
* ssl3.dll&lt;br /&gt;
* xpcom.dll&lt;br /&gt;
* xul.dll&lt;br /&gt;
&lt;br /&gt;
== Kakadu ==&lt;br /&gt;
JPEG2000 library. &#039;&#039;&#039;Not redistributable&#039;&#039;&#039;.&lt;br /&gt;
OpenJPEG is an alternative library that is redistributable (does it work on Windows?)&lt;br /&gt;
&lt;br /&gt;
* llkdu.dll&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Dale_Glass&amp;diff=24793</id>
		<title>User:Dale Glass</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Dale_Glass&amp;diff=24793"/>
		<updated>2007-07-02T17:56:44Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: updated project list&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Evil Scripter and RL programmer.&lt;br /&gt;
&lt;br /&gt;
Currently working on adding an avatar scanner to the SL client.&lt;br /&gt;
&lt;br /&gt;
= Projects =&lt;br /&gt;
== Avatar Scanner ==&lt;br /&gt;
http://daleglass.net/images/screenshots/avlist6_001.jpg&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Shows a list of all avatars known to the client. This can be easily more than a standard 96m scanner, and seems to depend on rendering distance.&lt;br /&gt;
&lt;br /&gt;
* Keeps an internal list of avatars, and continues showing avatars that disappeared in the list for several seconds to give people time to perform some action on them (intended to make it easier to deal with griefers that do something nasty, then teleport out)&lt;br /&gt;
&lt;br /&gt;
* Shows Linden accounts in bold. This will be expanded later to highlight people who are very new, don&#039;t have a credit card on file, etc depending on user configuration.&lt;br /&gt;
&lt;br /&gt;
* Allows easy access to IM, profiles, etc&lt;br /&gt;
&lt;br /&gt;
* Allows to start a conference to multiple avatars around you, the same way it works in the friends list.&lt;br /&gt;
&lt;br /&gt;
* Allows tracking an avatar by placing a beacon on it. In the case the selected avatar isn&#039;t a friend who gave map location permission, it works anyway by placing a beacon on the avatar&#039;s last known position. This of course only works so long the avatar being tracked is near enough to be seen by the user.&lt;br /&gt;
&lt;br /&gt;
* Automatically retrieves the birth date, account type and payment data for all users shown. The data is of course cached, and if this is too much of an extra load, I&#039;ll implement a permanent on-disk cache. If data doesn&#039;t arrive, it will retry with an exponential backoff (starting from 1 minute, doubling until 30 minutes)&lt;br /&gt;
&lt;br /&gt;
* Displays activity status: new, left the area, emitting particles, moving, playing sound&lt;br /&gt;
&lt;br /&gt;
* Allows moving the camera to the avatar with a double click, as well as cycling the camera between all or only the marked avatars&lt;br /&gt;
&lt;br /&gt;
* Partial TrustNet integration: retrieves scores, but can&#039;t rate yet&lt;br /&gt;
&lt;br /&gt;
What is not done yet, but will be:&lt;br /&gt;
&lt;br /&gt;
* Integration with my TrustNet system. See here for details:&lt;br /&gt;
http://daleglass.net/tikiwiki/tiki-index.php?page=TrustNetAvatarScanner&lt;br /&gt;
http://daleglass.net/tikiwiki/tiki-index.php?page=HowTrustNetWorks&lt;br /&gt;
&lt;br /&gt;
* Integration with resident-run databases. For example, I&#039;ve been asked whether I could make it automatically query a website with a database of buyers to be able to tell people who are using avatars made with copybot, for instance.&lt;br /&gt;
&lt;br /&gt;
* Buttons for administrative actions such as ban/eject/freeze/etc&lt;br /&gt;
&lt;br /&gt;
* Add activity status for typing and rezzing objects&lt;br /&gt;
&lt;br /&gt;
* Also longer term, option to make the client stop rendering an avatar completely.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Beta&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/avatarscanner&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== TrustNet Integration ==&lt;br /&gt;
With the disappearance of SL ratings, I&#039;m working on a replacement based on my TrustNet system. Current status is very experimental but with some functional code.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a [http://daleglass.net/images/screenshots/trustnet_001.jpg screenshot] of what it looks like.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Alpha&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/trustnet&lt;br /&gt;
&lt;br /&gt;
== Viewer/Script Communication ==&lt;br /&gt;
This is a hack to let a script talk to the viewer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Stable&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/viewercomm&lt;br /&gt;
&lt;br /&gt;
== Keyboard Hack ==&lt;br /&gt;
This is a viewer hack to make it transmit every keypress as a message on a channel. Used to implement an in-world keyboard that shows the real keypresses while the user is typing. General usage is discouraged, as this multiplies by 20-50 times the amount of chat messages sent to the sim and LL probably wouldn&#039;t like this sort of thing to be used widely.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status&#039;&#039;&#039;: Stable, but needs cleaning up and improvements.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SVN Repository&#039;&#039;&#039;: http://svn.daleglass.net/sl/branches/realkeyboard&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Scripts =&lt;br /&gt;
&lt;br /&gt;
* http://daleglass.net/scripts/load_archive.pl -- Script for loading source archives into Subversion. See comments in the source for usage.&lt;br /&gt;
&lt;br /&gt;
= Etc =&lt;br /&gt;
{{Jira Reporter}}&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Soft_Linden/scratch&amp;diff=24624</id>
		<title>User:Soft Linden/scratch</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Soft_Linden/scratch&amp;diff=24624"/>
		<updated>2007-06-29T15:23:23Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: /* sldev Meeting Times */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== sldev Meeting Times ==&lt;br /&gt;
&lt;br /&gt;
Add your SL name and mark the time slots (in Pacific/SLT) that are generally agreeable and available for developer meetings. Don&#039;t worry about breaking it down to specific days - I&#039;m just looking for clusters here.&lt;br /&gt;
&lt;br /&gt;
   Name               Weekday 6a 9a 12 15 18 21   Weekend 6a 9a 12 15 18 21&lt;br /&gt;
   Soft Linden                 *  *  *  *  *  *            *  *  *  *  *  *&lt;br /&gt;
   Nick                        *  *  *  *                  *  *  *  *&lt;br /&gt;
   John Hurliman                     *  *  *  *                     *  *&lt;br /&gt;
   Able Whitman                         *  *  *               *  *  *  *&lt;br /&gt;
   Jason Giglio                      *  *  *  *                  *  *  *  *&lt;br /&gt;
   Boroondas Gupte                   *  *                  *  *  *  *&lt;br /&gt;
   Dana Fagerstrom             *  *  *&lt;br /&gt;
   Alissa Sabre                *  *     *                  *              *&lt;br /&gt;
   Dale Glass                     *  *  *  *               *  *  *  *  *&lt;br /&gt;
&lt;br /&gt;
== Old Patches Possibly Wanting Love ==&lt;br /&gt;
sldev PATCH build fixes for gcc 4&amp;lt;br /&amp;gt;&lt;br /&gt;
Olivier Blin blino at mandriva.com&amp;lt;br /&amp;gt;&lt;br /&gt;
Mon Jan 8 17:56:35 PST 2007&amp;lt;br /&amp;gt;&lt;br /&gt;
https://lists.secondlife.com/pipermail/sldev/2007-January/000026.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sldev PATCH: Copy UUID pie menu item&amp;lt;br /&amp;gt;&lt;br /&gt;
John Hurliman jhurliman at wsu.edu&amp;lt;br /&amp;gt;&lt;br /&gt;
Sat Jan 13 01:56:11 PST 2007&amp;lt;br /&amp;gt;&lt;br /&gt;
https://lists.secondlife.com/pipermail/sldev/2007-January/000094.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sldev alternative os support?&amp;lt;br /&amp;gt;&lt;br /&gt;
Todd T. Fries sl at email.fries.net&amp;lt;br /&amp;gt;&lt;br /&gt;
Mon Jan 22 17:20:24 PST 2007&amp;lt;br /&amp;gt;&lt;br /&gt;
https://lists.secondlife.com/pipermail/sldev/2007-January/000176.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sldev OpenJPEG MAX_PATH issue&amp;lt;br /&amp;gt;&lt;br /&gt;
David Fries david at fries.net&amp;lt;br /&amp;gt;&lt;br /&gt;
Sat Jan 20 14:43:49 PST 2007&amp;lt;br /&amp;gt;&lt;br /&gt;
https://lists.secondlife.com/pipermail/sldev/2007-January/000180.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sldev Re: LLOctree crash (weird crash)&amp;lt;br /&amp;gt;&lt;br /&gt;
Dylan Alex Simon dylan at dylex.net&amp;lt;br /&amp;gt;&lt;br /&gt;
Wed Jan 24 18:36:22 PST 2007&amp;lt;br /&amp;gt;&lt;br /&gt;
https://lists.secondlife.com/pipermail/sldev/2007-January/000232.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sldev New First Look source code&amp;lt;br /&amp;gt;&lt;br /&gt;
Ismail Dönmez ismail at pardus.org.tr&amp;lt;br /&amp;gt;&lt;br /&gt;
Sat Feb 3 04:09:22 PST 2007&amp;lt;br /&amp;gt;&lt;br /&gt;
https://lists.secondlife.com/pipermail/sldev/2007-February/000315.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sldev OpenJPEG meta decode, Second Life patches&amp;lt;br /&amp;gt;&lt;br /&gt;
David Fries david at fries.net&amp;lt;br /&amp;gt;&lt;br /&gt;
Sun Feb 11 14:26:06 PST 2007&amp;lt;br /&amp;gt;&lt;br /&gt;
https://lists.secondlife.com/pipermail/sldev/2007-February/000362.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sldev jinclude.h ?&amp;lt;br /&amp;gt;&lt;br /&gt;
David Fries david at fries.net&amp;lt;br /&amp;gt;&lt;br /&gt;
Wed Feb 14 20:00:27 PST 2007&amp;lt;br /&amp;gt;&lt;br /&gt;
https://lists.secondlife.com/pipermail/sldev/2007-February/000425.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sldev Let xmlrpc-epi use already installedversion of expat.&amp;lt;br /&amp;gt;&lt;br /&gt;
Guido guidoj at users.sourceforge.net&amp;lt;br /&amp;gt;&lt;br /&gt;
Mon Feb 19 07:46:59 PST 2007&amp;lt;br /&amp;gt;&lt;br /&gt;
https://lists.secondlife.com/pipermail/sldev/2007-February/000459.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sldev Ubuntu Runtime Error SDL&amp;lt;br /&amp;gt;&lt;br /&gt;
David Fries david at fries.net&amp;lt;br /&amp;gt;&lt;br /&gt;
Tue Feb 27 21:00:24 PST 2007&amp;lt;br /&amp;gt;&lt;br /&gt;
https://lists.secondlife.com/pipermail/sldev/2007-February/000672.html&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=SLDev-Traffic_17&amp;diff=24354</id>
		<title>SLDev-Traffic 17</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=SLDev-Traffic_17&amp;diff=24354"/>
		<updated>2007-06-25T01:00:33Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: Script was linked, not attached. The attachment on my post is a GPG signature&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SLDevTraffic}}&lt;br /&gt;
&lt;br /&gt;
sldev-traffic no 17&lt;br /&gt;
&lt;br /&gt;
sldev discussions through June 22, 2007&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Source Releases ==&lt;br /&gt;
Anthony Foster (Linden) posted the 1.18.0.0 source tarballs, with gratitude from Rob Lanphier (Linden) for the speed at which it&#039;s been posted.&lt;br /&gt;
&lt;br /&gt;
Right now, the Windlight source only exists in the SVN, and at least one list member reported problems building, owing to glh/glh_lindear missing from the headers.&lt;br /&gt;
&lt;br /&gt;
== Cleaning Up the Linux Build Doc ==&lt;br /&gt;
Max Okumoto had a go at cleaning up the Linux build instructions, with Dale Glass further refining the documentation afterward. Bryan O&#039;Sullivan (Linden) commented that he&#039;d made changes to the SConstruct script that should make it easy to build without the bundled libraries. Look for this in a coming release - it will make the Linux build easier still.&lt;br /&gt;
&lt;br /&gt;
== Less Like a Sieve, More Like an Old Bucket ==&lt;br /&gt;
Thew viewer&#039;s not leaking anywhere near so much as it used to, thanks in very large part to Nicholaz Beresford&#039;s cleanup work. Nicholaz [http://nicholaz-beresford.blogspot.com/2007/06/memory-leaksleftover-almost-completed.html posts about it] on his blog. There&#039;s little doubt that there will be more leakage in the future as Lindens race to make the kinds of radical changes that grow Second Life, but the closer the viewer stays to Nicholaz&#039; new baseline, the better.&lt;br /&gt;
&lt;br /&gt;
== JIRA Pain ==&lt;br /&gt;
For four weekends in a row, JIRA has gone into molasses mode, sometimes taking terribly long to load pages, sometimes going away entirely. Rob Lanphier (Linden) confirms that an upgrade is pending, but doesn&#039;t have a date.&lt;br /&gt;
&lt;br /&gt;
Matthew Dowd points to a known JIRA issue that&#039;s fixed in the newest version, manifesting as a &amp;quot;docs out of order&amp;quot; message. Matthew created a JIRA about it at {{JIRA|https://jira.secondlife.com/browse/WEB-180}}, with Torley Linden asking for direct email with &amp;quot;WEB-180&amp;quot; in the subject line next time it surfaces.&lt;br /&gt;
&lt;br /&gt;
== SVN Source Merging Script ==&lt;br /&gt;
Dale Glass posts a script for merging new versions of the source into a private SVN repository, linked from his [https://lists.secondlife.com/pipermail/sldev/2007-June/002462.html original post].&lt;br /&gt;
&lt;br /&gt;
== SVK For Local SVN Staging, GIT, and More ==&lt;br /&gt;
Dale Glass posts a brief introduction to using subversion and svk, which allows many of the benefits of svn write status on a read-only repository. The page is at [[source version control]]. Dzonatas Sol and Paul Hampson sing the praises of git and git-svn as well, noting that Linus Torvalds has called git production-ready, although both note that a good GUI would be advantageous, wishing for TortoiseGIT. Here&#039;s hoping!&lt;br /&gt;
&lt;br /&gt;
Paul Hampson links to [http://utsl.gen.nz/talks/git-svn/intro.html an introduction to git-svn] for former svn-svk users.&lt;br /&gt;
&lt;br /&gt;
Further piling onto the discussion, Joshua Bell (Linden) mentions that Mercurial is similar to git, is cross-platform, and that there&#039;s a &amp;quot;tortoise-hg&amp;quot; project under way.&lt;br /&gt;
&lt;br /&gt;
== The P Word ==&lt;br /&gt;
Tim Shephard raises the question of plugin issues again, linking to a recent [http://secondlife.reuters.com/stories/2007/06/14/open-source-second-life-add-ons-still-months-away/ Reuters article] on the subject. There was some discussion about how plugins could allow some tools that could increase user retention, but the thread quickly shifted into a discussion of the largest issues adversely affecting the Second Life user experience, the biggest of which wouldn&#039;t be solved by client side changes.&lt;br /&gt;
&lt;br /&gt;
== Proper Constant Parsing and Lex/Yacc help ==&lt;br /&gt;
Thanks to Dzonatas Sol&#039;s input and another patch from Argent Stonecutter, LSL is no longer swallowing subtraction operations as oddly placed negative constants. With Monday&#039;s optional update, some of those silly long-standing syntax errors that most often pop up when subtracting in loop compares will be gone.&lt;br /&gt;
&lt;br /&gt;
Argent Stonecutter followed up with a little more detail on how constant folding could be done while still respecting order of precedence when variables and constants were in the mix.&lt;br /&gt;
&lt;br /&gt;
== Fontconfig ==&lt;br /&gt;
Alissa Sabre created a page with [[User:Alissa Sabre/Notes on fontconfig]], explaining what it is, why the viewer should or shouldn&#039;t use it, and going into additional detail on how it could be used in the viewer.&lt;br /&gt;
&lt;br /&gt;
This could address a number of current font issues, however at present there hasn&#039;t been any follow-up discussion.&lt;br /&gt;
&lt;br /&gt;
== CPU and GPU Statistics ==&lt;br /&gt;
Soft Linden posted a sample of all of the CPU and GPU strings returned by residents&#039; viewers over a one week period. After some analysis, there was a consensus that the strings need additional detail in order to provide meaningful information about the ability of the various machines used to visit Second Life.&lt;br /&gt;
&lt;br /&gt;
We&#039;re fully willing to accept any enhancements to CPU and GPU identification and run another round of data if it would be useful to sldev members.&lt;br /&gt;
&lt;br /&gt;
== We&#039;ve Got Patches ==&lt;br /&gt;
Nicholaz Beresford and Gigs Taggart both posted lists of new patches. From Nicholaz, {{JIRA|VWR-1294}} and {{JIRA|VWR-1296}}. From Gigs, a number all linked to [https://lists.secondlife.com/pipermail/sldev/2007-June/002431.html his post], five more, which I believe are all in the JIRA.&lt;br /&gt;
&lt;br /&gt;
At least two of Gigs&#039; are already in our internal maintenance branch, and should be in Monday&#039;s optional viewer update. Sardonyx Linden claimed both of Nicholaz&#039;s patches, and at least one was in within half an hour. Nicholaz said we were giving the WINE project a run for its money on the speed of that import. We&#039;re doing better, and we&#039;ll push to keep that up.&lt;br /&gt;
&lt;br /&gt;
Thanks for patchin&#039;!&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_To_Client_Communication&amp;diff=24172</id>
		<title>LSL To Client Communication</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_To_Client_Communication&amp;diff=24172"/>
		<updated>2007-06-23T01:16:50Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: general functionality&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Open Source Portal}}&lt;br /&gt;
&lt;br /&gt;
=Communication=&lt;br /&gt;
A mechanism is needed to allow LSL scripts to talk to the viewer in order to allow implementing some interesting functionality, such as viewer UI extensions that communicate with in-world objects, for instance. Viewer to LSL communication is easily possible, by making the viewer talk on a specific channel, or use XML RPC. This may not be ideal for all cases, but it&#039;s already doable without any modifications.&lt;br /&gt;
&lt;br /&gt;
What needs work is LSL to Client communication, as there currently isn&#039;t any good method in the official client for that.&lt;br /&gt;
&lt;br /&gt;
=Requirements=&lt;br /&gt;
A robust mechanism should satisfy these requirements:&lt;br /&gt;
&lt;br /&gt;
# Scripts must be able to receive messages from the viewer (can be done already with chat and XML RPC)&lt;br /&gt;
# Scripts must be able to reply to the viewer&lt;br /&gt;
# It must be possible to communicate with multiple viewers at once without confusion&lt;br /&gt;
# Order of delivery must be guaranteed (chat messages currently can be reordered)&lt;br /&gt;
# Messages must be reliable&lt;br /&gt;
&lt;br /&gt;
The hack below can satisfy requirements #1 to #3. Requirement #4 would require extra work (although it&#039;s doable) and is possibly best ignored, as LL mentioned the possibility of moving chat to TCP, which would automatically solve the issue.&lt;br /&gt;
&lt;br /&gt;
Requirement #5 is mostly satisfied as data isn&#039;t lost, and the only problem may be with the viewer or the script disappearing, which can be dealt with by designing the proper protocol, if needed.&lt;br /&gt;
&lt;br /&gt;
=Hack=&lt;br /&gt;
While there&#039;s no official solution, here&#039;s what I came up with for now:&lt;br /&gt;
&lt;br /&gt;
* Client to LSL: Client speaks on a channel directly. Nothing special here.&lt;br /&gt;
* LSL to Client: Script uses llOwnerSay, with this format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
$VwrComm$VERSION$COMPONENT$DATA&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fields:&lt;br /&gt;
* VwrComm: Header, must be present&lt;br /&gt;
* VERSION: Protocol version&lt;br /&gt;
* COMPONENT: Component inside the viewer the message is for&lt;br /&gt;
* DATA: Data being sent. The format of the data isn&#039;t specified.&lt;br /&gt;
&lt;br /&gt;
==Behavior==&lt;br /&gt;
&lt;br /&gt;
This is how the current implementation handles the protocol:&lt;br /&gt;
&lt;br /&gt;
# Message must come from an object. Normal chat doesn&#039;t trigger it&lt;br /&gt;
# String gets split by &amp;quot;$&amp;quot; and must have at least 4 tokens&lt;br /&gt;
# First token must be VwrComm&lt;br /&gt;
# Second token must be &amp;quot;0&amp;quot; (version number, this will change)&lt;br /&gt;
# Third token matches the name of a known component.&lt;br /&gt;
&lt;br /&gt;
If requirements #1 to #3 aren&#039;t satisfied, the string is passed as-is, and the code doesn&#039;t suppress its display.&lt;br /&gt;
&lt;br /&gt;
If requirement #4 isn&#039;t satisfied, the text won&#039;t appear on screen, but the code won&#039;t continue further either. A message will be logged in the viewer&#039;s log, saying that a message with the wrong version was received.&lt;br /&gt;
&lt;br /&gt;
If requirement #5 isn&#039;t satisfied, display is also suppressed, and a message is also logged.&lt;br /&gt;
&lt;br /&gt;
If all those requirements are satisfied, the data in the message is sent to the specified part of the viewer for futher processing.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
$VwrComm$0$DaleGlass.AvatarScanner$LoginComplete&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Implementation==&lt;br /&gt;
Code for this can be found at [http://svn.daleglass.net/secondlife/trunk/indra/newview/llviewermessage.cpp], line 2047&lt;br /&gt;
&lt;br /&gt;
Note that at the time of writing, the client isn&#039;t capable of telling the difference between object speech sent to all users (llSay/etc) and object speech sent only to the owner (llOwnerSay). It also doesn&#039;t check the speaking object&#039;s key or its owner&#039;s. This code must be fixed to obtain that information, so that the viewer can ignore messages from objects not owned by the user, when such a thing is necessary.&lt;br /&gt;
&lt;br /&gt;
=Protocol=&lt;br /&gt;
The above describes the system and format for exchanging data. However, there are still a few problems to solve:&lt;br /&gt;
&lt;br /&gt;
# Multiple extensions to the viewer must be able to coexist, without conflicting with others&lt;br /&gt;
# Viewer may not implement this at all, in which case the messages get displayed on screen&lt;br /&gt;
# Viewer replies to the script have potential security issues&lt;br /&gt;
&lt;br /&gt;
Proposed solutions:&lt;br /&gt;
&lt;br /&gt;
# See next section&lt;br /&gt;
# The LSL script initiates the conversation. It sends a single request and waits for a reply. This ensures that non-supporting clients don&#039;t get flooded with protocol data. &lt;br /&gt;
# During the establishment of the connection, the script chooses a random channel to listen on, and tells it to the viewer. This makes it very improbable that somebody will be able to intercept the data, as the channel will be different every time. An additional advantage is that there&#039;s no need to keep track of who uses what channel: the chance of a collision should be extremely low.&lt;br /&gt;
&lt;br /&gt;
== Component Naming ==&lt;br /&gt;
The COMPONENT field of the protocol specifies the name of the component inside the viewer the script wants to talk to. The data is an arbitrary ASCII string, which may not contain newlines or the $ character. The proposed format is &amp;quot;AvatarName.FunctionName&amp;quot;, where AvatarName is the first and last names of the avatar who created the functionality concatenated without a space, a period, and the name of the avatar&#039;s creation. This system should ensure that should two people come up with different ways to do the same thing, the COMPONENT names won&#039;t clash.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
$VwrComm$0$DaleGlass.AvatarScanner$LoginComplete&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connection Establishment ==&lt;br /&gt;
As described above, the LSL script initiates the communication by telling the viewer what channel it wants to talk on.&lt;br /&gt;
&lt;br /&gt;
=== Connection Request ===&lt;br /&gt;
* The COMPONENT field&#039;s value is &amp;quot;DaleGlass.Viewer&amp;quot;&lt;br /&gt;
* The payload is &amp;quot;Connect$&amp;lt;channel&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The fields are as follows:&lt;br /&gt;
* &amp;lt;channel&amp;gt; is the channel the script wants to talk on. For security, this SHOULD be randomly generated.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
$VwrComm$0$DaleGlass.Viewer$Connect$12421&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Viewer Reply ===&lt;br /&gt;
Viewer replies to the request by sending the message &amp;quot;OK&amp;quot; to the specified channel. Any other reply MUST be considered an error message.&lt;br /&gt;
&lt;br /&gt;
After this, any further requests to the viewer from the object are replied to in on the specified channel.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
integer g_channel = 0;         // Channel to talk on -- randomly generated&lt;br /&gt;
integer g_listen_handle = 0;   // Listen handle&lt;br /&gt;
&lt;br /&gt;
integer g_timeout = 30;        // How long to wait for the viewer to reply&lt;br /&gt;
&lt;br /&gt;
ViewerComm(string component, string data) {&lt;br /&gt;
    llOwnerSay(&amp;quot;$VwrComm$0$&amp;quot; + component + &amp;quot;$&amp;quot; + data);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        // Generate a random channel number&lt;br /&gt;
        g_channel = (integer)(llFRand(4294967295) - 2147483648);&lt;br /&gt;
&lt;br /&gt;
        // Set a timer in case the viewer doesn&#039;t reply&lt;br /&gt;
        llSetTimerEvent(g_timeout);&lt;br /&gt;
&lt;br /&gt;
        // Listen for replies&lt;br /&gt;
        g_listen_handle = llListen(g_channel, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // Send connection request&lt;br /&gt;
        ViewerComm(&amp;quot;DaleGlass.Viewer&amp;quot;, &amp;quot;Connect$&amp;quot; + (string)channel);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer() {&lt;br /&gt;
        llListenRemove(g_listen_handle);&lt;br /&gt;
        llOwnerSay(&amp;quot;Client/Viewer connection timed out -- probably not supported&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    listen( integer channel, string name, key id, string message ) {&lt;br /&gt;
        if ( message == &amp;quot;OK&amp;quot; ) {&lt;br /&gt;
            // Connection successful&lt;br /&gt;
            llOwnerSay(&amp;quot;Client/Viewer connection successful&amp;quot;);&lt;br /&gt;
        } else {&lt;br /&gt;
            // Something went wrong&lt;br /&gt;
            llOwnerSay(&amp;quot;Client/Viewer connection error: &amp;quot; + message);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= General Functionality =&lt;br /&gt;
This is the proposed functionality that would be implemented by the main patch itself, and supported by all viewers that speak this protocol. The idea is to provide some simple and generally useful functionality. All of them would use COMPONENT &amp;quot;DaleGlass.Viewer&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== GetViewerVersion ==&lt;br /&gt;
This command would return the viewer&#039;s version as a string, with the following format:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;major&amp;gt;$&amp;lt;minor&amp;gt;$&amp;lt;revision&amp;gt;$&amp;lt;build&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example, viewer version 1.17.0 (12) would be sent as:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
1$17$0$12&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GetViewerBuilder ==&lt;br /&gt;
Returns the name of the person who built the viewer. &amp;quot;Linden Lab&amp;quot; would be reserved for LL. My viewer would say &amp;quot;Dale Glass&amp;quot; here for instance.&lt;br /&gt;
&lt;br /&gt;
== GetViewerRevision ==&lt;br /&gt;
Returns the viewer&#039;s revision number. This would apply only to custom built viewers. The recommendation is that the reply to this message be the revision number from the builder&#039;s source repository.&lt;br /&gt;
&lt;br /&gt;
== GetExtensionList ==&lt;br /&gt;
Returns the list of supported viewer extensions, as a comma separated string. MUST NOT contain anything that&#039;d conflict with llCSV2List.&lt;br /&gt;
&lt;br /&gt;
Example reply:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
DaleGlass.Viewer, DaleGlass.AvatarScanner, ExampleAvatar.CoolScript&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The intention behind this command is allowing scripts that are capable of using multiple extensions determine which are present. &lt;br /&gt;
&lt;br /&gt;
== GetOperatingSystem ==&lt;br /&gt;
Returns a string describing the OS being used:&lt;br /&gt;
* Linux&lt;br /&gt;
* Windows&lt;br /&gt;
* OS X&lt;br /&gt;
* Solaris&lt;br /&gt;
* (etc)&lt;br /&gt;
&lt;br /&gt;
The intention is to allow scripts to determine that some functionality isn&#039;t available because the implementation is OS-specific. This MUST NOT be used as a primary method of detecting whether some functionality is supported (as this could change). Instead, this should only be used after GetExtensionList fails to return the desired functionality, and used to determine whether the lack of it is because it&#039;s not available on that OS at all.&lt;br /&gt;
&lt;br /&gt;
[[Category:Design Discussions]]&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_To_Client_Communication&amp;diff=24164</id>
		<title>LSL To Client Communication</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_To_Client_Communication&amp;diff=24164"/>
		<updated>2007-06-23T00:57:25Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: formatting changes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Open Source Portal}}&lt;br /&gt;
&lt;br /&gt;
=Communication=&lt;br /&gt;
A mechanism is needed to allow LSL scripts to talk to the viewer in order to allow implementing some interesting functionality, such as viewer UI extensions that communicate with in-world objects, for instance. Viewer to LSL communication is easily possible, by making the viewer talk on a specific channel, or use XML RPC. This may not be ideal for all cases, but it&#039;s already doable without any modifications.&lt;br /&gt;
&lt;br /&gt;
What needs work is LSL to Client communication, as there currently isn&#039;t any good method in the official client for that.&lt;br /&gt;
&lt;br /&gt;
=Requirements=&lt;br /&gt;
A robust mechanism should satisfy these requirements:&lt;br /&gt;
&lt;br /&gt;
# Scripts must be able to receive messages from the viewer (can be done already with chat and XML RPC)&lt;br /&gt;
# Scripts must be able to reply to the viewer&lt;br /&gt;
# It must be possible to communicate with multiple viewers at once without confusion&lt;br /&gt;
# Order of delivery must be guaranteed (chat messages currently can be reordered)&lt;br /&gt;
# Messages must be reliable&lt;br /&gt;
&lt;br /&gt;
The hack below can satisfy requirements #1 to #3. Requirement #4 would require extra work (although it&#039;s doable) and is possibly best ignored, as LL mentioned the possibility of moving chat to TCP, which would automatically solve the issue.&lt;br /&gt;
&lt;br /&gt;
Requirement #5 is mostly satisfied as data isn&#039;t lost, and the only problem may be with the viewer or the script disappearing, which can be dealt with by designing the proper protocol, if needed.&lt;br /&gt;
&lt;br /&gt;
=Hack=&lt;br /&gt;
While there&#039;s no official solution, here&#039;s what I came up with for now:&lt;br /&gt;
&lt;br /&gt;
* Client to LSL: Client speaks on a channel directly. Nothing special here.&lt;br /&gt;
* LSL to Client: Script uses llOwnerSay, with this format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
$VwrComm$VERSION$COMPONENT$DATA&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fields:&lt;br /&gt;
* VwrComm: Header, must be present&lt;br /&gt;
* VERSION: Protocol version&lt;br /&gt;
* COMPONENT: Component inside the viewer the message is for&lt;br /&gt;
* DATA: Data being sent. The format of the data isn&#039;t specified.&lt;br /&gt;
&lt;br /&gt;
==Behavior==&lt;br /&gt;
&lt;br /&gt;
This is how the current implementation handles the protocol:&lt;br /&gt;
&lt;br /&gt;
# Message must come from an object. Normal chat doesn&#039;t trigger it&lt;br /&gt;
# String gets split by &amp;quot;$&amp;quot; and must have at least 4 tokens&lt;br /&gt;
# First token must be VwrComm&lt;br /&gt;
# Second token must be &amp;quot;0&amp;quot; (version number, this will change)&lt;br /&gt;
# Third token matches the name of a known component.&lt;br /&gt;
&lt;br /&gt;
If requirements #1 to #3 aren&#039;t satisfied, the string is passed as-is, and the code doesn&#039;t suppress its display.&lt;br /&gt;
&lt;br /&gt;
If requirement #4 isn&#039;t satisfied, the text won&#039;t appear on screen, but the code won&#039;t continue further either. A message will be logged in the viewer&#039;s log, saying that a message with the wrong version was received.&lt;br /&gt;
&lt;br /&gt;
If requirement #5 isn&#039;t satisfied, display is also suppressed, and a message is also logged.&lt;br /&gt;
&lt;br /&gt;
If all those requirements are satisfied, the data in the message is sent to the specified part of the viewer for futher processing.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
$VwrComm$0$DaleGlass.AvatarScanner$LoginComplete&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Implementation==&lt;br /&gt;
Code for this can be found at [http://svn.daleglass.net/secondlife/trunk/indra/newview/llviewermessage.cpp], line 2047&lt;br /&gt;
&lt;br /&gt;
Note that at the time of writing, the client isn&#039;t capable of telling the difference between object speech sent to all users (llSay/etc) and object speech sent only to the owner (llOwnerSay). It also doesn&#039;t check the speaking object&#039;s key or its owner&#039;s. This code must be fixed to obtain that information, so that the viewer can ignore messages from objects not owned by the user, when such a thing is necessary.&lt;br /&gt;
&lt;br /&gt;
=Protocol=&lt;br /&gt;
The above describes the system and format for exchanging data. However, there are still a few problems to solve:&lt;br /&gt;
&lt;br /&gt;
# Multiple extensions to the viewer must be able to coexist, without conflicting with others&lt;br /&gt;
# Viewer may not implement this at all, in which case the messages get displayed on screen&lt;br /&gt;
# Viewer replies to the script have potential security issues&lt;br /&gt;
&lt;br /&gt;
Proposed solutions:&lt;br /&gt;
&lt;br /&gt;
# See next section&lt;br /&gt;
# The LSL script initiates the conversation. It sends a single request and waits for a reply. This ensures that non-supporting clients don&#039;t get flooded with protocol data. &lt;br /&gt;
# During the establishment of the connection, the script chooses a random channel to listen on, and tells it to the viewer. This makes it very improbable that somebody will be able to intercept the data, as the channel will be different every time. An additional advantage is that there&#039;s no need to keep track of who uses what channel: the chance of a collision should be extremely low.&lt;br /&gt;
&lt;br /&gt;
== Component Naming ==&lt;br /&gt;
The COMPONENT field of the protocol specifies the name of the component inside the viewer the script wants to talk to. The data is an arbitrary ASCII string, which may not contain newlines or the $ character. The proposed format is &amp;quot;AvatarName.FunctionName&amp;quot;, where AvatarName is the first and last names of the avatar who created the functionality concatenated without a space, a period, and the name of the avatar&#039;s creation. This system should ensure that should two people come up with different ways to do the same thing, the COMPONENT names won&#039;t clash.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
$VwrComm$0$DaleGlass.AvatarScanner$LoginComplete&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connection Establishment ==&lt;br /&gt;
As described above, the LSL script initiates the communication by telling the viewer what channel it wants to talk on.&lt;br /&gt;
&lt;br /&gt;
=== Connection Request ===&lt;br /&gt;
* The COMPONENT field&#039;s value is &amp;quot;DaleGlass.Viewer&amp;quot;&lt;br /&gt;
* The payload is &amp;quot;Connect$&amp;lt;channel&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The fields are as follows:&lt;br /&gt;
* &amp;lt;channel&amp;gt; is the channel the script wants to talk on. For security, this SHOULD be randomly generated.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
$VwrComm$0$DaleGlass.Viewer$Connect$12421&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Viewer Reply ===&lt;br /&gt;
Viewer replies to the request by sending the message &amp;quot;OK&amp;quot; to the specified channel. Any other reply MUST be considered an error message.&lt;br /&gt;
&lt;br /&gt;
After this, any further requests to the viewer from the object are replied to in on the specified channel.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
integer g_channel = 0;         // Channel to talk on -- randomly generated&lt;br /&gt;
integer g_listen_handle = 0;   // Listen handle&lt;br /&gt;
&lt;br /&gt;
integer g_timeout = 30;        // How long to wait for the viewer to reply&lt;br /&gt;
&lt;br /&gt;
ViewerComm(string component, string data) {&lt;br /&gt;
    llOwnerSay(&amp;quot;$VwrComm$0$&amp;quot; + component + &amp;quot;$&amp;quot; + data);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        // Generate a random channel number&lt;br /&gt;
        g_channel = (integer)(llFRand(4294967295) - 2147483648);&lt;br /&gt;
&lt;br /&gt;
        // Set a timer in case the viewer doesn&#039;t reply&lt;br /&gt;
        llSetTimerEvent(g_timeout);&lt;br /&gt;
&lt;br /&gt;
        // Listen for replies&lt;br /&gt;
        g_listen_handle = llListen(g_channel, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // Send connection request&lt;br /&gt;
        ViewerComm(&amp;quot;DaleGlass.Viewer&amp;quot;, &amp;quot;Connect$&amp;quot; + (string)channel);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer() {&lt;br /&gt;
        llListenRemove(g_listen_handle);&lt;br /&gt;
        llOwnerSay(&amp;quot;Client/Viewer connection timed out -- probably not supported&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    listen( integer channel, string name, key id, string message ) {&lt;br /&gt;
        if ( message == &amp;quot;OK&amp;quot; ) {&lt;br /&gt;
            // Connection successful&lt;br /&gt;
            llOwnerSay(&amp;quot;Client/Viewer connection successful&amp;quot;);&lt;br /&gt;
        } else {&lt;br /&gt;
            // Something went wrong&lt;br /&gt;
            llOwnerSay(&amp;quot;Client/Viewer connection error: &amp;quot; + message);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Design Discussions]]&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_To_Client_Communication&amp;diff=24162</id>
		<title>LSL To Client Communication</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_To_Client_Communication&amp;diff=24162"/>
		<updated>2007-06-23T00:54:07Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: More details, example script&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Open Source Portal}}&lt;br /&gt;
&lt;br /&gt;
=Communication=&lt;br /&gt;
A mechanism is needed to allow LSL scripts to talk to the viewer in order to allow implementing some interesting functionality, such as viewer UI extensions that communicate with in-world objects, for instance. Viewer to LSL communication is easily possible, by making the viewer talk on a specific channel, or use XML RPC. This may not be ideal for all cases, but it&#039;s already doable without any modifications.&lt;br /&gt;
&lt;br /&gt;
What needs work is LSL to Client communication, as there currently isn&#039;t any good method in the official client for that.&lt;br /&gt;
&lt;br /&gt;
=Requirements=&lt;br /&gt;
A robust mechanism should satisfy these requirements:&lt;br /&gt;
&lt;br /&gt;
# Scripts must be able to receive messages from the viewer (can be done already with chat and XML RPC)&lt;br /&gt;
# Scripts must be able to reply to the viewer&lt;br /&gt;
# It must be possible to communicate with multiple viewers at once without confusion&lt;br /&gt;
# Order of delivery must be guaranteed (chat messages currently can be reordered)&lt;br /&gt;
# Messages must be reliable&lt;br /&gt;
&lt;br /&gt;
The hack below can satisfy requirements #1 to #3. Requirement #4 would require extra work (although it&#039;s doable) and is possibly best ignored, as LL mentioned the possibility of moving chat to TCP, which would automatically solve the issue.&lt;br /&gt;
&lt;br /&gt;
Requirement #5 is mostly satisfied as data isn&#039;t lost, and the only problem may be with the viewer or the script disappearing, which can be dealt with by designing the proper protocol, if needed.&lt;br /&gt;
&lt;br /&gt;
=Hack=&lt;br /&gt;
While there&#039;s no official solution, here&#039;s what I came up with for now:&lt;br /&gt;
&lt;br /&gt;
* Client to LSL: Client speaks on a channel directly. Nothing special here.&lt;br /&gt;
* LSL to Client: Script uses llOwnerSay, with this format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
$VwrComm$VERSION$COMPONENT$DATA&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fields:&lt;br /&gt;
* VwrComm: Header, must be present&lt;br /&gt;
* VERSION: Protocol version&lt;br /&gt;
* COMPONENT: Component inside the viewer the message is for&lt;br /&gt;
* DATA: Data being sent. The format of the data isn&#039;t specified.&lt;br /&gt;
&lt;br /&gt;
===Behavior===&lt;br /&gt;
&lt;br /&gt;
This is how the current implementation handles the protocol:&lt;br /&gt;
&lt;br /&gt;
# Message must come from an object. Normal chat doesn&#039;t trigger it&lt;br /&gt;
# String gets split by &amp;quot;$&amp;quot; and must have at least 4 tokens&lt;br /&gt;
# First token must be VwrComm&lt;br /&gt;
# Second token must be &amp;quot;0&amp;quot; (version number, this will change)&lt;br /&gt;
# Third token matches the name of a known component.&lt;br /&gt;
&lt;br /&gt;
If requirements #1 to #3 aren&#039;t satisfied, the string is passed as-is, and the code doesn&#039;t suppress its display.&lt;br /&gt;
&lt;br /&gt;
If requirement #4 isn&#039;t satisfied, the text won&#039;t appear on screen, but the code won&#039;t continue further either. A message will be logged in the viewer&#039;s log, saying that a message with the wrong version was received.&lt;br /&gt;
&lt;br /&gt;
If requirement #5 isn&#039;t satisfied, display is also suppressed, and a message is also logged.&lt;br /&gt;
&lt;br /&gt;
If all those requirements are satisfied, the data in the message is sent to the specified part of the viewer for futher processing.&lt;br /&gt;
&lt;br /&gt;
===Example===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
$VwrComm$0$DaleGlass.AvatarScanner$LoginComplete&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Implementation===&lt;br /&gt;
Code for this can be found at [http://svn.daleglass.net/secondlife/trunk/indra/newview/llviewermessage.cpp], line 2047&lt;br /&gt;
&lt;br /&gt;
Note that at the time of writing, the client isn&#039;t capable of telling the difference between object speech sent to all users (llSay/etc) and object speech sent only to the owner (llOwnerSay). It also doesn&#039;t check the speaking object&#039;s key or its owner&#039;s. This code must be fixed to obtain that information, so that the viewer can ignore messages from objects not owned by the user, when such a thing is necessary.&lt;br /&gt;
&lt;br /&gt;
==Protocol==&lt;br /&gt;
The above describes the system and format for exchanging data. However, there are still a few problems to solve:&lt;br /&gt;
&lt;br /&gt;
# Multiple extensions to the viewer must be able to coexist, without conflicting with others&lt;br /&gt;
# Viewer may not implement this at all, in which case the messages get displayed on screen&lt;br /&gt;
# Viewer replies to the script have potential security issues&lt;br /&gt;
&lt;br /&gt;
Proposed solutions:&lt;br /&gt;
&lt;br /&gt;
# See next section&lt;br /&gt;
# The LSL script initiates the conversation. It sends a single request and waits for a reply. This ensures that non-supporting clients don&#039;t get flooded with protocol data. &lt;br /&gt;
# During the establishment of the connection, the script chooses a random channel to listen on, and tells it to the viewer. This makes it very improbable that somebody will be able to intercept the data, as the channel will be different every time. An additional advantage is that there&#039;s no need to keep track of who uses what channel: the chance of a collision should be extremely low.&lt;br /&gt;
&lt;br /&gt;
=== Component Naming ===&lt;br /&gt;
The COMPONENT field of the protocol specifies the name of the component inside the viewer the script wants to talk to. The data is an arbitrary ASCII string, which may not contain newlines or the $ character. The proposed format is &amp;quot;AvatarName.FunctionName&amp;quot;, where AvatarName is the first and last names of the avatar who created the functionality concatenated without a space, a period, and the name of the avatar&#039;s creation. This system should ensure that should two people come up with different ways to do the same thing, the COMPONENT names won&#039;t clash.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
$VwrComm$0$DaleGlass.AvatarScanner$LoginComplete&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Connection Establishment ===&lt;br /&gt;
As described above, the LSL script initiates the communication by telling the viewer what channel it wants to talk on.&lt;br /&gt;
&lt;br /&gt;
==== Connection Request ====&lt;br /&gt;
* The COMPONENT field&#039;s value is &amp;quot;DaleGlass.Viewer&amp;quot;&lt;br /&gt;
* The payload is &amp;quot;Connect$&amp;lt;channel&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The fields are as follows:&lt;br /&gt;
* &amp;lt;channel&amp;gt; is the channel the script wants to talk on. For security, this SHOULD be randomly generated.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
$VwrComm$0$DaleGlass.Viewer$Connect$12421&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Viewer Reply ====&lt;br /&gt;
Viewer replies to the request by sending the message &amp;quot;OK&amp;quot; to the specified channel. Any other reply MUST be considered an error message.&lt;br /&gt;
&lt;br /&gt;
After this, any further requests to the viewer from the object are replied to in on the specified channel.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
integer g_channel = 0;         // Channel to talk on -- randomly generated&lt;br /&gt;
integer g_listen_handle = 0;   // Listen handle&lt;br /&gt;
&lt;br /&gt;
integer g_timeout = 30;        // How long to wait for the viewer to reply&lt;br /&gt;
&lt;br /&gt;
ViewerComm(string component, string data) {&lt;br /&gt;
    llOwnerSay(&amp;quot;$VwrComm$0$&amp;quot; + component + &amp;quot;$&amp;quot; + data);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        // Generate a random channel number&lt;br /&gt;
        g_channel = (integer)(llFRand(4294967295) - 2147483648);&lt;br /&gt;
&lt;br /&gt;
        // Set a timer in case the viewer doesn&#039;t reply&lt;br /&gt;
        llSetTimerEvent(g_timeout);&lt;br /&gt;
&lt;br /&gt;
        // Listen for replies&lt;br /&gt;
        g_listen_handle = llListen(g_channel, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // Send connection request&lt;br /&gt;
        ViewerComm(&amp;quot;DaleGlass.Viewer&amp;quot;, &amp;quot;Connect$&amp;quot; + (string)channel);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer() {&lt;br /&gt;
        llListenRemove(g_listen_handle);&lt;br /&gt;
        llOwnerSay(&amp;quot;Client/Viewer connection timed out -- probably not supported&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    listen( integer channel, string name, key id, string message ) {&lt;br /&gt;
        if ( message == &amp;quot;OK&amp;quot; ) {&lt;br /&gt;
            // Connection successful&lt;br /&gt;
            llOwnerSay(&amp;quot;Client/Viewer connection successful&amp;quot;);&lt;br /&gt;
        } else {&lt;br /&gt;
            // Something went wrong&lt;br /&gt;
            llOwnerSay(&amp;quot;Client/Viewer connection error: &amp;quot; + message);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Design Discussions]]&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_To_Client_Communication&amp;diff=24160</id>
		<title>LSL To Client Communication</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_To_Client_Communication&amp;diff=24160"/>
		<updated>2007-06-23T00:38:56Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: More details on viewer/script protocol&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Open Source Portal}}&lt;br /&gt;
&lt;br /&gt;
=Communication=&lt;br /&gt;
A mechanism is needed to allow LSL scripts to talk to the viewer in order to allow implementing some interesting functionality, such as viewer UI extensions that communicate with in-world objects, for instance. Viewer to LSL communication is easily possible, by making the viewer talk on a specific channel, or use XML RPC. This may not be ideal for all cases, but it&#039;s already doable without any modifications.&lt;br /&gt;
&lt;br /&gt;
What needs work is LSL to Client communication, as there currently isn&#039;t any good method in the official client for that.&lt;br /&gt;
&lt;br /&gt;
=Requirements=&lt;br /&gt;
A robust mechanism should satisfy these requirements:&lt;br /&gt;
&lt;br /&gt;
# Scripts must be able to receive messages from the viewer (can be done already with chat and XML RPC)&lt;br /&gt;
# Scripts must be able to reply to the viewer&lt;br /&gt;
# It must be possible to communicate with multiple viewers at once without confusion&lt;br /&gt;
# Order of delivery must be guaranteed (chat messages currently can be reordered)&lt;br /&gt;
# Messages must be reliable&lt;br /&gt;
&lt;br /&gt;
The hack below can satisfy requirements #1 to #3. Requirement #4 would require extra work (although it&#039;s doable) and is possibly best ignored, as LL mentioned the possibility of moving chat to TCP, which would automatically solve the issue.&lt;br /&gt;
&lt;br /&gt;
Requirement #5 is mostly satisfied as data isn&#039;t lost, and the only problem may be with the viewer or the script disappearing, which can be dealt with by designing the proper protocol, if needed.&lt;br /&gt;
&lt;br /&gt;
=Hack=&lt;br /&gt;
While there&#039;s no official solution, here&#039;s what I came up with for now:&lt;br /&gt;
&lt;br /&gt;
* Client to LSL: Client speaks on a channel directly. Nothing special here.&lt;br /&gt;
* LSL to Client: Script uses llOwnerSay, with this format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
$VwrComm$VERSION$COMPONENT$DATA&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fields:&lt;br /&gt;
* VwrComm: Header, must be present&lt;br /&gt;
* VERSION: Protocol version&lt;br /&gt;
* COMPONENT: Component inside the viewer the message is for&lt;br /&gt;
* DATA: Data being sent. The format of the data isn&#039;t specified.&lt;br /&gt;
&lt;br /&gt;
===Behavior===&lt;br /&gt;
&lt;br /&gt;
This is how the current implementation handles the protocol:&lt;br /&gt;
&lt;br /&gt;
# Message must come from an object. Normal chat doesn&#039;t trigger it&lt;br /&gt;
# String gets split by &amp;quot;$&amp;quot; and must have at least 4 tokens&lt;br /&gt;
# First token must be VwrComm&lt;br /&gt;
# Second token must be &amp;quot;0&amp;quot; (version number, this will change)&lt;br /&gt;
# Third token matches the name of a known component.&lt;br /&gt;
&lt;br /&gt;
If requirements #1 to #3 aren&#039;t satisfied, the string is passed as-is, and the code doesn&#039;t suppress its display.&lt;br /&gt;
&lt;br /&gt;
If requirement #4 isn&#039;t satisfied, the text won&#039;t appear on screen, but the code won&#039;t continue further either. A message will be logged in the viewer&#039;s log, saying that a message with the wrong version was received.&lt;br /&gt;
&lt;br /&gt;
If requirement #5 isn&#039;t satisfied, display is also suppressed, and a message is also logged.&lt;br /&gt;
&lt;br /&gt;
If all those requirements are satisfied, the data in the message is sent to the specified part of the viewer for futher processing.&lt;br /&gt;
&lt;br /&gt;
===Example===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
$VwrComm$0$DaleGlass.AvatarScanner$LoginComplete&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Implementation===&lt;br /&gt;
Code for this can be found at [http://svn.daleglass.net/secondlife/trunk/indra/newview/llviewermessage.cpp], line 2047&lt;br /&gt;
&lt;br /&gt;
Note that at the time of writing, the client isn&#039;t capable of telling the difference between object speech sent to all users (llSay/etc) and object speech sent only to the owner (llOwnerSay). It also doesn&#039;t check the speaking object&#039;s key or its owner&#039;s. This code must be fixed to obtain that information, so that the viewer can ignore messages from objects not owned by the user, when such a thing is necessary.&lt;br /&gt;
&lt;br /&gt;
==Protocol==&lt;br /&gt;
The above describes the system and format for exchanging data. However, there are still a few problems to solve:&lt;br /&gt;
&lt;br /&gt;
# Multiple extensions to the viewer must be able to coexist, without conflicting with others&lt;br /&gt;
# Viewer may not implement this at all, in which case the messages get displayed on screen&lt;br /&gt;
# Viewer replies to the script have potential security issues&lt;br /&gt;
&lt;br /&gt;
Proposed solutions:&lt;br /&gt;
&lt;br /&gt;
# See next section&lt;br /&gt;
# The LSL script initiates the conversation. It sends a single request and waits for a reply. This ensures that non-supporting clients don&#039;t get flooded with protocol data. &lt;br /&gt;
# During the establishment of the connection, the script chooses a random channel to listen on, and tells it to the viewer. This makes it very improbable that somebody will be able to intercept the data, as the channel will be different every time. An additional advantage is that there&#039;s no need to keep track of who uses what channel: the chance of a collision should be extremely low.&lt;br /&gt;
&lt;br /&gt;
=== Component Naming ===&lt;br /&gt;
The COMPONENT field of the protocol specifies the name of the component inside the viewer the script wants to talk to. The data is an arbitrary ASCII string, which may not contain newlines or the $ character. The proposed format is &amp;quot;AvatarName.FunctionName&amp;quot;, where AvatarName is the first and last names of the avatar who created the functionality concatenated without a space, a period, and the name of the avatar&#039;s creation. This system should ensure that should two people come up with different ways to do the same thing, the COMPONENT names won&#039;t clash.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
$VwrComm$0$DaleGlass.AvatarScanner$LoginComplete&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Connection Establishment ===&lt;br /&gt;
As described above, the LSL script initiates the communication by telling the viewer what channel it wants to talk on.&lt;br /&gt;
&lt;br /&gt;
==== Connection Request ====&lt;br /&gt;
* The COMPONENT field&#039;s value is &amp;quot;DaleGlass.Viewer&amp;quot;&lt;br /&gt;
* The payload is &amp;quot;Connect$&amp;lt;channel&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The fields are as follows:&lt;br /&gt;
* &amp;lt;channel&amp;gt; is the channel the script wants to talk on. For security, this SHOULD be randomly generated.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
$VwrComm$0$DaleGlass.Viewer$Connect$12421&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Viewer Reply ====&lt;br /&gt;
Viewer replies to the request by sending the message &amp;quot;OK&amp;quot; to the specified channel. Any other reply MUST be considered an error message.&lt;br /&gt;
&lt;br /&gt;
[[Category:Design Discussions]]&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Build_the_Viewer_on_Linux&amp;diff=23966</id>
		<title>Build the Viewer on Linux</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Build_the_Viewer_on_Linux&amp;diff=23966"/>
		<updated>2007-06-21T01:44:19Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: file dialogs don&amp;#039;t work on 64 bit system&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{CompileNav}}&lt;br /&gt;
&lt;br /&gt;
The following are instructions for building the Second Life viewer on linux. This process has been used on [http://www.debian.org/ debian] and debian based systems like [http://www.ubuntu.com/ ubuntu], and also on [http://www.fedoraproject.org/ Fedora]. For other platforms, see [[Get source and compile]].&lt;br /&gt;
&lt;br /&gt;
{{vital-info|How to compile [[Source_archive#2007-Feb-20|FL-1.13.3.58185]] and [[Source_archive#2007-Feb-24|FL-1.13.3.58390]] &#039;&#039;&#039;with&#039;&#039;&#039; llmozlib (see [[Talk:Compiling_the_viewer_%28Linux%29#llmozlib|discussion]])}}&lt;br /&gt;
&lt;br /&gt;
= Building the client =&lt;br /&gt;
To build the Second Life Viewer you will first need to install the required tools and libraries.&lt;br /&gt;
The following sections online steps to build the client from source.  To simplify building,&lt;br /&gt;
Linden labs has been nice enough to prepackage some of the libraries and bundled them up in an&lt;br /&gt;
additional tar file.&lt;br /&gt;
&lt;br /&gt;
And while The Second Life Viewer is not a trivial build, and experience with building large&lt;br /&gt;
software packages will help you greatly - but don&#039;t be daunted, it should be simple once the&lt;br /&gt;
dependencies are in the right place.&lt;br /&gt;
&lt;br /&gt;
The tasks are:&lt;br /&gt;
# Install required tools.&lt;br /&gt;
# Unpack source and art tree&#039;s from Linden Labs.&lt;br /&gt;
# Install libraries not shiped by Linden Labs.&lt;br /&gt;
# Unpack or install the other required libraries and headers.&lt;br /&gt;
# Compile.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
== Required tools ==&lt;br /&gt;
There are a number of tools that need to be installed first.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;SCons&amp;lt;/b&amp;gt; build tool [package: scons]&lt;br /&gt;
* &amp;lt;b&amp;gt;GCC 3.4&amp;lt;/b&amp;gt; C/C++ compiler&lt;br /&gt;
** [debian/ubuntu: g++-3.4]&lt;br /&gt;
** [fedora: compat-gcc-34-c++]&lt;br /&gt;
** other GCC versions are not well-tested; GCC 4.x will NOT currently build the viewer without a few simple code adjustments.&lt;br /&gt;
* &amp;lt;b&amp;gt;yacc&amp;lt;/b&amp;gt; [suggest packages: bison]&lt;br /&gt;
* &amp;lt;b&amp;gt;lex&amp;lt;/b&amp;gt; [suggest packages: flex]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Unpack the source tree ==&lt;br /&gt;
&lt;br /&gt;
You can get the source either from the source archives available at [[Source downloads]], or you can get it from [[Subversion]].&lt;br /&gt;
&lt;br /&gt;
Using a source archive is the easier option, but if you plan to do active development and want to make your own modifications, while merging LL&#039;s changes, subversion will probably be much more convenient on the long term.&lt;br /&gt;
&lt;br /&gt;
=== Getting the source from the source archives ===&lt;br /&gt;
Get the source from [[Source downloads]]. You will need all 3 archives: source, artwork and libraries.&lt;br /&gt;
&lt;br /&gt;
Choose a location and unpack the source tree and the art work.  They will be extracted into a&lt;br /&gt;
directory call &amp;lt;b&amp;gt;linden&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % tar -xzf slviewer-src-&amp;lt;version&amp;gt;.tar.gz&lt;br /&gt;
 % tar -xzf slviewer-&amp;lt;os&amp;gt;-libs-&amp;lt;version&amp;gt;.tar.gz&lt;br /&gt;
 % unzip slviewer-artwork-&amp;lt;version&amp;gt;.zip&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Getting the source from Subversion ===&lt;br /&gt;
Select a source [[Source branches|branch]] to check out.&lt;br /&gt;
&lt;br /&gt;
Check it out with:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn co http://svn.secondlife.com/svn/linden/&amp;lt;branch&amp;gt; [directory]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
If you don&#039;t specify the directory, it&#039;ll use the name of the branch as the default.&lt;br /&gt;
&lt;br /&gt;
Now you will have a directory with the source code. This only includes the source code itself, without the libraries or artwork. You will have to get them from the [[Source downloads]] and unpack them into the tree.&lt;br /&gt;
&lt;br /&gt;
If the directory SVN created is called &#039;linden&#039; then you can directly unzip and untar the archives on top of it. If it&#039;s called something else, create a symlink:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % ln -sf &amp;lt;branch&amp;gt; linden&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now unpack the libraries and artwork:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % tar -xzf slviewer-&amp;lt;os&amp;gt;-libs-&amp;lt;version&amp;gt;.tar.gz&lt;br /&gt;
 % unzip slviewer-artwork-&amp;lt;version&amp;gt;.zip&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing the required libraries (that Linden labs can not or does not provide)==&lt;br /&gt;
=== FMOD (audio) ===&lt;br /&gt;
* FMOD provides audio output, but (although &#039;free&#039; in some senses) is not itself open-source.  &amp;lt;b&amp;gt;If&amp;lt;/b&amp;gt; you wish to avoid FMOD, thus disabling audio, you may make these changes:&lt;br /&gt;
** Comment-out the libfmod line in indra/newview/viewer_manifest.py&lt;br /&gt;
** Add FMOD=no to your Scons build command when compiling the source.&lt;br /&gt;
* If you want to use FMOD, fetch and unpack &amp;lt;b&amp;gt;FMOD 3.75&amp;lt;/b&amp;gt; &amp;lt;http://www.fmod.org/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % wget http://www.fmod.org/files/fmodapi375linux.tar.gz&lt;br /&gt;
 % tar -xzvf fmodapi375linux.tar.gz&lt;br /&gt;
 % cd fmodapi375linux/&lt;br /&gt;
 % cp api/inc/* ../linden/libraries/i686-linux/include/&lt;br /&gt;
 % cp api/libfmod-3.75.so ../linden/libraries/i686-linux/lib_release_client/&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing the required dependencies (prepackaged by Linden labs)==&lt;br /&gt;
&lt;br /&gt;
The Second Life Viewer has a number of compile/link dependencies on external libraries which&lt;br /&gt;
are needed - to help you, the source download page contains a link to a &amp;lt;i&amp;gt;slviewer-linux-libs&amp;lt;/i&amp;gt; package which you unpack over the source tree to fill most of the dependencies (and thus avoid most of the fiddly work described on this page).&lt;br /&gt;
&lt;br /&gt;
If you download the libs to the top folder, where the &amp;lt;i&amp;gt;linden&amp;lt;/i&amp;gt; folder is after getting and extracting the viewer source code tarball, the following command should unpack everything to the right spot. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 tar xvfz slviewer-linux-libs-&amp;lt;version&amp;gt;.tar.gz&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you choose to use the provide libs you can skip to &lt;br /&gt;
[[Compiling_the_viewer_%28Linux%29#Compiling|Compiling the client]].&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
=== Doing yourself ===&lt;br /&gt;
If you are porting to a new architecture or wish to make a package tailored to your Linux distribution&#039;s own libraries.  You will have to install the following additional dependencies&lt;br /&gt;
listed below.  Paths and package names given here are based on Ubuntu 6.06 and may vary&lt;br /&gt;
according to your Linux distribution.&lt;br /&gt;
&lt;br /&gt;
==== List of libraries ====&lt;br /&gt;
* &amp;lt;b&amp;gt;apr-1&amp;lt;/b&amp;gt; [debian/ubuntu: libapr1.0-dev, fedora: apr-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;aprutil-1&amp;lt;/b&amp;gt; [debian/ubuntu: libaprutil1.0-dev, fedora: apr-util-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;boost&amp;lt;/b&amp;gt; [debian/ubuntu: libboost-dev, fedora: boost-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;boost-regex&amp;lt;/b&amp;gt; [debian/ubuntu: libboost-regex-dev]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;curl&amp;lt;/b&amp;gt; library at least version 7.15.4 is recommended, 7.16.x is ideal.&lt;br /&gt;
** [debian/ubuntu: libcurl-dev]&lt;br /&gt;
** fedora: curl-devel]&lt;br /&gt;
** If you are compiling your own version of &amp;lt;b&amp;gt;Curl&amp;lt;/b&amp;gt;, then you should consider configuring it to use the &amp;lt;b&amp;gt;c-ares&amp;lt;/b&amp;gt; library so that DNS lookups will be asynchronous.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;ELFIO&amp;lt;/b&amp;gt; &amp;lt;http://sourceforge.net/projects/elfio/&amp;gt;&lt;br /&gt;
** This wants to build a static library by default.  Afterwards, to create a dynamic libelfio.so&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % cd ELFIO &amp;amp;&amp;amp; g++-3.4 -shared *.o -o libelfio.so&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;expat&amp;lt;/b&amp;gt; [debian/ubuntu: libexpat1-dev, fedora: expat-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;google-perftools&amp;lt;/b&amp;gt; library for the tcmalloc and stacktrace libraries. (memory checking)&lt;br /&gt;
**[fedora: google-perftools-devel.i386]&lt;br /&gt;
**[debian/ubuntu: libgoogle-perftools-dev&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;GTK 2.x&amp;lt;/b&amp;gt; development headers&lt;br /&gt;
** [debian/ubuntu: libgtk2.0-dev&lt;br /&gt;
** [fedora: gtk2-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;jpeglib&amp;lt;/b&amp;gt;&lt;br /&gt;
**[debian/ubuntu: libjpeg62-dev]&lt;br /&gt;
**[fedora: libjpeg-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;OpenGL&amp;lt;/b&amp;gt; development headers: gl.h, glext.h, glu.h&lt;br /&gt;
**[debian/ubuntu: mesa-common-dev, libglu1-mesa-dev]&lt;br /&gt;
**[fedora: mesa-libGL-devel, mesa-libGLU-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;OpenJPEG&amp;lt;/b&amp;gt; &amp;lt;http://www.openjpeg.org/&amp;gt;&lt;br /&gt;
** note: OpenJPEG 1.1.1 or greater is required which has the macro OPJ_PATH_LEN, if the header has MAX_PATH, then upgrade or it will crash with a divide by zero error as the structures would be two different sizes.&lt;br /&gt;
*** &#039;&#039;what does this mean?&#039;&#039;&lt;br /&gt;
** 02-26-2007, another set of patches is required to Second Life to make it usable, that is fix a crash, make it look good, and speed it up.  See https://jira.secondlife.com:443/browse/VWR-123&lt;br /&gt;
*** &#039;&#039;VWR-123 has been fixed: should this note be removed?&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;SDL&amp;lt;/b&amp;gt; [libsdl1.2-dev, fedora: SDL-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;Vorbis&amp;lt;/b&amp;gt; [debian/ubuntu: libvorbis-dev, fedora: libvorbis-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;X11&amp;lt;/b&amp;gt; development headers: Xlib.h, and Xutil.h&lt;br /&gt;
**[debian/ubuntu: libx11-dev]&lt;br /&gt;
**[fedora: libX11-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;xmlrpc-epi 0.51&amp;lt;/b&amp;gt; &amp;lt;http://xmlrpc-epi.sourceforge.net/&amp;gt;&lt;br /&gt;
** note: not xmlrpc-c (xmlrpc-c has a library and headers with the same name but is not compatible)&lt;br /&gt;
** Apply patches from the instructions in [[patch xmlrpc-epi]]&lt;br /&gt;
*** &#039;&#039;does this still work?&#039;&#039;&lt;br /&gt;
** See also:&lt;br /&gt;
*** http://www.haxxed.com/rpms/secondlife/xmlrpc-epi-0.51-gcc4.1.patch&lt;br /&gt;
*** http://www.haxxed.com/rpms/secondlife/xmlrpc-epi-0.51-use-system-expat.patch&lt;br /&gt;
*** http://www.haxxed.com/rpms/secondlife/xmlrpc-epi-0.51-rename.patch&lt;br /&gt;
*** You have to regenerate autotools after applying the patches:&lt;br /&gt;
****libtoolize -c -f&lt;br /&gt;
****aclocal&lt;br /&gt;
****automake -c -a -f&lt;br /&gt;
****autoconf&lt;br /&gt;
*** The first patch fixes compiling on gcc 4. The second patch causes it to compile against the system expat, the version xmlrpc-epi comes with is broken and will not work. The last patch renames the library from xmlrpc to xmlrpc-epi, otherwise it conflicts with xmlrpc-c - which means the viewer then needs to be patched to link against xmlrpc-epi and not xmlrpc. These patches are from my Fedora package. On linux, I recommend these patches in favor of the Linden ones, as theirs seem to be for windows. (And mine actually work)&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Copy headers and libraries into the source tree ====&lt;br /&gt;
&lt;br /&gt;
Here is a guide to the sequence of shell commands needed to copy the required headers and libraries into the Second Life Viewer source tree for building.  Actual paths to system headers may vary according to Linux distribution.&lt;br /&gt;
&lt;br /&gt;
If you are using the easy &amp;lt;i&amp;gt;slviewer-linux-libs&amp;lt;/i&amp;gt; bundle then you can skip the rest of this section, &amp;lt;b&amp;gt;otherwise&amp;lt;/b&amp;gt; you will also need to perform the following:&lt;br /&gt;
&lt;br /&gt;
* ${SLSRC} refers to the top-level directory of the Second Life Viewer source tree.&lt;br /&gt;
* ${OPENJPEG} refers to the top-level directory of your completed OpenJPEG build.&lt;br /&gt;
* ${ELFIO} refers to the top-level directory of your completed ELFIO build.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 cp -a /usr/include/atk-1.0 ${SLSRC}/libraries/i686-linux/include/&lt;br /&gt;
 cp -a /usr/include/gtk-2.0 ${SLSRC}/libraries/i686-linux/include/&lt;br /&gt;
 cp -a /usr/lib/gtk-2.0/include/* ${SLSRC}/libraries/i686-linux/include/gtk-2.0/&lt;br /&gt;
 cp -a /usr/include/glib-2.0 ${SLSRC}/libraries/i686-linux/include/&lt;br /&gt;
 cp -a /usr/lib/glib-2.0/include/* ${SLSRC}/libraries/i686-linux/include/glib-2.0/&lt;br /&gt;
 cp -a /usr/include/pango-1.0 ${SLSRC}/libraries/i686-linux/include/&lt;br /&gt;
&lt;br /&gt;
if your GTK is fairly recent and thus needs Cairo:&lt;br /&gt;
 cp -a /usr/include/cairo/* ${SLSRC}/libraries/i686-linux/include&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 cp -a /usr/include/apr-1.0/ ${SLSRC}/libraries/i686-linux/include/apr-1&lt;br /&gt;
&lt;br /&gt;
 mkdir ${SLSRC}/libraries/i686-linux/include/expat&lt;br /&gt;
 cp -a /usr/include/expat*.h ${SLSRC}/libraries/i686-linux/include/expat/&lt;br /&gt;
&lt;br /&gt;
 mkdir ${SLSRC}/libraries/i686-linux/include/zlib&lt;br /&gt;
 cp -a /usr/include/zlib*.h ${SLSRC}/libraries/i686-linux/include/zlib/&lt;br /&gt;
&lt;br /&gt;
 mkdir ${SLSRC}/libraries/i686-linux/include/openjpeg&lt;br /&gt;
 cp ${OPENJPEG}/libopenjpeg/openjpeg.h ${SLSRC}/libraries/i686-linux/include/openjpeg/&lt;br /&gt;
 cp ${OPENJPEG}/libopenjpeg.a ${SLSRC}/libraries/i686-linux/lib_release_client/&lt;br /&gt;
&lt;br /&gt;
 mkdir ${SLSRC}/libraries/i686-linux/include/ELFIO&lt;br /&gt;
 cp ${ELFIO}/ELFIO/*.h ${SLSRC}/libraries/i686-linux/include/ELFIO/&lt;br /&gt;
 cp ${ELFIO}/ELFIO/libelfio.so ${SLSRC}/libraries/i686-linux/lib_release_client/&lt;br /&gt;
&lt;br /&gt;
 mkdir ${SLSRC}/libraries/i686-linux/include/jpeglib&lt;br /&gt;
 cp -a /usr/include/j*.h ${SLSRC}/libraries/i686-linux/include/jpeglib/&lt;br /&gt;
 touch ${SLSRC}/libraries/i686-linux/include/jpeglib/jinclude.h&lt;br /&gt;
&lt;br /&gt;
 mkdir ${SLSRC}/libraries/i686-linux/include/llfreetype2&lt;br /&gt;
 cp -a /usr/include/freetype2/freetype/ ${SLSRC}/libraries/i686-linux/include/llfreetype2/&lt;br /&gt;
 cp -a /usr/include/ft2build.h ${SLSRC}/libraries/i686-linux/include/llfreetype2/freetype/&lt;br /&gt;
&lt;br /&gt;
 mkdir ${SLSRC}/libraries/i686-linux/include/xmlrpc-epi&lt;br /&gt;
 cp -a /usr/include/xmlrpc*.h ${SLSRC}/libraries/i686-linux/include/xmlrpc-epi/&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Compiling ==&lt;br /&gt;
=== Build Types ===&lt;br /&gt;
The &#039;&#039;BUILD&#039;&#039; parameter specifies the build type. For normal usage, use &#039;&#039;&#039;release&#039;&#039;&#039;. If you plan to work on the source, choose &#039;&#039;&#039;releasenoopt&#039;&#039;&#039; or &#039;&#039;&#039;debug&#039;&#039;&#039;, as these versions are unoptimized and much easier to debug.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;release&#039;&#039;&#039;: Optimized build for release.&lt;br /&gt;
* &#039;&#039;&#039;releasenoopt&#039;&#039;&#039;: Unoptimized build.&lt;br /&gt;
* &#039;&#039;&#039;debug&#039;&#039;&#039;: Debug build with assertions.&lt;br /&gt;
* &#039;&#039;&#039;releasefordownload&#039;&#039;&#039;: Optimized build for release, will create a .tar.gz with the files for distribution.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
=== Building ===&lt;br /&gt;
=== Disable llMozLib ===&lt;br /&gt;
Add MOZLIB=no to your Scons build command when compiling the source.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ cd indra&lt;br /&gt;
 $ scons DISTCC=no BTARGET=client BUILD=release MOZLIB=no&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Expect a build time of a couple of hours.  The resulting unstripped Second Life Viewer binary is &amp;lt;b&amp;gt;newview/secondlife-i686-bin&amp;lt;/b&amp;gt;. Note that temporary object code is compiled into &amp;lt;b&amp;gt;/tmp/$USER&amp;lt;/b&amp;gt; by default (where $USER is your username) - this can be changed by prefixing the &amp;lt;b&amp;gt;scons&amp;lt;/b&amp;gt; command above with &amp;lt;b&amp;gt;TEMP_BUILD_DIR=&amp;quot;&amp;lt;i&amp;gt;[full directory path]&amp;lt;/i&amp;gt;&amp;quot;&amp;lt;/b&amp;gt;. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ TEMP_BUILD_DIR=&amp;quot;/home/fred/secondlife/temp-build&amp;quot; scons DISTCC=no BTARGET=client BUILD=release&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To build a release that has all of the shaders and optimizations enabled and resembles the official shipped Linux alpha client, use BUILD=releasefordownload&lt;br /&gt;
&lt;br /&gt;
Be sure to read the [[Common compilation problems]] page if you have problems - we&#039;ll try to keep the page up to date with known problems and solutions.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
== Testing and packaging the client ==&lt;br /&gt;
&lt;br /&gt;
=== Testing the result from inside the tree ===&lt;br /&gt;
&lt;br /&gt;
You may find it simpler and less error-prone to follow the instructions in the [[Compiling_the_viewer_%28Linux%29#Packaging_the_client|Packaging the client]] section below to run the client under the same conditions as an end-user would.  Otherwise:&lt;br /&gt;
&lt;br /&gt;
* Preparing to run &#039;in-tree&#039;&lt;br /&gt;
** &amp;lt;i&amp;gt;ensure that you have indra/newview/app_settings/static_*.db2&amp;lt;/i&amp;gt; - if not, you&#039;ll find it in the &#039;slviewer-artwork&#039; download (a zip file).&lt;br /&gt;
** now, from the indra directory:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ cp ../scripts/messages/message_template.msg newview/app_settings/&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Running it: The LD_LIBRARY_PATH stuff ensures that the binary looks for its libraries in the right places.  From the indra directory:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ ( cd newview &amp;amp;&amp;amp; LD_LIBRARY_PATH=../../libraries/i686-linux/lib_release_client:${LD_LIBRARY_PATH}:/usr/local/lib  ./secondlife-i686-bin )&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
==== The client seems kinda slow. ====&lt;br /&gt;
&lt;br /&gt;
By default, the open-source Second Life Viewer uses the open-source OpenJPEG library to decode the (many) JPEG-2000 texture images it receives from the servers.  This isn&#039;t quite of comparable speed to the proprietary third-party library which the Linden Lab viewer builds have traditionally used, for which we are not permitted to redistribute the source.&lt;br /&gt;
&lt;br /&gt;
However, the &amp;lt;i&amp;gt;slviewer-linux-libs&amp;lt;/i&amp;gt; package includes two pre-built libraries which facilitate the use of this slightly faster image decoding method: &amp;lt;b&amp;gt;libkdu_v42R.so&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;libllkdu.so&amp;lt;/b&amp;gt;.  These are provided for your testing; again, we are not permitted to grant you the right to re-distribute these libraries to downstream users, but the viewer will still work (albeit slightly slower) without them.&lt;br /&gt;
&lt;br /&gt;
To &amp;lt;b&amp;gt;use these faster image-decoding libraries&amp;lt;/b&amp;gt;, they simply need to be put into the right places relative to the viewer runtime directory - nothing needs to be reconfigured or recompiled.  If you&#039;re running the client from the source tree, the following will make the KDU libraries available:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 cp &amp;quot;$SLSRC/libraries/i686-linux/lib_release_client/libllkdu.so&amp;quot; &amp;quot;$SLSRC/indra/newview/libllkdu.so&amp;quot;&lt;br /&gt;
 mkdir &amp;quot;$SLSRC/indra/lib&amp;quot;&lt;br /&gt;
 cp &amp;quot;$SLSRC/libraries/i686-linux/lib_release_client/libkdu_v42R.so&amp;quot; &amp;quot;$SLSRC/indra/lib/libkdu_v42R.so&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The file &amp;lt;b&amp;gt;indra/newview/viewer_manifest.py&amp;lt;/b&amp;gt; contains some commented-out entries describing where these libraries belong; if you uncomment the two lines corresponding to libllkdu and libkdu then they will be automatically copied into the right place in the runtime directory when you follow the &#039;Packaging the client&#039; instructions below.&lt;br /&gt;
&lt;br /&gt;
==== File Dialogs Don&#039;t Work on 64 bit system ====&lt;br /&gt;
&lt;br /&gt;
If you run a 64 bit system, and your file dialogs don&#039;t work, or they worked before and stopped after you installed an update, it may be due to a mismatch between the headers used to compile the viewer and the library it&#039;s using. The log will contain something like this:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2007-06-21T01:28:35Z INFO: ll_try_gtk_init: Starting GTK Initialization.&lt;br /&gt;
2007-06-21T01:28:36Z INFO: ll_try_gtk_init: GTK Initialized.&lt;br /&gt;
2007-06-21T01:28:36Z INFO: ll_try_gtk_init: - Compiled against GTK version 2.10.11&lt;br /&gt;
2007-06-21T01:28:36Z INFO: ll_try_gtk_init: - Running against GTK version 2.10.6&lt;br /&gt;
2007-06-21T01:28:36Z WARNING: ll_try_gtk_init: - GTK COMPATIBILITY WARNING: Gtk+ version too old (micro mismatch)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What happens here is that your distribution includes 32 bit GTK libraries, but the package only includes the libraries themselves and not the headers. When building, the SL client will build against the headers included with the main 64 bit GTK package. This will work if the 64 bit version of the library is the same or older than the 32 bit one. However, if your 32 bit library is older, then the viewer will detect the mismatch (built with headers for a newer version of GTK than it&#039;s using) and turn GTK off.&lt;br /&gt;
&lt;br /&gt;
Possible solutions:&lt;br /&gt;
* Download the source for the version of the 32 bit GTK libraries your distribution comes with, and build your viewer against those headers.&lt;br /&gt;
* Upgrade your 32 bit GTK package so that it&#039;s the same or newer as the 64 bit one.&lt;br /&gt;
* Downgrade your 64 bit package (may not be a good idea).&lt;br /&gt;
&lt;br /&gt;
=== Packaging the client ===&lt;br /&gt;
&lt;br /&gt;
If you substitute &#039;BUILD=release&#039; with &#039;&amp;lt;b&amp;gt;BUILD=releasefordownload&amp;lt;/b&amp;gt;&#039; in the &#039;Compiling&#039; section above, then packaging the resulting code, libraries, data and documentation into a tarball for the end-user will be done automatically as the final stage of the build process; the pristine end-user client distribution has been assembled into the directory &amp;lt;b&amp;gt;indra/newview/SecondLife_i686_1_X_Y_Z/&amp;lt;/b&amp;gt; and has also been tarred into &amp;lt;b&amp;gt;indra/newview/SecondLife_i686_1_X_Y_Z.tar.bz2&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The file which controls what (and where) files go into the end-user runtime viewer directory is &amp;lt;b&amp;gt;indra/newview/viewer_manifest.py&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Automated libraries and headers adjustments, compilation and packaging ====&lt;br /&gt;
&lt;br /&gt;
Here is a bash script that could save you a lot of time... It basically does all what is described above, and more, and entitles you to compile a SL client very easily:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# make-SL v1.30 (c)2007 Henri Beauchamp. Released under GPL license v2:&lt;br /&gt;
# http://www.gnu.org/licenses/gpl.txt&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
######## THIS IS QUICK&#039;N DIRTY ALPHA SOFTWARE. USE AT YOUR OWN RISKS ! ########&lt;br /&gt;
###############################################################################&lt;br /&gt;
&lt;br /&gt;
# This bash script is aimed at easying up the build process of a SL client.&lt;br /&gt;
# It does not cover building it with custom/system openjpeg, elfio or fmodapi&lt;br /&gt;
# (we use the provided libraries).&lt;br /&gt;
# You may enable or disable the use of your system&#039;s library by editing&lt;br /&gt;
# the USE_SYSTEM_* variable (&amp;quot;yes&amp;quot; --&amp;gt; use the system library, &amp;quot;no&amp;quot; --&amp;gt; use&lt;br /&gt;
# LL&#039;s provided ones).&lt;br /&gt;
# The script also takes care of updating properly the viewer_manifest.py script&lt;br /&gt;
# accordingly, so that you (should) end up with a properly packaged client.&lt;br /&gt;
&lt;br /&gt;
# To use this script, simply make it executable (chmod +x make-SL) and&lt;br /&gt;
# put it into /usr/local/bin (or any other directory in your PATH).&lt;br /&gt;
# Then, download the slviewer-src-*.tar.gz, slviewer-linux-libs-*.tar.gz,&lt;br /&gt;
# slviewer-artwork-*.zip and fmodapi*.tar.gz archives, and finally, invoke&lt;br /&gt;
# make-SL as follow:&lt;br /&gt;
#   make-SL path_to_archives  (example: make-SL ~/downloads)&lt;br /&gt;
# or simply:&lt;br /&gt;
#   make-SL&lt;br /&gt;
# when invoking from the directory where the archives are.&lt;br /&gt;
# The sources will be installed into the PATH_TO_SOURCES directory,&lt;br /&gt;
# and the client will be built into the TEMP_BUILD_DIR directory.&lt;br /&gt;
# The packaged build will be moved to your home directory.&lt;br /&gt;
# If you want to retry a compilation after fixing something manually and&lt;br /&gt;
# don&#039;t want make-SL to start all over again, overwriting everything,&lt;br /&gt;
# you may invoke it with the --retry option, like this:&lt;br /&gt;
#   make-SL --retry&lt;br /&gt;
# This script has been tested by the author, on a (very customized)&lt;br /&gt;
# Mandrake 10.2 distro. Tested with SL v1.17 sources.&lt;br /&gt;
&lt;br /&gt;
# Where the sources of the client will be held (defaults to &amp;quot;./linden&amp;quot;):&lt;br /&gt;
PATH_TO_SOURCES=&amp;quot;/usr/src/SL&amp;quot;&lt;br /&gt;
# Where to build the client:&lt;br /&gt;
export TEMP_BUILD_DIR=&amp;quot;$PATH_TO_SOURCES/build&amp;quot;&lt;br /&gt;
&lt;br /&gt;
USE_SYSTEM_GTK=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_SDL=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_SSL=&amp;quot;yes&amp;quot;&lt;br /&gt;
# Beware: libdb4 makes use of libapr... so you should keep USE_SYSTEM_APR&lt;br /&gt;
# and USE_SYSTEM_DB4 in sync.&lt;br /&gt;
USE_SYSTEM_APR=&amp;quot;no&amp;quot;&lt;br /&gt;
USE_SYSTEM_DB4=&amp;quot;no&amp;quot;&lt;br /&gt;
USE_SYSTEM_OGG=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_ZLIB=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_UUID=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_CURL=&amp;quot;no&amp;quot;&lt;br /&gt;
USE_SYSTEM_EXPAT=&amp;quot;no&amp;quot;&lt;br /&gt;
USE_SYSTEM_VORBIS=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_XMLRPC=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_JPEGLIB=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_FREETYPE2=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_PERFTOOLS=&amp;quot;yes&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# You may add tune flags here, to optimize the code for your processor.&lt;br /&gt;
# Example, for an Athlon XP:&lt;br /&gt;
# TUNE_FLAGS=&amp;quot;-march=athlon-xp -mtune=athlon-xp&amp;quot;&lt;br /&gt;
TUNE_FLAGS=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Whether to build with the browser login screen or not:&lt;br /&gt;
WITH_MOZILLA=&amp;quot;yes&amp;quot;&lt;br /&gt;
&lt;br /&gt;
function update_manifest() {&lt;br /&gt;
    grep -v $1 $PATH_TO_SOURCES/indra/newview/viewer_manifest.py &amp;gt;$TEMP_BUILD_DIR/viewer_manifest.py&lt;br /&gt;
    mv -f $TEMP_BUILD_DIR/viewer_manifest.py $PATH_TO_SOURCES/indra/newview/viewer_manifest.py&lt;br /&gt;
    chmod +x $PATH_TO_SOURCES/indra/newview/viewer_manifest.py&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function compile() {&lt;br /&gt;
    cd $PATH_TO_SOURCES/indra&lt;br /&gt;
    echo &amp;quot;Compiling the client into $TEMP_BUILD_DIR...&amp;quot;&lt;br /&gt;
    scons DISTCC=no BTARGET=client BUILD=releasefordownload MOZLIB=$WITH_MOZILLA&lt;br /&gt;
    if (($? == 0)) ; then&lt;br /&gt;
        mv $PATH_TO_SOURCES/indra/newview/SecondLife*.tar.bz2 $HOME/&lt;br /&gt;
    fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if [ &amp;quot;$TEMP_BUILD_DIR&amp;quot; == &amp;quot;&amp;quot; ] ; then&lt;br /&gt;
    export TEMP_BUILD_DIR=/tmp/$USER/SL&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Check to see if we simply want to retry a compilation:&lt;br /&gt;
if [ &amp;quot;$1&amp;quot; == &amp;quot;--retry&amp;quot; ] ; then&lt;br /&gt;
    compile&lt;br /&gt;
    exit $?&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Make sure we don&#039;t unpack over an old source tree:&lt;br /&gt;
if [ -d linden ] ; then&lt;br /&gt;
    rm -rf linden/&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if [ -d $PATH_TO_SOURCES ] &amp;amp;&amp;amp; [ &amp;quot;$PATH_TO_SOURCES&amp;quot; != &amp;quot;&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$PATH_TO_SOURCES&amp;quot; != &amp;quot;/&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$PATH_TO_SOURCES&amp;quot; != &amp;quot;.&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$PATH_TO_SOURCES&amp;quot; != &amp;quot;..&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$PATH_TO_SOURCES&amp;quot; != &amp;quot;$HOME&amp;quot; ] ; then&lt;br /&gt;
    rm -rf $PATH_TO_SOURCES/&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Use the parameter (if any) as the path to the archives:&lt;br /&gt;
&lt;br /&gt;
PATH_TO_ARCHIVES=&amp;quot;.&amp;quot;&lt;br /&gt;
if [ &amp;quot;$1&amp;quot; != &amp;quot;&amp;quot; ]; then&lt;br /&gt;
    if [ -d $1 ] ; then&lt;br /&gt;
        PATH_TO_ARCHIVES=$1&lt;br /&gt;
    fi&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s first unpack everything:&lt;br /&gt;
if ! [ -f $PATH_TO_ARCHIVES/slviewer-src-*.tar.gz ] ; then&lt;br /&gt;
    echo &amp;quot;You need slviewer-src !&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
if ! [ -f $PATH_TO_ARCHIVES/slviewer-linux-libs-*.tar.gz ] ; then&lt;br /&gt;
    echo &amp;quot;You need slviewer-linux-libs !&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
if ! [ -f $PATH_TO_ARCHIVES/slviewer-artwork-*.zip ] ; then&lt;br /&gt;
    echo &amp;quot;You need slviewer-artwork !&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
if ! [ -f $PATH_TO_ARCHIVES/fmodapi*.tar.gz ] ; then&lt;br /&gt;
    echo &amp;quot;You need fmodapi !&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
echo &amp;quot;Extracting the files from the archives...&amp;quot;&lt;br /&gt;
tar xzf $PATH_TO_ARCHIVES/slviewer-src-*.tar.gz&lt;br /&gt;
tar xzf $PATH_TO_ARCHIVES/slviewer-linux-libs-*.tar.gz&lt;br /&gt;
unzip $PATH_TO_ARCHIVES/slviewer-artwork-*.zip &amp;gt;/dev/null&lt;br /&gt;
tar xzf $PATH_TO_ARCHIVES/fmodapi*.tar.gz&lt;br /&gt;
&lt;br /&gt;
# fmodapi:&lt;br /&gt;
echo &amp;quot;Copying fmodapi files...&amp;quot;&lt;br /&gt;
cp -a fmodapi*/api/inc/* linden/libraries/i686-linux/include/&lt;br /&gt;
cp fmodapi*/api/libfmod-*.so linden/libraries/i686-linux/lib_release_client/&lt;br /&gt;
rm -rf fmodapi*/&lt;br /&gt;
&lt;br /&gt;
# Move the sources to where we want to hold them:&lt;br /&gt;
if [ &amp;quot;$PATH_TO_SOURCES&amp;quot; != &amp;quot;linden&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$PATH_TO_SOURCES&amp;quot; != &amp;quot;&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Moving the sources to $PATH_TO_SOURCES...&amp;quot;&lt;br /&gt;
    mv -f linden $PATH_TO_SOURCES&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s own the files:&lt;br /&gt;
chown -R $USER: $PATH_TO_SOURCES/&lt;br /&gt;
&lt;br /&gt;
# Make a clean build:&lt;br /&gt;
if [ -d $TEMP_BUILD_DIR ] &amp;amp;&amp;amp; [ &amp;quot;$TEMP_BUILD_DIR&amp;quot; != &amp;quot;&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$TEMP_BUILD_DIR&amp;quot; != &amp;quot;/&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$TEMP_BUILD_DIR&amp;quot; != &amp;quot;.&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$TEMP_BUILD_DIR&amp;quot; != &amp;quot;..&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$TEMP_BUILD_DIR&amp;quot; != &amp;quot;$HOME&amp;quot; ] ; then&lt;br /&gt;
    rm -rf $TEMP_BUILD_DIR/&lt;br /&gt;
fi&lt;br /&gt;
mkdir -p $TEMP_BUILD_DIR&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system GTK+ if available:&lt;br /&gt;
if [ -d /usr/include/atk-1.0 ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_GTK&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system GTK+...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries/i686-linux/include&lt;br /&gt;
    rm -rf atk-1.0/ gtk-2.0/ glib-2.0/ pango-1.0/&lt;br /&gt;
    rm -f ../lib_release_client/libgtk*&lt;br /&gt;
    cp -a /usr/include/atk-1.0 .&lt;br /&gt;
    cp -a /usr/include/gtk-2.0 .&lt;br /&gt;
    cp -a /usr/lib/gtk-2.0/include/* gtk-2.0/&lt;br /&gt;
    cp -a /usr/include/glib-2.0 .&lt;br /&gt;
    cp -a /usr/lib/glib-2.0/include/* glib-2.0/&lt;br /&gt;
    cp -a /usr/include/pango-1.0 .&lt;br /&gt;
    if [ -d /usr/include/cairo ] ; then&lt;br /&gt;
        cp -a /usr/include/cairo/* .&lt;br /&gt;
    fi&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system freetype2 if available:&lt;br /&gt;
if [ -f /usr/include/ft2build.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_FREETYPE2&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system freetype2...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/freetype/ i686-linux/include/llfreetype2/*&lt;br /&gt;
    rm -f include/ft2build.h i686-linux/lib_release_client/libfreetype.a&lt;br /&gt;
    cp -a /usr/include/freetype2/freetype/ i686-linux/include/llfreetype2/&lt;br /&gt;
    cp -a /usr/include/ft2build.h i686-linux/include/llfreetype2/freetype/&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system zlib if available:&lt;br /&gt;
if [ -f /usr/include/zlib.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_ZLIB&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system zlib...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/zlib/&lt;br /&gt;
    mkdir -p i686-linux/include/zlib&lt;br /&gt;
    cp -a /usr/include/zlib*.h i686-linux/include/zlib/&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system jpeglib if available:&lt;br /&gt;
if [ -f /usr/include/jpeglib.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_JPEGLIB&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system jpeglib...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/jpeglib/ i686-linux/lib_release_client/libjpeg.a&lt;br /&gt;
    mkdir -p i686-linux/include/jpeglib&lt;br /&gt;
    cp -a /usr/include/j*.h i686-linux/include/jpeglib/&lt;br /&gt;
    touch i686-linux/include/jpeglib/jinclude.h&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system xmlrpc-epi if available:&lt;br /&gt;
if [ -f /usr/include/xmlrpc.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_XMLRPC&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system xmlrpc-epi...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/xmlrpc-epi/ i686-linux/lib_release_client/libxmlrpc.a&lt;br /&gt;
    mkdir -p i686-linux/include/xmlrpc-epi&lt;br /&gt;
    cp -a /usr/include/xmlrpc*.h i686-linux/include/xmlrpc-epi/&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system ogg if available:&lt;br /&gt;
if [ -f /usr/include/ogg/ogg.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_OGG&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system ogg...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/ogg/ i686-linux/lib_release_client/libogg*&lt;br /&gt;
    update_manifest libogg&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system vorbis if available:&lt;br /&gt;
if [ -f /usr/include/vorbis/vorbisenc.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_VORBIS&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system vorbis...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/vorbis/ i686-linux/lib_release_client/libvorbis*&lt;br /&gt;
    update_manifest libvorbis&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system SDL if available:&lt;br /&gt;
if [ -f /usr/include/SDL/SDL.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_SDL&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system SDL...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries/i686-linux&lt;br /&gt;
    rm -rf include/SDL/ lib_release_client/libSDL*&lt;br /&gt;
    update_manifest libSDL&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system openssl if available:&lt;br /&gt;
if [ -f /usr/lib/libssl.so.0.9.7 ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_SSL&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system openssl...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries/i686-linux/lib_release_client&lt;br /&gt;
    rm -f libssl.* libcrypto.*&lt;br /&gt;
    update_manifest libssl&lt;br /&gt;
    update_manifest libcrypto&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system apr if available:&lt;br /&gt;
if [ -f /usr/include/apr*/apr.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_APR&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system apr...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries/i686-linux&lt;br /&gt;
    rm -rf include/apr-1/*&lt;br /&gt;
    rm -f lib_release_client/libapr*&lt;br /&gt;
    cp -a /usr/include/apr*/* include/apr-1/&lt;br /&gt;
    update_manifest libapr&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system expat if available:&lt;br /&gt;
if [ -f /usr/include/expat.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_EXPAT&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system expat...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/expat/&lt;br /&gt;
    rm -f i686-linux/lib_release_client/libexpat*&lt;br /&gt;
    mkdir -p i686-linux/include/expat&lt;br /&gt;
    cp -a /usr/include/expat*.h i686-linux/include/expat/&lt;br /&gt;
    update_manifest libexpat&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system curl if available:&lt;br /&gt;
if [ -f /usr/include/curl/curl.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_CURL&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system curl...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/curl/&lt;br /&gt;
    rm -f i686-linux/lib_release_client/libcurl.*&lt;br /&gt;
    update_manifest libcurl&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system db4 if available:&lt;br /&gt;
if [ -f /usr/lib/libdb-4.2.so ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_DB4&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system db4...&amp;quot;&lt;br /&gt;
    rm -f $PATH_TO_SOURCES/libraries/i686-linux/lib_release_client/libdb*.so&lt;br /&gt;
    update_manifest libdb&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system uuid if available:&lt;br /&gt;
if [ -f /lib/libuuid.so.1 ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_UUID&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system libuuid...&amp;quot;&lt;br /&gt;
    rm -f $PATH_TO_SOURCES/libraries/i686-linux/lib_release_client/libuuid.*&lt;br /&gt;
    update_manifest libuuid&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if grep tcmalloc $PATH_TO_SOURCES/indra/SConstruct &amp;amp;&amp;gt;/dev/null ; then&lt;br /&gt;
    if [ -f /usr/include/google/malloc_hook.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_PERFTOOLS&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
        echo &amp;quot;Using the system google-perftools...&amp;quot;&lt;br /&gt;
        cd $PATH_TO_SOURCES/libraries/i686-linux&lt;br /&gt;
        rm -f lib_release_client/libtcmalloc.* lib_release_client/libstacktrace.*&lt;br /&gt;
        rm -rf include/google/&lt;br /&gt;
        cp -a /usr/lib/libstacktrace.* /usr/lib/libtcmalloc.so* lib_release_client/&lt;br /&gt;
        cp -a /usr/include/google include/&lt;br /&gt;
        update_manifest tcmalloc&lt;br /&gt;
        update_manifest stacktrace&lt;br /&gt;
    else&lt;br /&gt;
        # Remove the google-perftools stuff if not present in the libraries package&lt;br /&gt;
        # (problem seen in SL v1.17):&lt;br /&gt;
        if ! [ -f $PATH_TO_SOURCES/libraries/i686-linux/lib_release_client/libtcmalloc.so* ] ; then&lt;br /&gt;
            update_manifest tcmalloc&lt;br /&gt;
            update_manifest stacktrace&lt;br /&gt;
            # The following lines remove the&lt;br /&gt;
            #   &amp;quot;external_libs += [&#039;tcmalloc&#039;, &#039;stacktrace&#039;]&amp;quot;&lt;br /&gt;
            # line from SConstruct... and many other lines which renders SConstruct&lt;br /&gt;
            # unusable to build anything else than the client... this is a quick&#039;n&lt;br /&gt;
            # dirty patch. :-P&lt;br /&gt;
            grep -v tcmalloc $PATH_TO_SOURCES/indra/SConstruct &amp;gt;$TEMP_BUILD_DIR/SConstruct&lt;br /&gt;
            mv -f $TEMP_BUILD_DIR/SConstruct $PATH_TO_SOURCES/indra/SConstruct&lt;br /&gt;
        fi&lt;br /&gt;
    fi&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Update the manifest file and enable libkdu packaging. I&#039;m too lazy to use&lt;br /&gt;
# awk or perl, here, but that&#039;s indeed what should be done...&lt;br /&gt;
# The following (very dirty) code may break at some point, depending on what&lt;br /&gt;
# LL will put in comments in the manifest file...&lt;br /&gt;
# First, remove the lines with libstdc++.so.6 and the crash logger:&lt;br /&gt;
update_manifest libstdc&lt;br /&gt;
update_manifest crash_logger&lt;br /&gt;
# Now, any line with a &#039;#&#039; followed with several spaces _should_ be dealing&lt;br /&gt;
# with the libkdu stuff... So, we simply remove the &#039;#&amp;quot;...&lt;br /&gt;
sed -e &amp;quot;s/#        them/# them/&amp;quot; $PATH_TO_SOURCES/indra/newview/viewer_manifest.py &amp;gt;$TEMP_BUILD_DIR/viewer_manifest.py&lt;br /&gt;
sed -e &amp;quot;s/#   /   /&amp;quot; $TEMP_BUILD_DIR/viewer_manifest.py &amp;gt;$PATH_TO_SOURCES/indra/newview/viewer_manifest.py&lt;br /&gt;
#mv -f $TEMP_BUILD_DIR/viewer_manifest.py $PATH_TO_SOURCES/indra/newview/viewer_manifest.py&lt;br /&gt;
chmod +x $PATH_TO_SOURCES/indra/newview/viewer_manifest.py&lt;br /&gt;
&lt;br /&gt;
# Missing file... at least in v1.17.&lt;br /&gt;
touch $PATH_TO_SOURCES/indra/newview/secondlife-i686.supp&lt;br /&gt;
&lt;br /&gt;
# Add tune flags, if any:&lt;br /&gt;
if [ &amp;quot;$TUNE_FLAGS&amp;quot; != &amp;quot;&amp;quot; ] ; then&lt;br /&gt;
    sed -e &amp;quot;s/-O2/-O2 $TUNE_FLAGS/&amp;quot; $PATH_TO_SOURCES/indra/SConstruct &amp;gt;$TEMP_BUILD_DIR/SConstruct&lt;br /&gt;
    mv -f $TEMP_BUILD_DIR/SConstruct $PATH_TO_SOURCES/indra/SConstruct&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
compile&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FreeBSD ==&lt;br /&gt;
&lt;br /&gt;
A list of patches is given for [[Compiling the viewer (FreeBSD)]].&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Dale_Glass&amp;diff=23820</id>
		<title>User:Dale Glass</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Dale_Glass&amp;diff=23820"/>
		<updated>2007-06-19T20:20:51Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: SVN source loading script&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Evil Scripter and RL programmer.&lt;br /&gt;
&lt;br /&gt;
Currently working on adding an avatar scanner to the SL client.&lt;br /&gt;
&lt;br /&gt;
http://daleglass.net/images/screenshots/avlist6_001.jpg&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Shows a list of all avatars known to the client. This can be easily more than a standard 96m scanner, and seems to depend on rendering distance.&lt;br /&gt;
&lt;br /&gt;
* Keeps an internal list of avatars, and continues showing avatars that disappeared in the list for several seconds to give people time to perform some action on them (intended to make it easier to deal with griefers that do something nasty, then teleport out)&lt;br /&gt;
&lt;br /&gt;
* Shows Linden accounts in bold. This will be expanded later to highlight people who are very new, don&#039;t have a credit card on file, etc depending on user configuration.&lt;br /&gt;
&lt;br /&gt;
* Allows easy access to IM, profiles, etc&lt;br /&gt;
&lt;br /&gt;
* Allows to start a conference to multiple avatars around you, the same way it works in the friends list.&lt;br /&gt;
&lt;br /&gt;
* Allows tracking an avatar by placing a beacon on it. In the case the selected avatar isn&#039;t a friend who gave map location permission, it works anyway by placing a beacon on the avatar&#039;s last known position. This of course only works so long the avatar being tracked is near enough to be seen by the user.&lt;br /&gt;
&lt;br /&gt;
* Automatically retrieves the birth date, account type and payment data for all users shown. The data is of course cached, and if this is too much of an extra load, I&#039;ll implement a permanent on-disk cache. If data doesn&#039;t arrive, it will retry with an exponential backoff (starting from 1 minute, doubling until 30 minutes)&lt;br /&gt;
&lt;br /&gt;
* Displays activity status: new, left the area, emitting particles, moving, playing sound&lt;br /&gt;
&lt;br /&gt;
* Allows moving the camera to the avatar with a double click, as well as cycling the camera between all or only the marked avatars&lt;br /&gt;
&lt;br /&gt;
* Partial TrustNet integration: retrieves scores, but can&#039;t rate yet&lt;br /&gt;
&lt;br /&gt;
What is not done yet, but will be:&lt;br /&gt;
&lt;br /&gt;
* Integration with my TrustNet system. See here for details:&lt;br /&gt;
http://daleglass.net/tikiwiki/tiki-index.php?page=TrustNetAvatarScanner&lt;br /&gt;
http://daleglass.net/tikiwiki/tiki-index.php?page=HowTrustNetWorks&lt;br /&gt;
&lt;br /&gt;
* Integration with resident-run databases. For example, I&#039;ve been asked whether I could make it automatically query a website with a database of buyers to be able to tell people who are using avatars made with copybot, for instance.&lt;br /&gt;
&lt;br /&gt;
* Buttons for administrative actions such as ban/eject/freeze/etc&lt;br /&gt;
&lt;br /&gt;
* Add activity status for typing and rezzing objects&lt;br /&gt;
&lt;br /&gt;
* Also longer term, option to make the client stop rendering an avatar completely.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Jira Reporter}}&lt;br /&gt;
&lt;br /&gt;
== Scripts ==&lt;br /&gt;
&lt;br /&gt;
* http://daleglass.net/scripts/load_archive.pl -- Script for loading source archives into Subversion. See comments in the source for usage.&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Source_version_control&amp;diff=23817</id>
		<title>Source version control</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Source_version_control&amp;diff=23817"/>
		<updated>2007-06-19T19:24:16Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: distributed development, smerge sections&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;One of the problems in making large changes to the Second Life source is keeping track of changes, in order to be able to generate patches to submit. Also longer term, some way of keeping up with LL&#039;s changes to the source is needed. This page is an attempt to explain how to do that.&lt;br /&gt;
&lt;br /&gt;
== Ad-hoc ==&lt;br /&gt;
If you&#039;re not familiar with any source control systems, you can try to not use any, and instead just use the diff and patch utilities. This approach is very strongly discouraged because it doesn&#039;t scale at all. Nevertheless, it works OK for smaller things, like 1 line fixes to the source.&lt;br /&gt;
&lt;br /&gt;
First, create a copy of the source:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % cp -Rdp linden linden.orig&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Do some work on the linden directory. To make a patch use &#039;diff -u&#039;:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % diff -ru linden.orig linden &amp;gt; my_modification.patch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keep the patch around. If LL releases a new version you can apply it to the new source:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % cd linden&lt;br /&gt;
 % patch -p0 &amp;lt; ../my_modification.patch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This method has many disadvantages: it wastes huge amounts of disk space, is inefficient and error prone.&lt;br /&gt;
&lt;br /&gt;
== Subversion ==&lt;br /&gt;
Subversion is a much better option. However, it presents a bigger problem. LL offers a readonly [[Subversion]] repository that you can use to get the latest source. However, since you can&#039;t commit to it, you&#039;ll need to copy the source into your own repository. First, of all, you need to create your own repository. If you have several computers, you should do this on a machine you can reach from anywhere you might want to do development. Ideally it should be a machine accessible from the Internet.&lt;br /&gt;
&lt;br /&gt;
For the purposes of the explanation, I will assume that your SVN repository is accessible through a web server at http://svn.example.com/secondlife. Check the Subversion manual for more information of how to access a repository.&lt;br /&gt;
&lt;br /&gt;
=== Getting started ===&lt;br /&gt;
First, create a repository somewhere convenient. /var/lib is a common location for a server setup, but you can choose any other.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svnadmin create /var/lib/svn/secondlife&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now create a local directory with the initial files. By convention, SVN repositories generally have &amp;quot;tags&amp;quot;, &amp;quot;branches&amp;quot; and &amp;quot;trunk&amp;quot; directories at the top level. We won&#039;t create trunk yet. The main development happens in trunk. The &#039;vendor&#039; directory is for holding the original SL source, with the latest version in vendor/current, and a tag in /vendor per SL release.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % mkdir tags&lt;br /&gt;
 % mkdir branches&lt;br /&gt;
 % mkdir vendor&lt;br /&gt;
 % mkdir vendor/current&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Import the basic structure into your SVN repository:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn import -m &amp;quot;Initial import&amp;quot; http://svn.example.com/secondlife&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now move the original directory out of the way, and check it out:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn co http://svn.example.com/secondlife&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Importing the source ===&lt;br /&gt;
Now you have a working copy with the empty structure. Here comes the complicated part, how to integrate LL&#039;s source there and keep it up to date. Doing this is harder than it sounds, because you need to add new files, remove deleted ones, and keep track of renamed ones (if possible). The easiest way to do that is to use the svn-load-dirs utility.&lt;br /&gt;
&lt;br /&gt;
First of all, get the SL source. Get the archive and extract it. I recommend checking in only the source package, and leaving the art and libraries out of the repository. The art is best left out because it&#039;s big and will slow things down if your SVN repository is located for instance on a shared hosting server. The libraries must be left out if you intend to let anybody else access your repository because some libraries in the archive can&#039;t be redistributed.&lt;br /&gt;
&lt;br /&gt;
You should now have a &amp;quot;linden&amp;quot; directory with the source code. Now use svn-load-dirs to load it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn-load-dirs -t 1.17.0.12 http://svn.example.com/vendor current linden&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your repository is accessed through the internet, this can take a while (even hours)&lt;br /&gt;
&lt;br /&gt;
This will load the source from the linden directory, into http://svn.example.com/vendor/current, and at the same time create a tag in http://svn.example.com/vendor/1.17.0.12. The tag is a very good idea as it allows comparing LL releases easily, makes it easy to determine the last version you merged, and simplifies keeping up with LL releases a lot.&lt;br /&gt;
&lt;br /&gt;
Now from your working copy, run &amp;quot;svn update&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn update&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will bring it up to date, and fetch the recently imported LL source. Now you can start your own branch:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn copy vendor/current trunk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you have the trunk branch for working in.&lt;br /&gt;
&lt;br /&gt;
=== Merging LL releases ===&lt;br /&gt;
First, repeat the svn-load-dirs step above. Then you can merge the new changes into trunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn merge http://svn.example.com/vendor/&amp;lt;previously_merged_release&amp;gt; http://svn.example.com/vendor/current trunk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now the new LL changes will be merged with your code. You can then &amp;quot;svn diff vendor/current trunk&amp;quot; to get a patch to submit.&lt;br /&gt;
&lt;br /&gt;
== SVK ==&lt;br /&gt;
&lt;br /&gt;
The above method is workable, but it&#039;s not ideal, because SVN uses a centralized model. To use Subversion ideally you&#039;d need to have commit access on the LL server. While it&#039;s possible you might get it, not everybody will, and you almost certainly won&#039;t get it immediately. Since you can&#039;t use the server directly, svn-load-dirs is a required hack. It&#039;s definitely not ideal. svn-load-dirs loses the history from the original server, and can&#039;t properly track renames (it will ask you, and you&#039;ll have to figure out somehow).&lt;br /&gt;
&lt;br /&gt;
=== Distributed Development ===&lt;br /&gt;
Unlike systems like SVN and CVS, SVK is made for distributed development. In a distributed system there&#039;s no central server. The &amp;quot;official&amp;quot; server if there is such a thing is only official because people choose to believe it is, not because there&#039;s anything special about it. Whatever external servers you mirror with SVK are only accessed when you tell to SVK to sync with the server. The rest of the time, no network connection is needed, even for using commands like &amp;quot;svk log&amp;quot; and &amp;quot;svk blame&amp;quot; which would require a connection with SVN. This is possible because SVK mirrors the whole repository locally.&lt;br /&gt;
&lt;br /&gt;
SVK makes it very convenient to keep in sync with external SVN servers. With just one command it&#039;ll fetch all the new revisions from a SVN server. Then you can do the actual merging and conflict resolution offline. Once you&#039;re done merging, you can push the changes to your own server. Another user could then use your server as a base for their code, and so on.&lt;br /&gt;
&lt;br /&gt;
=== Smart Merge ===&lt;br /&gt;
The &amp;quot;smerge&amp;quot; or &amp;quot;sm&amp;quot; command is used very often when working with SVK. It&#039;s similar to the &amp;quot;svn merge&amp;quot; command in that it merges changes from one branch to another. However, &amp;quot;smerge&amp;quot; is much smarter than SVN&#039;s version. While the &amp;quot;svn merge&amp;quot; needs to be given a revision range or two branches so that it can compute what to merge, &amp;quot;svk smerge&amp;quot; automatically figures out, by finding the common ancestor of the branch you&#039;re merging from, and the branch you&#039;re merging to.&lt;br /&gt;
&lt;br /&gt;
For example, suppose this scenario: We have the original source in /vendor/current, a branch /branches/foo, and trunk /trunk. Both /branches/foo and /trunk were created from /vendor/current at some point.&lt;br /&gt;
&lt;br /&gt;
With SVN, we can merge the changes introduced in the &amp;quot;foo&amp;quot; branch into trunk like this:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn merge http://svn.example.com/vendor/current http://svn.example.com/branches/foo trunk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now suppose that after the merge is done, somebody commits a new change to /branches/foo. With SVN we&#039;ve now lost the ability to do an easy merge. Repeating the above command again would try to merge changes that were already merged, plus the newly committed changes. To correctly merge only the newly committed code, we must figure out what was the last revision we merged, and start from there.&lt;br /&gt;
&lt;br /&gt;
SVK is much more clever in this respect. Here&#039;s how you&#039;d do that:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk merge //project/branches/foo //project/trunk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice how we don&#039;t specify the vendor branch here. This is because SVK already knows what is the ancestor of both branches, and automatically figures out what to merge into trunk. Once you run this command, it&#039;ll record that as the last merge point. Repeating the command immediately would succeed without doing anything, because there aren&#039;t any new changes to merge. If something new is committed into //project/branches/foo, then only that would be merged.&lt;br /&gt;
&lt;br /&gt;
This makes working with branches much easier in SVK. While with SVN you&#039;d need to keep track of what you merged where, SVK does it for you.&lt;br /&gt;
&lt;br /&gt;
=== Getting started ===&lt;br /&gt;
First of all, you need to mirror the SVN repository. This takes quite some time, but only needs to be done once. Run this command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk mirror http://svn.secondlife.com/svn/linden //mirror/secondlife&lt;br /&gt;
 % svk sync //mirror/secondlife&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will make SVK read the whole LL repository, with all its branches and revisions and store them on your hard disk (in your home directory).&lt;br /&gt;
&lt;br /&gt;
When you&#039;re done, do the same to a repository you can write to (since you can&#039;t write to the LL one):&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk mirror http://svn.example.com/sl //mirror/myproject&lt;br /&gt;
 % svk sync //mirror/myproject&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//mirror/secondlife and //mirror/myproject are special paths used by SVK. They&#039;re links to the actual repositories. Doing something to //mirror/myproject would result in changes being sent to your SVN server.&lt;br /&gt;
&lt;br /&gt;
=== Creating the first branch ===&lt;br /&gt;
First, copy the branch you want to work with to your own server:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk mkdir //mirror/myproject/branches&lt;br /&gt;
 % svk mkdir //mirror/myproject/branches/buildfixes&lt;br /&gt;
 % svk smerge -B //mirror/secondlife/release //mirror/myproject/branches/buildfixes&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;smerge&amp;quot; stands for &amp;quot;smart merge&amp;quot; and is a very cool thing. It intelligently merges starting from the part where you left. Since there&#039;s no common ancestor to both //mirror/secondlife/release and //mirror/myproject/branches/buildfixes (there can&#039;t be, since buildfixes is empty), you need to tell it to merge everything with the -B argument. After this initial step, further merges can be performed automatically.&lt;br /&gt;
&lt;br /&gt;
Here we&#039;re creating a &amp;quot;buildfixes&amp;quot; branch on our own server, starting from the LL release source. I use the &amp;quot;buildfixes&amp;quot; branch as a starting point for all the others. It contains only the changes needed to get the source to build.&lt;br /&gt;
&lt;br /&gt;
=== Creating local branches ===&lt;br /&gt;
A very good thing about SVK is that you can do useful work without a network connection. First, we&#039;ll create copies of the repositories for local use:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk copy //mirror/secondlife //ll/&lt;br /&gt;
 % svk copy //mirror/myproject //myproject/&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Changes made to these aren&#039;t automatically propagated to the SVN servers. They&#039;re remembered until you want to push them to the server. This means that you can sit on a plane without any sort of network connection, and still use the usual SVN commands -- check the log, commit, revert changes, etc.&lt;br /&gt;
&lt;br /&gt;
=== Creating a new development branch ===&lt;br /&gt;
Now that the buildfixes branch is created, we can create another starting from it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk mkdir //myproject/trunk&lt;br /&gt;
 % svk smerge -B //myproject/branches/buildfixes //myproject/trunk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice how this time there won&#039;t be any network access. To push the changes to your server, do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk smerge //myproject //mirror/myproject&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now suppose you updated the buildfixes branch, and want to propagate the changes. It&#039;s simple:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk smerge //myproject/branches/buildfixes //myproject/trunk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
svk smerge keeps track of what was the last merge, and it automatically merges changes that weren&#039;t merged yet. Unlike with SVN, you don&#039;t need to keep track of revision numbers of make tags, it automatically does the right thing for you.&lt;br /&gt;
&lt;br /&gt;
=== Merging new LL code ===&lt;br /&gt;
Now suppose LL releases a new revision and you want to merge it with your changes. This is easy:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk sync //mirror/secondlife&lt;br /&gt;
 % svk smerge //mirror/secondlife //ll&lt;br /&gt;
 % svk smerge //mirror/secondlife //myproject/branches/buildfixes&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since the buildfixes branch changed, you can propagate the changes further to the trunk branch:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk smerge //myproject/branches/buildfixes //myproject/trunk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And push it to your SVN server:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk smerge //myproject //mirror/myproject&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Source_version_control&amp;diff=23782</id>
		<title>Source version control</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Source_version_control&amp;diff=23782"/>
		<updated>2007-06-19T10:12:41Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: sections&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;One of the problems in making large changes to the Second Life source is keeping track of changes, in order to be able to generate patches to submit. Also longer term, some way of keeping up with LL&#039;s changes to the source is needed. This page is an attempt to explain how to do that.&lt;br /&gt;
&lt;br /&gt;
== Ad-hoc ==&lt;br /&gt;
If you&#039;re not familiar with any source control systems, you can try to not use any, and instead just use the diff and patch utilities. This approach is very strongly discouraged because it doesn&#039;t scale at all. Nevertheless, it works OK for smaller things, like 1 line fixes to the source.&lt;br /&gt;
&lt;br /&gt;
First, create a copy of the source:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % cp -Rdp linden linden.orig&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Do some work on the linden directory. To make a patch use &#039;diff -u&#039;:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % diff -ru linden.orig linden &amp;gt; my_modification.patch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keep the patch around. If LL releases a new version you can apply it to the new source:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % cd linden&lt;br /&gt;
 % patch -p0 &amp;lt; ../my_modification.patch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This method has many disadvantages: it wastes huge amounts of disk space, is inefficient and error prone.&lt;br /&gt;
&lt;br /&gt;
== Subversion ==&lt;br /&gt;
Subversion is a much better option. However, it presents a bigger problem. LL offers a readonly [[Subversion]] repository that you can use to get the latest source. However, since you can&#039;t commit to it, you&#039;ll need to copy the source into your own repository. First, of all, you need to create your own repository. If you have several computers, you should do this on a machine you can reach from anywhere you might want to do development. Ideally it should be a machine accessible from the Internet.&lt;br /&gt;
&lt;br /&gt;
For the purposes of the explanation, I will assume that your SVN repository is accessible through a web server at http://svn.example.com/secondlife. Check the Subversion manual for more information of how to access a repository.&lt;br /&gt;
&lt;br /&gt;
=== Getting started ===&lt;br /&gt;
First, create a repository somewhere convenient. /var/lib is a common location for a server setup, but you can choose any other.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svnadmin create /var/lib/svn/secondlife&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now create a local directory with the initial files. By convention, SVN repositories generally have &amp;quot;tags&amp;quot;, &amp;quot;branches&amp;quot; and &amp;quot;trunk&amp;quot; directories at the top level. We won&#039;t create trunk yet. The main development happens in trunk. The &#039;vendor&#039; directory is for holding the original SL source, with the latest version in vendor/current, and a tag in /vendor per SL release.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % mkdir tags&lt;br /&gt;
 % mkdir branches&lt;br /&gt;
 % mkdir vendor&lt;br /&gt;
 % mkdir vendor/current&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Import the basic structure into your SVN repository:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn import -m &amp;quot;Initial import&amp;quot; http://svn.example.com/secondlife&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now move the original directory out of the way, and check it out:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn co http://svn.example.com/secondlife&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Importing the source ===&lt;br /&gt;
Now you have a working copy with the empty structure. Here comes the complicated part, how to integrate LL&#039;s source there and keep it up to date. Doing this is harder than it sounds, because you need to add new files, remove deleted ones, and keep track of renamed ones (if possible). The easiest way to do that is to use the svn-load-dirs utility.&lt;br /&gt;
&lt;br /&gt;
First of all, get the SL source. Get the archive and extract it. I recommend checking in only the source package, and leaving the art and libraries out of the repository. The art is best left out because it&#039;s big and will slow things down if your SVN repository is located for instance on a shared hosting server. The libraries must be left out if you intend to let anybody else access your repository because some libraries in the archive can&#039;t be redistributed.&lt;br /&gt;
&lt;br /&gt;
You should now have a &amp;quot;linden&amp;quot; directory with the source code. Now use svn-load-dirs to load it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn-load-dirs -t 1.17.0.12 http://svn.example.com/vendor current linden&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your repository is accessed through the internet, this can take a while (even hours)&lt;br /&gt;
&lt;br /&gt;
This will load the source from the linden directory, into http://svn.example.com/vendor/current, and at the same time create a tag in http://svn.example.com/vendor/1.17.0.12. The tag is a very good idea as it allows comparing LL releases easily, makes it easy to determine the last version you merged, and simplifies keeping up with LL releases a lot.&lt;br /&gt;
&lt;br /&gt;
Now from your working copy, run &amp;quot;svn update&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn update&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will bring it up to date, and fetch the recently imported LL source. Now you can start your own branch:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn copy vendor/current trunk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you have the trunk branch for working in.&lt;br /&gt;
&lt;br /&gt;
=== Merging LL releases ===&lt;br /&gt;
First, repeat the svn-load-dirs step above. Then you can merge the new changes into trunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn merge http://svn.example.com/vendor/&amp;lt;previously_merged_release&amp;gt; http://svn.example.com/vendor/current trunk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now the new LL changes will be merged with your code. You can then &amp;quot;svn diff vendor/current trunk&amp;quot; to get a patch to submit.&lt;br /&gt;
&lt;br /&gt;
== SVK ==&lt;br /&gt;
&lt;br /&gt;
The above method is workable, but it&#039;s not ideal, because SVN uses a centralized model. To use Subversion ideally you&#039;d need to have commit access on the LL server. While it&#039;s possible you might get it, not everybody will, and you almost certainly won&#039;t get it immediately. Since you can&#039;t use the server directly, svn-load-dirs is a required hack. It&#039;s definitely not ideal. svn-load-dirs loses the history from the original server, and can&#039;t properly track renames (it will ask you, and you&#039;ll have to figure out somehow).&lt;br /&gt;
&lt;br /&gt;
An alternative is SVK. SVK is a distributed source control system based on SVN. In a distributed system there&#039;s no central server. The &amp;quot;official&amp;quot; server if there is such a thing is only official because people choose to believe it is, not because there&#039;s anything special about it.&lt;br /&gt;
&lt;br /&gt;
A crucial difference is that SVK can mirror the LL SVN repository, keeping all the data about revisions, with one command. Then you can make your changes to that, and push them to your own SVN server. If you make that available, somebody could mirror that, and so on. SVK makes it very convenient for people to create their own branches based on bits from here and there. &lt;br /&gt;
&lt;br /&gt;
=== Getting started ===&lt;br /&gt;
First of all, you need to mirror the SVN repository. This takes quite some time, but only needs to be done once. Run this command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk mirror http://svn.secondlife.com/svn/linden //mirror/secondlife&lt;br /&gt;
 % svk sync //mirror/secondlife&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will make SVK read the whole LL repository, with all its branches and revisions and store them on your hard disk (in your home directory).&lt;br /&gt;
&lt;br /&gt;
When you&#039;re done, do the same to a repository you can write to (since you can&#039;t write to the LL one):&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk mirror http://svn.example.com/sl //mirror/myproject&lt;br /&gt;
 % svk sync //mirror/myproject&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//mirror/secondlife and //mirror/myproject are special paths used by SVK. They&#039;re links to the actual repositories. Doing something to //mirror/myproject would result in changes being sent to your SVN server.&lt;br /&gt;
&lt;br /&gt;
=== Creating the first branch ===&lt;br /&gt;
First, copy the branch you want to work with to your own server:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk mkdir //mirror/myproject/branches&lt;br /&gt;
 % svk mkdir //mirror/myproject/branches/buildfixes&lt;br /&gt;
 % svk smerge -B //mirror/secondlife/release //mirror/myproject/branches/buildfixes&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;smerge&amp;quot; stands for &amp;quot;smart merge&amp;quot; and is a very cool thing. It intelligently merges starting from the part where you left. Since there&#039;s no common ancestor to both //mirror/secondlife/release and //mirror/myproject/branches/buildfixes (there can&#039;t be, since buildfixes is empty), you need to tell it to merge everything with the -B argument. After this initial step, further merges can be performed automatically.&lt;br /&gt;
&lt;br /&gt;
Here we&#039;re creating a &amp;quot;buildfixes&amp;quot; branch on our own server, starting from the LL release source. I use the &amp;quot;buildfixes&amp;quot; branch as a starting point for all the others. It contains only the changes needed to get the source to build.&lt;br /&gt;
&lt;br /&gt;
=== Creating local branches ===&lt;br /&gt;
A very good thing about SVK is that you can do useful work without a network connection. First, we&#039;ll create copies of the repositories for local use:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk copy //mirror/secondlife //ll/&lt;br /&gt;
 % svk copy //mirror/myproject //myproject/&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Changes made to these aren&#039;t automatically propagated to the SVN servers. They&#039;re remembered until you want to push them to the server. This means that you can sit on a plane without any sort of network connection, and still use the usual SVN commands -- check the log, commit, revert changes, etc.&lt;br /&gt;
&lt;br /&gt;
=== Creating a new development branch ===&lt;br /&gt;
Now that the buildfixes branch is created, we can create another starting from it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk mkdir //myproject/trunk&lt;br /&gt;
 % svk smerge -B //myproject/branches/buildfixes //myproject/trunk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice how this time there won&#039;t be any network access. To push the changes to your server, do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk smerge //myproject //mirror/myproject&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now suppose you updated the buildfixes branch, and want to propagate the changes. It&#039;s simple:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk smerge //myproject/branches/buildfixes //myproject/trunk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
svk smerge keeps track of what was the last merge, and it automatically merges changes that weren&#039;t merged yet. Unlike with SVN, you don&#039;t need to keep track of revision numbers of make tags, it automatically does the right thing for you.&lt;br /&gt;
&lt;br /&gt;
=== Merging new LL code ===&lt;br /&gt;
Now suppose LL releases a new revision and you want to merge it with your changes. This is easy:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk sync //mirror/secondlife&lt;br /&gt;
 % svk smerge //mirror/secondlife //ll&lt;br /&gt;
 % svk smerge //mirror/secondlife //myproject/branches/buildfixes&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since the buildfixes branch changed, you can propagate the changes further to the trunk branch:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk smerge //myproject/branches/buildfixes //myproject/trunk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And push it to your SVN server:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk smerge //myproject //mirror/myproject&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Source_version_control&amp;diff=23781</id>
		<title>Source version control</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Source_version_control&amp;diff=23781"/>
		<updated>2007-06-19T10:10:13Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: typo fix, explain smerge -B argument&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;One of the problems in making large changes to the Second Life source is keeping track of changes, in order to be able to generate patches to submit. Also longer term, some way of keeping up with LL&#039;s changes to the source is needed. This page is an attempt to explain how to do that.&lt;br /&gt;
&lt;br /&gt;
== Ad-hoc ==&lt;br /&gt;
If you&#039;re not familiar with any source control systems, you can try to not use any, and instead just use the diff and patch utilities. This approach is very strongly discouraged because it doesn&#039;t scale at all. Nevertheless, it works OK for smaller things, like 1 line fixes to the source.&lt;br /&gt;
&lt;br /&gt;
First, create a copy of the source:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % cp -Rdp linden linden.orig&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Do some work on the linden directory. To make a patch use &#039;diff -u&#039;:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % diff -ru linden.orig linden &amp;gt; my_modification.patch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keep the patch around. If LL releases a new version you can apply it to the new source:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % cd linden&lt;br /&gt;
 % patch -p0 &amp;lt; ../my_modification.patch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This method has many disadvantages: it wastes huge amounts of disk space, is inefficient and error prone.&lt;br /&gt;
&lt;br /&gt;
== Subversion ==&lt;br /&gt;
Subversion is a much better option. However, it presents a bigger problem. LL offers a readonly [[Subversion]] repository that you can use to get the latest source. However, since you can&#039;t commit to it, you&#039;ll need to copy the source into your own repository. First, of all, you need to create your own repository. If you have several computers, you should do this on a machine you can reach from anywhere you might want to do development. Ideally it should be a machine accessible from the Internet.&lt;br /&gt;
&lt;br /&gt;
For the purposes of the explanation, I will assume that your SVN repository is accessible through a web server at http://svn.example.com/secondlife. Check the Subversion manual for more information of how to access a repository.&lt;br /&gt;
&lt;br /&gt;
First, create a repository somewhere convenient. /var/lib is a common location for a server setup, but you can choose any other.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svnadmin create /var/lib/svn/secondlife&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now create a local directory with the initial files. By convention, SVN repositories generally have &amp;quot;tags&amp;quot;, &amp;quot;branches&amp;quot; and &amp;quot;trunk&amp;quot; directories at the top level. We won&#039;t create trunk yet. The main development happens in trunk. The &#039;vendor&#039; directory is for holding the original SL source, with the latest version in vendor/current, and a tag in /vendor per SL release.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % mkdir tags&lt;br /&gt;
 % mkdir branches&lt;br /&gt;
 % mkdir vendor&lt;br /&gt;
 % mkdir vendor/current&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Import the basic structure into your SVN repository:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn import -m &amp;quot;Initial import&amp;quot; http://svn.example.com/secondlife&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now move the original directory out of the way, and check it out:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn co http://svn.example.com/secondlife&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you have a working copy with the empty structure. Here comes the complicated part, how to integrate LL&#039;s source there and keep it up to date. Doing this is harder than it sounds, because you need to add new files, remove deleted ones, and keep track of renamed ones (if possible). The easiest way to do that is to use the svn-load-dirs utility.&lt;br /&gt;
&lt;br /&gt;
First of all, get the SL source. Get the archive and extract it. I recommend checking in only the source package, and leaving the art and libraries out of the repository. The art is best left out because it&#039;s big and will slow things down if your SVN repository is located for instance on a shared hosting server. The libraries must be left out if you intend to let anybody else access your repository because some libraries in the archive can&#039;t be redistributed.&lt;br /&gt;
&lt;br /&gt;
You should now have a &amp;quot;linden&amp;quot; directory with the source code. Now use svn-load-dirs to load it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn-load-dirs -t 1.17.0.12 http://svn.example.com/vendor current linden&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your repository is accessed through the internet, this can take a while (even hours)&lt;br /&gt;
&lt;br /&gt;
This will load the source from the linden directory, into http://svn.example.com/vendor/current, and at the same time create a tag in http://svn.example.com/vendor/1.17.0.12. The tag is a very good idea as it allows comparing LL releases easily, makes it easy to determine the last version you merged, and simplifies keeping up with LL releases a lot.&lt;br /&gt;
&lt;br /&gt;
Now from your working copy, run &amp;quot;svn update&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn update&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will bring it up to date, and fetch the recently imported LL source. Now you can start your own branch:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn copy vendor/current trunk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you have the trunk branch for working in. Go and do something in there. Now suppose LL releases a new version. First, repeat the svn-load-dirs step above. Then you can merge the new changes into trunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn merge http://svn.example.com/vendor/&amp;lt;previously_merged_release&amp;gt; http://svn.example.com/vendor/current trunk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now the new LL changes will be merged with your code. You can then &amp;quot;svn diff vendor/current trunk&amp;quot; to get a patch to submit.&lt;br /&gt;
&lt;br /&gt;
== SVK ==&lt;br /&gt;
&lt;br /&gt;
The above method is workable, but it&#039;s not ideal, because SVN uses a centralized model. To use Subversion ideally you&#039;d need to have commit access on the LL server. While it&#039;s possible you might get it, not everybody will, and you almost certainly won&#039;t get it immediately. Since you can&#039;t use the server directly, svn-load-dirs is a required hack. It&#039;s definitely not ideal. svn-load-dirs loses the history from the original server, and can&#039;t properly track renames (it will ask you, and you&#039;ll have to figure out somehow).&lt;br /&gt;
&lt;br /&gt;
An alternative is SVK. SVK is a distributed source control system based on SVN. In a distributed system there&#039;s no central server. The &amp;quot;official&amp;quot; server if there is such a thing is only official because people choose to believe it is, not because there&#039;s anything special about it.&lt;br /&gt;
&lt;br /&gt;
A crucial difference is that SVK can mirror the LL SVN repository, keeping all the data about revisions, with one command. Then you can make your changes to that, and push them to your own SVN server. If you make that available, somebody could mirror that, and so on. SVK makes it very convenient for people to create their own branches based on bits from here and there. &lt;br /&gt;
&lt;br /&gt;
=== Getting started ===&lt;br /&gt;
First of all, you need to mirror the SVN repository. This takes quite some time, but only needs to be done once. Run this command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk mirror http://svn.secondlife.com/svn/linden //mirror/secondlife&lt;br /&gt;
 % svk sync //mirror/secondlife&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will make SVK read the whole LL repository, with all its branches and revisions and store them on your hard disk (in your home directory).&lt;br /&gt;
&lt;br /&gt;
When you&#039;re done, do the same to a repository you can write to (since you can&#039;t write to the LL one):&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk mirror http://svn.example.com/sl //mirror/myproject&lt;br /&gt;
 % svk sync //mirror/myproject&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//mirror/secondlife and //mirror/myproject are special paths used by SVK. They&#039;re links to the actual repositories. Doing something to //mirror/myproject would result in changes being sent to your SVN server.&lt;br /&gt;
&lt;br /&gt;
=== Creating the first branch ===&lt;br /&gt;
First, copy the branch you want to work with to your own server:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk mkdir //mirror/myproject/branches&lt;br /&gt;
 % svk mkdir //mirror/myproject/branches/buildfixes&lt;br /&gt;
 % svk smerge -B //mirror/secondlife/release //mirror/myproject/branches/buildfixes&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;smerge&amp;quot; stands for &amp;quot;smart merge&amp;quot; and is a very cool thing. It intelligently merges starting from the part where you left. Since there&#039;s no common ancestor to both //mirror/secondlife/release and //mirror/myproject/branches/buildfixes (there can&#039;t be, since buildfixes is empty), you need to tell it to merge everything with the -B argument. After this initial step, further merges can be performed automatically.&lt;br /&gt;
&lt;br /&gt;
Here we&#039;re creating a &amp;quot;buildfixes&amp;quot; branch on our own server, starting from the LL release source. I use the &amp;quot;buildfixes&amp;quot; branch as a starting point for all the others. It contains only the changes needed to get the source to build.&lt;br /&gt;
&lt;br /&gt;
=== Creating local branches ===&lt;br /&gt;
A very good thing about SVK is that you can do useful work without a network connection. First, we&#039;ll create copies of the repositories for local use:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk copy //mirror/secondlife //ll/&lt;br /&gt;
 % svk copy //mirror/myproject //myproject/&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Changes made to these aren&#039;t automatically propagated to the SVN servers. They&#039;re remembered until you want to push them to the server. This means that you can sit on a plane without any sort of network connection, and still use the usual SVN commands -- check the log, commit, revert changes, etc.&lt;br /&gt;
&lt;br /&gt;
=== Creating a new development branch ===&lt;br /&gt;
Now that the buildfixes branch is created, we can create another starting from it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk mkdir //myproject/trunk&lt;br /&gt;
 % svk smerge -B //myproject/branches/buildfixes //myproject/trunk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice how this time there won&#039;t be any network access. To push the changes to your server, do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk smerge //myproject //mirror/myproject&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now suppose you updated the buildfixes branch, and want to propagate the changes. It&#039;s simple:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk smerge //myproject/branches/buildfixes //myproject/trunk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
svk smerge keeps track of what was the last merge, and it automatically merges changes that weren&#039;t merged yet. Unlike with SVN, you don&#039;t need to keep track of revision numbers of make tags, it automatically does the right thing for you.&lt;br /&gt;
&lt;br /&gt;
=== Merging new LL code ===&lt;br /&gt;
Now suppose LL releases a new revision and you want to merge it with your changes. This is easy:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk sync //mirror/secondlife&lt;br /&gt;
 % svk smerge //mirror/secondlife //ll&lt;br /&gt;
 % svk smerge //mirror/secondlife //myproject/branches/buildfixes&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since the buildfixes branch changed, you can propagate the changes further to the trunk branch:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk smerge //myproject/branches/buildfixes //myproject/trunk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And push it to your SVN server:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk smerge //myproject //mirror/myproject&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Source_version_control&amp;diff=23780</id>
		<title>Source version control</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Source_version_control&amp;diff=23780"/>
		<updated>2007-06-19T08:53:55Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: fixed trunk path&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;One of the problems in making large changes to the Second Life source is keeping track of changes, in order to be able to generate patches to submit. Also longer term, some way of keeping up with LL&#039;s changes to the source is needed. This page is an attempt to explain how to do that.&lt;br /&gt;
&lt;br /&gt;
== Ad-hoc ==&lt;br /&gt;
If you&#039;re not familiar with any source control systems, you can try to not use any, and instead just use the diff and patch utilities. This approach is very strongly discouraged because it doesn&#039;t scale at all. Nevertheless, it works OK for smaller things, like 1 line fixes to the source.&lt;br /&gt;
&lt;br /&gt;
First, create a copy of the source:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % cp -Rdp linden linden.orig&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Do some work on the linden directory. To make a patch use &#039;diff -u&#039;:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % diff -ru linden.orig linden &amp;gt; my_modification.patch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keep the patch around. If LL releases a new version you can apply it to the new source:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % cd linden&lt;br /&gt;
 % patch -p0 &amp;lt; ../my_modification.patch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This method has many disadvantages: it wastes huge amounts of disk space, is inefficient and error prone.&lt;br /&gt;
&lt;br /&gt;
== Subversion ==&lt;br /&gt;
Subversion is a much better option. However, it presents a bigger problem. LL offers a readonly [[Subversion]] repository that you can use to get the latest source. However, since you can&#039;t commit to it, you&#039;ll need to copy the source into your own repository. First, of all, you need to create your own repository. If you have several computers, you should do this on a machine you can reach from anywhere you might want to do development. Ideally it should be a machine accessible from the Internet.&lt;br /&gt;
&lt;br /&gt;
For the purposes of the explanation, I will assume that your SVN repository is accessible through a web server at http://svn.example.com/secondlife. Check the Subversion manual for more information of how to access a repository.&lt;br /&gt;
&lt;br /&gt;
First, create a repository somewhere convenient. /var/lib is a common location for a server setup, but you can choose any other.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svnadmin create /var/lib/svn/secondlife&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now create a local directory with the initial files. By convention, SVN repositories generally have &amp;quot;tags&amp;quot;, &amp;quot;branches&amp;quot; and &amp;quot;trunk&amp;quot; directories at the top level. We won&#039;t create trunk yet. The main development happens in trunk. The &#039;vendor&#039; directory is for holding the original SL source, with the latest version in vendor/current, and a tag in /vendor per SL release.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % mkdir tags&lt;br /&gt;
 % mkdir branches&lt;br /&gt;
 % mkdir vendor&lt;br /&gt;
 % mkdir vendor/current&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Import the basic structure into your SVN repository:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn import -m &amp;quot;Initial import&amp;quot; http://svn.example.com/secondlife&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now move the original directory out of the way, and check it out:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn co http://svn.example.com/secondlife&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you have a working copy with the empty structure. Here comes the complicated part, how to integrate LL&#039;s source there and keep it up to date. Doing this is harder than it sounds, because you need to add new files, remove deleted ones, and keep track of renamed ones (if possible). The easiest way to do that is to use the svn-load-dirs utility.&lt;br /&gt;
&lt;br /&gt;
First of all, get the SL source. Get the archive and extract it. I recommend checking in only the source package, and leaving the art and libraries out of the repository. The art is best left out because it&#039;s big and will slow things down if your SVN repository is located for instance on a shared hosting server. The libraries must be left out if you intend to let anybody else access your repository because some libraries in the archive can&#039;t be redistributed.&lt;br /&gt;
&lt;br /&gt;
You should now have a &amp;quot;linden&amp;quot; directory with the source code. Now use svn-load-dirs to load it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn-load-dirs -t 1.17.0.12 http://svn.example.com/vendor current linden&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your repository is accessed through the internet, this can take a while (even hours)&lt;br /&gt;
&lt;br /&gt;
This will load the source from the linden directory, into http://svn.example.com/vendor/current, and at the same time create a tag in http://svn.example.com/vendor/1.17.0.12. The tag is a very good idea as it allows comparing LL releases easily, makes it easy to determine the last version you merged, and simplifies keeping up with LL releases a lot.&lt;br /&gt;
&lt;br /&gt;
Now from your working copy, run &amp;quot;svn update&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn update&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will bring it up to date, and fetch the recently imported LL source. Now you can start your own branch:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn copy vendor/current trunk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you have the trunk branch for working in. Go and do something in there. Now suppose LL releases a new version. First, repeat the svn-load-dirs step above. Then you can merge the new changes into trunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn merge http://svn.example.com/vendor/&amp;lt;previously_merged_release&amp;gt; http://svn.example.com/vendor/current trunk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now the new LL changes will be merged with your code. You can then &amp;quot;svn diff vendor/current trunk&amp;quot; to get a patch to submit.&lt;br /&gt;
&lt;br /&gt;
== SVK ==&lt;br /&gt;
&lt;br /&gt;
The above method is workable, but it&#039;s not ideal, because SVN uses a centralized model. To use Subversion ideally you&#039;d need to have commit access on the LL server. While it&#039;s possible you might get it, not everybody will, and you almost certainly won&#039;t get it immediately. Since you can&#039;t use the server directly, svn-load-dirs is a required hack. It&#039;s definitely not ideal. svn-load-dirs loses the history from the original server, and can&#039;t properly track renames (it will ask you, and you&#039;ll have to figure out somehow).&lt;br /&gt;
&lt;br /&gt;
An alternative is SVK. SVK is a distributed source control system based on SVN. In a distributed system there&#039;s no central server. The &amp;quot;official&amp;quot; server if there is such a thing is only official because people choose to believe it is, not because there&#039;s anything special about it.&lt;br /&gt;
&lt;br /&gt;
A crucial difference is that SVK can mirror the LL SVN repository, keeping all the data about revisions, with one command. Then you can make your changes to that, and push them to your own SVN server. If you make that available, somebody could mirror that, and so on. SVK makes it very convenient for people to create their own branches based on bits from here and there. &lt;br /&gt;
&lt;br /&gt;
=== Getting started ===&lt;br /&gt;
First of all, you need to mirror the SVN repository. This takes quite some time, but only needs to be done once. Run this command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk mirror http://svn.secondlife.com/svn/linden //mirror/secondlife&lt;br /&gt;
 % svk sync //mirror/secondlife&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will make SVK read the whole LL repository, with all its branches and revisions and store them on your hard disk (in your home directory).&lt;br /&gt;
&lt;br /&gt;
When you&#039;re done, do the same to a repository you can write to (since you can&#039;t write to the LL one):&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk mirror http://svn.example.com/sl //mirror/myproject&lt;br /&gt;
 % svk sync //mirror/myproject&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//mirror/secondlife and //mirror/myproject are special paths used by SVK. They&#039;re links to the actual repositories. Doing something to //mirror/myproject would result in changes being sent to your SVN server.&lt;br /&gt;
&lt;br /&gt;
=== Creating the first branch ===&lt;br /&gt;
First, copy the branch you want to work with to your own server:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk mkdir //mirror/myproject/branches&lt;br /&gt;
 % svk mkdir //mirror/myproject/branches/buildfixes&lt;br /&gt;
 % svk smerge -B //mirror/secondlife/relese //mirror/myproject/branches/buildfixes&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;smerge&amp;quot; stands for &amp;quot;smart merge&amp;quot; and is a very cool thing. It intelligently merges starting from the part where you left. This will be explained in more detail below.&lt;br /&gt;
&lt;br /&gt;
Here we&#039;re creating a &amp;quot;buildfixes&amp;quot; branch on our own server, starting from the LL release source. I use the &amp;quot;buildfixes&amp;quot; branch as a starting point for all the others. It contains only the changes needed to get the source to build.&lt;br /&gt;
&lt;br /&gt;
=== Creating local branches ===&lt;br /&gt;
A very good thing about SVK is that you can do useful work without a network connection. First, we&#039;ll create copies of the repositories for local use:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk copy //mirror/secondlife //ll/&lt;br /&gt;
 % svk copy //mirror/myproject //myproject/&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Changes made to these aren&#039;t automatically propagated to the SVN servers. They&#039;re remembered until you want to push them to the server. This means that you can sit on a plane without any sort of network connection, and still use the usual SVN commands -- check the log, commit, revert changes, etc.&lt;br /&gt;
&lt;br /&gt;
=== Creating a new development branch ===&lt;br /&gt;
Now that the buildfixes branch is created, we can create another starting from it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk mkdir //myproject/trunk&lt;br /&gt;
 % svk smerge -B //myproject/branches/buildfixes //myproject/trunk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice how this time there won&#039;t be any network access. To push the changes to your server, do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk smerge //myproject //mirror/myproject&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now suppose you updated the buildfixes branch, and want to propagate the changes. It&#039;s simple:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk smerge //myproject/branches/buildfixes //myproject/trunk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
svk smerge keeps track of what was the last merge, and it automatically merges changes that weren&#039;t merged yet. Unlike with SVN, you don&#039;t need to keep track of revision numbers of make tags, it automatically does the right thing for you.&lt;br /&gt;
&lt;br /&gt;
=== Merging new LL code ===&lt;br /&gt;
Now suppose LL releases a new revision and you want to merge it with your changes. This is easy:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk sync //mirror/secondlife&lt;br /&gt;
 % svk smerge //mirror/secondlife //ll&lt;br /&gt;
 % svk smerge //mirror/secondlife //myproject/branches/buildfixes&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since the buildfixes branch changed, you can propagate the changes further to the trunk branch:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk smerge //myproject/branches/buildfixes //myproject/trunk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And push it to your SVN server:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk smerge //myproject //mirror/myproject&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Source_version_control&amp;diff=23754</id>
		<title>Source version control</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Source_version_control&amp;diff=23754"/>
		<updated>2007-06-19T02:17:13Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: Intial draft of SVK section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;One of the problems in making large changes to the Second Life source is keeping track of changes, in order to be able to generate patches to submit. Also longer term, some way of keeping up with LL&#039;s changes to the source is needed. This page is an attempt to explain how to do that.&lt;br /&gt;
&lt;br /&gt;
== Ad-hoc ==&lt;br /&gt;
If you&#039;re not familiar with any source control systems, you can try to not use any, and instead just use the diff and patch utilities. This approach is very strongly discouraged because it doesn&#039;t scale at all. Nevertheless, it works OK for smaller things, like 1 line fixes to the source.&lt;br /&gt;
&lt;br /&gt;
First, create a copy of the source:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % cp -Rdp linden linden.orig&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Do some work on the linden directory. To make a patch use &#039;diff -u&#039;:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % diff -ru linden.orig linden &amp;gt; my_modification.patch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keep the patch around. If LL releases a new version you can apply it to the new source:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % cd linden&lt;br /&gt;
 % patch -p0 &amp;lt; ../my_modification.patch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This method has many disadvantages: it wastes huge amounts of disk space, is inefficient and error prone.&lt;br /&gt;
&lt;br /&gt;
== Subversion ==&lt;br /&gt;
Subversion is a much better option. However, it presents a bigger problem. LL offers a readonly [[Subversion]] repository that you can use to get the latest source. However, since you can&#039;t commit to it, you&#039;ll need to copy the source into your own repository. First, of all, you need to create your own repository. If you have several computers, you should do this on a machine you can reach from anywhere you might want to do development. Ideally it should be a machine accessible from the Internet.&lt;br /&gt;
&lt;br /&gt;
For the purposes of the explanation, I will assume that your SVN repository is accessible through a web server at http://svn.example.com/secondlife. Check the Subversion manual for more information of how to access a repository.&lt;br /&gt;
&lt;br /&gt;
First, create a repository somewhere convenient. /var/lib is a common location for a server setup, but you can choose any other.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svnadmin create /var/lib/svn/secondlife&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now create a local directory with the initial files. By convention, SVN repositories generally have &amp;quot;tags&amp;quot;, &amp;quot;branches&amp;quot; and &amp;quot;trunk&amp;quot; directories at the top level. We won&#039;t create trunk yet. The main development happens in trunk. The &#039;vendor&#039; directory is for holding the original SL source, with the latest version in vendor/current, and a tag in /vendor per SL release.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % mkdir tags&lt;br /&gt;
 % mkdir branches&lt;br /&gt;
 % mkdir vendor&lt;br /&gt;
 % mkdir vendor/current&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Import the basic structure into your SVN repository:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn import -m &amp;quot;Initial import&amp;quot; http://svn.example.com/secondlife&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now move the original directory out of the way, and check it out:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn co http://svn.example.com/secondlife&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you have a working copy with the empty structure. Here comes the complicated part, how to integrate LL&#039;s source there and keep it up to date. Doing this is harder than it sounds, because you need to add new files, remove deleted ones, and keep track of renamed ones (if possible). The easiest way to do that is to use the svn-load-dirs utility.&lt;br /&gt;
&lt;br /&gt;
First of all, get the SL source. Get the archive and extract it. I recommend checking in only the source package, and leaving the art and libraries out of the repository. The art is best left out because it&#039;s big and will slow things down if your SVN repository is located for instance on a shared hosting server. The libraries must be left out if you intend to let anybody else access your repository because some libraries in the archive can&#039;t be redistributed.&lt;br /&gt;
&lt;br /&gt;
You should now have a &amp;quot;linden&amp;quot; directory with the source code. Now use svn-load-dirs to load it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn-load-dirs -t 1.17.0.12 http://svn.example.com/vendor current linden&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your repository is accessed through the internet, this can take a while (even hours)&lt;br /&gt;
&lt;br /&gt;
This will load the source from the linden directory, into http://svn.example.com/vendor/current, and at the same time create a tag in http://svn.example.com/vendor/1.17.0.12. The tag is a very good idea as it allows comparing LL releases easily, makes it easy to determine the last version you merged, and simplifies keeping up with LL releases a lot.&lt;br /&gt;
&lt;br /&gt;
Now from your working copy, run &amp;quot;svn update&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn update&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will bring it up to date, and fetch the recently imported LL source. Now you can start your own branch:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn copy vendor/current trunk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you have the trunk branch for working in. Go and do something in there. Now suppose LL releases a new version. First, repeat the svn-load-dirs step above. Then you can merge the new changes into trunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn merge http://svn.example.com/vendor/&amp;lt;previously_merged_release&amp;gt; http://svn.example.com/vendor/current trunk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now the new LL changes will be merged with your code. You can then &amp;quot;svn diff vendor/current trunk&amp;quot; to get a patch to submit.&lt;br /&gt;
&lt;br /&gt;
== SVK ==&lt;br /&gt;
&lt;br /&gt;
The above method is workable, but it&#039;s not ideal, because SVN uses a centralized model. To use Subversion ideally you&#039;d need to have commit access on the LL server. While it&#039;s possible you might get it, not everybody will, and you almost certainly won&#039;t get it immediately. Since you can&#039;t use the server directly, svn-load-dirs is required hack. It&#039;s definitely not ideal. svn-load-dirs loses the history from the original server, and can&#039;t properly track renames (it will ask you, and you&#039;ll have to figure out somehow).&lt;br /&gt;
&lt;br /&gt;
An alternative is SVK. SVK is a distributed source control system based on SVN. In a distributed system there&#039;s no central server. The &amp;quot;official&amp;quot; server if there is such a thing is only official because people choose to believe it is, not because there&#039;s anything special about it.&lt;br /&gt;
&lt;br /&gt;
A crucial difference is that SVK can mirror the LL SVN repository, keeping all the data about revisions, with one command. Then you can make your changes to that, and push them to your own SVN server. If you make that available, somebody could mirror that, and so on. SVK makes it very convenient for people to create their own branches based on bits from here and there. &lt;br /&gt;
&lt;br /&gt;
=== Getting started ===&lt;br /&gt;
First of all, you need to mirror the SVN repository. This takes quite some time, but only needs to be done once. Run this command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk mirror http://svn.secondlife.com/svn/linden //mirror/secondlife&lt;br /&gt;
 % svk sync //mirror/secondlife&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will make SVK read the whole LL repository, with all its branches and revisions and store them on your hard disk (in your home directory).&lt;br /&gt;
&lt;br /&gt;
When you&#039;re done, do the same to a repository you can write to (since you can&#039;t write to the LL one):&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk mirror http://svn.example.com/sl //mirror/myproject&lt;br /&gt;
 % svk sync //mirror/myproject&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//mirror/secondlife and //mirror/myproject are special paths used by SVK. They&#039;re links to the actual repositories. Doing something to //mirror/myproject would result in changes being sent to your SVN server.&lt;br /&gt;
&lt;br /&gt;
=== Creating the first branch ===&lt;br /&gt;
First, copy the branch you want to work with to your own server:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk mkdir //mirror/myproject/branches&lt;br /&gt;
 % svk mkdir //mirror/myproject/branches/buildfixes&lt;br /&gt;
 % svk smerge -B //mirror/secondlife/relese //mirror/myproject/branches/buildfixes&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;smerge&amp;quot; stands for &amp;quot;smart merge&amp;quot; and is a very cool thing. It intelligently merges starting from the part where you left. This will be explained in more detail below.&lt;br /&gt;
&lt;br /&gt;
Here we&#039;re creating a &amp;quot;buildfixes&amp;quot; branch on our own server, starting from the LL release source. I use the &amp;quot;buildfixes&amp;quot; branch as a starting point for all the others. It contains only the changes needed to get the source to build.&lt;br /&gt;
&lt;br /&gt;
=== Creating local branches ===&lt;br /&gt;
A very good thing about SVK is that you can do useful work without a network connection. First, we&#039;ll create copies of the repositories for local use:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk copy //mirror/secondlife //ll/&lt;br /&gt;
 % svk copy //mirror/myproject //myproject/&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Changes made to these aren&#039;t automatically propagated to the SVN servers. They&#039;re remembered until you want to push them to the server. This means that you can sit on a plane without any sort of network connection, and still use the usual SVN commands -- check the log, commit, revert changes, etc.&lt;br /&gt;
&lt;br /&gt;
=== Creating a new development branch ===&lt;br /&gt;
Now that the buildfixes branch is created, we can create another starting from it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk mkdir //myproject/trunk&lt;br /&gt;
 % svk smerge -B //myproject/branches/buildfixes //myproject/trunk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice how this time there won&#039;t be any network access. To push the changes to your server, do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk smerge //myproject //mirror/myproject&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now suppose you updated the buildfixes branch, and want to propagate the changes. It&#039;s simple:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk smerge //myproject/branches/buildfixes //myproject/branches/trunk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
svk smerge keeps track of what was the last merge, and it automatically merges changes that weren&#039;t merged yet. Unlike with SVN, you don&#039;t need to keep track of revision numbers of make tags, it automatically does the right thing for you.&lt;br /&gt;
&lt;br /&gt;
=== Merging new LL code ===&lt;br /&gt;
Now suppose LL releases a new revision and you want to merge it with your changes. This is easy:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk sync //mirror/secondlife&lt;br /&gt;
 % svk smerge //mirror/secondlife //ll&lt;br /&gt;
 % svk smerge //mirror/secondlife //myproject/branches/buildfixes&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since the buildfixes branch changed, you can propagate the changes further to the trunk branch:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk smerge //myproject/branches/buildfixes //myproject/trunk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And push it to your SVN server:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svk smerge //myproject //mirror/myproject&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Source_version_control&amp;diff=23753</id>
		<title>Source version control</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Source_version_control&amp;diff=23753"/>
		<updated>2007-06-19T01:35:30Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;One of the problems in making large changes to the Second Life source is keeping track of changes, in order to be able to generate patches to submit. Also longer term, some way of keeping up with LL&#039;s changes to the source is needed. This page is an attempt to explain how to do that.&lt;br /&gt;
&lt;br /&gt;
== Ad-hoc ==&lt;br /&gt;
If you&#039;re not familiar with any source control systems, you can try to not use any, and instead just use the diff and patch utilities. This approach is very strongly discouraged because it doesn&#039;t scale at all. Nevertheless, it works OK for smaller things, like 1 line fixes to the source.&lt;br /&gt;
&lt;br /&gt;
First, create a copy of the source:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % cp -Rdp linden linden.orig&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Do some work on the linden directory. To make a patch use &#039;diff -u&#039;:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % diff -ru linden.orig linden &amp;gt; my_modification.patch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keep the patch around. If LL releases a new version you can apply it to the new source:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % cd linden&lt;br /&gt;
 % patch -p0 &amp;lt; ../my_modification.patch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This method has many disadvantages: it wastes huge amounts of disk space, is inefficient and error prone.&lt;br /&gt;
&lt;br /&gt;
== Subversion ==&lt;br /&gt;
Subversion is a much better option. However, it presents a bigger problem. LL offers a readonly [[Subversion]] repository that you can use to get the latest source. However, since you can&#039;t commit to it, you&#039;ll need to copy the source into your own repository. First, of all, you need to create your own repository. If you have several computers, you should do this on a machine you can reach from anywhere you might want to do development. Ideally it should be a machine accessible from the Internet.&lt;br /&gt;
&lt;br /&gt;
For the purposes of the explanation, I will assume that your SVN repository is accessible through a web server at http://svn.example.com/secondlife. Check the Subversion manual for more information of how to access a repository.&lt;br /&gt;
&lt;br /&gt;
First, create a repository somewhere convenient. /var/lib is a common location for a server setup, but you can choose any other.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svnadmin create /var/lib/svn/secondlife&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now create a local directory with the initial files. By convention, SVN repositories generally have &amp;quot;tags&amp;quot;, &amp;quot;branches&amp;quot; and &amp;quot;trunk&amp;quot; directories at the top level. We won&#039;t create trunk yet. The main development happens in trunk. The &#039;vendor&#039; directory is for holding the original SL source, with the latest version in vendor/current, and a tag in /vendor per SL release.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % mkdir tags&lt;br /&gt;
 % mkdir branches&lt;br /&gt;
 % mkdir vendor&lt;br /&gt;
 % mkdir vendor/current&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Import the basic structure into your SVN repository:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn import -m &amp;quot;Initial import&amp;quot; http://svn.example.com/secondlife&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now move the original directory out of the way, and check it out:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn co http://svn.example.com/secondlife&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you have a working copy with the empty structure. Here comes the complicated part, how to integrate LL&#039;s source there and keep it up to date. Doing this is harder than it sounds, because you need to add new files, remove deleted ones, and keep track of renamed ones (if possible). The easiest way to do that is to use the svn-load-dirs utility.&lt;br /&gt;
&lt;br /&gt;
First of all, get the SL source. Get the archive and extract it. I recommend checking in only the source package, and leaving the art and libraries out of the repository. The art is best left out because it&#039;s big and will slow things down if your SVN repository is located for instance on a shared hosting server. The libraries must be left out if you intend to let anybody else access your repository because some libraries in the archive can&#039;t be redistributed.&lt;br /&gt;
&lt;br /&gt;
You should now have a &amp;quot;linden&amp;quot; directory with the source code. Now use svn-load-dirs to load it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn-load-dirs -t 1.17.0.12 http://svn.example.com/vendor current linden&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your repository is accessed through the internet, this can take a while (even hours)&lt;br /&gt;
&lt;br /&gt;
This will load the source from the linden directory, into http://svn.example.com/vendor/current, and at the same time create a tag in http://svn.example.com/vendor/1.17.0.12. The tag is a very good idea as it allows comparing LL releases easily, makes it easy to determine the last version you merged, and simplifies keeping up with LL releases a lot.&lt;br /&gt;
&lt;br /&gt;
Now from your working copy, run &amp;quot;svn update&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn update&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will bring it up to date, and fetch the recently imported LL source. Now you can start your own branch:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn copy vendor/current trunk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you have the trunk branch for working in. Go and do something in there. Now suppose LL releases a new version. First, repeat the svn-load-dirs step above. Then you can merge the new changes into trunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn merge http://svn.example.com/vendor/&amp;lt;previously_merged_release&amp;gt; http://svn.example.com/vendor/current trunk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now the new LL changes will be merged with your code. You can then &amp;quot;svn diff vendor/current trunk&amp;quot; to get a patch to submit.&lt;br /&gt;
&lt;br /&gt;
== SVK ==&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Source_version_control&amp;diff=23752</id>
		<title>Source version control</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Source_version_control&amp;diff=23752"/>
		<updated>2007-06-19T01:33:26Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: Initial draft&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;One of the problems in making large changes to the Second Life source is keeping track of changes, in order to be able to generate patches to submit. Also longer term, some way of keeping up with LL&#039;s changes to the source is needed. This page is an attempt to explain how to do that.&lt;br /&gt;
&lt;br /&gt;
== Ad-hoc ==&lt;br /&gt;
If you&#039;re not familiar with any source control systems, you can try to not use any, and instead just use the diff and patch utilities. This approach is very strongly discouraged because it doesn&#039;t scale at all. Nevertheless, it works OK for smaller things, like 1 line fixes to the source.&lt;br /&gt;
&lt;br /&gt;
First, create a copy of the source:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % cp -Rdp linden linden.orig&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Do some work on the linden directory. To make a patch use &#039;diff -u&#039;:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % diff -ru linden.orig linden &amp;gt; my_modification.patch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keep the patch around. If LL releases a new version you can apply it to the new source:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % cd linden&lt;br /&gt;
 % patch -p0 &amp;lt; ../my_modification.patch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This method has many disadvantages: it wastes huge amounts of disk space, is inefficient and error prone.&lt;br /&gt;
&lt;br /&gt;
== Subversion ==&lt;br /&gt;
Subversion is a much better option. However, it presents a bigger problem. LL offers a readonly [[Subversion]] repository that you can use to get the latest source. However, since you can&#039;t commit to it, you&#039;ll need to copy the source into your own repository. First, of all, you need to create your own repository. If you have several computers, you should do this on a machine you can reach from anywhere you might want to do development. Ideally it should be a machine accessible from the Internet.&lt;br /&gt;
&lt;br /&gt;
For the purposes of the explanation, I will assume that your SVN repository is accessible through a web server at http://svn.example.com/secondlife. Check the Subversion manual for more information of how to access a repository.&lt;br /&gt;
&lt;br /&gt;
First, create a repository somewhere convenient. /var/lib is a common location for a server setup, but you can choose any other.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svnadmin create /var/lib/svn/secondlife&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now create a local directory with the initial files. By convention, SVN repositories generally have &amp;quot;tags&amp;quot;, &amp;quot;branches&amp;quot; and &amp;quot;trunk&amp;quot; directories at the top level. We won&#039;t create trunk yet. The main development happens in trunk. The &#039;vendor&#039; directory is for holding the original SL source, with the latest version in vendor/current, and a tag in /vendor per SL release.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % mkdir tags&lt;br /&gt;
 % mkdir branches&lt;br /&gt;
 % mkdir vendor&lt;br /&gt;
 % mkdir vendor/current&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Import the basic structure into your SVN repository:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn import -m &amp;quot;Initial import&amp;quot; http://svn.example.com/secondlife&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now move the original directory out of the way, and check it out:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn co http://svn.example.com/secondlife&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you have a working copy with the empty structure. Here comes the complicated part, how to integrate LL&#039;s source there and keep it up to date. Doing this is harder than it sounds, because you need to add new files, remove deleted ones, and keep track of renamed ones (if possible). The easiest way to do that is to use the svn-load-dirs utility.&lt;br /&gt;
&lt;br /&gt;
First of all, get the SL source. Get the archive and extract it. I recommend checking in only the source package, and leaving the art and libraries out of the repository. The art is best left out because it&#039;s big and will slow things down if your SVN repository is located for instance on a shared hosting server. The libraries must be left out if you intend to let anybody else access your repository because some libraries in the archive can&#039;t be redistributed.&lt;br /&gt;
&lt;br /&gt;
You should now have a &amp;quot;linden&amp;quot; directory with the source code. Now use svn-load-dirs to load it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn-load-dirs -t 1.17.0.12 http://svn.example.com/vendor current linden&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your repository is accessed through the internet, this can take a while (even hours)&lt;br /&gt;
&lt;br /&gt;
This will load the source from the linden directory, into http://svn.example.com/vendor/current, and at the same time create a tag in http://svn.example.com/vendor/1.17.0.12. The tag is a very good idea as it allows comparing LL releases easily, makes it easy to determine the last version you merged, and simplifies keeping up with LL releases a lot.&lt;br /&gt;
&lt;br /&gt;
Now from your working copy, run &amp;quot;svn update&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn update&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will bring it up to date, and fetch the recently imported LL source. Now you can start your own branch:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn copy vendor/current trunk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you have the trunk branch for working in. Go and do something in there. Now suppose LL releases a new version. First, repeat the svn-load-dirs step above. Then you can merge the new changes into trunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn merge http://svn.example.com/vendor/&amp;lt;previously_merged_release&amp;gt; http://svn.example.com/vendor/current trunk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now the new LL changes will be merged with your code. You can then &amp;quot;svn diff vendor/current trunk&amp;quot; to get a patch to submit.&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Build_the_Viewer_on_Linux&amp;diff=23590</id>
		<title>Build the Viewer on Linux</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Build_the_Viewer_on_Linux&amp;diff=23590"/>
		<updated>2007-06-17T14:11:29Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: Instructions for Subversion&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{CompileNav}}&lt;br /&gt;
&lt;br /&gt;
The following are instructions for building the Second Life viewer on linux. This process has been used on [http://www.debian.org/ debian] and debian based systems like [http://www.ubuntu.com/ ubuntu], and also on [http://www.fedoraproject.org/ Fedora]. For other platforms, see [[Get source and compile]].&lt;br /&gt;
&lt;br /&gt;
{{vital-info|How to compile [[Source_archive#2007-Feb-20|FL-1.13.3.58185]] and [[Source_archive#2007-Feb-24|FL-1.13.3.58390]] &#039;&#039;&#039;with&#039;&#039;&#039; llmozlib (see [[Talk:Compiling_the_viewer_%28Linux%29#llmozlib|discussion]])}}&lt;br /&gt;
&lt;br /&gt;
= Building the client =&lt;br /&gt;
To build the Second Life Viewer you will first need to install the required tools and libraries.&lt;br /&gt;
The following sections online steps to build the client from source.  To simplify building,&lt;br /&gt;
Linden labs has been nice enough to prepackage some of the libraries and bundled them up in an&lt;br /&gt;
additional tar file.&lt;br /&gt;
&lt;br /&gt;
And while The Second Life Viewer is not a trivial build, and experience with building large&lt;br /&gt;
software packages will help you greatly - but don&#039;t be daunted, it should be simple once the&lt;br /&gt;
dependencies are in the right place the first time.&lt;br /&gt;
&lt;br /&gt;
The tasks are:&lt;br /&gt;
# Install required tools.&lt;br /&gt;
# Unpack source and art tree&#039;s from Linden Labs.&lt;br /&gt;
# Install libraries not shiped by Linden Labs.&lt;br /&gt;
# Unpack or install the other required libraries and headers.&lt;br /&gt;
# Compile.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
== Required tools ==&lt;br /&gt;
There are a number of tools that need to be installed first.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;SCons&amp;lt;/b&amp;gt; build tool [package: scons]&lt;br /&gt;
* &amp;lt;b&amp;gt;GCC 3.4&amp;lt;/b&amp;gt; C/C++ compiler [debian/ubuntu: g++-3.4, fedora: compat-gcc-34-c++]; other GCC versions are not well-tested; GCC 4.x will NOT currently build the viewer without some code adjustments.&lt;br /&gt;
* &amp;lt;b&amp;gt;yacc&amp;lt;/b&amp;gt; [suggest packages: bison]&lt;br /&gt;
* &amp;lt;b&amp;gt;lex&amp;lt;/b&amp;gt; [suggest packages: flex]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
== Unpack the source tree ==&lt;br /&gt;
&lt;br /&gt;
You can get the source either from the source archives available at [[Source downloads]], or you can get it from [[Subversion]].&lt;br /&gt;
&lt;br /&gt;
Using a source archive is the easier option, but if you plan to do active development and want to make your own modifications, while merging LL&#039;s changes, subversion will probably be much more convenient on the long term.&lt;br /&gt;
&lt;br /&gt;
=== Getting the source from the source archives ===&lt;br /&gt;
Get the source from [[Source downloads]]. You will need all 3 archives: source, artwork and libraries.&lt;br /&gt;
&lt;br /&gt;
Choose a location and unpack the source tree and the art work.  They will be extracted into a&lt;br /&gt;
directory call &amp;lt;b&amp;gt;linden&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % tar -xzf slviewer-src-&amp;lt;version&amp;gt;.tar.gz&lt;br /&gt;
 % tar -xzf slviewer-&amp;lt;os&amp;gt;-libs-&amp;lt;version&amp;gt;.tar.gz&lt;br /&gt;
 % unzip slviewer-artwork-&amp;lt;version&amp;gt;.zip&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Getting the source from Subversion ===&lt;br /&gt;
Select a source [[Source branches|branch]] to check out.&lt;br /&gt;
&lt;br /&gt;
Check it out with:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % svn co http://svn.secondlife.com/svn/linden/&amp;lt;branch&amp;gt; [directory]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
If you don&#039;t specify the directory, it&#039;ll use the name of the branch as the default.&lt;br /&gt;
&lt;br /&gt;
Now you will have a directory with the source code. This only includes the source code itself, without the libraries or artwork. You will have to get them from the [[Source downloads]] and unpack them into the tree.&lt;br /&gt;
&lt;br /&gt;
If the directory SVN created is called &#039;linden&#039; then you can directly unzip and untar the archives on top of it. If it&#039;s called something else, create a symlink:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % ln -sf &amp;lt;branch&amp;gt; linden&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now unpack the libraries and artwork:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % tar -xzf slviewer-&amp;lt;os&amp;gt;-libs-&amp;lt;version&amp;gt;.tar.gz&lt;br /&gt;
 % unzip slviewer-artwork-&amp;lt;version&amp;gt;.zip&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing the required libraries (that Linden labs can not or does not provide)==&lt;br /&gt;
=== FMOD (audio) ===&lt;br /&gt;
* FMOD provides audio output, but (although &#039;free&#039; in some senses) is not itself open-source.  &amp;lt;b&amp;gt;If&amp;lt;/b&amp;gt; you wish to avoid FMOD, thus disabling audio, you may make these changes:&lt;br /&gt;
** Comment-out the libfmod line in indra/newview/viewer_manifest.py&lt;br /&gt;
** Add FMOD=no to your Scons build command when compiling the source.&lt;br /&gt;
* If you want to use FMOD, fetch and unpack &amp;lt;b&amp;gt;FMOD 3.75&amp;lt;/b&amp;gt; &amp;lt;http://www.fmod.org/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % wget http://www.fmod.org/files/fmodapi375linux.tar.gz&lt;br /&gt;
 % tar -xzvf fmodapi375linux.tar.gz&lt;br /&gt;
 % cd fmodapi375linux/&lt;br /&gt;
 % cp api/inc/* ../linden/libraries/i686-linux/include/&lt;br /&gt;
 % cp api/libfmod-3.75.so ../linden/libraries/i686-linux/lib_release_client/&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
=== google-perftools (memory checking) ===&lt;br /&gt;
* &amp;lt;b&amp;gt;google-perftools&amp;lt;/b&amp;gt; library for the tcmalloc and stacktrace libraries.&lt;br /&gt;
**[fedora: google-perftools-devel.i386] &lt;br /&gt;
**[debian/ubuntu: libgoogle-perftools-dev]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing the required dependencies (prepackaged by Linden labs)==&lt;br /&gt;
&lt;br /&gt;
The Second Life Viewer has a number of compile/link dependencies on external libraries which&lt;br /&gt;
are needed - to help you, the source download page contains a link to a &amp;lt;i&amp;gt;slviewer-linux-libs&amp;lt;/i&amp;gt; package which you unpack over the source tree to fill most of the dependencies (and thus avoid most of the fiddly work described on this page).&lt;br /&gt;
&lt;br /&gt;
If you download the libs to the top folder, where the &amp;lt;i&amp;gt;linden&amp;lt;/i&amp;gt; folder is after getting and extracting the viewer source code tarball, the following command should unpack everything to the right spot. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 tar xvfz slviewer-linux-libs-&amp;lt;version&amp;gt;.tar.gz&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
=== Doing yourself ===&lt;br /&gt;
If you are porting to a new architecture or wish to make a package tailored to your Linux distribution&#039;s own libraries.  You will have to install the following additional dependencies&lt;br /&gt;
listed below.  Paths and package names given here are based on Ubuntu 6.06 and may vary&lt;br /&gt;
according to your Linux distribution.&lt;br /&gt;
&lt;br /&gt;
==== List of libraries ====&lt;br /&gt;
* &amp;lt;b&amp;gt;apr-1&amp;lt;/b&amp;gt; [debian/ubuntu: libapr1.0-dev, fedora: apr-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;aprutil-1&amp;lt;/b&amp;gt; [debian/ubuntu: libaprutil1.0-dev, fedora: apr-util-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;boost&amp;lt;/b&amp;gt; [debian/ubuntu: libboost-dev, fedora: boost-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;boost-regex&amp;lt;/b&amp;gt; [debian/ubuntu: libboost-regex-dev]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;curl&amp;lt;/b&amp;gt; library at least version 7.15.4 is recommended, 7.16.x is ideal.&lt;br /&gt;
** [debian/ubuntu: libcurl-dev]&lt;br /&gt;
** fedora: curl-devel]&lt;br /&gt;
** If you are compiling your own version of &amp;lt;b&amp;gt;Curl&amp;lt;/b&amp;gt;, then you should consider configuring it to use the &amp;lt;b&amp;gt;c-ares&amp;lt;/b&amp;gt; library so that DNS lookups will be asynchronous.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;ELFIO&amp;lt;/b&amp;gt; &amp;lt;http://sourceforge.net/projects/elfio/&amp;gt;&lt;br /&gt;
** This wants to build a static library by default.  Afterwards, to create a dynamic libelfio.so&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % cd ELFIO &amp;amp;&amp;amp; g++-3.4 -shared *.o -o libelfio.so&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;expat&amp;lt;/b&amp;gt; [debian/ubuntu: libexpat1-dev, fedora: expat-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;GTK 2.x&amp;lt;/b&amp;gt; development headers&lt;br /&gt;
** [debian/ubuntu: libgtk2.0-dev&lt;br /&gt;
** [fedora: gtk2-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;jpeglib&amp;lt;/b&amp;gt;&lt;br /&gt;
**[debian/ubuntu: libjpeg62-dev]&lt;br /&gt;
**[fedora: libjpeg-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;OpenGL&amp;lt;/b&amp;gt; development headers: gl.h, glext.h, glu.h&lt;br /&gt;
**[debian/ubuntu: mesa-common-dev, libglu1-mesa-dev]&lt;br /&gt;
**[fedora: mesa-libGL-devel, mesa-libGLU-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;OpenJPEG&amp;lt;/b&amp;gt; &amp;lt;http://www.openjpeg.org/&amp;gt;&lt;br /&gt;
** note: OpenJPEG 1.1.1 or greater is required which has the macro OPJ_PATH_LEN, if the header has MAX_PATH, then upgrade or it will crash with a divide by zero error as the structures would be two different sizes.&lt;br /&gt;
*** &#039;&#039;what does this mean?&#039;&#039;&lt;br /&gt;
** 02-26-2007, another set of patches is required to Second Life to make it usable, that is fix a crash, make it look good, and speed it up.  See https://jira.secondlife.com:443/browse/VWR-123&lt;br /&gt;
*** &#039;&#039;VWR-123 has been fixed: should this note be removed?&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;SDL&amp;lt;/b&amp;gt; [libsdl1.2-dev, fedora: SDL-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;Vorbis&amp;lt;/b&amp;gt; [debian/ubuntu: libvorbis-dev, fedora: libvorbis-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;X11&amp;lt;/b&amp;gt; development headers: Xlib.h, and Xutil.h&lt;br /&gt;
**[debian/ubuntu: libx11-dev]&lt;br /&gt;
**[fedora: libX11-devel]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;xmlrpc-epi 0.51&amp;lt;/b&amp;gt; &amp;lt;http://xmlrpc-epi.sourceforge.net/&amp;gt;&lt;br /&gt;
** note: not xmlrpc-c (xmlrpc-c has a library and headers with the same name but is not compatible)&lt;br /&gt;
** Apply patches from the instructions in [[patch xmlrpc-epi]]&lt;br /&gt;
*** &#039;&#039;does this still work?&#039;&#039;&lt;br /&gt;
** See also:&lt;br /&gt;
*** http://www.haxxed.com/rpms/secondlife/xmlrpc-epi-0.51-gcc4.1.patch&lt;br /&gt;
*** http://www.haxxed.com/rpms/secondlife/xmlrpc-epi-0.51-use-system-expat.patch&lt;br /&gt;
*** http://www.haxxed.com/rpms/secondlife/xmlrpc-epi-0.51-rename.patch&lt;br /&gt;
*** You have to regenerate autotools after applying the patches:&lt;br /&gt;
****libtoolize -c -f&lt;br /&gt;
****aclocal&lt;br /&gt;
****automake -c -a -f&lt;br /&gt;
****autoconf&lt;br /&gt;
*** The first patch fixes compiling on gcc 4. The second patch causes it to compile against the system expat, the version xmlrpc-epi comes with is broken and will not work. The last patch renames the library from xmlrpc to xmlrpc-epi, otherwise it conflicts with xmlrpc-c - which means the viewer then needs to be patched to link against xmlrpc-epi and not xmlrpc. These patches are from my Fedora package. On linux, I recommend these patches in favor of the Linden ones, as theirs seem to be for windows. (And mine actually work)&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Copy headers and libraries into the source tree ====&lt;br /&gt;
&lt;br /&gt;
Here is a guide to the sequence of shell commands needed to copy the required headers and libraries into the Second Life Viewer source tree for building.  Actual paths to system headers may vary according to Linux distribution.&lt;br /&gt;
* ${SLSRC} refers to the top-level directory of the Second Life Viewer source tree.&lt;br /&gt;
&lt;br /&gt;
You only need to copy the following if you&#039;re not using the handy &amp;lt;i&amp;gt;slviewer-linux-libs&amp;lt;/i&amp;gt; package:&lt;br /&gt;
 cp -a /usr/include/atk-1.0 ${SLSRC}/libraries/i686-linux/include/&lt;br /&gt;
 cp -a /usr/include/gtk-2.0 ${SLSRC}/libraries/i686-linux/include/&lt;br /&gt;
 cp -a /usr/lib/gtk-2.0/include/* ${SLSRC}/libraries/i686-linux/include/gtk-2.0/&lt;br /&gt;
 cp -a /usr/include/glib-2.0 ${SLSRC}/libraries/i686-linux/include/&lt;br /&gt;
 cp -a /usr/lib/glib-2.0/include/* ${SLSRC}/libraries/i686-linux/include/glib-2.0/&lt;br /&gt;
 cp -a /usr/include/pango-1.0 ${SLSRC}/libraries/i686-linux/include/&lt;br /&gt;
&lt;br /&gt;
if your GTK is fairly recent and thus needs Cairo:&lt;br /&gt;
 cp -a /usr/include/cairo/* ${SLSRC}/libraries/i686-linux/include/&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Libs ====&lt;br /&gt;
&lt;br /&gt;
If you are using our easy &amp;lt;i&amp;gt;slviewer-linux-libs&amp;lt;/i&amp;gt; bundle then you can skip the rest of this section, &amp;lt;b&amp;gt;otherwise&amp;lt;/b&amp;gt; you will also need to perform the following:&lt;br /&gt;
* ${OPENJPEG} refers to the top-level directory of your completed OpenJPEG build.&lt;br /&gt;
* ${ELFIO} refers to the top-level directory of your completed ELFIO build.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 cp -a /usr/include/apr-1.0/ ${SLSRC}/libraries/i686-linux/include/apr-1&lt;br /&gt;
&lt;br /&gt;
 mkdir ${SLSRC}/libraries/i686-linux/include/expat&lt;br /&gt;
 cp -a /usr/include/expat*.h ${SLSRC}/libraries/i686-linux/include/expat/&lt;br /&gt;
&lt;br /&gt;
 mkdir ${SLSRC}/libraries/i686-linux/include/zlib&lt;br /&gt;
 cp -a /usr/include/zlib*.h ${SLSRC}/libraries/i686-linux/include/zlib/&lt;br /&gt;
&lt;br /&gt;
 mkdir ${SLSRC}/libraries/i686-linux/include/openjpeg&lt;br /&gt;
 cp ${OPENJPEG}/libopenjpeg/openjpeg.h ${SLSRC}/libraries/i686-linux/include/openjpeg/&lt;br /&gt;
 cp ${OPENJPEG}/libopenjpeg.a ${SLSRC}/libraries/i686-linux/lib_release_client/&lt;br /&gt;
&lt;br /&gt;
 mkdir ${SLSRC}/libraries/i686-linux/include/ELFIO&lt;br /&gt;
 cp ${ELFIO}/ELFIO/*.h ${SLSRC}/libraries/i686-linux/include/ELFIO/&lt;br /&gt;
 cp ${ELFIO}/ELFIO/libelfio.so ${SLSRC}/libraries/i686-linux/lib_release_client/&lt;br /&gt;
&lt;br /&gt;
 mkdir ${SLSRC}/libraries/i686-linux/include/jpeglib&lt;br /&gt;
 cp -a /usr/include/j*.h ${SLSRC}/libraries/i686-linux/include/jpeglib/&lt;br /&gt;
 touch ${SLSRC}/libraries/i686-linux/include/jpeglib/jinclude.h&lt;br /&gt;
&lt;br /&gt;
 mkdir ${SLSRC}/libraries/i686-linux/include/llfreetype2&lt;br /&gt;
 cp -a /usr/include/freetype2/freetype/ ${SLSRC}/libraries/i686-linux/include/llfreetype2/&lt;br /&gt;
 cp -a /usr/include/ft2build.h ${SLSRC}/libraries/i686-linux/include/llfreetype2/freetype/&lt;br /&gt;
&lt;br /&gt;
 mkdir ${SLSRC}/libraries/i686-linux/include/xmlrpc-epi&lt;br /&gt;
 cp -a /usr/include/xmlrpc*.h ${SLSRC}/libraries/i686-linux/include/xmlrpc-epi/&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Compiling ==&lt;br /&gt;
=== Build Types ===&lt;br /&gt;
The &#039;&#039;BUILD&#039;&#039; parameter specifies the build type. For normal usage, use &#039;&#039;&#039;release&#039;&#039;&#039;. If you plan to work on the source, choose &#039;&#039;&#039;releasenoopt&#039;&#039;&#039; or &#039;&#039;&#039;debug&#039;&#039;&#039;, as these versions are unoptimized and much easier to debug.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;release&#039;&#039;&#039;: Optimized build for release.&lt;br /&gt;
* &#039;&#039;&#039;releasenoopt&#039;&#039;&#039;: Unoptimized build.&lt;br /&gt;
* &#039;&#039;&#039;debug&#039;&#039;&#039;: Debug build with assertions.&lt;br /&gt;
* &#039;&#039;&#039;releasefordownload&#039;&#039;&#039;: Optimized build for release, will create a .tar.gz with the files for distribution.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
=== Building ===&lt;br /&gt;
=== Disable llMozLib ===&lt;br /&gt;
Add MOZLIB=no to your Scons build command when compiling the source.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ cd indra&lt;br /&gt;
 $ scons DISTCC=no BTARGET=client BUILD=release MOZLIB=no&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Expect a build time of a couple of hours.  The resulting unstripped Second Life Viewer binary is &amp;lt;b&amp;gt;newview/secondlife-i686-bin&amp;lt;/b&amp;gt;. Note that temporary object code is compiled into &amp;lt;b&amp;gt;/tmp/$USER&amp;lt;/b&amp;gt; by default (where $USER is your username) - this can be changed by prefixing the &amp;lt;b&amp;gt;scons&amp;lt;/b&amp;gt; command above with &amp;lt;b&amp;gt;TEMP_BUILD_DIR=&amp;quot;&amp;lt;i&amp;gt;[full directory path]&amp;lt;/i&amp;gt;&amp;quot;&amp;lt;/b&amp;gt;. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ TEMP_BUILD_DIR=&amp;quot;/home/fred/secondlife/temp-build&amp;quot; scons DISTCC=no BTARGET=client BUILD=release&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To build a release that has all of the shaders and optimizations enabled and resembles the official shipped Linux alpha client, use BUILD=releasefordownload&lt;br /&gt;
&lt;br /&gt;
Be sure to read the [[Common compilation problems]] page if you have problems - we&#039;ll try to keep the page up to date with known problems and solutions.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
== Testing and packaging the client ==&lt;br /&gt;
&lt;br /&gt;
=== Testing the result from inside the tree ===&lt;br /&gt;
&lt;br /&gt;
You may find it simpler and less error-prone to follow the instructions in the [[Compiling_the_viewer_%28Linux%29#Packaging_the_client|Packaging the client]] section below to run the client under the same conditions as an end-user would.  Otherwise:&lt;br /&gt;
&lt;br /&gt;
* Preparing to run &#039;in-tree&#039;&lt;br /&gt;
** &amp;lt;i&amp;gt;ensure that you have indra/newview/app_settings/static_*.db2&amp;lt;/i&amp;gt; - if not, you&#039;ll find it in the &#039;slviewer-artwork&#039; download (a zip file).&lt;br /&gt;
** now, from the indra directory:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ cp ../scripts/messages/message_template.msg newview/app_settings/&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Running it: The LD_LIBRARY_PATH stuff ensures that the binary looks for its libraries in the right places.  From the indra directory:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ ( cd newview &amp;amp;&amp;amp; LD_LIBRARY_PATH=../../libraries/i686-linux/lib_release_client:${LD_LIBRARY_PATH}:/usr/local/lib  ./secondlife-i686-bin )&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
** For version &#039;&#039;&#039;20070117a&#039;&#039;&#039; the binary name seems to have changed to &#039;&#039;&#039;secondlife-i686-bin-globalsyms&#039;&#039;&#039;, so the command would be (&amp;lt;i&amp;gt;Tofu Linden says - this was an oversight after a build process change, and future releases will generate a &#039;&#039;&#039;secondlife-i686&#039;&#039;&#039; again, whereupon this instruction can be removed. :)&amp;lt;/i&amp;gt;)&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ ( cd newview &amp;amp;&amp;amp; LD_LIBRARY_PATH=../../libraries/i686-linux/lib_release_client:${LD_LIBRARY_PATH}:/usr/local/lib  ./secondlife-i686-bin-globalsyms )&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
==== Augh!!  The client seems REALLY slow!! ====&lt;br /&gt;
&lt;br /&gt;
By default, the open-source Second Life Viewer uses the open-source OpenJPEG library to decode the (many) JPEG-2000 texture images it receives from the servers.  Unfortunately this isn&#039;t quite of comparable speed to the proprietary third-party library which the Linden Lab viewer builds have traditionally used, for which we are not permitted to redistribute the source.&lt;br /&gt;
&lt;br /&gt;
However, the &amp;lt;i&amp;gt;slviewer-linux-libs&amp;lt;/i&amp;gt; package includes two pre-built libraries which facilitate the use of this smoother image decoding method: &amp;lt;b&amp;gt;libkdu_v42R.so&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;libllkdu.so&amp;lt;/b&amp;gt;.  These are provided for your testing; again, we are not permitted to grant you the right to re-distribute these libraries to downstream users, but the viewer will still work (albeit slower) without them.&lt;br /&gt;
&lt;br /&gt;
To &amp;lt;b&amp;gt;use these faster image-decoding libraries&amp;lt;/b&amp;gt;, they simply need to be put into the right places relative to the viewer runtime directory - nothing needs to be reconfigured or recompiled.  If you&#039;re running the client from the source tree, the following will make the KDU libraries available:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 cp &amp;quot;$SLSRC/libraries/i686-linux/lib_release_client/libllkdu.so&amp;quot; &amp;quot;$SLSRC/indra/newview/libllkdu.so&amp;quot;&lt;br /&gt;
 mkdir &amp;quot;$SLSRC/indra/lib&amp;quot;&lt;br /&gt;
 cp &amp;quot;$SLSRC/libraries/i686-linux/lib_release_client/libkdu_v42R.so&amp;quot; &amp;quot;$SLSRC/indra/lib/libkdu_v42R.so&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The file &amp;lt;b&amp;gt;indra/newview/viewer_manifest.py&amp;lt;/b&amp;gt; contains some commented-out entries describing where these libraries belong; if you uncomment the two lines corresponding to libllkdu and libkdu then they will be automatically copied into the right place in the runtime directory when you follow the &#039;Packaging the client&#039; instructions below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Packaging the client ===&lt;br /&gt;
&lt;br /&gt;
If you substitute &#039;BUILD=release&#039; with &#039;&amp;lt;b&amp;gt;BUILD=releasefordownload&amp;lt;/b&amp;gt;&#039; in the &#039;Compiling&#039; section above, then packaging the resulting code, libraries, data and documentation into a tarball for the end-user will be done automatically as the final stage of the build process; the pristine end-user client distribution has been assembled into the directory &amp;lt;b&amp;gt;indra/newview/SecondLife_i686_1_X_Y_Z/&amp;lt;/b&amp;gt; and has also been tarred into &amp;lt;b&amp;gt;indra/newview/SecondLife_i686_1_X_Y_Z.tar.bz2&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The file which controls what (and where) files go into the end-user runtime viewer directory is &amp;lt;b&amp;gt;indra/newview/viewer_manifest.py&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Automated libraries and headers adjustments, compilation and packaging ====&lt;br /&gt;
&lt;br /&gt;
Here is a bash script that could save you a lot of time... It basically does all what is described above, and more, and entitles you to compile a SL client very easily:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# make-SL v1.21 (c)2007 Henri Beauchamp. Released under GPL license v2:&lt;br /&gt;
# http://www.gnu.org/licenses/gpl.txt&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
######## THIS IS QUICK&#039;N DIRTY ALPHA SOFTWARE. USE AT YOUR OWN RISKS ! ########&lt;br /&gt;
###############################################################################&lt;br /&gt;
&lt;br /&gt;
# This bash script is aimed at easying up the build process of a SL client.&lt;br /&gt;
# It does not cover building it with custom/system openjpeg, elfio or fmodapi&lt;br /&gt;
# (we use the provided libraries).&lt;br /&gt;
# You may enable or disable the use of your system&#039;s library by editing&lt;br /&gt;
# the USE_SYSTEM_* variable (&amp;quot;yes&amp;quot; --&amp;gt; use the system library, &amp;quot;no&amp;quot; --&amp;gt; use&lt;br /&gt;
# LL&#039;s provided ones).&lt;br /&gt;
# The script also takes care of updating properly the viewer_manifest.py script&lt;br /&gt;
# accordingly, so that you (should) end up with a properly packaged client.&lt;br /&gt;
&lt;br /&gt;
# To use this script, simply make it executable (chmod +x make-SL) and&lt;br /&gt;
# put it into /usr/local/bin (or any other directory in your PATH).&lt;br /&gt;
# Then, download the slviewer-src-*.tar.gz, slviewer-linux-libs-*.tar.gz,&lt;br /&gt;
# slviewer-artwork-*.zip and fmodapi*.tar.gz archives, and finally, invoke&lt;br /&gt;
# make-SL as follow:&lt;br /&gt;
#   make-SL path_to_archives  (example: make-SL ~/downloads)&lt;br /&gt;
# or simply:&lt;br /&gt;
#   make-SL&lt;br /&gt;
# when invoking from the directory where the archives are.&lt;br /&gt;
# The sources will be installed into the PATH_TO_SOURCES directory,&lt;br /&gt;
# and the client will be built into the TEMP_BUILD_DIR directory.&lt;br /&gt;
# If you want to retry a compilation after fixing something manually and&lt;br /&gt;
# don&#039;t want make-SL to start all over again, overwriting everything,&lt;br /&gt;
# you may invoke it with the --retry option, like this:&lt;br /&gt;
#   make-SL --retry&lt;br /&gt;
# This script has been tested by the author, on a (very customized)&lt;br /&gt;
# Mandrake 10.2 distro. Tested with SL v1.17 sources.&lt;br /&gt;
&lt;br /&gt;
# Where the sources of the client will be held (defaults to &amp;quot;./linden&amp;quot;):&lt;br /&gt;
PATH_TO_SOURCES=&amp;quot;/usr/src/SL&amp;quot;&lt;br /&gt;
# Where to build the client:&lt;br /&gt;
export TEMP_BUILD_DIR=&amp;quot;$HOME/secondlife&amp;quot;&lt;br /&gt;
&lt;br /&gt;
USE_SYSTEM_GTK=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_SDL=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_SSL=&amp;quot;yes&amp;quot;&lt;br /&gt;
# Beware: libdb4 makes use of libapr... so you should keep USE_SYSTEM_APR&lt;br /&gt;
# and USE_SYSTEM_DB4 in sync.&lt;br /&gt;
USE_SYSTEM_APR=&amp;quot;no&amp;quot;&lt;br /&gt;
USE_SYSTEM_DB4=&amp;quot;no&amp;quot;&lt;br /&gt;
USE_SYSTEM_OGG=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_ZLIB=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_UUID=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_CURL=&amp;quot;no&amp;quot;&lt;br /&gt;
USE_SYSTEM_EXPAT=&amp;quot;no&amp;quot;&lt;br /&gt;
USE_SYSTEM_VORBIS=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_XMLRPC=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_JPEGLIB=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_FREETYPE2=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_PERFTOOLS=&amp;quot;yes&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# You may add tune flags here, to optimize the code for your processor.&lt;br /&gt;
# Example, for an Athlon XP:&lt;br /&gt;
# TUNE_FLAGS=&amp;quot;-march=athlon-xp -mtune=athlon-xp&amp;quot;&lt;br /&gt;
TUNE_FLAGS=&amp;quot;-march=athlon-xp -mtune=athlon-xp&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Whether to build with the browser login screen or not:&lt;br /&gt;
WITH_MOZILLA=&amp;quot;yes&amp;quot;&lt;br /&gt;
&lt;br /&gt;
function update_manifest() {&lt;br /&gt;
    grep -v $1 $PATH_TO_SOURCES/indra/newview/viewer_manifest.py &amp;gt;$TEMP_BUILD_DIR/viewer_manifest.py&lt;br /&gt;
    mv -f $TEMP_BUILD_DIR/viewer_manifest.py $PATH_TO_SOURCES/indra/newview/viewer_manifest.py&lt;br /&gt;
    chmod +x $PATH_TO_SOURCES/indra/newview/viewer_manifest.py&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function compile() {&lt;br /&gt;
    cd $PATH_TO_SOURCES/indra&lt;br /&gt;
    echo &amp;quot;Compiling the client into $TEMP_BUILD_DIR...&amp;quot;&lt;br /&gt;
    scons DISTCC=no BTARGET=client BUILD=releasefordownload MOZLIB=$WITH_MOZILLA&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if [ &amp;quot;$TEMP_BUILD_DIR&amp;quot; == &amp;quot;&amp;quot; ] ; then&lt;br /&gt;
    export TEMP_BUILD_DIR=/tmp/$USER/SL&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Check to see if we simply want to retry a compilation:&lt;br /&gt;
if [ &amp;quot;$1&amp;quot; == &amp;quot;--retry&amp;quot; ] ; then&lt;br /&gt;
    compile&lt;br /&gt;
    exit $?&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Make sure we don&#039;t unpack over an old source tree:&lt;br /&gt;
if [ -d linden ] ; then&lt;br /&gt;
    rm -rf linden/&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if [ -d $PATH_TO_SOURCES ] &amp;amp;&amp;amp; [ &amp;quot;$PATH_TO_SOURCES&amp;quot; != &amp;quot;&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$PATH_TO_SOURCES&amp;quot; != &amp;quot;/&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$PATH_TO_SOURCES&amp;quot; != &amp;quot;.&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$PATH_TO_SOURCES&amp;quot; != &amp;quot;..&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$PATH_TO_SOURCES&amp;quot; != &amp;quot;$HOME&amp;quot; ] ; then&lt;br /&gt;
    rm -rf $PATH_TO_SOURCES/&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Use the parameter (if any) as the path to the archives:&lt;br /&gt;
&lt;br /&gt;
PATH_TO_ARCHIVES=&amp;quot;.&amp;quot;&lt;br /&gt;
if [ &amp;quot;$1&amp;quot; != &amp;quot;&amp;quot; ]; then&lt;br /&gt;
    if [ -d $1 ] ; then&lt;br /&gt;
        PATH_TO_ARCHIVES=$1&lt;br /&gt;
    fi&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s first unpack everything:&lt;br /&gt;
if ! [ -f $PATH_TO_ARCHIVES/slviewer-src-*.tar.gz ] ; then&lt;br /&gt;
    echo &amp;quot;You need slviewer-src !&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
if ! [ -f $PATH_TO_ARCHIVES/slviewer-linux-libs-*.tar.gz ] ; then&lt;br /&gt;
    echo &amp;quot;You need slviewer-linux-libs !&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
if ! [ -f $PATH_TO_ARCHIVES/slviewer-artwork-*.zip ] ; then&lt;br /&gt;
    echo &amp;quot;You need slviewer-artwork !&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
if ! [ -f $PATH_TO_ARCHIVES/fmodapi*.tar.gz ] ; then&lt;br /&gt;
    echo &amp;quot;You need fmodapi !&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
echo &amp;quot;Extracting the files from the archives...&amp;quot;&lt;br /&gt;
tar xzf $PATH_TO_ARCHIVES/slviewer-src-*.tar.gz&lt;br /&gt;
tar xzf $PATH_TO_ARCHIVES/slviewer-linux-libs-*.tar.gz&lt;br /&gt;
unzip $PATH_TO_ARCHIVES/slviewer-artwork-*.zip &amp;gt;/dev/null&lt;br /&gt;
tar xzf $PATH_TO_ARCHIVES/fmodapi*.tar.gz&lt;br /&gt;
&lt;br /&gt;
# fmodapi:&lt;br /&gt;
echo &amp;quot;Copying fmodapi files...&amp;quot;&lt;br /&gt;
cp -a fmodapi*/api/inc/* linden/libraries/i686-linux/include/&lt;br /&gt;
cp fmodapi*/api/libfmod-*.so linden/libraries/i686-linux/lib_release_client/&lt;br /&gt;
rm -rf fmodapi*/&lt;br /&gt;
&lt;br /&gt;
# Move the sources to where we want to hold them:&lt;br /&gt;
if [ &amp;quot;$PATH_TO_SOURCES&amp;quot; != &amp;quot;linden&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$PATH_TO_SOURCES&amp;quot; != &amp;quot;&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Moving the sources to $PATH_TO_SOURCES...&amp;quot;&lt;br /&gt;
    mv -f linden $PATH_TO_SOURCES&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s own the files:&lt;br /&gt;
chown -R $USER: $PATH_TO_SOURCES/&lt;br /&gt;
&lt;br /&gt;
# Make a clean build:&lt;br /&gt;
if [ -d $TEMP_BUILD_DIR ] &amp;amp;&amp;amp; [ &amp;quot;$TEMP_BUILD_DIR&amp;quot; != &amp;quot;&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$TEMP_BUILD_DIR&amp;quot; != &amp;quot;/&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$TEMP_BUILD_DIR&amp;quot; != &amp;quot;.&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$TEMP_BUILD_DIR&amp;quot; != &amp;quot;..&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$TEMP_BUILD_DIR&amp;quot; != &amp;quot;$HOME&amp;quot; ] ; then&lt;br /&gt;
    rm -rf $TEMP_BUILD_DIR/&lt;br /&gt;
fi&lt;br /&gt;
mkdir -p $TEMP_BUILD_DIR&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system GTK+ if available:&lt;br /&gt;
if [ -d /usr/include/atk-1.0 ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_GTK&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system GTK+...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries/i686-linux/include&lt;br /&gt;
    rm -rf atk-1.0/ gtk-2.0/ glib-2.0/ pango-1.0/&lt;br /&gt;
    rm -f ../lib_release_client/libgtk*&lt;br /&gt;
    cp -a /usr/include/atk-1.0 .&lt;br /&gt;
    cp -a /usr/include/gtk-2.0 .&lt;br /&gt;
    cp -a /usr/lib/gtk-2.0/include/* gtk-2.0/&lt;br /&gt;
    cp -a /usr/include/glib-2.0 .&lt;br /&gt;
    cp -a /usr/lib/glib-2.0/include/* glib-2.0/&lt;br /&gt;
    cp -a /usr/include/pango-1.0 .&lt;br /&gt;
    if [ -d /usr/include/cairo ] ; then&lt;br /&gt;
        cp -a /usr/include/cairo/* .&lt;br /&gt;
    fi&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system freetype2 if available:&lt;br /&gt;
if [ -f /usr/include/ft2build.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_FREETYPE2&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system freetype2...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/freetype/ i686-linux/include/llfreetype2/*&lt;br /&gt;
    rm -f include/ft2build.h i686-linux/lib_release_client/libfreetype.a&lt;br /&gt;
    cp -a /usr/include/freetype2/freetype/ i686-linux/include/llfreetype2/&lt;br /&gt;
    cp -a /usr/include/ft2build.h i686-linux/include/llfreetype2/freetype/&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system zlib if available:&lt;br /&gt;
if [ -f /usr/include/zlib.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_ZLIB&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system zlib...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/zlib/&lt;br /&gt;
    mkdir -p i686-linux/include/zlib&lt;br /&gt;
    cp -a /usr/include/zlib*.h i686-linux/include/zlib/&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system jpeglib if available:&lt;br /&gt;
if [ -f /usr/include/jpeglib.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_JPEGLIB&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system jpeglib...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/jpeglib/ i686-linux/lib_release_client/libjpeg.a&lt;br /&gt;
    mkdir -p i686-linux/include/jpeglib&lt;br /&gt;
    cp -a /usr/include/j*.h i686-linux/include/jpeglib/&lt;br /&gt;
    touch i686-linux/include/jpeglib/jinclude.h&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system xmlrpc-epi if available:&lt;br /&gt;
if [ -f /usr/include/xmlrpc.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_XMLRPC&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system xmlrpc-epi...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/xmlrpc-epi/ i686-linux/lib_release_client/libxmlrpc.a&lt;br /&gt;
    mkdir -p i686-linux/include/xmlrpc-epi&lt;br /&gt;
    cp -a /usr/include/xmlrpc*.h i686-linux/include/xmlrpc-epi/&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system ogg if available:&lt;br /&gt;
if [ -f /usr/include/ogg/ogg.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_OGG&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system ogg...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/ogg/ i686-linux/lib_release_client/libogg*&lt;br /&gt;
    update_manifest libogg&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system vorbis if available:&lt;br /&gt;
if [ -f /usr/include/vorbis/vorbisenc.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_VORBIS&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system vorbis...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/vorbis/ i686-linux/lib_release_client/libvorbis*&lt;br /&gt;
    update_manifest libvorbis&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system SDL if available:&lt;br /&gt;
if [ -f /usr/include/SDL/SDL.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_SDL&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system SDL...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries/i686-linux&lt;br /&gt;
    rm -rf include/SDL/ lib_release_client/libSDL*&lt;br /&gt;
    update_manifest libSDL&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system openssl if available:&lt;br /&gt;
if [ -f /usr/lib/libssl.so.0.9.7 ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_SSL&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system openssl...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries/i686-linux/lib_release_client&lt;br /&gt;
    rm -f libssl.* libcrypto.*&lt;br /&gt;
    update_manifest libssl&lt;br /&gt;
    update_manifest libcrypto&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system apr if available:&lt;br /&gt;
if [ -f /usr/include/apr*/apr.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_APR&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system apr...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries/i686-linux&lt;br /&gt;
    rm -rf include/apr-1/*&lt;br /&gt;
    rm -f lib_release_client/libapr*&lt;br /&gt;
    cp -a /usr/include/apr*/* include/apr-1/&lt;br /&gt;
    update_manifest libapr&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system expat if available:&lt;br /&gt;
if [ -f /usr/include/expat.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_EXPAT&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system expat...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/expat/&lt;br /&gt;
    rm -f i686-linux/lib_release_client/libexpat*&lt;br /&gt;
    mkdir -p i686-linux/include/expat&lt;br /&gt;
    cp -a /usr/include/expat*.h i686-linux/include/expat/&lt;br /&gt;
    update_manifest libexpat&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system curl if available:&lt;br /&gt;
if [ -f /usr/include/curl/curl.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_CURL&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system curl...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/curl/&lt;br /&gt;
    rm -f i686-linux/lib_release_client/libcurl.*&lt;br /&gt;
    update_manifest libcurl&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system db4 if available:&lt;br /&gt;
if [ -f /usr/lib/libdb-4.2.so ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_DB4&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system db4...&amp;quot;&lt;br /&gt;
    rm -f $PATH_TO_SOURCES/libraries/i686-linux/lib_release_client/libdb*.so&lt;br /&gt;
    update_manifest libdb&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system uuid if available:&lt;br /&gt;
if [ -f /lib/libuuid.so.1 ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_UUID&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system libuuid...&amp;quot;&lt;br /&gt;
    rm -f $PATH_TO_SOURCES/libraries/i686-linux/lib_release_client/libuuid.*&lt;br /&gt;
    update_manifest libuuid&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if grep tcmalloc $PATH_TO_SOURCES/indra/SConstruct &amp;amp;&amp;gt;/dev/null ; then&lt;br /&gt;
    if [ -f /usr/include/google/malloc_hook.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_PERFTOOLS&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
        echo &amp;quot;Using the system google-perftools...&amp;quot;&lt;br /&gt;
        cd $PATH_TO_SOURCES/libraries/i686-linux&lt;br /&gt;
        rm -f lib_release_client/libtcmalloc.* lib_release_client/libstacktrace.*&lt;br /&gt;
        rm -rf include/google/&lt;br /&gt;
        cp -a /usr/lib/libstacktrace.* /usr/lib/libtcmalloc.so* lib_release_client/&lt;br /&gt;
        cp -a /usr/include/google include/&lt;br /&gt;
        update_manifest tcmalloc&lt;br /&gt;
        update_manifest stacktrace&lt;br /&gt;
    else&lt;br /&gt;
        # Remove the google-perftools stuff if not present in the libraries package&lt;br /&gt;
        # (problem seen in SL v1.17):&lt;br /&gt;
        if ! [ -f $PATH_TO_SOURCES/libraries/i686-linux/lib_release_client/libtcmalloc.so* ] ; then&lt;br /&gt;
            update_manifest tcmalloc&lt;br /&gt;
            update_manifest stacktrace&lt;br /&gt;
            # The following lines remove the&lt;br /&gt;
            #   &amp;quot;external_libs += [&#039;tcmalloc&#039;, &#039;stacktrace&#039;]&amp;quot;&lt;br /&gt;
            # line from SConstruct... and many other lines which renders SConstruct&lt;br /&gt;
            # unusable to build anything else than the client... this is a quick&#039;n&lt;br /&gt;
            # dirty patch. :-P&lt;br /&gt;
            grep -v tcmalloc $PATH_TO_SOURCES/indra/SConstruct &amp;gt;$TEMP_BUILD_DIR/SConstruct&lt;br /&gt;
            mv -f $TEMP_BUILD_DIR/SConstruct $PATH_TO_SOURCES/indra/SConstruct&lt;br /&gt;
        fi&lt;br /&gt;
    fi&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Update the manifest file and enable libkdu packaging. I&#039;m too lazy to use&lt;br /&gt;
# awk or perl, here, but that&#039;s indeed what should be done...&lt;br /&gt;
# The following (very dirty) code may break at some point, depending on what&lt;br /&gt;
# LL will put in comments in the manifest file...&lt;br /&gt;
# First, remove the lines with libstdc++.so.6 and the crash logger:&lt;br /&gt;
update_manifest libstdc&lt;br /&gt;
update_manifest crash_logger&lt;br /&gt;
# Now, any line with a &#039;#&#039; followed with several spaces _should_ be dealing&lt;br /&gt;
# with the libkdu stuff... So, we simply remove the &#039;#&amp;quot;...&lt;br /&gt;
sed -e &amp;quot;s/#        them/# them/&amp;quot; $PATH_TO_SOURCES/indra/newview/viewer_manifest.py &amp;gt;$TEMP_BUILD_DIR/viewer_manifest.py&lt;br /&gt;
sed -e &amp;quot;s/#   /   /&amp;quot; $TEMP_BUILD_DIR/viewer_manifest.py &amp;gt;$PATH_TO_SOURCES/indra/newview/viewer_manifest.py&lt;br /&gt;
#mv -f $TEMP_BUILD_DIR/viewer_manifest.py $PATH_TO_SOURCES/indra/newview/viewer_manifest.py&lt;br /&gt;
chmod +x $PATH_TO_SOURCES/indra/newview/viewer_manifest.py&lt;br /&gt;
&lt;br /&gt;
# Missing file... at least in v1.17.&lt;br /&gt;
touch $PATH_TO_SOURCES/indra/newview/secondlife-i686.supp&lt;br /&gt;
&lt;br /&gt;
# Add tune flags, if any:&lt;br /&gt;
if [ &amp;quot;$TUNE_FLAGS&amp;quot; != &amp;quot;&amp;quot; ] ; then&lt;br /&gt;
    sed -e &amp;quot;s/-O2/-O2 $TUNE_FLAGS/&amp;quot; $PATH_TO_SOURCES/indra/SConstruct &amp;gt;$TEMP_BUILD_DIR/SConstruct&lt;br /&gt;
    mv -f $TEMP_BUILD_DIR/SConstruct $PATH_TO_SOURCES/indra/SConstruct&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
compile&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FreeBSD ==&lt;br /&gt;
&lt;br /&gt;
A list of patches is given for [[Compiling the viewer (FreeBSD)]].&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Dale_Glass&amp;diff=22944</id>
		<title>User:Dale Glass</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Dale_Glass&amp;diff=22944"/>
		<updated>2007-06-09T23:09:15Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: jira reporter&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Evil Scripter and RL programmer.&lt;br /&gt;
&lt;br /&gt;
Currently working on adding an avatar scanner to the SL client.&lt;br /&gt;
&lt;br /&gt;
http://daleglass.net/images/screenshots/avlist6_001.jpg&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Shows a list of all avatars known to the client. This can be easily more than a standard 96m scanner, and seems to depend on rendering distance.&lt;br /&gt;
&lt;br /&gt;
* Keeps an internal list of avatars, and continues showing avatars that disappeared in the list for several seconds to give people time to perform some action on them (intended to make it easier to deal with griefers that do something nasty, then teleport out)&lt;br /&gt;
&lt;br /&gt;
* Shows Linden accounts in bold. This will be expanded later to highlight people who are very new, don&#039;t have a credit card on file, etc depending on user configuration.&lt;br /&gt;
&lt;br /&gt;
* Allows easy access to IM, profiles, etc&lt;br /&gt;
&lt;br /&gt;
* Allows to start a conference to multiple avatars around you, the same way it works in the friends list.&lt;br /&gt;
&lt;br /&gt;
* Allows tracking an avatar by placing a beacon on it. In the case the selected avatar isn&#039;t a friend who gave map location permission, it works anyway by placing a beacon on the avatar&#039;s last known position. This of course only works so long the avatar being tracked is near enough to be seen by the user.&lt;br /&gt;
&lt;br /&gt;
* Automatically retrieves the birth date, account type and payment data for all users shown. The data is of course cached, and if this is too much of an extra load, I&#039;ll implement a permanent on-disk cache. If data doesn&#039;t arrive, it will retry with an exponential backoff (starting from 1 minute, doubling until 30 minutes)&lt;br /&gt;
&lt;br /&gt;
* Displays activity status: new, left the area, emitting particles, moving, playing sound&lt;br /&gt;
&lt;br /&gt;
* Allows moving the camera to the avatar with a double click, as well as cycling the camera between all or only the marked avatars&lt;br /&gt;
&lt;br /&gt;
* Partial TrustNet integration: retrieves scores, but can&#039;t rate yet&lt;br /&gt;
&lt;br /&gt;
What is not done yet, but will be:&lt;br /&gt;
&lt;br /&gt;
* Integration with my TrustNet system. See here for details:&lt;br /&gt;
http://daleglass.net/tikiwiki/tiki-index.php?page=TrustNetAvatarScanner&lt;br /&gt;
http://daleglass.net/tikiwiki/tiki-index.php?page=HowTrustNetWorks&lt;br /&gt;
&lt;br /&gt;
* Integration with resident-run databases. For example, I&#039;ve been asked whether I could make it automatically query a website with a database of buyers to be able to tell people who are using avatars made with copybot, for instance.&lt;br /&gt;
&lt;br /&gt;
* Buttons for administrative actions such as ban/eject/freeze/etc&lt;br /&gt;
&lt;br /&gt;
* Add activity status for typing and rezzing objects&lt;br /&gt;
&lt;br /&gt;
* Also longer term, option to make the client stop rendering an avatar completely.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Jira Reporter}}&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Build_the_Viewer_on_Linux&amp;diff=22943</id>
		<title>Build the Viewer on Linux</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Build_the_Viewer_on_Linux&amp;diff=22943"/>
		<updated>2007-06-09T23:06:22Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: build types&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{CompileNav}}&lt;br /&gt;
&lt;br /&gt;
The following are instructions for building the Second Life viewer on linux. This process has been used on [http://www.debian.org/ debian] and debian based systems like [http://www.ubuntu.com/ ubuntu], and also on [http://www.fedoraproject.org/ Fedora]. For other platforms, see [[Get source and compile]].&lt;br /&gt;
&lt;br /&gt;
== Installing the required dependencies ==&lt;br /&gt;
&lt;br /&gt;
The Second Life Viewer has a number of compile/link dependencies on external libraries which need to be put in place first - to help you, the source download page contains a link to a &amp;lt;i&amp;gt;slviewer-linux-libs&amp;lt;/i&amp;gt; package which you unpack over the source tree to fill most of the dependencies (and thus avoid most of the fiddly work described on this page).  The Second Life Viewer is not a trivial build, and experience with building large software packages will help you greatly - but don&#039;t be daunted, it should be simple once the dependencies are in the right place the first time.&lt;br /&gt;
&lt;br /&gt;
Paths and package names given here are based on Ubuntu 6.06 and may vary according to your Linux distribution.&lt;br /&gt;
&lt;br /&gt;
*If you download the art and libs to the top folder, where the &amp;lt;i&amp;gt;linden&amp;lt;/i&amp;gt; folder is after getting and extracting the viewer source code tarball, the following commands should unpack everything to the right spot. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 unzip slviewer-artwork-&amp;lt;version&amp;gt;.zip&lt;br /&gt;
 tar xvfz slviewer-linux-libs-&amp;lt;version&amp;gt;.tar.gz&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Prerequisites ===&lt;br /&gt;
{{vital-info|How to compile [[Source_archive#2007-Feb-20|FL-1.13.3.58185]] and [[Source_archive#2007-Feb-24|FL-1.13.3.58390]] &#039;&#039;&#039;with&#039;&#039;&#039; llmozlib (see [[Talk:Compiling_the_viewer_%28Linux%29#llmozlib|discussion]])}}&lt;br /&gt;
&lt;br /&gt;
* You will need the &amp;lt;b&amp;gt;SCons&amp;lt;/b&amp;gt; build tool [package: scons]&lt;br /&gt;
* You should use the &amp;lt;b&amp;gt;GCC 3.4&amp;lt;/b&amp;gt; C/C++ compiler [debian/ubuntu: g++-3.4, fedora: compat-gcc-34-c++]; other GCC versions are not well-tested; GCC 4.x will NOT currently build the viewer without some code adjustments.&lt;br /&gt;
&lt;br /&gt;
* fetch and unpack &amp;lt;b&amp;gt;FMOD 3.75&amp;lt;/b&amp;gt; &amp;lt;http://www.fmod.org/&amp;gt;&lt;br /&gt;
** FMOD provides audio output, but (although &#039;free&#039; in some senses) is not itself open-source.  &amp;lt;b&amp;gt;If&amp;lt;/b&amp;gt; you wish to avoid FMOD, thus disabling audio, you may make these changes:&lt;br /&gt;
*** Comment-out the libfmod line in indra/newview/viewer_manifest.py&lt;br /&gt;
*** Add FMOD=no to your Scons build command when compiling the source.&lt;br /&gt;
** If you want to use FMOD:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 wget http://www.fmod.org/files/fmodapi375linux.tar.gz&lt;br /&gt;
 tar -xzvf fmodapi375linux.tar.gz&lt;br /&gt;
 cd fmodapi375linux/&lt;br /&gt;
 cp api/inc/* ../linden/libraries/i686-linux/include/&lt;br /&gt;
 cp api/libfmod-3.75.so ../linden/libraries/i686-linux/lib_release_client/&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* You will need the &amp;lt;b&amp;gt;google-perftools&amp;lt;/b&amp;gt; library [fedora: google-perftools-devel.i386] for the tcmalloc and stacktrace libraries.&lt;br /&gt;
&lt;br /&gt;
* You will need the &amp;lt;b&amp;gt;Curl&amp;lt;/b&amp;gt; library [debian/ubuntu: libcurl-dev, fedora: curl-devel] - at least version 7.15.4 is recommended, 7.16.x is ideal.&lt;br /&gt;
** If you are compiling your own version of &amp;lt;b&amp;gt;Curl&amp;lt;/b&amp;gt;, then you should consider configuring it to use the &amp;lt;b&amp;gt;c-ares&amp;lt;/b&amp;gt; library so that DNS lookups will be asynchronous.&lt;br /&gt;
&lt;br /&gt;
* You will need some development headers for OpenGL and X11: gl.h, glext.h, glu.h, Xlib.h, and Xutil.h [debian/ubuntu: mesa-common-dev, libglu1-mesa-dev, libx11-dev, fedora: mesa-libGL-devel, mesa-libGLU-devel, libX11-devel]&lt;br /&gt;
&lt;br /&gt;
* You will need &amp;lt;b&amp;gt;GTK 2.x development headers&amp;lt;/b&amp;gt; [debian/ubuntu: libgtk2.0-dev, fedora: gtk2-devel]&lt;br /&gt;
&lt;br /&gt;
* You will need &amp;lt;b&amp;gt;yacc&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;lex&amp;lt;/b&amp;gt; [suggest packages: bison, flex]&lt;br /&gt;
&lt;br /&gt;
* You may &amp;lt;b&amp;gt;either&amp;lt;/b&amp;gt; use our easy &amp;lt;i&amp;gt;slviewer-linux-libs&amp;lt;/i&amp;gt; bundle of pre-built libraries and headers unpacked into the Second Life Viewer source tree, &amp;lt;b&amp;gt;or&amp;lt;/b&amp;gt; (for example if you are porting to a new architecture or wish to make a package tailored to your Linux distribution&#039;s own libraries) you will have to install the following additional dependencies:&lt;br /&gt;
** &amp;lt;b&amp;gt;boost&amp;lt;/b&amp;gt; [debian/ubuntu: libboost-dev, fedora: boost-devel]&lt;br /&gt;
** &amp;lt;b&amp;gt;boost-regex&amp;lt;/b&amp;gt; [debian/ubuntu: libboost-regex-dev]&lt;br /&gt;
** &amp;lt;b&amp;gt;apr-1&amp;lt;/b&amp;gt; [debian/ubuntu: libapr1.0-dev, fedora: apr-devel]&lt;br /&gt;
** &amp;lt;b&amp;gt;aprutil-1&amp;lt;/b&amp;gt; [debian/ubuntu: libaprutil1.0-dev, fedora: apr-util-devel]&lt;br /&gt;
** &amp;lt;b&amp;gt;xmlrpc-epi 0.51&amp;lt;/b&amp;gt; &amp;lt;http://xmlrpc-epi.sourceforge.net/&amp;gt;&lt;br /&gt;
*** note: not xmlrpc-c (xmlrpc-c has a library and headers with the same name but is not compatible)&lt;br /&gt;
*** Apply patches from the instructions in [[patch xmlrpc-epi]]&lt;br /&gt;
**** &#039;&#039;does this still work?&#039;&#039;&lt;br /&gt;
** &amp;lt;b&amp;gt;jpeglib&amp;lt;/b&amp;gt; [debian/ubuntu: libjpeg62-dev, fedora: libjpeg-devel]&lt;br /&gt;
** &amp;lt;b&amp;gt;SDL&amp;lt;/b&amp;gt; [libsdl1.2-dev, fedora: SDL-devel]&lt;br /&gt;
** &amp;lt;b&amp;gt;Google perftools 0.91 or greater&amp;lt;/b&amp;gt; [debian/ubuntu: google-perftools-dev, fedora: google-perftools-devel]&lt;br /&gt;
** &amp;lt;b&amp;gt;Vorbis&amp;lt;/b&amp;gt; [debian/ubuntu: libvorbis-dev, fedora: libvorbis-devel]&lt;br /&gt;
** build &amp;lt;b&amp;gt;ELFIO&amp;lt;/b&amp;gt; &amp;lt;http://sourceforge.net/projects/elfio/&amp;gt;&lt;br /&gt;
*** This wants to build a static library by default.  Afterwards, to create a dynamic libelfio.so: &amp;lt;code&amp;gt;cd ELFIO &amp;amp;&amp;amp; g++-3.4 -shared *.o -o libelfio.so&amp;lt;/code&amp;gt;&lt;br /&gt;
** build &amp;lt;b&amp;gt;OpenJPEG&amp;lt;/b&amp;gt; &amp;lt;http://www.openjpeg.org/&amp;gt;&lt;br /&gt;
*** note: OpenJPEG 1.1.1 or greater is required which has the macro OPJ_PATH_LEN, if the header has MAX_PATH, then upgrade or it will crash with a divide by zero error as the structures would be two different sizes.&lt;br /&gt;
**** &#039;&#039;what does this mean?&#039;&#039;&lt;br /&gt;
*** 02-26-2007, another set of patches is required to Second Life to make it usable, that is fix a crash, make it look good, and speed it up.  See https://jira.secondlife.com:443/browse/VWR-123&lt;br /&gt;
**** &#039;&#039;VWR-123 has been fixed: should this note be removed?&#039;&#039;&lt;br /&gt;
** &amp;lt;b&amp;gt;expat&amp;lt;/b&amp;gt; [debian/ubuntu: libexpat1-dev, fedora: expat-devel]&lt;br /&gt;
&lt;br /&gt;
=== Copy headers and libraries into the source tree ===&lt;br /&gt;
&lt;br /&gt;
Here is a guide to the sequence of shell commands needed to copy the required headers and libraries into the Second Life Viewer source tree for building.  Actual paths to system headers may vary according to Linux distribution.&lt;br /&gt;
* ${SLSRC} refers to the top-level directory of the Second Life Viewer source tree.&lt;br /&gt;
&lt;br /&gt;
You only need to copy the following if you&#039;re not using the handy &amp;lt;i&amp;gt;slviewer-linux-libs&amp;lt;/i&amp;gt; package:&lt;br /&gt;
 cp -a /usr/include/atk-1.0 ${SLSRC}/libraries/i686-linux/include/&lt;br /&gt;
 cp -a /usr/include/gtk-2.0 ${SLSRC}/libraries/i686-linux/include/&lt;br /&gt;
 cp -a /usr/lib/gtk-2.0/include/* ${SLSRC}/libraries/i686-linux/include/gtk-2.0/&lt;br /&gt;
 cp -a /usr/include/glib-2.0 ${SLSRC}/libraries/i686-linux/include/&lt;br /&gt;
 cp -a /usr/lib/glib-2.0/include/* ${SLSRC}/libraries/i686-linux/include/glib-2.0/&lt;br /&gt;
 cp -a /usr/include/pango-1.0 ${SLSRC}/libraries/i686-linux/include/&lt;br /&gt;
&lt;br /&gt;
if your GTK is fairly recent and thus needs Cairo:&lt;br /&gt;
 cp -a /usr/include/cairo/* ${SLSRC}/libraries/i686-linux/include/&lt;br /&gt;
&lt;br /&gt;
If you want to use FMOD &#039;&#039;(this has already been written above)&#039;&#039;:&lt;br /&gt;
* ${FMOD} refers to the top-level directory into which you unpacked FMOD 3.&lt;br /&gt;
 cp ${FMOD}/api/inc/* ${SLSRC}/libraries/i686-linux/include/&lt;br /&gt;
 cp ${FMOD}/api/libfmod-3.75.so ${SLSRC}/libraries/i686-linux/lib_release_client/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Disable llMozLib ===&lt;br /&gt;
&lt;br /&gt;
Add MOZLIB=no to your Scons build command when compiling the source.&lt;br /&gt;
&lt;br /&gt;
=== Libs ===&lt;br /&gt;
&lt;br /&gt;
If you are using our easy &amp;lt;i&amp;gt;slviewer-linux-libs&amp;lt;/i&amp;gt; bundle then you can skip the rest of this section, &amp;lt;b&amp;gt;otherwise&amp;lt;/b&amp;gt; you will also need to perform the following:&lt;br /&gt;
* ${OPENJPEG} refers to the top-level directory of your completed OpenJPEG build.&lt;br /&gt;
* ${ELFIO} refers to the top-level directory of your completed ELFIO build.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 cp -a /usr/include/apr-1.0/ ${SLSRC}/libraries/i686-linux/include/apr-1&lt;br /&gt;
&lt;br /&gt;
 mkdir ${SLSRC}/libraries/i686-linux/include/expat&lt;br /&gt;
 cp -a /usr/include/expat*.h ${SLSRC}/libraries/i686-linux/include/expat/&lt;br /&gt;
&lt;br /&gt;
 mkdir ${SLSRC}/libraries/i686-linux/include/zlib&lt;br /&gt;
 cp -a /usr/include/zlib*.h ${SLSRC}/libraries/i686-linux/include/zlib/&lt;br /&gt;
&lt;br /&gt;
 mkdir ${SLSRC}/libraries/i686-linux/include/openjpeg&lt;br /&gt;
 cp ${OPENJPEG}/libopenjpeg/openjpeg.h ${SLSRC}/libraries/i686-linux/include/openjpeg/&lt;br /&gt;
 cp ${OPENJPEG}/libopenjpeg.a ${SLSRC}/libraries/i686-linux/lib_release_client/&lt;br /&gt;
&lt;br /&gt;
 mkdir ${SLSRC}/libraries/i686-linux/include/ELFIO&lt;br /&gt;
 cp ${ELFIO}/ELFIO/*.h ${SLSRC}/libraries/i686-linux/include/ELFIO/&lt;br /&gt;
 cp ${ELFIO}/ELFIO/libelfio.so ${SLSRC}/libraries/i686-linux/lib_release_client/&lt;br /&gt;
&lt;br /&gt;
 mkdir ${SLSRC}/libraries/i686-linux/include/jpeglib&lt;br /&gt;
 cp -a /usr/include/j*.h ${SLSRC}/libraries/i686-linux/include/jpeglib/&lt;br /&gt;
 touch ${SLSRC}/libraries/i686-linux/include/jpeglib/jinclude.h&lt;br /&gt;
&lt;br /&gt;
 mkdir ${SLSRC}/libraries/i686-linux/include/llfreetype2&lt;br /&gt;
 cp -a /usr/include/freetype2/freetype/ ${SLSRC}/libraries/i686-linux/include/llfreetype2/&lt;br /&gt;
 cp -a /usr/include/ft2build.h ${SLSRC}/libraries/i686-linux/include/llfreetype2/freetype/&lt;br /&gt;
&lt;br /&gt;
 mkdir ${SLSRC}/libraries/i686-linux/include/xmlrpc-epi&lt;br /&gt;
 cp -a /usr/include/xmlrpc*.h ${SLSRC}/libraries/i686-linux/include/xmlrpc-epi/&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Compiling ==&lt;br /&gt;
=== Build Types ===&lt;br /&gt;
The &#039;&#039;BUILD&#039;&#039; parameter specifies the build type. For normal usage, use &#039;&#039;&#039;release&#039;&#039;&#039;. If you plan to work on the source, choose &#039;&#039;&#039;releasenoopt&#039;&#039;&#039; or &#039;&#039;&#039;debug&#039;&#039;&#039;, as these versions are unoptimized and much easier to debug.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;release&#039;&#039;&#039;: Optimized build for release.&lt;br /&gt;
* &#039;&#039;&#039;releasenoopt&#039;&#039;&#039;: Unoptimized build.&lt;br /&gt;
* &#039;&#039;&#039;debug&#039;&#039;&#039;: Debug build with assertions.&lt;br /&gt;
* &#039;&#039;&#039;releasefordownload&#039;&#039;&#039;: Optimized build for release, will create a .tar.gz with the files for distribution.&lt;br /&gt;
&lt;br /&gt;
=== Building ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ cd indra&lt;br /&gt;
 $ scons DISTCC=no BTARGET=client BUILD=release MOZLIB=no&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Expect a build time of a couple of hours.  The resulting unstripped Second Life Viewer binary is &amp;lt;b&amp;gt;newview/secondlife-i686-bin&amp;lt;/b&amp;gt;. Note that temporary object code is compiled into &amp;lt;b&amp;gt;/tmp/$USER&amp;lt;/b&amp;gt; by default (where $USER is your username) - this can be changed by prefixing the &amp;lt;b&amp;gt;scons&amp;lt;/b&amp;gt; command above with &amp;lt;b&amp;gt;TEMP_BUILD_DIR=&amp;quot;&amp;lt;i&amp;gt;[full directory path]&amp;lt;/i&amp;gt;&amp;quot;&amp;lt;/b&amp;gt;. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ TEMP_BUILD_DIR=&amp;quot;/home/fred/secondlife/temp-build&amp;quot; scons DISTCC=no BTARGET=client BUILD=release&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To build a release that has all of the shaders and optimizations enabled and resembles the official shipped Linux alpha client, use BUILD=releasefordownload&lt;br /&gt;
&lt;br /&gt;
Be sure to read the [[Common compilation problems]] page if you have problems - we&#039;ll try to keep the page up to date with known problems and solutions.&lt;br /&gt;
&lt;br /&gt;
== Testing and packaging the client ==&lt;br /&gt;
&lt;br /&gt;
=== Testing the result from inside the tree ===&lt;br /&gt;
&lt;br /&gt;
You may find it simpler and less error-prone to follow the instructions in the [[Compiling_the_viewer_%28Linux%29#Packaging_the_client|Packaging the client]] section below to run the client under the same conditions as an end-user would.  Otherwise:&lt;br /&gt;
&lt;br /&gt;
* Preparing to run &#039;in-tree&#039;&lt;br /&gt;
** &amp;lt;i&amp;gt;ensure that you have indra/newview/app_settings/static_*.db2&amp;lt;/i&amp;gt; - if not, you&#039;ll find it in the &#039;slviewer-artwork&#039; download (a zip file).&lt;br /&gt;
** now, from the indra directory:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ cp ../scripts/messages/message_template.msg newview/app_settings/&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Running it: The LD_LIBRARY_PATH stuff ensures that the binary looks for its libraries in the right places.  From the indra directory:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ ( cd newview &amp;amp;&amp;amp; LD_LIBRARY_PATH=../../libraries/i686-linux/lib_release_client:${LD_LIBRARY_PATH}:/usr/local/lib  ./secondlife-i686-bin )&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
** For version &#039;&#039;&#039;20070117a&#039;&#039;&#039; the binary name seems to have changed to &#039;&#039;&#039;secondlife-i686-bin-globalsyms&#039;&#039;&#039;, so the command would be (&amp;lt;i&amp;gt;Tofu Linden says - this was an oversight after a build process change, and future releases will generate a &#039;&#039;&#039;secondlife-i686&#039;&#039;&#039; again, whereupon this instruction can be removed. :)&amp;lt;/i&amp;gt;)&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ ( cd newview &amp;amp;&amp;amp; LD_LIBRARY_PATH=../../libraries/i686-linux/lib_release_client:${LD_LIBRARY_PATH}:/usr/local/lib  ./secondlife-i686-bin-globalsyms )&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Augh!!  The client seems REALLY slow!! ====&lt;br /&gt;
&lt;br /&gt;
By default, the open-source Second Life Viewer uses the open-source OpenJPEG library to decode the (many) JPEG-2000 texture images it receives from the servers.  Unfortunately this isn&#039;t quite of comparable speed to the proprietary third-party library which the Linden Lab viewer builds have traditionally used, for which we are not permitted to redistribute the source.&lt;br /&gt;
&lt;br /&gt;
However, the &amp;lt;i&amp;gt;slviewer-linux-libs&amp;lt;/i&amp;gt; package includes two pre-built libraries which facilitate the use of this smoother image decoding method: &amp;lt;b&amp;gt;libkdu_v42R.so&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;libllkdu.so&amp;lt;/b&amp;gt;.  These are provided for your testing; again, we are not permitted to grant you the right to re-distribute these libraries to downstream users, but the viewer will still work (albeit slower) without them.&lt;br /&gt;
&lt;br /&gt;
To &amp;lt;b&amp;gt;use these faster image-decoding libraries&amp;lt;/b&amp;gt;, they simply need to be put into the right places relative to the viewer runtime directory - nothing needs to be reconfigured or recompiled.  If you&#039;re running the client from the source tree, the following will make the KDU libraries available:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 cp &amp;quot;$SLSRC/libraries/i686-linux/lib_release_client/libllkdu.so&amp;quot; &amp;quot;$SLSRC/indra/newview/libllkdu.so&amp;quot;&lt;br /&gt;
 mkdir &amp;quot;$SLSRC/indra/lib&amp;quot;&lt;br /&gt;
 cp &amp;quot;$SLSRC/libraries/i686-linux/lib_release_client/libkdu_v42R.so&amp;quot; &amp;quot;$SLSRC/indra/lib/libkdu_v42R.so&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The file &amp;lt;b&amp;gt;indra/newview/viewer_manifest.py&amp;lt;/b&amp;gt; contains some commented-out entries describing where these libraries belong; if you uncomment the two lines corresponding to libllkdu and libkdu then they will be automatically copied into the right place in the runtime directory when you follow the &#039;Packaging the client&#039; instructions below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Packaging the client ===&lt;br /&gt;
&lt;br /&gt;
If you substitute &#039;BUILD=release&#039; with &#039;&amp;lt;b&amp;gt;BUILD=releasefordownload&amp;lt;/b&amp;gt;&#039; in the &#039;Compiling&#039; section above, then packaging the resulting code, libraries, data and documentation into a tarball for the end-user will be done automatically as the final stage of the build process; the pristine end-user client distribution has been assembled into the directory &amp;lt;b&amp;gt;indra/newview/SecondLife_i686_1_X_Y_Z/&amp;lt;/b&amp;gt; and has also been tarred into &amp;lt;b&amp;gt;indra/newview/SecondLife_i686_1_X_Y_Z.tar.bz2&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The file which controls what (and where) files go into the end-user runtime viewer directory is &amp;lt;b&amp;gt;indra/newview/viewer_manifest.py&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Automated libraries and headers adjustments, compilation and packaging ====&lt;br /&gt;
&lt;br /&gt;
Here is a bash script that could save you a lot of time... It basically does all what is described above, and more, and entitles you to compile a SL client very easily:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# make-SL v1.10 (c)2007 Henri Beauchamp. Released under GPL license v2:&lt;br /&gt;
# http://www.gnu.org/licenses/gpl.txt&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
######## THIS IS QUICK&#039;N DIRTY ALPHA SOFTWARE. USE AT YOUR OWN RISKS ! ########&lt;br /&gt;
###############################################################################&lt;br /&gt;
&lt;br /&gt;
# This bash script is aimed at easying up the build process of a SL client.&lt;br /&gt;
# It does not cover building it with custom/system openjpeg, elfio or fmodapi&lt;br /&gt;
# (we use the provided libraries).&lt;br /&gt;
# You may enable or disable the use of your system&#039;s library by editing&lt;br /&gt;
# the USE_SYSTEM_* variable (&amp;quot;yes&amp;quot; --&amp;gt; use the system library, &amp;quot;no&amp;quot; --&amp;gt; use&lt;br /&gt;
# LL&#039;s provided ones).&lt;br /&gt;
# The script also takes care of updating properly the viewer_manifest.py script&lt;br /&gt;
# accordingly, so that you (should) end up with a properly packaged client.&lt;br /&gt;
&lt;br /&gt;
# To use this script, simply make it executable (chmod +x make-SL) and&lt;br /&gt;
# put it into /usr/local/bin (or any other directory in your PATH).&lt;br /&gt;
# Then, download the slviewer-src-*.tar.gz, slviewer-linux-libs-*.tar.gz,&lt;br /&gt;
# slviewer-artwork-*.zip and fmodapi*.tar.gz archives, and finally, invoke&lt;br /&gt;
# make-SL as follow:&lt;br /&gt;
#   make-SL path_to_archives  (example: make-SL ~/downloads)&lt;br /&gt;
# or simply:&lt;br /&gt;
#   make-SL&lt;br /&gt;
# when invoking from the directory where the archives are.&lt;br /&gt;
# The sources will be installed into the PATH_TO_SOURCES directory,&lt;br /&gt;
# and the client will be built into the TEMP_BUILD_DIR directory.&lt;br /&gt;
# If you want to retry a compilation after fixing something manually and&lt;br /&gt;
# don&#039;t want make-SL to start all over again, overwriting everything,&lt;br /&gt;
# you may invoke it with the --retry option, like this:&lt;br /&gt;
#   make-SL --retry&lt;br /&gt;
# This script has been tested by the author, on a (very customized)&lt;br /&gt;
# Mandrake 10.2 distro. Tested with SL v1.17 sources.&lt;br /&gt;
&lt;br /&gt;
# Where the sources of the client will be held (defaults to &amp;quot;./linden&amp;quot;):&lt;br /&gt;
PATH_TO_SOURCES=&amp;quot;/usr/src/SL&amp;quot;&lt;br /&gt;
# Where to build the client:&lt;br /&gt;
export TEMP_BUILD_DIR=&amp;quot;$HOME/secondlife&amp;quot;&lt;br /&gt;
&lt;br /&gt;
USE_SYSTEM_GTK=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_SDL=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_SSL=&amp;quot;yes&amp;quot;&lt;br /&gt;
# Beware: libdb4 makes use of libapr... so you should keep USE_SYSTEM_APR&lt;br /&gt;
# and USE_SYSTEM_DB4 in sync.&lt;br /&gt;
USE_SYSTEM_APR=&amp;quot;no&amp;quot;&lt;br /&gt;
USE_SYSTEM_DB4=&amp;quot;no&amp;quot;&lt;br /&gt;
USE_SYSTEM_OGG=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_ZLIB=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_UUID=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_CURL=&amp;quot;no&amp;quot;&lt;br /&gt;
USE_SYSTEM_EXPAT=&amp;quot;no&amp;quot;&lt;br /&gt;
USE_SYSTEM_VORBIS=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_XMLRPC=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_JPEGLIB=&amp;quot;yes&amp;quot;&lt;br /&gt;
USE_SYSTEM_FREETYPE2=&amp;quot;yes&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# You may add tune flags here, to optimize the code for your processor.&lt;br /&gt;
# Example, for an Athlon XP:&lt;br /&gt;
# TUNE_FLAGS=&amp;quot;-march=athlon-xp -mtune=athlon-xp&amp;quot;&lt;br /&gt;
TUNE_FLAGS=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Whether to build with the browser login screen or not:&lt;br /&gt;
WITH_MOZILLA=&amp;quot;no&amp;quot;&lt;br /&gt;
&lt;br /&gt;
function update_manifest() {&lt;br /&gt;
    grep -v $1 $PATH_TO_SOURCES/indra/newview/viewer_manifest.py &amp;gt;$TEMP_BUILD_DIR/viewer_manifest.py&lt;br /&gt;
    mv -f $TEMP_BUILD_DIR/viewer_manifest.py $PATH_TO_SOURCES/indra/newview/viewer_manifest.py&lt;br /&gt;
    chmod +x $PATH_TO_SOURCES/indra/newview/viewer_manifest.py&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function compile() {&lt;br /&gt;
    cd $PATH_TO_SOURCES/indra&lt;br /&gt;
    echo &amp;quot;Compiling the client into $TEMP_BUILD_DIR...&amp;quot;&lt;br /&gt;
    scons DISTCC=no BTARGET=client BUILD=releasefordownload MOZLIB=$WITH_MOZILLA&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if [ &amp;quot;$TEMP_BUILD_DIR&amp;quot; == &amp;quot;&amp;quot; ] ; then&lt;br /&gt;
    export TEMP_BUILD_DIR=/tmp/$USER/SL&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Check to see if we simply want to retry a compilation:&lt;br /&gt;
if [ &amp;quot;$1&amp;quot; == &amp;quot;--retry&amp;quot; ] ; then&lt;br /&gt;
    compile&lt;br /&gt;
    exit $?&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Make sure we don&#039;t unpack over an old source tree:&lt;br /&gt;
if [ -d linden ] ; then&lt;br /&gt;
    rm -rf linden/&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if [ -d $PATH_TO_SOURCES ] &amp;amp;&amp;amp; [ &amp;quot;$PATH_TO_SOURCES&amp;quot; != &amp;quot;&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$PATH_TO_SOURCES&amp;quot; != &amp;quot;/&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$PATH_TO_SOURCES&amp;quot; != &amp;quot;.&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$PATH_TO_SOURCES&amp;quot; != &amp;quot;..&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$PATH_TO_SOURCES&amp;quot; != &amp;quot;$HOME&amp;quot; ] ; then&lt;br /&gt;
    rm -rf $PATH_TO_SOURCES/&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Use the parameter (if any) as the path to the archives:&lt;br /&gt;
&lt;br /&gt;
PATH_TO_ARCHIVES=&amp;quot;.&amp;quot;&lt;br /&gt;
if [ &amp;quot;$1&amp;quot; != &amp;quot;&amp;quot; ]; then&lt;br /&gt;
    if [ -d $1 ] ; then&lt;br /&gt;
        PATH_TO_ARCHIVES=$1&lt;br /&gt;
    fi&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s first unpack everything:&lt;br /&gt;
if ! [ -f $PATH_TO_ARCHIVES/slviewer-src-*.tar.gz ] ; then&lt;br /&gt;
    echo &amp;quot;You need slviewer-src !&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
if ! [ -f $PATH_TO_ARCHIVES/slviewer-linux-libs-*.tar.gz ] ; then&lt;br /&gt;
    echo &amp;quot;You need slviewer-linux-libs !&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
if ! [ -f $PATH_TO_ARCHIVES/slviewer-artwork-*.zip ] ; then&lt;br /&gt;
    echo &amp;quot;You need slviewer-artwork !&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
if ! [ -f $PATH_TO_ARCHIVES/fmodapi*.tar.gz ] ; then&lt;br /&gt;
    echo &amp;quot;You need fmodapi !&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
echo &amp;quot;Extracting the files from the archives...&amp;quot;&lt;br /&gt;
tar xzf $PATH_TO_ARCHIVES/slviewer-src-*.tar.gz&lt;br /&gt;
tar xzf $PATH_TO_ARCHIVES/slviewer-linux-libs-*.tar.gz&lt;br /&gt;
unzip $PATH_TO_ARCHIVES/slviewer-artwork-*.zip &amp;gt;/dev/null&lt;br /&gt;
tar xzf $PATH_TO_ARCHIVES/fmodapi*.tar.gz&lt;br /&gt;
&lt;br /&gt;
# fmodapi:&lt;br /&gt;
echo &amp;quot;Copying fmodapi files...&amp;quot;&lt;br /&gt;
cp -a fmodapi*/api/inc/* linden/libraries/i686-linux/include/&lt;br /&gt;
cp fmodapi*/api/libfmod-*.so linden/libraries/i686-linux/lib_release_client/&lt;br /&gt;
rm -rf fmodapi*/&lt;br /&gt;
&lt;br /&gt;
# Move the sources to where we want to hold them:&lt;br /&gt;
if [ &amp;quot;$PATH_TO_SOURCES&amp;quot; != &amp;quot;linden&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$PATH_TO_SOURCES&amp;quot; != &amp;quot;&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Moving the sources to $PATH_TO_SOURCES...&amp;quot;&lt;br /&gt;
    mv -f linden $PATH_TO_SOURCES&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s own the files:&lt;br /&gt;
chown -R $USER: $PATH_TO_SOURCES/&lt;br /&gt;
&lt;br /&gt;
# Make a clean build:&lt;br /&gt;
if [ -d $TEMP_BUILD_DIR ] &amp;amp;&amp;amp; [ &amp;quot;$TEMP_BUILD_DIR&amp;quot; != &amp;quot;&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$TEMP_BUILD_DIR&amp;quot; != &amp;quot;/&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$TEMP_BUILD_DIR&amp;quot; != &amp;quot;.&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$TEMP_BUILD_DIR&amp;quot; != &amp;quot;..&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$TEMP_BUILD_DIR&amp;quot; != &amp;quot;$HOME&amp;quot; ] ; then&lt;br /&gt;
    rm -rf $TEMP_BUILD_DIR/&lt;br /&gt;
fi&lt;br /&gt;
mkdir -p $TEMP_BUILD_DIR&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system GTK+ if available:&lt;br /&gt;
if [ -d /usr/include/atk-1.0 ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_GTK&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system GTK+...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries/i686-linux/include&lt;br /&gt;
    rm -rf atk-1.0/ gtk-2.0/ glib-2.0/ pango-1.0/&lt;br /&gt;
    rm -f ../lib_release_client/libgtk*&lt;br /&gt;
    cp -a /usr/include/atk-1.0 .&lt;br /&gt;
    cp -a /usr/include/gtk-2.0 .&lt;br /&gt;
    cp -a /usr/lib/gtk-2.0/include/* gtk-2.0/&lt;br /&gt;
    cp -a /usr/include/glib-2.0 .&lt;br /&gt;
    cp -a /usr/lib/glib-2.0/include/* glib-2.0/&lt;br /&gt;
    cp -a /usr/include/pango-1.0 .&lt;br /&gt;
    if [ -d /usr/include/cairo ] ; then&lt;br /&gt;
        cp -a /usr/include/cairo/* .&lt;br /&gt;
    fi&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system freetype2 if available:&lt;br /&gt;
if [ -f /usr/include/ft2build.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_FREETYPE2&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system freetype2...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/freetype/ i686-linux/include/llfreetype2/*&lt;br /&gt;
    rm -f include/ft2build.h i686-linux/lib_release_client/libfreetype.a&lt;br /&gt;
    cp -a /usr/include/freetype2/freetype/ i686-linux/include/llfreetype2/&lt;br /&gt;
    cp -a /usr/include/ft2build.h i686-linux/include/llfreetype2/freetype/&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system zlib if available:&lt;br /&gt;
if [ -f /usr/include/zlib.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_ZLIB&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system zlib...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/zlib/&lt;br /&gt;
    mkdir -p i686-linux/include/zlib&lt;br /&gt;
    cp -a /usr/include/zlib*.h i686-linux/include/zlib/&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system jpeglib if available:&lt;br /&gt;
if [ -f /usr/include/jpeglib.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_JPEGLIB&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system jpeglib...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/jpeglib/ i686-linux/lib_release_client/libjpeg.a&lt;br /&gt;
    mkdir -p i686-linux/include/jpeglib&lt;br /&gt;
    cp -a /usr/include/j*.h i686-linux/include/jpeglib/&lt;br /&gt;
    touch i686-linux/include/jpeglib/jinclude.h&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system xmlrpc-epi if available:&lt;br /&gt;
if [ -f /usr/include/xmlrpc.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_XMLRPC&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system xmlrpc-epi...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/xmlrpc-epi/ i686-linux/lib_release_client/libxmlrpc.a&lt;br /&gt;
    mkdir -p i686-linux/include/xmlrpc-epi&lt;br /&gt;
    cp -a /usr/include/xmlrpc*.h i686-linux/include/xmlrpc-epi/&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system ogg if available:&lt;br /&gt;
if [ -f /usr/include/ogg/ogg.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_OGG&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system ogg...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/ogg/ i686-linux/lib_release_client/libogg*&lt;br /&gt;
    update_manifest libogg&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system vorbis if available:&lt;br /&gt;
if [ -f /usr/include/vorbis/vorbisenc.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_VORBIS&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system vorbis...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/vorbis/ i686-linux/lib_release_client/libvorbis*&lt;br /&gt;
    update_manifest libvorbis&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system SDL if available:&lt;br /&gt;
if [ -f /usr/include/SDL/SDL.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_SDL&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system SDL...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries/i686-linux&lt;br /&gt;
    rm -rf include/SDL/ lib_release_client/libSDL*&lt;br /&gt;
    update_manifest libSDL&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system openssl if available:&lt;br /&gt;
if [ -f /usr/lib/libssl.so.0.9.7 ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_SSL&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system openssl...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries/i686-linux/lib_release_client&lt;br /&gt;
    rm -f libssl.* libcrypto.*&lt;br /&gt;
    update_manifest libssl&lt;br /&gt;
    update_manifest libcrypto&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system apr if available:&lt;br /&gt;
if [ -f /usr/include/apr*/apr.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_APR&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system apr...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries/i686-linux&lt;br /&gt;
    rm -rf include/apr-1/*&lt;br /&gt;
    rm -f lib_release_client/libapr*&lt;br /&gt;
    cp -a /usr/include/apr*/* include/apr-1/&lt;br /&gt;
    update_manifest libapr&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system expat if available:&lt;br /&gt;
if [ -f /usr/include/expat.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_EXPAT&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system expat...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/expat/&lt;br /&gt;
    rm -f i686-linux/lib_release_client/libexpat*&lt;br /&gt;
    mkdir -p i686-linux/include/expat&lt;br /&gt;
    cp -a /usr/include/expat*.h i686-linux/include/expat/&lt;br /&gt;
    update_manifest libexpat&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system curl if available:&lt;br /&gt;
if [ -f /usr/include/curl/curl.h ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_CURL&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system curl...&amp;quot;&lt;br /&gt;
    cd $PATH_TO_SOURCES/libraries&lt;br /&gt;
    rm -rf include/curl/&lt;br /&gt;
    rm -f i686-linux/lib_release_client/libcurl.*&lt;br /&gt;
    update_manifest libcurl&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system db4 if available:&lt;br /&gt;
if [ -f /usr/lib/libdb-4.2.so ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_DB4&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system db4...&amp;quot;&lt;br /&gt;
    rm -f $PATH_TO_SOURCES/libraries/i686-linux/lib_release_client/libdb*.so&lt;br /&gt;
    update_manifest libdb&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s use the system uuid if available:&lt;br /&gt;
if [ -f /lib/libuuid.so.1 ] &amp;amp;&amp;amp; [ &amp;quot;$USE_SYSTEM_UUID&amp;quot; == &amp;quot;yes&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Using the system libuuid...&amp;quot;&lt;br /&gt;
    rm -f $PATH_TO_SOURCES/libraries/i686-linux/lib_release_client/libuuid.*&lt;br /&gt;
    update_manifest libuuid&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Remove the google-perftools stuff if not present in the libraries package&lt;br /&gt;
# (problem seen in SL v1.17):&lt;br /&gt;
if ! [ -f $PATH_TO_SOURCES/libraries/i686-linux/lib_release_client/libtcmalloc.so* ] ; then&lt;br /&gt;
    update_manifest tcmalloc&lt;br /&gt;
    update_manifest stacktrace&lt;br /&gt;
    # The following lines remove the&lt;br /&gt;
    #   &amp;quot;external_libs += [&#039;tcmalloc&#039;, &#039;stacktrace&#039;]&amp;quot;&lt;br /&gt;
    # line from SConstruct... and many other lines which renders SConstruct&lt;br /&gt;
    # unusable to build anything else than the client... this is a quick&#039;n&lt;br /&gt;
    # dirty patch. :-P&lt;br /&gt;
    grep -v tcmalloc $PATH_TO_SOURCES/indra/SConstruct &amp;gt;$TEMP_BUILD_DIR/SConstruct&lt;br /&gt;
    mv -f $TEMP_BUILD_DIR/SConstruct $PATH_TO_SOURCES/indra/SConstruct&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Update the manifest file and enable libkdu packaging. I&#039;m too lazy to use&lt;br /&gt;
# awk or perl, here, but that&#039;s indeed what should be done...&lt;br /&gt;
# The following (very dirty) code may break at some point, depending on what&lt;br /&gt;
# LL will put in comments in the manifest file...&lt;br /&gt;
# First, remove the lines with libstdc++.so.6 and the crash logger:&lt;br /&gt;
update_manifest libstdc&lt;br /&gt;
update_manifest crash_logger&lt;br /&gt;
# Now, any line with a &#039;#&#039; followed with several spaces _should_ be dealing&lt;br /&gt;
# with the libkdu stuff... So, we simply remove the &#039;#&amp;quot;...&lt;br /&gt;
sed -e &amp;quot;s/#        them/# them/&amp;quot; $PATH_TO_SOURCES/indra/newview/viewer_manifest.py &amp;gt;$TEMP_BUILD_DIR/viewer_manifest.py&lt;br /&gt;
sed -e &amp;quot;s/#   /   /&amp;quot; $TEMP_BUILD_DIR/viewer_manifest.py &amp;gt;$PATH_TO_SOURCES/indra/newview/viewer_manifest.py&lt;br /&gt;
#mv -f $TEMP_BUILD_DIR/viewer_manifest.py $PATH_TO_SOURCES/indra/newview/viewer_manifest.py&lt;br /&gt;
chmod +x $PATH_TO_SOURCES/indra/newview/viewer_manifest.py&lt;br /&gt;
&lt;br /&gt;
# Missing file... at least in v1.17.&lt;br /&gt;
touch $PATH_TO_SOURCES/indra/newview/secondlife-i686.supp&lt;br /&gt;
&lt;br /&gt;
# Add tune flags, if any:&lt;br /&gt;
if [ &amp;quot;$TUNE_FLAGS&amp;quot; != &amp;quot;&amp;quot; ] ; then&lt;br /&gt;
    sed -e &amp;quot;s/-O2/-O2 $TUNE_FLAGS/&amp;quot; $PATH_TO_SOURCES/indra/SConstruct &amp;gt;$TEMP_BUILD_DIR/SConstruct&lt;br /&gt;
    mv -f $TEMP_BUILD_DIR/SConstruct $PATH_TO_SOURCES/indra/SConstruct&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
compile&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FreeBSD ==&lt;br /&gt;
&lt;br /&gt;
A list of patches is given for [[Compiling the viewer (FreeBSD)]].&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Talk:LlSpeakText&amp;diff=16845</id>
		<title>Talk:LlSpeakText</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Talk:LlSpeakText&amp;diff=16845"/>
		<updated>2007-04-05T20:28:13Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: on the FURRY constants and function arguments&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;How will this handle unicode characters and languages other then english? [[User:Strife Onizuka|Strife Onizuka]] 11:38, 3 April 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
The furry variants are just weird. What exactly is a &amp;quot;furry&amp;quot; voice? Such a thing would have to vary depending on species. For instance, snakes and dragons can be considered to be in the furry (doesn&#039;t have to be literally furry) category, cats and mice shouldn&#039;t sound the same, etc. [[User:Dale Glass|Dale Glass]] 13:28, 5 April 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
Also, I think the targets list is unnecessary. This would be a local text to speech converter on the user&#039;s computer, so a list of targets wouldn&#039;t be necessarily as voice wouldn&#039;t be streamed: it&#039;d be a normal chat message that&#039;d get converted at the destination. I&#039;d do the function this way: llSpeakText(list params, string text). Besides the voice there are other things that could be interesting to have such as volume, intonation parameters such as speed and pitch, and anything else that might come up. [[User:Dale Glass|Dale Glass]] 13:28, 5 April 2007 (PDT)&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Improving_compilation_time&amp;diff=16591</id>
		<title>Improving compilation time</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Improving_compilation_time&amp;diff=16591"/>
		<updated>2007-04-01T15:25:14Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: Benchmark results and conclusions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Improving compilation time ==&lt;br /&gt;
Based on the benchmarks below, the following conclusions were made:&lt;br /&gt;
* The more RAM, the better. Enough RAM will made the hard disk&#039;s performance irrelevant.&lt;br /&gt;
* Using a RAM disk for /tmp or even the full system doesn&#039;t noticeably improve performance if enough RAM is present.&lt;br /&gt;
* Given enough RAM, the process will be entirely CPU bound.&lt;br /&gt;
* A better hard disk will make a significant difference in link time if enough RAM can&#039;t be obtained.&lt;br /&gt;
* Compiling using more processes (-j3 vs -j2) may be counterproductive if there&#039;s not enough RAM.&lt;br /&gt;
* Gentoo compiled 15% faster.&lt;br /&gt;
* Gentoo ran scons 50% slower.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Benchmarks ==&lt;br /&gt;
&lt;br /&gt;
=== Hardware ===&lt;br /&gt;
* Athlon 64 X2 5200+ (1MB cache)&lt;br /&gt;
* 4GB ECC DDR2 666 RAM&lt;br /&gt;
* Root on RAID-1, SAMSUNG HD300LJ and Maxtor 6V300F0&lt;br /&gt;
&lt;br /&gt;
=== Settings ===&lt;br /&gt;
* Compiling with -j2&lt;br /&gt;
* llmozlib enabled&lt;br /&gt;
* building 32 bit SL version&lt;br /&gt;
* Source from http://svn.daleglass.net/secondlife, rev 81.&lt;br /&gt;
 &lt;br /&gt;
=== Software ===&lt;br /&gt;
* Gentoo, x86_64, gcc 4.1.1 &lt;br /&gt;
* Ubuntu Edgy, x86_64, gcc 4.1.2&lt;br /&gt;
&lt;br /&gt;
=== Methodology ===&lt;br /&gt;
&lt;br /&gt;
Gentoo tests were done with /tmp on tmpfs.&lt;br /&gt;
 &lt;br /&gt;
Ubuntu tests were done with the whole install on /tmp on tmpfs, and the whole install on disk. This took about 1.5GB RAM:&lt;br /&gt;
 &lt;br /&gt;
* 334MB for temporary files generated during compilation&lt;br /&gt;
* 642MB for the source code&lt;br /&gt;
* 462MB for the Ubuntu install (probably can be trimmed a bit)&lt;br /&gt;
&lt;br /&gt;
Ubuntu tests were done as follows: Distribution was installed with debootstrap. Sources were copied into it (same copy as used for Gentoo). The whole tree, OS and sources included was copied to /tmp (on tmps), and chrooted into. &lt;br /&gt;
&lt;br /&gt;
The &amp;quot;(on disk)&amp;quot; tests were done afterwards, by copying the whole tree (1.5GB) back to disk (as some changes were required to get the build going).&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;(after reboot)&amp;quot; were done as follows:&lt;br /&gt;
# Do required preparations (eg, binary removal)&lt;br /&gt;
# Reboot&lt;br /&gt;
# Login&lt;br /&gt;
# Chroot&lt;br /&gt;
# Build&lt;br /&gt;
 &lt;br /&gt;
X wasn&#039;t running during the tests.&lt;br /&gt;
&lt;br /&gt;
=== Results ===&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable}}&lt;br /&gt;
|+&#039;&#039;&#039;Benchmark results&#039;&#039;&#039;&lt;br /&gt;
|-{{Hl2}}&lt;br /&gt;
!Test&lt;br /&gt;
!Timings&lt;br /&gt;
!Gentoo&lt;br /&gt;
!Ubuntu (after reboot)&lt;br /&gt;
!Ubuntu (on disk)&lt;br /&gt;
!Ubuntu (on RAM disk)&lt;br /&gt;
|-&lt;br /&gt;
|| Full build || Real || 16m44.594s || 19m23.391s || 19m12.447s || 19m5.572s&lt;br /&gt;
|-&lt;br /&gt;
|| || User || 29m25.549s || 35m15.595s || 35m23.223s || 35m24.639s&lt;br /&gt;
|-&lt;br /&gt;
|| || System || 2m57.599s || 2m9.673s || 2m16.113s || 2m13.387s&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|| Rebuild || Real || 0m41.752s || 0m27.656s || 0m15.457s || 0m15.444s&lt;br /&gt;
|-&lt;br /&gt;
|| || User || 0m39.938s || 0m14.858s || 0m14.963s || 0m14.771s&lt;br /&gt;
|-&lt;br /&gt;
|| || System || 0m1.722s || 0m0.952s || 0m0.644s || 0m0.784s&lt;br /&gt;
|-&lt;br /&gt;
|| Relink || Real || 1m24.408s || 1m17.616s || 0m41.092s || 0m41.268s&lt;br /&gt;
|-&lt;br /&gt;
|| || User || 1m12.687s || 0m37.895s || 0m37.455s || 0m38.016s&lt;br /&gt;
|-&lt;br /&gt;
|| || System || 0m4.599s || 0m4.360s || 0m3.546s || 0m3.258s&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Get_source_and_compile&amp;diff=16590</id>
		<title>Get source and compile</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Get_source_and_compile&amp;diff=16590"/>
		<updated>2007-04-01T14:56:44Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: Added link to Improving compilation time&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{OSWikiContribBox}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Even if you don&#039;t plan to develop, just the act of downloading and compiling can uncover problems. If the version you download doesn&#039;t build on your platform, file a bug.&lt;br /&gt;
&lt;br /&gt;
== Getting the source ==&lt;br /&gt;
Linden Labs distributes the viewer source code on the [[source downloads]] page.  Linden Labs currently does not yet provide public access to a [[version control repository]].  However, there are other websites that do host repositories. &lt;br /&gt;
&lt;br /&gt;
=== Official Downloads ===&lt;br /&gt;
&lt;br /&gt;
Linden Labs does provide current and past downloads in an archived format, see the [[source downloads]] page.&lt;br /&gt;
&lt;br /&gt;
=== OSLCC ===&lt;br /&gt;
&lt;br /&gt;
The OSLCC project has a public Subversion repository hosted on SourceForge with the complete source tree as provided. If you are already familiar with Subversion, here is a list of repositories to the latest versions: (or click to browse)&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|Release:&lt;br /&gt;
|[http://oslcc.svn.sourceforge.net/viewvc/oslcc/ll/release https://oslcc.svn.sourceforge.net/svnroot/oslcc/ll/release/trunk]&lt;br /&gt;
|-&lt;br /&gt;
|Focus Beta:&lt;br /&gt;
|[http://oslcc.svn.sourceforge.net/viewvc/oslcc/ll/release/branches/1.13.4 https://oslcc.svn.sourceforge.net/svnroot/oslcc/ll/release/branches/1.13.4/trunk]&lt;br /&gt;
|-&lt;br /&gt;
|First Look:&lt;br /&gt;
|[http://oslcc.svn.sourceforge.net/viewvc/oslcc/ll/release/branches/1.14.0 https://oslcc.svn.sourceforge.net/svnroot/oslcc/ll/release/branches/1.14.0/trunk]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== OpenMetaverse ===&lt;br /&gt;
&lt;br /&gt;
[http://openmetaverse.org OpenMetaverse] hosts an OpenSL project with a public subversion repository.&lt;br /&gt;
&lt;br /&gt;
== Compiling ==&lt;br /&gt;
&lt;br /&gt;
Per platform instructions are available for the following platforms:&lt;br /&gt;
* [[Compiling the viewer (MSVS2005)|Microsoft Windows - Visual Studio 2005 &amp;amp; Visual C++ 2005 Express]]&lt;br /&gt;
* [[Compiling the viewer (MSVS2003)|Microsoft Windows - Visual Studio .NET 2003]]&lt;br /&gt;
** see also: [[Compiling the viewer libraries (MSVS 2003)]]&lt;br /&gt;
* [[Cross compiling the viewer (i686-mingw32)|Microsoft Windows - Cross compiling on Linux]]&lt;br /&gt;
* [[Compiling the viewer (Mac OS X)|Mac OS X]]&lt;br /&gt;
* [[Compiling the viewer (Linux)|Linux]]&lt;br /&gt;
* [[Compiling the viewer (FreeBSD)|FreeBSD]]&lt;br /&gt;
&lt;br /&gt;
See [[Common compilation problems]] if you run into errors while building.&lt;br /&gt;
&lt;br /&gt;
See [[Improving compilation time]] for information on how to compile faster&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Talk:OpenSource-Dev&amp;diff=16271</id>
		<title>Talk:OpenSource-Dev</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Talk:OpenSource-Dev&amp;diff=16271"/>
		<updated>2007-03-27T19:43:01Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: /* The problem: discussion for entertainment purposes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Open Source Talk Page}}&lt;br /&gt;
&lt;br /&gt;
== Mailing list etiquette? ==&lt;br /&gt;
&lt;br /&gt;
As of this moment, there are 387 subscribers to the sldev mailing list.  As you would expect with a big public mailing list, most of those people don&#039;t post to the list.  Of course, a handful of people post a &#039;&#039;lot&#039;&#039;.  That&#039;s ok; if you have something to say, you should say it.  However, I also want to make sure that if someone has something to say that everyone needs to read, that it gets read.  If there&#039;s too much to sort through, that might not happen.&lt;br /&gt;
&lt;br /&gt;
We&#039;ve discussed the idea that we should split off separate mailing lists.  In particular, there are two different proposals:&lt;br /&gt;
* {{Jira|MISC-30|alt=sldev-contributors - for those that have signed contribution agreements (MISC-30)}}&lt;br /&gt;
* {{Jira|MISC-44|alt=sldev-policy - for legal and policy issues (MISC-44)}}&lt;br /&gt;
&lt;br /&gt;
I&#039;ve resisted going down that path, because I think that the groupings we want are going to be more fluid than is practical to keep up with (one day we&#039;ll want to split off policy, the next day we&#039;ll want to split off caching discussions, etc).&lt;br /&gt;
&lt;br /&gt;
I&#039;d like to keep things almost the way that they are, but introduce new guidelines:&lt;br /&gt;
&lt;br /&gt;
*  If a topic generates more than five replies in less than 24 hours, it&#039;s time to redirect that conversation to one of our other tools, either the wiki or the bug tracker.&lt;br /&gt;
*  If the topic is not specifically a Second Life development-related topic (e.g. this email, or a licensing discussion), it should be redirected to the wiki or the bug tracker immediately.  One post per 48 hours should be sufficient to bring it to everyone&#039;s attention.&lt;br /&gt;
*  If after 48 hours, the topic seems to have died out on the alternate forum, it&#039;s ok to reraise the issue on this mailing list, summarizing the offlist conversation thusfar, and calling for further comment in the alternate forum.&lt;br /&gt;
&lt;br /&gt;
I think this policy strikes a good balance between making sure that people have a large forum to raise and discuss a broad spectrum of issues, while at the same time ensuring that the list doesn&#039;t become overwhelmed with discussion on a single topic that may not be of interest to everyone on the list.&lt;br /&gt;
&lt;br /&gt;
Thoughts? -- [[User:Rob Linden|Rob Linden]] 10:26, 23 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
:As for the the topics that have done this (moved to the wiki or jira), they have been very successful. I second. [[User:Dzonatas Sol|Dzonatas Sol]] 21:31, 23 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
:Email is obviously a bad idea, but jira/wiki is worse.  Forums are the obvious answer to anyone - unless your goal is to put road blocks up before discussion (which certainly makes sense when you want to keep the community from organizing), in which case I suppose this all make sense.&lt;br /&gt;
&lt;br /&gt;
:Jira is for bug reports.   Wiki pages are great for documents detailing focused ideas, such as wikipedia entries.   But having a dialogue between participants is not what they are meant for.  There are no threads, no way to filter, rate participants and find new discussion.  The only goal seems to be, as I said above, to keep the community from discussing coherently among themselves.&lt;br /&gt;
&lt;br /&gt;
:What LL is looking for here, let&#039;s face it, are people to contribute to their open source project without giving up some kind of control to the community.  I&#039;m sure that makes sense to some people around here, but it makes zero sense to me.  &lt;br /&gt;
&lt;br /&gt;
:I (and I am sure many others) have avoided  contributing to opensim simply because we&#039;ve been waiting for LL to come around and realise that they need to work with us as a community and not as people to do their singular bidding.   In some ways, opensl is becoming a threat to us all, not the opportunity LL wants to make it out to be.   The only way to deal with that threat seems to be to work with the opensim crowd and wrench control away rather than work with Linden Lab.   &lt;br /&gt;
&lt;br /&gt;
:Is this really what you guys wanted?  It certainly isn&#039;t what I want.   It puts at risk everything I (and everyone else) have tried to build (and we&#039;ve built a lot for SL.  Far more than 95% of your so called open source developers) in secondlife.. but so is the whole direction you&#039;re going with OpenSL.    &lt;br /&gt;
&lt;br /&gt;
:It&#039;s a question of picking our masters - the freedom BSD folks or the &amp;quot;you must GPL everything and you can only talk in jira or wiki folks.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:Pick your poison, I guess. -- {{User|Iron Perth}}&lt;br /&gt;
&lt;br /&gt;
::I don&#039;t know why you feel that way so strongly. It is obvious that as an outside developer that communication won&#039;t be as easy as being an internal employee. However, there are still features like the [http://forums.secondlife.com/forumdisplay.php?f=296 Technical Talk] area on the forums. Jira issues can easily have forums attached to them; however, the forums are limited to premium users.&lt;br /&gt;
::E-Mail is great. The best forum is the modern threaded e-mail unless you are stuck with hotmail or yahoo.&lt;br /&gt;
::I&#039;m on a dozen of mail-lists for different projects. SLDev is actually pretty quiet compared to the others, yet the others have &amp;quot;user&amp;quot; lists for the various discussions. [[User:Dzonatas Sol|Dzonatas Sol]] 21:28, 23 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
::----&lt;br /&gt;
::I would not object to adding forums as an acceptable conversation redirect target.  The reason for directing this conversations to the wiki or jira  is to &#039;&#039;help&#039;&#039; the community organize.  There is no conspiracy here.  I prefer using a wiki talk page so the discussion for a topic is attached directly to the topic itself.  So, when newcomers read about a new topic (such as a feature design or these guidelines), they can quickly access the debate about what went into shaping the content of the main page.&lt;br /&gt;
&lt;br /&gt;
::However, if you feel more strongly about using a forum instead, that&#039;s fine too.  I personally don&#039;t think it&#039;ll be as effective as the wiki, but I don&#039;t mind seeing different experiments.  The point is to avoid having huge conversations on the mailing list where no one tries to summarize or capture key ideas.  If the goal is discussion for discussion&#039;s sake, the status quo would have been just fine.  However, I&#039;m assuming that the community wants to accomplish something, so I&#039;m trying to help.&lt;br /&gt;
&lt;br /&gt;
::As I also said before, I think it&#039;s fine to raise a topic after a couple of days if the conversation died down before reaching a resolution.  I would hope that before reraising it to 380+ people, that someone take the time to actually summarize the conversation and document forward progress.  I don&#039;t think it&#039;s exclusively Linden Lab employees that would appreciate the courtesy. -- [[User:Rob Linden|Rob Linden]] 23:49, 23 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
:----&lt;br /&gt;
:I&#039;m not sure if I like this change all that much so far. Moving conversations to the wiki makes things less convenient to discuss, IMO. Now instead of watching my inbox, I&#039;ve got to use a RSS reader, and subscribe to the feed, but that includes not only the sldev discussion, but also completely unrelated changes such as LSL stuff, and typo corrections. That makes it more effort to keep up with, not less.&lt;br /&gt;
&lt;br /&gt;
:Additionally, there&#039;s a loss of functionality in that editing a wiki is less convenient than email. Quoting is harder, formatting requires knowing the wiki syntax with all its conventions, the [[Help:Editing|Editing help]] link leads to a page that&#039;s nearly blank, the option of CCing people or not sending a message to the discussion list doesn&#039;t exist anymore (maybe userpages, but that&#039;s public), and adding something to a wiki requires previewing it first to make sure formatting came out right. There&#039;s also the potential problem of conflicting changes to the same page. Also, for some reason, my RSS reader keeps telling me about new entries from yesterday (what&#039;s up with that?) that don&#039;t appear as the more recent entry, but somewhere in the middle of my list. RSS also slows discussions down, as checking it too frequently places extra load on the server, while IMAP has new mail notification.&lt;br /&gt;
&lt;br /&gt;
:IMO, all of these things are great when they&#039;re used for their intended purpose. Mailing lists are good for discussions, keep them for that. Wikis are good for collaborative documetation, but not all that great for discussing. Jira is definitely the right place for bug reporting, but I don&#039;t like the idea of discussing anything there. Jira is currently slow, requires logging in, has usability problems (login bug) and doesn&#039;t seem to have any sort of reply notification that I can see. -- {{unsigned|Dale Glass}}&lt;br /&gt;
&lt;br /&gt;
::Just had such a &#039;potential conflict&#039;. Having to merge when wanting to discuss, is, ... well, ... kinda odd. -- [[User:Boroondas Gupte|Boroondas Gupte]] 16:21, 25 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
== Deep linking to conversations ==&lt;br /&gt;
&lt;br /&gt;
Summaries are a fine thing. But, even if a discussion has died out for some while and so was replaced by its summary, you might sometimes wish to search for some single contribution and, once you found it, refer to it. Doing so by links to wiki-diffs of the discussion page&#039;s history will be a pain. Is there some better way to do it? I know the question is rather hypothetical right now and could be asked when the problem actually arises, but I think its relevant for the decision of what topic to redirect to what media. -- [[User:Boroondas Gupte|Boroondas Gupte]] 16:16, 25 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
:One way to do it is how I&#039;ve just done it.  Split the conversation into its own thread (with title) and link to it.  That means potentially redirecting the context of a quote (admittedly dangerous), but you get a link you can use (e.g. https://wiki.secondlife.com/wiki/Talk:SLDev#Deep_linking_to_conversations ) -- [[User:Rob Linden|Rob Linden]] 17:59, 25 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
== Can things stay organized on a wiki? ==&lt;br /&gt;
&lt;br /&gt;
Although I see the problems of a high traffic mailing list, I share Iron&#039;s concerns. Up to now, people discussing on the wiki were very persistent in keeping things formatted and signing their contributions, so you can still see the threads in some way. But can we keep this up as the community is growing? Perhaps someone&#039;s got a good idea how this can be made easier, by e.g. a wiki-template generating some thread/tree-like structures with some easy way to answer to a single node.&lt;br /&gt;
&lt;br /&gt;
To ease tracking all discussions on the wiki derived from the mailing list, we could put them in a common category. Any ideas how to name such category? Can someone think of an equivalent for the forums, for jira and the other media where discussions might be redirected to? -- [[User:Boroondas Gupte|Boroondas Gupte]] 16:16, 25 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
:I took the liberty of breaking this into it&#039;s own thread, too.  I remember hearing about threaded discussions for MediaWiki last year at the Wikimania Hacking Days.  I&#039;m not sure if any production-quality software emerged.  If someone finds a plugin we can use, I&#039;ll look into it (no promises, since I want to make sure I&#039;m introducing something I can commit to support for a while).&lt;br /&gt;
&lt;br /&gt;
:Even without dedicated software, I think the answer is &amp;quot;yes, we can stay organized&amp;quot;, or perhaps &amp;quot;yes, we need to stay organized to be effective&amp;quot;.  It&#039;s one thing to make it easy for people writing; more importantly, we all need to make things easy for whoever is going to write the code.  I suspect that a lot of people here have the best intentions, and all have valuable opinions of how it should be done, but it won&#039;t matter if this dies down a month from now &#039;&#039;unless&#039;&#039; this conversation is in a format that can be easily read and digested.  I think what we&#039;ve created here so far is far more readable than a long mailing list thread.&lt;br /&gt;
&lt;br /&gt;
:Re: category for discussions, I&#039;ve created a template that I added to this page (&amp;lt;nowiki&amp;gt;{{Open Source Talk Page}}&amp;lt;/nowiki&amp;gt;).  Please add this talk page to any page you think the group should keep track of this way. -- [[User:Rob Linden|Rob Linden]] 18:32, 25 March 2007 (PDT)&lt;br /&gt;
::I&#039;m starting to doubt that. Honestly, the more I use this, the less I like it. Strife has just put Paula&#039;s name on something I wrote for some reason, for instance. I&#039;m sure it&#039;s a mistake, but really all of this is extra inconvenience for pretty much no gain. Monitoring it is inconvenient. I&#039;m seeing my RSS reader report the same change multiple times now. Now I&#039;m also seeing that I&#039;ve got to keep watching the page where I wrote something to make sure that what I said isn&#039;t misattributed or misrepresented, and that I didn&#039;t forget to sign it. Such things aren&#039;t a problem for say, documenting LSL, where there shouldn&#039;t be such a thing as content ownership in the first place, but it&#039;s not good for having a discussion. I can&#039;t even be sure that if I decide to forget about this for a few weeks I&#039;ll be able to find what I said in the place where I left it. For all I know it might be moved to another section, be archived somewhere, deleted, or moved to another page.&lt;br /&gt;
&lt;br /&gt;
::None of these problems even existed on the mailing list. What I say there will stay in the same place where I wrote it, in the same context, in my exact wording, signed with my GPG key. And there&#039;s no reason why I a link to my post from the archive today shouldn&#039;t remain valid several years later. Besides, this moving around clearly means that we&#039;re already starting to compensate for the deficiencies of the Wiki when used for this purpose. And why are we using a tool that creates extra work instead of avoiding it? [[User:Dale Glass|Dale Glass]] 19:08, 25 March 2007 (PDT)&lt;br /&gt;
:::I don&#039;t agree with this use of &amp;quot;:&amp;quot; to thread discussion on the talk page. I only use it if it is how the page flows. I suggest to use a template for talk pages that would reformat someones message to look similar to the SL forums &amp;quot;boxed&amp;quot; style. Then we could just wrap our messages up in the template and direct people to use that. [[User:Dzonatas Sol|Dzonatas Sol]] 19:25, 25 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
== Easier for writers vs. easier for readers ==&lt;br /&gt;
&lt;br /&gt;
Okay, I guess things aren&#039;t as peachy as I&#039;d hoped.  However, I&#039;d like to keep this experiment going for a couple of weeks.  In spite of the extra overhead, I think that the result will be something that people will be much more likely to read down the road.  I&#039;m assuming that everyone here is writing because they want others to read what they&#039;ve written (rather than for some therapeutic purpose).  In that regard, I believe this method is more effective than the old way.  If after two weeks, if I&#039;m the only one who likes this way of doing things, we&#039;ll figure out something new.  &lt;br /&gt;
&lt;br /&gt;
:Well, it&#039;s easier to read, the problem is that it&#039;s making it much harder to write, and especially much harder to actively participate. It takes me more time and effort to follow a conversation here. I&#039;m writing here because you asked me to. Obviously, it wouldn&#039;t have been much good if I had decided to be a jerk and ignore you completely, or started whining &amp;quot;I don&#039;t like it, take it back!&amp;quot; without providing any good reason for it. The longer I post here the more ammunition I can come up with ;-) [[User:Dale Glass|Dale Glass]] 03:29, 26 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
I have to make clear, though, I really don&#039;t think the old status quo was working.  I think there was probably a couple dozen really keeping up, and a lot of people who would only read selected messages.  I got the sense that some people were trying to dominate the conversation by being the fastest to respond, rather than the most deliberative.&lt;br /&gt;
&lt;br /&gt;
:I&#039;m not sure this is going to help any with that problem. I can still easily post quickly here trying to dominate the conversation, as everybody is slowed down accordingly. I&#039;m not sure that&#039;s a good thing either. Why slow things down so that it takes a day to settle an argument when it could be settled in an hour? The longer it takes to discuss, the longer it delays actual coding. [[User:Dale Glass|Dale Glass]] 03:29, 26 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
Using the wiki as a talk mechanism, I think others a month or two down the road will be much more willing to read the entire [[Talk:Texture cache]] page from start to finish, and absorb the arguments.  Whatever replacement we have for this mechanism needs to have similar characteristics.  I&#039;m not suggesting we abolish the mailing list for discussion altogether, but rather, just use the wiki when dealing with a hot topic.  Let&#039;s channel the energy and passion that people have toward the topic to make sure that we end up with a document of lasting value, instead of an endless thread tucked away in a mailing list archive that someone &#039;&#039;may&#039;&#039; find when they plug &amp;quot;texture cache&amp;quot; into their favorite search engine (and, which, even if they find it, they may have no desire to read because it&#039;s just too much).&lt;br /&gt;
&lt;br /&gt;
:I see your point, however I don&#039;t think this is the right way of dealing with it. If you want to make it easier for newcomers to read, why not try to use some better mailing list archiving software? For example I like Gmane ([http://thread.gmane.org/gmane.linux.kernel/| example here]). Alternatively, use a forum. If going that way, I&#039;d like to see something that supports threads and makes posting code easy. &lt;br /&gt;
&lt;br /&gt;
:The main problem I see with moving active discussions to the wiki is that active discussions are actually more difficult on it. It&#039;s strange when we&#039;re having a lively discussion on the list, then suddenly we hit the limit, and have to move over to the wiki. It also takes extra effort and slows things down.&lt;br /&gt;
:&#039;&#039;&#039;&amp;lt;nowiki&amp;gt;[&amp;lt;/nowiki&amp;gt;The rest of this answer was moved to its own [[Talk:SLDev#Inworld_discussion_of_hottest_of_hot_topics | subtopic]]&amp;lt;nowiki&amp;gt;]&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Re: Dale&#039;s concern about PGP signatures.  I agree that mailing lists are much more effective for PGP sigs.  The wiki does at least have the advantage of a complete audit log, but PGP sigs are better.  Nonetheless, I think you&#039;ll find that getting in the habit of signing comments isn&#039;t that tough -- [[User:Rob Linden|Rob Linden]] 22:58, 25 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
:It&#039;s not PGP signatures per se that concern me, rather, the difficulty of keeping the integrity of the conversation. If I stay something stupid on the list (which I already have a couple times ;-) it&#039;ll stay eternally archived, signed with my key to boot, in the way I said it. But that is fine. I &#039;&#039;&#039;did&#039;&#039;&#039; say that after all. Meanwhile, here something I said might over time end up somewhere else entirely, and in another context. There&#039;s no way to refer to the original and pristine post here, so it can&#039;t be 100% sure that what everybody seems to have written is in the context and exact wording it was intended. If we can&#039;t be sure that everybody is being represented correctly, having a serious discussion becomes a lot harder [[User:Dale Glass|Dale Glass]] 03:29, 26 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
===Inworld discussion of hottest of hot topics===&lt;br /&gt;
Let me try to propose something new, however: How about we actually use SL for discussions? ;-)&lt;br /&gt;
When it becomes clear that the discussion is becoming so heated that we&#039;ll end up with a huge long thread people won&#039;t want to read, or we&#039;re about to start flaming each other, how about we decide to hold an in-world meeting right that moment, discuss whatever needs getting discussed in person and without any delays due to email checking intervals, RSS, etc, reach an agreement (or not), and post a condensed version of the result on the wiki, then link to the full log of the conversation for those who want the gory details? In essence, like SLDev-traffic, but done by the participants (I &#039;&#039;&#039;really&#039;&#039;&#039; appreciate Soft Noel&#039;s contribution here, but I&#039;m not sure how long she&#039;ll be able to keep up. This would seem to scale better)&lt;br /&gt;
&lt;br /&gt;
Thus, instead of a 50 posts thread, or a 10 page wiki talk page, we&#039;d have something like this:&lt;br /&gt;
After a long in-world discussion (link to full log) between Dale Glass, Strife Onizuka and Paula Innis, consensus was reached that texture caching should be done this way:&lt;br /&gt;
(10 lines detailing the mechanism, with links to the appropiate parts of the full talk)&lt;br /&gt;
Only thing that might be a problem is that this could seem to exclude people from the discussions, but I&#039;d like to make it clear that my intention here is to take heated disputes between a few participants somewhere they&#039;ll get done faster, and when that is settled somebody can always argue with the conclusion. [[User:Dale Glass|Dale Glass]] 03:29, 26 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
:As inworld discussions lack threads even more than the wiki does and as they tend to move fast, there would be a problem for people who need some time to answer, like me, not being a native speaker (writer?) of English and so needing quite some time to formulate and producing lots of typos that I use to correct before committing my posts. Doing so in a real-time conversation will often lead to the talk having moved to other (sub)topics by the time I have my answer ready. As someone like me you&#039;ll have the following options:&lt;br /&gt;
:*Keep the answer for yourself, and though not actively participate in the conversation. If the answer is relevant, this might not be a good option.&lt;br /&gt;
:*Answer when you got your answer ready, even if the conversation has moved on, and so confusing the other participants and making the log harder to read.&lt;br /&gt;
:*Answer right away, not minding formulation and typography, again confusing others and making the log harder to read.&lt;br /&gt;
::In-world discussions lack threads, but it&#039;s not my intention to say that we should debate everything in-world. But IMO, 20 posts arguing about whether the cache should be stored in one big file or not aren&#039;t nearly as interesting as the end result of the discussion. To somebody new, &amp;quot;we agreed on X&amp;quot; is almost certainly more useful. The Wiki seems to me like a great place for documenting things like the results of a discussion, but not nearly as good for actually having one.&lt;br /&gt;
&lt;br /&gt;
::I perfectly understand what you&#039;re saying about needing time, btw. English is my third language, and of course some time ago it took me considerable effort to type anything coherent in it. But I&#039;m sure that&#039;s not a new thing for people in SL, where there are people from everywhere. Simply say that you need some more to come up with an answer, I&#039;m sure we&#039;re not so inconsiderate that we can&#039;t wait a bit. I don&#039;t know about other people, but when I see people typing I usually wait to see what they say before continuing.  [[User:Dale Glass|Dale Glass]] 06:06, 26 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
:Inworld discussions might be good if only some few want to discuss/flame who preferably already know each other well and so can adapt to every one&#039;s typing abilities. But as soon as there are more than -- let&#039;s say five -- people wanting to participate in a hot discussion who only know each other from their respective wiki and mailing list posts, some slower ones will either be left behind or be forced to (although they might not want to) dominate the discussion to get said what they wanted to say.&lt;br /&gt;
&lt;br /&gt;
::IMO, every medium has good and bad uses. Wikis are good for documenting. Mailing lists are good for long, well thought discussions. If it&#039;s the sort of thing where I&#039;d have to read source code, research, etc, or I&#039;m going to announce an idea, a list is the right place. On the other hand, when you get a thread with 2 or 3 people discussing a single subject, and talking to each other, then that&#039;s pretty much a conversation, and probably would be best done in-world. &lt;br /&gt;
&lt;br /&gt;
::So, resuming, my overall suggestion would be: Discuss development on the list. If it starts to turn into a long argument between a few people, have them to in-world and argue that there. When a consensus, decision, or interesting point of some sort is made, document it on the wiki. [[User:Dale Glass|Dale Glass]] 06:06, 26 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
:::/me agrees. -- [[User:Boroondas Gupte|Boroondas Gupte]] 07:55, 26 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
:I already experienced that kind of problem in inworld discussions of less relevant (non-Dev) topics, where it normally doesn&#039;t matter much which of those (equally bad) options you keep to. And I also know that problem from a reader&#039;s POV, having read quite some of the logs of Lindens&#039; office hours I didn&#039;t attend.-- [[User:Boroondas Gupte|Boroondas Gupte]] 04:51, 26 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
:Dale Glass&#039;s suggestion of utilising in-world conversations to make some level of decisions is probably unworkable as SLDev expands, on the grounds of timezones (let alone diaries!) and lack of wide-spread input due to probably few people being aware of the discussion topic in advnace. Similarly, the use of &amp;quot;:&amp;quot; and multiples for threading is something that clearly works on the large discussions on Wikipedia, etc so can work well for medium-busy discussions, also having the great advantage that everyone will see new ideas pop up on &#039;&#039;recent changes&#039;&#039;. Email lists often suffer from subject-lag, but are still useful though tracking back a topic may prove impossible, as are forums with threaded conversations, where at least there is a full record of the discussion. Overall, it is going to depend on the topic, its immediacy-for-decision, and how widespread that discussion needs to reach in terms of interested people, which will make the selection of which communication method to use, not some pre-determined &#039;all this way or not at all&#039; approach. --[[User:Alison Wheels|Alison Wheels]] 08:57, 26 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
* [[User:Dzonatas Sol|Dzonatas Sol]] writes on 12:16, 26 March 2007 (PDT):&lt;br /&gt;
The above conversation with all the mixed levels of tab discussion has just made it harder to read. When you start to insert your paragraph in between the paragraphs of the one before you, it gets much harder to follow. That is what makes wiki&#039;s hard to follow. If people follow reply etiquette to thread discussions nicely, it is not that hard. Here, don&#039;t interrupt someones reply. Quote and summarized if needed.&lt;br /&gt;
&lt;br /&gt;
As for in-world discussion, main concerns is timezones, reply speed (foreign speakers or office workers), and those that are actually actively coding aren&#039;t in-world because they are testing the client.&lt;br /&gt;
&lt;br /&gt;
== The problem: discussion for entertainment purposes ==&lt;br /&gt;
&lt;br /&gt;
I guess this discussion is starting to make me figure out what the real problem is.  Here&#039;s a couple of totally valid reasons for a long thread:&lt;br /&gt;
*  Person A, who is committed to write code, asks for discussion about a topic.  Much debate ensues, guided by Person A, who is ultimately tasked with writing the code.  This may result in Person B and C arguing, but as long as Person A finds the discussion interesting, that&#039;s ok.&lt;br /&gt;
*  Person A, who is committed to write code, states that they are going to do something.  Person B doesn&#039;t like the approach.  Until Person A cuts off the conversation, the thread is probably useful.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s what gets tedious:&lt;br /&gt;
*  Person A, who is not committed to write code, throws out an idea for the list to consider.  This provokes much debate among Person B and Person C, neither of whom is interested in committing to the code.  So, there&#039;s a long debate where Person B and Person C go back and forth, but no one is committed to write code or even document an idea.  Nobody is clear on who the audience is.&lt;br /&gt;
&lt;br /&gt;
Most of the arguments about why taking things off list don&#039;t work center on the wiki being a poor medium for debate.  I suppose it might be, but the question in my mind is &amp;quot;why are we having a debate?&amp;quot;  If someone can actually tell me why a debate is important, then I can get behind actually leaving debate open (on the mailing list) on that topic.  However, the debates that I&#039;ve seen lately don&#039;t seem to have that characteristic.&lt;br /&gt;
&lt;br /&gt;
So, if directing discussions offlist isn&#039;t the answer, what is?  Moderate the mailing list?  -- [[User:Rob Linden|Rob Linden]] 22:19, 26 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
Tough call. As I said on the list, &amp;quot;If it&#039;s not interesting in the absence of immediate feedback, it&#039;s probably not worth spending time on... that&#039;s a sign you&#039;re involved in the discussion rather than the topic.&amp;quot; On the other hand, a certain amount of noise on the list probably shouldn&#039;t be seen as automatically counterproductive (for example, one thing that I&#039;ve found immensely useful in following lists and ignoring noise is to subscribe to the list as a digest). On the gripping hand it&#039;s the productive individual who gets to make that call as to what&#039;s counterproductive.&lt;br /&gt;
&lt;br /&gt;
Partial answer, for people thinking of reading the list: subscribe to a digest, and simply skip digests completely that don&#039;t contain any subjects that interest you.&lt;br /&gt;
&lt;br /&gt;
Partial answer for the list manager: can you chunk digests by subject, to make the above easier?&lt;br /&gt;
&lt;br /&gt;
One project I started several years ago was a mailing list archive that dumped each message into a wiki. At the time there wasn&#039;t a lot of easily hackable wiki software that could be fed into, so it stalled out. The idea was that you could go in and turn a message into a wiki page, with wiki links between the message and thread and some clever way to add to the page with tags in the email. -- [[User:Argent Stonecutter|Argent Stonecutter]] 10:19, 27 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
:I agree it&#039;s a tough call.  Part of the reason why I&#039;m making this drive to increase list traffic quality is that I&#039;d like to start heavily advocating more Linden Lab use.  One precondition of that is that I have to be able to say, with a straight face, &amp;quot;yes, involvement in this mailing list is a good use of your time&amp;quot;.  Sure, the [[SLDev Traffic]] summaries are fantastic, but reading that is not the same as being involved with the mailing list.  The guidelines I&#039;ve chosen aren&#039;t too different than our own internal communication guidelines, so I believe they will foster the type of involvement I&#039;m hoping for.&lt;br /&gt;
&lt;br /&gt;
: We can put the burden of wheat/chaff sorting on the reader, but given the size of the list, I think it&#039;s fair to ask a little more of writers.  In exchange for getting a bigger audience, you have to be more considerate of that audience.  -- [[User:Rob Linden|Rob Linden]] 10:42, 27 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
:I don&#039;t understand how the wiki is supposed to fix that problem. There&#039;s absolutely no reason why the tedious exchange you describe above can&#039;t happen on the wiki. The only reason I think we&#039;re not seeing this sort of thing on the wiki yet is because you step in after it happens on the list, so it stays there. Eventually somebody will start one of those on the wiki. [[User:Dale Glass|Dale Glass]] 12:43, 27 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
== FYI, I&#039;m personally responding to people who post about these guideines on-list ==&lt;br /&gt;
&lt;br /&gt;
I had asked that conversation about the new guidelines occur here, which, unfortunately has caused a discussion to break out on list.  Please don&#039;t use the list, and please don&#039;t reply on-list to those people.  I have been (and will continue to) personally reply to those people, rather than replying on list.  The people who are interested and/or need to participate in this conversation are right here.  I suspect that most people did not sign up for sldev to keep abreast of tedious mailing list policy questions, so please be courteous to those people.  Thanks -- [[User:Rob Linden|Rob Linden]] 11:22, 27 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
== Conversations that span years ==&lt;br /&gt;
&lt;br /&gt;
One thing that people who don&#039;t have a lot of wiki experience may not understand about conversations on wikis is that, unlike mailing list conversations, they can span weeks, months or even years, as opposed to mailing list conversations that rarely live past a week or so of inactivity.  For design discussions, this is a really important attribute.  It helps us develop a better collective memory of what we&#039;ve discussed and what we haven&#039;t, and makes it much quicker for people to come up to speed.  &lt;br /&gt;
&lt;br /&gt;
Because this benefit isn&#039;t immediately apparent, I really need to call this out.  Please be patient.  A few months from now, when everyone here is sick of the current topic, and when someone asks &amp;quot;has anyone considered using Berkeley DB for texture caches?&amp;quot;, you&#039;ll be able to say &amp;quot;[[Talk:Texture cache|yes we did]]&amp;quot;, and redirect the conversation to the wiki -- [[User:Rob Linden|Rob Linden]] 11:28, 27 March 2007 (PDT)&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Talk:OpenSource-Dev&amp;diff=16190</id>
		<title>Talk:OpenSource-Dev</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Talk:OpenSource-Dev&amp;diff=16190"/>
		<updated>2007-03-26T13:06:13Z</updated>

		<summary type="html">&lt;p&gt;Dale Glass: /* Inworld discussion of hottest of hot topics */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Open Source Talk Page}}&lt;br /&gt;
&lt;br /&gt;
== Mailing list etiquette? ==&lt;br /&gt;
&lt;br /&gt;
As of this moment, there are 387 subscribers to the sldev mailing list.  As you would expect with a big public mailing list, most of those people don&#039;t post to the list.  Of course, a handful of people post a &#039;&#039;lot&#039;&#039;.  That&#039;s ok; if you have something to say, you should say it.  However, I also want to make sure that if someone has something to say that everyone needs to read, that it gets read.  If there&#039;s too much to sort through, that might not happen.&lt;br /&gt;
&lt;br /&gt;
We&#039;ve discussed the idea that we should split off separate mailing lists.  In particular, there are two different proposals:&lt;br /&gt;
* {{Jira|MISC-30|alt=sldev-contributors - for those that have signed contribution agreements (MISC-30)}}&lt;br /&gt;
* {{Jira|MISC-44|alt=sldev-policy - for legal and policy issues (MISC-44)}}&lt;br /&gt;
&lt;br /&gt;
I&#039;ve resisted going down that path, because I think that the groupings we want are going to be more fluid than is practical to keep up with (one day we&#039;ll want to split off policy, the next day we&#039;ll want to split off caching discussions, etc).&lt;br /&gt;
&lt;br /&gt;
I&#039;d like to keep things almost the way that they are, but introduce new guidelines:&lt;br /&gt;
&lt;br /&gt;
*  If a topic generates more than five replies in less than 24 hours, it&#039;s time to redirect that conversation to one of our other tools, either the wiki or the bug tracker.&lt;br /&gt;
*  If the topic is not specifically a Second Life development-related topic (e.g. this email, or a licensing discussion), it should be redirected to the wiki or the bug tracker immediately.  One post per 48 hours should be sufficient to bring it to everyone&#039;s attention.&lt;br /&gt;
*  If after 48 hours, the topic seems to have died out on the alternate forum, it&#039;s ok to reraise the issue on this mailing list, summarizing the offlist conversation thusfar, and calling for further comment in the alternate forum.&lt;br /&gt;
&lt;br /&gt;
I think this policy strikes a good balance between making sure that people have a large forum to raise and discuss a broad spectrum of issues, while at the same time ensuring that the list doesn&#039;t become overwhelmed with discussion on a single topic that may not be of interest to everyone on the list.&lt;br /&gt;
&lt;br /&gt;
Thoughts? -- [[User:Rob Linden|Rob Linden]] 10:26, 23 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
:As for the the topics that have done this (moved to the wiki or jira), they have been very successful. I second. [[User:Dzonatas Sol|Dzonatas Sol]] 21:31, 23 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
:Email is obviously a bad idea, but jira/wiki is worse.  Forums are the obvious answer to anyone - unless your goal is to put road blocks up before discussion (which certainly makes sense when you want to keep the community from organizing), in which case I suppose this all make sense.&lt;br /&gt;
&lt;br /&gt;
:Jira is for bug reports.   Wiki pages are great for documents detailing focused ideas, such as wikipedia entries.   But having a dialogue between participants is not what they are meant for.  There are no threads, no way to filter, rate participants and find new discussion.  The only goal seems to be, as I said above, to keep the community from discussing coherently among themselves.&lt;br /&gt;
&lt;br /&gt;
:What LL is looking for here, let&#039;s face it, are people to contribute to their open source project without giving up some kind of control to the community.  I&#039;m sure that makes sense to some people around here, but it makes zero sense to me.  &lt;br /&gt;
&lt;br /&gt;
:I (and I am sure many others) have avoided  contributing to opensim simply because we&#039;ve been waiting for LL to come around and realise that they need to work with us as a community and not as people to do their singular bidding.   In some ways, opensl is becoming a threat to us all, not the opportunity LL wants to make it out to be.   The only way to deal with that threat seems to be to work with the opensim crowd and wrench control away rather than work with Linden Lab.   &lt;br /&gt;
&lt;br /&gt;
:Is this really what you guys wanted?  It certainly isn&#039;t what I want.   It puts at risk everything I (and everyone else) have tried to build (and we&#039;ve built a lot for SL.  Far more than 95% of your so called open source developers) in secondlife.. but so is the whole direction you&#039;re going with OpenSL.    &lt;br /&gt;
&lt;br /&gt;
:It&#039;s a question of picking our masters - the freedom BSD folks or the &amp;quot;you must GPL everything and you can only talk in jira or wiki folks.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:Pick your poison, I guess. -- {{User|Iron Perth}}&lt;br /&gt;
&lt;br /&gt;
::I don&#039;t know why you feel that way so strongly. It is obvious that as an outside developer that communication won&#039;t be as easy as being an internal employee. However, there are still features like the [http://forums.secondlife.com/forumdisplay.php?f=296 Technical Talk] area on the forums. Jira issues can easily have forums attached to them; however, the forums are limited to premium users.&lt;br /&gt;
::E-Mail is great. The best forum is the modern threaded e-mail unless you are stuck with hotmail or yahoo.&lt;br /&gt;
::I&#039;m on a dozen of mail-lists for different projects. SLDev is actually pretty quiet compared to the others, yet the others have &amp;quot;user&amp;quot; lists for the various discussions. [[User:Dzonatas Sol|Dzonatas Sol]] 21:28, 23 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
::----&lt;br /&gt;
::I would not object to adding forums as an acceptable conversation redirect target.  The reason for directing this conversations to the wiki or jira  is to &#039;&#039;help&#039;&#039; the community organize.  There is no conspiracy here.  I prefer using a wiki talk page so the discussion for a topic is attached directly to the topic itself.  So, when newcomers read about a new topic (such as a feature design or these guidelines), they can quickly access the debate about what went into shaping the content of the main page.&lt;br /&gt;
&lt;br /&gt;
::However, if you feel more strongly about using a forum instead, that&#039;s fine too.  I personally don&#039;t think it&#039;ll be as effective as the wiki, but I don&#039;t mind seeing different experiments.  The point is to avoid having huge conversations on the mailing list where no one tries to summarize or capture key ideas.  If the goal is discussion for discussion&#039;s sake, the status quo would have been just fine.  However, I&#039;m assuming that the community wants to accomplish something, so I&#039;m trying to help.&lt;br /&gt;
&lt;br /&gt;
::As I also said before, I think it&#039;s fine to raise a topic after a couple of days if the conversation died down before reaching a resolution.  I would hope that before reraising it to 380+ people, that someone take the time to actually summarize the conversation and document forward progress.  I don&#039;t think it&#039;s exclusively Linden Lab employees that would appreciate the courtesy. -- [[User:Rob Linden|Rob Linden]] 23:49, 23 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
:----&lt;br /&gt;
:I&#039;m not sure if I like this change all that much so far. Moving conversations to the wiki makes things less convenient to discuss, IMO. Now instead of watching my inbox, I&#039;ve got to use a RSS reader, and subscribe to the feed, but that includes not only the sldev discussion, but also completely unrelated changes such as LSL stuff, and typo corrections. That makes it more effort to keep up with, not less.&lt;br /&gt;
&lt;br /&gt;
:Additionally, there&#039;s a loss of functionality in that editing a wiki is less convenient than email. Quoting is harder, formatting requires knowing the wiki syntax with all its conventions, the [[Help:Editing|Editing help]] link leads to a page that&#039;s nearly blank, the option of CCing people or not sending a message to the discussion list doesn&#039;t exist anymore (maybe userpages, but that&#039;s public), and adding something to a wiki requires previewing it first to make sure formatting came out right. There&#039;s also the potential problem of conflicting changes to the same page. Also, for some reason, my RSS reader keeps telling me about new entries from yesterday (what&#039;s up with that?) that don&#039;t appear as the more recent entry, but somewhere in the middle of my list. RSS also slows discussions down, as checking it too frequently places extra load on the server, while IMAP has new mail notification.&lt;br /&gt;
&lt;br /&gt;
:IMO, all of these things are great when they&#039;re used for their intended purpose. Mailing lists are good for discussions, keep them for that. Wikis are good for collaborative documetation, but not all that great for discussing. Jira is definitely the right place for bug reporting, but I don&#039;t like the idea of discussing anything there. Jira is currently slow, requires logging in, has usability problems (login bug) and doesn&#039;t seem to have any sort of reply notification that I can see. -- {{unsigned|Dale Glass}}&lt;br /&gt;
&lt;br /&gt;
::Just had such a &#039;potential conflict&#039;. Having to merge when wanting to discuss, is, ... well, ... kinda odd. -- [[User:Boroondas Gupte|Boroondas Gupte]] 16:21, 25 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
== Deep linking to conversations ==&lt;br /&gt;
&lt;br /&gt;
Summaries are a fine thing. But, even if a discussion has died out for some while and so was replaced by its summary, you might sometimes wish to search for some single contribution and, once you found it, refer to it. Doing so by links to wiki-diffs of the discussion page&#039;s history will be a pain. Is there some better way to do it? I know the question is rather hypothetical right now and could be asked when the problem actually arises, but I think its relevant for the decision of what topic to redirect to what media. -- [[User:Boroondas Gupte|Boroondas Gupte]] 16:16, 25 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
:One way to do it is how I&#039;ve just done it.  Split the conversation into its own thread (with title) and link to it.  That means potentially redirecting the context of a quote (admittedly dangerous), but you get a link you can use (e.g. https://wiki.secondlife.com/wiki/Talk:SLDev#Deep_linking_to_conversations ) -- [[User:Rob Linden|Rob Linden]] 17:59, 25 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
== Can things stay organized on a wiki? ==&lt;br /&gt;
&lt;br /&gt;
Although I see the problems of a high traffic mailing list, I share Iron&#039;s concerns. Up to now, people discussing on the wiki were very persistent in keeping things formatted and signing their contributions, so you can still see the threads in some way. But can we keep this up as the community is growing? Perhaps someone&#039;s got a good idea how this can be made easier, by e.g. a wiki-template generating some thread/tree-like structures with some easy way to answer to a single node.&lt;br /&gt;
&lt;br /&gt;
To ease tracking all discussions on the wiki derived from the mailing list, we could put them in a common category. Any ideas how to name such category? Can someone think of an equivalent for the forums, for jira and the other media where discussions might be redirected to? -- [[User:Boroondas Gupte|Boroondas Gupte]] 16:16, 25 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
:I took the liberty of breaking this into it&#039;s own thread, too.  I remember hearing about threaded discussions for MediaWiki last year at the Wikimania Hacking Days.  I&#039;m not sure if any production-quality software emerged.  If someone finds a plugin we can use, I&#039;ll look into it (no promises, since I want to make sure I&#039;m introducing something I can commit to support for a while).&lt;br /&gt;
&lt;br /&gt;
:Even without dedicated software, I think the answer is &amp;quot;yes, we can stay organized&amp;quot;, or perhaps &amp;quot;yes, we need to stay organized to be effective&amp;quot;.  It&#039;s one thing to make it easy for people writing; more importantly, we all need to make things easy for whoever is going to write the code.  I suspect that a lot of people here have the best intentions, and all have valuable opinions of how it should be done, but it won&#039;t matter if this dies down a month from now &#039;&#039;unless&#039;&#039; this conversation is in a format that can be easily read and digested.  I think what we&#039;ve created here so far is far more readable than a long mailing list thread.&lt;br /&gt;
&lt;br /&gt;
:Re: category for discussions, I&#039;ve created a template that I added to this page (&amp;lt;nowiki&amp;gt;{{Open Source Talk Page}}&amp;lt;/nowiki&amp;gt;).  Please add this talk page to any page you think the group should keep track of this way. -- [[User:Rob Linden|Rob Linden]] 18:32, 25 March 2007 (PDT)&lt;br /&gt;
::I&#039;m starting to doubt that. Honestly, the more I use this, the less I like it. Strife has just put Paula&#039;s name on something I wrote for some reason, for instance. I&#039;m sure it&#039;s a mistake, but really all of this is extra inconvenience for pretty much no gain. Monitoring it is inconvenient. I&#039;m seeing my RSS reader report the same change multiple times now. Now I&#039;m also seeing that I&#039;ve got to keep watching the page where I wrote something to make sure that what I said isn&#039;t misattributed or misrepresented, and that I didn&#039;t forget to sign it. Such things aren&#039;t a problem for say, documenting LSL, where there shouldn&#039;t be such a thing as content ownership in the first place, but it&#039;s not good for having a discussion. I can&#039;t even be sure that if I decide to forget about this for a few weeks I&#039;ll be able to find what I said in the place where I left it. For all I know it might be moved to another section, be archived somewhere, deleted, or moved to another page.&lt;br /&gt;
&lt;br /&gt;
::None of these problems even existed on the mailing list. What I say there will stay in the same place where I wrote it, in the same context, in my exact wording, signed with my GPG key. And there&#039;s no reason why I a link to my post from the archive today shouldn&#039;t remain valid several years later. Besides, this moving around clearly means that we&#039;re already starting to compensate for the deficiencies of the Wiki when used for this purpose. And why are we using a tool that creates extra work instead of avoiding it? [[User:Dale Glass|Dale Glass]] 19:08, 25 March 2007 (PDT)&lt;br /&gt;
:::I don&#039;t agree with this use of &amp;quot;:&amp;quot; to thread discussion on the talk page. I only use it if it is how the page flows. I suggest to use a template for talk pages that would reformat someones message to look similar to the SL forums &amp;quot;boxed&amp;quot; style. Then we could just wrap our messages up in the template and direct people to use that. [[User:Dzonatas Sol|Dzonatas Sol]] 19:25, 25 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
== Easier for writers vs. easier for readers ==&lt;br /&gt;
&lt;br /&gt;
Okay, I guess things aren&#039;t as peachy as I&#039;d hoped.  However, I&#039;d like to keep this experiment going for a couple of weeks.  In spite of the extra overhead, I think that the result will be something that people will be much more likely to read down the road.  I&#039;m assuming that everyone here is writing because they want others to read what they&#039;ve written (rather than for some therapeutic purpose).  In that regard, I believe this method is more effective than the old way.  If after two weeks, if I&#039;m the only one who likes this way of doing things, we&#039;ll figure out something new.  &lt;br /&gt;
&lt;br /&gt;
:Well, it&#039;s easier to read, the problem is that it&#039;s making it much harder to write, and especially much harder to actively participate. It takes me more time and effort to follow a conversation here. I&#039;m writing here because you asked me to. Obviously, it wouldn&#039;t have been much good if I had decided to be a jerk and ignore you completely, or started whining &amp;quot;I don&#039;t like it, take it back!&amp;quot; without providing any good reason for it. The longer I post here the more ammunition I can come up with ;-) [[User:Dale Glass|Dale Glass]] 03:29, 26 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
I have to make clear, though, I really don&#039;t think the old status quo was working.  I think there was probably a couple dozen really keeping up, and a lot of people who would only read selected messages.  I got the sense that some people were trying to dominate the conversation by being the fastest to respond, rather than the most deliberative.&lt;br /&gt;
&lt;br /&gt;
:I&#039;m not sure this is going to help any with that problem. I can still easily post quickly here trying to dominate the conversation, as everybody is slowed down accordingly. I&#039;m not sure that&#039;s a good thing either. Why slow things down so that it takes a day to settle an argument when it could be settled in an hour? The longer it takes to discuss, the longer it delays actual coding. [[User:Dale Glass|Dale Glass]] 03:29, 26 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
Using the wiki as a talk mechanism, I think others a month or two down the road will be much more willing to read the entire [[Talk:Texture cache]] page from start to finish, and absorb the arguments.  Whatever replacement we have for this mechanism needs to have similar characteristics.  I&#039;m not suggesting we abolish the mailing list for discussion altogether, but rather, just use the wiki when dealing with a hot topic.  Let&#039;s channel the energy and passion that people have toward the topic to make sure that we end up with a document of lasting value, instead of an endless thread tucked away in a mailing list archive that someone &#039;&#039;may&#039;&#039; find when they plug &amp;quot;texture cache&amp;quot; into their favorite search engine (and, which, even if they find it, they may have no desire to read because it&#039;s just too much).&lt;br /&gt;
&lt;br /&gt;
:I see your point, however I don&#039;t think this is the right way of dealing with it. If you want to make it easier for newcomers to read, why not try to use some better mailing list archiving software? For example I like Gmane ([http://thread.gmane.org/gmane.linux.kernel/| example here]). Alternatively, use a forum. If going that way, I&#039;d like to see something that supports threads and makes posting code easy. &lt;br /&gt;
&lt;br /&gt;
:The main problem I see with moving active discussions to the wiki is that active discussions are actually more difficult on it. It&#039;s strange when we&#039;re having a lively discussion on the list, then suddenly we hit the limit, and have to move over to the wiki. It also takes extra effort and slows things down.&lt;br /&gt;
:&#039;&#039;&#039;&amp;lt;nowiki&amp;gt;[&amp;lt;/nowiki&amp;gt;The rest of this answer was moved to its own [[Talk:SLDev#Inworld_discussion_of_hottest_of_hot_topics | subtopic]]&amp;lt;nowiki&amp;gt;]&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Re: Dale&#039;s concern about PGP signatures.  I agree that mailing lists are much more effective for PGP sigs.  The wiki does at least have the advantage of a complete audit log, but PGP sigs are better.  Nonetheless, I think you&#039;ll find that getting in the habit of signing comments isn&#039;t that tough -- [[User:Rob Linden|Rob Linden]] 22:58, 25 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
:It&#039;s not PGP signatures per se that concern me, rather, the difficulty of keeping the integrity of the conversation. If I stay something stupid on the list (which I already have a couple times ;-) it&#039;ll stay eternally archived, signed with my key to boot, in the way I said it. But that is fine. I &#039;&#039;&#039;did&#039;&#039;&#039; say that after all. Meanwhile, here something I said might over time end up somewhere else entirely, and in another context. There&#039;s no way to refer to the original and pristine post here, so it can&#039;t be 100% sure that what everybody seems to have written is in the context and exact wording it was intended. If we can&#039;t be sure that everybody is being represented correctly, having a serious discussion becomes a lot harder [[User:Dale Glass|Dale Glass]] 03:29, 26 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
===Inworld discussion of hottest of hot topics===&lt;br /&gt;
Let me try to propose something new, however: How about we actually use SL for discussions? ;-)&lt;br /&gt;
When it becomes clear that the discussion is becoming so heated that we&#039;ll end up with a huge long thread people won&#039;t want to read, or we&#039;re about to start flaming each other, how about we decide to hold an in-world meeting right that moment, discuss whatever needs getting discussed in person and without any delays due to email checking intervals, RSS, etc, reach an agreement (or not), and post a condensed version of the result on the wiki, then link to the full log of the conversation for those who want the gory details? In essence, like SLDev-traffic, but done by the participants (I &#039;&#039;&#039;really&#039;&#039;&#039; appreciate Soft Noel&#039;s contribution here, but I&#039;m not sure how long she&#039;ll be able to keep up. This would seem to scale better)&lt;br /&gt;
&lt;br /&gt;
Thus, instead of a 50 posts thread, or a 10 page wiki talk page, we&#039;d have something like this:&lt;br /&gt;
After a long in-world discussion (link to full log) between Dale Glass, Strife Onizuka and Paula Innis, consensus was reached that texture caching should be done this way:&lt;br /&gt;
(10 lines detailing the mechanism, with links to the appropiate parts of the full talk)&lt;br /&gt;
Only thing that might be a problem is that this could seem to exclude people from the discussions, but I&#039;d like to make it clear that my intention here is to take heated disputes between a few participants somewhere they&#039;ll get done faster, and when that is settled somebody can always argue with the conclusion. [[User:Dale Glass|Dale Glass]] 03:29, 26 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
:As inworld discussions lack threads even more than the wiki does and as they tend to move fast, there would be a problem for people who need some time to answer, like me, not being a native speaker (writer?) of English and so needing quite some time to formulate and producing lots of typos that I use to correct before committing my posts. Doing so in a real-time conversation will often lead to the talk having moved to other (sub)topics by the time I have my answer ready. As someone like me you&#039;ll have the following options:&lt;br /&gt;
:*Keep the answer for yourself, and though not actively participate in the conversation. If the answer is relevant, this might not be a good option.&lt;br /&gt;
:*Answer when you got your answer ready, even if the conversation has moved on, and so confusing the other participants and making the log harder to read.&lt;br /&gt;
:*Answer right away, not minding formulation and typography, again confusing others and making the log harder to read.&lt;br /&gt;
::In-world discussions lack threads, but it&#039;s not my intention to say that we should debate everything in-world. But IMO, 20 posts arguing about whether the cache should be stored in one big file or not aren&#039;t nearly as interesting as the end result of the discussion. To somebody new, &amp;quot;we agreed on X&amp;quot; is almost certainly more useful. The Wiki seems to me like a great place for documenting things like the results of a discussion, but not nearly as good for actually having one.&lt;br /&gt;
&lt;br /&gt;
::I perfectly understand what you&#039;re saying about needing time, btw. English is my third language, and of course some time ago it took me considerable effort to type anything coherent in it. But I&#039;m sure that&#039;s not a new thing for people in SL, where there are people from everywhere. Simply say that you need some more to come up with an answer, I&#039;m sure we&#039;re not so inconsiderate that we can&#039;t wait a bit. I don&#039;t know about other people, but when I see people typing I usually wait to see what they say before continuing.  [[User:Dale Glass|Dale Glass]] 06:06, 26 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
:Inworld discussions might be good if only some few want to discuss/flame who preferably already know each other well and so can adapt to every one&#039;s typing abilities. But as soon as there are more than -- let&#039;s say five -- people wanting to participate in a hot discussion who only know each other from their respective wiki and mailing list posts, some slower ones will either be left behind or be forced to (although they might not want to) dominate the discussion to get said what they wanted to say.&lt;br /&gt;
&lt;br /&gt;
::IMO, every medium has good and bad uses. Wikis are good for documenting. Mailing lists are good for long, well thought discussions. If it&#039;s the sort of thing where I&#039;d have to read source code, research, etc, or I&#039;m going to announce an idea, a list is the right place. On the other hand, when you get a thread with 2 or 3 people discussing a single subject, and talking to each other, then that&#039;s pretty much a conversation, and probably would be best done in-world. &lt;br /&gt;
&lt;br /&gt;
::So, resuming, my overall suggestion would be: Discuss development on the list. If it starts to turn into a long argument between a few people, have them to in-world and argue that there. When a consensus, decision, or interesting point of some sort is made, document it on the wiki. [[User:Dale Glass|Dale Glass]] 06:06, 26 March 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
:I already experienced that kind of problem in inworld discussions of less relevant (non-Dev) topics, where it normally doesn&#039;t matter much which of those (equally bad) options you keep to. And I also know that problem from a reader&#039;s POV, having read quite some of the logs of Lindens&#039; office hours I didn&#039;t attend.-- [[User:Boroondas Gupte|Boroondas Gupte]] 04:51, 26 March 2007 (PDT)&lt;/div&gt;</summary>
		<author><name>Dale Glass</name></author>
	</entry>
</feed>