Компиляция MAME в операционных системах семейства Windows
Кому может быть интересна компиляция MAME?
Во-первых, тем, кто хочет всегда иметь под рукой самую последнюю версию MAME (u релизы).
Во-вторых, тем, кто хочет иметь не стандартную версию MAME, а оптимизированную под конкретный архитектуру ЦП.
В-третьих, тем, кому хорошо известен язык программирования C и кому хочется самому вносить изменения в код программы.
В данном руководстве описывается компиляция MAME версии 0.123u5. Для компиляции более ранних версий могут понадобиться старые версии среды компиляции MinGW или даже другие программы.
Создание среды компиляции MinGW
На данном этапе понадобятся два файла, ссылки на которые можно найти на официальном сайте MAME (раздел The Easy Way):
- mingw-mame-20070810.exe
- dx80_mgw.zip
Первый файл является самораспаковывающимся архивом, который можно разжать в любую директорию. Я буду использовать директорию C:\MinGW в этом примере.

Содержимое директории будет выглядеть следующим образом:

Из второго архива понадобятся только шесть файлов:
- d3d8.h
- d3d8caps.h
- d3d8types.h
- ddraw.h
- dinput.h
- dsound.h
Их необходимо распаковать в директорию C:\MinGW\include.
Создание дерева кода MAME
На данном этапе понадобится исходный код программы, ссылку на который можно найти на официальном сайте MAME:
- mame0123s.exe
Этот файл является самораспаковывающимся архивом, который можно разжать в любую директорию. Я буду использовать директорию C:\MAMESrc в этом примере.

Содержимое директории будет выглядеть следующим образом:

Дополнительные файлы и DIFF
Для упрощения процесса компиляции я использую командные файлы, сделанные Mr. Do. Скачать их можно на его странице, посвящённой компиляции MAME (раздел Needed Files):
- compile_extras.zip
Внутри архива находятся два командных файлах и ярлык для запуска командной строки. Ярлык для запуска командной строки следует использовать при применении u релизов, а также при компиляции MAME, чтобы всегда была возможность увидеть сообщения об ошибках, если таковые возникнут. Что касается командных файлов, то PatchMAME.bat используется для применения u релизов, а MakeMAME.bat для запуска компиляции MAME. Для применения u релизов понадобятся DIFF файлы для последней версии MAME (их можно найти на официальном сайте MAME).
После распаковки архива compile_extras.zip и пяти u релизов MAME ветки 0.123, содержимое директории C:\MAMESrc будет выглядеть следующим образом:

Командные файлы PatchMAME.bat и MakeMAME.bat при желании можно отредактировать при помощи любого текстового редактора (например, Блокнота).
На приведённой ниже иллюстрации показано содержимое файла PatchMAME.bat. Данный файл отвечает за применение u релизов к основному исходному коду MAME. Первая строка файла указывает путь, по которому расположена директория bin среды компиляции MinGW (в данном примере C:\mingw\bin). Вторая строка отвечает непосредственно за применение u релиза.

На приведённой ниже иллюстрации показано содержимое файла MakeMAME.bat. Данный файл отвечает за запуск компиляции MAME. Первая строка файла указывает путь, по которому расположена директория bin среды компиляции MinGW (в данном примере C:\mingw\bin). Вторая строка отвечает непосредственно за компиляцию исходного кода. В ней можно дополнительно указать архитектуру ЦП, под которую будет производиться компиляция.

