updated the build system to get it to work out of the box on more systems

This commit is contained in:
PS 2021-01-16 23:01:08 -08:00
parent 99c62292a4
commit 2769640adf
12 changed files with 144 additions and 66 deletions

View File

@ -2,8 +2,8 @@
IF NOT "%PrebuildCalled%"=="1" GOTO error IF NOT "%PrebuildCalled%"=="1" GOTO error
C:\apps\ctime\ctime.exe -end %StatsPath%\%StatsFile% %LastError% IF EXIST %CTIMEPATH% ( call C:\apps\ctime\ctime.exe -end %StatsPath%\%StatsFile% %LastError% )
C:\apps\ctime\ctime.exe -stats %StatsPath%\%StatsFile% IF EXIST %CTIMEPATH% ( call C:\apps\ctime\ctime.exe -stats %StatsPath%\%StatsFile% )
set PrebuildCalled=0 set PrebuildCalled=0
GOTO:eof GOTO:eof

View File

@ -1,6 +1,6 @@
@echo off @echo off
REM This file takes two arguments REM This file takes three arguments
REM 1 = "app" or "meta" REM 1 = "app" or "meta"
REM 2 = "debug" or "release" REM 2 = "debug" or "release"
REM 3 = "msvc" or "clang" REM 3 = "msvc" or "clang"
@ -22,7 +22,9 @@ set StatsFile=%1_win32_%3_%2_build_time.ctm
IF NOT EXIST %BuildPath% mkdir %BuildPath% IF NOT EXIST %BuildPath% mkdir %BuildPath%
IF NOT EXIST %StatsPath% mkdir %StatsPath% IF NOT EXIST %StatsPath% mkdir %StatsPath%
C:\apps\ctime\ctime.exe -begin %StatsPath%\%StatsFile% set CTimePath=C:\apps\ctime
IF EXIST %CTIMEPATH% ( call C:\apps\ctime\ctime.exe -begin %StatsPath%\%StatsFile% )
echo. echo.
echo BUILDING TO %BuildPath% echo BUILDING TO %BuildPath%
echo STATS IN %StatsPath%\%StatsFile% echo STATS IN %StatsPath%\%StatsFile%

View File

@ -1,32 +1,26 @@
@echo off @echo off
set ProjectDevFolder=%~dp0 SET MyPath=%~dp0
set ProjectDevPath=%ProjectDevFolder:~0,-1% SET MyPath=%MyPath:~0,-1%
call %MyPath%\_prebuild_win32.bat app debug clang
pushd %ProjectDevPath%
IF NOT EXIST .\build_clang\ mkdir .\build_clang
C:\programs\ctime\ctime.exe -begin %ProjectDevPath%\build\win32_foldhaus_clang_build_time.ctm
set CommonCompilerFlags=-std=c++11 -Wno-writable-strings -Wno-unused-value -Wno-varargs -Wno-switch -Wno-microsoft-enum-forward-reference -DDEBUG=1 set CommonCompilerFlags=-std=c++11 -Wno-writable-strings -Wno-unused-value -Wno-varargs -Wno-switch -Wno-microsoft-enum-forward-reference -DDEBUG=1
pushd .\build_clang\ pushd %BuildPath%
REM Run the Preprocessor del *.pdb > NUL 2> NUL
foldhaus_meta.exe ..\src\foldhaus_app.cpp
echo WAITING FOR PDB TO WRITE > lock.tmp echo WAITING FOR PDB TO WRITE > lock.tmp
clang %CommonCompilerFlags% ..\src\foldhaus_app.cpp -shared clang++ %CommonCompilerFlags% %SourceCodePath%\foldhaus_app.cpp -shared -o
set LastError=%ERRORLEVEL% set LastError=%ERRORLEVEL%
del lock.tmp del lock.tmp
clang %CommonCompilerFlags% ..\src\win32_foldhaus.cpp -o win32_foldhaus.exe user32.lib winmm.lib gdi32.lib opengl32.lib dsound.lib Ws2_32.lib Comdlg32.lib clang++ -c %CommonCompilerFlags% %SourceCodePath%\platform_win32\win32_foldhaus.cpp
link win32_foldhaus.o user32.lib winmm.lib gdi32.lib opengl32.lib dsound.lib Ws2_32.lib Comdlg32.lib
C:\programs\ctime\ctime.exe -end %ProjectDevPath%\build\win32_foldhaus_clang_build_time.ctm %LastError%
REM C:\programs\ctime\ctime.exe -stats %ProjectDevPath%\build\win32_foldhaus_clang_build_time.ctm
popd popd
call %MyPath%\_postbuild_win32.bat

