logo
Apache Lounge
Webmasters

 

About Forum Index Downloads Search Register Log in  RSS Apache Lounge  


Keep Server Online

If you find the Apache Lounge, the downloads and overall help useful, please express your satisfaction with a donation.

or

Bitcoin

A donation makes a contribution towards the costs, the time and effort that's going in this site and building.

Thank You! Steffen

Your donations will help to keep this site alive and well, and continuing building binaries. Apache Lounge is not sponsored.


Post new topic   Forum Index -> Building & Member Downloads View previous topic :: View next topic
Reply to topic   Topic: Building with cmake, expat and apr-iconv
Author
tanquang



Joined: 21 Mar 2020
Posts: 32
Location: Vietnam

PostPosted: Mon 14 Jun '21 5:09    Post subject: Building with cmake, expat and apr-iconv Reply with quote

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



Joined: 16 Aug 2020
Posts: 147
Location: UK

PostPosted: Mon 14 Jun '21 22:27    Post subject: Reply with quote

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: 32
Location: Vietnam

PostPosted: Mon 14 Jun '21 23:24    Post subject: Reply with quote

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
Code:
EXPAT cannot be found
error after the compiler started for a while. Looks like it ran out of order so expat was ignored.
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. Mr. Green
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



Joined: 16 Aug 2020
Posts: 147
Location: UK

PostPosted: Tue 15 Jun '21 22:00    Post subject: Reply with quote

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: 32
Location: Vietnam

PostPosted: Thu 17 Jun '21 19:23    Post subject: Reply with quote

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: 7029
Location: Germany, Next to Hamburg

PostPosted: Thu 17 Jun '21 21:49    Post subject: Reply with quote

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: 32
Location: Vietnam

PostPosted: Fri 18 Jun '21 16:00    Post subject: Reply with quote

I build them on Windows, the ports are all unblocked.
Quote:
I'm trying to filter the command line, pretty hard to find.
I mean here the apr-iconv compile statement. Mr. Green
Back to top
James Blond
Moderator


Joined: 19 Jan 2006
Posts: 7029
Location: Germany, Next to Hamburg

PostPosted: Tue 22 Jun '21 12:22    Post subject: Reply with quote

I haven't use the cmake for the building.

But in the old days I used the Makefile.win

Makefile.win[1] Lines 437-439, 743-744,778,98,1211,1270

Also srclib/apr-iconv/apriconv.mak[2]


[1] https://github.com/apache/httpd/blob/2.4.x/Makefile.win#L437

[2] https://github.com/apache/apr-iconv/blob/trunk/apriconv.mak
Back to top
tanquang



Joined: 21 Mar 2020
Posts: 32
Location: Vietnam

PostPosted: Tue 22 Jun '21 17:43    Post subject: Reply with quote

Do you have a command line that compiles with a makefile?
Back to top
tangent



Joined: 16 Aug 2020
Posts: 147
Location: UK

PostPosted: Tue 22 Jun '21 20:14    Post subject: Reply with quote

@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: 7029
Location: Germany, Next to Hamburg

PostPosted: Tue 22 Jun '21 22:03    Post subject: Reply with quote

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: 2264
Location: Sun Diego, USA

PostPosted: Wed 23 Jun '21 17:27    Post subject: Reply with quote

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



Joined: 16 Aug 2020
Posts: 147
Location: UK

PostPosted: Wed 23 Jun '21 22:35    Post subject: Reply with quote

@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: 2264
Location: Sun Diego, USA

PostPosted: Thu 24 Jun '21 0:54    Post subject: Reply with quote

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: 32
Location: Vietnam

PostPosted: Fri 25 Jun '21 23:28    Post subject: Reply with quote

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: 32
Location: Vietnam

PostPosted: Fri 25 Jun '21 23:35    Post subject: Reply with quote

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: 7029
Location: Germany, Next to Hamburg

PostPosted: Sat 26 Jun '21 9:09    Post subject: Reply with quote

For apr-iconv it is build/modules.mk.win[1]


Take a look into the dsp files[2][3]. There you see what the GUI would do.

But like I said. I never built apr-iconv alone. I always did the full apache build.

[1] https://github.com/apache/apr-iconv/blob/trunk/build/modules.mk.win
[2] https://github.com/apache/apr-iconv/blob/trunk/libapriconv.dsp
[3] https://github.com/apache/apr-iconv/blob/trunk/apriconv.dsp
Back to top
tanquang



Joined: 21 Mar 2020
Posts: 32
Location: Vietnam

PostPosted: Sat 26 Jun '21 18:55    Post subject: Reply with quote

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: 7029
Location: Germany, Next to Hamburg

PostPosted: Sat 26 Jun '21 21:46    Post subject: Reply with quote

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: 32
Location: Vietnam

PostPosted: Sun 27 Jun '21 17:39    Post subject: Reply with quote

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


Reply to topic   Topic: Building with cmake, expat and apr-iconv View previous topic :: View next topic
Post new topic   Forum Index -> Building & Member Downloads