Sign in Join
Wiki copytemporary

Cross compiling/es: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11## Introducción
22
33Esta es una breve introducción para los nuevos en esta temática. Las siguientes secciones describen cómo configurar un sistema para realizar compilación cruzada ( - e.g. trabajar bajo linux y generar ejecutables Win32 desde el mismo (o esto mismo para FreeBSD o Darwin, etc.). En este caso la plataforma usada para la compilación a menudo se refiere como "host" o anfitrión (Linux en el ejemplo anterior), mientras que la plataforma para la que queremos crear los binaros ejecutables es el "target" u objetivo. FreePascal es un compilador y básicamente convierte el código fuente en binario (lenguaje máquina). Estos binarios además contienen información sobre cómo los inicia el sistema operativo. Además, los binarios referencian a las APIs aportadas por un sistema operativo en particular, siendo esta la razón por la que es necesaria una implementación diferente de la Run Time Library (RTL) para cada sistema operativo. Por tanto, tales binarios son específicos de cada plataforma. FreePascal por sí mismo no necesita demasiados ajustes. Puede crear binarios para muchas plataformas. Simplemente indíqueselo.
44
55## "Host" y "Target" en la misma CPU
66
77FPC se ha diseñado de manera que el compilador distribuido pueda generar código de máquina para determinada CPU (debido a que diferentes CPUs necesitan diferentes códigos de máquina) y sepa de los requerimientos específicos para todas las plataformas soportadas (Sistemas Operativos) disponibles en una CPU en particular. Esto significa que se puede realizar compilación cruzada (cross-compilation) con un mismo compilador usado para compilación nativa siempre que te mantengas en la misma CPU.
88
99## "Host" y "Target" en diferentes CPUs
1010
1111Si se necesita crear binarios para una CPU diferente entonces necesitará un compilador "cruzado" especial, p.e. un compilador ejecutándose en la plataforma host, pero que sea capaz de crear código de máquina para una CPU distinta (en el caso de FPC, tal compilador-cruzado debería ser nuevamente capaz de establecer como objetivo final _target_ todas las plataformas disponibles en la CPU que deseemos). Este compilador cruzado se ubica por lo general en el mismo directorio que el compilador nativo. Tal compilador cruzado podría ser compilado por usted, o puede usar uno ya construido provisto por el equipo FPC (usualmente plataformas que en su mayoría se usan en dispositivos portables tales como arm-linux o arm-wince, debido a que no se usan por lo general como plataformas host). El binario FPC puede entonces elegir el compilador correcto (tanto el compilador nativo como el compilador cruzado) para la CPU objetivo usando el parámetro **-P**.
1212
1313## Targets soportados
1414
1515Revise el [[Free Pascal supported targets|artículo sobre sistemas operativos soportados de Target]] para la lista completa.
1616
1717## Ensamblador y enlazador
1818
1919El compilador es sólo una parte. También necesitamos el ensamblador y el enlazador. FPC provee un ensamblador interno y/o enlazador para ciertas plataformas, pero otras plataformas necesitan herramientas externas. Por lo general estas herramientas no son capaces de crear binarios para distintas plataformas. Es por lo que tenemos que utilizar un enlazador especial '-ld' y un ensamblador '-as' para cada plataforma objetivo. Estas son las utilidades binarias (binutils). Ver[[Binutils]]
2020
2121## Unidades para objetivos (target)
2222
2323Después de crear (o tener/instalar) las utilidades cruzadas, se necesita el FPC RTL y otras unidades compiladas para la plataforma objetivo escogida. Por ejemplo, cada plataforma objetivo necesita un archivo system.ppu diferente (unidad System), etc. Estas unidades pueden ser tanto compiladas utilizando tu compilador configurado para compilar conforme a la plataforma objetivo, o puede usar de forma potencial las unidades oficialmente compiladas (y distribuidas) con la misma versión de FPC (si están disponibles en formato usable bajo la plataforma host en particular).
2424
2525No valdrá que no necesite un nuevo compilador cruzado para cada combinación entre CPU y sistema operativo, pero realmente necesita las Unidades FPC. Por ejemplo, en una configuración de host para Linux que compile hacia Windows y Raspberri Pi, el directorio /usr/lib/fpc/3.2.2/units puede contener los siguientes directorios:
2626
2727arm-linux i386-linux i386-win32 x86_64-linux x86_64-win64
2828
2929Cada directorio de estos contendrá un directorio para cada una de las unidades FPC, cada una con archivos .o y .ppu.
3030
3131## Configuración
3232
3333Entonces hay que adaptar el archivo de configuración de FPC, de manera que la compilación cruzada resulte fácil y nos podamos olvidar de todos los aburridos detalles. Lo mismo hay que hacer para el LCL - la Librería de Componentes de Lazarus (en caso de utilizar Lazarus) - Y después de esto ya se puede realizar compilación cruzada para las (distintas)plataformas objetivo. Los binarios resultantes deben a continuación ser copiados a una máquina corriendo la plataforma objetivo, o copiarlas a un sistema virtualizado/emulado (e.g. Wine para binarios Win32 bajo Linux, etc.).
3434
3535## Pasos básicos
3636
3737Hay unos cuantos pasos comunes relacionados con la compilación cruzada que hay que realizar en todos los casos:
3838
3939- Tener un compilador de FreePascal para la plataforma desde la que se desea compilar.
4040- Tener el código fuente de FreePascal (excepto para el caso especial de tener todo preparado por alguien previamente).
4141- Necesita además construir a partir del código fuente u obtener las utilidades binarias cruzadas (cross-binutils) que corran en la plataforma actual y estén diseñadas para construir programas para la plataforma objetivo deseada.
4242- Algunas veces necesitarás algunos archivos objetivo para el que se está compilando.
4343
4444# Desde Linux
4545
4646## Desde Linux x64 a Linux i386
4747
4848Para las ocasiones en que la distribución de Linux de 64 bits sea capaz de compilar programas de 32 bits pero debido al modo en el que el proceso de construcción de FPC fue diseñado existen unas cuantas cosas que se deben hacer.
4949
5050- Primero compruebe si ya tiene los archivos i386-linux-ld y i386-linux-as:
5151
5252``` bash
5353$ which i386-linux-ld
5454```
5555
5656``` bash
5757$ which i386-linux-as
5858```
5959
6060- Si ya tiene estos archivos salte a la cabecera "Compilar FPC". En caso contrario ambos se pueden crear utilizando los siguientes script:
6161
6262``` bash
6363
6464#!/bin/bash
6565
6666# Create /usr/bin/i386-linux-ld
6767cat >/usr/bin/i386-linux-ld << EOF
6868#!/bin/bash
6969ld -A elf32-i386 $@
7070EOF
7171chmod +x /usr/bin/i386-linux-ld
7272
7373# Create /usr/bin/i386-linux-as
7474cat >/usr/bin/i386-linux-as << EOF
7575#!/bin/bash
7676as --32 $@
7777EOF
7878chmod +x /usr/bin/i386-linux-as
7979```
8080
8181- Compilar FPC:
8282
8383``` bash
8484cd /usr/share/fpcsrc/<version>
8585sudo make all CPU_TARGET=i386
8686```
8787
8888- Entonces:
8989
9090``` bash
9191sudo make crossinstall CPU_TARGET=i386
9292```
9393
9494- Esto es. Edita tu fichero /etc/fpc.cfg file según necesites.
9595
9696## Desde Linux a ARM Linux
9797
9898Puedes encontrar información sobre como hacer la configuración para un objetivo ARM Linux (e.g. Zaurus) en [[Setup Cross Compile For ARM]].
9999
100100## Desde Linux hacia Windows
101101
102102La información sobre compilación cruzada con Lazarus se puede encontrar en [[Cross compiling for Windows under Linux]]
103103
104104## Desde Linux a Darwin o Mac OS X
105105
106106Por favor echa un vistazo a [[Cross compiling OSX on Linux|aquí]].
107107
108108# Desde Windows
109109
110110## Desde Windows a Linux
111111
112112Esto es menos trivial, hay algo de información en el [[buildfaq]]
113113
114114ver también [[fpcup]] para descripciones sobre las binutils que funcionan y que librerías/ficheros copiar.
115115
116116Tal como las Build FAQ (Preguntas Frecuentes) explican, necesitarás librerías (ficheros .so) para el sistema objetivo, e.g. desde /lib y /userTal/lib (pero pueden ser más ubicaciones). En algunos sistemas, algunos ficheros .so son actualmente scripts; verifícalos con
117117
118118```dos
119119grep -i "ld script" *
120120```
121121
122122Remueva los archivos .so y cópielos encima (o symlink) de los archivos .so.x que debería tener .so para que el enlazador los encuentre.
123123
124124## Desde Windows a GO32v2
125125
126126Puedes encontrar información detallada en [[Cross-compilation from Win32 to GO32v2]].
127127
128128## Desde Windows a WinCE
129129
130130[[arm-wince]] Describe como configurar un compilador cruzado para ARM CPU\
131131[[i386-wince]] Describe como configurar compilación para i386 CPU (sin compilación cruzada)\
132132
133133## Desde Win32 a Win64
134134
135135Si estás compilando la rama 2.1.1 o superior de FPC puedes hacer:
136136
137137``` bash
138138$ make all OS_TARGET=win64 CPU_TARGET=x86_64
139139```
140140
141141y entonces:
142142
143143``` bash
144144$ make crossinstall OS_TARGET=win64 CPU_TARGET=x86_64
145145```
146146
147147## Desde win64 a win32
148148
149149Instala el fichero lazarus-1.6.0-fpc-3.0.0-cross-i386-win32-win64.exe y a continuación configura las opciones de proyecto a:
150150
151151- Target OS : Win32
152152- Target CPU : i386
153153
154154¡ Errando al establecer la CPU (Por defecto) conduce a una plataforma win32-x86_64 incorrecta !
155155
156156# Desde Darwin (Mac OS X) i386
157157
158158## Desde Darwin i386 hacia powerpc
159159
160160El instalador FPC oficial para Mac OS X/i386 incluye un compilador cruzado PowerPC y todas las unidades necesarias para compilar programas PowerPC (use *ppcppc* en vez de *ppc386* para compilar sus programas). Las instrucciones abajo descritas son necesarias si quiere compilar e instalar una nueva versión desde svn.
161161
162162- Compilar FPC:
163163
164164``` bash
165165$ cd fpc
166166$ make all CPU_TARGET=powerpc -j 2
167167```
168168
169169Esto crea el compilador cruzado powerpc (fpc/compiler/ppcrosspcc) y todas las unidades. Puede instalarlos usando los siguientes comandos:
170170
171171``` bash
172172$ sudo make FPC=`pwd`/compiler/ppc386 install CPU_TARGET=powerpc CROSSINSTALL=1
173173$ INSTALLED_VERSION=`./compiler/ppc386 -iV`
174174$ sudo mv /usr/local/lib/fpc/$INSTALLED_VERSION/ppcrossppc /usr/local/lib/fpc/$INSTALLED_VERSION/ppcppc
175175```
176176
177177Recordatorio: Los binarios universales se crean desde los binarios individuales (i386 y powerpc) usando lipo.
178178
179179## Desde Darwin i386 hacia x86_64
180180
181181El instalador FPC para Mac OS X/i386 incluye un compilador x86_64 y todas las unidades necesarias para compilar programas x86_64 (use *ppcx64* en vez de *ppc386* para compilar sus programas o use fpc -x86_64). Las instrucciones abajo son sólo necesarias si quiere compilar e instalar una nueva versión desde el svn.
182182
183183- Compilar FPC:
184184
185185``` bash
186186$ cd fpc
187187$ make all CPU_TARGET=x86_64
188188```
189189
190190Esto crea el compilador cruzado x86_64 (fpc/compiler/ppcrossx64) y todas las unidades. Puede instalarlas usando los siguientes comandos:
191191
192192``` bash
193193$ sudo make crossinstall CPU_TARGET=x86_64
194194$ sudo mv /usr/local/lib/fpc/2.7.1/ppcrossx64 /usr/local/lib/fpc/2.7.1/ppcx64
195195```
196196
197197Si quiere crear este compilador recientemente instalado la versión por defecto (***no*** es recomendada, y terminará con su habilidad de construir versiones nuevas de FPC 2.7.1 sin especificar explícitamente la ruta a la versión oficial más reciente de FPC), también ejecute el siguiente comando:
198198
199199``` bash
200200$ sudo ln -sf /usr/local/lib/fpc/2.7.1/ppcx64 /usr/local/bin/ppcx64
201201```
202202
203203Asumiendo que todos los componentes LCL que usa su proyecto sean soportados por [\| Cocoa widgetset](https://wiki.freepascal.org/Roadmap#Status_of_features_on_each_LCL_Interface), puede compilar un proyecto Lazarus desde la línea de comandos, usando un comando como este (ruta completa al compilador se ve necesaria):
204204
205205``` bash
206206$ lazbuild -B project1.lpr --ws=cocoa --cpu=x86_64 --os=darwin --compiler=/usr/local/bin/ppcx64
207207```
208208
209209Se puede revisar si el ejecutable es de 64 bits usando el comando "file":
210210
211211``` bash
212212$ file ./project1
213213$ ./project1: Mach-O 64-bit executable x86_64
214214```
215215
216216Alternativamente, puede ajustar su proyecto para compilar en 64 bits usando la interfaz gráfica de Lazarus:
217217
218-`a.) Elija en el menú Project/Project Options`\
219-`b.) En Compiler Options/Compiler Commands escriba en el campo de Compiler Command lo siguiente: "/usr/local/bin/ppcx64"`\
220-`c.) Para Compiler Options/Config And Target abra "Target CPU family" y escoja "x86_64"`\
221-`d.) Para Compiler Options/Additions And Overrides guarde  "LCLWidgetType := cocoa" en el LPI`
218+``` pascal
219+a.) Elija en el menú Project/Project Options
220+b.) En Compiler Options/Compiler Commands escriba en el campo de Compiler Command lo siguiente: "/usr/local/bin/ppcx64"
221+c.) Para Compiler Options/Config And Target abra "Target CPU family" y escoja "x86_64"
222+d.) Para Compiler Options/Additions And Overrides guarde "LCLWidgetType := cocoa" en el LPI
223+```
222224
223225Note que un computador con OSX de 64 bits puede ejecutar bien sobre 32 bits. Sin embargo, si quiere crear un binario universal que ejecute en Intel de 32 bits como tambén en modo de 64 bits en un computador de 64 bits de Intel puede usar el comando "lipo". Esto podría permitir al computador de 64 bits acceder a más memoria y en teoría podría desarrollares un poco mejor (e.g. distintas optimizaciones del compilador, más registros aunque con punteros más grandes). Asumiendo que tenga separados los ejecutables de 32 bits ("project32") y de 64 bits ("project64") con Lazarus.
224226
225227``` bash
226228$ lipo -create project32 project64 -o projectUniversal
227229```
228230
229231## Desde Darwin hacia Windows, Linux y otros
230232
231233El administrador de paquetes [fink](http://finkproject.org/) tiene paquetes para compilación cruzada hacia windows, linux, freebsd principalmente para Macs basados en Intel, como también para algunos Macs basados en PowerPC Macs.
232234
233235``` bash
234236$ fink install fpc-cross-i386-win32
235237```
236238
237239or
238240
239241``` bash
240242$ fink install fpc-cross-arm-linux
241243```
242244
243245instalando los compiladores cruzados.
244246
245247Para compilar use estos comandos:
246248
247249``` bash
248250fpc -Twin32 FILENAME
249251fpc -Parm -Tlinux FILENAME
250252```
251253
252254La lista actual con fpc 2.6.4 es:
253255
254256``` bash
255257fpc-cross-arm-gba
256258fpc-cross-arm-linux
257259fpc-cross-arm-nds
258260fpc-cross-arm-wince
259261fpc-cross-arm-armv4t-embedded
260262fpc-cross-arm-armv7m-embedded
261263fpc-cross-i386-darwin
262264fpc-cross-i386-freebsd
263265fpc-cross-i386-go32v2
264266fpc-cross-i386-linux
265267fpc-cross-i386-solaris
266268fpc-cross-i386-win32
267269fpc-cross-i386-wince
268270fpc-cross-powerpc-darwin
269271fpc-cross-powerpc-linux
270272fpc-cross-sparc-linux
271273fpc-cross-x86-64-darwin
272274fpc-cross-x86-64-freebsd
273275fpc-cross-x86-64-linux
274276fpc-cross-x86-64-win64
275277```
276278
277279Para otras plataformas (procesadores y sistemas) tiene que hacer la configuración por sí mismo. Es básicamente siempre el mismo esquema: Primero, necesita el binutils correspondiente, el compilador cruzado y la biblioteca de tiempo de ejecución RTL. Más detalles del procedimiento de construcción se puede aprender desde los archivos de descripción del paquete fink o de los compiladores cruzados de arriba.
278280
279281# From FreeBSD
280282
281283## FreeBSD to SPARC
282284
283285> **Warning:** This section appears to date from around 2005 and may not be relevant anymore. Updates are welcome.
284286
285287I managed to crosscompile from x86 to Sparc Solaris 9. However the result doesn't work very well, but here is my cmdline:
286288
287289in compiler/ execute:
288290
289291``` bash
290292gmake cycle CPU_TARGET=sparc OS_TARGET=solaris CROSSBINUTILPREFIX=solaris-sparc- CROSSOPT='-Xd -Fl~/src/sollib'
291293```
292294
293295~/src/sollib is a directory that contains:
294296
295297- a set of .o's from /usr/local/gcc-3.3-32bit/lib/gcc-lib/sparc-sun-solaris/3.3
296298- libgcc.a from /usr/local/gcc-3.3-32bit/lib/gcc-lib/sparc-sun-solaris/3.3
297299- a set of lib*.so from /usr/lib: libaio.so libmd5.so libc.so libelf.so librt.so libdl.so libm.so
298300
299301Problem is illustrated by the following binary.
300302
301-` Free Pascal Compiler version 2.1.1 [2006/03/17] for sparc`\
302-` Copyright (c) 1993-2005 by Florian Klaempfl`\
303-` Target OS: Solaris for SPARC`\
304-` Compiling system.pp`\
305-` system.pp(15,1) Fatal: Syntax error, "BEGIN" expected but "identifier UNIT" found`
303+``` pascal
304+ Free Pascal Compiler version 2.1.1 [2006/03/17] for sparc
305+ Copyright (c) 1993-2005 by Florian Klaempfl
306+ Target OS: Solaris for SPARC
307+ Compiling system.pp
308+ system.pp(15,1) Fatal: Syntax error, "BEGIN" expected but "identifier UNIT" found
309+```
306310
307311I suspect wrong .o's are taken.
308312
309313# General Unix/Linux notes
310314
311315Option -XLA is used to rename library dependencies specified in pascal units. Format is -XLAold=new, to modify ld link option -l\<old\> to -l\<new\>.
312316
313317Option -XR\<sysroot\> (recent trunk) that can be used to specify the target system root. It's used for:
314318
315319- adding a prefix to the default added library paths; in the past you used to specify -Xd and these paths manually. E.g. for i386-linux instead of passing /lib, /usr/lib, and /usr/X11R6/lib to ld, it will pass \<sysroot\>/lib, \<sysroot\>/usr/lib, and \<sysroot\>/usr/X11R6/lib to ld.
316320- detecting the C library (linux specific): glibc or uclibc. E.g. for uclibc detection '\<sysroot\>/lib/ld-uClibc.so.0' is tried.
317321
318322# Cross compiling the LCL
319323
320324Since 0.9.31 the LCL is a normal Lazarus package and the IDE will automatically cross compile all needed packages, when you change the target platform of your project.
321325
322326If something goes wrong, here are some hints that might help to find out why:
323327
324328## Test cross compiler
325329
326330Test if you have installed the cross compiled fpc correctly:
327331
328332Create a hello world program test.pas:
329333
330334``` pascal
331335program test;
332336begin
333337 writeln('DATE ',{$i %DATE%});
334338 writeln('FPCTARGET ',{$i %FPCTARGET%});
335339 writeln('FPCTARGETCPU ',{$i %FPCTARGETCPU%});
336340 writeln('FPCTARGETOS ',{$i %FPCTARGETOS%});
337341 writeln('FPCVERSION ',{$i %FPCVERSION%});
338342end.
339343```
340344
341345And compile it with your source/original platform. Example for x86 Windows:
342346
343347``` bash
344348fpc -Twin32 -Pi386 test.pas
345349```
346350
347351Then test source compiler:
348352
349353``` bash
350354test
351355```
352356
353357Replace *win32* and *i386* with your targets. Example for target Windows 64 bit:
354358
355359``` bash
356360fpc -Twin64 -Px86_64 test.pas
357361```
358362
359363Then test cross compiler:
360364
361365``` bash
362366test
363367```
364368
365369The program **fpc** is a wrapper that searches the right compiler (e.g. ppcrossx64) for the target and executes it.
366370
367371If this does not work, your cross compiler was not installed correctly. When this works you can cross compile the LCL.
368372
369373## Cross compiling the LCL in Lazarus 0.9.30 and below
370374
371375If you are sure your cross compiler works, you can do the actual cross compile.
372376
373377Perform the following steps in the Lazarus IDE to do an LCL cross compile: In older IDEs:
374378
375379- Set in *Tools -\> Options -\> Environment -\> Files* the *Compiler path* to the path to *fpc*. Normally this is already done.
376380- Then open *Tools -\> Configure Build Lazarus*.
377381- Set *Target OS* (e.g. to *Win64*) and *Target CPU* (e.g. to *x86_64*)
378382- Click the *Build* button.
379383
380384### Command line
381385
382386Apart from the IDE, the command line also allows you to build a cross compiled LCL.
383387
384388> **Note:** Since 0.9.31 you should use lazbuild to cross compile Lazarus packages. See lazbuild -h for a list of options.
385389
386390An example: you would cross compile a Windows 64 cross compiler using: First thoroughly clean any 64 bit leftovers. This does not touch your 32 bit environment:
387391
388392``` bash
389393make distclean LCL_PLATFORM=win32 CPU_TARGET=x86_64 OS_TARGET=win64
390394```
391395
392396Then build LCL and its required dependencies. We're using LCL_PLATFORM as that presumably corresponds to the widgetset, which is still Windows 32 even on Windows 64 (the widgetsets are the same).
393397
394398``` bash
395399make packager/registration lazutils lcl LCL_PLATFORM=win32 CPU_TARGET=x86_64 OS_TARGET=win64
396400```
397401
398402As in the previous section, the LCL for your normal OS is untouched.
399403
400404# Cross compiling LCL applications
401405
402406You first need to cross compile the LCL. See above.
403407
404408Cross compiling applications means: compiling plus linking. When you have cross compiled the LCL the compilation part is easy. Just set in the compiler options of the IDE the Target OS and Target CPU. The tricky part is the linking. If you cross compile a project you may see something like this:
405409
406-`/usr/local/bin/arm-linux-ld: cannot find -lX11`
410+```text
411+/usr/local/bin/arm-linux-ld: cannot find -lX11
412+```
407413
408414This means you have to install the graphical libraries of the target system. This has nothing to do with FPC/Lazarus, but with cross compiling a library. Some distributions provides pre compiled packages for this. For example Microsoft provides cross compiled libraries for WinCE for Windows. Under Linux you can install Wine to cross compile from Linux to Windows. Some Linux distributions provide 64bit libraries for 32bit systems.
409415
410416# Preguntas Frecuentes sobre compilación cruzada
411417
412418## Por qué compilar en cruzado?
413419
414420Para que pueda desarrollar un programa para un S.O./CPU y compilarlo para otro S.O./CPU sin necesidad de reiniciar o cambiar de computador.
415421
416422## Por qué no compilar en cruzado?
417423
418424En muchos casos, querrá probar el programa resultante en la plataforma nativa. Compilar la aplicación en esa plataforma puede ser más fácil de configurar.
419425
420426## Por qué compilar desde Unix a Windows y no al revés?
421427
422428Ver [[Cross compiling for Win32 under Linux]]
423429
424430## Necesito más información sobre como construir FreePascal. ¿Donde la encuentro?
425431
426432Hay un archivo en formato PDF sobre las FAQ generales sobre como construir y configurar FPC: [[buildfaq]]
427433
428434## Errores como que el compilador "/usr/bin/fpc" no soporta arm-linux
429435
430436Aparte de otras causas, este error puede ocurrir si ha editado fpc.cfg con opciones incorrectas para el compilador cruzado (e.g. especificando todos los parámetros en una línea en vez de línea por línea).
431437
432438# Ver además
433439
434440- [crossnotes](http://www.stack.nl/~marcov/crossnotes.txt) Notas sobre compilación cruzada.
435441- [[Cross compiling for Windows under Linux]]
436442
437443---
438444*From the Free Pascal wiki, page "Cross compiling/es", as it stood on 2023-02-21 after a change by Edgardager, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history