View File

@ -3,30 +3,32 @@
SET MyPath=%~dp0 SET MyPath=%~dp0
SET MyPath=%MyPath:~0,-1% SET MyPath=%MyPath:~0,-1%
call %MyPath%\_prebuild_win32.bat app debug msvc call %MyPath%\_prebuild_win32.bat app debug msvc
call %MyPath%\setup_cl.bat
set CommonCompilerFlags=-nologo -DDEBUG=1 -DPLATFORM_WINDOWS -FC -WX -W4 -Z7 -Oi -GR- -EHsc -EHa- -MTd -fp:fast -fp:except- -IC:\programs-dev\gs_libs\src SET CommonCompilerFlags=-nologo -DDEBUG=1 -DPLATFORM_WINDOWS -FC -WX -W4 -Z7 -Oi -GR- -EHsc -EHa- -MTd -fp:fast -fp:except- -IC:\programs-dev\gs_libs\src
set CommonCompilerFlags=-wd4127 -wd4702 -wd4101 -wd4505 -wd4100 -wd4189 -wd4244 -wd4201 -wd4996 -I%CommonLibs% -O2 %CommonCompilerFlags%
set CommonLinkerFlags= -opt:ref -incremental:no SET CommonCompilerFlags=-wd4127 -wd4702 -wd4101 -wd4505 -wd4100 -wd4189 -wd4244 -wd4201 -wd4996 -I%CommonLibs% -O2 %CommonCompilerFlags%
set DLLExports=/EXPORT:InitializeApplication /EXPORT:UpdateAndRender /EXPORT:CleanupApplication /EXPORT:ReloadStaticData SET CommonLinkerFlags= -opt:ref -incremental:no
SET DLLExports=/EXPORT:InitializeApplication /EXPORT:UpdateAndRender /EXPORT:CleanupApplication /EXPORT:ReloadStaticData
pushd %BuildPath% pushd %BuildPath%
del *.pdb > NUL 2> NUL del *.pdb > NUL 2> NUL
REM Run the Preprocessor
REM %MetaProgramPath%\foldhaus_meta.exe %SourceCodePath%\foldhaus_app.cpp
echo WAITING FOR PDB TO WRITE > lock.tmp echo WAITING FOR PDB TO WRITE > lock.tmp
cl %CommonCompilerFlags% %SourceCodePath%\foldhaus_app.cpp /Fefoldhaus.dll /LD /link %CommonLinkerFlags% %DLLExports% cl %CommonCompilerFlags% %SourceCodePath%\foldhaus_app.cpp /Fefoldhaus.dll /LD /link %CommonLinkerFlags% %DLLExports%
set LastError=%ERRORLEVEL% SET LastError=%ERRORLEVEL%
del lock.tmp del lock.tmp
cl %CommonCompilerFlags% %SourceCodePath%\platform_win32\win32_foldhaus.cpp /link %CommonLinkerFlags% user32.lib winmm.lib gdi32.lib opengl32.lib dsound.lib Ws2_32.lib Comdlg32.lib cl %CommonCompilerFlags% %SourceCodePath%\platform_win32\win32_foldhaus.cpp /link %CommonLinkerFlags% user32.lib winmm.lib gdi32.lib opengl32.lib dsound.lib Ws2_32.lib Comdlg32.lib
REM COMPILE UTILITY EXES
cl %CommonCompilerFlags% %ProjectDevPath%\src\serial_monitor\first.cpp /Feserial_monitor.exe /link %CommonLinkerFlags% user32.lib winmm.lib gdi32.lib cl %CommonCompilerFlags% %ProjectDevPath%\src\serial_monitor\first.cpp /Feserial_monitor.exe /link %CommonLinkerFlags% user32.lib winmm.lib gdi32.lib
cl %CommonCompilerFlags% %ProjectDevPath%\src\sculpture_gen\gen_blumen_lumen.cpp /Fegen_blumen_lumen.exe /link %CommonLinkerFlags% user32.lib winmm.lib gdi32.lib cl %CommonCompilerFlags% %ProjectDevPath%\src\sculpture_gen\gen_blumen_lumen.cpp /Fegen_blumen_lumen.exe /link %CommonLinkerFlags% user32.lib winmm.lib gdi32.lib

