PHP 소스를 윈도우 환경에서 빌드하기
저도 ^^ PHP 빌드를 한번 시도해 보았습니다. 전체적인 내용은 아래의 Wiki 문서에 기반하고 있습니다.
Build your own PHP on Windows
; https://wiki.php.net/internals/windows/stepbystepbuild
처음부터 괜히 고생하지 않기 위해 Visual Studio 2010에서의 컴파일은 일단 포기하고, 위의 문서에서 요구하는 대로 Visual C++ 2008과 Windows SDK까지 맞춰서 설치를 했습니다.
Windows SDK for Windows Server 2008 and .NET Framework 3.5
; http://www.microsoft.com/downloads/en/details.aspx?FamilyID=e6e1c3df-a74f-4207-8586-711ebe331cdc&displaylang=en
이제, 빌드를 위한 폴더 구조를 잡아야 하는데요. 일단 모든 소스코드 환경을 담기 위해 "d:\phpbuild" 폴더를 생성해 두었습니다.
그다음, 첫 번째 작업으로 아래의 php-sdk-binary-tools-20110512.zip을 다운로드해서 압축을 해제하는데 "d:\phpbuild" 하위에 구성합니다.
php-sdk-binary-tools-20110512.zip
; http://windows.php.net/downloads/php-sdk/
여기까지, 일단 제 빌드 폴더 구성은 다음과 같습니다.
이제, "시작" / "Microsoft Windows SDKK v6.1" / "CMD Shell" 명령어를 실행시키고, 다음의 명령어들을 차례로 실행해 줍니다.
setenv /x86 /xp /release (디버그 모드: setenv /x86 /xp /debug)
cd /d d:\phpbuild
.\bin\phpsdk_setvars.bat
.\bin\phpsdk_buildtree.bat php53dev
아래는 제 경우에 실행해 본 화면 사례입니다.
그리고, 아래는 위의 작업까지 진행했을 때의 폴더 구조입니다.
다음으로, PHP 소스 코드를 다운로드 받습니다.
PHP 5.3.6 (tar.gz)
; http://www.php.net/downloads.php
D:\phpbuild\php53dev\vc9\x86 폴더 하위에 PHP 5.3.6 소스 코드를 풀어 놓아서, 이제 폴더 구조는 아래와 같이 구성됩니다.
아직 제가 PHP에 대해서는 ^^; 아무것도 모르기 때문에 deps 폴더에는 별다르게 파일들을 추가하지는 않았습니다.
처음 부분에서 준비를 해 두었던 '명령행 윈도우'로 돌아가서, 다음과 같은 명령어들을 차례대로 실행해 줍니다.
d:\phpbuild>cd D:\phpbuild\php53dev\vc9\x86\php-5.3.6
D:\phpbuild\php53dev\vc9\x86\php-5.3.6>buildconf
Rebuilding configure.js
Now run 'configure --help'
D:\phpbuild\php53dev\vc9\x86\php-5.3.6>configure --disable-all --enable-cli (디버그 모드인 경우, --enable-debug 옵션 추가)
Saving configure options to config.nice.bat
Checking for cl.exe ... <in default path>
Detected compiler MSVC9 (Visual C++ 2008)
Detected 32-bit compiler
Checking for link.exe ... d:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\Bin
Checking for nmake.exe ... <in default path>
Checking for lib.exe ... <in default path>
Checking for bison.exe ... <in default path>
Checking for re2c.exe ... <in default path>
Detected re2c version 0.13.5
Checking for zip.exe ... <in default path>
Checking for lemon.exe ... <not found>
Checking for mc.exe ... D:\Program Files\Microsoft SDKs\Windows\v6.1\Bin\x64
Checking for mt.exe ... D:\Program Files\Microsoft SDKs\Windows\v6.1\Bin\x64
Build dir: Release_TS
PHP Core: php5ts.dll and php5ts.lib
Checking for wspiapi.h ... <in default path>
Enabling IPv6 support
Enabling SAPI sapi\cli
Enabling extension ext\date
Enabling extension ext\ereg
Enabling extension ext\pcre
Enabling extension ext\reflection
Enabling extension ext\spl
Checking for timelib_config.h ... ext/date/lib
Enabling extension ext\standard
Creating build dirs...
Generating files...
Generating Makefile
Generating main/internal_functions.c
Generating main/config.w32.h
Generating phpize
Done.
Enabled extensions:
-----------------------
| Extension | Mode |
-----------------------
| date | static |
| ereg | static |
| pcre | static |
| reflection | static |
| spl | static |
| standard | static |
-----------------------
Enabled SAPI:
-------------
| Sapi Name |
-------------
| cli |
-------------
-------------------------------------------
| | |
-------------------------------------------
| Build type | Release |
| Thread Safety | Yes |
| Compiler | MSVC9 (Visual C++ 2008) |
| Architecture | x86 |
-------------------------------------------
Type 'nmake' to build PHP
D:\phpbuild\php53dev\vc9\x86\php-5.3.6>
이것으로 준비는 모두 끝났고, 마지막으로 nmake를 실행해주면 빌드가 됩니다. 인텔 i7 컴퓨터의 Hyper-V Virtual Machine 환경에서 약 2분 30초 정도 걸렸습니다.
빌드 완료 후, "D:\phpbuild\php53dev\vc9\x86\php-5.3.6\Release_TS" 폴더(디버그인 경우 Debug_TS)가 생성되어 있는 것을 볼 수 있는데, 바로 그 폴더가 ("
.NET 개발자가 처음 설치해 본 Apache + PHP" 글에서 알아본) phpmodule 디렉터리에 넣을 내용이 되는 것입니다.
그런데, 음... ^^; 생각보다 기본 빌드 구성으로는 많이 빠져있는 것 같습니다. 예를 들어, Apache의 httpd.conf 파일 내에 LoadModule로 지정한 php5apache2_2.dll 파일도 없습니다. 그 부분은 천천히 살펴봐야겠습니다. ^^
참고 사항 1: 다음과 같은 컴파일 오류가 발생한다면?
ext\standard\browscap.c(61) : error C2001: newline in constant
ext\standard\browscap.c(62) : warning C4305: '=' : truncation from 'int' to 'char'
ext\standard\browscap.c(62) : error C2146: syntax error : missing ';' before identifier 't'
ext\standard\browscap.c(89) : error C2001: newline in constant
ext\standard\browscap.c(90) : error C2146: syntax error : missing ':' before identifier 't'
ext\standard\browscap.c(91) : error C2001: newline in constant
ext\standard\browscap.c(92) : warning C4305: '=' : truncation from 'int' to 'char'
ext\standard\browscap.c(92) : error C2143: syntax error : missing ';' before 'break'
ext\standard\browscap.c(100) : error C2001: newline in constant
ext\standard\browscap.c(102) : warning C4305: '=' : truncation from 'int' to 'char'
ext\standard\browscap.c(102) : error C2146: syntax error : missing ';' before identifier 't'
NMAKE : fatal error U1077: '"d:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\Bin\cl.exe"' : return code '0x2'
Stop.
아래의 글에서처럼 개행 문자를 일일이 소스 코드마다 다시 편집해주는 것도 가능하겠지만,
Compiler Error C2001
; https://docs.microsoft.com/en-us/cpp/error-messages/compiler-errors-1/compiler-error-c2001
PRB: C2001: Newline in Constant for a String on Multiple Lines
; http://support.microsoft.com/kb/40160/en-us
저는 포기했습니다. 검색해 보니, 다음과 같은 글이 나오는데요.
Bug #50112 - compile error with Non-English Operating system
; http://bugs.php.net/bug.php?id=50112
댓글에 보면, 다음과 같은 해답이 나옵니다.
[2010-09-13 07:05 UTC] liuranball at gmail dot com
I just use the 0xA7 to instead of 'signum sectionis' can fix it.
0xa7로 어떻게 바꾸는지 몰라서, 저는 그냥 제어판의 "Region and Language" / "Administrative" / "Language for non-Unicode programs" 설정을 "English (United States)"로 바꿨습니다. (재부팅 해야 합니다. ^^;)
참고 사항 2: configure --help
D:\phpbuild\php53dev\vc9\x86\php-5.3.6>configure --help
Options that enable extensions and SAPI will accept 'yes' or 'no' as a
parameter. They also accept 'shared' as a synonym for 'yes' and request a
shared build of that module. Not all modules can be built as shared modules;
configure will display [shared] after the module name if can be built that
way.
--enable-snapshot-build Build a snapshot; turns on everything it can
and ignores build errors
--enable-one-shot Optimize for fast build - best for release and
snapshot builders, not so hot for
edit-and-rebuild hacking
--with-cygwin Path to cygwin utilities on your system
--enable-object-out-dir Alternate location for binary objects during
build
--enable-debug Compile with debugging symbols
--enable-debug-pack Release binaries with external debug symbols
(--enable-debug must not be specified)
--disable-zts Thread safety
--with-prefix where PHP will be installed
--with-mp Tell VC9+ use up to [n,auto,disable] processes
for compilation
--with-php-build Path to where you extracted the development
libraries
(http://wiki.php.net/internals/windows/libs).
Assumes that it is a sibling of this source
dir (..\deps) if not specified
--with-extra-includes Extra include path to use when building
everything
--with-extra-libs Extra library path to use when linking
everything
--disable-ipv6 Disable IPv6 support (default is turn it on if
available)
--enable-fd-setsize Set maximum number of sockets for select(2)
--enable-zend-multibyte Enable Zend multibyte encoding support
--with-snapshot-template Path to snapshot builder template dir
--enable-security-flags Enable the compiler security flags
--enable-static-analyze Enable the VC compiler static analyze
--with-aolserver Build AOLserver support
--enable-apache Build Apache 1.3.x version of PHP
--with-apache-includes Where to find Apache 1.3 headers
--with-apache-libs Where to find Apache 1.3 libraries
--enable-apache2filter Build Apache 2.x filter
--enable-apache2-2filter Build Apache 2.2.x filter
--enable-apache2handler Build Apache 2.x handler
--enable-apache2-2handler Build Apache 2.2.x handler
--with-apache-hooks Build Apache 1.3.x (hooks) version of PHP
--disable-cgi Build CGI version of PHP
--disable-cli Build CLI version of PHP
--enable-crt-debug Enable CRT memory dumps for debugging sent to
STDERR
--enable-cli-win32 Build console-less CLI version of PHP
--enable-embed Embedded SAPI library
--enable-isapi Build ISAPI version of PHP
--enable-nsapi Build NSAPI for Netscape/iPlanet/SunONE
webservers
--with-nsapi-includes Where to find NSAPI headers
--with-nsapi-libs Where to find NSAPI libraries
--with-pi3web Pi3Web
--disable-bcmath bc style precision math functions
--with-bz2 BZip2
--disable-calendar calendar conversion support
--disable-com-dotnet COM and .Net support
--disable-ctype ctype
--with-curl cURL support
--with-dba DBA support
--with-enchant Enchant Support
--without-ereg POSIX extended regular expressions
--enable-fileinfo fileinfo support
--disable-filter Filter Support
--disable-ftp ftp support
--without-gd Bundled GD support
--without-t1lib t1lib support
--with-gettext gettext support
--with-gmp Include GNU MP support.
--disable-hash enable hash support
--with-mhash mhash support
--without-iconv iconv support
--with-imap IMAP Support
--with-interbase InterBase support
--enable-intl Enable internationalization support
--disable-json JavaScript Object Serialization support
--with-ldap LDAP support
--enable-mbstring multibyte string functions
--enable-mbregex multibyte regex support
--disable-mbregex-backtrack check multibyte regex backtrack
--with-mcrypt mcrypt support
--with-mssql mssql support
--with-dblib mssql support with freetds
--without-mysqlnd Mysql Native Client Driver
--with-oci8 OCI8 support
--with-oci8-11g OCI8 support using Oracle 11g Instant Client
--disable-odbc ODBC support
--with-openssl OpenSSL support
--with-pgsql PostgreSQL support
--with-pspell pspell/aspell (whatever it's called this
month) support
--disable-session session support
--enable-shmop shmop support
--with-snmp SNMP support
--enable-sockets SOCKETS support
--with-sqlite3 SQLite 3 support
--with-config-file-scan-dir Dir to check for additional php ini files
--with-sybase-ct SYBASE_CT support
--with-tidy TIDY support
--disable-tokenizer tokenizer support
--disable-zip ZIP support
--disable-zlib ZLIB support
--without-libxml LibXML support
--without-dom DOM support
--enable-exif exif
--with-mysql MySQL support
--with-mysqli MySQLi support
--enable-pdo Enable PHP Data Objects support
--with-pdo-dblib freetds dblib (Sybase, MS-SQL) support for PDO
--with-pdo-mssql Native MS-SQL support for PDO
--with-pdo-firebird Firebird support for PDO
--with-pdo-mysql MySQL support for PDO
--with-pdo-oci Oracle OCI support for PDO
--with-pdo-odbc ODBC support for PDO
--with-pdo-pgsql PostgreSQL support for PDO
--with-pdo-sqlite for pdo_sqlite support
--with-pdo-sqlite-external for pdo_sqlite support from an external dll
--disable-phar disable phar support
--enable-phar-native-ssl enable phar with native OpenSSL support
--without-simplexml Simple XML support
--enable-soap SOAP support
--with-sqlite SQLite support
--without-wddx WDDX support
--without-xml XML support
--disable-xmlreader XMLReader support
--with-xmlrpc XMLRPC-EPI support
--disable-xmlwriter XMLWriter support
--with-xsl xsl support
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]