simplify build system and ports

This commit is contained in:
nakst 2021-08-19 04:09:02 +01:00
parent f7954b3e99
commit da515416bb
10 changed files with 140 additions and 221 deletions

View File

@ -68,42 +68,11 @@ static void (*glVertexAttribPointer)(GLuint index, GLint size, GLenum type, GLbo
int CanvasCallback(EsElement *element, EsMessage *message) {
if (message->type == ES_MSG_PAINT_BACKGROUND) {
*response = ES_HANDLED;
int ox = message->painter->width / 2 - IMAGE_WIDTH / 2;
int oy = message->painter->height / 2 - IMAGE_HEIGHT / 2;
EsRectangle bounds = { ox, ox + IMAGE_WIDTH, oy, oy + IMAGE_HEIGHT };
EsRectangle bounds = EsRectangleCenter(EsPainterBoundsInset(message->painter), ES_RECT_2S(IMAGE_WIDTH, IMAGE_HEIGHT));
EsDrawBitmap(message->painter, bounds, buffer, IMAGE_WIDTH * 4, ES_DRAW_BITMAP_OPAQUE);
#if 0
EsPainter *painter = message->painter;
size_t stride;
uint32_t *bits;
EsPaintTargetStartDirectAccess(painter->target, &bits, NULL, NULL, &stride);
int width = painter->width, height = painter->height;
int ox = width / 2 - IMAGE_WIDTH / 2;
int oy = height / 2 - IMAGE_HEIGHT / 2;
stride /= 4;
uint32_t *start = bits + painter->offsetX + painter->offsetY * stride;
for (int i = 0; i < height; i++) {
uint32_t *destination = start + i * stride;
for (int j = 0; j < width; j++, destination++) {
int sx = j - ox, sy = i - oy;
if (sy >= 0 && sy < IMAGE_HEIGHT && sx >= 0 && sx < IMAGE_WIDTH) {
*destination = buffer[sy * IMAGE_WIDTH + sx];
} else {
*destination = 0xFF000000;
}
}
}
#endif
}
return ES_NOT_HANDLED;
return 0;
}
#endif
@ -261,22 +230,19 @@ int main(int argc, char **argv) {
}
fclose(out);
OSMesaDestroyContext(context);
free(buffer);
#else
while (true) {
EsMessage *message = EsMessageReceive();
if (message->type == ES_MSG_INSTANCE_CREATE) {
EsInstance *instance = EsInstanceCreate(message, "GL Test");
EsInstance *instance = EsInstanceCreate(message, "GL Test", -1);
EsWindowSetTitle(instance->window, "GL Test", -1);
EsCustomElementCreate(instance->window, ES_CELL_FILL, (EsElementProperties) { .callback = CanvasCallback });
EsCustomElementCreate(instance->window, ES_CELL_FILL, 0)->messageUser = (EsUICallbackFunction) CanvasCallback;
}
}
#endif
free(buffer);
printf("all done :)\n");
return 0;
}

View File

@ -2,5 +2,5 @@
name=GL Test
[build]
custom_compile_command=x86_64-essence-gcc -o "root/Applications/GL Test/Entry.esx" apps/gl_test.c -lOSMesa -lstdc++ -lz -g -D ESSENCE_WINDOW
custom_compile_command=x86_64-essence-gcc -o "root/Applications/GL Test.esx" apps/gl_test.c -lOSMesa -lstdc++ -lz -g -D ESSENCE_WINDOW
require=root/Applications/POSIX/lib/libOSMesa.a

View File

@ -2,15 +2,9 @@ set -e
SYSROOT=`realpath root`
VERSION=2.6.9
NAME=bochs
URL="https://netix.dl.sourceforge.net/project/$NAME/$NAME/$VERSION/$NAME-$VERSION.tar.gz"
SOURCE="bin/$NAME-$VERSION.tar.gz"
if [ ! -f $SOURCE ]; then curl $URL > $SOURCE; fi
tar -xzf $SOURCE
mv $NAME-$VERSION bin/$NAME
cd bin/$NAME
bin/build get-source bochs-$VERSION https://netix.dl.sourceforge.net/project/bochs/bochs/$VERSION/bochs-$VERSION.tar.gz
cd bin/source
cp ../../ports/bochs/config.cc .
cp ../../ports/bochs/config.h.in .
@ -28,4 +22,4 @@ make -j 4
make DESTDIR=$SYSROOT install
cd ../..
rm -r bin/$NAME
rm -r bin/source