37
build/setup_cl.bat Normal file
View File

@ -0,0 +1,37 @@
@echo off
SET "LIB="
SET VC_PATH=C:\Program Files (x86)\Microsoft Visual Studio 12.0
IF NOT DEFINED LIB (IF EXIST "%VC_PATH%" (call "%VC_PATH%\VC\vcvarsall.bat" x64))
SET VC_PATH=C:\Program Files (x86)\Microsoft Visual Studio 11.0
IF NOT DEFINED LIB (IF EXIST "%VC_PATH%" (call "%VC_PATH%\VC\vcvarsall.bat" x64))
SET VC_PATH=C:\Program Files (x86)\Microsoft Visual Studio 10.0
IF NOT DEFINED LIB (IF EXIST "%VC_PATH%" (call "%VC_PATH%\VC\vcvarsall.bat" x64))
SET VC_PATH=C:\Program Files (x86)\Microsoft Visual Studio 13.0
IF NOT DEFINED LIB (IF EXIST "%VC_PATH%" (call "%VC_PATH%\VC\vcvarsall.bat" x64))
SET VC_PATH=C:\Program Files (x86)\Microsoft Visual Studio 14.0
IF NOT DEFINED LIB (IF EXIST "%VC_PATH%" (call "%VC_PATH%\VC\vcvarsall.bat" x64))
SET VC_PATH=C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools
IF NOT DEFINED LIB (IF EXIST "%VC_PATH%" (call "%VC_PATH%\VC\Auxiliary\Build\vcvarsall.bat" x64))
SET VC_PATH=C:\Program Files (x86)\Microsoft Visual Studio\2017\Community
IF NOT DEFINED LIB (IF EXIST "%VC_PATH%" (call "%VC_PATH%\VC\Auxiliary\Build\vcvarsall.bat" x64))
SET VC_PATH=C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional
IF NOT DEFINED LIB (IF EXIST "%VC_PATH%" (call "%VC_PATH%\VC\Auxiliary\Build\vcvarsall.bat" x64))
SET VC_PATH=C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools
IF NOT DEFINED LIB (IF EXIST "%VC_PATH%" (call "%VC_PATH%\VC\Auxiliary\Build\vcvarsall.bat" x64))
SET VC_PATH=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community
IF NOT DEFINED LIB (IF EXIST "%VC_PATH%" (call "%VC_PATH%\VC\Auxiliary\Build\vcvarsall.bat" x64))
SET VC_PATH=C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional
IF NOT DEFINED LIB (IF EXIST "%VC_PATH%" (call "%VC_PATH%\VC\Auxiliary\Build\vcvarsall.bat" x64))

View File

@ -900,14 +900,8 @@ AnimationTimeline_Render(panel* Panel, rect2 PanelBounds, render_command_buffer*
ui_FillRect(&State->Interface, PanelBounds, v4{.1f,.1f,.1f,1.f}); ui_FillRect(&State->Interface, PanelBounds, v4{.1f,.1f,.1f,1.f});
rect2 TimelineBounds, InfoBounds; rect2 TimelineBounds, InfoBounds;
RectVSplit(PanelBounds, 300, &InfoBounds, &TimelineBounds); RectVSplitAtDistanceFromLeft(PanelBounds, 300, &InfoBounds, &TimelineBounds);
#if 0
rect2 AnimInfoBounds, SelectionInfoBounds;
RectHSplitAtPercent(InfoBounds, .65f, &AnimInfoBounds, &SelectionInfoBounds);
#endif
{ // Timeline
rect2 LayersPanelBounds, TimeRangePanelBounds; rect2 LayersPanelBounds, TimeRangePanelBounds;
RectVSplitAtDistanceFromLeft(TimelineBounds, 200, &LayersPanelBounds, &TimeRangePanelBounds); RectVSplitAtDistanceFromLeft(TimelineBounds, 200, &LayersPanelBounds, &TimeRangePanelBounds);
@ -922,8 +916,6 @@ AnimationTimeline_Render(panel* Panel, rect2 PanelBounds, render_command_buffer*
FrameCount_Render(TimelineState, FrameCountBounds, RenderBuffer, State, Context); FrameCount_Render(TimelineState, FrameCountBounds, RenderBuffer, State, Context);
LayerList_Render(TimelineState, LayersBounds, Panel, RenderBuffer, State, Context); LayerList_Render(TimelineState, LayersBounds, Panel, RenderBuffer, State, Context);
TimeRange_Render(TimelineState, TimeRangeBounds, RenderBuffer, State, Context); TimeRange_Render(TimelineState, TimeRangeBounds, RenderBuffer, State, Context);
}
AnimInfoView_Render(TimelineState, InfoBounds, Panel, RenderBuffer, State, Context); AnimInfoView_Render(TimelineState, InfoBounds, Panel, RenderBuffer, State, Context);
} }

