4coder/meta/4ed_build.cpp

725 lines
20 KiB
C++
Raw Normal View History

/*
* Mr. 4th Dimention - Allen Webster
*
* ??.??.????
*
* 4coder development build rule.
*
*/
// TOP
//#define FM_PRINT_COMMANDS
#include "../4ed_defines.h"
2017-07-08 19:25:23 +00:00
#define FTECH_FILE_MOVING_IMPLEMENTATION
#include "4ed_file_moving.h"
#include "../4coder_API/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",
};
#if defined(IS_WINDOWS)
2017-07-08 19:25:23 +00:00
# define This_OS Platform_Windows
#elif defined(IS_LINUX)
2017-07-08 19:25:23 +00:00
# define This_OS Platform_Linux
#elif defined(IS_MAC)
2017-07-08 19:25:23 +00:00
# define This_OS Platform_Mac
#else
# error This platform is not enumerated.
#endif
#if defined(IS_CL)
2017-07-08 19:25:23 +00:00
# define This_Compiler Compiler_CL
#elif defined(IS_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**
get_defines_from_flags(u32 flags){
char **result = 0;
if (flags & KEEP_ASSERT){
result = fm_list(fm_list_one_item("FRED_KEEP_ASSERT"), result);
}
if (flags & INTERNAL){
result = fm_list(fm_list_one_item("FRED_INTERNAL"), result);
}
if (flags & SUPER){
result = fm_list(fm_list_one_item("FRED_SUPER"), result);
}
if (flags & LOG){
char *log_defines[] = { "USE_LOG", "USE_LOGF", 0};
result = fm_list(log_defines, result);
}
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
//
2017-07-08 19:25:23 +00:00
#if defined(IS_CL)
2016-09-04 20:41:48 +00:00
#define CL_OPTS \
"-W4 -wd4310 -wd4100 -wd4201 -wd4505 -wd4996 " \
"-wd4127 -wd4510 -wd4512 -wd4610 -wd4390 " \
"-wd4611 -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 \
2016-09-04 20:41:48 +00:00
"user32.lib winmm.lib gdi32.lib opengl32.lib " \
FOREIGN_WIN"\\x64\\freetype.lib"
2017-02-25 01:53:40 +00:00
#define CL_LIBS_X86 \
"user32.lib winmm.lib gdi32.lib opengl32.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
2017-07-09 00:48:53 +00:00
build(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;
2017-07-08 19:25:23 +00:00
default: InvalidCodePath;
}
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){
2017-07-09 00:48:53 +00:00
char *str = fm_str(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;
2017-07-08 19:25:23 +00:00
default: InvalidCodePath;
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");
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){
char *define_flag = fm_str("-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);
fm_add_to_line(line, "-link -INCREMENTAL:NO");
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;
2017-07-08 19:25:23 +00:00
default: InvalidCodePath;
}
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){
char *str = fm_str("-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
//
2017-07-08 19:25:23 +00:00
#elif defined(IS_GCC)
2017-06-29 02:53:51 +00:00
#if defined(IS_LINUX)
2017-06-29 02:53:51 +00:00
# define GCC_OPTS \
"-Wno-write-strings " \
"-D_GNU_SOURCE -fPIC " \
2016-11-14 04:29:00 +00:00
"-fno-threadsafe-statics -pthread"
2017-11-11 19:54:31 +00:00
#define GCC_LIBS_COMMON \
2017-06-29 02:53:51 +00:00
"-L/usr/local/lib -lX11 -lpthread -lm -lrt " \
"-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
2017-06-29 02:53:51 +00:00
#elif defined(IS_MAC)
2017-06-29 02:53:51 +00:00
# define GCC_OPTS \
"-Wno-write-strings -Wno-deprecated-declarations " \
2017-06-29 23:41:39 +00:00
"-Wno-comment -Wno-switch -Wno-null-dereference "
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"
#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
2017-07-09 00:48:53 +00:00
build(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){
2017-07-09 00:48:53 +00:00
char *str = fm_str(code_path, "/", inc_folders[i]);
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){
char *define_flag = fm_str("-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
2017-07-09 00:48:53 +00:00
build(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[2];
code_files[0] = code_file;
code_files[1] = 0;
2017-07-09 00:48:53 +00:00
build(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
internal void
2017-07-08 19:25:23 +00:00
site_build(char *cdir, u32 flags){
2017-11-22 20:05:58 +00:00
{
systemf("%s -R %s", "build_metadata" BAT, cdir);
}
2017-07-08 19:25:23 +00:00
{
char *file = fm_str("site/4ed_sitegen.cpp");
2017-07-08 19:25:23 +00:00
char *dir = fm_str(BUILD_DIR);
BEGIN_TIME_SECTION();
2017-07-09 00:48:53 +00:00
build(OPTS | flags, Arch_X64, cdir, file, dir, "sitegen", get_defines_from_flags(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();
2017-11-11 16:27:04 +00:00
char *cmd = fm_str(BUILD_DIR "/sitegen");
2017-07-09 03:25:29 +00:00
char *code_dir = fm_str(".");
char *asset_dir = fm_str("../4coder-non-source/site_resources");
2017-07-09 03:25:29 +00:00
char *site_source_dir = fm_str("site/source_material");
char *dest_dir = fm_str("../site");
fm_make_folder_if_missing(dest_dir);
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
build_and_run(char *cdir, char *filename, char *name, u32 flags){
char *dir = fm_str(BUILD_DIR);
2017-07-08 19:25:23 +00:00
2016-08-29 01:03:26 +00:00
{
char *file = fm_str(filename);
BEGIN_TIME_SECTION();
2017-07-09 00:48:53 +00:00
build(flags, Arch_X64, cdir, file, dir, name, get_defines_from_flags(flags), 0, includes);
END_TIME_SECTION(fm_str("build ", name));
2016-08-29 01:03:26 +00:00
}
2017-07-08 19:25:23 +00:00
if (prev_error == 0){
char *cmd = fm_str(dir, "/", name);
BEGIN_TIME_SECTION();
fm_execute_in_dir(cdir, cmd, 0);
END_TIME_SECTION(fm_str("run ", name));
}
}
internal void
fsm_generator(char *cdir){
build_and_run(cdir, "meta/4ed_fsm_table_generator.cpp", "fsmgen", OPTS | DEBUG_INFO);
}
internal void
metagen(char *cdir){
2017-07-09 00:48:53 +00:00
build_and_run(cdir, "meta/4ed_metagen.cpp", "metagen", OPTS | DEBUG_INFO);
}
internal void
string_build(char *cdir){
char *dir = fm_str(BUILD_DIR);
{
char *file = fm_str("string/4ed_string_builder.cpp");
BEGIN_TIME_SECTION();
build(OPTS | DEBUG_INFO, Arch_X64, cdir, file, dir, "string_builder", 0, 0, includes);
END_TIME_SECTION("build string_builder");
}
if (prev_error == 0){
char *cmd = fm_str(cdir, "/", dir, "/string_builder");
BEGIN_TIME_SECTION();
fm_execute_in_dir(fm_str(cdir, "/string"), cmd, 0);
END_TIME_SECTION("run string_builder");
}
}
internal void
2017-07-08 19:25:23 +00:00
do_buildsuper(char *cdir, char *file, u32 arch){
BEGIN_TIME_SECTION();
2017-07-08 19:25:23 +00:00
Temp_Dir temp = fm_pushdir(fm_str(BUILD_DIR));
2016-12-14 16:09:54 +00:00
2017-07-08 19:25:23 +00:00
char *build_script = fm_str("buildsuper_", arch_names[arch], BAT);
2017-07-08 19:25:23 +00:00
char *build_command = fm_str("\"", cdir, "/", build_script, "\" \"", file, "\"");
if (This_OS == Platform_Windows){
build_command = fm_str("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
2017-07-18 20:17:57 +00:00
#if defined(IS_LINUX)
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);
}
2017-09-10 18:24:26 +00:00
#elif defined(IS_MAC)
char *freetype_include = "/usr/local/include/freetype2";
size = strlen(freetype_include);
memcpy(out, freetype_include, size
2017-11-11 16:27:04 +00:00
);
2017-09-10 18:24:26 +00:00
#endif
2017-07-18 20:17:57 +00:00
#endif
return(size);
}
internal void
2017-07-08 19:25:23 +00:00
build_main(char *cdir, b32 update_local_theme, u32 flags, u32 arch){
char *dir = fm_str(BUILD_DIR);
2017-02-18 01:04:41 +00:00
{
char *file = fm_str("4ed_app_target.cpp");
2017-07-09 00:48:53 +00:00
char **exports = fm_list_one_item("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);
build_includes = fm_list(build_includes, fm_list_one_item(ft_include));
}
BEGIN_TIME_SECTION();
build(OPTS | SHARED_CODE | flags, arch, cdir, file, dir, "4ed_app" DLL, get_defines_from_flags(flags), exports, build_includes);
END_TIME_SECTION("build 4ed_app");
}
{
BEGIN_TIME_SECTION();
2017-07-09 00:48:53 +00:00
char **inc = (char**)fm_list(includes, platform_includes[This_OS][This_Compiler]);
build(OPTS | LIBS | ICON | flags, arch, cdir, platform_layers[This_OS], dir, "4ed", get_defines_from_flags(flags), 0, inc);
END_TIME_SECTION("build 4ed");
}
2017-07-08 19:25:23 +00:00
if (update_local_theme){
BEGIN_TIME_SECTION();
char *themes_folder = fm_str("../build/themes");
char *source_themes_folder = fm_str("themes");
fm_clear_folder(themes_folder);
fm_make_folder_if_missing(themes_folder);
fm_copy_all(source_themes_folder, "*", themes_folder);
END_TIME_SECTION("move files");
}
}
internal void
2017-07-08 19:25:23 +00:00
standard_build(char *cdir, u32 flags, u32 arch){
fsm_generator(cdir);
metagen(cdir);
do_buildsuper(cdir, fm_str(custom_files[Custom_Default]), arch);
//do_buildsuper(cdir, fm_str(custom_files[Custom_Experiments]), arch);
//do_buildsuper(cdir, fm_str(custom_files[Custom_Casey]), arch);
2017-07-08 19:25:23 +00:00
//do_buildsuper(cdir, fm_str(custom_files[Custom_ChronalVim]), arch);
build_main(cdir, true, flags, arch);
}
2017-07-08 19:25:23 +00:00
internal char*
get_4coder_dist_name(u32 platform, char *tier, u32 arch){
char *name = fm_str("4coder-alpha-"MAJOR_STR"-"MINOR_STR"-"PATCH_STR);
if (strcmp(tier, "alpha") != 0){
name = fm_str(name, "-", tier);
2016-11-14 06:39:03 +00:00
}
2017-07-08 19:25:23 +00:00
if (platform != Platform_None){
name = fm_str(name, "-", platform_names[platform]);
2017-02-27 14:53:38 +00:00
}
2017-07-08 19:25:23 +00:00
if (arch != Arch_None){
name = fm_str(name, "-", arch_names[arch]);
}
2017-07-08 19:25:23 +00:00
return(name);
}
internal void
package(char *cdir){
// NOTE(allen): meta
fsm_generator(cdir);
metagen(cdir);
char *build_dir = fm_str(BUILD_DIR);
char *pack_dir = fm_str(PACK_DIR);
char *fonts_source_dir = fm_str("../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];
Temp temp = fm_begin_temp();
char *tier_package_root = fm_str(base_package_root, "_", tier);
2017-07-08 19:25:23 +00:00
for (u32 arch = 0; arch < Arch_COUNT; ++arch){
char *par_dir = fm_str(tier_package_root, "_", arch_names[arch]);
char *dir = fm_str(par_dir, "/4coder");
char *fonts_dir = fm_str(dir, "/fonts");
char *zip_dir = fm_str(pack_dir, "/", tier, "_", arch_names[arch]);
2017-02-25 01:53:40 +00:00
2017-07-08 19:25:23 +00:00
build_main(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
2017-07-08 19:25:23 +00:00
fm_make_folder_if_missing(dir);
fm_copy_file(fm_str(build_dir, "/4ed" EXE), fm_str(dir, "/4ed" EXE));
fm_copy_file(fm_str(build_dir, "/4ed_app" DLL), fm_str(dir, "/4ed_app" DLL));
2017-07-08 19:25:23 +00:00
fm_copy_folder(cdir, dir, "themes");
fm_copy_file(fm_str(cdir, "/LICENSE.txt"), fm_str(dir, "/LICENSE.txt"));
fm_copy_file(fm_str(cdir, "/README.txt"), fm_str(dir, "/README.txt"));
2018-05-28 01:00:13 +00:00
fm_copy_file(fm_str(cdir, "/CHANGES.txt"), fm_str(dir, "/CHANGES.txt"));
fm_make_folder_if_missing(fonts_dir);
2017-07-08 19:25:23 +00:00
fm_copy_all(fonts_source_dir, "*", fonts_dir);
fm_copy_file(fm_str(cdir, "/release-config.4coder"), fm_str(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);
do_buildsuper(cdir, fm_str(custom_files[Custom_Default]), arch);
fm_copy_file(fm_str(build_dir, "/custom_4coder" DLL), fm_str(dir, "/custom_4coder" DLL));
char *build_script = fm_str("buildsuper_", arch_names[arch], BAT);
fm_copy_file(build_script, fm_str(dir, "/buildsuper" BAT));
if (This_OS == Platform_Windows){
fm_copy_folder(cdir, dir, "windows_scripts");
}
fm_copy_folder(cdir, dir, "4coder_API");
fm_copy_folder(cdir, dir, "4coder_lib");
fm_copy_folder(cdir, dir, "4coder_generated");
2017-07-08 19:25:23 +00:00
fm_copy_folder(cdir, dir, "languages");
}
2017-07-08 19:25:23 +00:00
char *dist_name = get_4coder_dist_name(This_OS, tier, arch);
char *zip_name = fm_str(zip_dir, "/", dist_name, ".zip");
fm_make_folder_if_missing(zip_dir);
fm_zip(par_dir, "4coder", zip_name);
2017-02-25 01:53:40 +00:00
}
fm_end_temp(temp);
2017-02-25 01:53:40 +00:00
}
}
int main(int argc, char **argv){
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
2017-07-08 19:25:23 +00:00
standard_build(cdir, flags, arch);
#elif defined(PACKAGE)
package(cdir);
2017-07-08 19:25:23 +00:00
2016-11-14 04:29:00 +00:00
#elif defined(SITE_BUILD)
site_build(cdir, DEBUG_INFO);
#elif defined(STRING_BUILD)
string_build(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