2023-10-10 12:00:35 +00:00
// #include <Windows.h>
2023-10-11 13:04:01 +00:00
# include <stdlib.h>
2023-10-10 12:00:35 +00:00
# define DQN_IMPLEMENTATION
# include "External/tely/External/dqn/dqn.h"
2023-10-12 11:20:29 +00:00
# define DQN_CPP_BUILD_IMPLEMENTATION
# include "External/tely/External/dqn/dqn_cppbuild.h"
2023-10-10 12:00:35 +00:00
2023-10-12 11:20:29 +00:00
#if 0
void RebuildProgramIfRequired ( int argc , char const * * argv )
2023-10-11 13:04:01 +00:00
{
2023-10-12 11:20:29 +00:00
Dqn_ThreadScratch scratch = Dqn_Thread_GetScratch ( nullptr ) ;
2023-10-24 12:41:15 +00:00
Dqn_Str8 const exe_dir = Dqn_OS_EXEDir ( scratch . arena ) ;
Dqn_Str8 build_program_path = Dqn_OS_EXEPath ( scratch . arena ) ;
2023-10-12 11:20:29 +00:00
Dqn_FsInfo build_program_info = Dqn_Fs_GetInfo ( build_program_path ) ;
2023-10-24 12:41:15 +00:00
Dqn_FsInfo source_path = Dqn_Fs_GetInfo ( Dqn_Str8_InitCStr8 ( __FILE__ ) ) ;
2023-10-12 11:20:29 +00:00
if ( ! build_program_info . exists ) {
Dqn_WinError error = Dqn_Win_LastError ( scratch . arena ) ;
Dqn_Log_WarningF ( " Failed to get the last write time of the build program '%.*s', skipping rebuild (%d): %.*s " ,
2023-10-24 12:41:15 +00:00
DQN_STR_FMT ( build_program_path ) , error . code , DQN_STR_FMT ( error . msg ) ) ;
2023-10-12 11:20:29 +00:00
return ;
2023-10-10 12:00:35 +00:00
}
2023-10-12 11:20:29 +00:00
if ( ! source_path . exists ) {
Dqn_WinError error = Dqn_Win_LastError ( scratch . arena ) ;
Dqn_Log_WarningF (
" Failed to get the last write time of the build program's source code '%s', skipping rebuild (%d): %.*s " ,
2023-10-24 12:41:15 +00:00
__FILE__ , error . code , DQN_STR_FMT ( error . msg ) ) ;
2023-10-12 11:20:29 +00:00
return ;
2023-10-10 12:00:35 +00:00
}
2023-10-12 11:20:29 +00:00
// NOTE: The build program is newer than the source path, no rebuild required
if ( source_path . last_write_time_in_s < build_program_info . last_write_time_in_s ) {
return ;
2023-10-10 12:00:35 +00:00
}
2023-10-12 11:20:29 +00:00
Dqn_Log_InfoF ( " Build program source code has changed, rebuilding the program (timestamps changed source was %I64u, build program was %I64u) " ,
source_path . last_write_time_in_s ,
build_program_info . last_write_time_in_s ) ;
2023-10-11 13:04:01 +00:00
2023-10-24 12:41:15 +00:00
Dqn_Str8 temp_build_program_path = Dqn_FsPath_ConvertF ( scratch . arena , " %.*s.old " , DQN_STR_FMT ( build_program_path ) ) ;
2023-10-12 11:20:29 +00:00
if ( ! Dqn_Fs_Move ( build_program_path , temp_build_program_path , true ) ) {
Dqn_WinError error = Dqn_Win_LastError ( scratch . arena ) ;
2023-10-24 12:41:15 +00:00
Dqn_Log_WarningF ( " Failed to backup the build program for rebuilding, skipping rebuild (%d): %.*s " , error . code , DQN_STR_FMT ( error . msg ) ) ;
2023-10-12 11:20:29 +00:00
return ;
2023-10-11 13:04:01 +00:00
}
2023-10-12 11:20:29 +00:00
// NOTE: Rebuild the build program because a change was detected ===============
2023-10-24 12:41:15 +00:00
Dqn_Str8 rebuild_cmd = Dqn_Str8_InitF ( scratch . allocator , " cl /Z7 /W4 /nologo %s /incremental:no /link " , __FILE__ ) ;
2023-10-12 11:20:29 +00:00
Dqn_OSExecResult rebuild_result = Dqn_OS_Exec ( rebuild_cmd , exe_dir /*working_dir*/ ) ;
if ( rebuild_result . os_error_code ) {
Dqn_WinError error = Dqn_Win_LastError ( scratch . arena ) ;
2023-10-24 12:41:15 +00:00
Dqn_Log_ErrorF ( " Detected change in the build program's source code '%s' but the OS failed to rebuild the program, skipping rebuild (%d): %.*s " , __FILE__ , error . code , DQN_STR_FMT ( error . msg ) ) ;
2023-10-12 11:20:29 +00:00
return ;
2023-10-11 13:04:01 +00:00
}
2023-10-12 11:20:29 +00:00
if ( rebuild_result . exit_code ) {
Dqn_Fs_Move ( temp_build_program_path , build_program_path , true ) ;
exit ( rebuild_result . exit_code ) ;
2023-10-11 13:04:01 +00:00
}
2023-10-24 12:41:15 +00:00
Dqn_Str8Builder builder = { } ;
2023-10-12 11:20:29 +00:00
builder . allocator = scratch . allocator ;
DQN_FOR_UINDEX ( arg_index , argc )
2023-10-24 12:41:15 +00:00
Dqn_Str8Builder_AppendF ( & builder , " %s%s " , arg_index ? " " : " " , argv [ arg_index ] ) ;
2023-10-11 13:04:01 +00:00
2023-10-24 12:41:15 +00:00
Dqn_Str8 rebootstrap_cmd = Dqn_Str8Builder_Build ( & builder , scratch . allocator ) ;
2023-10-12 11:20:29 +00:00
Dqn_OSExecResult exec_result = Dqn_OS_Exec ( rebootstrap_cmd , exe_dir /*working_dir*/ ) ;
if ( exec_result . os_error_code ) {
Dqn_WinError error = Dqn_Win_LastError ( scratch . arena ) ;
2023-10-24 12:41:15 +00:00
Dqn_Log_ErrorF ( " Detected change in the build program's source code '%s' but the OS failed to rebuild the program, skipping rebuild (%d): %.*s " , __FILE__ , error . code , DQN_STR_FMT ( error . msg ) ) ;
2023-10-12 11:20:29 +00:00
Dqn_Fs_Move ( temp_build_program_path , build_program_path , true ) ;
return ;
2023-10-11 13:04:01 +00:00
}
2023-10-12 11:20:29 +00:00
exit ( exec_result . exit_code ) ;
2023-10-11 13:04:01 +00:00
}
2023-10-12 11:20:29 +00:00
# endif
2023-10-11 13:04:01 +00:00
2023-10-25 10:55:19 +00:00
# define PRINT_HELP Dqn_Print_StdLnF(Dqn_PrintStd_Out, "USAGE: feely_pona_build [--help|--dry-run|--web|--fast-dev-build]")
2023-10-12 11:20:29 +00:00
int main ( int argc , char const * * argv )
2023-10-11 13:04:01 +00:00
{
2023-10-12 11:20:29 +00:00
Dqn_Library_Init ( Dqn_LibraryOnInit_Nil ) ;
2023-10-11 13:04:01 +00:00
2023-10-25 09:17:30 +00:00
bool dry_run = false ;
bool target_web = false ;
bool dev_fast_build = false ;
2023-10-15 08:04:58 +00:00
for ( Dqn_usize arg_index = 1 ; arg_index < argc ; arg_index + + ) {
2023-10-24 12:41:15 +00:00
Dqn_Str8 arg = Dqn_Str8_InitCStr8 ( argv [ arg_index ] ) ;
if ( arg = = DQN_STR8 ( " --help " ) ) {
2023-10-12 11:20:29 +00:00
PRINT_HELP ;
return 0 ;
2023-10-24 12:41:15 +00:00
} else if ( arg = = DQN_STR8 ( " --dry-run " ) ) {
2023-10-12 11:20:29 +00:00
dry_run = true ;
2023-10-24 12:41:15 +00:00
} else if ( arg = = DQN_STR8 ( " --web " ) ) {
2023-10-15 08:04:58 +00:00
target_web = true ;
2023-10-29 03:59:53 +00:00
} else if ( arg = = DQN_STR8 ( " --fast-dev-build " ) ) {
2023-10-25 09:17:30 +00:00
dev_fast_build = true ;
2023-10-12 11:20:29 +00:00
} else {
PRINT_HELP ;
return 0 ;
}
2023-10-11 13:04:01 +00:00
}
2023-10-12 11:20:29 +00:00
#if 0
RebuildProgramIfRequired ( argc , argv ) ;
# else
Dqn_Print_StdLnF ( Dqn_PrintStd_Out , " -- Dqn_CPPBuild v0 " ) ;
# endif
2023-10-11 13:04:01 +00:00
2023-10-24 12:41:15 +00:00
uint64_t build_timings [ 2 ] = { } ;
build_timings [ 0 ] = Dqn_OS_PerfCounterNow ( ) ;
2023-10-11 13:04:01 +00:00
Dqn_ThreadScratch scratch = Dqn_Thread_GetScratch ( nullptr ) ;
2023-10-24 12:41:15 +00:00
Dqn_Str8 const exe_dir = Dqn_OS_EXEDir ( scratch . arena ) ;
Dqn_Str8 const code_dir = exe_dir ;
Dqn_Str8 const build_dir = Dqn_FsPath_ConvertF ( scratch . arena , " %.*s/Build " , DQN_STR_FMT ( exe_dir ) ) ;
Dqn_Str8 const tely_dir = Dqn_FsPath_ConvertF ( scratch . arena , " %.*s/External/tely " , DQN_STR_FMT ( exe_dir ) ) ;
Dqn_Slice < Dqn_Str8 > common_compile_flags = Dqn_Slice_InitCArrayCopy ( scratch . arena , {
DQN_STR8 ( " cl " ) ,
DQN_STR8 ( " /W4 " ) ,
DQN_STR8 ( " /Z7 " ) ,
DQN_STR8 ( " /MT " ) ,
DQN_STR8 ( " /EHsc " ) ,
DQN_STR8 ( " /nologo " ) ,
2023-10-11 13:04:01 +00:00
} ) ;
2023-10-24 12:41:15 +00:00
Dqn_Slice < Dqn_Str8 > common_link_flags = Dqn_Slice_InitCArrayCopy ( scratch . arena , {
DQN_STR8 ( " /link " ) ,
DQN_STR8 ( " /incremental:no " ) ,
2023-10-11 13:04:01 +00:00
} ) ;
// NOTE: Assets ================================================================================
uint64_t robocopy_timings [ 2 ] = { } ;
{
robocopy_timings [ 0 ] = Dqn_OS_PerfCounterNow ( ) ;
DQN_DEFER { robocopy_timings [ 1 ] = Dqn_OS_PerfCounterNow ( ) ; } ;
2023-10-24 12:41:15 +00:00
Dqn_Str8 robocopy_cmd [ ] = {
Dqn_Str8_InitF ( scratch . allocator , " robocopy /NJH /NJS /NDL /NP %.*s \\ Data \\ Textures %.*s \\ Data \\ Textures atlas.* " , DQN_STR_FMT ( exe_dir ) , DQN_STR_FMT ( build_dir ) ) ,
Dqn_Str8_InitF ( scratch . allocator , " robocopy /MIR /NJH /NJS /NDL /NP %.*s \\ Data \\ Fonts %.*s \\ Data \\ Fonts " , DQN_STR_FMT ( exe_dir ) , DQN_STR_FMT ( build_dir ) ) ,
Dqn_Str8_InitF ( scratch . allocator , " robocopy /MIR /NJH /NJS /NDL /NP %.*s \\ Data \\ Audio %.*s \\ Data \\ Audio " , DQN_STR_FMT ( exe_dir ) , DQN_STR_FMT ( build_dir ) ) ,
2023-10-15 12:08:47 +00:00
} ;
2023-10-24 12:41:15 +00:00
for ( Dqn_Str8 cmd : robocopy_cmd ) {
2023-10-15 12:08:47 +00:00
if ( dry_run )
2023-10-24 12:41:15 +00:00
Dqn_Print_StdLnF ( Dqn_PrintStd_Out , " %.*s \n " , DQN_STR_FMT ( cmd ) ) ;
2023-10-15 12:08:47 +00:00
else
Dqn_OS_Exec ( cmd , /*working_dir*/ { } ) ;
2023-10-12 11:20:29 +00:00
}
2023-10-11 13:04:01 +00:00
}
// NOTE: Raylib ================================================================================
2023-10-24 12:41:15 +00:00
Dqn_Str8 const raylib_dir = Dqn_FsPath_ConvertF ( scratch . arena , " %.*s/External/tely/external/raylib " , DQN_STR_FMT ( exe_dir ) ) ;
Dqn_Slice < Dqn_Str8 > const raylib_base_files = Dqn_Slice_InitCArrayCopy ( scratch . arena , {
Dqn_FsPath_ConvertF ( scratch . arena , " %.*s/rcore.c " , DQN_STR_FMT ( raylib_dir ) ) ,
Dqn_FsPath_ConvertF ( scratch . arena , " %.*s/utils.c " , DQN_STR_FMT ( raylib_dir ) ) ,
Dqn_FsPath_ConvertF ( scratch . arena , " %.*s/raudio.c " , DQN_STR_FMT ( raylib_dir ) ) ,
Dqn_FsPath_ConvertF ( scratch . arena , " %.*s/rmodels.c " , DQN_STR_FMT ( raylib_dir ) ) ,
Dqn_FsPath_ConvertF ( scratch . arena , " %.*s/rtext.c " , DQN_STR_FMT ( raylib_dir ) ) ,
Dqn_FsPath_ConvertF ( scratch . arena , " %.*s/rtextures.c " , DQN_STR_FMT ( raylib_dir ) ) ,
Dqn_FsPath_ConvertF ( scratch . arena , " %.*s/rshapes.c " , DQN_STR_FMT ( raylib_dir ) ) ,
2023-10-14 06:21:23 +00:00
} ) ;
2023-10-25 11:39:55 +00:00
Dqn_List < Dqn_Str8 > raylib_pc_output_files = Dqn_List_Init < Dqn_Str8 > ( scratch . arena , 16 ) ;
uint64_t raylib_pc_timings [ 2 ] = { } ;
2023-10-11 13:04:01 +00:00
{
2023-10-15 08:04:58 +00:00
raylib_pc_timings [ 0 ] = Dqn_OS_PerfCounterNow ( ) ;
DQN_DEFER { raylib_pc_timings [ 1 ] = Dqn_OS_PerfCounterNow ( ) ; } ;
2023-10-11 13:04:01 +00:00
2023-10-15 08:04:58 +00:00
// NOTE: Setup raylib build context ========================================================
Dqn_CPPBuildContext build_context = { } ;
{
build_context . include_dirs = Dqn_Slice_InitCArrayCopy ( scratch . arena , {
2023-10-24 12:41:15 +00:00
Dqn_FsPath_ConvertF ( scratch . arena , " %.*s " , DQN_STR_FMT ( raylib_dir ) ) ,
Dqn_FsPath_ConvertF ( scratch . arena , " %.*s/external/glfw/include " , DQN_STR_FMT ( raylib_dir ) ) ,
Dqn_FsPath_ConvertF ( scratch . arena , " %.*s/glfw/deps/mingw " , DQN_STR_FMT ( raylib_dir ) ) ,
2023-10-15 08:04:58 +00:00
} ) ;
2023-10-11 13:04:01 +00:00
2023-10-15 08:04:58 +00:00
build_context . compile_flags = Dqn_Slice_InitCArrayCopy ( scratch . arena , {
2023-10-24 12:41:15 +00:00
DQN_STR8 ( " cl " ) ,
DQN_STR8 ( " /w " ) ,
DQN_STR8 ( " /c " ) ,
DQN_STR8 ( " /D _DEFAULT_SOURCE " ) ,
DQN_STR8 ( " /D PLATFORM_DESKTOP " ) ,
DQN_STR8 ( " /Z7 " ) ,
DQN_STR8 ( " /MT " ) ,
DQN_STR8 ( " /EHsc " ) ,
DQN_STR8 ( " /nologo " ) ,
2023-10-15 08:04:58 +00:00
} ) ;
build_context . build_dir = build_dir ;
build_context . compiler = Dqn_CPPBuildCompiler_MSVC ;
}
2023-10-11 13:04:01 +00:00
2023-10-15 08:04:58 +00:00
// NOTE: Compile each file separately with a custom output name ============================
2023-10-24 12:41:15 +00:00
for ( Dqn_Str8 base_file : raylib_base_files ) {
Dqn_Str8 file_stem = Dqn_Str8_FileNameNoExtension ( base_file ) ;
2023-10-15 08:04:58 +00:00
Dqn_CPPBuildCompileFile build_file = { } ;
build_file . input_file_path = base_file ;
2023-10-24 12:41:15 +00:00
build_file . output_file_path = Dqn_Str8_InitF ( scratch . allocator , " raylib_%.*s.obj " , DQN_STR_FMT ( file_stem ) ) ;
2023-10-15 08:04:58 +00:00
build_context . compile_files = Dqn_Slice_InitCArrayCopy ( scratch . arena , { build_file } ) ;
Dqn_List_Add ( & raylib_pc_output_files , build_file . output_file_path ) ;
if ( dry_run ) {
2023-10-24 12:41:15 +00:00
Dqn_Str8 cmd = Dqn_CPPBuild_ToCommandLine ( build_context , Dqn_CPPBuildMode_AlwaysRebuild , scratch . allocator ) ;
Dqn_Print_StdLnF ( Dqn_PrintStd_Out , " %.*s \n " , DQN_STR_FMT ( cmd ) ) ;
2023-10-15 08:04:58 +00:00
} else {
Dqn_CPPBuild_ExecOrAbort ( build_context , Dqn_CPPBuildMode_CacheBuild ) ;
}
}
// NOTE: Build rlgfw =======================================================================
{
Dqn_CPPBuildCompileFile build_file = { } ;
2023-10-24 12:41:15 +00:00
build_file . input_file_path = Dqn_FsPath_ConvertF ( scratch . arena , " %.*s/rglfw.c " , DQN_STR_FMT ( raylib_dir ) ) ;
build_file . output_file_path = Dqn_Str8_InitF ( scratch . allocator , " raylib_rglfw.obj " ) ;
2023-10-15 08:04:58 +00:00
build_context . compile_files = Dqn_Slice_InitCArrayCopy ( scratch . arena , { build_file } ) ;
Dqn_List_Add ( & raylib_pc_output_files , build_file . output_file_path ) ;
if ( dry_run ) {
2023-10-24 12:41:15 +00:00
Dqn_Str8 cmd = Dqn_CPPBuild_ToCommandLine ( build_context , Dqn_CPPBuildMode_AlwaysRebuild , scratch . allocator ) ;
Dqn_Print_StdLnF ( Dqn_PrintStd_Out , " %.*s \n " , DQN_STR_FMT ( cmd ) ) ;
2023-10-15 08:04:58 +00:00
} else {
Dqn_CPPBuild_ExecOrAbort ( build_context , Dqn_CPPBuildMode_CacheBuild ) ;
}
2023-10-12 11:20:29 +00:00
}
2023-10-11 13:04:01 +00:00
}
2023-10-30 13:02:34 +00:00
// NOTE: sokol_audio ================================================================================
Dqn_Str8 sokol_audio_source_code_file = Dqn_FsPath_ConvertF ( scratch . arena , " %.*s/External/sokol/sokol_audio.c " , DQN_STR_FMT ( tely_dir ) ) ;
uint64_t sokol_audio_pc_timings [ 2 ] = { } ;
Dqn_List < Dqn_Str8 > sokol_audio_pc_output_files = Dqn_List_Init < Dqn_Str8 > ( scratch . arena , 16 ) ;
{
sokol_audio_pc_timings [ 0 ] = Dqn_OS_PerfCounterNow ( ) ;
DQN_DEFER { sokol_audio_pc_timings [ 1 ] = Dqn_OS_PerfCounterNow ( ) ; } ;
Dqn_CPPBuildContext build_context = { } ;
build_context . compiler = Dqn_CPPBuildCompiler_MSVC ;
build_context . compile_files = Dqn_Slice_InitCArrayCopy ( scratch . arena , {
Dqn_CPPBuildCompileFile {
{ } , // Args
sokol_audio_source_code_file ,
} ,
} ) ;
Dqn_List_Add ( & sokol_audio_pc_output_files , DQN_STR8 ( " sokol_audio.obj " ) ) ;
Dqn_List < Dqn_Str8 > compile_flags = Dqn_List_InitSliceCopy ( scratch . arena , 16 , common_compile_flags ) ;
Dqn_List_Add ( & compile_flags , DQN_STR8 ( " /c " ) ) ;
build_context . compile_flags = Dqn_List_ToSliceCopy ( & compile_flags , scratch . arena ) ;
build_context . build_dir = build_dir ;
if ( dry_run ) {
Dqn_Str8 cmd = Dqn_CPPBuild_ToCommandLine ( build_context , Dqn_CPPBuildMode_AlwaysRebuild , scratch . allocator ) ;
Dqn_Print_StdLnF ( Dqn_PrintStd_Out , " %.*s \n " , DQN_STR_FMT ( cmd ) ) ;
} else {
Dqn_CPPBuild_ExecOrAbort ( build_context , Dqn_CPPBuildMode_CacheBuild ) ;
}
}
2023-10-16 13:35:41 +00:00
// NOTE: QOI Converter =========================================================================
uint64_t qoi_converter_timings [ 2 ] = { } ;
{
qoi_converter_timings [ 0 ] = Dqn_OS_PerfCounterNow ( ) ;
DQN_DEFER { qoi_converter_timings [ 1 ] = Dqn_OS_PerfCounterNow ( ) ; } ;
Dqn_CPPBuildContext build_context = { } ;
build_context . compiler = Dqn_CPPBuildCompiler_MSVC ;
build_context . compile_files = Dqn_Slice_InitCArrayCopy ( scratch . arena , {
2023-10-24 12:41:15 +00:00
Dqn_CPPBuildCompileFile { { } , Dqn_FsPath_ConvertF ( scratch . arena , " %.*s/External/qoiconv.c " , DQN_STR_FMT ( code_dir ) ) } ,
2023-10-16 13:35:41 +00:00
} ) ;
2023-10-24 12:41:15 +00:00
build_context . compile_flags = Dqn_Slice_InitCArrayCopy ( scratch . arena , { DQN_STR8 ( " cl " ) , DQN_STR8 ( " -O2 " ) , DQN_STR8 ( " -MT " ) , DQN_STR8 ( " /nologo " ) } ) ;
build_context . link_flags = Dqn_Slice_InitCArrayCopy ( scratch . arena , { DQN_STR8 ( " /link " ) , DQN_STR8 ( " /incremental:no " ) } ) ;
build_context . include_dirs = Dqn_Slice_InitCArrayCopy ( scratch . arena , { Dqn_FsPath_ConvertF ( scratch . arena , " %.*s/External/stb " , DQN_STR_FMT ( tely_dir ) ) } ) ;
2023-10-16 13:35:41 +00:00
build_context . build_dir = build_dir ;
if ( dry_run ) {
2023-10-24 12:41:15 +00:00
Dqn_Str8 cmd = Dqn_CPPBuild_ToCommandLine ( build_context , Dqn_CPPBuildMode_AlwaysRebuild , scratch . allocator ) ;
Dqn_Print_StdLnF ( Dqn_PrintStd_Out , " %.*s \n " , DQN_STR_FMT ( cmd ) ) ;
2023-10-16 13:35:41 +00:00
} else {
Dqn_CPPBuild_ExecOrAbort ( build_context , Dqn_CPPBuildMode_CacheBuild ) ;
}
}
2023-10-11 13:04:01 +00:00
// NOTE: Feely Pona Sprite Packer ==============================================================
uint64_t feely_pona_sprite_packer_timings [ 2 ] = { } ;
{
2023-10-15 08:04:58 +00:00
feely_pona_sprite_packer_timings [ 0 ] = Dqn_OS_PerfCounterNow ( ) ;
2023-10-11 13:04:01 +00:00
DQN_DEFER { feely_pona_sprite_packer_timings [ 1 ] = Dqn_OS_PerfCounterNow ( ) ; } ;
Dqn_CPPBuildContext build_context = { } ;
2023-10-15 08:04:58 +00:00
build_context . compiler = Dqn_CPPBuildCompiler_MSVC ;
2023-10-11 13:04:01 +00:00
build_context . compile_files = Dqn_Slice_InitCArrayCopy ( scratch . arena , {
2023-10-24 12:41:15 +00:00
Dqn_CPPBuildCompileFile { { } , Dqn_FsPath_ConvertF ( scratch . arena , " %.*s/feely_pona_sprite_packer.cpp " , DQN_STR_FMT ( code_dir ) ) } ,
2023-10-11 13:04:01 +00:00
} ) ;
build_context . compile_flags = common_compile_flags ;
build_context . link_flags = common_link_flags ;
build_context . build_dir = build_dir ;
2023-10-16 13:35:41 +00:00
if ( dry_run ) {
2023-10-24 12:41:15 +00:00
Dqn_Str8 cmd = Dqn_CPPBuild_ToCommandLine ( build_context , Dqn_CPPBuildMode_AlwaysRebuild , scratch . allocator ) ;
Dqn_Print_StdLnF ( Dqn_PrintStd_Out , " %.*s \n " , DQN_STR_FMT ( cmd ) ) ;
2023-10-16 13:35:41 +00:00
} else {
Dqn_CPPBuild_ExecOrAbort ( build_context , Dqn_CPPBuildMode_CacheBuild ) ;
}
2023-10-11 13:04:01 +00:00
}
2023-10-25 09:17:30 +00:00
// NOTE: Feely Pona Link Flags =================================================================
Dqn_Slice < Dqn_Str8 > feely_pona_platform_link_flags = { } ;
2023-10-11 13:04:01 +00:00
{
// NOTE: Link to raylib object files and windows libs ======================================
2023-10-24 12:41:15 +00:00
Dqn_List < Dqn_Str8 > link_flags = Dqn_List_InitSliceCopy ( scratch . arena , 128 , common_link_flags ) ;
2023-10-11 13:04:01 +00:00
{
2023-10-24 12:41:15 +00:00
for ( Dqn_ListIterator < Dqn_Str8 > it = { } ; Dqn_List_Iterate ( & raylib_pc_output_files , & it , 0 ) ; )
2023-10-15 08:04:58 +00:00
Dqn_List_Add ( & link_flags , * it . data ) ;
2023-10-30 13:02:34 +00:00
for ( Dqn_ListIterator < Dqn_Str8 > it = { } ; Dqn_List_Iterate ( & sokol_audio_pc_output_files , & it , 0 ) ; )
Dqn_List_Add ( & link_flags , * it . data ) ;
2023-10-24 12:41:15 +00:00
Dqn_List_Add ( & link_flags , DQN_STR8 ( " gdi32.lib " ) ) ;
Dqn_List_Add ( & link_flags , DQN_STR8 ( " opengl32.lib " ) ) ;
Dqn_List_Add ( & link_flags , DQN_STR8 ( " winmm.lib " ) ) ;
Dqn_List_Add ( & link_flags , DQN_STR8 ( " user32.lib " ) ) ;
Dqn_List_Add ( & link_flags , DQN_STR8 ( " shell32.lib " ) ) ;
2023-10-11 13:04:01 +00:00
}
2023-10-25 09:17:30 +00:00
feely_pona_platform_link_flags = Dqn_List_ToSliceCopy ( & link_flags , scratch . arena ) ;
}
// NOTE: Feely Pona No DLL =====================================================================
uint64_t feely_pona_no_dll_timings [ 2 ] = { } ;
if ( ! dev_fast_build ) {
feely_pona_no_dll_timings [ 0 ] = Dqn_OS_PerfCounterNow ( ) ;
DQN_DEFER { feely_pona_no_dll_timings [ 1 ] = Dqn_OS_PerfCounterNow ( ) ; } ;
Dqn_CPPBuildCompileFile build_file = { } ;
2023-10-29 03:59:53 +00:00
build_file . input_file_path = Dqn_FsPath_ConvertF ( scratch . arena , " %.*s/feely_pona_unity.h " , DQN_STR_FMT ( code_dir ) ) ;
build_file . output_file_path = Dqn_FsPath_ConvertF ( scratch . arena , " terry_cherry " ) ;
2023-10-25 09:17:30 +00:00
build_file . flags = Dqn_Slice_InitCArrayCopy ( scratch . arena , { DQN_STR8 ( " /Tp " ) } ) ;
2023-10-29 03:59:53 +00:00
Dqn_List < Dqn_Str8 > compile_flags = Dqn_List_InitSliceCopy ( scratch . arena , 16 , common_compile_flags ) ;
Dqn_List_AddCArray ( & compile_flags , {
DQN_STR8 ( " /D TELY_WITH_PLATFORM " ) ,
DQN_STR8 ( " /D FEELY_PONA_IMPLEMENTATION " ) ,
} ) ;
2023-10-25 09:17:30 +00:00
Dqn_CPPBuildContext feely_pona_no_dll_build_context = { } ;
feely_pona_no_dll_build_context . compiler = Dqn_CPPBuildCompiler_MSVC ;
feely_pona_no_dll_build_context . compile_files = Dqn_Slice_InitCArrayCopy ( scratch . arena , { build_file } ) ;
feely_pona_no_dll_build_context . include_dirs = Dqn_Slice_InitCArrayCopy ( scratch . arena , { raylib_dir } ) ;
2023-10-29 03:59:53 +00:00
feely_pona_no_dll_build_context . compile_flags = Dqn_List_ToSliceCopy ( & compile_flags , scratch . arena ) ;
2023-10-25 09:17:30 +00:00
feely_pona_no_dll_build_context . build_dir = build_dir ;
feely_pona_no_dll_build_context . link_flags = feely_pona_platform_link_flags ;
2023-10-11 13:04:01 +00:00
2023-10-12 11:20:29 +00:00
if ( dry_run ) {
2023-10-24 12:41:15 +00:00
Dqn_Str8 cmd = Dqn_CPPBuild_ToCommandLine ( feely_pona_no_dll_build_context , Dqn_CPPBuildMode_AlwaysRebuild , scratch . allocator ) ;
Dqn_Print_StdLnF ( Dqn_PrintStd_Out , " %.*s \n " , DQN_STR_FMT ( cmd ) ) ;
2023-10-12 11:20:29 +00:00
} else {
Dqn_CPPBuild_ExecOrAbort ( feely_pona_no_dll_build_context , Dqn_CPPBuildMode_AlwaysRebuild ) ;
}
2023-10-11 13:04:01 +00:00
}
// NOTE: Feely Pona DLL ========================================================================
uint64_t feely_pona_dll_timings [ 2 ] = { } ;
{
feely_pona_dll_timings [ 0 ] = Dqn_OS_PerfCounterNow ( ) ;
DQN_DEFER { feely_pona_dll_timings [ 1 ] = Dqn_OS_PerfCounterNow ( ) ; } ;
2023-10-15 08:04:58 +00:00
Dqn_CPPBuildCompileFile build_file = { } ;
2023-10-24 12:41:15 +00:00
build_file . input_file_path = Dqn_FsPath_ConvertF ( scratch . arena , " %.*s/feely_pona_unity.h " , DQN_STR_FMT ( code_dir ) ) ;
2023-10-29 03:59:53 +00:00
build_file . output_file_path = Dqn_FsPath_ConvertF ( scratch . arena , " terry_cherry_dev_dll " ) ;
2023-10-24 12:41:15 +00:00
build_file . flags = Dqn_Slice_InitCArrayCopy ( scratch . arena , { DQN_STR8 ( " /Tp " ) } ) ;
2023-10-11 13:04:01 +00:00
2023-10-29 03:59:53 +00:00
Dqn_List < Dqn_Str8 > compile_flags = Dqn_List_InitSliceCopy ( scratch . arena , 16 , common_compile_flags ) ;
Dqn_List_AddCArray ( & compile_flags , {
DQN_STR8 ( " /LD " ) ,
DQN_STR8 ( " /D FEELY_PONA_IMPLEMENTATION " ) ,
} ) ;
2023-10-11 13:04:01 +00:00
2023-10-25 09:23:42 +00:00
if ( ! dev_fast_build )
Dqn_List_Add ( & compile_flags , DQN_STR8 ( " /analyze " ) ) ;
2023-10-15 08:04:58 +00:00
Dqn_CPPBuildContext build_context = { } ;
build_context . compiler = Dqn_CPPBuildCompiler_MSVC ;
build_context . compile_files = Dqn_Slice_InitCArrayCopy ( scratch . arena , { build_file } ) ;
build_context . compile_flags = Dqn_List_ToSliceCopy ( & compile_flags , scratch . arena ) ;
2023-10-25 09:17:30 +00:00
build_context . link_flags = { } ;
2023-10-15 08:04:58 +00:00
build_context . build_dir = build_dir ;
2023-10-11 13:04:01 +00:00
2023-10-12 11:20:29 +00:00
if ( dry_run ) {
2023-10-24 12:41:15 +00:00
Dqn_Str8 cmd = Dqn_CPPBuild_ToCommandLine ( build_context , Dqn_CPPBuildMode_AlwaysRebuild , scratch . allocator ) ;
Dqn_Print_StdLnF ( Dqn_PrintStd_Out , " %.*s \n " , DQN_STR_FMT ( cmd ) ) ;
2023-10-12 11:20:29 +00:00
} else {
Dqn_CPPBuild_ExecOrAbort ( build_context , Dqn_CPPBuildMode_AlwaysRebuild ) ;
}
2023-10-11 13:04:01 +00:00
}
// NOTE: Feely Pona platform ===================================================================
uint64_t feely_pona_platform_timings [ 2 ] = { } ;
{
2023-10-15 08:04:58 +00:00
feely_pona_platform_timings [ 0 ] = Dqn_OS_PerfCounterNow ( ) ;
2023-10-11 13:04:01 +00:00
DQN_DEFER { feely_pona_platform_timings [ 1 ] = Dqn_OS_PerfCounterNow ( ) ; } ;
2023-10-15 08:04:58 +00:00
Dqn_CPPBuildCompileFile build_file = { } ;
2023-10-29 03:59:53 +00:00
build_file . input_file_path = Dqn_FsPath_ConvertF ( scratch . arena , " %.*s/feely_pona_unity.h " , DQN_STR_FMT ( code_dir ) ) ;
build_file . output_file_path = Dqn_FsPath_ConvertF ( scratch . arena , " terry_cherry_dev " , DQN_STR_FMT ( code_dir ) ) ;
2023-10-24 12:41:15 +00:00
build_file . flags = Dqn_Slice_InitCArrayCopy ( scratch . arena , { DQN_STR8 ( " /Tp " ) } ) ;
2023-10-11 13:04:01 +00:00
2023-10-24 12:41:15 +00:00
Dqn_List < Dqn_Str8 > compile_flags = Dqn_List_InitSliceCopy ( scratch . arena , 128 , common_compile_flags ) ;
2023-10-29 03:59:53 +00:00
Dqn_List_AddCArray ( & compile_flags , {
DQN_STR8 ( " /D TELY_WITH_PLATFORM " ) ,
DQN_STR8 ( " /D TELY_WITH_PLATFORM_DLL " ) ,
} ) ;
2023-10-15 08:04:58 +00:00
Dqn_CPPBuildContext build_context = { } ;
build_context . compiler = Dqn_CPPBuildCompiler_MSVC ;
build_context . compile_files = Dqn_Slice_InitCArrayCopy ( scratch . arena , { build_file } ) ;
build_context . compile_flags = Dqn_List_ToSliceCopy ( & compile_flags , scratch . arena ) ;
2023-10-25 09:17:30 +00:00
build_context . link_flags = feely_pona_platform_link_flags ;
2023-10-15 08:04:58 +00:00
build_context . build_dir = build_dir ;
build_context . include_dirs = Dqn_Slice_InitCArrayCopy ( scratch . arena , { raylib_dir } ) ;
2023-10-11 13:04:01 +00:00
2023-10-12 11:20:29 +00:00
if ( dry_run ) {
2023-10-24 12:41:15 +00:00
Dqn_Str8 cmd = Dqn_CPPBuild_ToCommandLine ( build_context , Dqn_CPPBuildMode_AlwaysRebuild , scratch . allocator ) ;
Dqn_Print_StdLnF ( Dqn_PrintStd_Out , " %.*s \n " , DQN_STR_FMT ( cmd ) ) ;
2023-10-12 11:20:29 +00:00
} else {
2023-10-29 06:30:08 +00:00
Dqn_Str8 exe_path = Dqn_FsPath_ConvertF ( scratch . arena , " %.*s/terry_cherry_dev.exe " , DQN_STR_FMT ( build_dir ) ) ;
2023-10-14 00:40:07 +00:00
bool exe_is_locked = false ;
if ( Dqn_Fs_Exists ( exe_path ) ) {
Dqn_FsFile exe_file = Dqn_Fs_OpenFile ( exe_path , Dqn_FsFileOpen_OpenIfExist , Dqn_FsFileAccess_Read | Dqn_FsFileAccess_Write ) ;
exe_is_locked = exe_file . error_size ;
2023-10-14 01:20:04 +00:00
Dqn_Fs_CloseFile ( & exe_file ) ;
2023-10-14 00:40:07 +00:00
}
if ( ! exe_is_locked ) {
Dqn_CPPBuild_ExecOrAbort ( build_context , Dqn_CPPBuildMode_AlwaysRebuild ) ;
}
2023-10-12 11:20:29 +00:00
}
2023-10-11 13:04:01 +00:00
}
2023-10-14 06:21:23 +00:00
// NOTE: raylib emscripten =====================================================================
2023-10-15 08:04:58 +00:00
uint64_t raylib_emscripten_timings [ 2 ] = { } ;
uint64_t feely_pona_emscripten_timings [ 2 ] = { } ;
2023-10-14 14:31:33 +00:00
if ( target_web ) {
2023-10-24 12:41:15 +00:00
Dqn_Str8 const raylib_emscripten_lib_name = DQN_STR8 ( " raylib_emscripten.a " ) ;
2023-10-17 01:29:57 +00:00
bool debug_build = false ;
2023-10-24 12:41:15 +00:00
Dqn_List < Dqn_Str8 > build_specific_compile_flags = { } ;
2023-10-17 01:29:57 +00:00
if ( debug_build ) {
2023-10-24 12:41:15 +00:00
build_specific_compile_flags = Dqn_List_InitCArrayCopy < Dqn_Str8 > ( scratch . arena , 32 , {
DQN_STR8 ( " -s " ) , DQN_STR8 ( " ASSERTIONS=2 " ) ,
DQN_STR8 ( " -s " ) , DQN_STR8 ( " SAFE_HEAP=0 " ) ,
DQN_STR8 ( " -s " ) , DQN_STR8 ( " STACK_OVERFLOW_CHECK=2 " ) ,
DQN_STR8 ( " --profiling-funcs " ) , // Expose function names in stack trace
DQN_STR8 ( " -g " ) , // Debug symbols
2023-10-17 01:29:57 +00:00
} ) ;
} else {
2023-10-24 12:41:15 +00:00
build_specific_compile_flags = Dqn_List_InitCArrayCopy < Dqn_Str8 > ( scratch . arena , 32 , {
DQN_STR8 ( " -Os " ) , // Optimise for size
2023-10-17 01:29:57 +00:00
} ) ;
}
2023-10-14 06:21:23 +00:00
2023-10-15 08:04:58 +00:00
// NOTE: Compile each raylib file separately with emcc =====================================
2023-10-14 06:21:23 +00:00
{
2023-10-15 08:04:58 +00:00
raylib_emscripten_timings [ 0 ] = Dqn_OS_PerfCounterNow ( ) ;
DQN_DEFER { raylib_emscripten_timings [ 1 ] = Dqn_OS_PerfCounterNow ( ) ; } ;
// NOTE: Setup build context ===========================================================
2023-10-30 13:02:34 +00:00
Dqn_List < Dqn_Str8 > emscripten_obj_files = Dqn_List_Init < Dqn_Str8 > ( scratch . arena , 16 ) ;
Dqn_CPPBuildContext raylib_emscripten_build_context = { } ;
raylib_emscripten_build_context . compiler = Dqn_CPPBuildCompiler_GCC ;
2023-10-15 08:04:58 +00:00
2023-10-24 12:41:15 +00:00
for ( Dqn_Str8 base_file : raylib_base_files ) {
Dqn_Str8 file_stem = Dqn_Str8_FileNameNoExtension ( base_file ) ;
2023-10-15 08:04:58 +00:00
// NOTE: Append "emscripten" suffix to the object files
Dqn_CPPBuildCompileFile build_file = { } ;
build_file . input_file_path = base_file ;
2023-10-24 12:41:15 +00:00
build_file . output_file_path = Dqn_Str8_InitF ( scratch . allocator , " raylib_%.*s_emscripten.o " , DQN_STR_FMT ( file_stem ) ) ;
Dqn_List < Dqn_Str8 > compile_flags = Dqn_List_InitCArrayCopy ( scratch . arena , 32 , {
DQN_STR8 ( " cmd " ) ,
DQN_STR8 ( " /C " ) ,
DQN_STR8 ( " emcc.bat " ) ,
DQN_STR8 ( " -c " ) , // Compile and assemble, but do not link
DQN_STR8 ( " -Wall " ) ,
DQN_STR8 ( " -Os " ) , // Optimize for size
DQN_STR8 ( " -D PLATFORM_WEB " ) ,
DQN_STR8 ( " -D GRAPHICS_API_OPENGL_ES2 " ) ,
2023-10-15 08:04:58 +00:00
} ) ;
2023-10-17 01:29:57 +00:00
Dqn_List_AddList ( & compile_flags , build_specific_compile_flags ) ;
raylib_emscripten_build_context . compile_files = Dqn_Slice_InitCArrayCopy ( scratch . arena , { build_file } ) ;
raylib_emscripten_build_context . compile_flags = Dqn_List_ToSliceCopy ( & compile_flags , scratch . arena ) ;
2023-10-15 08:04:58 +00:00
raylib_emscripten_build_context . build_dir = build_dir ;
2023-10-30 13:02:34 +00:00
Dqn_List_Add ( & emscripten_obj_files , build_file . output_file_path ) ;
if ( dry_run ) {
Dqn_Str8 cmd = Dqn_CPPBuild_ToCommandLine ( raylib_emscripten_build_context , Dqn_CPPBuildMode_AlwaysRebuild , scratch . allocator ) ;
Dqn_Print_StdLnF ( Dqn_PrintStd_Out , " %.*s \n " , DQN_STR_FMT ( cmd ) ) ;
} else {
Dqn_CPPBuild_ExecOrAbort ( raylib_emscripten_build_context , Dqn_CPPBuildMode_CacheBuild ) ;
}
}
{
Dqn_Str8 base_file = sokol_audio_source_code_file ;
Dqn_Str8 file_stem = Dqn_Str8_FileNameNoExtension ( base_file ) ;
// NOTE: Append "emscripten" suffix to the object files
Dqn_CPPBuildCompileFile build_file = { } ;
build_file . input_file_path = base_file ;
build_file . output_file_path = Dqn_Str8_InitF ( scratch . allocator , " sokol_audio_emscripten.o " ) ;
Dqn_List < Dqn_Str8 > compile_flags = Dqn_List_InitCArrayCopy ( scratch . arena , 32 , {
DQN_STR8 ( " cmd " ) ,
DQN_STR8 ( " /C " ) ,
DQN_STR8 ( " emcc.bat " ) ,
DQN_STR8 ( " -c " ) , // Compile and assemble, but do not link
DQN_STR8 ( " -Wall " ) ,
DQN_STR8 ( " -Os " ) , // Optimize for size
} ) ;
Dqn_List_AddList ( & compile_flags , build_specific_compile_flags ) ;
raylib_emscripten_build_context . compile_files = Dqn_Slice_InitCArrayCopy ( scratch . arena , { build_file } ) ;
raylib_emscripten_build_context . compile_flags = Dqn_List_ToSliceCopy ( & compile_flags , scratch . arena ) ;
raylib_emscripten_build_context . build_dir = build_dir ;
Dqn_List_Add ( & emscripten_obj_files , build_file . output_file_path ) ;
2023-10-15 08:04:58 +00:00
if ( dry_run ) {
2023-10-24 12:41:15 +00:00
Dqn_Str8 cmd = Dqn_CPPBuild_ToCommandLine ( raylib_emscripten_build_context , Dqn_CPPBuildMode_AlwaysRebuild , scratch . allocator ) ;
Dqn_Print_StdLnF ( Dqn_PrintStd_Out , " %.*s \n " , DQN_STR_FMT ( cmd ) ) ;
2023-10-15 08:04:58 +00:00
} else {
Dqn_CPPBuild_ExecOrAbort ( raylib_emscripten_build_context , Dqn_CPPBuildMode_CacheBuild ) ;
}
}
2023-10-14 06:21:23 +00:00
2023-10-30 13:02:34 +00:00
// NOTE: Build the wasm raylib+sokol_audio library =====================================
2023-10-15 08:04:58 +00:00
{
2023-10-24 12:41:15 +00:00
Dqn_Str8Builder builder = { } ;
2023-10-15 08:04:58 +00:00
builder . allocator = scratch . allocator ;
2023-10-24 12:41:15 +00:00
Dqn_Str8Builder_AppendF ( & builder , " cmd /C emar.bat rcs %.*s " , DQN_STR_FMT ( raylib_emscripten_lib_name ) ) ;
2023-10-15 08:04:58 +00:00
2023-10-30 13:02:34 +00:00
for ( Dqn_ListIterator < Dqn_Str8 > it = { } ; Dqn_List_Iterate ( & emscripten_obj_files , & it , 0 ) ; )
2023-10-24 12:41:15 +00:00
Dqn_Str8Builder_AppendF ( & builder , " %.*s " , DQN_STR_FMT ( * it . data ) ) ;
2023-10-15 08:04:58 +00:00
2023-10-24 12:41:15 +00:00
Dqn_Str8 cmd = Dqn_Str8Builder_Build ( & builder , scratch . allocator ) ;
2023-10-15 08:04:58 +00:00
if ( dry_run ) {
2023-10-24 12:41:15 +00:00
Dqn_Print_StdLnF ( Dqn_PrintStd_Out , " %.*s \n " , DQN_STR_FMT ( cmd ) ) ;
2023-10-15 08:04:58 +00:00
} else {
Dqn_OS_ExecOrAbort ( cmd , build_dir ) ;
}
2023-10-14 06:21:23 +00:00
}
}
2023-10-17 11:07:20 +00:00
// NOTE: feely pona emscripten =============================================================
2023-10-14 06:21:23 +00:00
{
2023-10-15 08:04:58 +00:00
feely_pona_emscripten_timings [ 0 ] = Dqn_OS_PerfCounterNow ( ) ;
DQN_DEFER { feely_pona_emscripten_timings [ 1 ] = Dqn_OS_PerfCounterNow ( ) ; } ;
2023-10-17 11:07:20 +00:00
// NOTE: feely pona emscripten shell =======================================================
2023-10-24 12:41:15 +00:00
Dqn_Str8 html_shell_path = Dqn_FsPath_ConvertF ( scratch . arena , " %.*s/feely_pona_emscripten_shell.html " , DQN_STR_FMT ( build_dir ) ) ;
2023-10-17 11:07:20 +00:00
{
2023-10-24 12:41:15 +00:00
Dqn_Str8 html_path = Dqn_FsPath_ConvertF ( scratch . arena , " %.*s/feely_pona_emscripten_shell.html " , DQN_STR_FMT ( code_dir ) ) ;
Dqn_Str8 html_buffer = Dqn_Fs_Read ( html_path , scratch . allocator ) ;
2023-10-17 11:07:20 +00:00
if ( ! DQN_CHECKF ( html_buffer . size ,
" Failed to read Emscripten HTML shell file. The file at \n \n '%.*s' \n \n does not exist or is not readable " ,
2023-10-24 12:41:15 +00:00
DQN_STR_FMT ( html_path ) ) )
2023-10-17 11:07:20 +00:00
return - 1 ;
2023-10-24 12:41:15 +00:00
Dqn_Str8 version_path = Dqn_FsPath_ConvertF ( scratch . arena , " %.*s/feely_pona_version.txt " , DQN_STR_FMT ( code_dir ) ) ;
Dqn_Str8 version_buffer = Dqn_Fs_Read ( version_path , scratch . allocator ) ;
Dqn_Str8SplitAllocResult version_parts = Dqn_Str8_SplitAlloc ( scratch . allocator , version_buffer , DQN_STR8 ( " \n " ) ) ;
2023-10-17 11:07:20 +00:00
if ( ! DQN_CHECKF ( version_parts . size = = 3 ,
" Version file '%.*s' must have 3 lines containing, date, commit hash and number of commits. The buffer we tried extracting information from was \n \n %.*s \n \n " ,
2023-10-24 12:41:15 +00:00
DQN_STR_FMT ( version_path ) ,
DQN_STR_FMT ( version_buffer ) ) ) {
2023-10-17 11:07:20 +00:00
return - 1 ;
}
2023-10-24 12:41:15 +00:00
Dqn_Str8 date = Dqn_Str8_TrimWhitespaceAround ( version_parts . data [ 0 ] ) ;
Dqn_Str8 commit_hash = Dqn_Str8_TrimWhitespaceAround ( version_parts . data [ 1 ] ) ;
Dqn_Str8 commit_count = Dqn_Str8_TrimWhitespaceAround ( version_parts . data [ 2 ] ) ;
Dqn_Str8 version_text = Dqn_Str8_InitF ( scratch . allocator ,
2023-10-17 11:07:20 +00:00
" %.*s edition rev. %.*s-%.*s " ,
2023-10-24 12:41:15 +00:00
DQN_STR_FMT ( date ) ,
DQN_STR_FMT ( commit_count ) ,
DQN_STR_FMT ( commit_hash ) ) ;
2023-10-17 11:07:20 +00:00
2023-10-24 12:41:15 +00:00
Dqn_Str8 html_buffer_processed = Dqn_Str8_Replace ( html_buffer ,
DQN_STR8 ( " @version@ " ) ,
2023-10-17 11:07:20 +00:00
version_text ,
0 /*start_index*/ ,
scratch . allocator ) ;
if ( ! DQN_CHECKF ( Dqn_Fs_Write ( html_shell_path ,
html_buffer_processed ) ,
" Failed to write Emscripten HTML shell with the project version inserted into it. We were unable to write to the target location \n \n '%.*s' \n " ,
2023-10-24 12:41:15 +00:00
DQN_STR_FMT ( html_shell_path ) ) )
2023-10-17 11:07:20 +00:00
return - 1 ;
}
2023-10-15 08:04:58 +00:00
// NOTE: Compile with emcc =============================================================
Dqn_CPPBuildContext build_context = { } ;
build_context . compile_file_obj_suffix = DQN_CPP_BUILD_OBJ_SUFFIX_O ;
build_context . compile_files = Dqn_Slice_InitCArrayCopy ( scratch . arena , {
2023-10-29 03:59:53 +00:00
Dqn_CPPBuildCompileFile { { } , Dqn_FsPath_ConvertF ( scratch . arena , " %.*s/feely_pona_unity.cpp " , DQN_STR_FMT ( code_dir ) ) } ,
2023-10-15 08:04:58 +00:00
} ) ;
2023-10-29 12:45:45 +00:00
Dqn_Str8 output_name = DQN_STR8 ( " Terry_Cherry " ) ;
2023-10-24 12:41:15 +00:00
Dqn_List < Dqn_Str8 > compile_flags = Dqn_List_InitCArrayCopy ( scratch . arena , 32 , {
DQN_STR8 ( " cmd " ) , DQN_STR8 ( " /C " ) , DQN_STR8 ( " emcc.bat " ) ,
DQN_STR8 ( " -o " ) , Dqn_Str8_InitF ( scratch . allocator , " %.*s.html " , DQN_STR_FMT ( output_name ) ) ,
DQN_STR8 ( " -Wall " ) ,
DQN_STR8 ( " --shell-file " ) , html_shell_path ,
Dqn_FsPath_ConvertF ( scratch . arena , " %.*s/%.*s " , DQN_STR_FMT ( build_dir ) , DQN_STR_FMT ( raylib_emscripten_lib_name ) ) ,
DQN_STR8 ( " -s " ) , DQN_STR8 ( " USE_GLFW=3 " ) ,
DQN_STR8 ( " -s " ) , DQN_STR8 ( " TOTAL_MEMORY=512MB " ) ,
DQN_STR8 ( " -s " ) , DQN_STR8 ( " TOTAL_STACK=32MB " ) ,
DQN_STR8 ( " -s " ) , DQN_STR8 ( " ALLOW_MEMORY_GROWTH " ) ,
DQN_STR8 ( " --preload-file " ) , DQN_STR8 ( " Data " ) ,
DQN_STR8 ( " -msimd128 " ) ,
DQN_STR8 ( " -msse2 " ) ,
2023-10-29 03:59:53 +00:00
DQN_STR8 ( " -D " ) , DQN_STR8 ( " TELY_WITH_PLATFORM " ) ,
DQN_STR8 ( " -D " ) , DQN_STR8 ( " FEELY_PONA_IMPLEMENTATION " ) ,
2023-10-15 08:04:58 +00:00
} ) ;
2023-10-17 01:29:57 +00:00
Dqn_List_AddList ( & compile_flags , build_specific_compile_flags ) ;
build_context . compile_flags = Dqn_List_ToSliceCopy ( & compile_flags , scratch . arena ) ;
build_context . build_dir = build_dir ;
2023-10-14 06:21:23 +00:00
if ( dry_run ) {
2023-10-24 12:41:15 +00:00
Dqn_Str8 cmd = Dqn_CPPBuild_ToCommandLine ( build_context , Dqn_CPPBuildMode_AlwaysRebuild , scratch . allocator ) ;
Dqn_Print_StdLnF ( Dqn_PrintStd_Out , " %.*s \n " , DQN_STR_FMT ( cmd ) ) ;
2023-10-14 06:21:23 +00:00
} else {
2023-10-15 08:04:58 +00:00
Dqn_CPPBuild_ExecOrAbort ( build_context , Dqn_CPPBuildMode_CacheBuild ) ;
2023-10-14 06:21:23 +00:00
}
2023-10-16 06:32:32 +00:00
// NOTE: Move the files to a directory
2023-10-29 03:59:53 +00:00
Dqn_Str8 folder_path = Dqn_FsPath_ConvertF ( scratch . arena , " %.*s/%.*s " , DQN_STR_FMT ( build_dir ) , DQN_STR_FMT ( output_name ) ) ;
2023-10-16 06:32:32 +00:00
if ( ! Dqn_Fs_DirExists ( folder_path ) ) {
2023-10-24 12:41:15 +00:00
Dqn_Str8 mkdir_cmd = Dqn_Str8_InitF ( scratch . allocator , " mkdir %.*s " , DQN_STR_FMT ( folder_path ) ) ;
2023-10-16 06:32:32 +00:00
Dqn_OS_ExecOrAbort ( mkdir_cmd , { } ) ;
}
2023-10-24 12:41:15 +00:00
Dqn_Str8 const generated_file_extension [ ] = {
DQN_STR8 ( " data " ) ,
DQN_STR8 ( " html " ) ,
DQN_STR8 ( " js " ) ,
DQN_STR8 ( " wasm " ) ,
2023-10-16 06:32:32 +00:00
} ;
2023-10-24 12:41:15 +00:00
for ( Dqn_Str8 file_ext : generated_file_extension ) {
Dqn_Str8 src_path = Dqn_FsPath_ConvertF ( scratch . arena , " %.*s/%.*s.%.*s " , DQN_STR_FMT ( build_dir ) , DQN_STR_FMT ( output_name ) , DQN_STR_FMT ( file_ext ) ) ;
2023-10-29 12:45:45 +00:00
Dqn_Str8 dest_path = Dqn_FsPath_ConvertF ( scratch . arena , " %.*s/%.*s.%.*s " , DQN_STR_FMT ( folder_path ) , DQN_STR_FMT ( output_name ) , DQN_STR_FMT ( file_ext ) ) ;
2023-10-24 12:41:15 +00:00
Dqn_Str8 cmd = Dqn_Str8_InitF ( scratch . allocator , " cmd /C move /Y %.*s %.*s " , DQN_STR_FMT ( src_path ) , DQN_STR_FMT ( dest_path ) ) ;
2023-10-16 06:32:32 +00:00
if ( dry_run ) {
2023-10-24 12:41:15 +00:00
Dqn_Print_StdLnF ( Dqn_PrintStd_Out , " %.*s \n " , DQN_STR_FMT ( cmd ) ) ;
2023-10-16 06:32:32 +00:00
} else {
Dqn_OS_ExecOrAbort ( cmd , build_dir ) ;
}
}
2023-10-14 06:21:23 +00:00
}
}
2023-10-12 11:20:29 +00:00
build_timings [ 1 ] = Dqn_OS_PerfCounterNow ( ) ;
2023-10-14 06:21:23 +00:00
Dqn_Print_StdLnF ( Dqn_PrintStd_Out , " \n -- Dqn_CPPBuild Timings (%.2fms) " , Dqn_OS_PerfCounterMs ( build_timings [ 0 ] , build_timings [ 1 ] ) ) ;
2023-10-14 00:40:07 +00:00
Dqn_Print_StdLnF ( Dqn_PrintStd_Out , " robocopy: %.2fms " , Dqn_OS_PerfCounterMs ( robocopy_timings [ 0 ] , robocopy_timings [ 1 ] ) ) ;
2023-10-30 13:02:34 +00:00
Dqn_Print_StdLnF ( Dqn_PrintStd_Out , " raylib: %.2fms " , Dqn_OS_PerfCounterMs ( raylib_pc_timings [ 0 ] , raylib_pc_timings [ 1 ] ) ) ;
Dqn_Print_StdLnF ( Dqn_PrintStd_Out , " sokol_audio: %.2fms " , Dqn_OS_PerfCounterMs ( sokol_audio_pc_timings [ 0 ] , sokol_audio_pc_timings [ 1 ] ) ) ;
2023-10-16 13:35:41 +00:00
Dqn_Print_StdLnF ( Dqn_PrintStd_Out , " qoi_converter: %.2fms " , Dqn_OS_PerfCounterMs ( qoi_converter_timings [ 0 ] , qoi_converter_timings [ 1 ] ) ) ;
2023-10-14 00:40:07 +00:00
Dqn_Print_StdLnF ( Dqn_PrintStd_Out , " feely pona sprite packer: %.2fms " , Dqn_OS_PerfCounterMs ( feely_pona_sprite_packer_timings [ 0 ] , feely_pona_sprite_packer_timings [ 1 ] ) ) ;
Dqn_Print_StdLnF ( Dqn_PrintStd_Out , " feely pona (no dll): %.2fms " , Dqn_OS_PerfCounterMs ( feely_pona_no_dll_timings [ 0 ] , feely_pona_no_dll_timings [ 1 ] ) ) ;
Dqn_Print_StdLnF ( Dqn_PrintStd_Out , " feely pona (dll): %.2fms " , Dqn_OS_PerfCounterMs ( feely_pona_dll_timings [ 0 ] , feely_pona_dll_timings [ 1 ] ) ) ;
Dqn_Print_StdLnF ( Dqn_PrintStd_Out , " feely pona (platform-raylib): %.2fms " , Dqn_OS_PerfCounterMs ( feely_pona_platform_timings [ 0 ] , feely_pona_platform_timings [ 1 ] ) ) ;
2023-10-15 08:04:58 +00:00
if ( target_web ) {
Dqn_Print_StdLnF ( Dqn_PrintStd_Out , " raylib (emscripten): %.2fms " , Dqn_OS_PerfCounterMs ( raylib_emscripten_timings [ 0 ] , raylib_emscripten_timings [ 1 ] ) ) ;
Dqn_Print_StdLnF ( Dqn_PrintStd_Out , " feely pona (emscripten): %.2fms " , Dqn_OS_PerfCounterMs ( feely_pona_emscripten_timings [ 0 ] , feely_pona_emscripten_timings [ 1 ] ) ) ;
}
2023-10-10 12:00:35 +00:00
return 0 ;
}