View File

@ -5,8 +5,16 @@
// //
#ifndef FOLDHAUS_PANEL_FILE_VIEW_H #ifndef FOLDHAUS_PANEL_FILE_VIEW_H
enum file_view_mode
{
FileViewMode_Load,
FileViewMode_Save,
};
struct file_view_state struct file_view_state
{ {
file_view_mode Mode;
gs_string WorkingDirectory; gs_string WorkingDirectory;
gs_memory_arena FileNamesArena; gs_memory_arena FileNamesArena;
gs_file_info_array FileNames; gs_file_info_array FileNames;
@ -14,9 +22,18 @@ struct file_view_state
gs_file_info SelectedFile; gs_file_info SelectedFile;
}; };
internal void
FileView_SetMode(panel* Panel, file_view_mode Mode)
{
file_view_state* FileViewState = Panel_GetStateStruct(Panel, file_view_state);
FileViewState->Mode = Mode;
}
internal void internal void
FileView_Exit_(panel* FileViewPanel, app_state* State, context Context) FileView_Exit_(panel* FileViewPanel, app_state* State, context Context)
{ {
// TODO(pjs): Free State->FileNamesArena
Assert(FileViewPanel->IsModalOverrideFor != 0); Assert(FileViewPanel->IsModalOverrideFor != 0);
panel* ReturnTo = FileViewPanel->IsModalOverrideFor; panel* ReturnTo = FileViewPanel->IsModalOverrideFor;
if (ReturnTo->ModalOverrideCB) if (ReturnTo->ModalOverrideCB)
@ -30,7 +47,7 @@ global input_command* FileView_Commands = 0;
s32 FileView_CommandsCount = 0; s32 FileView_CommandsCount = 0;
internal void internal void
FileViewUpdateWorkingDirectory(gs_const_string WorkingDirectory, file_view_state* State, context Context) FileView_UpdateWorkingDirectory(gs_const_string WorkingDirectory, file_view_state* State, context Context)
{ {
ClearArena(&State->FileNamesArena); ClearArena(&State->FileNamesArena);
@ -43,23 +60,20 @@ FileViewUpdateWorkingDirectory(gs_const_string WorkingDirectory, file_view_state
u32 SecondLastSlashIndex = FindLast(SanitizedDirectory, LastSlashIndex - 1, '\\'); u32 SecondLastSlashIndex = FindLast(SanitizedDirectory, LastSlashIndex - 1, '\\');
SanitizedDirectory = Substring(SanitizedDirectory, 0, SecondLastSlashIndex); SanitizedDirectory = Substring(SanitizedDirectory, 0, SecondLastSlashIndex);
} }
else if (StringsEqual(LastDir, ConstString("."))) else if (StringsEqual(LastDir, ConstString(".")) && LastDir.Length > 1)
{ {
SanitizedDirectory = Substring(SanitizedDirectory, 0, LastSlashIndex); SanitizedDirectory = Substring(SanitizedDirectory, 0, LastSlashIndex);
} }
State->WorkingDirectory = PushString(&State->FileNamesArena, WorkingDirectory.Length + 2); gs_file_info NewWorkingDirectory = GetFileInfo(Context.ThreadContext.FileHandler, SanitizedDirectory);
PrintF(&State->WorkingDirectory, "%S", SanitizedDirectory); if (NewWorkingDirectory.IsDirectory)
if (State->WorkingDirectory.Str[State->WorkingDirectory.Length - 1] != '\\')
{ {
AppendPrintF(&State->WorkingDirectory, "\\"); // NOTE(pjs): we might be printing from State->WorkingDirectory to State->WorkingDirectory
} // in some cases. Shouldn't be a problem but it is unnecessary
if (State->WorkingDirectory.Str[State->WorkingDirectory.Length - 1] != '*') PrintF(&State->WorkingDirectory, "%S", WorkingDirectory);
{
AppendPrintF(&State->WorkingDirectory, "*");
}
State->FileNames = EnumerateDirectory(Context.ThreadContext.FileHandler, &State->FileNamesArena, State->WorkingDirectory.ConstString, EnumerateDirectory_IncludeDirectories); State->FileNames = EnumerateDirectory(Context.ThreadContext.FileHandler, &State->FileNamesArena, State->WorkingDirectory.ConstString, EnumerateDirectory_IncludeDirectories);
}
} }
GSMetaTag(panel_init); GSMetaTag(panel_init);
@ -71,7 +85,10 @@ FileView_Init(panel* Panel, app_state* State, context Context)
file_view_state* FileViewState = PushStruct(&State->Permanent, file_view_state); file_view_state* FileViewState = PushStruct(&State->Permanent, file_view_state);
Panel->StateMemory = StructToData(FileViewState, file_view_state); Panel->StateMemory = StructToData(FileViewState, file_view_state);
FileViewState->FileNamesArena = CreateMemoryArena(Context.ThreadContext.Allocator); FileViewState->FileNamesArena = CreateMemoryArena(Context.ThreadContext.Allocator);
FileViewUpdateWorkingDirectory(ConstString("."), FileViewState, Context);
// TODO(pjs): this shouldn't be stored in permanent
FileViewState->WorkingDirectory = PushString(&State->Permanent, 256);
FileView_UpdateWorkingDirectory(ConstString("."), FileViewState, Context);
} }
GSMetaTag(panel_cleanup); GSMetaTag(panel_cleanup);
@ -88,6 +105,8 @@ internal void
FileView_Render(panel* Panel, rect2 PanelBounds, render_command_buffer* RenderBuffer, app_state* State, context Context) FileView_Render(panel* Panel, rect2 PanelBounds, render_command_buffer* RenderBuffer, app_state* State, context Context)
{ {
file_view_state* FileViewState = Panel_GetStateStruct(Panel, file_view_state); file_view_state* FileViewState = Panel_GetStateStruct(Panel, file_view_state);
Assert(FileViewState->Mode == FileViewMode_Save);
ui_PushLayout(&State->Interface, PanelBounds, LayoutDirection_TopDown, MakeString("FileView Layout")); ui_PushLayout(&State->Interface, PanelBounds, LayoutDirection_TopDown, MakeString("FileView Layout"));
{ {
if (ui_Button(&State->Interface, MakeString("Exit"))) if (ui_Button(&State->Interface, MakeString("Exit")))
@ -96,7 +115,21 @@ FileView_Render(panel* Panel, rect2 PanelBounds, render_command_buffer* RenderBu
} }
// Header // Header
ui_Label(&State->Interface, FileViewState->WorkingDirectory); if (ui_TextEntry(&State->Interface, MakeString("pwd"), &FileViewState->WorkingDirectory))
{
// if last character is a slash, update pwd, and clear the filter string
// otherwise update the filter string
gs_string Pwd = FileViewState->WorkingDirectory;
char LastChar = Pwd.Str[Pwd.Length - 1];
if (LastChar == '\\' || LastChar == '/')
{
FileView_UpdateWorkingDirectory(Pwd.ConstString, FileViewState, Context);
}
else
{
}
}
// File Display // File Display
ui_BeginList(&State->Interface, MakeString("Files"), 10, FileViewState->FileNames.Count); ui_BeginList(&State->Interface, MakeString("Files"), 10, FileViewState->FileNames.Count);
@ -113,7 +146,7 @@ FileView_Render(panel* Panel, rect2 PanelBounds, render_command_buffer* RenderBu
{ {
if (File.IsDirectory) if (File.IsDirectory)
{ {
FileViewUpdateWorkingDirectory(File.Path, FileViewState, Context); FileView_UpdateWorkingDirectory(File.Path, FileViewState, Context);
} }
else else
{ {
@ -128,6 +161,5 @@ FileView_Render(panel* Panel, rect2 PanelBounds, render_command_buffer* RenderBu
} }
#define FOLDHAUS_PANEL_FILE_VIEW_H #define FOLDHAUS_PANEL_FILE_VIEW_H
#endif // FOLDHAUS_PANEL_FILE_VIEW_H #endif // FOLDHAUS_PANEL_FILE_VIEW_H

View File

@ -60,6 +60,7 @@ HierarchyView_Render(panel* Panel, rect2 PanelBounds, render_command_buffer* Ren
if (ui_Button(&State->Interface, MakeString("+ Add Assembly"))) if (ui_Button(&State->Interface, MakeString("+ Add Assembly")))
{ {
panel* FileBrowser = PanelSystem_PushPanel(&State->PanelSystem, PanelType_FileView, State, Context); panel* FileBrowser = PanelSystem_PushPanel(&State->PanelSystem, PanelType_FileView, State, Context);
FileView_SetMode(FileBrowser, FileViewMode_Save);
Panel_PushModalOverride(Panel, FileBrowser, LoadAssemblyCallback); Panel_PushModalOverride(Panel, FileBrowser, LoadAssemblyCallback);
} }

View File

@ -225,7 +225,7 @@ AssemblyParser_ReadSequence(parser* Parser, assembly* Assembly)
internal strip_gen_data internal strip_gen_data
AssemblyParser_ReadStripGenData(parser* Parser, assembly* Assembly) AssemblyParser_ReadStripGenData(parser* Parser, assembly* Assembly)
{ {
strip_gen_data Result = {0}; strip_gen_data Result = {};
if (Parser_ReadOpenStruct(Parser, AssemblyField_Segment)) if (Parser_ReadOpenStruct(Parser, AssemblyField_Segment))
{ {

View File

@ -1141,7 +1141,7 @@ ui_TextEntrySetFlags(ui_widget* Widget, gs_string EditString)
ui_WidgetSetFlag(Widget, UIWidgetFlag_Typable); ui_WidgetSetFlag(Widget, UIWidgetFlag_Typable);
} }
internal void internal bool
ui_TextEntry(ui_interface* Interface, gs_string Identifier, gs_string* Value) ui_TextEntry(ui_interface* Interface, gs_string Identifier, gs_string* Value)
{ {
ui_widget* Widget = ui_CreateWidget(Interface, Identifier); ui_widget* Widget = ui_CreateWidget(Interface, Identifier);
@ -1155,7 +1155,10 @@ ui_TextEntry(ui_interface* Interface, gs_string Identifier, gs_string* Value)
ui_TextEntrySetFlags(Widget, State->EditString); ui_TextEntrySetFlags(Widget, State->EditString);
ui_eval_result Result = ui_EvaluateWidget(Interface, Widget); ui_eval_result Result = ui_EvaluateWidget(Interface, Widget);
bool StringEdited = !StringsEqual(*Value, State->EditString);
PrintF(Value, "%S", State->EditString); PrintF(Value, "%S", State->EditString);
return StringEdited;
} }
internal u64 internal u64

View File

@ -46,6 +46,20 @@ GET_FILE_INFO(Win32GetFileInfo)
} }
CloseHandle(FileHandle); CloseHandle(FileHandle);
} }
else
{
DWORD FileAttr = GetFileAttributes(Path.Str);
if (FileAttr != INVALID_FILE_ATTRIBUTES &&
(FileAttr & FILE_ATTRIBUTE_DIRECTORY))
{
Result.Path = Path;
Result.IsDirectory = true;
}
else
{
// Path is not a file or directory
}
}
return Result; return Result;
} }

View File

@ -9,6 +9,7 @@
# pragma GCC diagnostic ignored "-Wunused-value" # pragma GCC diagnostic ignored "-Wunused-value"
# pragma GCC diagnostic ignored "-Wvarargs" # pragma GCC diagnostic ignored "-Wvarargs"
# pragma GCC diagnostic ignored "-Wwritable-strings" # pragma GCC diagnostic ignored "-Wwritable-strings"
# pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#endif #endif
#if defined(_MSC_VER) #if defined(_MSC_VER)