[cmake] win32.cmake: Enable secure template overloads.
authorDavid Korth <gerbilsoft@gerbilsoft.com>
Sat, 5 Sep 2015 03:40:02 +0000 (23:40 -0400)
committerDavid Korth <gerbilsoft@gerbilsoft.com>
Sat, 5 Sep 2015 03:40:02 +0000 (23:40 -0400)
This allows MSVC to silently replace certain "unsafe" functions,
e.g. memcpy(), with Microsoft's "secure" versions, e.g. memcpy_s(),
without making any code changes.

MinGW also supports this, though it didn't seem to do anything in my
tests, probably because I'm still targetting the base MSVCRT.DLL.

Moved common Win32 CFLAGS out of the compiler-specific .cmake files
and into win32.cmake.

cmake/platform/win32-gcc.cmake
cmake/platform/win32-msvc.cmake
cmake/platform/win32.cmake

index 1cc040c..a69ac9e 100644 (file)
@@ -1,14 +1,10 @@
 # Win32-specific CFLAGS/CXXFLAGS.
 # For MinGW compilers.
 
-# Basic platform flags:
+# Basic platform flags for gcc:
 # - wchar_t is short.
-# - Enable strict type checking in the Windows headers.
-# - Set minimum Windows version to Windows 2000. (Windows NT 5.0)
-# - Define WIN32_LEAN_AND_MEAN to reduce the number of Windows headers included.
-# - Define NOMINMAX to disable the MIN() and MAX() macros.
 # - Enable MSVC 2005 compatibility. (In MinGW-w64 v4.0.2, this enables 64-bit time_t.)
-SET(GENS_C_FLAGS_WIN32 "-fshort-wchar -DSTRICT -DWIN32_LEAN_AND_MEAN -DNOMINMAX -D__MINGW_USE_VC2005_COMPAT")
+SET(GENS_C_FLAGS_WIN32 "${GENS_C_FLAGS_WIN32} -D__MINGW_USE_VC2005_COMPAT")
 
 # Subsystem and minimum Windows version:
 # - If 32-bit and ANSI Windows support is enabled: 4.00
@@ -100,7 +96,7 @@ SET(CMAKE_RC_COMPILE_OBJECT
 
 # Append the CFLAGS and LDFLAGS.
 SET(GENS_C_FLAGS_COMMON                        "${GENS_C_FLAGS_COMMON} ${GENS_C_FLAGS_WIN32}")
-SET(GENS_CXX_FLAGS_COMMON              "${GENS_CXX_FLAGS_COMMON} ${GENS_C_FLAGS_WIN32}")
+SET(GENS_CXX_FLAGS_COMMON              "${GENS_CXX_FLAGS_COMMON} ${GENS_C_FLAGS_WIN32} ${GENS_CXX_FLAGS_WIN32}")
 SET(GENS_EXE_LINKER_FLAGS_COMMON       "${GENS_EXE_LINKER_FLAGS_COMMON} ${GENS_EXE_LINKER_FLAGS_WIN32}")
 SET(GENS_SHARED_LINKER_FLAGS_COMMON    "${GENS_SHARED_LINKER_FLAGS_COMMON} ${GENS_SHARED_LINKER_FLAGS_WIN32}")
 
index 7ccf280..047bc9b 100644 (file)
@@ -1,12 +1,9 @@
 # Win32-specific CFLAGS/CXXFLAGS.
 # For Microsoft Visual C++ compilers.
 
-# Basic platform flags:
+# Basic platform flags for MSVC:
 # - wchar_t should be a distinct type.
-# - Enable strict type checking in the Windows headers.
-# - Define WIN32_LEAN_AND_MEAN to reduce the number of Windows headers included.
-# - Define NOMINMAX to disable the MIN() and MAX() macros.
-SET(GENS_C_FLAGS_WIN32 "-Zc:wchar_t -DSTRICT -DWIN32_LEAN_AND_MEAN -DNOMINMAX")
+SET(GENS_C_FLAGS_WIN32 "${GENS_C_FLAGS_WIN32} -Zc:wchar_t")
 
 # Disable ANSI Windows support if:
 # - We're building for 64-bit.
@@ -60,7 +57,7 @@ ENDIF(CMAKE_BUILD_TYPE MATCHES ^release)
 
 # Append the CFLAGS and LDFLAGS.
 SET(GENS_C_FLAGS_COMMON                        "${GENS_C_FLAGS_COMMON} ${GENS_C_FLAGS_WIN32}")
-SET(GENS_CXX_FLAGS_COMMON              "${GENS_CXX_FLAGS_COMMON} ${GENS_C_FLAGS_WIN32}")
+SET(GENS_CXX_FLAGS_COMMON              "${GENS_CXX_FLAGS_COMMON} ${GENS_C_FLAGS_WIN32} ${GENS_CXX_FLAGS_WIN32}")
 SET(GENS_EXE_LINKER_FLAGS_COMMON       "${GENS_EXE_LINKER_FLAGS_COMMON} ${GENS_EXE_LINKER_FLAGS_WIN32}")
 SET(GENS_SHARED_LINKER_FLAGS_COMMON    "${GENS_SHARED_LINKER_FLAGS_COMMON} ${GENS_EXE_LINKER_FLAGS_WIN32}")
 
index 60bae7b..97c2a6d 100644 (file)
@@ -1,5 +1,22 @@
 # Win32-specific CFLAGS/CXXFLAGS.
-# Redirection module.
+
+# Basic platform flags:
+# - Enable strict type checking in the Windows headers.
+# - Define WIN32_LEAN_AND_MEAN to reduce the number of Windows headers included.
+# - Define NOMINMAX to disable the MIN() and MAX() macros.
+SET(GENS_C_FLAGS_WIN32 "-DSTRICT -DWIN32_LEAN_AND_MEAN -DNOMINMAX")
+
+# Enable secure template overloads for C++.
+# References:
+# - MinGW's _mingw_secapi.h
+# - http://msdn.microsoft.com/en-us/library/ms175759%28v=VS.100%29.aspx
+SET(GENS_CXX_FLAGS_WIN32 "-D_CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES=1")
+SET(GENS_CXX_FLAGS_WIN32 "${GENS_CXX_FLAGS_WIN32} -D_CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES_MEMORY=1")
+SET(GENS_CXX_FLAGS_WIN32 "${GENS_CXX_FLAGS_WIN32} -D_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1")
+SET(GENS_CXX_FLAGS_WIN32 "${GENS_CXX_FLAGS_WIN32} -D_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1")
+SET(GENS_CXX_FLAGS_WIN32 "${GENS_CXX_FLAGS_WIN32} -D_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_MEMORY=1")
+
+# Compiler-specific Win32 flags.
 IF(MSVC)
        INCLUDE(cmake/platform/win32-msvc.cmake)
 ELSE(MSVC)