View File

@ -1,19 +1,11 @@
set -e
SYSROOT=`realpath root`
VERSION=1.33.1
NAME=busybox
URL="https://www.busybox.net/downloads/$NAME-$VERSION.tar.bz2"
SOURCE="bin/$NAME-$VERSION.tar.bz2"
if [ ! -f $SOURCE ]; then curl $URL > $SOURCE; fi
tar -xjf $SOURCE
mv $NAME-$VERSION bin/$NAME
cd bin/$NAME
cp ../../ports/$NAME/config .config
bin/build get-source busybox-$VERSION https://www.busybox.net/downloads/busybox-$VERSION.tar.bz2
cd bin/source
cp ../../ports/busybox/config .config
sed -i "51 i CONFIG_SYSROOT=\"$SYSROOT\"" .config
make -j 4
cp busybox $SYSROOT/Applications/POSIX/bin
cd ../..
rm -r bin/$NAME
rm -r bin/source

View File

@ -1,21 +1,12 @@
set -e
SYSROOT=`realpath root`
if [ ! -f "bin/ffmpeg.tar.xz" ]; then
curl https://ffmpeg.org/releases/ffmpeg-4.3.1.tar.xz > bin/ffmpeg.tar.xz
fi
tar -xJf bin/ffmpeg.tar.xz
mv ffmpeg-4.3.1 bin/ffmpeg
VERSION=4.3.1
bin/build get-source ffmpeg-$VERSION https://ffmpeg.org/releases/ffmpeg-$VERSION.tar.xz
mkdir bin/build-ffmpeg
cd bin/build-ffmpeg
../ffmpeg/configure --disable-all --cc=x86_64-essence-gcc --cxx=x86_64-essence-g++ --enable-cross-compile --enable-avcodec --enable-avformat --enable-swscale --enable-decoder=h264 --enable-parser=h264 --enable-decoder=aac --enable-parser=aac --enable-demuxer=mov --enable-protocol=file --disable-pthreads --prefix=/Applications/POSIX
../source/configure --disable-all --cc=x86_64-essence-gcc --cxx=x86_64-essence-g++ --enable-cross-compile --enable-avcodec --enable-avformat --enable-swscale --enable-decoder=h264 --enable-parser=h264 --enable-decoder=aac --enable-parser=aac --enable-demuxer=mov --enable-protocol=file --disable-pthreads --prefix=/Applications/POSIX
# --disable-optimizations
make -j 4
make DESTDIR=$SYSROOT install
cd ../..
rm -r bin/ffmpeg bin/build-ffmpeg
rm -r bin/source bin/build-ffmpeg

View File

