4coder/meta/4ed_build.cpp

729 lines
21 KiB
C++
Raw Normal View History

/*
* Mr. 4th Dimention - Allen Webster
*
* ??.??.????
*
* 4coder development build rule.
*
*/
// TOP
//#define FM_PRINT_COMMANDS
#include "../4coder_base_types.h"
2019-06-01 23:58:28 +00:00
#if 0
2018-11-27 20:09:24 +00:00
# define FSTRING_IMPLEMENTATION
# include "../4coder_lib/4coder_string.h"
2019-06-01 23:58:28 +00:00
#endif
2017-07-08 19:25:23 +00:00
#define FTECH_FILE_MOVING_IMPLEMENTATION
#include "4ed_file_moving.h"
2018-11-27 18:07:07 +00:00
#include "../4coder_API/4coder_version.h"
//
2017-07-08 19:25:23 +00:00
// OS and compiler index
//
enum{
Platform_Windows,
Platform_Linux,
Platform_Mac,
//
Platform_COUNT,
2017-07-08 19:25:23 +00:00
Platform_None = Platform_COUNT,
};
char *platform_names[] = {
"win",
"linux",
"mac",
};
enum{
Compiler_CL,
Compiler_GCC,
//
Compiler_COUNT,
2017-07-08 19:25:23 +00:00
Compiler_None = Compiler_COUNT,
};
char *compiler_names[] = {
"cl",
"gcc",
};
2019-06-01 23:58:28 +00:00
#if OS_WINDOWS
2017-07-08 19:25:23 +00:00
# define This_OS Platform_Windows
2019-06-01 23:58:28 +00:00
#elif OS_LINUX
2017-07-08 19:25:23 +00:00
# define This_OS Platform_Linux
2019-06-01 23:58:28 +00:00
#elif OS_MAC
2017-07-08 19:25:23 +00:00
# define This_OS Platform_Mac
#else
# error This platform is not enumerated.
#endif
2019-06-01 23:58:28 +00:00
#if COMPILER_CL
2017-07-08 19:25:23 +00:00
# define This_Compiler Compiler_CL
2019-06-01 23:58:28 +00:00
#elif COMPILER_GCC
2017-07-08 19:25:23 +00:00
# define This_Compiler Compiler_GCC
#else
# error This compilers is not enumerated.
#endif
2017-07-08 19:25:23 +00:00
//
// Universal directories
//
#define BUILD_DIR "../build"
#define PACK_DIR "../distributions"
#define SITE_DIR "../site"
#define FOREIGN "../4coder-non-source/foreign"
#define FOREIGN_WIN "..\\4coder-non-source\\foreign"
char *includes[] = { FOREIGN, FOREIGN"/freetype2", 0, };
2017-07-09 00:48:53 +00:00
2017-07-08 19:25:23 +00:00
//
// Platform layer file tables
//
2017-07-09 00:48:53 +00:00
char *windows_platform_layer[] = { "platform_win32/win32_4ed.cpp", 0 };
char *linux_platform_layer[] = { "platform_linux/linux_4ed.cpp", 0 };
char *mac_platform_layer[] = { "platform_mac/mac_4ed.m", "platform_mac/mac_4ed.cpp", 0 };
char **platform_layers[Platform_COUNT] = {
windows_platform_layer,
linux_platform_layer ,
mac_platform_layer ,
};
2017-07-09 00:48:53 +00:00
char *windows_cl_platform_inc[] = { "platform_all", 0 };
char *linux_gcc_platform_inc[] = { "platform_all", "platform_unix", 0 };
char *mac_gcc_platform_inc[] = { "platform_all", "platform_unix", 0 };
char **platform_includes[Platform_COUNT][Compiler_COUNT] = {
2017-11-11 16:27:04 +00:00
{windows_cl_platform_inc, 0 },
{0 , linux_gcc_platform_inc},
{0 , mac_gcc_platform_inc },
};
2017-07-08 19:25:23 +00:00
//
// Custom targets
//
enum{
Custom_Default,
Custom_Experiments,
Custom_Casey,
Custom_ChronalVim,
//
Custom_COUNT
};
char *custom_files[] = {
"../code/4coder_default_bindings.cpp",
"../code/4coder_experiments.cpp",
"../code/4coder_casey.cpp",
2017-07-08 19:25:23 +00:00
"../4vim/4coder_chronal.cpp",
};
//
// Architectures
//
enum{
Arch_X64,
Arch_X86,
//
Arch_COUNT,
Arch_None = Arch_COUNT,
};
char *arch_names[] = {
"x64",
"x86",
};
//
// Build flags
//
enum{
OPTS = 0x1,
2017-07-09 00:48:53 +00:00
LIBS = 0x2,
ICON = 0x4,
SHARED_CODE = 0x8,
DEBUG_INFO = 0x10,
OPTIMIZATION = 0x20,
SUPER = 0x40,
INTERNAL = 0x80,
2017-07-09 00:48:53 +00:00
KEEP_ASSERT = 0x100,
LOG = 0x200,
};
2017-07-09 00:48:53 +00:00
internal char**
2019-06-01 23:58:28 +00:00
get_defines_from_flags(Arena *arena, u32 flags){
2017-07-09 00:48:53 +00:00
char **result = 0;
2019-06-01 23:58:28 +00:00
if (HasFlag(flags, KEEP_ASSERT)){
result = fm_list(arena, fm_list_one_item(arena, "FRED_KEEP_ASSERT"), result);
2017-07-09 00:48:53 +00:00
}
2019-06-01 23:58:28 +00:00
if (HasFlag(flags, INTERNAL)){
result = fm_list(arena, fm_list_one_item(arena, "FRED_INTERNAL"), result);
2017-07-09 00:48:53 +00:00
}
2019-06-01 23:58:28 +00:00
if (HasFlag(flags, SUPER)){
result = fm_list(arena, fm_list_one_item(arena, "FRED_SUPER"), result);
2017-07-09 00:48:53 +00:00
}
2019-06-01 23:58:28 +00:00
if (HasFlag(flags, LOG)){
2017-07-09 00:48:53 +00:00
char *log_defines[] = { "USE_LOG", "USE_LOGF", 0};
2019-06-01 23:58:28 +00:00
result = fm_list(arena, log_defines, result);
2017-07-09 00:48:53 +00:00
}
return(result);
}
2017-06-30 00:34:11 +00:00
//
2017-07-08 19:25:23 +00:00
// build implementation: cl
2017-06-30 00:34:11 +00:00
//
2019-06-01 23:58:28 +00:00
#if COMPILER_CL
2017-07-08 19:25:23 +00:00
2016-09-04 20:41:48 +00:00
#define CL_OPTS \
"-W4 -wd4310 -wd4100 -wd4201 -wd4505 -wd4996 " \
"-wd4127 -wd4510 -wd4512 -wd4610 -wd4390 " \
2019-06-01 23:58:28 +00:00
"-wd4611 -wd4189 -WX -GR- -EHa- -nologo -FC"
2016-09-04 20:41:48 +00:00
2017-02-25 01:53:40 +00:00
#define CL_LIBS_X64 \
2019-02-24 07:22:16 +00:00
"user32.lib winmm.lib gdi32.lib opengl32.lib comdlg32.lib " \
FOREIGN_WIN"\\x64\\freetype.lib"
2017-02-25 01:53:40 +00:00
#define CL_LIBS_X86 \
2019-02-24 07:22:16 +00:00
"user32.lib winmm.lib gdi32.lib opengl32.lib comdlg32.lib " \
FOREIGN_WIN"\\x86\\freetype.lib"
2016-09-04 20:41:48 +00:00
2018-02-25 06:35:08 +00:00
#define CL_ICON "..\\4coder-non-source\\res\\icon.res"
internal void
2019-06-01 23:58:28 +00:00
build(Arena *arena, u32 flags, u32 arch, char *code_path, char **code_files, char *out_path, char *out_file, char **defines, char **exports, char **inc_folders){
2017-07-09 02:09:24 +00:00
Temp_Dir temp = fm_pushdir(out_path);
2017-07-09 02:09:24 +00:00
Build_Line line;
fm_init_build_line(&line);
2017-07-08 19:25:23 +00:00
if (arch == Arch_X86){
2017-07-09 02:09:24 +00:00
fm_add_to_line(line, "%s\\windows_scripts\\setup_cl_x86.bat &", code_path);
2017-06-22 23:16:04 +00:00
}
2017-07-09 02:09:24 +00:00
fm_add_to_line(line, "cl");
2017-02-25 01:53:40 +00:00
2016-09-04 20:41:48 +00:00
if (flags & OPTS){
fm_add_to_line(line, CL_OPTS);
2016-09-04 20:41:48 +00:00
}
2017-07-08 19:25:23 +00:00
switch (arch){
case Arch_X64: fm_add_to_line(line, "-DFTECH_64_BIT"); break;
case Arch_X86: fm_add_to_line(line, "-DFTECH_32_BIT"); break;
2019-06-01 23:58:28 +00:00
default: InvalidPath;
}
2017-07-09 00:48:53 +00:00
fm_add_to_line(line, "-I%s", code_path);
2017-06-30 21:47:24 +00:00
if (inc_folders != 0){
for (u32 i = 0; inc_folders[i] != 0; ++i){
2019-06-01 23:58:28 +00:00
char *str = fm_str(arena, code_path, "/", inc_folders[i]);
fm_add_to_line(line, "-I%s", str);
2017-06-30 21:47:24 +00:00
}
}
2016-09-04 20:41:48 +00:00
if (flags & LIBS){
2017-07-08 19:25:23 +00:00
switch (arch){
case Arch_X64: fm_add_to_line(line, CL_LIBS_X64); break;
case Arch_X86: fm_add_to_line(line, CL_LIBS_X86); break;
2019-06-01 23:58:28 +00:00
default: InvalidPath;
2017-02-25 01:53:40 +00:00
}
2016-09-04 20:41:48 +00:00
}
if (flags & ICON){
2018-05-09 05:22:33 +00:00
fm_add_to_line(line, CL_ICON);
2016-09-04 20:41:48 +00:00
}
if (flags & DEBUG_INFO){
fm_add_to_line(line, "-Zi");
2019-02-05 09:13:38 +00:00
fm_add_to_line(line, "-DDO_CRAZY_EXPENSIVE_ASSERTS");
2016-09-04 20:41:48 +00:00
}
if (flags & OPTIMIZATION){
fm_add_to_line(line, "-O2");
2016-09-04 20:41:48 +00:00
}
if (flags & SHARED_CODE){
fm_add_to_line(line, "-LD");
2016-09-04 20:41:48 +00:00
}
2017-07-09 00:48:53 +00:00
if (defines != 0){
for (u32 i = 0; defines[i] != 0; ++i){
2019-06-01 23:58:28 +00:00
char *define_flag = fm_str(arena, "-D", defines[i]);
fm_add_to_line(line, "%s", define_flag);
2017-07-09 00:48:53 +00:00
}
2016-09-04 20:41:48 +00:00
}
2017-07-09 02:09:24 +00:00
for (u32 i = 0; code_files[i]; ++i){
fm_add_to_line(line, "\"%s\\%s\"", code_path, code_files[i]);
}
fm_add_to_line(line, "-Fe%s", out_file);
2019-01-25 21:03:52 +00:00
fm_add_to_line(line, "-link -INCREMENTAL:NO -RELEASE -PDBALTPATH:%%_PDB%%");
2017-07-08 19:25:23 +00:00
switch (arch){
case Arch_X64: fm_add_to_line(line, "-MACHINE:X64"); break;
case Arch_X86: fm_add_to_line(line, "-MACHINE:X86"); break;
2019-06-01 23:58:28 +00:00
default: InvalidPath;
}
if (flags & DEBUG_INFO){
fm_add_to_line(line, "-DEBUG");
}
if (flags & SHARED_CODE){
2017-07-09 00:48:53 +00:00
Assert(exports != 0);
fm_add_to_line(line, "-OPT:REF");
2017-07-09 00:48:53 +00:00
for (u32 i = 0; exports[i] != 0; ++i){
2019-06-01 23:58:28 +00:00
char *str = fm_str(arena, "-EXPORT:", exports[i]);
2017-07-09 02:09:24 +00:00
fm_add_to_line(line, "%s", str);
2017-07-09 00:48:53 +00:00
}
}
else{
fm_add_to_line(line, "-NODEFAULTLIB:library");
}
fm_finish_build_line(&line);
2017-02-25 01:53:40 +00:00
2017-07-09 02:09:24 +00:00
systemf("%s", line.build_options);
fm_popdir(temp);
2016-09-04 20:41:48 +00:00
}
2017-06-30 00:34:11 +00:00
//
2017-07-08 19:25:23 +00:00
// build implementation: gcc
2017-06-30 00:34:11 +00:00
//
2019-06-01 23:58:28 +00:00
#elif COMPILER_GCC
2017-07-08 19:25:23 +00:00
2019-06-01 23:58:28 +00:00
#if OS_LINUX
2017-06-29 02:53:51 +00:00
# define GCC_OPTS \
"-Wno-write-strings " \
"-D_GNU_SOURCE -fPIC " \
2018-10-06 19:04:45 +00:00
"-fno-threadsafe-statics -pthread " \
"-Wno-unused-result"
2018-12-19 03:16:08 +00:00
#define GCC_LIBS_COMMON \
2018-12-19 03:48:02 +00:00
"-lX11 -lpthread -lm -lrt " \
2017-06-29 02:53:51 +00:00
"-lGL -ldl -lXfixes -lfreetype -lfontconfig"
2017-11-11 19:54:31 +00:00
#define GCC_LIBS_X64 GCC_LIBS_COMMON
#define GCC_LIBS_X86 GCC_LIBS_COMMON
2019-06-01 23:58:28 +00:00
#elif OS_MAC
2017-06-29 02:53:51 +00:00
# define GCC_OPTS \
"-Wno-write-strings -Wno-deprecated-declarations " \
2018-10-06 19:04:45 +00:00
"-Wno-comment -Wno-switch -Wno-null-dereference " \
2018-10-06 19:16:31 +00:00
"-Wno-tautological-compare " \
"-Wno-unused-result "
2018-10-06 19:04:45 +00:00
2017-11-11 19:54:31 +00:00
#define GCC_LIBS_COMMON \
2017-06-29 02:53:51 +00:00
"-framework Cocoa -framework QuartzCore " \
2017-11-07 21:35:26 +00:00
"-framework CoreServices " \
2017-11-11 19:54:31 +00:00
"-framework OpenGL -framework IOKit "
#define GCC_LIBS_X64 GCC_LIBS_COMMON \
FOREIGN "/x64/libfreetype-mac.a"
2017-11-11 19:54:31 +00:00
#define GCC_LIBS_X86 GCC_LIBS_COMMON \
FOREIGN "/x86/libfreetype-mac.a"
2017-06-29 02:53:51 +00:00
#else
# error gcc options not set for this platform
#endif
2016-09-04 20:41:48 +00:00
internal void
2018-11-27 20:09:24 +00:00
build(Partition *part, u32 flags, u32 arch, char *code_path, char **code_files, char *out_path, char *out_file, char **defines, char **exports, char **inc_folders){
2016-09-04 20:41:48 +00:00
Build_Line line;
fm_init_build_line(&line);
2017-07-08 19:33:34 +00:00
switch (arch){
case Arch_X64:
2017-07-09 00:48:53 +00:00
fm_add_to_line(line, "-m64");
2017-07-08 19:33:34 +00:00
fm_add_to_line(line, "-DFTECH_64_BIT"); break;
case Arch_X86:
2017-07-09 00:48:53 +00:00
fm_add_to_line(line, "-m32");
2017-07-08 19:33:34 +00:00
fm_add_to_line(line, "-DFTECH_32_BIT"); break;
default: InvalidCodePath;
}
if (flags & OPTS){
fm_add_to_line(line, GCC_OPTS);
}
2017-07-09 00:48:53 +00:00
fm_add_to_line(line, "-I%s", code_path);
2017-06-30 21:28:09 +00:00
if (inc_folders != 0){
for (u32 i = 0; inc_folders[i] != 0; ++i){
2018-12-13 17:14:32 +00:00
char *str = fm_str(part, code_path, "/", inc_folders[i]);
2017-07-09 00:48:53 +00:00
fm_add_to_line(line, "-I%s", str);
2017-06-30 21:28:09 +00:00
}
2017-06-30 00:34:11 +00:00
}
if (flags & DEBUG_INFO){
fm_add_to_line(line, "-g -O0");
}
if (flags & OPTIMIZATION){
fm_add_to_line(line, "-O3");
}
if (flags & SHARED_CODE){
fm_add_to_line(line, "-shared");
}
2017-07-09 00:48:53 +00:00
if (defines != 0){
for (u32 i = 0; defines[i]; ++i){
2018-12-13 17:14:32 +00:00
char *define_flag = fm_str(part, "-D", defines[i]);
fm_add_to_line(line, "%s", define_flag);
2017-07-09 00:48:53 +00:00
}
}
fm_add_to_line(line, "-I\"%s\"", code_path);
for (u32 i = 0; code_files[i] != 0; ++i){
fm_add_to_line(line, "\"%s/%s\"", code_path, code_files[i]);
}
2016-09-04 20:41:48 +00:00
if (flags & LIBS){
2017-11-11 19:54:31 +00:00
if (arch == Arch_X64){
fm_add_to_line(line, GCC_LIBS_X64);
}
else if (arch == Arch_X86)
{
fm_add_to_line(line, GCC_LIBS_X86);
}
2016-09-04 20:41:48 +00:00
}
fm_finish_build_line(&line);
2016-09-04 20:41:48 +00:00
Temp_Dir temp = fm_pushdir(out_path);
2016-09-04 20:41:48 +00:00
systemf("g++ %s -o %s", line.build_options, out_file);
fm_popdir(temp);
}
#else
2017-06-30 00:34:11 +00:00
# error build function not defined for this compiler
#endif
internal void
2019-06-01 23:58:28 +00:00
build(Arena *arena, u32 flags, u32 arch, char *code_path, char *code_file, char *out_path, char *out_file, char **defines, char **exports, char **inc_folders){
char **code_files = fm_list_one_item(arena, code_file);
build(arena, flags, arch, code_path, code_files, out_path, out_file, defines, exports, inc_folders);
2017-07-08 19:25:23 +00:00
}
2017-11-22 20:05:58 +00:00
// TODO(NAME): build metadata fully from C++ and eliminate build_metadata.bat and build_metadata.sh
2018-06-16 20:57:32 +00:00
internal void
build_metadata(void){
systemf(".%s%s ..%scode%s4coder_default_bindings.cpp", SLASH, "build_metadata" BAT, SLASH, SLASH);
2018-06-16 20:57:32 +00:00
}
internal void
2019-06-01 23:58:28 +00:00
site_build(Arena *arena, char *cdir, u32 flags){
2018-06-16 20:57:32 +00:00
build_metadata();
2017-11-22 20:05:58 +00:00
2017-07-08 19:25:23 +00:00
{
2019-06-01 23:58:28 +00:00
char *file = fm_str(arena, "site/4ed_sitegen.cpp");
char *dir = fm_str(arena, BUILD_DIR);
2017-07-08 19:25:23 +00:00
BEGIN_TIME_SECTION();
2019-06-01 23:58:28 +00:00
build(arena, OPTS | flags, Arch_X64, cdir, file, dir, "sitegen", get_defines_from_flags(arena, flags), 0, includes);
2017-07-08 19:25:23 +00:00
END_TIME_SECTION("build sitegen");
}
if (prev_error == 0){
2017-07-08 19:25:23 +00:00
BEGIN_TIME_SECTION();
2019-06-01 23:58:28 +00:00
char *cmd = fm_str(arena, BUILD_DIR "/sitegen");
char *code_dir = fm_str(arena, ".");
char *asset_dir = fm_str(arena, "../4coder-non-source/site_resources");
char *site_source_dir = fm_str(arena, "site/source_material");
char *dest_dir = fm_str(arena, "../site");
fm_make_folder_if_missing(arena, dest_dir);
2017-07-09 03:25:29 +00:00
systemf("%s %s %s %s %s", cmd, code_dir, asset_dir, site_source_dir, dest_dir);
2017-07-08 19:25:23 +00:00
END_TIME_SECTION("run sitegen");
}
}
internal void
2019-06-01 23:58:28 +00:00
build_and_run(Arena *arena, char *cdir, char *filename, char *name, u32 flags){
char *dir = fm_str(arena, BUILD_DIR);
2017-07-08 19:25:23 +00:00
2016-08-29 01:03:26 +00:00
{
2019-06-01 23:58:28 +00:00
char *file = fm_str(arena, filename);
BEGIN_TIME_SECTION();
2019-06-01 23:58:28 +00:00
build(arena, flags, Arch_X64, cdir, file, dir, name, get_defines_from_flags(arena, flags), 0, includes);
END_TIME_SECTION(fm_str(arena, "build ", name));
2016-08-29 01:03:26 +00:00
}
2017-07-08 19:25:23 +00:00
if (prev_error == 0){
2019-06-01 23:58:28 +00:00
char *cmd = fm_str(arena, dir, "/", name);
BEGIN_TIME_SECTION();
fm_execute_in_dir(cdir, cmd, 0);
2019-06-01 23:58:28 +00:00
END_TIME_SECTION(fm_str(arena, "run ", name));
}
}
internal void
2019-06-01 23:58:28 +00:00
fsm_generator(Arena *arena, char *cdir){
build_and_run(arena, cdir, "meta/4ed_fsm_table_generator.cpp", "fsmgen", OPTS | DEBUG_INFO);
}
internal void
2019-06-01 23:58:28 +00:00
metagen(Arena *arena, char *cdir){
build_and_run(arena, cdir, "meta/4ed_metagen.cpp", "metagen", OPTS | DEBUG_INFO);
}
internal void
2019-06-01 23:58:28 +00:00
string_build(Arena *arena, char *cdir){
char *dir = fm_str(arena, BUILD_DIR);
{
2019-06-01 23:58:28 +00:00
char *file = fm_str(arena, "string/4ed_string_builder.cpp");
BEGIN_TIME_SECTION();
2019-06-01 23:58:28 +00:00
build(arena, OPTS | DEBUG_INFO, Arch_X64, cdir, file, dir, "string_builder", 0, 0, includes);
END_TIME_SECTION("build string_builder");
}
if (prev_error == 0){
2019-06-01 23:58:28 +00:00
char *cmd = fm_str(arena, cdir, "/", dir, "/string_builder");
BEGIN_TIME_SECTION();
2019-06-01 23:58:28 +00:00
fm_execute_in_dir(fm_str(arena, cdir, "/string"), cmd, 0);
END_TIME_SECTION("run string_builder");
}
}
internal void
2019-06-01 23:58:28 +00:00
do_buildsuper(Arena *arena, char *cdir, char *file, u32 arch){
BEGIN_TIME_SECTION();
2019-06-01 23:58:28 +00:00
Temp_Dir temp = fm_pushdir(fm_str(arena, BUILD_DIR));
2016-12-14 16:09:54 +00:00
2019-06-01 23:58:28 +00:00
char *build_script = fm_str(arena, "buildsuper_", arch_names[arch], BAT);
2019-06-01 23:58:28 +00:00
char *build_command = fm_str(arena, "\"", cdir, "/", build_script, "\" \"", file, "\"");
2017-07-08 19:25:23 +00:00
if (This_OS == Platform_Windows){
2019-06-01 23:58:28 +00:00
build_command = fm_str(arena, "call ", build_command);
}
2017-07-08 19:33:34 +00:00
systemf("%s", build_command);
2017-07-08 19:25:23 +00:00
fm_popdir(temp);
END_TIME_SECTION("build custom");
}
2017-09-10 18:24:26 +00:00
// TODO(allen): Remove this
2017-07-18 20:17:57 +00:00
internal i32
get_freetype_include(char *out, u32 max){
i32 size = 0;
2017-09-10 18:24:26 +00:00
#if 0
2019-06-01 23:58:28 +00:00
#if OS_LINUX
2017-07-18 20:17:57 +00:00
char freetype_include[512];
FILE *file = popen("pkg-config --cflags freetype2", "r");
if (file != 0){
fgets(freetype_include, sizeof(freetype_include), file);
size = strlen(freetype_include);
2017-09-10 18:24:26 +00:00
memcpy(out, freetype_include, size);
2017-07-18 20:17:57 +00:00
pclose(file);
}
2019-06-01 23:58:28 +00:00
#elif OS_MAC
2017-09-10 18:24:26 +00:00
char *freetype_include = "/usr/local/include/freetype2";
size = strlen(freetype_include);
2019-02-05 09:13:38 +00:00
memcpy(out, freetype_include, size);
2017-09-10 18:24:26 +00:00
#endif
2017-07-18 20:17:57 +00:00
#endif
return(size);
}
internal void
2019-06-01 23:58:28 +00:00
build_main(Arena *arena, char *cdir, b32 update_local_theme, u32 flags, u32 arch){
char *dir = fm_str(arena, BUILD_DIR);
2017-02-18 01:04:41 +00:00
{
2019-06-01 23:58:28 +00:00
char *file = fm_str(arena, "4ed_app_target.cpp");
char **exports = fm_list_one_item(arena, "app_get_functions");
char **build_includes = includes;
char ft_include[512];
i32 ft_size = get_freetype_include(ft_include, sizeof(ft_include) - 1);
if (ft_size > 0){
ft_include[ft_size] = 0;
2017-09-10 18:24:26 +00:00
fprintf(stdout, "FREETYPE: %s\n", ft_include);
2019-06-01 23:58:28 +00:00
build_includes = fm_list(arena, build_includes, fm_list_one_item(arena, ft_include));
}
BEGIN_TIME_SECTION();
2019-06-01 23:58:28 +00:00
build(arena, OPTS | SHARED_CODE | flags, arch, cdir, file, dir, "4ed_app" DLL, get_defines_from_flags(arena, flags), exports, build_includes);
END_TIME_SECTION("build 4ed_app");
}
{
BEGIN_TIME_SECTION();
2019-06-01 23:58:28 +00:00
char **inc = (char**)fm_list(arena, includes, platform_includes[This_OS][This_Compiler]);
build(arena, OPTS | LIBS | ICON | flags, arch, cdir, platform_layers[This_OS], dir, "4ed", get_defines_from_flags(arena, flags), 0, inc);
END_TIME_SECTION("build 4ed");
}
2017-07-08 19:25:23 +00:00
if (update_local_theme){
BEGIN_TIME_SECTION();
2019-06-01 23:58:28 +00:00
char *themes_folder = fm_str(arena, "../build/themes");
char *source_themes_folder = fm_str(arena, "themes");
fm_clear_folder(themes_folder);
2019-06-01 23:58:28 +00:00
fm_make_folder_if_missing(arena, themes_folder);
fm_copy_all(source_themes_folder, "*", themes_folder);
END_TIME_SECTION("move files");
}
}
internal void
2019-06-01 23:58:28 +00:00
standard_build(Arena *arena, char *cdir, u32 flags, u32 arch){
fsm_generator(arena, cdir);
metagen(arena, cdir);
//do_buildsuper(arena, cdir, fm_str(arena, custom_files[Custom_Default]), arch);
do_buildsuper(arena, cdir, fm_str(arena, custom_files[Custom_Experiments]), arch);
//do_buildsuper(arena, cdir, fm_str(arena, custom_files[Custom_Casey]), arch);
//do_buildsuper(arena, cdir, fm_str(arena, custom_files[Custom_ChronalVim]), arch);
build_main(arena, cdir, true, flags, arch);
}
2017-07-08 19:25:23 +00:00
internal char*
2019-06-01 23:58:28 +00:00
get_4coder_dist_name(Arena *arena, u32 platform, char *tier, u32 arch){
char *name = fm_str(arena, "4coder-alpha-" MAJOR_STR "-" MINOR_STR "-" PATCH_STR);
2017-07-08 19:25:23 +00:00
if (strcmp(tier, "alpha") != 0){
2019-06-01 23:58:28 +00:00
name = fm_str(arena, name, "-", tier);
2016-11-14 06:39:03 +00:00
}
2017-07-08 19:25:23 +00:00
if (platform != Platform_None){
2019-06-01 23:58:28 +00:00
name = fm_str(arena, name, "-", platform_names[platform]);
2017-02-27 14:53:38 +00:00
}
2017-07-08 19:25:23 +00:00
if (arch != Arch_None){
2019-06-01 23:58:28 +00:00
name = fm_str(arena, name, "-", arch_names[arch]);
}
2017-07-08 19:25:23 +00:00
return(name);
}
internal void
2019-06-01 23:58:28 +00:00
package(Arena *arena, char *cdir){
// NOTE(allen): meta
2019-06-01 23:58:28 +00:00
fsm_generator(arena, cdir);
metagen(arena, cdir);
2019-06-01 23:58:28 +00:00
char *build_dir = fm_str(arena, BUILD_DIR);
char *pack_dir = fm_str(arena, PACK_DIR);
char *fonts_source_dir = fm_str(arena, "../4coder-non-source/dist_files/fonts");
2017-07-08 19:25:23 +00:00
char *base_package_root = "../current_dist";
2017-07-08 19:25:23 +00:00
// NOTE(allen): alpha and super builds
enum{
2018-05-28 01:00:13 +00:00
Tier_Alpha = 0,
Tier_Super = 1,
Tier_COUNT = 2
};
2017-07-08 19:25:23 +00:00
char *tiers[] = { "alpha", "super" };
u32 base_flags = OPTIMIZATION | KEEP_ASSERT | DEBUG_INFO | LOG;
u32 tier_flags[] = { 0, SUPER, };
2017-07-08 19:25:23 +00:00
for (u32 tier_index = 0; tier_index < Tier_COUNT; ++tier_index){
char *tier = tiers[tier_index];
u32 flags = base_flags | tier_flags[tier_index];
2019-06-01 23:58:28 +00:00
Temp_Memory temp = begin_temp(arena);
char *tier_package_root = fm_str(arena, base_package_root, "_", tier);
2017-07-08 19:25:23 +00:00
for (u32 arch = 0; arch < Arch_COUNT; ++arch){
2019-06-01 23:58:28 +00:00
char *par_dir = fm_str(arena, tier_package_root, "_", arch_names[arch]);
char *dir = fm_str(arena, par_dir, "/4coder");
char *fonts_dir = fm_str(arena, dir, "/fonts");
char *zip_dir = fm_str(arena, pack_dir, "/", tier, "_", arch_names[arch]);
2017-02-25 01:53:40 +00:00
2018-06-16 20:57:32 +00:00
build_metadata();
2019-06-01 23:58:28 +00:00
build_main(arena, cdir, false, flags, arch);
2017-02-25 01:53:40 +00:00
fm_clear_folder(par_dir);
2017-02-25 01:53:40 +00:00
2019-06-01 23:58:28 +00:00
fm_make_folder_if_missing(arena, dir);
fm_copy_file(fm_str(arena, build_dir, "/4ed" EXE), fm_str(arena, dir, "/4ed" EXE));
fm_copy_file(fm_str(arena, build_dir, "/4ed_app" DLL), fm_str(arena, dir, "/4ed_app" DLL));
2019-06-01 23:58:28 +00:00
fm_copy_folder(arena, cdir, dir, "themes");
fm_copy_file(fm_str(arena, cdir, "/LICENSE.txt"), fm_str(arena, dir, "/LICENSE.txt"));
fm_copy_file(fm_str(arena, cdir, "/README.txt"), fm_str(arena, dir, "/README.txt"));
fm_copy_file(fm_str(arena, cdir, "/changes.txt"), fm_str(arena, dir, "/changes.txt"));
2019-06-01 23:58:28 +00:00
fm_make_folder_if_missing(arena, fonts_dir);
2017-07-08 19:25:23 +00:00
fm_copy_all(fonts_source_dir, "*", fonts_dir);
2019-06-01 23:58:28 +00:00
fm_copy_file(fm_str(arena, cdir, "/release-config.4coder"), fm_str(arena, dir, "/config.4coder"));
2017-02-25 01:53:40 +00:00
2017-07-08 19:25:23 +00:00
if (tier_index == Tier_Super){
fm_copy_all(0, "4coder_*", dir);
2019-06-01 23:58:28 +00:00
do_buildsuper(arena, cdir, fm_str(arena, custom_files[Custom_Default]), arch);
fm_copy_file(fm_str(arena, build_dir, "/custom_4coder" DLL), fm_str(arena, dir, "/custom_4coder" DLL));
2017-07-08 19:25:23 +00:00
2019-06-01 23:58:28 +00:00
char *build_script = fm_str(arena, "buildsuper_", arch_names[arch], BAT);
fm_copy_file(build_script, fm_str(arena, dir, "/buildsuper" BAT));
2017-07-08 19:25:23 +00:00
if (This_OS == Platform_Windows){
2019-06-01 23:58:28 +00:00
fm_copy_folder(arena, cdir, dir, "windows_scripts");
2017-07-08 19:25:23 +00:00
}
2019-06-01 23:58:28 +00:00
fm_copy_folder(arena, cdir, dir, "4coder_API");
fm_copy_folder(arena, cdir, dir, "4coder_lib");
fm_copy_folder(arena, cdir, dir, "4coder_generated");
fm_copy_folder(arena, cdir, dir, "languages");
}
2019-06-01 23:58:28 +00:00
char *dist_name = get_4coder_dist_name(arena, This_OS, tier, arch);
char *zip_name = fm_str(arena, zip_dir, "/", dist_name, ".zip");
fm_make_folder_if_missing(arena, zip_dir);
2017-07-08 19:25:23 +00:00
fm_zip(par_dir, "4coder", zip_name);
2017-02-25 01:53:40 +00:00
}
2019-06-01 23:58:28 +00:00
end_temp(temp);
2017-02-25 01:53:40 +00:00
}
}
int main(int argc, char **argv){
2019-06-01 23:58:28 +00:00
Arena arena = fm_init_system();
2017-07-08 19:25:23 +00:00
char cdir[256];
BEGIN_TIME_SECTION();
i32 n = fm_get_current_directory(cdir, sizeof(cdir));
2017-07-08 19:25:23 +00:00
Assert(n < sizeof(cdir));
END_TIME_SECTION("current directory");
#if defined(DEV_BUILD) || defined(OPT_BUILD) || defined(DEV_BUILD_X86)
2017-06-12 21:35:06 +00:00
u32 flags = DEBUG_INFO | SUPER | INTERNAL | LOG;
2017-07-08 19:25:23 +00:00
u32 arch = Arch_X64;
2017-04-24 15:23:12 +00:00
#if defined(OPT_BUILD)
flags |= OPTIMIZATION;
#endif
#if defined(DEV_BUILD_X86)
2017-07-08 19:25:23 +00:00
arch = Arch_X86;
#endif
2019-06-01 23:58:28 +00:00
standard_build(&arena, cdir, flags, arch);
#elif defined(PACKAGE)
2019-06-01 23:58:28 +00:00
package(&arena, cdir);
#else
2017-07-08 19:25:23 +00:00
# error No build type specified.
#endif
return(error_state);
}
2016-08-28 15:42:12 +00:00
// BOTTOM