Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Compile NGINX with Visual Studio

I have 2 questions regarding NGINX:

  1. Is there any one who had already compile NGINX with Visual Studio? I want create a VS9 Project for compiling NGINX.

  2. It's my veritable need, is there any way to compile NGINX as Lib or DLL?

like image 252
dectroo Avatar asked Jan 31 '14 17:01

dectroo


1 Answers

I just finished building a Visual Studio 2010 project for nginx. The process wasn't entirely straight-forward, so I will attempt to detail everything I've learned. This is a several-hour to several day process, depending on your experience.

Step 1: You must first follow the Guide for building nginx on windows. This not only builds nginx, but also creates .c and .h files that you will use when creating your Visual Studio project. It won't work without these files. (For more information, see here.)

If you are less experienced with Unix like me, the guide above leaves some unanswered questions. So I'll first flesh out that guide with tips of my own, and then later, tell you more about creating a project for Visual Studio.

Part I: Compiling nginx for windows using MSYS

First, follow all the steps given above. Install MSYS, Strawberry Perl, Mercurial, and download the PCRE, zlib, and OpenSSL libraries. Then follow these steps:

1) Open a command prompt As Administrator. Then run your Visual Studio vc\vcvarsall.bat file to set your environment variables to use VC as the compiler. Your paths will be different, but the command I used was:

"C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"

I found that even though the Strawberry Perl added 3 paths (which you can verify by examining your PATH variable), it still was using the wrong Perl.

2) Launch MSys by running msys.bat. For me, MSys was installed inside of the MinGW directory, so my path was: C:\MinGW\msys\1.0\msys.bat

If successful, you should see something like this in green: JensenV@AVWMA047LB ~ (except with your username@networkaddress instead) in a window called something like MINGW32:~

You might be wondering where your 'home folder is. It's under msys\1.0\home. So on my system, it's here: C:\MinGW\msys\1.0\home\JensenV

If you do "ls" or "dir" this is the directory you're in initially.

3) Assuming you installed Mercurial as instructed above, you should now be able to check out ngynx source: hg clone http://hg.nginx.org/nginx

This will go into the directory mentioned above.

4) You need to make sure the version of perl being used is strawberry perl, NOT the version that comes with msys. Type: which perl

If you get something like "/bin/perl.exe" that's the wrong perl and you need to fixing your paths. You can either mess with this (as I did, unsuccessfully) OR you can just disable the version of perl that comes with msys. I just renamed perl.exe to perl_UNUSED.exe in my msys install:

C:\MinGW\msys\1.0\bin

Whatever you do, make sure "which perl" shows the path to Strawberry Perl before proceeding.

5) Also renamed "link.exe" in my msys\1.0\bin directory: C:\MinGW\msys\1.0\bin so that it's unused. (i.e. rename it to "link_UNUSED.exe")

I believe this is because, in Step 1 above, your "vcvarsall.bat" set everything to use Microsoft C's compiler/linker, but then in Step 2, the linker was changed to use the Msys one instead. You need to use the Microsoft one.

To verify renaming as "link_UNUSED.exe" was successful, type: which link and ensure it points to your Visual Studio 10 link, not the link.exe that came with msys.

6) First "cd nginx" then create an objs/lib folder tree inside of the nginx folder. Untar/unzip pcre, zlib, and openssl in here as mentioned in the guide.

7) While your current directory is still nginx, run nginx's autoconfigure script, but first modify the command below to change the paths for sopenssl, pcre, and zlib to be correct for what you installed in objs/lib (your version numbers may be different). The command I used was:

auto/configure --with-cc=cl --builddir=objs --prefix= \
--conf-path=conf/nginx.conf --pid-path=logs/nginx.pid \
--http-log-path=logs/access.log --error-log-path=logs/error.log \
--sbin-path=nginx.exe --http-client-body-temp-path=temp/client_body_temp \
--http-proxy-temp-path=temp/proxy_temp \
--http-fastcgi-temp-path=temp/fastcgi_temp \
--with-cc-opt=-DFD_SETSIZE=1024 \
--with-pcre=objs/lib/pcre-8.33 \
--with-zlib=objs/lib/zlib-1.2.8 \
--with-openssl=objs/lib/openssl-1.0.1f \
--with-select_module --with-http_ssl_module --with-ipv6

If you want to change any configuration options, NOW IS THE TIME. These options affect the generated .c and .h files that you will use later in creating your Visual Studio project, and trust me, you don't want to have to redo that later when you realize you need different options.

7) Make it.

nmake -f objs/Makefile

