From 4bea967c87722f1e645c239f4dec2728318bd20f Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Sun, 4 Sep 2016 19:58:49 -0400 Subject: [PATCH] build.c packaging working on linux; discovered some issue with running optimized builds -O1 and up all seem to have the issue --- Makefile | 3 + build.c | 255 +++++++++++++++++++++++++++++++++++++++++++++----- linux_4ed.cpp | 6 +- package.bat | 1 - 4 files changed, 236 insertions(+), 29 deletions(-) diff --git a/Makefile b/Makefile index e4a4ea86..199c7700 100755 --- a/Makefile +++ b/Makefile @@ -8,6 +8,9 @@ FLAGS := -D_GNU_SOURCE -fPIC debug: FLAGS += -DDEV_BUILD debug: ../build/build +package: FLAGS += -DPACKAGE +package: ../build/build + ../build/build: $(CPP_FILES) $(C_FILES) $(H_FILES) gcc $(WARNINGS) $(FLAGS) build.c -g -o $@ ../build/build diff --git a/build.c b/build.c index 6214fe4f..6636ed65 100644 --- a/build.c +++ b/build.c @@ -10,38 +10,58 @@ #include #include +#include "4coder_version.h" + +#define FSTRING_INLINE static +#include "internal_4coder_string.cpp" + // // reusable // +#define IS_64BIT + // NOTE(allen): Compiler OS cracking. #if defined(_MSC_VER) -#define IS_CL -#define snprintf _snprintf +# define IS_CL +# define snprintf _snprintf -#if defined(_WIN32) +# if defined(_WIN32) # define IS_WINDOWS # pragma comment(lib, "Kernel32.lib") -#else +# else # error This compiler/platform combo is not supported yet -#endif +# endif #elif defined(__GNUC__) || defined(__GNUG__) -#define IS_GCC +# define IS_GCC -#if defined(__gnu_linux__) +# if defined(__gnu_linux__) # define IS_LINUX -#else +# else # error This compiler/platform combo is not supported yet -#endif +# endif #else #error This compiler is not supported yet #endif -static char cmd[1024]; + +#if defined(IS_WINDOWS) +# define ONLY_WINDOWS(x) x +# define ONLY_LINUX(x) (void)0 +#elif defined(IS_LINUX) +# define ONLY_WINDOWS(x) (void)0 +# define ONLY_LINUX(x) x +#else +# define ONLY_WIN(x) (void)0 +# define ONLY_LINUX(x) (void)0 +#endif + + +static char cmd[4096]; static int32_t error_state = 0; #define systemf(...) do{ \ @@ -56,6 +76,12 @@ static uint64_t get_time(); static int32_t get_current_directory(char *buffer, int32_t max); static void execute(char *dir, char *str); +static void make_folder_if_missing(char *folder); +static void clear_folder(char *folder); +static void copy_file(char *path, char *file, char *folder); +static void copy_all(char *source, char *folder); +static void zip(char *folder, char *dest); + #if defined(IS_WINDOWS) typedef uint32_t DWORD; @@ -179,6 +205,36 @@ execute(char *dir, char *str){ } } +static void +make_folder_if_missing(char *folder){ + systemf("mkdir -p %s", folder); +} + +static void +clear_folder(char *folder){ + systemf("rm -rf %s*", folder); +} + +static void +copy_file(char *path, char *file, char *folder){ + if (path){ + systemf("cp %s/%s %s/%s", path, file, folder, file); + } + else{ + systemf("cp %s %s/%s", file, folder, file); + } +} + +static void +copy_all(char *source, char *folder){ + systemf("cp -rf %s %s", source, folder); +} + +static void +zip(char *folder, char *file){ + systemf("zip -r %s %s", file, folder); +} + #else #error This OS is not supported yet #endif @@ -190,6 +246,37 @@ execute(char *dir, char *str){ // 4coder specific // +#if defined(IS_WINDOWS) +#define EXE ".exe" +#elif defined(IS_LINUX) +#define EXE "" +#else +#error No EXE format specified for this OS +#endif + +#if defined(IS_WINDOWS) +#define PDB ".pdb" +#elif defined(IS_LINUX) +#define PDB "" +#else +#error No EXE format specified for this OS +#endif + +#if defined(IS_WINDOWS) +#define DLL ".dll" +#elif defined(IS_LINUX) +#define DLL ".so" +#else +#error No EXE format specified for this OS +#endif + +#if defined(IS_WINDOWS) +#define BAT ".bat" +#elif defined(IS_LINUX) +#define BAT ".sh" +#else +#error No EXE format specified for this OS +#endif static void swap_ptr(char **A, char **B){ @@ -385,9 +472,14 @@ build_gcc(uint32_t flags, build_ap(line, "-g -O0"); } + // TODO(allen): Enabling these optimizations seems to break 4coder. + // Some sort of bug in the linux layer or something? Having trouble + // getting information out of 4coder about it. +#if 0 if (flags & OPTIMIZATION){ build_ap(line, "-O3"); } +#endif if (flags & SHARED_CODE){ build_ap(line, "-shared"); @@ -468,8 +560,7 @@ buildsuper(char *code_path, char *out_path, char *filename){ #endif static void -standard_build(char *cdir, uint32_t flags){ -#if 1 +fsm_generator(char *cdir){ { BEGIN_TIME_SECTION(); build(OPTS | DEBUG_INFO, cdir, "fsm_table_generator.cpp", @@ -482,9 +573,10 @@ standard_build(char *cdir, uint32_t flags){ execute(cdir, META_DIR"/fsmgen"); END_TIME_SECTION("run fsm generator"); } -#endif - -#if 1 +} + +static void +metagen(char *cdir){ { BEGIN_TIME_SECTION(); build(OPTS | DEBUG_INFO, cdir, "4ed_metagen.cpp", @@ -497,9 +589,10 @@ standard_build(char *cdir, uint32_t flags){ execute(cdir, META_DIR"/metagen"); END_TIME_SECTION("run metagen"); } -#endif - -#if 1 +} + +static void +do_buildsuper(char *cdir){ { BEGIN_TIME_SECTION(); //buildsuper(cdir, BUILD_DIR, "../code/4coder_default_bindings.cpp"); @@ -512,13 +605,14 @@ standard_build(char *cdir, uint32_t flags){ //buildsuper(cdir, BUILD_DIR, "../4vim/4coder_chronal.cpp"); END_TIME_SECTION("build custom"); } -#endif - -#if 1 +} + +static void +build_main(char *cdir, uint32_t flags){ { BEGIN_TIME_SECTION(); build(OPTS | INCLUDES | SHARED_CODE | flags, cdir, "4ed_app_target.cpp", - BUILD_DIR, "4ed_app", "/EXPORT:app_get_functions"); + BUILD_DIR, "4ed_app"DLL, "/EXPORT:app_get_functions"); END_TIME_SECTION("build 4ed_app"); } @@ -528,10 +622,109 @@ standard_build(char *cdir, uint32_t flags){ BUILD_DIR, "4ed", 0); END_TIME_SECTION("build 4ed"); } -#endif } +static void +standard_build(char *cdir, uint32_t flags){ + fsm_generator(cdir); + + metagen(cdir); + + do_buildsuper(cdir); + + build_main(cdir, flags); +} +#define PACK_DIR "../distributions" +#define PACK_DATA_DIR "../data/dist_files" +#define PACK_ALPHA_DIR "../current_dist/4coder" +#define PACK_SUPER_DIR "../current_dist_super/4coder" +#define PACK_POWER_DIR "../current_dist_power/power" + +static void +get_zip_name(String *zip_file, char *tier){ + zip_file->size = 0; + append_sc(zip_file, PACK_DIR"/"); + append_sc(zip_file, tier); + append_sc(zip_file, "/4coder-"); + +#if defined(IS_WINDOWS) + append_sc(zip_file, "win-"); +#elif defined(IS_LINUX) && defined(IS_64BIT) + append_sc(zip_file, "linux-64-"); +#else +#error No OS string for zips on this OS +#endif + + append_sc (zip_file, tier); + append_sc (zip_file, "-"); + append_int_to_str (zip_file, MAJOR); + append_sc (zip_file, "-"); + append_int_to_str (zip_file, MINOR); + append_sc (zip_file, "-"); + append_int_to_str (zip_file, PATCH); + append_sc (zip_file, ".zip"); + terminate_with_null(zip_file); +} + +static void +package(char *cdir){ + char zip_file_[1024]; + String zip_file = make_fixed_width_string(zip_file_); + + // NOTE(allen): meta + fsm_generator(cdir); + metagen(cdir); + + // NOTE(allen): alpha + build_main(cdir, OPTIMIZATION | KEEP_ASSERT | DEBUG_INFO); + + clear_folder(PACK_ALPHA_DIR); + make_folder_if_missing(PACK_ALPHA_DIR"/3rdparty"); + make_folder_if_missing(PACK_DIR"/alpha"); + copy_file(BUILD_DIR, "4ed"EXE, PACK_ALPHA_DIR); + ONLY_WINDOWS(copy_file(BUILD_DIR, "4ed"PDB, PACK_ALPHA_DIR)); + copy_file(BUILD_DIR, "4ed_app"DLL, PACK_ALPHA_DIR); + ONLY_WINDOWS(copy_file(BUILD_DIR, "4ed_app"PDB, PACK_ALPHA_DIR)); + copy_all (PACK_DATA_DIR"/*", PACK_ALPHA_DIR); + copy_file(0, "README.txt", PACK_ALPHA_DIR); + copy_file(0, "TODO.txt", PACK_ALPHA_DIR); + + get_zip_name(&zip_file, "alpha"); + zip(PACK_ALPHA_DIR, zip_file.str); + + // NOTE(allen): super + build_main(cdir, OPTIMIZATION | KEEP_ASSERT | DEBUG_INFO | SUPER); + + clear_folder(PACK_SUPER_DIR); + make_folder_if_missing(PACK_SUPER_DIR"/3rdparty"); + make_folder_if_missing(PACK_DIR"/super"); + copy_file(BUILD_DIR, "4ed"EXE, PACK_SUPER_DIR); + ONLY_WINDOWS(copy_file(BUILD_DIR, "4ed"PDB, PACK_SUPER_DIR)); + copy_file(BUILD_DIR, "4ed_app"DLL, PACK_SUPER_DIR); + ONLY_WINDOWS(copy_file(BUILD_DIR, "4ed_app"PDB, PACK_SUPER_DIR)); + copy_all (PACK_DATA_DIR"/*", PACK_SUPER_DIR); + copy_file(0, "README.txt", PACK_SUPER_DIR); + copy_file(0, "TODO.txt", PACK_SUPER_DIR); + + copy_all ("4coder_*.h", PACK_SUPER_DIR); + copy_all ("4coder_*.cpp", PACK_SUPER_DIR); + copy_file(0, "buildsuper"BAT, PACK_SUPER_DIR); + copy_file(0, "4coder_API.html", PACK_SUPER_DIR"/.."); + + get_zip_name(&zip_file, "super"); + zip(PACK_SUPER_DIR, zip_file.str); + + // NOTE(allen): power + clear_folder(PACK_POWER_DIR); + make_folder_if_missing(PACK_POWER_DIR); + make_folder_if_missing(PACK_DIR"/power"); + copy_all("power/*", PACK_POWER_DIR); + + get_zip_name(&zip_file, "power"); + zip(PACK_POWER_DIR, zip_file.str); + +} #if defined(DEV_BUILD) @@ -550,10 +743,22 @@ int main(int argc, char **argv){ return(error_state); } - #elif defined(PACKAGE) - +int main(int argc, char **argv){ + init_time_system(); + + char cdir[256]; + + BEGIN_TIME_SECTION(); + int32_t n = get_current_directory(cdir, sizeof(cdir)); + assert(n < sizeof(cdir)); + END_TIME_SECTION("current directory"); + + package(cdir); + + return(error_state); +} #else #error No build type specified diff --git a/linux_4ed.cpp b/linux_4ed.cpp index 6cf30b31..6a1672d3 100644 --- a/linux_4ed.cpp +++ b/linux_4ed.cpp @@ -10,6 +10,7 @@ // TOP +# include # include "4ed_defines.h" #if FRED_SUPER @@ -23,8 +24,6 @@ # include "4coder_style.h" # include "4coder_rect.h" -# include - # include "4coder_mem.h" // TODO(allen): This is duplicated from 4coder_custom.h @@ -2114,7 +2113,8 @@ LinuxScheduleStep(void) if(diff > (u64)frame_useconds){ u64 ev = 1; - write(linuxvars.step_event_fd, &ev, sizeof(ev)); + ssize_t size = write(linuxvars.step_event_fd, &ev, sizeof(ev)); + (void)size; } else { struct itimerspec its = {}; timerfd_gettime(linuxvars.step_timer_fd, &its); diff --git a/package.bat b/package.bat index c9753462..ca83c265 100644 --- a/package.bat +++ b/package.bat @@ -33,7 +33,6 @@ copy 4coder_*.cpp ..\current_dist_super\4coder\* copy README.txt ..\current_dist_super\4coder\* copy TODO.txt ..\current_dist_super\4coder\* copy ..\current_dist\4coder\3rdparty\* ..\current_dist_super\4coder\3rdparty\* -REM del ..\current_dist_super\4coder\*.pdb del ..\current_dist_super\4coder\*.lib del ..\current_dist_super\4coder\*.obj del ..\current_dist_super\4coder\4coder_custom.dll