| Author |  | 
| tanquang 
 
 
 Joined: 21 Mar 2020
 Posts: 73
 Location: Vietnam
 
 | 
|  Posted: Mon 14 Jun '21 5:09    Post subject: Building with cmake, expat and apr-iconv |   |  
| 
 |  
| Split from HOWTO: Building Apache and dependencies using CMake https://www.apachelounge.com/viewtopic.php?t=8609 
 CMake Warning: Manually-specified variables were not used by the project: INSTALL_MSVC_PDB when compile Jansson, Brotli, Lua and cURL!
 CMake Warning: Manually-specified variables were not used by the project: STATIC_LIB_SUFFIX when compile Nghttp2!
 Are you sure you don't need to add -DINSTALL_MSVC_PDB=OFF to Expat?
 |  | 
| Back to top |  | 
| tangent Moderator
 
 
 Joined: 16 Aug 2020
 Posts: 397
 Location: UK
 
 | 
|  Posted: Mon 14 Jun '21 22:27    Post subject: |   |  
| 
 |  
| Predictably, this CMake build process is work in progress, so I've not bothered too much about minor CMake warnings. 
 Each package development team uses different features in their CMakeLists.txt file, and not all of them support creating PDB files. So I nominally added INSTALL_MSVC_PDB to all CMake option sets, in case they choose to do so in the future. Looks like I missed out Expat.
 
 With regards to the STATIC_LIB_SUFFIX option with Nghttp2, it is used in lib/CMakeLists.txt when building a static library. At some point I was playing with building a static library with the ENABLE_STATIC_LIB option, so the suffix option is a hangover.
 |  | 
| Back to top |  | 
| tanquang 
 
 
 Joined: 21 Mar 2020
 Posts: 73
 Location: Vietnam
 
 | 
|  Posted: Mon 14 Jun '21 23:24    Post subject: |   |  
| 
 |  
| I followed the instructions you shared above, running build_all.bat using PowerShell (x64), but I use Visual Studio 2013 and Active Perl. However, I got the error after the compiler started for a while. Looks like it ran out of order so expat was ignored. 	  | Code: |  	  | EXPAT cannot be found | 
 Also, can you send me the full command line to compile apr-iconv? I got dizzy trying to filter out the apr-iconv compilation commands in the build_all.bat file.
   UPDATE: Probably only PCRE uses -DINSTALL_MSVC_PDB variable, other features all give warning -DINSTALL_MSVC_PDB is not used in project.
 |  | 
| Back to top |  | 
| tangent Moderator
 
 
 Joined: 16 Aug 2020
 Posts: 397
 Location: UK
 
 | 
|  Posted: Tue 15 Jun '21 22:00    Post subject: |   |  
| 
 |  
| As it stands, the build_all.bat script doesn't abort if it can't find a named package source; it simply carries on. 
 So regarding Expat, assuming you created a log file during your build, I'd guess it's missing the build details for Expat. It's currently the third package in the build list. Suggest you check the Expat version defined in your build_all.bat compared to the name of the extracted source folder. Expat is needed for apr-util, so that might be where your fatal error occurred.
 
 As far as apr-iconv goes, there isn't one single command line to build it, and there's no support for CMake. Agree it's complicated, but the details are commented to explain what's going on. We have to use various makefiles provided (four if I recall), to create the required libraries and then the various files for the iconv folder. Predictably, it took me a long time to crack building apr-iconv outside of Visual Studio.
 |  | 
| Back to top |  | 
| tanquang 
 
 
 Joined: 21 Mar 2020
 Posts: 73
 Location: Vietnam
 
 | 
|  Posted: Thu 17 Jun '21 19:23    Post subject: |   |  
| 
 |  
| I have checked the feature source folder name is the same as in build_all.bat however I have not checked the log file. I have a pretty complete build, just missing apr-iconv. I'm trying to filter the command line, pretty hard to find. |  | 
| Back to top |  | 
| James Blond Moderator
 
  
 Joined: 19 Jan 2006
 Posts: 7442
 Location: EU, Germany, Next to Hamburg
 
 | 
|  Posted: Thu 17 Jun '21 21:49    Post subject: |   |  
| 
 |  
|  	  | tanquang wrote: |  	  | I'm trying to filter the command line, pretty hard to find. | 
 
 You could use findstr(ing)
 
 
  	  | Code: |  	  | netstat -ano | findstr /R 0.0:80 && netstat -ano | findstr /R 0.0:443
 
 | 
 
 I do what for finding programs that block the internet ports.
 
 Another idea is to redirect the full output of the build script via ">> build.log" into a log file an exam that later on.
 |  | 
