even more clean up on the build system
This commit is contained in:
parent
a4137ca739
commit
0ab0cb9b97
|
@ -63,17 +63,23 @@ internal void fm_copy_folder(char *src_dir, char *dst_dir, char *src_folder);
|
|||
// Zip
|
||||
internal void fm_zip(char *parent, char *folder, char *dest);
|
||||
|
||||
// File Name Manipulation
|
||||
// Slash Correction
|
||||
internal void fm_slash_fix(char *path);
|
||||
|
||||
// Memory concat helpers
|
||||
internal char *fm_prepare_string_internal(char *s1, ...);
|
||||
#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;
|
||||
internal Temp_Memory fm_begin_temp();
|
||||
internal void fm_end_temp(Temp_Memory temp);
|
||||
|
||||
// File System Navigation
|
||||
internal i32 fm_get_current_directory(char *buffer, i32 max);
|
||||
|
||||
typedef struct Temp_Dir{
|
||||
|
@ -84,7 +90,6 @@ internal Temp_Dir fm_pushdir(char *dir);
|
|||
internal void fm_popdir(Temp_Dir temp);
|
||||
|
||||
// Build Line
|
||||
|
||||
#define BUILD_LINE_MAX 4096
|
||||
typedef struct Build_Line{
|
||||
char build_optionsA[BUILD_LINE_MAX];
|
||||
|
@ -229,13 +234,9 @@ typedef union _LARGE_INTEGER {
|
|||
extern "C"{
|
||||
DWORD WINAPI GetCurrentDirectoryA(_In_ DWORD nBufferLength, _Out_ LPTSTR lpBuffer);
|
||||
BOOL WINAPI SetCurrentDirectoryA(_In_ LPCTSTR lpPathName);
|
||||
|
||||
BOOL WINAPI QueryPerformanceCounter(_Out_ LARGE_INTEGER *lpPerformanceCount);
|
||||
|
||||
BOOL WINAPI QueryPerformanceFrequency(_Out_ LARGE_INTEGER *lpFrequency);
|
||||
|
||||
BOOL WINAPI CreateDirectoryA(_In_ LPCTSTR lpPathName, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
// 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*
|
||||
fm_prepare_string_internal(char *s1, ...){
|
||||
umem len = strlen(s1);
|
||||
char *result = (char*)fm__push(len);
|
||||
memcpy(result, s1, len);
|
||||
|
||||
umem item_size = sizeof(*s1);
|
||||
va_list list;
|
||||
va_start(list, s1);
|
||||
for (;;){
|
||||
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);
|
||||
}
|
||||
}
|
||||
char *result = (char*)fm__prepare(item_size, s1, list);
|
||||
va_end(list);
|
||||
|
||||
char *terminator = (char*)fm__push(1);
|
||||
*terminator = 0;
|
||||
|
||||
fm_slash_fix(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
|
||||
fm_init_build_line(Build_Line *line){
|
||||
line->build_options = line->build_optionsA;
|
||||
|
|
161
meta/build.cpp
161
meta/build.cpp
|
@ -71,11 +71,13 @@ char *compiler_names[] = {
|
|||
#define PACK_DIR "../distributions"
|
||||
#define SITE_DIR "../site"
|
||||
|
||||
char *includes[] = { "../foreign", "../foreign/freetype2", 0, };
|
||||
|
||||
//
|
||||
// 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 *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 ,
|
||||
};
|
||||
|
||||
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 *mac_gcc_platform_inc[] = { "platform_all", "platform_unix", 0 };
|
||||
|
||||
|
@ -138,19 +140,36 @@ char *arch_names[] = {
|
|||
|
||||
enum{
|
||||
OPTS = 0x1,
|
||||
INCLUDES = 0x2,
|
||||
LIBS = 0x4,
|
||||
ICON = 0x8,
|
||||
SHARED_CODE = 0x10,
|
||||
DEBUG_INFO = 0x20,
|
||||
LIBS = 0x2,
|
||||
ICON = 0x4,
|
||||
SHARED_CODE = 0x8,
|
||||
DEBUG_INFO = 0x10,
|
||||
OPTIMIZATION = 0x20,
|
||||
SUPER = 0x40,
|
||||
INTERNAL = 0x80,
|
||||
OPTIMIZATION = 0x100,
|
||||
KEEP_ASSERT = 0x200,
|
||||
SITE_INCLUDES = 0x400,
|
||||
LOG = 0x800,
|
||||
KEEP_ASSERT = 0x100,
|
||||
LOG = 0x200,
|
||||
};
|
||||
|
||||
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
|
||||
//
|
||||
|
@ -162,10 +181,6 @@ enum{
|
|||
"-wd4127 -wd4510 -wd4512 -wd4610 -wd4390 " \
|
||||
"-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 \
|
||||
"user32.lib winmm.lib gdi32.lib opengl32.lib " \
|
||||
"..\\foreign_x64\\freetype.lib"
|
||||
|
@ -174,13 +189,11 @@ enum{
|
|||
"user32.lib winmm.lib gdi32.lib opengl32.lib " \
|
||||
"..\\foreign_x86\\freetype.lib"
|
||||
|
||||
|
||||
#define CL_ICON "..\\res\\icon.res"
|
||||
|
||||
#define CL_X64 "-MACHINE:X64"
|
||||
#define CL_X86 "-MACHINE:X86"
|
||||
|
||||
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 link_line;
|
||||
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;
|
||||
}
|
||||
|
||||
if (flags & LOG){
|
||||
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);
|
||||
}
|
||||
|
||||
fm_add_to_line(line, "-I%s", code_path);
|
||||
if (inc_folders != 0){
|
||||
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");
|
||||
}
|
||||
|
||||
if (flags & SUPER){
|
||||
fm_add_to_line(line, "/DFRED_SUPER");
|
||||
if (defines != 0){
|
||||
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){
|
||||
case Arch_X64:
|
||||
fm_add_to_line(link_line, CL_X64); break;
|
||||
|
||||
case Arch_X86:
|
||||
fm_add_to_line(link_line, CL_X86); break;
|
||||
|
||||
case Arch_X64: fm_add_to_line(link_line, "/MACHINE:X64"); break;
|
||||
case Arch_X86: fm_add_to_line(link_line, "/MACHINE:X86"); break;
|
||||
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");
|
||||
}
|
||||
|
||||
char link_type_string[1024];
|
||||
if (flags & SHARED_CODE){
|
||||
Assert(exports);
|
||||
snprintf(link_type_string, sizeof(link_type_string), "/OPT:REF %s", exports);
|
||||
Assert(exports != 0);
|
||||
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{
|
||||
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){
|
||||
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
|
||||
#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
|
||||
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;
|
||||
fm_init_build_line(&line);
|
||||
|
||||
switch (arch){
|
||||
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;
|
||||
|
||||
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;
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
#if 0
|
||||
if (flags & INCLUDES){
|
||||
#if defined(IS_LINUX)
|
||||
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);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
if (flags & SITE_INCLUDES){
|
||||
fm_add_to_line(line, GCC_SITE_INCLUDES);
|
||||
}
|
||||
|
||||
fm_add_to_line(line, "-I%s", code_path);
|
||||
if (inc_folders != 0){
|
||||
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,20 +390,12 @@ build(u32 flags, u32 arch, char *code_path, char **code_files, char *out_path, c
|
|||
fm_add_to_line(line, "-shared");
|
||||
}
|
||||
|
||||
if (flags & LOG){
|
||||
fm_add_to_line(line, "-DUSE_LOG -DUSE_LOGF");
|
||||
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);
|
||||
}
|
||||
|
||||
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);
|
||||
|
@ -439,12 +419,12 @@ build(u32 flags, u32 arch, char *code_path, char **code_files, char *out_path, c
|
|||
#endif
|
||||
|
||||
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];
|
||||
code_files[0] = code_file;
|
||||
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
|
||||
|
@ -453,7 +433,7 @@ site_build(char *cdir, u32 flags){
|
|||
char *file = fm_str("site/sitegen.cpp");
|
||||
char *dir = fm_str(BUILD_DIR);
|
||||
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");
|
||||
}
|
||||
|
||||
|
@ -473,7 +453,7 @@ build_and_run(char *cdir, char *filename, char *name, u32 flags){
|
|||
{
|
||||
char *file = fm_str(filename);
|
||||
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));
|
||||
}
|
||||
|
||||
|
@ -492,7 +472,7 @@ fsm_generator(char *cdir){
|
|||
|
||||
static void
|
||||
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
|
||||
|
@ -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 **exports = fm_list_one_item("app_get_functions");
|
||||
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");
|
||||
}
|
||||
|
||||
{
|
||||
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");
|
||||
}
|
||||
|
||||
|
@ -696,8 +678,5 @@ int main(int argc, char **argv){
|
|||
return(error_state);
|
||||
}
|
||||
|
||||
|
||||
//#include "4ed_file_moving.h"
|
||||
|
||||
// BOTTOM
|
||||
|
||||
|
|
Loading…
Reference in New Issue