Windows: Skip cmd for release builds (#5416)
authoradrido <robots_only_adrido@gmx.com>
Fri, 7 Apr 2017 05:14:39 +0000 (07:14 +0200)
committerLoïc Blot <nerzhul@users.noreply.github.com>
Fri, 7 Apr 2017 05:14:39 +0000 (07:14 +0200)
CMakeLists.txt
src/CMakeLists.txt
src/defaultsettings.cpp
src/main.cpp
src/porting.cpp
src/porting.h

index b804cf5b69517b869c2e8256766fc0e7ad330cc8..aa7deaa11169b7bcbd279ff952f30d064f9dd336 100644 (file)
@@ -49,7 +49,6 @@ if(NOT CMAKE_BUILD_TYPE)
        set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type: Debug or Release" FORCE)
 endif()
 
-
 # Included stuff
 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
 
index e11c32df9e573ff7ce69a5d5f8d7206f17d872ff..edb291545052974ad018995146a97bb49dedc39f 100644 (file)
@@ -709,7 +709,11 @@ if(MSVC)
        # EHa enables SEH exceptions (used for catching segfaults)
        set(CMAKE_CXX_FLAGS_RELEASE "/EHa /Ox /GL /FD /MT /GS- /Zi /arch:SSE /fp:fast /D NDEBUG /D _HAS_ITERATOR_DEBUGGING=0 /TP")
        #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
-       set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /DEBUG /OPT:REF /OPT:ICF")
+       set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /INCREMENTAL:NO /DEBUG /OPT:REF /OPT:ICF")
+
+
+       set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
+
 
        set(CMAKE_CXX_FLAGS_SEMIDEBUG "/MDd /Zi /Ob0 /O1 /RTC1")
 
@@ -759,6 +763,10 @@ else()
        if(USE_GPROF)
                set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
        endif()
+
+       if(MINGW)
+               set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -mwindows")
+       endif()
 endif()
 
 
index 3f4ce6337ac37b1c13a442d877a1dc981a4a8bab..52ff4c068a237958749425effbd1f2b9624fda15 100644 (file)
@@ -350,6 +350,7 @@ void set_default_settings(Settings *settings)
        settings->setDefault("server_description", "");
 
        settings->setDefault("high_precision_fpu", "true");
+       settings->setDefault("enable_console", "false");
 
 #ifdef __ANDROID__
        settings->setDefault("screenW", "0");
index 3599a36ce055138a4e4a05d22027162bd2767b3f..1ec278981bdc37ae82732bb2f0a72cef7477ec7c 100644 (file)
@@ -17,9 +17,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
 
-// This would get rid of the console window
-//#pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup")
-
 #include "irrlicht.h" // createDevice
 
 #include "mainmenumanager.h"
@@ -44,6 +41,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "gameparams.h"
 #include "database.h"
 #include "config.h"
+#include "porting.h"
 #if USE_CURSES
        #include "terminal_chat_console.h"
 #endif
@@ -134,7 +132,6 @@ static OptionList allowed_options;
 int main(int argc, char *argv[])
 {
        int retval;
-
        debug_set_exception_handler();
 
        g_logger.registerThread("Main");
@@ -145,11 +142,15 @@ int main(int argc, char *argv[])
        if (!cmd_args_ok
                        || cmd_args.getFlag("help")
                        || cmd_args.exists("nonopt1")) {
+               porting::attachOrCreateConsole();
                print_help(allowed_options);
                return cmd_args_ok ? 0 : 1;
        }
+       if (cmd_args.getFlag("console"))
+               porting::attachOrCreateConsole();
 
        if (cmd_args.getFlag("version")) {
+               porting::attachOrCreateConsole();
                print_version();
                return 0;
        }
@@ -191,6 +192,9 @@ int main(int argc, char *argv[])
        if (!init_common(cmd_args, argc, argv))
                return 1;
 
+       if (g_settings->getBool("enable_console"))
+               porting::attachOrCreateConsole();
+
 #ifndef __ANDROID__
        // Run unit tests
        if (cmd_args.getFlag("run-unittests")) {
@@ -200,9 +204,13 @@ int main(int argc, char *argv[])
 
        GameParams game_params;
 #ifdef SERVER
+       porting::attachOrCreateConsole();
        game_params.is_dedicated_server = true;
 #else
-       game_params.is_dedicated_server = cmd_args.getFlag("server");
+       const bool isServer = cmd_args.getFlag("server");
+       if (isServer)
+               porting::attachOrCreateConsole();
+       game_params.is_dedicated_server = isServer;
 #endif
 
        if (!game_configure(&game_params, cmd_args))
@@ -303,6 +311,8 @@ static void set_allowed_options(OptionList *allowed_options)
                        _("Set password"))));
        allowed_options->insert(std::make_pair("go", ValueSpec(VALUETYPE_FLAG,
                        _("Disable main menu"))));
+       allowed_options->insert(std::make_pair("console", ValueSpec(VALUETYPE_FLAG,
+               _("Starts with the console (Windows only)"))));
 #endif
 
 }
index 4786a2a390967183752eb8374475889a5a8f9a4a..9d859da7da8d5832e960fcb7e5d93e9b752318b9 100644 (file)
@@ -929,4 +929,18 @@ bool secure_rand_fill_buf(void *buf, size_t len)
 
 #endif
 
+void attachOrCreateConsole(void)
+{
+#ifdef _WIN32
+       static bool consoleAllocated = false;
+       const bool redirected = (_fileno(stdout) == -2 || _fileno(stdout) == -1); // If output is redirected to e.g a file
+       if (!consoleAllocated && redirected && (AttachConsole(ATTACH_PARENT_PROCESS) || AllocConsole())) {
+               freopen("CONOUT$", "w", stdout);
+               freopen("CONOUT$", "w", stderr);
+               consoleAllocated = true;
+       }
+#endif
+}
+
+
 } //namespace porting
index 902547ea9790fb8b4af53892403465dd5016ddc8..aa389d02ce7a016205f361e37647725fc8c7b4c5 100644 (file)
@@ -377,6 +377,9 @@ bool setXorgWindowIconFromPath(IrrlichtDevice *device,
 void setWin32ExceptionHandler();
 
 bool secure_rand_fill_buf(void *buf, size_t len);
+
+// This attaches to the parents process console, or creates a new one if it doesnt exist.
+void attachOrCreateConsole(void);
 } // namespace porting
 
 #ifdef __ANDROID__