| Back to top |  | 
| tanquang 
 
 
 Joined: 21 Mar 2020
 Posts: 73
 Location: Vietnam
 
 | 
|  Posted: Fri 18 Jun '21 16:00    Post subject: |   |  
| 
 |  
| I build them on Windows, the ports are all unblocked. I mean here the apr-iconv compile statement. 	  | Quote: |  	  | I'm trying to filter the command line, pretty hard to find. | 
  |  | 
| Back to top |  | 
| James Blond Moderator
 
  
 Joined: 19 Jan 2006
 Posts: 7442
 Location: EU, Germany, Next to Hamburg
 
 |  | 
| Back to top |  | 
| tanquang 
 
 
 Joined: 21 Mar 2020
 Posts: 73
 Location: Vietnam
 
 | 
|  Posted: Tue 22 Jun '21 17:43    Post subject: |   |  
| 
 |  
| Do you have a command line that compiles with a makefile? |  | 
| Back to top |  | 
| tangent Moderator
 
 
 Joined: 16 Aug 2020
 Posts: 397
 Location: UK
 
 | 
|  Posted: Tue 22 Jun '21 20:14    Post subject: |   |  
| 
 |  
| @tanquang - you haven't said why you're failing to build apr-iconv using the above build_all.bat. 
 The section for building apr-iconv contains four specific nmake commands, against various package Makefiles, viz:
 
  	  | Code: |  	  | nmake /f apriconv.mak CFG="apriconv - !BUILD_CFG! %BUILD_TYPE%" & call :get_status nmake /f libapriconv.mak CFG="libapriconv - !BUILD_CFG! %BUILD_TYPE%" & call :get_status
 | 
 and  the following nmake in two different directories.
 
 
  	  | Code: |  	  | nmake /f Makefile.win BUILD_MODE="!BUILD_CFG! %BUILD_TYPE%" BIND_MODE="shared" & call :get_status | 
 What if any errors are you getting?
 
 Can I suggest you open your apr-iconv build problem as a separate topic, rather than adding to this topic which is primarily a How-to document.
 |  | 
| Back to top |  | 
| James Blond Moderator
 
  
 Joined: 19 Jan 2006
 Posts: 7442
 Location: EU, Germany, Next to Hamburg
 
 | 
|  Posted: Tue 22 Jun '21 22:03    Post subject: |   |  
| 
 |  
|  	  | Code: |  	  | nmake /f Makefile.win installr INSTDIR=C:/Apache24
 
 | 
 
 https://github.com/apache/httpd/blob/2.4.x/Makefile.win#L6
 
 I never compiled apr-iconv directly, since the Makefile.win compiles apr-iconv if it is present in the src folder and named apr-iconv.
 
 Unlike tangent in my compilation all folders in the src folder have no version number.
 |  | 
| Back to top |  | 
| glsmith Moderator
 
  
 Joined: 16 Oct 2007
 Posts: 2268
 Location: Sun Diego, USA
 
 | 
|  Posted: Wed 23 Jun '21 17:27    Post subject: |   |  
| 
 |  
| Everything has a version listed in a header file. 
 httpd: /include/ap_version.h
 
 in srclib/
 apr,apr-iconv,apr-util: their /include/ap(r|i|u)_version.h
 brotli: /include/brotli/brotliv.h
 curl: /include/curl/curlver.h
 jansson: /include/janson.h
 libexpat: /expat/lib/expat.h
 libxml2: /include/libxml/xmlversion.h
 lua: /src/lua.h
 nghttp2: /lib/includes/nghttp2/nghttp2ver.h
 openssl/libressl: /include/openssl/opensslv.h
 pcre: /pcre.h
 zlib: /zlib.h
 |  | 
| Back to top |  | 
| tangent Moderator
 
 
 Joined: 16 Aug 2020
 Posts: 397
 Location: UK
 
 | 
|  Posted: Wed 23 Jun '21 22:35    Post subject: |   |  
| 
 |  