@ -8,37 +8,17 @@ GMP_VERSION=6.2.1
MPFR_VERSION=4.1.0
MPC_VERSION=1.2.1
if [ ! -f "bin/binutils-$BINUTILS_VERSION.tar.xz" ]; then
curl ftp://ftp.gnu.org/gnu/binutils/binutils-$BINUTILS_VERSION.tar.xz > bin/binutils-$BINUTILS_VERSION.tar.xz
fi
if [ ! -f "bin/gcc-$GCC_VERSION.tar.xz" ]; then
curl ftp://ftp.gnu.org/gnu/gcc/gcc-$GCC_VERSION/gcc-$GCC_VERSION.tar.xz > bin/gcc-$GCC_VERSION.tar.xz
fi
if [ ! -f "bin/gmp-$GMP_VERSION.tar.xz" ]; then
curl ftp://ftp.gnu.org/gnu/gmp/gmp-$GMP_VERSION.tar.xz > bin/gmp-$GMP_VERSION.tar.xz
fi
if [ ! -f "bin/mpfr-$MPFR_VERSION.tar.xz" ]; then
curl ftp://ftp.gnu.org/gnu/mpfr/mpfr-$MPFR_VERSION.tar.xz > bin/mpfr-$MPFR_VERSION.tar.xz
fi
if [ ! -f "bin/mpc-$MPC_VERSION.tar.gz" ]; then
curl ftp://ftp.gnu.org/gnu/mpc/mpc-$MPC_VERSION.tar.gz > bin/mpc-$MPC_VERSION.tar.gz
fi
tar -xJf bin/binutils-$BINUTILS_VERSION.tar.xz
tar -xJf bin/gcc-$GCC_VERSION.tar.xz
tar -xJf bin/gmp-$GMP_VERSION.tar.xz
tar -xJf bin/mpfr-$MPFR_VERSION.tar.xz
tar -xzf bin/mpc-$MPC_VERSION.tar.gz
mv binutils-$BINUTILS_VERSION bin/binutils-src
mv gcc-$GCC_VERSION bin/gcc-src
mv gmp-$GMP_VERSION bin/gmp-src
mv mpfr-$MPFR_VERSION bin/mpfr-src
mv mpc-$MPC_VERSION bin/mpc-src
rm -rf bin/gcc-src bin/binutils-src bin/mpc-src bin/gmp-src bin/mpfr-src
bin/build get-source binutils-$BINUTILS_VERSION ftp://ftp.gnu.org/gnu/binutils/binutils-$BINUTILS_VERSION.tar.xz
mv bin/source bin/binutils-src
bin/build get-source gcc-$GCC_VERSION ftp://ftp.gnu.org/gnu/gcc/gcc-$GCC_VERSION/gcc-$GCC_VERSION.tar.xz
mv bin/source bin/gcc-src
bin/build get-source gmp-$GMP_VERSION ftp://ftp.gnu.org/gnu/gmp/gmp-$GMP_VERSION.tar.xz
mv bin/source bin/gmp-src
bin/build get-source mpfr-$MPFR_VERSION ftp://ftp.gnu.org/gnu/mpfr/mpfr-$MPFR_VERSION.tar.xz
mv bin/source bin/mpfr-src
bin/build get-source mpc-$MPC_VERSION ftp://ftp.gnu.org/gnu/mpc/mpc-$MPC_VERSION.tar.gz
mv bin/source bin/mpc-src
cp ports/gcc/changes/binutils_bfd_config.bfd bin/binutils-src/bfd/config.bfd
cp ports/gcc/changes/binutils_config.sub bin/binutils-src/config.sub

View File

@ -1,11 +1,8 @@
set -e
if [ ! -f "bin/mesa.tar.xz" ]; then
curl https://archive.mesa3d.org//mesa-20.1.8.tar.xz > bin/mesa.tar.xz
fi
tar -xJf bin/mesa.tar.xz
mv mesa-20.1.8 bin/mesa
rm -rf bin/mesa
bin/build get-source mesa-20.1.8 https://archive.mesa3d.org//mesa-20.1.8.tar.xz
mv bin/source bin/mesa
echo "" > bin/meson_cross.txt
echo "[binaries]" >> bin/meson_cross.txt
@ -34,8 +31,8 @@ cp ports/mesa/changes/src_gallium_targets_osmesa_meson.build bin/mesa/src/galliu
cd bin/mesa
meson ../build-mesa --cross-file ../meson_cross.txt \
-Dosmesa=gallium \
-Ddefault_library=static && \
ninja -C ../build-mesa
-Ddefault_library=static
ninja -C ../build-mesa
cd ../..
cp bin/build-mesa/subprojects/expat-2.2.5/libexpat.a root/Applications/POSIX/lib

View File

@ -1,18 +1,10 @@
set -e
SYSROOT=`realpath root`
VERSION=2.15.05
NAME=nasm
URL="https://www.nasm.us/pub/nasm/releasebuilds/$VERSION/$NAME-$VERSION.tar.xz"
SOURCE="bin/$NAME-$VERSION.tar.xz"
if [ ! -f $SOURCE ]; then curl $URL > $SOURCE; fi
tar -xJf $SOURCE
mv $NAME-$VERSION bin/$NAME
cd bin/$NAME
bin/build get-source nasm-$VERSION https://www.nasm.us/pub/nasm/releasebuilds/$VERSION/nasm-$VERSION.tar.xz
cd bin/source
./configure --host=x86_64-essence CC=x86_64-essence-gcc CXX=x86_64-essence-g++ --prefix=/Applications/POSIX
make -j 4
DESTDIR=$SYSROOT make install
cd ../..
rm -r bin/$NAME
rm -r bin/source

View File