If successful, your freshly compiled nginx.exe should be inside your home\YourUsername\nginx\objs folder. i.e. something like: C:\MinGW\msys\1.0\home\JensenV\nginx\objs

In addition, these files will now be in the same folder as nginx.exe: ngx_auto_config.h ngx_auto_headers.h ngx_modules.c ngx_pch.c

You will use these in creating your Visual Studio project.

8) Have a beer.

**

Part II: Creating the Visual Studio nginx Project

**

Create an empty Visual Studio project for Command Line application. Save the project inside your nginx folder (root level). Note that before this step you can move your nginx folder outside of msys to wherever you want to keep it.

1) Go to Properties -> VC++ Directories and add these Include Directories:

$(MSBuildProjectDirectory)\src\core $(MSBuildProjectDirectory)\src\event $(MSBuildProjectDirectory)\src\event\modules $(MSBuildProjectDirectory)\src\http $(MSBuildProjectDirectory)\src\http\modules $(MSBuildProjectDirectory)\src\http\modules\perl $(MSBuildProjectDirectory)\src\mail $(MSBuildProjectDirectory)\src\misc $(MSBuildProjectDirectory)\src\mysql $(MSBuildProjectDirectory)\src\os $(MSBuildProjectDirectory)\objs $(MSBuildProjectDirectory)\src\os\win32 $(MSBuildProjectDirectory)\objs\lib\openssl\ssl\include $(MSBuildProjectDirectory)\objs\lib\zlib $(MSBuildProjectDirectory)\objs\lib\pcre

NOTE: Before this step I went into objs/lib and removed the version numbers from the zlib, pcre, and ssl folders. Either you should do this to, OR you should modify the paths above to match your installed versions. I removed the version numbers so that I can update to newer versions of these libraries in the future without breaking my project.

Click on the "Macros >>" button and verify that the MSBuildProjectDirectory path is a path to your nginx folder.

2) Likewise add these paths to your Library Directories:

$(MSBuildProjectDirectory)\objs\lib\openssl\ssl\lib\ $(MSBuildProjectDirectory)\objs\lib\pcre\ $(MSBuildProjectDirectory)\objs\lib\zlib\

Again, modify these paths to include version numbers if your objs/lib folder's contents still have version numbers.

3) Change these Project Properties as follows:

C/C++ General: Set "Treat warnings as errors" to No (WX-) Preprocessor: Add these Preprocessor Definitions: WIN32 NGX_WIN32 NGX_MAIL_SSL NO_SYS_TYPES_H FD_SETSIZE=1024

Linker: Input: Add the following to Additional Dependencies: ws2_32.lib pcre.lib ssleay32.lib libeay32.lib crypt32.lib zlib.lib

4) Close your Visual Studio solution. Open up the project file (ends in .vcxproj) with a good text editor, such as Notepad++. (Make a backup copy of it first, in case anything goes wrong.) Also open up nginx\objs\makefile with a text editor.

In the makefile, not too far from the top, you'll see a section that starts something like this:

objs/nginx.exe: objs/src/core/nginx.obj \ objs/src/core/ngx_log.obj \ objs/src/core/ngx_palloc.obj \ objs/src/core/ngx_array.obj \ .... objs/ngx_modules.obj \ objs/nginx.res \ objs/lib/pcre-8.33/pcre.lib \ objs/lib/zlib-1.2.8/zlib.lib $(LINK) @<<

Likewise, in the Visual Studio file, if you've added any source code (add any files you want prior to this step, so you can see what I'm talking about) you'll see something like this:

Create a new document containing just the .obj files from the makefile. Use Search & Replace in a text editor to modify them to match the format of the Visual Studio project file instead (so ending in .c /> instead of with .obj \, and starting with

Also don't forget to change the forward slashes to backslashes. Don't include the zlib.lib or pcre.lib lines. I forget if you should include nginx.res. (Probably not.)

Once you're sure the format is right, save your Visual Studio project and try opening it. If all the files from the makefile show up in your project, you did it correctly.

5) Remember those special .c and .h files that nginx created when you built the exe? You want to add them to your project now, too. Add these guys:

ngx_modules.c ngx_pch.c

6) Now you're ready to compile!

I've honestly probably forgotten something along the way, so you might still have some linker or compile errors to fix, but this should give you a good start!

NOTE: If you want to change which options are included in nginx, you'll have to do a new auto/configure in Part I above, a new nmake, and then include additional source code in you Visual Studio project, and use the newly generated ngx_modules.c and ngx_pch.c files in your Visual Studio project.

like image 143
Vern Jensen Avatar answered Sep 20 '22 19:09

Vern Jensen