| @glsmith - indeed, like other packages, apr-iconv has its version listed in a header file - .../include/ap(r|i|u)_version.h @James - agreed, the apr-iconv Makefiles expect to build with no version numbers in the relevant folders. I simply define one for the source folder to be consistent with all the other packages.
 
 However, my build batch file creates symlinks to folder names with no version, since this is what the Makefiles require, viz:
 
 
  	  | Code: |  	  | set APR=apr-1.7.0 set APR-ICONV=apr-iconv-1.2.2
 set APR-UTIL=apr-util-1.6.1
 ...
 rem Create non-version specific folder links to the APR, APR-ICONV and APR-UTIL sources.
 rem The various makefiles assume these exist.
 rem
 pushd "%BUILD_BASE%\..\src"
 mklink /d apr %APR% 1>nul 2>&1
 mklink /d apr-iconv %APR-ICONV% 1>nul 2>&1
 mklink /d apr-util %APR-UTIL% 1>nul 2>&1
 popd
 | 
 |  | 
| Back to top |  | 
| glsmith Moderator
 
  
 Joined: 16 Oct 2007
 Posts: 2268
 Location: Sun Diego, USA
 
 | 
|  Posted: Thu 24 Jun '21 0:54    Post subject: |   |  
| 
 |  
| Misunderstood I guess. 
 Yeah, Apache's makefile.win doesn't expect any folders to have versions numbers so you're not constantly having to modify it.
 |  | 
| Back to top |  | 
| tanquang 
 
 
 Joined: 21 Mar 2020
 Posts: 73
 Location: Vietnam
 
 | 
|  Posted: Fri 25 Jun '21 23:28    Post subject: |   |  
| 
 |  
|  	  | tangent wrote: |  	  | @tanquang - you haven't said why you're failing to build apr-iconv using the above build_all.bat. 
 The section for building apr-iconv contains four specific nmake commands, against various package Makefiles, viz:
 
  	  | Code: |  	  | nmake /f apriconv.mak CFG="apriconv - !BUILD_CFG! %BUILD_TYPE%" & call :get_status nmake /f libapriconv.mak CFG="libapriconv - !BUILD_CFG! %BUILD_TYPE%" & call :get_status
 | 
 and  the following nmake in two different directories.
 
 
  	  | Code: |  	  | nmake /f Makefile.win BUILD_MODE="!BUILD_CFG! %BUILD_TYPE%" BIND_MODE="shared" & call :get_status | 
 What if any errors are you getting?
 
 Can I suggest you open your apr-iconv build problem as a separate topic, rather than adding to this topic which is primarily a How-to document.
 | 
 
 
  	  | Quote: |  	  | and the following nmake in two different directories. | 
 Here is the command after I edited:
 
  	  | Code: |  	  | cd /D C:\httpd\srclib\apr-iconv copy "\httpd\srclib\apr\bin\apr.h" ".\include"
 copy "\httpd\srclib\apr\bin\apr_escape_test_char.h" ".\include"
 nmake /f apriconv.mak CFG="apriconv - x64 Release"
 nmake /f libapriconv.mak CFG="libapriconv - x64 Release"
 | 
 I removed 1>nul in both commands. I got an error that the command line didn't show any message after typing copy apr_escape_test_char.h, also couldn't continue compiling.
 I also got the error:
 
  	  | Code: |  	  | NMAKE : fatal error U1073: don't know how to make '".\include\apr_escape_test_char.h"' | 
 Can you review the command line?
 
 Last edited by tanquang on Sat 26 Jun '21 1:00; edited 1 time in total
 |  | 
| Back to top |  | 
| tanquang 
 
 
 Joined: 21 Mar 2020
 Posts: 73
 Location: Vietnam
 
 | 
|  Posted: Fri 25 Jun '21 23:35    Post subject: |   |  
| 
 |  
|  	  | James Blond wrote: |  	  |  	  | Code: |  	  | nmake /f Makefile.win installr INSTDIR=C:/Apache24
 
 | 
 
 https://github.com/apache/httpd/blob/2.4.x/Makefile.win#L6
 
 I never compiled apr-iconv directly, since the Makefile.win compiles apr-iconv if it is present in the src folder and named apr-iconv.
 
 Unlike tangent in my compilation all folders in the src folder have no version number.
 | 
 Will this command line compile apr-iconv directly? But will it compile x86 or x64 version?
 I tried running this command directly and got the error:
 
  	  | Code: |  	  | NMAKE : fatal error U1073: don't know how to make 'installr' | 
 |  | 
| Back to top |  | 
| James Blond Moderator
 
  
 Joined: 19 Jan 2006
 Posts: 7442
 Location: EU, Germany, Next to Hamburg
 
 |  | 
| Back to top |  | 
| tanquang 
 
 
 Joined: 21 Mar 2020
 Posts: 73
 Location: Vietnam
 
 | 
