even more clean up on the build system

This commit is contained in:
Allen Webster 2017-07-08 20:48:53 -04:00
parent a4137ca739
commit 0ab0cb9b97
3 changed files with 132 additions and 121 deletions

0
buildsuper_x64.sh Normal file → Executable file
View File

View File

@ -63,17 +63,23 @@ internal void fm_copy_folder(char *src_dir, char *dst_dir, char *src_folder);
// Zip // Zip
internal void fm_zip(char *parent, char *folder, char *dest); internal void fm_zip(char *parent, char *folder, char *dest);
// File Name Manipulation // Slash Correction
internal void fm_slash_fix(char *path); internal void fm_slash_fix(char *path);
// Memory concat helpers
internal char *fm_prepare_string_internal(char *s1, ...); internal char *fm_prepare_string_internal(char *s1, ...);
#define fm_str(...) fm_prepare_string_internal(__VA_ARGS__, 0) #define fm_str(...) fm_prepare_string_internal(__VA_ARGS__, 0)
internal char **fm_prepare_list_internal(char **l1, ...);
#define fm_list(...) fm_prepare_list_internal(__VA_ARGS__, 0)
internal char **fm_list_one_item(char *item);
// File System Navigation
typedef umem Temp_Memory; typedef umem Temp_Memory;
internal Temp_Memory fm_begin_temp(); internal Temp_Memory fm_begin_temp();
internal void fm_end_temp(Temp_Memory temp); internal void fm_end_temp(Temp_Memory temp);
// File System Navigation
internal i32 fm_get_current_directory(char *buffer, i32 max); internal i32 fm_get_current_directory(char *buffer, i32 max);
typedef struct Temp_Dir{ typedef struct Temp_Dir{
@ -84,7 +90,6 @@ internal Temp_Dir fm_pushdir(char *dir);
internal void fm_popdir(Temp_Dir temp); internal void fm_popdir(Temp_Dir temp);
// Build Line // Build Line
#define BUILD_LINE_MAX 4096 #define BUILD_LINE_MAX 4096
typedef struct Build_Line{ typedef struct Build_Line{
char build_optionsA[BUILD_LINE_MAX]; char build_optionsA[BUILD_LINE_MAX];
@ -229,13 +234,9 @@ typedef union _LARGE_INTEGER {
extern "C"{ extern "C"{
DWORD WINAPI GetCurrentDirectoryA(_In_ DWORD nBufferLength, _Out_ LPTSTR lpBuffer); DWORD WINAPI GetCurrentDirectoryA(_In_ DWORD nBufferLength, _Out_ LPTSTR lpBuffer);
BOOL WINAPI SetCurrentDirectoryA(_In_ LPCTSTR lpPathName); BOOL WINAPI SetCurrentDirectoryA(_In_ LPCTSTR lpPathName);
BOOL WINAPI QueryPerformanceCounter(_Out_ LARGE_INTEGER *lpPerformanceCount); BOOL WINAPI QueryPerformanceCounter(_Out_ LARGE_INTEGER *lpPerformanceCount);
BOOL WINAPI QueryPerformanceFrequency(_Out_ LARGE_INTEGER *lpFrequency); BOOL WINAPI QueryPerformanceFrequency(_Out_ LARGE_INTEGER *lpFrequency);
BOOL WINAPI CreateDirectoryA(_In_ LPCTSTR lpPathName, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes); BOOL WINAPI CreateDirectoryA(_In_ LPCTSTR lpPathName, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes);
BOOL WINAPI CopyFileA(_In_ LPCTSTR lpExistingFileName, _In_ LPCTSTR lpNewFileName, _In_ BOOL bFailIfExists); BOOL WINAPI CopyFileA(_In_ LPCTSTR lpExistingFileName, _In_ LPCTSTR lpNewFileName, _In_ BOOL bFailIfExists);
} }
@ -487,34 +488,65 @@ fm_copy_folder(char *src_dir, char *dst_dir, char *src_folder){
fm_popdir(temp); fm_popdir(temp);
} }
// List Helpers
internal umem
listsize(void *p, umem item_size){
u64 zero = 0;
u8 *ptr = (u8*)p;
for (;memcmp(ptr, &zero, item_size) != 0; ptr += item_size);
umem size = (ptr - (u8*)p);
return(size);
}
internal void*
fm__prepare(umem item_size, void *i1, va_list list){
umem size = listsize(i1, item_size);
void *result = (void*)fm__push(size);
memcpy(result, i1, size);
void *ln = va_arg(list, void*);
for (;ln != 0;){
size = listsize(ln, item_size);
void *new_str = (void*)fm__push(size);
memcpy(new_str, ln, size);
ln = va_arg(list, void*);
}
void *terminator = (void*)fm__push(item_size);
memset(terminator, 0, item_size);
return(result);
}
internal char* internal char*
fm_prepare_string_internal(char *s1, ...){ fm_prepare_string_internal(char *s1, ...){
umem len = strlen(s1); umem item_size = sizeof(*s1);
char *result = (char*)fm__push(len);
memcpy(result, s1, len);
va_list list; va_list list;
va_start(list, s1); va_start(list, s1);
for (;;){ char *result = (char*)fm__prepare(item_size, s1, list);
char *sn = va_arg(list, char*);
if (sn == 0){
break;
}
else{
len = strlen(sn);
char *new_str = (char*)fm__push(len);
memcpy(new_str, sn, len);
}
}
va_end(list); va_end(list);
char *terminator = (char*)fm__push(1);
*terminator = 0;
fm_slash_fix(result); fm_slash_fix(result);
return(result); return(result);
} }
internal char**
fm_prepare_list_internal(char **p1, ...){
umem item_size = sizeof(*p1);
va_list list;
va_start(list, p1);
char **result = (char**)fm__prepare(item_size, p1, list);
va_end(list);
return(result);
}
internal char**
fm_list_one_item(char *item){
char **result = (char**)fm__push(sizeof(char*)*2);
result[0] = item;
result[1] = 0;
return(result);
}
// Build Line
internal void internal void
fm_init_build_line(Build_Line *line){ fm_init_build_line(Build_Line *line){
line->build_options = line->build_optionsA; line->build_options = line->build_optionsA;

View File

@ -71,11 +71,13 @@ char *compiler_names[] = {
#define PACK_DIR "../distributions" #define PACK_DIR "../distributions"
#define SITE_DIR "../site" #define SITE_DIR "../site"
char *includes[] = { "../foreign", "../foreign/freetype2", 0, };
// //
// Platform layer file tables // Platform layer file tables
// //
char *windows_platform_layer[] = { "platform_win32\\win32_4ed.cpp", 0 }; char *windows_platform_layer[] = { "platform_win32/win32_4ed.cpp", 0 };
char *linux_platform_layer[] = { "platform_linux/linux_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 *mac_platform_layer[] = { "platform_mac/mac_4ed.m", "platform_mac/mac_4ed.cpp", 0 };
@ -85,7 +87,7 @@ char **platform_layers[Platform_COUNT] = {
mac_platform_layer , mac_platform_layer ,
}; };
char *windows_cl_platform_inc[] = { ".", "platform_all", 0 }; char *windows_cl_platform_inc[] = { "platform_all", 0 };
char *linux_gcc_platform_inc[] = { "platform_all", "platform_unix", 0 }; char *linux_gcc_platform_inc[] = { "platform_all", "platform_unix", 0 };
char *mac_gcc_platform_inc[] = { "platform_all", "platform_unix", 0 }; char *mac_gcc_platform_inc[] = { "platform_all", "platform_unix", 0 };
@ -138,19 +140,36 @@ char *arch_names[] = {
enum{ enum{
OPTS = 0x1, OPTS = 0x1,
INCLUDES = 0x2, LIBS = 0x2,
LIBS = 0x4, ICON = 0x4,
ICON = 0x8, SHARED_CODE = 0x8,
SHARED_CODE = 0x10, DEBUG_INFO = 0x10,
DEBUG_INFO = 0x20, OPTIMIZATION = 0x20,
SUPER = 0x40, SUPER = 0x40,
INTERNAL = 0x80, INTERNAL = 0x80,
OPTIMIZATION = 0x100, KEEP_ASSERT = 0x100,
KEEP_ASSERT = 0x200, LOG = 0x200,
SITE_INCLUDES = 0x400,
LOG = 0x800,
}; };
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);
}
// //
// build implementation: cl // build implementation: cl
// //
@ -162,10 +181,6 @@ enum{
"-wd4127 -wd4510 -wd4512 -wd4610 -wd4390 " \ "-wd4127 -wd4510 -wd4512 -wd4610 -wd4390 " \
"-wd4611 -WX -GR- -EHa- -nologo -FC" "-wd4611 -WX -GR- -EHa- -nologo -FC"
#define CL_INCLUDES "/I..\\foreign /I..\\foreign\\freetype2"
#define CL_SITE_INCLUDES "/I..\\..\\foreign /I..\\..\\code"
#define CL_LIBS_X64 \ #define CL_LIBS_X64 \
"user32.lib winmm.lib gdi32.lib opengl32.lib " \ "user32.lib winmm.lib gdi32.lib opengl32.lib " \
"..\\foreign_x64\\freetype.lib" "..\\foreign_x64\\freetype.lib"
@ -174,13 +189,11 @@ enum{
"user32.lib winmm.lib gdi32.lib opengl32.lib " \ "user32.lib winmm.lib gdi32.lib opengl32.lib " \
"..\\foreign_x86\\freetype.lib" "..\\foreign_x86\\freetype.lib"
#define CL_ICON "..\\res\\icon.res" #define CL_ICON "..\\res\\icon.res"
#define CL_X64 "-MACHINE:X64"
#define CL_X86 "-MACHINE:X86"
static void static void
build(u32 flags, u32 arch, char *code_path, char **code_files, char *out_path, char *out_file, char *exports, char **inc_folders){ build(u32 flags, u32 arch, char *code_path, char **code_files, char *out_path, char *out_file, char **defines, char **exports, char **inc_folders){
Build_Line line; Build_Line line;
Build_Line link_line; Build_Line link_line;
Build_Line line_prefix; Build_Line line_prefix;
@ -207,21 +220,11 @@ build(u32 flags, u32 arch, char *code_path, char **code_files, char *out_path, c
default: InvalidCodePath; default: InvalidCodePath;
} }
if (flags & LOG){ fm_add_to_line(line, "-I%s", code_path);
fm_add_to_line(line, "/DUSE_LOG /DUSE_LOGF");
}
if (flags & INCLUDES){
fm_add_to_line(line, CL_INCLUDES);
}
if (flags & SITE_INCLUDES){
fm_add_to_line(line, CL_SITE_INCLUDES);
}
if (inc_folders != 0){ if (inc_folders != 0){
for (u32 i = 0; inc_folders[i] != 0; ++i){ for (u32 i = 0; inc_folders[i] != 0; ++i){
fm_add_to_line(line, "/I%s\\%s", code_path, inc_folders[i]); char *str = fm_str(code_path, "/", inc_folders[i]);
fm_add_to_line(line, "/I%s", str);
} }
} }
@ -253,25 +256,16 @@ build(u32 flags, u32 arch, char *code_path, char **code_files, char *out_path, c
fm_add_to_line(line, "/LD"); fm_add_to_line(line, "/LD");
} }
if (flags & SUPER){ if (defines != 0){
fm_add_to_line(line, "/DFRED_SUPER"); for (u32 i = 0; defines[i] != 0; ++i){
char *define_flag = fm_str("/D", defines[i]);
fm_add_to_line(line, define_flag);
}
} }
if (flags & INTERNAL){
fm_add_to_line(line, "/DFRED_INTERNAL");
}
if (flags & KEEP_ASSERT){
fm_add_to_line(line, "/DFRED_KEEP_ASSERT");
}
switch (arch){ switch (arch){
case Arch_X64: case Arch_X64: fm_add_to_line(link_line, "/MACHINE:X64"); break;
fm_add_to_line(link_line, CL_X64); break; case Arch_X86: fm_add_to_line(link_line, "/MACHINE:X86"); break;
case Arch_X86:
fm_add_to_line(link_line, CL_X86); break;
default: InvalidCodePath; default: InvalidCodePath;
} }
@ -279,15 +273,17 @@ build(u32 flags, u32 arch, char *code_path, char **code_files, char *out_path, c
fm_add_to_line(link_line, "/DEBUG"); fm_add_to_line(link_line, "/DEBUG");
} }
char link_type_string[1024];
if (flags & SHARED_CODE){ if (flags & SHARED_CODE){
Assert(exports); Assert(exports != 0);
snprintf(link_type_string, sizeof(link_type_string), "/OPT:REF %s", exports); fm_add_to_line(link_line, "/OPT:REF");
for (u32 i = 0; exports[i] != 0; ++i){
char *str = fm_str("/EXPORT:", exports[i]);
fm_add_to_line(link_line, "%s", str);
}
} }
else{ else{
snprintf(link_type_string, sizeof(link_type_string), "/NODEFAULTLIB:library"); fm_add_to_line(link_line, "/NODEFAULTLIB:library");
} }
fm_add_to_line(link_line, "%s", link_type_string);
for (u32 i = 0; code_files[i]; ++i){ 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, "\"%s\\%s\"", code_path, code_files[i]);
@ -333,26 +329,18 @@ build(u32 flags, u32 arch, char *code_path, char **code_files, char *out_path, c
# error gcc options not set for this platform # error gcc options not set for this platform
#endif #endif
#define GCC_X86 "-m32"
#define GCC_X64 "-m64"
#define GCC_INCLUDES "-I../foreign -I../code"
#define GCC_SITE_INCLUDES "-I../../foreign -I../../code"
static void static void
build(u32 flags, u32 arch, char *code_path, char **code_files, char *out_path, char *out_file, char *exports, char **inc_folders){ build(u32 flags, u32 arch, char *code_path, char **code_files, char *out_path, char *out_file, char **defines, char **exports, char **inc_folders){
Build_Line line; Build_Line line;
fm_init_build_line(&line); fm_init_build_line(&line);
switch (arch){ switch (arch){
case Arch_X64: case Arch_X64:
fm_add_to_line(line, GCC_X64); fm_add_to_line(line, "-m64");
fm_add_to_line(line, "-DFTECH_64_BIT"); break; fm_add_to_line(line, "-DFTECH_64_BIT"); break;
case Arch_X86: case Arch_X86:
fm_add_to_line(line, GCC_X86); fm_add_to_line(line, "-m32");
fm_add_to_line(line, "-DFTECH_32_BIT"); break; fm_add_to_line(line, "-DFTECH_32_BIT"); break;
default: InvalidCodePath; default: InvalidCodePath;
@ -362,6 +350,7 @@ build(u32 flags, u32 arch, char *code_path, char **code_files, char *out_path, c
fm_add_to_line(line, GCC_OPTS); fm_add_to_line(line, GCC_OPTS);
} }
#if 0
if (flags & INCLUDES){ if (flags & INCLUDES){
#if defined(IS_LINUX) #if defined(IS_LINUX)
i32 size = 0; i32 size = 0;
@ -379,14 +368,13 @@ build(u32 flags, u32 arch, char *code_path, char **code_files, char *out_path, c
fm_add_to_line(line, GCC_INCLUDES); fm_add_to_line(line, GCC_INCLUDES);
#endif #endif
} }
#endif
if (flags & SITE_INCLUDES){ fm_add_to_line(line, "-I%s", code_path);
fm_add_to_line(line, GCC_SITE_INCLUDES);
}
if (inc_folders != 0){ if (inc_folders != 0){
for (u32 i = 0; inc_folders[i] != 0; ++i){ for (u32 i = 0; inc_folders[i] != 0; ++i){
fm_add_to_line(line, "-I%s/%s", code_path, inc_folders[i]); char *str = fm_str(code_path, "/", inc_folders[i]);
fm_add_to_line(line, "-I%s", str);
} }
} }
@ -402,22 +390,14 @@ build(u32 flags, u32 arch, char *code_path, char **code_files, char *out_path, c
fm_add_to_line(line, "-shared"); fm_add_to_line(line, "-shared");
} }
if (flags & LOG){ if (defines != 0){
fm_add_to_line(line, "-DUSE_LOG -DUSE_LOGF"); for (u32 i = 0; defines[i]; ++i){
char *define_flag = fm_str("-D", defines[i]);
fm_add_to_line(line, "%s",
define_flag);
}
} }
if (flags & SUPER){
fm_add_to_line(line, "-DFRED_SUPER");
}
if (flags & INTERNAL){
fm_add_to_line(line, "-DFRED_INTERNAL");
}
if (flags & KEEP_ASSERT){
fm_add_to_line(line, "-DFRED_KEEP_ASSERT");
}
fm_add_to_line(line, "-I\"%s\"", code_path); fm_add_to_line(line, "-I\"%s\"", code_path);
for (u32 i = 0; code_files[i] != 0; ++i){ for (u32 i = 0; code_files[i] != 0; ++i){
fm_add_to_line(line, "\"%s/%s\"", code_path, code_files[i]); fm_add_to_line(line, "\"%s/%s\"", code_path, code_files[i]);
@ -439,12 +419,12 @@ build(u32 flags, u32 arch, char *code_path, char **code_files, char *out_path, c
#endif #endif
static void static void
build(u32 flags, u32 arch, char *code_path, char *code_file, char *out_path, char *out_file, char *exports, char **inc_folders){ 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]; char *code_files[2];
code_files[0] = code_file; code_files[0] = code_file;
code_files[1] = 0; code_files[1] = 0;
build(flags, arch, code_path, code_files, out_path, out_file, exports, inc_folders); build(flags, arch, code_path, code_files, out_path, out_file, defines, exports, inc_folders);
} }
static void static void
@ -453,7 +433,7 @@ site_build(char *cdir, u32 flags){
char *file = fm_str("site/sitegen.cpp"); char *file = fm_str("site/sitegen.cpp");
char *dir = fm_str(BUILD_DIR); char *dir = fm_str(BUILD_DIR);
BEGIN_TIME_SECTION(); BEGIN_TIME_SECTION();
build(OPTS | SITE_INCLUDES | flags, Arch_X64, cdir, file, dir, "sitegen", 0, 0); build(OPTS | flags, Arch_X64, cdir, file, dir, "sitegen", get_defines_from_flags(flags), 0, includes);
END_TIME_SECTION("build sitegen"); END_TIME_SECTION("build sitegen");
} }
@ -473,7 +453,7 @@ build_and_run(char *cdir, char *filename, char *name, u32 flags){
{ {
char *file = fm_str(filename); char *file = fm_str(filename);
BEGIN_TIME_SECTION(); BEGIN_TIME_SECTION();
build(flags, Arch_X64, cdir, file, dir, name, 0, 0); build(flags, Arch_X64, cdir, file, dir, name, get_defines_from_flags(flags), 0, includes);
END_TIME_SECTION(fm_str("build ", name)); END_TIME_SECTION(fm_str("build ", name));
} }
@ -492,7 +472,7 @@ fsm_generator(char *cdir){
static void static void
metagen(char *cdir){ metagen(char *cdir){
build_and_run(cdir, "meta/4ed_metagen.cpp", "metagen", OPTS | DEBUG_INFO | INCLUDES); build_and_run(cdir, "meta/4ed_metagen.cpp", "metagen", OPTS | DEBUG_INFO);
} }
static void static void
@ -518,14 +498,16 @@ build_main(char *cdir, b32 update_local_theme, u32 flags, u32 arch){
{ {
char *file = fm_str("4ed_app_target.cpp"); char *file = fm_str("4ed_app_target.cpp");
char **exports = fm_list_one_item("app_get_functions");
BEGIN_TIME_SECTION(); BEGIN_TIME_SECTION();
build(OPTS | INCLUDES | SHARED_CODE | flags, arch, cdir, file, dir, "4ed_app" DLL, "/EXPORT:app_get_functions", 0); build(OPTS | SHARED_CODE | flags, arch, cdir, file, dir, "4ed_app" DLL, get_defines_from_flags(flags), exports, includes);
END_TIME_SECTION("build 4ed_app"); END_TIME_SECTION("build 4ed_app");
} }
{ {
BEGIN_TIME_SECTION(); BEGIN_TIME_SECTION();
build(OPTS | INCLUDES | LIBS | ICON | flags, arch, cdir, platform_layers[This_OS], dir, "4ed", 0, platform_includes[This_OS][This_Compiler]); 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"); END_TIME_SECTION("build 4ed");
} }
@ -696,8 +678,5 @@ int main(int argc, char **argv){
return(error_state); return(error_state);
} }
//#include "4ed_file_moving.h"
// BOTTOM // BOTTOM