@ -375,7 +375,7 @@ void Build(bool enableOptimisations, bool compile) {
#define DEBUG_START (1)
#define DEBUG_NONE (2)
void Run(int emulator, int cores, int log, int debug) {
void Run(int emulator, int log, int debug) {
LoadOptions();
switch (emulator) {
@ -435,7 +435,7 @@ void Run(int emulator, int cores, int log, int debug) {
audioFlags, IsOptionEnabled("Emulator.RunWithSudo") ? "sudo " : "", driveFlags, cdromFlags,
atoi(GetOptionString("Emulator.MemoryMB")),
debug ? (debug == DEBUG_NONE ? "-enable-kvm" : "-S") : "",
cores, audioFlags2, logFlags, usbFlags, usbFlags2);
atoi(GetOptionString("Emulator.Cores")), audioFlags2, logFlags, usbFlags, usbFlags2);
} break;
case EMULATOR_BOCHS: {
@ -971,26 +971,15 @@ void AddressToLine(const char *symbolFile) {
}
}
typedef struct BuildType {
const char *name, *alias, *emulator;
bool optimise, debug, smp, noCompile;
} BuildType;
void BuildAndRun(bool optimise, bool compile, bool debug, int emulator) {
Build(optimise, compile);
BuildType buildTypes[] = {
{ .name = "build", .alias = "b" },
{ .name = "build-optimised", .alias = "opt", .optimise = true },
{ .name = "debug", .alias = "d", .emulator = "qemu", .debug = true },
{ .name = "debug-without-compile", .alias = "d3", .emulator = "qemu", .debug = true, .noCompile = true },
{ .name = "vbox", .alias = "v", .emulator = "vbox", .optimise = true },
{ .name = "vbox-without-opt", .alias = "v2", .emulator = "vbox" },
{ .name = "vbox-without-compile", .alias = "v3", .emulator = "vbox", .noCompile = true },
{ .name = "qemu-with-opt", .alias = "t", .emulator = "qemu", .optimise = true },
{ .name = "test", .alias = "t2", .emulator = "qemu" },
{ .name = "qemu-without-compile", .alias = "t3", .emulator = "qemu", .noCompile = true },
};
if (encounteredErrors) {
printf("Errors were encountered during the build.\n");
} else if (emulator != -1) {
Run(emulator, LOG_NORMAL, debug);
}
}
void DoCommand(const char *l) {
while (l && (*l == ' ' || *l == '\t')) l++;
@ -1008,29 +997,27 @@ void DoCommand(const char *l) {
}
}
for (uintptr_t i = 0; i < sizeof(buildTypes) / sizeof(buildTypes[0]); i++) {
BuildType *entry = buildTypes + i;
if (strcmp(entry->name, l) && strcmp(entry->alias, l)) {
continue;
}
Build(entry->optimise, !entry->noCompile);
if (encounteredErrors) {
printf("Errors were encountered during the build.\n");
} else if (entry->emulator) {
Run(entry->emulator[0] == 'q' ? EMULATOR_QEMU : EMULATOR_VIRTUALBOX, entry->smp ? 3 : 1, LOG_NORMAL, entry->debug);
}
return;
}
if (0 == strcmp(l, "exit") || 0 == strcmp(l, "x") || 0 == strcmp(l, "quit") || 0 == strcmp(l, "q")) {
exit(0);
} else if (0 == strcmp(l, "reset-config")) {
unlink("bin/build_config.ini");
printf("Please restart the build system.\n");
if (0 == strcmp(l, "b") || 0 == strcmp(l, "build")) {
BuildAndRun(false /* optimise */, true /* compile */, false /* debug */, -1);
} else if (0 == strcmp(l, "opt") || 0 == strcmp(l, "build-optimised")) {
BuildAndRun(true /* optimise */, true /* compile */, false /* debug */, -1);
} else if (0 == strcmp(l, "d") || 0 == strcmp(l, "debug")) {
BuildAndRun(false /* optimise */, true /* compile */, true /* debug */, EMULATOR_QEMU);
} else if (0 == strcmp(l, "d3") || 0 == strcmp(l, "debug-without-compile")) {
BuildAndRun(false /* optimise */, false /* compile */, true /* debug */, EMULATOR_QEMU);
} else if (0 == strcmp(l, "v") || 0 == strcmp(l, "vbox")) {
BuildAndRun(true /* optimise */, true /* compile */, false /* debug */, EMULATOR_VIRTUALBOX);
} else if (0 == strcmp(l, "v2") || 0 == strcmp(l, "vbox-without-opt")) {
BuildAndRun(false /* optimise */, true /* compile */, false /* debug */, EMULATOR_VIRTUALBOX);
} else if (0 == strcmp(l, "v3") || 0 == strcmp(l, "vbox-without-compile")) {
BuildAndRun(false /* optimise */, false /* compile */, false /* debug */, EMULATOR_VIRTUALBOX);
} else if (0 == strcmp(l, "t") || 0 == strcmp(l, "qemu-with-opt")) {
BuildAndRun(true /* optimise */, true /* compile */, false /* debug */, EMULATOR_QEMU);
} else if (0 == strcmp(l, "t2") || 0 == strcmp(l, "test")) {
BuildAndRun(false /* optimise */, true /* compile */, false /* debug */, EMULATOR_QEMU);
} else if (0 == strcmp(l, "t3") || 0 == strcmp(l, "qemu-without-compile")) {
BuildAndRun(false /* optimise */, false /* compile */, false /* debug */, EMULATOR_QEMU);
} else if (0 == strcmp(l, "exit") || 0 == strcmp(l, "x") || 0 == strcmp(l, "quit") || 0 == strcmp(l, "q")) {
exit(0);
} else if (0 == strcmp(l, "compile") || 0 == strcmp(l, "c")) {
Compile(COMPILE_FOR_EMULATOR, 1024, NULL);
@ -1039,11 +1026,6 @@ void DoCommand(const char *l) {
SaveConfig();
printf("Please restart the build system.\n");
exit(0);
} else if (0 == strcmp(l, "clean-root")) {
forceRebuild = true;
CallSystem("rm -rf root");
CallSystem("mkdir root root/Applications root/Applications/POSIX root/Applications/POSIX/bin root/Applications/POSIX/lib "
"root/Applications/POSIX/include root/Essence root/Essence/Modules root/Essence/Fonts");
} else if (0 == strcmp(l, "build-utilities") || 0 == strcmp(l, "u")) {
BuildUtilities();
} else if (0 == strcmp(l, "config")) {
@ -1068,31 +1050,6 @@ void DoCommand(const char *l) {
Replace(a, b, NULL);
}
fclose(f);
} else if (0 == strcmp(l, "find-many")) {
forceRebuild = true;
printf("Enter the name of the find file: ");
char *l2 = NULL;
size_t pos;
getline(&l2, &pos, stdin);
l2[strlen(l2) - 1] = 0;
FILE *f = fopen(l2, "r");
free(l2);
while (!feof(f)) {
char a[512];
fscanf(f, "%s", a);
// Find(a);
int t = 0;
for (uintptr_t i = 0; i < sizeof(folders) / sizeof(folders[0]); i++) {
char buffer[256];
sprintf(buffer, "grep -nr '%s' -e '%s' | wc -l", folders[i], a);
FILE *f = popen(buffer, "r");
buffer[fread(buffer, 1, sizeof(buffer), f)] = 0;
t += atoi(buffer);
fclose(f);
}
printf("%3d %s\n", t, a);
}
fclose(f);
} else if (0 == strcmp(l, "find")) {
printf("Enter the query to be found: ");
char *l2 = NULL;
@ -1201,12 +1158,6 @@ void DoCommand(const char *l) {
closedir(directory);
} else if (0 == memcmp(l, "do ", 3)) {
CallSystem(l + 3);
} else if (0 == strcmp(l, "test-gf")) {
if (!CallSystem("g++ -g -Wall -o gf util/gf.cpp `wx-config --cxxflags --libs all` " WARNING_FLAGS)) {
CallSystem("./gf");
}
} else if (0 == strcmp(l, "gf")) {
CallSystemF("nohup ./gf > /dev/null 2>&1 &");
} else if (0 == memcmp(l, "live ", 5)) {
if (interactiveMode) {
fprintf(stderr, "This command cannot be used in interactive mode. Type \"quit\" and then run \"./start.sh live <...>\".\n");
@ -1317,26 +1268,81 @@ void DoCommand(const char *l) {
printf(ColorNormal);
} else if (0 == memcmp(l, "a2l ", 4)) {
AddressToLine(l + 3);
} else if (0 == memcmp(l, "get-source ", 11)) {
if (CallSystem("mkdir -p bin/cache && rm -rf bin/source")) {
exit(1);
}
const char *folder = l + 11;
const char *url = NULL;
for (int i = 0; folder[i]; i++) {
if (folder[i] == ' ') {
url = folder + i + 1;
break;
}
}
assert(url);
char name[1024];
strcpy(name, "bin/cache/");
const char *extension = url;
for (int i = 0; url[i]; i++) {
name[i + 10] = isalnum(url[i]) ? url[i] : '_';
name[i + 11] = 0;
if (url[i] == '.') extension = url + i;
}
char decompressFlag;
if (0 == strcmp(extension, ".bz2")) {
decompressFlag = 'j';
} else if (0 == strcmp(extension, ".xz")) {
decompressFlag = 'J';
} else if (0 == strcmp(extension, ".gz")) {
decompressFlag = 'z';
} else {
fprintf(stderr, "Unknown archive format.\n");
exit(1);
}
FILE *f = fopen(name, "rb");
if (f) {
fclose(f);
} else if (CallSystemF("curl %s > %s", url, name)) {
CallSystemF("rm %s", name); // Remove partially downloaded file.
exit(1);
}
if (CallSystemF("tar -vx%cf %s", decompressFlag, name)) exit(1);
if (CallSystemF("mv %.*s bin/source", (int) (url - folder), folder)) exit(1);
} else if (0 == strcmp(l, "help") || 0 == strcmp(l, "h") || 0 == strcmp(l, "?")) {
printf(ColorHighlight "\n=== Common Commands ===\n" ColorNormal);
printf("(t2) test - Qemu\n");
printf("(b ) build - Unoptimised build\n");
printf("(c ) compile - Compile the kernel and applications.\n");
printf("(v ) vbox - VirtualBox (optimised)\n");
printf("(d ) debug - Qemu (GDB)\n");
printf("( ) do - Run a system() command.\n");
printf("( ) config - Open the local configuration editor.\n");
printf("build (b) - Build.\n");
printf("test (t2) - Build and run in Qemu.\n");
printf("vbox (v) - Build (with optimisations enabled) and run in VirtualBox.\n");
printf("debug (d) - Build and run in Qemu (GDB server enabled).\n");
printf("config - Open the local configuration editor.\n");
printf("exit - Exit the build system.\n");
printf(ColorHighlight "\n=== Other Commands ===\n" ColorNormal);
printf("(t ) qemu-with-opt - Qemu\n");
printf("(t3) qemu-without-compile - Qemu\n");
printf("(x ) exit - Exit the build system.\n");
printf("(h ) help - Show the help prompt.\n");
printf("(u ) build-utilities - Build utility applications.\n");
printf("(v2) vbox-without-opt - VirtualBox (unoptimised)\n");
printf("(v3) vbox-without-compile - VirtualBox\n");
printf("( ) find - Search the project's source code.\n");
printf("( ) replace - Replace a word throughout the project.\n");
printf(ColorHighlight "\n=== Search and replace ===\n" ColorNormal);
printf("find, find-word, find-in - Search the project's source code.\n");
printf("replace-many, replace, replace-in - Replace a word in throughout the source code.\n");
printf("fix-replaced-field-name - Replace usages of a struct field after changing it.\n");
printf(ColorHighlight "\n=== Special builds ===\n" ColorNormal);
printf("build-optional-ports - Build the applications in ports/.\n");
printf("live - Create a live USB or CDROM.\n");
printf(ColorHighlight "\n=== Utilities ===\n" ColorNormal);
printf("designer - Open the interface style designer.\n");
printf("line-count - Count lines of code.\n");
printf("ascii <string> - Convert a string to a list of ASCII codepoints.\n");
printf("a2l <executable> - Translate addresses to lines.\n");
} else {
printf("Unrecognised command '%s'. Enter 'help' to get a list of commands.\n", l);
}

View File

@ -300,6 +300,7 @@ Option options[] = {
{ "Emulator.RunWithSudo", OPTION_TYPE_BOOL, { .b = false } },
{ "Emulator.Audio", OPTION_TYPE_BOOL, { .b = false } },
{ "Emulator.MemoryMB", OPTION_TYPE_STRING, { .s = "1024" } },
{ "Emulator.Cores", OPTION_TYPE_STRING, { .s = "1" } },
{ "General.first_application", OPTION_TYPE_STRING, { .s = NULL } },
{ "General.wallpaper", OPTION_TYPE_STRING, { .s = NULL } },
};