|  Posted: Sat 26 Jun '21 18:55    Post subject: |   |  
| 
 |  
| Yes, I also compile all at once, not individually. This is the entire command line I use to compile. 
  	  | Code: |  	  | ***************** ** ZLIB Build **
 *****************
 cd /D D:\httpd\srclib\zlib\bin
 cmake -G "NMake Makefiles" -DCMAKE_INSTALL_PREFIX=\phpStudy\Apache -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON ..
 nmake
 nmake install
 
 ****************
 ** Pcre Build **
 ****************
 cd /D D:\httpd\srclib\pcre\bin
 cmake -G "NMake Makefiles" -DCMAKE_INSTALL_PREFIX=\phpStudy\Apache -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DPCRE_BUILD_TESTS=OFF -DPCRE_BUILD_PCRECPP=OFF -DPCRE_BUILD_PCREGREP=OFF -DPCRE_SUPPORT_PCREGREP_JIT=OFF -DPCRE_SUPPORT_UTF=ON -DPCRE_SUPPORT_UNICODE_PROPERTIES=ON -DPCRE_NEWLINE=CRLF -DINSTALL_MSVC_PDB=OFF ..
 nmake
 nmake install
 
 *****************
 ** Expat Build **
 *****************
 cd /D D:\httpd\srclib\expat\bin
 cmake -G "NMake Makefiles" -DCMAKE_INSTALL_PREFIX=\phpStudy\Apache -DCMAKE_BUILD_TYPE=Release ..
 nmake
 nmake install
 
 *******************
 ** OpenSSL Build **
 *******************
 cd /D D:\httpd\srclib\openssl
 perl Configure VC-WIN64A --release --prefix=\phpStudy\Apache --openssldir=\phpStudy\Apache\conf enable-camellia no-idea no-mdc2
 nmake
 nmake install
 
 *******************
 ** libxml2 Build **
 *******************
 cd /D D:\httpd\srclib\libxml2\win32
 nmake /f Makefile.msvc distclean 2>nul
 cscript configure.js compiler=msvc prefix=\phpStudy\Apache include=\phpStudy\Apache\include lib=\phpStudy\Apache\lib iconv=no xml_debug=no python=no zlib=yes
 nmake /f Makefile.msvc
 nmake /f Makefile.msvc install-dist
 
 *******************
 ** jansson Build **
 *******************
 cd /D D:\httpd\srclib\jansson\bin
 cmake -G "NMake Makefiles" -DCMAKE_INSTALL_PREFIX=\phpStudy\Apache -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DJANSSON_BUILD_SHARED_LIBS=ON -DJANSSON_BUILD_DOCS=OFF ..
 nmake
 nmake install
 
 ******************
 ** Brotli Build **
 ******************
 cd /D D:\httpd\srclib\brotli\bin
 cmake -G "NMake Makefiles" -DCMAKE_INSTALL_PREFIX=\phpStudy\Apache -DCMAKE_BUILD_TYPE=Release ..
 nmake
 nmake install
 
 ***************
 ** Lua Build **
 ***************
 cd /D D:\httpd\srclib\lua\bin
 cmake -G "NMake Makefiles" -DCMAKE_INSTALL_PREFIX=\phpStudy\Apache -DCMAKE_BUILD_TYPE=Release ..
 nmake
 nmake install
 
 ***************
 ** APR Build **
 ***************
 cd /D D:\httpd\srclib\apr\bin
 cmake -G "NMake Makefiles" -DCMAKE_INSTALL_PREFIX=\phpStudy\Apache -DCMAKE_BUILD_TYPE=Release -DMIN_WINDOWS_VER=0x0600 -DAPR_HAVE_IPV6=ON -DAPR_INSTALL_PRIVATE_H=ON -DAPR_BUILD_TESTAPR=OFF -DINSTALL_PDB=OFF ..
 nmake
 nmake install
 
 ********************
 ** APR-Util Build **
 ********************
 cd /D D:\httpd\srclib\apr-util\bin
 cmake -G "NMake Makefiles" -DCMAKE_INSTALL_PREFIX=\phpStudy\Apache -DOPENSSL_ROOT_DIR=\phpStudy\Apache -DCMAKE_BUILD_TYPE=Release -DAPU_HAVE_CRYPTO=ON -DAPR_BUILD_TESTAPR=OFF -DINSTALL_PDB=OFF ..
 nmake
 nmake install
 
 *******************
 ** Nghttp2 Build **
 *******************
 cd /D D:\httpd\srclib\nghttp2\bin
 cmake -G "NMake Makefiles" -DCMAKE_INSTALL_PREFIX=\phpStudy\Apache -DCMAKE_BUILD_TYPE=Release -DENABLE_LIB_ONLY=ON ..
 nmake
 nmake install
 
 ****************
 ** cURL Build **
 ****************
 cd /D D:\httpd\srclib\curl\bin
 cmake -G "NMake Makefiles" -DCMAKE_INSTALL_PREFIX=\phpStudy\Apache -DCMAKE_BUILD_TYPE=Release -DCMAKE_USE_OPENSSL=ON -DCMAKE_USE_SCHANNEL=ON -DCURL_WINDOWS_SSPI=ON -DCURL_BROTLI=ON -DUSE_NGHTTP2=ON -DHAVE_LDAP_SSL=ON -DENABLE_UNICODE=ON -DCURL_STATIC_CRT=OFF -DBUILD_SHARED_LIBS=ON ..
 nmake
 nmake install
 cmake -G "NMake Makefiles" -DCMAKE_INSTALL_PREFIX=\phpStudy\Apache -DCMAKE_BUILD_TYPE=Release -DCMAKE_USE_OPENSSL=ON -DCMAKE_USE_SCHANNEL=ON -DCURL_WINDOWS_SSPI=ON -DCURL_BROTLI=ON -DUSE_NGHTTP2=ON -DHAVE_LDAP_SSL=ON -DENABLE_UNICODE=ON -DCURL_STATIC_CRT=OFF -DBUILD_SHARED_LIBS=OFF ..
 nmake
 nmake install
 
 ******************
 ** Apache Build **
 ******************
 cd /D D:\httpd\bin
 cmake -G "NMake Makefiles" -DCMAKE_INSTALL_PREFIX=\phpStudy\Apache -DCMAKE_BUILD_TYPE=Release -DENABLE_MODULES=i -DINSTALL_PDB=OFF ..
 nmake
 nmake install
 
 *********************
 ** mod_fcgid Build **
 *********************
 cd /D D:\httpd\srclib\mod_fcgid\modules\fcgid\bin
 cmake -G "NMake Makefiles" -DCMAKE_INSTALL_PREFIX=\phpStudy\Apache -DCMAKE_BUILD_TYPE=Release -DINSTALL_PDB=OFF ..
 nmake
 nmake install
 | 
 That's my entire compiled command line. However, it is missing apr-iconv.
 |  | 
