Этот сценарий генерирует Makefile для утилиты make. Теперь можно забыть про пакетные файлы и компиляцию из командной строки.
Типичная компиляция проекта состоит из команды:
fbc *.basЭто работает, однако это не оптимально. Когда мы изменим хотя бы одну строку кода в файле, то такая команда пересоберёт все файлы. Даже если эти файлы не изменились. Это занимает время, нагружает процессор и изнашивает диск. Кроме того, команда не позволит выполнить хорошую оптимизацию или собрать проект для других операционных систем (например, Windows 95 или драйвер). А если нужно собрать отладочную версию — придётся опять пересобирать проект.
С другой стороны, у нас есть утилита make, которая пересобирает только изменившиеся файлы. И мы можем приспособить её для своих нужд. Однако писать вручную конфигурационные файлы Makefile для утилиты — неудобно.
Поэтому появился этот генератор для автоматизации процесса. Генератор сам ничего не собирает, генератор только создаёт Makefile.
Не умеет строить зависимости от файла ресурсов. Недостаток компенсируется тем, что известные типы файлов, такие как значки, картинки и манифесты, автоматически добавляются к зависимостям файла ресурсов.
Проект должен компилироваться. Если есть ошибки в проекте, генератор создаст неправильный Makefile.
Нам необходимо достать утилиту make, собрать генератор и подготовить каталоги проекта.
Необходимо где‐то достать утилиту make. Например, для Windows в одной из (сборок mingw от Brecht Sanders)[https://github.com/brechtsanders/winlibs_mingw/releases]. В этой сборке для операционной системы Windows утилита называется mingw32-make.
Собрать генератор можно такой командой:
fbc64.exe CreateMakefile.bas
Будем считать, что проект организован следующим образом:
My Cool Project
bin\ — каталог для исполняемых файлов
Debug\ — отладочная версия
x64\ — для 64 бит
x86\ — для 32 бит
Release — окончательная версия
x64\
x86\
obj\ — каталог для объектных файлов
Debug\
x64\
x86\
Release
x64\
x86\
src\ — каталог для файлов исходного кода
main.bas — все файлы исходного кода
main.bi
CreateMakefile.exe — Генератор makefile
Makefile — сгенерированный файл
setenv.cmd — настройки переменных среды
fix-emitted-code.vbs — сценарий для исправления промежуточного си‐кода (неообязательно)
К счастью, каталоги bin и obj вручную создавать не нужно, их можно создать командой createdirs.
Генератор строит зависимости для каждого *.bas файла в каталоге проекта. Зависимостями считаются любые включаемые файлы. Если файл ссылается на стандартные заголовочники в директории компилятора, то они пропускаются.
Любые изменения зависимостей (добавили или удалили заголовочники) требуют обновления Makefile и перезапуска генератора.
Нажимаем Пуск → Выполнить, запускаем консоль и заходим в каталог проекта:
cd c:\FreeBASIC Projects\My Cool ProjectДалее запускаем генератор одним из описанных в будущем способов. В каталоге проекта появятся два файла: Makefile и setenv.cmd. Makefile нужен для утилиты make, в файле setenv.cmd лежат настройки переменных среды.
Устанавливаем переменные среды:
setenv.cmdСоздаём каталоги bin и obj если они ещё не созданы:
mingw32-make createdirsЗапускаем одну или несколько целей сборки:
mingw32-make all| Тип | Описание |
|---|---|
| debug | Собирает отладочную версию |
| release | Собирает окончательную версию |
| all | Собирает обе версии |
| clean | Очищает каталоги от промежуточных и объектных файлов |
| createdirs | Создаёт каталоги obj и bin с подкаталогами |
Создадим Makefile для оконной программы:
"c:\FreeBASIC Projects\CreateMakefile.exe" -out HelloWorld -subsystem windows -fbc-path "C:\Program Files (x86)\FreeBASIC-1.10.0-winlibs-gcc-9.3.0" -fbc fbc64.exeСоздадим Makefile для консольной программы с поддержкой юникода и адресного пространства больше 2 гигабайт:
"c:\FreeBASIC Projects\CreateMakefile.exe" -out HelloWorld -unicode true -addressaware true -fbc-path "C:\Program Files (x86)\FreeBASIC-1.10.0-winlibs-gcc-9.3.0" -fbc fbc64.exe"c:\FreeBASIC Projects\CreateMakefile.exe" -out HelloWorld -fix true -emitter wasm32 -exetype wasm32 -fbc-path "C:\Program Files (x86)\FreeBASIC-1.10.0-winlibs-gcc-9.3.0" -fbc fbc64.exe"c:\FreeBASIC Projects\CreateMakefile.exe" -makefile Makefile -src src -fbc-path "C:\Program Files (x86)\FreeBASIC-1.10.0-winlibs-gcc-9.3.0" -fbc fbc64.exe -out HelloWorld -module WinMain -exetype exe -subsystem console -emitter gcc -fix false -unicode true -wrt false -wcrt false -addressaware true -multithreading false -usefilesuffix true -pedantic true -winver 1281 -create-environment-file true -createdirs falseПараметры для утилиты указываются в виде пары: -параметр значение.
Имя генерируемого файла для утилиты make.
По умолчанию равно Makefile.
Каталог с исходными кодами.
По умолчанию равен src.
Путь к файлу компилятора.
По умолчанию равно C:\Program Files (x86)\FreeBASIC-1.10.1-winlibs-gcc-9.3.0.
Имя файла компилятора.
По умолчанию равно fbc64.exe.
Имя исполняемого файла.
Имя файла указывается без расширения. Например, скомпилированная программа должна иметь имя HelloWorld.exe, указываем здесь HelloWorld.
По умолчанию равно a.
Главный модуль программы. Указываем имя файла без расширения.
По умолчанию равен названию программы (без расширения): то, что указано в параметре -out.
Тип генерируемого исполняемого файла.
Может принимать следующий значения:
| Тип | Описание |
|---|---|
| exe | Исполняемый файл |
| dll | Динамически загружаемая библиотека |
| lib | Статически загружаемая библиотека |
| wasm32 | WebAssembly |
| wasm64 | WebAssembly 64 бита |
По умолчанию равен exe.
Примечание: поддержка wasm64 в браузерах находится в экспериментальном режиме, и может не работать корректно.
Подсистема исполняемого файла. Применимо только к файлам типа exe.
| Подсистема | Описание |
|---|---|
| console | Консольная программа для WinAPI |
| windows | Оконная программа для WinAPI |
| native | Программа для NT API |
По умолчанию равен console.
Задаёт генератор промежуточного кода для цепочки инструментов.
| Генератор | Описание |
|---|---|
| gcc | Кодогенератор для компилятора Си. |
| gas | Кодогенератор для ассемблера |
| gas64 | 64‐битный ассемблер |
| llvm | Низкоуровневая виртуальная машина |
| wasm32 | WebAssembly 32 бит |
| wasm64 | WebAssembly 64 бит |
По умолчанию равен gcc.
Примечание: поддержка wasm64 в браузерах находится в экспериментальном режиме, и может не работать корректно.
Добавляет сценарий исправления сгенерированного промежуточного кода.
Пояснение: компилятор фрибейсика генерирует промежуточный код для GCC и использует расширения GCC. Некоторые конструкции не будут работать для другого компилятора, например, для шланга.
По умолчанию false.
Задаёт константу UNICODE для WinAPI.
| Юникод | Описание |
|---|---|
| true | Включает UNICODE |
| false | Выключает UNICODE |
По умолчанию равен false.
Выключает библиотеки времени выполнения. Чтобы выключить библиотеки, установите этот параметр в true.
По умолчанию равен false.
Выключает библиотеки языка си. Чтобы выключить библиотеки, установите этот параметр в true.
По умолчанию равен false.
Включает использование адресного пространства больше 2 гигабайт.
Чтобы использовать адресное пространство больше двух гигабайт, исполняемый файл должен быть отмечен этим флагом. Установите это значение в true. Применимо только для 32‐битных программ.
По умолчанию равен false.
Включает многопоточные библиотеки времени выполнения.
По умолчанию равен false.
Включает использование файлового суффикса.
По умолчанию равен true.
Включает строгое следование стандарту языка Си для промежуточного представления.
По умолчанию равен false.
Задаёт версию Windows: константы WINVER и _WIN32_WINNT. В десятичном формате. Допустимые значения:
| Десятичный | 16‐ричный | Именованная константа | Описание |
|---|---|---|---|
| 1024 | 0x0400 | _WIN32_WINNT_NT4 | Windows NT 4.0 и Windows 95 |
| 1280 | 0x0500 | _WIN32_WINNT_WIN2K | Windows 2000 |
| 1281 | 0x0501 | _WIN32_WINNT_WINXP | Windows XP |
| 1282 | 0x0502 | _WIN32_WINNT_WS03 | Windows Server 2003 |
| 1536 | 0x0600 | _WIN32_WINNT_WIN6 | Windows Vista |
| 1536 | 0x0600 | _WIN32_WINNT_VISTA | Windows Vista |
| 1536 | 0x0600 | _WIN32_WINNT_WS08 | Windows Server 2008 |
| 1536 | 0x0600 | _WIN32_WINNT_LONGHORN | Windows Vista |
| 1537 | 0x0601 | _WIN32_WINNT_WIN7 | Windows 7 |
| 1538 | 0x0602 | _WIN32_WINNT_WIN8 | Windows 8 |
| 1539 | 0x0603 | _WIN32_WINNT_WINBLUE | Windows 8.1 |
| 2560 | 0x0A00 | _WIN32_WINNT_WINTHRESHOLD | Windows 10 |
| 2560 | 0x0A00 | _WIN32_WINNT_WIN10 | Windows 10 |
По умолчанию 1281 (Windows XP).
Включает генерацию файла настроек среды выполнения для утилиты make.
По умолчанию true.
Создаёт подкаталоги bin и obj.
По умолчанию false.
Генератор создаёт файл setenv.cmd с переменными среды, которые нужны для запуска. Заглянем в него и отредактируем как нам надо. Самое главное — это пути к цепочке инструментов и библиотеки.
Здесь устанавливаются каталоги Bin, Lib и имя файла компилятора для 32‐битной и 64‐битной версий:
if %PROCESSOR_ARCHITECTURE% == AMD64 (
set BinFolder=bin\win64
set LibFolder=lib\win64
set FBC_FILENAME=fbc64.exe
) else (
set BinFolder=bin\win32
set LibFolder=lib\win32
set FBC_FILENAME=fbc32.exe
)Путь к компилятору, указываем без кавычек.
rem Add compiler directory to PATH
rem Without quotes:
set FBC_DIR=C:\Program Files (x86)\FreeBASIC-1.10.1-winlibs-gcc-9.3.0
set PATH=%FBC_DIR%\%BinFolder%;%PATH%
set LIB_DIR=%FBC_DIR%\%LibFolder%
set INC_DIR=%FBC_DIR%\incПо умолчанию пути к файлам цепочки инструментов настроены на каталог компилятора.
rem Toolchain
set FBC="%FBC_DIR%\fbc64"
set CC="%FBC_DIR%\%BinFolder%\gcc.exe"
set AS="%FBC_DIR%\%BinFolder%\as.exe"
set AR="%FBC_DIR%\%BinFolder%\ar.exe"
set GORC="%FBC_DIR%\%BinFolder%\GoRC.exe"
set LD="%FBC_DIR%\%BinFolder%\ld.exe"
set DLL_TOOL="%FBC_DIR%\%BinFolder%\dlltool.exe"Разделители путей и команды, которые используются утилитой make для сборки проекта.
rem Разделитель параметров для mingw32-make
rem set PARAM_SEP=/
rem Разделитель параметров для mingw32-make
set PARAM_SEP=//
rem Разделитель путей
set PATH_SEP=/
set MOVE_PATH_SEP=\\
set MOVE_COMMAND=cmd.exe /c move /y
set DELETE_COMMAND=cmd.exe /c del /f /q
set MKDIR_COMMAND=cmd.exe /c mkdir
set CPREPROCESSOR_COMMAND=cmd.exe /c echo cscript.exe //nologo fix-emitted-code.vbsЕсли исходные коды лежат в другом месте, это нужно указать.
rem Source code directory
set SRC_DIR=srcКогда проект не будет использовать библиотеки времени выполнения, устанавливаем в FALSE.
rem Set to TRUE for use runtime libraries
set USE_RUNTIME=FALSE
rem Set to TRUE for use runtime libraries
set USE_CRUNTIME=FALSEУказываем минимально поддерживаемую версию ОС и юникод.
rem WinAPI version
set WINVER=1280
set _WIN32_WINNT=1280
rem Use unicode in WinAPI
set USE_UNICODE=TRUEДобавляем особые флаги к компилятору и цепочке инструментов.
set FBCFLAGS=
set CFLAGS=
set ASFLAGS=
set GORCFLAGS=
set LDFLAGS=Если мы компилируем файл с разными флагами компиляции или компиляторами, можно добавить специальные суффиксы к имени файла, чтобы имена файлов различались.
set GCC_VER=_GCC0930
set FBC_VER=_FBC1101
set FILE_SUFFIX=%GCC_VER%_%FBC_VER%_%RUNTIME%_%WINVER%
set OUTPUT_FILE_NAME=HelloWorld%FILE_SUFFIX%.exeУказываем без кавычек.
rem Linker script only for GCC x86, GCC x64 and Clang x86
rem Without quotes:
set LD_SCRIPT=%LIB_DIR%\fbextra.xМожно указать конкретную модель процессора.
rem Set processor architecture
set MARCH=nativeДля шланга:
rem Only for Clang x86
rem set TARGET_TRIPLET=i686-pc-windows-gnu
rem Only for Clang AMD64
rem set TARGET_TRIPLET=x86_64-w64-pc-windows-msvcУказываем -flto для межмодульной оптимизации.
rem Link Time Optimization for release target
rem set FLTO=-fltoНам необходимо добавить библиотеки в список или убрать лишние.
| Переменная | Описание |
|---|---|
| OBJ_CRT_START | Стартовые библиотеки языка Си |
| OBJ_CRT_END | Заключительные библиотеки языка Си |
| LIBS_WIN95 | Библиотеки для Win95 |
| LIBS_WINNT | Библиотеки для Windows NT |
| LIBS_GUID | Библиотека с GUID |
| LIBS_MSVCRT | Динамическая библиотека языка Си |
| LIBS_FB | Библиотеки языка FreeBASIC, например -lfbgfx |
| LIBS_GCC | Библиотеки языка Си и отладчика |
| LIBS_ANY | Любые дополнительные библиотеки, например lcards |
| LIBS_OS | Комбинация всех библиотеки операционной системы |
rem Libraries list
set OBJ_CRT_START="%LIB_DIR%\crt2.o" "%LIB_DIR%\crtbegin.o" "%LIB_DIR%\fbrt0.o"
set LIBS_WIN95=-ladvapi32 -lcomctl32 -lcomdlg32 -lcrypt32 -lgdi32 -lkernel32 -lole32 -loleaut32 -lshell32 -lshlwapi -lwsock32 -luser32
set LIBS_WINNT=-lgdiplus -lws2_32 -lmswsock
set LIBS_GUID=-luuid
set LIBS_MSVCRT=-lmsvcrt
set LIBS_ANY=
set LIBS_FB=-lfb
set LIBS_OS=%LIBS_WIN95% %LIBS_WINNT% %LIBS_GUID% %LIBS_MSVCRT% %LIBS_FB% %LIBS_ANY%
set LIBS_GCC=-lgcc -lmingw32 -lmingwex -lmoldname -lgcc_eh
set OBJ_CRT_END="%LIB_DIR%\crtend.o"