Список рекомендуемых параметров компиляции:
- ARCHOPTS=-msse3 — Intel Core 2 или Pentium 4 с SSE3;
- ARCHOPTS=-msse2 — Pentium 4 без SSE3, Pentium M, Intel Core;
- ARCHOPTS=-march=athlon64 — AMD64;
- ARCHOPTS=-march=athlon-xp — Athlon XP;
- ARCHOPTS="-mpowerpc64 -mpowerpc-gfxopt -mpowerpc-gpopt -maltivec" — IBM G5, IBM Cell Broadband Engine Architecture (используется в консоли Sony PlayStation 3; компиляция из-под Windows невозможна), IBM POWER5 (используется в рабочих станциях IBM System i и IBM System p);
- ARCHOPTS="-mpowerpc -mpowerpc-gfxopt -maltivec" — Motorola G4;
- ARCHOPTS="-mpowerpc -mpowerpc-gfxopt" — IBM G3.
Список дополнительных параметров компиляции (лучшая оптимизация работы, но возможны проблемы с компиляцией для новых процессоров):
- ARCHOPTS="-march=pentium-m -msse3" — Intel Core 2;
- ARCHOPTS=-march=pentium-m — Pentium M, Intel Core;
- ARCHOPTS=-march=nocona — Pentium 4 (64-битное расширение);
- ARCHOPTS=-march=prescott — Pentium 4 (с SSE3);
- ARCHOPTS=-march=pentium4 — Pentium 4 (без SSE3);
- ARCHOPTS=-mcpu=7450 — Motorola G4 (7450 и позже);
- ARCHOPTS=-mcpu=7400 — Motorola G4 (7447 и раньше);
- ARCHOPTS=-mcpu=G5 — IBM G5;
- ARCHOPTS=-mcpu=G3 — IBM G3.
Более подробный список параметров доступен в документации GCC на английском языке.
Если ЦП состоит из нескольких ядер, то можно использовать параметр -j3 (два ядра) или -j5 (четыре ядра). Это приведёт к существенному снижению времени компиляции, за счёт одновременного запуска нескольких процессов компиляции. Если ЦП состоит из более чем четырёх ядер, то число после -j должно быть равно числу ядер +1.
Приведу пример. Для компиляции MAME на компьютере с процессором на основе архитектуры Intel Core 2 с двумя ядрами во вторую строку MakeMAME.bat надо ввести: mingw32-make -j3 ARCHOPTS="-march=pentium-m -msse3".
Применение u релизов
Данная секция будет интересна только тем, кто хочет применять u релизы. Остальные могут пропустить её.
Прежде чем объяснить последовательность действий, хочу сделать небольшое предупреждение: u релизы необходимо применять в строгом порядке (т.е. сначала 0123u1.diff, потом 0123u2.diff), поскольку иначе могут возникнуть конфликты в исходном коде.
Для применения u релиза надо запустить командную строку (ярлык ! Command Prompt), ввести patchmame 0123u1 и в исходный код будут внесены изменения. После этого данную операцию надо повторить для других u релизов.
Создание исполняемого файла MAME
При использовании командных файлов надо запустить командную строку (ярлык ! Command Prompt), и ввести makemame. Через какое-то время исполняемый файл MAME (и ещё несколько вспомогательных утилит) появится в директории C:\MAMESrc. В итоге содержимое директории будет выглядеть так:

При следующей компиляции MAME, все лишние файлы из директории C:\MAMESrc лучше удалить. Также стоит удалить директорию C:\MAMESrc\obj, чтобы не возникло каких-либо конфликтов при компиляции.
Прочее
Проделав компиляцию MAME в первый раз, я столкнулся с тем, что помимо основного исполняемого файла, я нашёл в папке ещё и дополнительные, предназначение которых мне было неизвестно. Приведу краткое описание каждого из них:
- ledutil.exe — утилита, предназначенная для эмуляция мигания лампочек игрового автомата посредством включения и выключения световых элементов клавиатуры;
- romcmp.exe — утилита, предназначенная для сравнения разных ромсетов. Кроме того, что она может подсказать, что названные по разному ромы на самом деле являются одними и теми же, она так же может сказать о степени совпадения данных в самих файлах;
- chdman.exe — утилита, предназначенная для создания CHD файлов для MAME, а также обратной их конвертации в образы дисков. Также она может проверять CHD файлы на «правильность»;
- jedutil.exe — утилита, предназначенная для конвертации JED-файлов в бинарную форму. JED-файлы — это особый тип ромов, являющийся обычным текстом. Зачастую текст содержит также и комментарии программистов;
- makemeta.exe — утилита, предназначенная для создания правильно отформатированных метаданных для CHD игр на лазердисках (LD);
- regrep.exe — утилита, предназначенная для проведения регрессионных тестов. Позволяет вовремя отслеживать поломки в MAME, что может ускорить процесс устранения неполадок;
- src2html.exe — утилита, предназначенная для перевода исходного кода в файлы с HTML разметкой;
- srcclean.exe — утилита, предназначенная для очистки исходного кода перед выпуском новой версии эмулятора.