| Back to top |  | 
| James Blond Moderator
 
  
 Joined: 19 Jan 2006
 Posts: 7442
 Location: EU, Germany, Next to Hamburg
 
 | 
|  Posted: Sat 26 Jun '21 21:46    Post subject: |   |  
| 
 |  
| You don't have to! 
 With the IDE is like
 
  	  | Quote: |  	  | command line
 cd C:\build\2.4.x
 srclib\apr\build\lineends.pl
 srclib\apr\build\cvtdsp.pl -2005
 
 
 cd srclib\zlib
 nmake -f win32/Makefile.msc LOC="-DASMV -DASMINF -I." OBJA="inffas32.obj match686.obj"
 MT -manifest zlib1.dll.manifest -outputresource:zlib1.dll;2
 
 cd ..\..\srclib\openssl
 perl Configure VC-WIN32 --prefix=/Apache24 --openssldir=/Apache24/conf disable-idea
 ms\do_nasm
 nmake /f ms\ntdll.mak
 
 
 IDE part
 
 Open Apache.dsw with VS8/VS9 and answer "Yes to All" to the "convert projects" question
 Select relase win32
 
 Now build InstallBin
 | 
 
 
 
 
  	  | Code: |  	  | cmake -G "NMake Makefiles" -DCMAKE_INSTALL_PREFIX=\phpStudy\Apache -DCMAKE_BUILD_TYPE=Release -DENABLE_MODULES=i -DINSTALL_PDB=OFF ..
 nmake
 nmake install
 
 | 
 
 Your code should do the magic. Except you have to compile zlib and OpenSSL before it, and mod_fcgid after it.
 |  | 
| Back to top |  | 
| tanquang 
 
 
 Joined: 21 Mar 2020
 Posts: 73
 Location: Vietnam
 
 | 
|  Posted: Sun 27 Jun '21 17:39    Post subject: |   |  
| 
 |  
| I compiled in the same order as in the code above, compiles normally but with slight modifications before compiling and just missing apr-iconv. |  | 
| Back to top |  |