[PATCH] Fix to support old version of crtdefs.h

HAYASHI Kentaro hayashi at clear-code.com
Thu Aug 2 03:31:59 UTC 2012


I attached a patch for fixing build problem (_CRT_SECURE_NO_DEPRECATE)
 with Visual Studio 2005 Express.

The problem is that old version of crtdefs.h uses _CRT_SECURE_NO_DEPRECATE 
(instead of _CRT_SECURE_NO_WARNINGS) for eliminating the warnings.

see: http://social.msdn.microsoft.com/forums/en-US/vcgeneral/thread/3373dd77-ed73-44a6-a52c-53dfd95099ac/

The purpose of this patch is supporting old version of crtdefs.h 
by adding definition about _CRT_SECURE_NO_DEPRECATE.

As a result, nmake build process succeeds with Visual Studio 2005 Express under Wine.

* I used Wine to setup old version of crtdefs.h.
* I confirmed that VS2005 Express and VS2005 Express SP1 uses old version of crtdefs.h.
  (It seems that VS2005 Express SP1 with latest hotfix use newer version of crtdefs.h)
* I confirmed that this patch does not affects build process 
  even if newer version of crtdefs.h is used.

I hope that this patch will be applied to nginx mainstream.

Index: src/os/win32/ngx_win32_config.h
--- src/os/win32/ngx_win32_config.h	(revision 4778)
+++ src/os/win32/ngx_win32_config.h	(working copy)
@@ -19,6 +19,11 @@
 /* enable getenv() and gmtime() in msvc8 */
+/* support old version of crtdefs.h in msvc8 */
+#if (_MSC_VER == 1400)
  * we need to include <windows.h> explicitly before <winsock2.h> because
  * the warning 4201 is enabled in <windows.h>

I wrote how to reproduce the problem and details.

Steps to reproduce the problem:

1) Install Wine 1.4 on Ubuntu 12.04 LTS.
 % sudo apt-get install wine winetricks

2) Setup WINE related environment variables.

 % export WINPREFIX=$HOME/.win32en
 % export WINEARCH=win32

3) Install MFC42 and .NET 2.0 under Wine.

 % winetricks --no-isolate -q mfc42 dotnet20

4) Install Visual Studio 2005 Express under Wine.
 % winetricks --no-isolate -q vc2005express

5) Install Windows SDK under Wine.
 % winetricks --no-isolate -q psdkwin7

6) Make symlink cl and rc to pass auto/configure compiler
check (this is ad-hoc way, but just works).

 % cd $HOME/.wine32en/drive_c/Program Files/Microsoft Visual Studio 8/VC/bin
 % ln -sf cl.exe cl
 % ln -sf rc.exe rc

7) Generate Makefile by executing following command to build minimum
nginx binary.

 % auto/configure --crossbuild=win32 --with-cc=cl \
   --without-http_rewrite_module --without-http_gzip_module

8) Execute nmake.exe

 % nmake.exe

What happened:

Make process was failed. Warning is treated as error:

---Start Here---
	cl -c -O2  -W4 -WX -nologo -MT -Yungx_config.h -Fpobjs/ngx_config.pch -I src/core  -I src/event  -I src/event/modules  -I src/os/win32  -I objs  -I src/http  -I src/http/modules  -I src/mail  -Foobjs/src/core/nginx.obj  src/core/nginx.c
fixme:file:NeedCurrentDirectoryForExePathW (L"cl"): partial stub
src/core/nginx.c(424) : error C2220: warning treated as error - no 'object' file generated
src/core/nginx.c(424) : warning C4996: 'getenv' was declared deprecated
        C:\Program Files\Microsoft Visual Studio 8\VC\include\stdlib.h(483) : see declaration of 'getenv'
        Message: 'This function or variable may be unsafe. Consider using _dupenv_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'
NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio 8\VC\bin\cl.EXE"' : return code '0x2'
NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio 8\VC\bin\nmake.exe"' : return code '0x2'
---End Here---


HAYASHI Kentaro <hayashi at clear-code.com>

More information about the nginx-devel mailing list