mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-01-31 04:44:13 +00:00
Merge pull request #308 from mlt/openssl-cmake
Cleaned up appveyor CI along with MSVC & mingw builds
This commit is contained in:
commit
762f9c4b23
@ -28,11 +28,9 @@ http://download.i2p.io/purplei2p/i2pd/releases/
|
|||||||
Supported OS
|
Supported OS
|
||||||
------------
|
------------
|
||||||
|
|
||||||
[![Build status](https://ci.appveyor.com/api/projects/status/458fhbki14gaplyj/branch/openssl?svg=true)](https://ci.appveyor.com/project/mlt/i2pd/branch/openssl)
|
|
||||||
|
|
||||||
* Linux x86/x64 - Proved working.
|
* Linux x86/x64 - Proved working.
|
||||||
* Mac OS X - Not well tested. (Only works with clang, not GCC)
|
* Mac OS X - Not well tested. (Only works with clang, not GCC)
|
||||||
* Windows - At least builds and runs.
|
* Windows - [![Build status](https://ci.appveyor.com/api/projects/status/1908qe4p48ff1x23?svg=true)](https://ci.appveyor.com/project/PurpleI2P/i2pd)
|
||||||
|
|
||||||
More documentation
|
More documentation
|
||||||
------------------
|
------------------
|
||||||
|
14
Win32/Itoopie.cmd
Normal file
14
Win32/Itoopie.cmd
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
@echo off
|
||||||
|
convert Itoopie.svg ^
|
||||||
|
-fuzz 90%% -fill transparent -floodfill 2x2 white -fuzz 20%% -fill #AE0E99 -opaque red ^
|
||||||
|
-fill #FBBC11 -opaque yellow ^
|
||||||
|
( -clone 0 -resize 256x256 ) ^
|
||||||
|
( -clone 0 -resize 128x128 ) ^
|
||||||
|
( -clone 0 -resize 64x64 ) ^
|
||||||
|
( -clone 0 -resize 48x48 ) ^
|
||||||
|
( -clone 0 -resize 32x32 ) ^
|
||||||
|
( -clone 0 -resize 24x24 ) ^
|
||||||
|
( -clone 0 -resize 16x16 ) ^
|
||||||
|
( -size 150x57 xc:white -clone 0 -geometry 57x57+46+0 -composite -gravity center -write BMP3:ictoopie.bmp +delete ) ^
|
||||||
|
( -clone 0 -write Itoopie_purple.png +delete ) ^
|
||||||
|
-delete 0 ictoopie.ico
|
@ -54,44 +54,6 @@ END
|
|||||||
// remains consistent on all systems.
|
// remains consistent on all systems.
|
||||||
MAINICON ICON "ictoopie.ico"
|
MAINICON ICON "ictoopie.ico"
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// Version
|
|
||||||
//
|
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
|
||||||
FILEVERSION 2,1,0,0
|
|
||||||
PRODUCTVERSION 0,9,23,0
|
|
||||||
FILEFLAGSMASK 0x3fL
|
|
||||||
#ifdef _DEBUG
|
|
||||||
FILEFLAGS 0x1L
|
|
||||||
#else
|
|
||||||
FILEFLAGS 0x0L
|
|
||||||
#endif
|
|
||||||
FILEOS 0x40004L
|
|
||||||
FILETYPE 0x1L
|
|
||||||
FILESUBTYPE 0x0L
|
|
||||||
BEGIN
|
|
||||||
BLOCK "StringFileInfo"
|
|
||||||
BEGIN
|
|
||||||
BLOCK "040904b0"
|
|
||||||
BEGIN
|
|
||||||
VALUE "CompanyName", "Purple I2P"
|
|
||||||
VALUE "FileDescription", "C++ I2P daemon"
|
|
||||||
VALUE "FileVersion", "2.1.0.0"
|
|
||||||
VALUE "InternalName", "Resource.rc"
|
|
||||||
VALUE "LegalCopyright", "Copyright (C) 2013-2015, The PurpleI2P Project"
|
|
||||||
VALUE "OriginalFilename", "i2pd"
|
|
||||||
VALUE "ProductName", "Purple I2P"
|
|
||||||
VALUE "ProductVersion", "0.9.23.0"
|
|
||||||
END
|
|
||||||
END
|
|
||||||
BLOCK "VarFileInfo"
|
|
||||||
BEGIN
|
|
||||||
VALUE "Translation", 0x409, 1200
|
|
||||||
END
|
|
||||||
END
|
|
||||||
|
|
||||||
#endif // English (United States) resources
|
#endif // English (United States) resources
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
@ -103,6 +65,7 @@ END
|
|||||||
// Generated from the TEXTINCLUDE 3 resource.
|
// Generated from the TEXTINCLUDE 3 resource.
|
||||||
//
|
//
|
||||||
|
|
||||||
|
#include "Resource.rc2"
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
#endif // not APSTUDIO_INVOKED
|
#endif // not APSTUDIO_INVOKED
|
||||||
|
47
Win32/Resource.rc2
Normal file
47
Win32/Resource.rc2
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
//
|
||||||
|
// Resource.RC2 - resources Microsoft Visual C++ does not edit directly
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifdef APSTUDIO_INVOKED
|
||||||
|
#error this file is not editable by Microsoft Visual C++
|
||||||
|
#endif //APSTUDIO_INVOKED
|
||||||
|
|
||||||
|
#include "../version.h"
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Version
|
||||||
|
//
|
||||||
|
|
||||||
|
VS_VERSION_INFO VERSIONINFO
|
||||||
|
FILEVERSION I2PD_VERSION_MAJOR,I2PD_VERSION_MINOR,I2PD_VERSION_MICRO,I2PD_VERSION_PATCH
|
||||||
|
PRODUCTVERSION I2P_VERSION_MAJOR,I2P_VERSION_MINOR,I2P_VERSION_MICRO,I2P_VERSION_PATCH
|
||||||
|
FILEFLAGSMASK 0x3fL
|
||||||
|
#ifdef _DEBUG
|
||||||
|
FILEFLAGS 0x1L
|
||||||
|
#else
|
||||||
|
FILEFLAGS 0x0L
|
||||||
|
#endif
|
||||||
|
FILEOS 0x40004L
|
||||||
|
FILETYPE 0x1L
|
||||||
|
FILESUBTYPE 0x0L
|
||||||
|
BEGIN
|
||||||
|
BLOCK "StringFileInfo"
|
||||||
|
BEGIN
|
||||||
|
BLOCK "040904b0"
|
||||||
|
BEGIN
|
||||||
|
VALUE "CompanyName", "Purple I2P"
|
||||||
|
VALUE "FileDescription", "C++ I2P daemon"
|
||||||
|
VALUE "FileVersion", I2PD_VERSION
|
||||||
|
VALUE "InternalName", CODENAME
|
||||||
|
VALUE "LegalCopyright", "Copyright (C) 2013-2015, The PurpleI2P Project"
|
||||||
|
VALUE "OriginalFilename", "i2pd"
|
||||||
|
VALUE "ProductName", "Purple I2P"
|
||||||
|
VALUE "ProductVersion", I2P_VERSION
|
||||||
|
END
|
||||||
|
END
|
||||||
|
BLOCK "VarFileInfo"
|
||||||
|
BEGIN
|
||||||
|
VALUE "Translation", 0x409, 1200
|
||||||
|
END
|
||||||
|
END
|
BIN
Win32/ictoopie.bmp
Normal file
BIN
Win32/ictoopie.bmp
Normal file
Binary file not shown.
After Width: | Height: | Size: 25 KiB |
Binary file not shown.
Before Width: | Height: | Size: 97 KiB After Width: | Height: | Size: 176 KiB |
197
appveyor.yml
Normal file
197
appveyor.yml
Normal file
@ -0,0 +1,197 @@
|
|||||||
|
version: 1.0.{build}
|
||||||
|
pull_requests:
|
||||||
|
do_not_increment_build_number: true
|
||||||
|
branches:
|
||||||
|
only:
|
||||||
|
- openssl
|
||||||
|
skip_tags: true
|
||||||
|
os: Visual Studio 2015
|
||||||
|
shallow_clone: true
|
||||||
|
clone_depth: 1
|
||||||
|
init:
|
||||||
|
- cmd: >-
|
||||||
|
mkdir \projects\instdir
|
||||||
|
|
||||||
|
rem Appveyor has win32 openssl pre-installed that is picked up erroneously even for 64-bit. Cleaning the mess... Should happen before restoring cache.
|
||||||
|
|
||||||
|
rem Might consider passing OPENSSL_ROOT_DIR
|
||||||
|
|
||||||
|
if exist \OpenSSL-Win32 rmdir /S /Q \OpenSSL-Win32
|
||||||
|
|
||||||
|
if exist \OpenSSL-Win64 rmdir /S /Q \OpenSSL-Win64
|
||||||
|
|
||||||
|
if exist \OpenSSL rmdir /S /Q \OpenSSL
|
||||||
|
environment:
|
||||||
|
BOOST_ROOT: C:\Libraries\boost_1_59_0
|
||||||
|
MINIUPNPC: miniupnpc-1.9.20151026
|
||||||
|
OPENSSL: OpenSSL_1_0_2e
|
||||||
|
ZLIB: zlib-1.2.8
|
||||||
|
matrix:
|
||||||
|
# - type: static
|
||||||
|
# msvc: 14
|
||||||
|
# x64: 0
|
||||||
|
# - type: static
|
||||||
|
# variant: Release
|
||||||
|
# # FIXME why is this necessary with Appveyor???
|
||||||
|
# cmake: -DSSL_EAY=/mingw32/lib/libssl.a -DLIB_EAY=/mingw32/lib/libcrypto.a
|
||||||
|
- type: shared
|
||||||
|
variant: Release
|
||||||
|
- type: static
|
||||||
|
msvc: 12
|
||||||
|
x64: 1
|
||||||
|
variant: RelWithDebInfo
|
||||||
|
- type: static
|
||||||
|
msvc: 14
|
||||||
|
variant: RelWithDebInfo
|
||||||
|
cmake: -DWITH_PCH=ON
|
||||||
|
# - type: static
|
||||||
|
# msvc: 12
|
||||||
|
# - type: shared
|
||||||
|
# msvc: 14
|
||||||
|
# variant: Debug
|
||||||
|
# - type: shared
|
||||||
|
# variant: Release
|
||||||
|
# cmake: -DWITH_PCH=ON
|
||||||
|
# x64: 1
|
||||||
|
install:
|
||||||
|
- if not exist \projects\miniupnpc\ (
|
||||||
|
mkdir \projects\miniupnpc
|
||||||
|
&& curl -sL http://miniupnp.free.fr/files/download.php?file=%MINIUPNPC%.tar.gz -o \projects\miniupnpc\%MINIUPNPC%.tar.gz
|
||||||
|
)
|
||||||
|
- tar --strip-components=1 --directory=\projects\miniupnpc -xzf \projects\miniupnpc\%MINIUPNPC%.tar.gz
|
||||||
|
- if not exist \projects\zlib\ (
|
||||||
|
mkdir \projects\zlib
|
||||||
|
&& cd \projects\zlib
|
||||||
|
&& curl -sLO http://zlib.net/%ZLIB%.tar.gz
|
||||||
|
)
|
||||||
|
- tar --strip-components=1 --directory=\projects\zlib -xzf \projects\zlib\%ZLIB%.tar.gz
|
||||||
|
- patch -p0 C:/projects/zlib/CMakeLists.txt %APPVEYOR_BUILD_FOLDER%/build/cmake-zlib-static.patch
|
||||||
|
- patch -p0 C:/projects/zlib/CMakeLists.txt %APPVEYOR_BUILD_FOLDER%/build/cmake-zlib-amd64.patch
|
||||||
|
- if "%type%" == "static" (
|
||||||
|
set "static=ON"
|
||||||
|
&& set "boostlib=lib"
|
||||||
|
) else (
|
||||||
|
set "static=OFF"
|
||||||
|
&& set "dll=dll"
|
||||||
|
)
|
||||||
|
- if "%x64%"=="1" (
|
||||||
|
set "bitness=64"
|
||||||
|
&& set "openssl_target=VC-WIN64A"
|
||||||
|
&& set "zlib_asm=-DAMD64=ON"
|
||||||
|
) else (
|
||||||
|
set "bitness=32"
|
||||||
|
&& set "openssl_target=VC-WIN32"
|
||||||
|
&& set "zlib_asm=-DASM686=ON "-DCMAKE_ASM_MASM_FLAGS=/W0 /safeseh""
|
||||||
|
)
|
||||||
|
- C:\msys64\usr\bin\bash -lc "export PATH=/mingw%bitness%/bin:/usr/bin:. && cd /c/projects/miniupnpc && CC=gcc make -f Makefile.mingw init miniupnpc.dll > c:\projects\instdir\build_miniupnpc.log 2>&1 || cat c:\projects\instdir\build_miniupnpc.log"
|
||||||
|
- set /a generator=%msvc%+2001
|
||||||
|
- if defined msvc (
|
||||||
|
(
|
||||||
|
if "%x64%" == "1" (
|
||||||
|
call "C:\Program Files (x86)\Microsoft Visual Studio %msvc%.0\VC\vcvarsall.bat" amd64
|
||||||
|
&& set "generator=Visual Studio %msvc% %generator% Win64"
|
||||||
|
) else (
|
||||||
|
call "C:\Program Files (x86)\Microsoft Visual Studio %msvc%.0\VC\vcvarsall.bat" x86
|
||||||
|
&& set "generator=Visual Studio %msvc% %generator%"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
&& set "zlib_root=C:/stage/zlib-Win%bitness%-vc%msvc%-%type%"
|
||||||
|
&& if "%variant%" neq "Debug" (
|
||||||
|
set "boost_variant=variant=release"
|
||||||
|
&& set "boostdbg=-gd"
|
||||||
|
)
|
||||||
|
) else (
|
||||||
|
set "generator=Unix Makefiles"
|
||||||
|
)
|
||||||
|
- if defined msvc if not exist %zlib_root% (
|
||||||
|
mkdir \projects\zlib-build
|
||||||
|
&& cd \projects\zlib-build
|
||||||
|
&& cmake ../zlib -G "%generator%" %zlib_asm% -DWITH_STATIC=%static% -DCMAKE_INSTALL_PREFIX=%zlib_root% > c:\projects\instdir\build_zlib.log
|
||||||
|
&& cmake --build . --config Release --target INSTALL >> c:\projects\instdir\build_zlib.log
|
||||||
|
|| type c:\projects\instdir\build_zlib.log
|
||||||
|
)
|
||||||
|
- cmd: >-
|
||||||
|
rem cinst nasm
|
||||||
|
|
||||||
|
cd \projects
|
||||||
|
|
||||||
|
if not exist nasm-2.11.08-installer.exe curl --silent --location --remote-name http://www.nasm.us/pub/nasm/releasebuilds/2.11.08/win32/nasm-2.11.08-installer.exe
|
||||||
|
|
||||||
|
nasm-2.11.08-installer.exe /S
|
||||||
|
|
||||||
|
set "PATH=%PATH%;C:\Program Files (x86)\nasm"
|
||||||
|
|
||||||
|
if not exist %OPENSSL%.zip curl --silent --location --remote-name https://github.com/openssl/openssl/archive/%OPENSSL%.zip
|
||||||
|
- cd %BOOST_ROOT%
|
||||||
|
- if defined msvc if not exist "stage%bitness%\lib\%boostlib%boost_system-vc%msvc%0-mt%boostdbg%*" (
|
||||||
|
bootstrap > c:\projects\instdir\build_boost.log
|
||||||
|
&& b2 toolset=msvc-%msvc%.0 %boost_variant% link=%type% runtime-link=%type% address-model=%bitness% --build-type=minimal --with-filesystem --with-program_options --with-regex --with-date_time --stagedir=stage%bitness% >> c:\projects\instdir\build_boost.log
|
||||||
|
|| type c:\projects\instdir\build_boost.log
|
||||||
|
)
|
||||||
|
- if defined msvc if not exist C:\stage\OpenSSL-Win%bitness%-vc%msvc%-%type%\ (
|
||||||
|
cd \projects
|
||||||
|
&& 7z x %OPENSSL%.zip > NUL
|
||||||
|
&& cd openssl-%OPENSSL%
|
||||||
|
&& perl Configure %openssl_target% no-rc2 no-rc4 no-rc5 no-idea no-bf no-cast no-whirlpool no-md2 no-md4 no-ripemd no-mdc2 no-camellia no-seed no-comp no-krb5 no-gmp no-rfc3779 no-ec2m no-ssl2 no-jpake no-srp no-sctp no-srtp --prefix=c:\stage\OpenSSL-Win%bitness%-vc%msvc%-%type% > c:\projects\instdir\build_openssl.log
|
||||||
|
&& ( if "%x64%" == "1" ( ms\do_win64a >> c:\projects\instdir\build_openssl.log ) else ( ms\do_nasm >> c:\projects\instdir\build_openssl.log ) )
|
||||||
|
&& nmake -f ms\nt%dll%.mak install >> c:\projects\instdir\build_openssl.log 2>&1
|
||||||
|
&& mklink /J \OpenSSL \stage\OpenSSL-Win%bitness%-vc%msvc%-%type%
|
||||||
|
|| type c:\projects\instdir\build_openssl.log
|
||||||
|
)
|
||||||
|
- rem already there: mingw-w64-i686-openssl mingw-w64-i686-gcc cmake
|
||||||
|
- if not defined msvc (
|
||||||
|
C:\msys64\usr\bin\bash -lc "pacman --needed --noconfirm -Sy bash pacman pacman-mirrors msys2-runtime msys2-runtime-devel"
|
||||||
|
&& if "%x64%" == "1" (
|
||||||
|
C:\msys64\usr\bin\bash -lc "pacman --noconfirm -S mingw-w64-x86_64-boost mingw-w64-x86_64-miniupnpc"
|
||||||
|
) else (
|
||||||
|
C:\msys64\usr\bin\bash -lc "pacman --noconfirm -S mingw-w64-i686-boost mingw-w64-i686-miniupnpc"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
cache:
|
||||||
|
- C:\projects\%OPENSSL%.zip
|
||||||
|
- C:\projects\nasm-2.11.08-installer.exe
|
||||||
|
- C:\projects\miniupnpc\%MINIUPNPC%.tar.gz
|
||||||
|
- C:\stage
|
||||||
|
- '%BOOST_ROOT%\stage32'
|
||||||
|
- '%BOOST_ROOT%\stage64'
|
||||||
|
- C:\projects\zlib\%ZLIB%.tar.gz
|
||||||
|
build_script:
|
||||||
|
- cmd: >-
|
||||||
|
mkdir \projects\build
|
||||||
|
|
||||||
|
rem FIXME use fixup_bundle in cmake
|
||||||
|
|
||||||
|
rem msbuild i2pd.sln /p:Configuration=Release
|
||||||
|
|
||||||
|
if defined variant ( set cmake_extra=-DCMAKE_BUILD_TYPE=%variant% && set "cmake_build=--config %variant%" )
|
||||||
|
|
||||||
|
echo "bitness=%bitness%; static=%static%; dll=%dll%; type=%type%; generator=%generator%; variant=%variant%; cmake=%cmake%; cmake_extra=%cmake_extra%"
|
||||||
|
- if not defined msvc (
|
||||||
|
C:\msys64\usr\bin\bash -lc "export PATH=/mingw%bitness%/bin:/usr/bin && cd /c/projects/build && cmake /c/projects/i2pd/build -G 'Unix Makefiles' -DWITH_AESNI=ON -DWITH_UPNP=ON %cmake% %cmake_extra% -DWITH_STATIC=%static% -DWITH_HARDENING=ON -DCMAKE_INSTALL_PREFIX:PATH=/c/projects/instdir -DCMAKE_FIND_ROOT_PATH=/mingw%bitness% && make install"
|
||||||
|
&& 7z a -tzip -mx9 -mmt C:\projects\i2pd\i2pd-mingw-win%bitness%-%type%.zip C:\projects\instdir\* C:\msys64\mingw%bitness%\bin\zlib1.dll C:\msys64\mingw%bitness%\bin\*eay32.dll
|
||||||
|
)
|
||||||
|
- rem We are fine with multiple generated configurations in MS solution. Will use later
|
||||||
|
- if defined msvc (
|
||||||
|
cd \projects\build
|
||||||
|
&& cmake ..\i2pd\build -G "%generator%" -DWITH_UPNP=ON %cmake% -DWITH_STATIC=%static% -DZLIB_ROOT=%zlib_root% -DBoost_LIBRARY_DIR:PATH=%BOOST_ROOT%/stage%bitness%/lib -DCMAKE_INSTALL_PREFIX:PATH=c:/projects/instdir
|
||||||
|
&& cmake --build . %cmake_build% --target install
|
||||||
|
&& 7z a -tzip -mx9 -mmt C:\projects\i2pd\i2pd-vc%msvc%-win%bitness%-%type%.zip C:\projects\instdir\*
|
||||||
|
&& cmake --build . %cmake_build% --target package
|
||||||
|
&& xcopy i2pd*win*.exe ..\i2pd\
|
||||||
|
)
|
||||||
|
test: off
|
||||||
|
artifacts:
|
||||||
|
- path: i2pd-vc12-win64-static.zip
|
||||||
|
- path: i2pd-vc12-win32-static.zip
|
||||||
|
- path: i2pd-vc12-win64-shared.zip
|
||||||
|
- path: i2pd-vc12-win32-shared.zip
|
||||||
|
- path: i2pd-vc14-win64-static.zip
|
||||||
|
- path: i2pd-vc14-win32-static.zip
|
||||||
|
- path: i2pd-vc14-win64-shared.zip
|
||||||
|
- path: i2pd-vc14-win32-shared.zip
|
||||||
|
- path: i2pd-mingw-win64-static.zip
|
||||||
|
- path: i2pd-mingw-win32-static.zip
|
||||||
|
- path: i2pd-mingw-win64-shared.zip
|
||||||
|
- path: i2pd-mingw-win32-shared.zip
|
||||||
|
- path: i2pd-2.1.0-win64.exe
|
||||||
|
- path: i2pd-2.1.0-win32.exe
|
@ -53,6 +53,13 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Windows" OR MSYS)
|
|||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
add_library(libi2pd ${LIBI2PD_SRC})
|
add_library(libi2pd ${LIBI2PD_SRC})
|
||||||
|
install(TARGETS libi2pd
|
||||||
|
EXPORT libi2pd
|
||||||
|
ARCHIVE DESTINATION lib
|
||||||
|
COMPONENT Libraries)
|
||||||
|
# TODO Make libi2pd available to 3rd party projects via CMake as imported target
|
||||||
|
# FIXME This pulls stdafx
|
||||||
|
# install(EXPORT libi2pd DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
|
|
||||||
set (CLIENT_SRC
|
set (CLIENT_SRC
|
||||||
"${CMAKE_SOURCE_DIR}/AddressBook.cpp"
|
"${CMAKE_SOURCE_DIR}/AddressBook.cpp"
|
||||||
@ -90,7 +97,16 @@ endif ()
|
|||||||
# compiler flags customization (by vendor)
|
# compiler flags customization (by vendor)
|
||||||
if (MSVC)
|
if (MSVC)
|
||||||
add_definitions( -D_WIN32_WINNT=_WIN32_WINNT_WINXP -DWIN32_LEAN_AND_MEAN -DNOMINMAX ) #-DOPENSSL_NO_SSL2 -DOPENSSL_USE_DEPRECATED
|
add_definitions( -D_WIN32_WINNT=_WIN32_WINNT_WINXP -DWIN32_LEAN_AND_MEAN -DNOMINMAX ) #-DOPENSSL_NO_SSL2 -DOPENSSL_USE_DEPRECATED
|
||||||
|
# TODO Check & report to Boost dev, there should be no need for these two
|
||||||
|
add_definitions( -DBOOST_THREAD_NO_LIB -DBOOST_CHRONO_NO_LIB )
|
||||||
|
set( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /GL" )
|
||||||
|
set( CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /INCREMENTAL:NO /LTCG" )
|
||||||
|
set( CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELEASE} /GL" )
|
||||||
|
set( CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO} /INCREMENTAL:NO /LTCG" )
|
||||||
else()
|
else()
|
||||||
|
if (MSYS OR MINGW)
|
||||||
|
add_definitions( -DWIN32_LEAN_AND_MEAN )
|
||||||
|
endif ()
|
||||||
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Winvalid-pch" )
|
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Winvalid-pch" )
|
||||||
set( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -pedantic" )
|
set( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -pedantic" )
|
||||||
# TODO: The following is incompatible with static build and enabled hardening for OpenWRT.
|
# TODO: The following is incompatible with static build and enabled hardening for OpenWRT.
|
||||||
@ -122,6 +138,11 @@ elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
|||||||
# more tweaks
|
# more tweaks
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
if (WITH_HARDENING AND MSVC)
|
||||||
|
# Most security options like dynamic base, buffer & stack checks are ON by default
|
||||||
|
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /guard:cf" )
|
||||||
|
endif ()
|
||||||
|
|
||||||
# compiler flags customization (by system)
|
# compiler flags customization (by system)
|
||||||
if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||||
list (APPEND DAEMON_SRC "${CMAKE_SOURCE_DIR}/DaemonLinux.cpp")
|
list (APPEND DAEMON_SRC "${CMAKE_SOURCE_DIR}/DaemonLinux.cpp")
|
||||||
@ -158,9 +179,8 @@ endif()
|
|||||||
if (WITH_STATIC)
|
if (WITH_STATIC)
|
||||||
set(Boost_USE_STATIC_LIBS ON)
|
set(Boost_USE_STATIC_LIBS ON)
|
||||||
set(Boost_USE_STATIC_RUNTIME ON)
|
set(Boost_USE_STATIC_RUNTIME ON)
|
||||||
if (WIN32 OR MSYS)
|
if (WIN32 AND NOT MSYS AND NOT MINGW)
|
||||||
# http://www.cmake.org/Wiki/CMake_FAQ#Dynamic_Replace
|
# http://www.cmake.org/Wiki/CMake_FAQ#Dynamic_Replace
|
||||||
# Note that you might need to rebuild Crypto++
|
|
||||||
foreach(flag_var
|
foreach(flag_var
|
||||||
CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
|
CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
|
||||||
CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
|
CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
|
||||||
@ -184,11 +204,11 @@ else()
|
|||||||
# HINT: revert c266cff CMakeLists.txt: compilation speed up
|
# HINT: revert c266cff CMakeLists.txt: compilation speed up
|
||||||
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC" )
|
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC" )
|
||||||
endif ()
|
endif ()
|
||||||
add_definitions(-DBOOST_ALL_DYN_LINK)
|
add_definitions(-DBOOST_SYSTEM_DYN_LINK -DBOOST_FILESYSTEM_DYN_LINK -DBOOST_PROGRAM_OPTIONS_DYN_LINK -DBOOST_DATE_TIME_DYN_LINK -DBOOST_REGEX_DYN_LINK)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
if (WITH_PCH)
|
if (WITH_PCH)
|
||||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/..)
|
include_directories(${CMAKE_BINARY_DIR})
|
||||||
add_library(stdafx STATIC "${CMAKE_SOURCE_DIR}/stdafx.cpp")
|
add_library(stdafx STATIC "${CMAKE_SOURCE_DIR}/stdafx.cpp")
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
target_compile_options(stdafx PRIVATE /Ycstdafx.h /Zm155)
|
target_compile_options(stdafx PRIVATE /Ycstdafx.h /Zm155)
|
||||||
@ -215,7 +235,7 @@ endif()
|
|||||||
|
|
||||||
target_link_libraries(i2pdclient libi2pd)
|
target_link_libraries(i2pdclient libi2pd)
|
||||||
|
|
||||||
find_package ( Boost COMPONENTS system filesystem regex program_options date_time thread chrono REQUIRED )
|
find_package ( Boost COMPONENTS system filesystem regex program_options date_time REQUIRED )
|
||||||
if(NOT DEFINED Boost_INCLUDE_DIRS)
|
if(NOT DEFINED Boost_INCLUDE_DIRS)
|
||||||
message(SEND_ERROR "Boost is not found, or your boost version was bellow 1.46. Please download Boost!")
|
message(SEND_ERROR "Boost is not found, or your boost version was bellow 1.46. Please download Boost!")
|
||||||
endif()
|
endif()
|
||||||
@ -235,16 +255,21 @@ endif()
|
|||||||
find_package ( ZLIB )
|
find_package ( ZLIB )
|
||||||
if (NOT ZLIB_FOUND )
|
if (NOT ZLIB_FOUND )
|
||||||
# We are probably on Windows
|
# We are probably on Windows
|
||||||
|
find_program( PATCH patch C:/Program Files/Git/usr/bin C:/msys64/usr/bin C:/msys32/usr/bin C:/Strawberry/c/bin )
|
||||||
include( ExternalProject )
|
include( ExternalProject )
|
||||||
|
if( CMAKE_SIZEOF_VOID_P EQUAL 8 )
|
||||||
|
set( ZLIB_EXTRA -DAMD64=ON )
|
||||||
|
else()
|
||||||
|
set( ZLIB_EXTRA -DASM686=ON "-DCMAKE_ASM_MASM_FLAGS=/W0 /safeseh" )
|
||||||
|
endif()
|
||||||
ExternalProject_Add(zlib-project
|
ExternalProject_Add(zlib-project
|
||||||
URL http://zlib.net/zlib-1.2.8.tar.gz
|
URL http://zlib.net/zlib-1.2.8.tar.gz
|
||||||
URL_MD5 44d667c142d7cda120332623eab69f40
|
URL_MD5 44d667c142d7cda120332623eab69f40
|
||||||
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/zlib
|
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/zlib
|
||||||
# patch on Windows might be found in C:/Program Files/Git/usr/bin
|
PATCH_COMMAND "${PATCH}" -p0 < ${CMAKE_CURRENT_SOURCE_DIR}/cmake-zlib-static.patch
|
||||||
PATCH_COMMAND patch -p0 < ${CMAKE_CURRENT_SOURCE_DIR}/cmake-zlib-static.patch
|
&& "${PATCH}" -p0 < ${CMAKE_CURRENT_SOURCE_DIR}/cmake-zlib-amd64.patch
|
||||||
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
|
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
|
||||||
-DWITH_STATIC=${WITH_STATIC}
|
-DWITH_STATIC=${WITH_STATIC} ${ZLIB_EXTRA}
|
||||||
-DAMD64=ON -DASM686=ON "-DCMAKE_ASM_MASM_FLAGS=/W0 /safeseh"
|
|
||||||
)
|
)
|
||||||
if (WITH_PCH)
|
if (WITH_PCH)
|
||||||
add_dependencies( stdafx zlib-project )
|
add_dependencies( stdafx zlib-project )
|
||||||
@ -301,7 +326,7 @@ if (WITH_BINARY)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (WITH_HARDENING AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
if (WITH_HARDENING AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND NOT MSYS AND NOT MINGW)
|
||||||
set_target_properties("${PROJECT_NAME}" PROPERTIES LINK_FLAGS "-z relro -z now" )
|
set_target_properties("${PROJECT_NAME}" PROPERTIES LINK_FLAGS "-z relro -z now" )
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
@ -316,8 +341,119 @@ if (WITH_BINARY)
|
|||||||
endif ()
|
endif ()
|
||||||
target_link_libraries( "${PROJECT_NAME}" libi2pd i2pdclient ${DL_LIB} ${Boost_LIBRARIES} ${OPENSSL_LIBRARIES} ${ZLIB_LIBRARY} ${CMAKE_THREAD_LIBS_INIT} ${MINGW_EXTRA} )
|
target_link_libraries( "${PROJECT_NAME}" libi2pd i2pdclient ${DL_LIB} ${Boost_LIBRARIES} ${OPENSSL_LIBRARIES} ${ZLIB_LIBRARY} ${CMAKE_THREAD_LIBS_INIT} ${MINGW_EXTRA} )
|
||||||
|
|
||||||
install(TARGETS "${PROJECT_NAME}" RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} )
|
install(TARGETS "${PROJECT_NAME}" RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT Runtime)
|
||||||
|
set (APPS "\${CMAKE_INSTALL_PREFIX}/bin/${PROJECT_NAME}${CMAKE_EXECUTABLE_SUFFIX}")
|
||||||
|
set (DIRS "${Boost_LIBRARY_DIR};${OPENSSL_INCLUDE_DIR}/../bin;${ZLIB_INCLUDE_DIR}/../bin;/mingw32/bin")
|
||||||
if (MSVC)
|
if (MSVC)
|
||||||
install(FILES $<TARGET_PDB_FILE:${PROJECT_NAME}> DESTINATION "bin" CONFIGURATIONS DEBUG)
|
install(FILES $<TARGET_PDB_FILE:${PROJECT_NAME}> DESTINATION ${CMAKE_INSTALL_BINDIR} CONFIGURATIONS DEBUG RELWITHDEBINFO COMPONENT Symbols)
|
||||||
|
# TODO Somehow this picks lots of unrelevant stuff with MSYS. OS X testing needed.
|
||||||
|
INSTALL(CODE "
|
||||||
|
include(BundleUtilities)
|
||||||
|
fixup_bundle(\"${APPS}\" \"\" \"${DIRS}\")
|
||||||
|
" COMPONENT Runtime)
|
||||||
endif ()
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
install(FILES ../LICENSE
|
||||||
|
DESTINATION .
|
||||||
|
COMPONENT Runtime
|
||||||
|
)
|
||||||
|
# Take a copy on Appveyor
|
||||||
|
install(FILES "C:/projects/openssl-$ENV{OPENSSL}/LICENSE"
|
||||||
|
DESTINATION .
|
||||||
|
COMPONENT Runtime
|
||||||
|
RENAME LICENSE_OPENSSL
|
||||||
|
OPTIONAL # for local builds only!
|
||||||
|
)
|
||||||
|
|
||||||
|
file(GLOB_RECURSE I2PD_SOURCES "../*.cpp" "../build" "../Win32" "../Makefile*")
|
||||||
|
install(FILES ${I2PD_SOURCES} DESTINATION src/ COMPONENT Source)
|
||||||
|
# install(DIRECTORY ../ DESTINATION src/
|
||||||
|
# # OPTIONAL
|
||||||
|
# COMPONENT Source FILES_MATCHING
|
||||||
|
# PATTERN .git EXCLUDE
|
||||||
|
# PATTERN "*.cpp"
|
||||||
|
# )
|
||||||
|
|
||||||
|
file(GLOB I2PD_HEADERS "../*.h")
|
||||||
|
install(FILES ${I2PD_HEADERS} DESTINATION src/ COMPONENT Headers)
|
||||||
|
# install(DIRECTORY ../ DESTINATION src/
|
||||||
|
# # OPTIONAL
|
||||||
|
# COMPONENT Headers FILES_MATCHING
|
||||||
|
# PATTERN .git EXCLUDE
|
||||||
|
# PATTERN "*.h"
|
||||||
|
# )
|
||||||
|
|
||||||
|
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Purple I2P, a C++ I2P daemon")
|
||||||
|
set(CPACK_PACKAGE_VENDOR "Purple I2P")
|
||||||
|
set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/../README.md")
|
||||||
|
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/../LICENSE")
|
||||||
|
file(READ ../version.h version_h)
|
||||||
|
string(REGEX REPLACE ".*I2PD_VERSION_MAJOR ([0-9]+).*" "\\1" CPACK_PACKAGE_VERSION_MAJOR "${version_h}")
|
||||||
|
string(REGEX REPLACE ".*I2PD_VERSION_MINOR ([0-9]+).*" "\\1" CPACK_PACKAGE_VERSION_MINOR "${version_h}")
|
||||||
|
string(REGEX REPLACE ".*I2PD_VERSION_MICRO ([0-9]+).*" "\\1" CPACK_PACKAGE_VERSION_MICRO "${version_h}")
|
||||||
|
string(REGEX REPLACE ".*I2PD_VERSION_PATCH ([0-9]+).*" "\\1" CPACK_PACKAGE_VERSION_PATCH "${version_h}")
|
||||||
|
set(CPACK_PACKAGE_INSTALL_DIRECTORY "Purple I2P")# ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}")
|
||||||
|
include(CPackComponent)
|
||||||
|
cpack_add_component(Runtime
|
||||||
|
DESCRIPTION "Main files"
|
||||||
|
REQUIRED INSTALL_TYPES minimal)
|
||||||
|
cpack_add_component(Symbols
|
||||||
|
DISPLAY_NAME "Debug symbols"
|
||||||
|
DESCRIPTION "Debug symbols for use with WinDbg or Visual Studio"
|
||||||
|
INSTALL_TYPES recommended full
|
||||||
|
)
|
||||||
|
cpack_add_component(Libraries
|
||||||
|
DESCRIPTION "Binary libraries for development"
|
||||||
|
INSTALL_TYPES full dev3rd
|
||||||
|
)
|
||||||
|
cpack_add_component(Source
|
||||||
|
DISPLAY_NAME "Source code"
|
||||||
|
DESCRIPTION "I2pd source code"
|
||||||
|
INSTALL_TYPES full
|
||||||
|
)
|
||||||
|
cpack_add_component(Headers
|
||||||
|
DISPLAY_NAME "Header files"
|
||||||
|
DESCRIPTION "I2pd header files for development"
|
||||||
|
INSTALL_TYPES full dev3rd
|
||||||
|
)
|
||||||
|
install(FILES ${MINIUPNPC_INCLUDE_DIR}/miniupnpc/miniupnpc.dll
|
||||||
|
DESTINATION bin
|
||||||
|
COMPONENT MiniUPnPc
|
||||||
|
OPTIONAL
|
||||||
|
)
|
||||||
|
install(FILES ${MINIUPNPC_INCLUDE_DIR}/miniupnpc/LICENSE
|
||||||
|
DESTINATION .
|
||||||
|
COMPONENT MiniUPnPc
|
||||||
|
RENAME LICENSE_MINIUPNPC
|
||||||
|
OPTIONAL
|
||||||
|
)
|
||||||
|
cpack_add_component(MiniUPnPc
|
||||||
|
INSTALL_TYPES full recommended
|
||||||
|
# DOWNLOADED
|
||||||
|
# ARCHIVE_FILE miniupnpc-win32.zip
|
||||||
|
)
|
||||||
|
cpack_add_install_type(recommended DISPLAY_NAME Recommended)
|
||||||
|
cpack_add_install_type(dev3rd DISPLAY_NAME "Third party development")
|
||||||
|
cpack_add_install_type(full DISPLAY_NAME Full)
|
||||||
|
cpack_add_install_type(minimal DISPLAY_NAME Minimal)
|
||||||
|
if((WIN32 OR MSYS) AND NOT UNIX)
|
||||||
|
# There is a bug in NSI that does not handle full unix paths properly. Make
|
||||||
|
# sure there is at least one set of four (4) backlasshes.
|
||||||
|
set(CPACK_NSIS_DEFINES "RequestExecutionLevel user")
|
||||||
|
set(CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}/../Win32\\\\ictoopie.bmp")
|
||||||
|
set(CPACK_NSIS_INSTALLED_ICON_NAME "bin/i2pd.exe")
|
||||||
|
SET(CPACK_NSIS_DISPLAY_NAME "${CPACK_PACKAGE_DESCRIPTION_SUMMARY}")
|
||||||
|
set(CPACK_NSIS_HELP_LINK "https:\\\\\\\\github.com\\\\PurpleI2P\\\\i2pd\\\\issues")
|
||||||
|
set(CPACK_NSIS_URL_INFO_ABOUT "https:\\\\\\\\github.com\\\\PurpleI2P\\\\i2pd")
|
||||||
|
set(CPACK_NSIS_CREATE_ICONS_EXTRA "CreateShortCut '$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\Install i2pd as windows service.lnk' '$INSTDIR\\\\bin\\\\i2pd.exe' '--service=install'
|
||||||
|
CreateShortCut '$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\Remove i2pd windows service.lnk' '$INSTDIR\\\\bin\\\\i2pd.exe' '--service=remove'")
|
||||||
|
set(CPACK_NSIS_DELETE_ICONS_EXTRA "Delete '$SMPROGRAMS\\\\$START_MENU\\\\Install i2pd as windows service.lnk'
|
||||||
|
Delete '$SMPROGRAMS\\\\$START_MENU\\\\Remove i2pd windows service.lnk'")
|
||||||
|
else()
|
||||||
|
set(CPACK_STRIP_FILES "bin/i2pd")
|
||||||
|
set(CPACK_SOURCE_STRIP_FILES "")
|
||||||
|
endif()
|
||||||
|
set(CPACK_PACKAGE_EXECUTABLES "i2pd" "C++ I2P daemon")
|
||||||
|
set(CPACK_SOURCE_GENERATOR "TGZ")
|
||||||
|
include(CPack)
|
||||||
|
10
build/cmake-zlib-amd64.patch
Normal file
10
build/cmake-zlib-amd64.patch
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
--- CMakeLists.txt.orig 2015-12-07 14:19:36.447689600 -0600
|
||||||
|
+++ CMakeLists.txt 2015-12-07 14:18:23.004419900 -0600
|
||||||
|
@@ -165,6 +165,7 @@
|
||||||
|
ENABLE_LANGUAGE(ASM_MASM)
|
||||||
|
set(ZLIB_ASMS
|
||||||
|
contrib/masmx64/gvmat64.asm
|
||||||
|
+ contrib/masmx64/inffas8664.c
|
||||||
|
contrib/masmx64/inffasx64.asm
|
||||||
|
)
|
||||||
|
endif()
|
978
build/cmake_modules/NSIS.template.in
Normal file
978
build/cmake_modules/NSIS.template.in
Normal file
@ -0,0 +1,978 @@
|
|||||||
|
; CPack install script designed for a nmake build
|
||||||
|
|
||||||
|
;--------------------------------
|
||||||
|
; You must define these values
|
||||||
|
|
||||||
|
!define VERSION "@CPACK_PACKAGE_VERSION@"
|
||||||
|
!define PATCH "@CPACK_PACKAGE_VERSION_PATCH@"
|
||||||
|
!define INST_DIR "@CPACK_TEMPORARY_DIRECTORY@"
|
||||||
|
|
||||||
|
;--------------------------------
|
||||||
|
;Variables
|
||||||
|
|
||||||
|
Var MUI_TEMP
|
||||||
|
Var STARTMENU_FOLDER
|
||||||
|
Var SV_ALLUSERS
|
||||||
|
Var START_MENU
|
||||||
|
Var DO_NOT_ADD_TO_PATH
|
||||||
|
Var ADD_TO_PATH_ALL_USERS
|
||||||
|
Var ADD_TO_PATH_CURRENT_USER
|
||||||
|
Var INSTALL_DESKTOP
|
||||||
|
Var IS_DEFAULT_INSTALLDIR
|
||||||
|
;--------------------------------
|
||||||
|
;Include Modern UI
|
||||||
|
|
||||||
|
!include "MUI.nsh"
|
||||||
|
|
||||||
|
;Default installation folder
|
||||||
|
InstallDir "@CPACK_NSIS_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_DIRECTORY@"
|
||||||
|
|
||||||
|
;--------------------------------
|
||||||
|
;General
|
||||||
|
|
||||||
|
;Name and file
|
||||||
|
Name "@CPACK_NSIS_PACKAGE_NAME@"
|
||||||
|
OutFile "@CPACK_TOPLEVEL_DIRECTORY@/@CPACK_OUTPUT_FILE_NAME@"
|
||||||
|
|
||||||
|
;Set compression
|
||||||
|
SetCompressor @CPACK_NSIS_COMPRESSOR@
|
||||||
|
|
||||||
|
;Require administrator access
|
||||||
|
RequestExecutionLevel admin
|
||||||
|
|
||||||
|
@CPACK_NSIS_DEFINES@
|
||||||
|
|
||||||
|
!include Sections.nsh
|
||||||
|
|
||||||
|
;--- Component support macros: ---
|
||||||
|
; The code for the add/remove functionality is from:
|
||||||
|
; http://nsis.sourceforge.net/Add/Remove_Functionality
|
||||||
|
; It has been modified slightly and extended to provide
|
||||||
|
; inter-component dependencies.
|
||||||
|
Var AR_SecFlags
|
||||||
|
Var AR_RegFlags
|
||||||
|
@CPACK_NSIS_SECTION_SELECTED_VARS@
|
||||||
|
|
||||||
|
; Loads the "selected" flag for the section named SecName into the
|
||||||
|
; variable VarName.
|
||||||
|
!macro LoadSectionSelectedIntoVar SecName VarName
|
||||||
|
SectionGetFlags ${${SecName}} $${VarName}
|
||||||
|
IntOp $${VarName} $${VarName} & ${SF_SELECTED} ;Turn off all other bits
|
||||||
|
!macroend
|
||||||
|
|
||||||
|
; Loads the value of a variable... can we get around this?
|
||||||
|
!macro LoadVar VarName
|
||||||
|
IntOp $R0 0 + $${VarName}
|
||||||
|
!macroend
|
||||||
|
|
||||||
|
; Sets the value of a variable
|
||||||
|
!macro StoreVar VarName IntValue
|
||||||
|
IntOp $${VarName} 0 + ${IntValue}
|
||||||
|
!macroend
|
||||||
|
|
||||||
|
!macro InitSection SecName
|
||||||
|
; This macro reads component installed flag from the registry and
|
||||||
|
;changes checked state of the section on the components page.
|
||||||
|
;Input: section index constant name specified in Section command.
|
||||||
|
|
||||||
|
ClearErrors
|
||||||
|
;Reading component status from registry
|
||||||
|
ReadRegDWORD $AR_RegFlags HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\Components\${SecName}" "Installed"
|
||||||
|
IfErrors "default_${SecName}"
|
||||||
|
;Status will stay default if registry value not found
|
||||||
|
;(component was never installed)
|
||||||
|
IntOp $AR_RegFlags $AR_RegFlags & ${SF_SELECTED} ;Turn off all other bits
|
||||||
|
SectionGetFlags ${${SecName}} $AR_SecFlags ;Reading default section flags
|
||||||
|
IntOp $AR_SecFlags $AR_SecFlags & 0xFFFE ;Turn lowest (enabled) bit off
|
||||||
|
IntOp $AR_SecFlags $AR_RegFlags | $AR_SecFlags ;Change lowest bit
|
||||||
|
|
||||||
|
; Note whether this component was installed before
|
||||||
|
!insertmacro StoreVar ${SecName}_was_installed $AR_RegFlags
|
||||||
|
IntOp $R0 $AR_RegFlags & $AR_RegFlags
|
||||||
|
|
||||||
|
;Writing modified flags
|
||||||
|
SectionSetFlags ${${SecName}} $AR_SecFlags
|
||||||
|
|
||||||
|
"default_${SecName}:"
|
||||||
|
!insertmacro LoadSectionSelectedIntoVar ${SecName} ${SecName}_selected
|
||||||
|
!macroend
|
||||||
|
|
||||||
|
!macro FinishSection SecName
|
||||||
|
; This macro reads section flag set by user and removes the section
|
||||||
|
;if it is not selected.
|
||||||
|
;Then it writes component installed flag to registry
|
||||||
|
;Input: section index constant name specified in Section command.
|
||||||
|
|
||||||
|
SectionGetFlags ${${SecName}} $AR_SecFlags ;Reading section flags
|
||||||
|
;Checking lowest bit:
|
||||||
|
IntOp $AR_SecFlags $AR_SecFlags & ${SF_SELECTED}
|
||||||
|
IntCmp $AR_SecFlags 1 "leave_${SecName}"
|
||||||
|
;Section is not selected:
|
||||||
|
;Calling Section uninstall macro and writing zero installed flag
|
||||||
|
!insertmacro "Remove_${${SecName}}"
|
||||||
|
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\Components\${SecName}" \
|
||||||
|
"Installed" 0
|
||||||
|
Goto "exit_${SecName}"
|
||||||
|
|
||||||
|
"leave_${SecName}:"
|
||||||
|
;Section is selected:
|
||||||
|
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\Components\${SecName}" \
|
||||||
|
"Installed" 1
|
||||||
|
|
||||||
|
"exit_${SecName}:"
|
||||||
|
!macroend
|
||||||
|
|
||||||
|
!macro RemoveSection_CPack SecName
|
||||||
|
; This macro is used to call section's Remove_... macro
|
||||||
|
;from the uninstaller.
|
||||||
|
;Input: section index constant name specified in Section command.
|
||||||
|
|
||||||
|
!insertmacro "Remove_${${SecName}}"
|
||||||
|
!macroend
|
||||||
|
|
||||||
|
; Determine whether the selection of SecName changed
|
||||||
|
!macro MaybeSelectionChanged SecName
|
||||||
|
!insertmacro LoadVar ${SecName}_selected
|
||||||
|
SectionGetFlags ${${SecName}} $R1
|
||||||
|
IntOp $R1 $R1 & ${SF_SELECTED} ;Turn off all other bits
|
||||||
|
|
||||||
|
; See if the status has changed:
|
||||||
|
IntCmp $R0 $R1 "${SecName}_unchanged"
|
||||||
|
!insertmacro LoadSectionSelectedIntoVar ${SecName} ${SecName}_selected
|
||||||
|
|
||||||
|
IntCmp $R1 ${SF_SELECTED} "${SecName}_was_selected"
|
||||||
|
!insertmacro "Deselect_required_by_${SecName}"
|
||||||
|
goto "${SecName}_unchanged"
|
||||||
|
|
||||||
|
"${SecName}_was_selected:"
|
||||||
|
!insertmacro "Select_${SecName}_depends"
|
||||||
|
|
||||||
|
"${SecName}_unchanged:"
|
||||||
|
!macroend
|
||||||
|
;--- End of Add/Remove macros ---
|
||||||
|
|
||||||
|
;--------------------------------
|
||||||
|
;Interface Settings
|
||||||
|
|
||||||
|
!define MUI_HEADERIMAGE
|
||||||
|
!define MUI_ABORTWARNING
|
||||||
|
|
||||||
|
;--------------------------------
|
||||||
|
; path functions
|
||||||
|
|
||||||
|
!verbose 3
|
||||||
|
!include "WinMessages.NSH"
|
||||||
|
!verbose 4
|
||||||
|
|
||||||
|
;----------------------------------------
|
||||||
|
; based upon a script of "Written by KiCHiK 2003-01-18 05:57:02"
|
||||||
|
;----------------------------------------
|
||||||
|
!verbose 3
|
||||||
|
!include "WinMessages.NSH"
|
||||||
|
!verbose 4
|
||||||
|
;====================================================
|
||||||
|
; get_NT_environment
|
||||||
|
; Returns: the selected environment
|
||||||
|
; Output : head of the stack
|
||||||
|
;====================================================
|
||||||
|
!macro select_NT_profile UN
|
||||||
|
Function ${UN}select_NT_profile
|
||||||
|
StrCmp $ADD_TO_PATH_ALL_USERS "1" 0 environment_single
|
||||||
|
DetailPrint "Selected environment for all users"
|
||||||
|
Push "all"
|
||||||
|
Return
|
||||||
|
environment_single:
|
||||||
|
DetailPrint "Selected environment for current user only."
|
||||||
|
Push "current"
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
||||||
|
!macroend
|
||||||
|
!insertmacro select_NT_profile ""
|
||||||
|
!insertmacro select_NT_profile "un."
|
||||||
|
;----------------------------------------------------
|
||||||
|
!define NT_current_env 'HKCU "Environment"'
|
||||||
|
!define NT_all_env 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'
|
||||||
|
|
||||||
|
!ifndef WriteEnvStr_RegKey
|
||||||
|
!ifdef ALL_USERS
|
||||||
|
!define WriteEnvStr_RegKey \
|
||||||
|
'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'
|
||||||
|
!else
|
||||||
|
!define WriteEnvStr_RegKey 'HKCU "Environment"'
|
||||||
|
!endif
|
||||||
|
!endif
|
||||||
|
|
||||||
|
; AddToPath - Adds the given dir to the search path.
|
||||||
|
; Input - head of the stack
|
||||||
|
; Note - Win9x systems requires reboot
|
||||||
|
|
||||||
|
Function AddToPath
|
||||||
|
Exch $0
|
||||||
|
Push $1
|
||||||
|
Push $2
|
||||||
|
Push $3
|
||||||
|
|
||||||
|
# don't add if the path doesn't exist
|
||||||
|
IfFileExists "$0\*.*" "" AddToPath_done
|
||||||
|
|
||||||
|
ReadEnvStr $1 PATH
|
||||||
|
; if the path is too long for a NSIS variable NSIS will return a 0
|
||||||
|
; length string. If we find that, then warn and skip any path
|
||||||
|
; modification as it will trash the existing path.
|
||||||
|
StrLen $2 $1
|
||||||
|
IntCmp $2 0 CheckPathLength_ShowPathWarning CheckPathLength_Done CheckPathLength_Done
|
||||||
|
CheckPathLength_ShowPathWarning:
|
||||||
|
Messagebox MB_OK|MB_ICONEXCLAMATION "Warning! PATH too long installer unable to modify PATH!"
|
||||||
|
Goto AddToPath_done
|
||||||
|
CheckPathLength_Done:
|
||||||
|
Push "$1;"
|
||||||
|
Push "$0;"
|
||||||
|
Call StrStr
|
||||||
|
Pop $2
|
||||||
|
StrCmp $2 "" "" AddToPath_done
|
||||||
|
Push "$1;"
|
||||||
|
Push "$0\;"
|
||||||
|
Call StrStr
|
||||||
|
Pop $2
|
||||||
|
StrCmp $2 "" "" AddToPath_done
|
||||||
|
GetFullPathName /SHORT $3 $0
|
||||||
|
Push "$1;"
|
||||||
|
Push "$3;"
|
||||||
|
Call StrStr
|
||||||
|
Pop $2
|
||||||
|
StrCmp $2 "" "" AddToPath_done
|
||||||
|
Push "$1;"
|
||||||
|
Push "$3\;"
|
||||||
|
Call StrStr
|
||||||
|
Pop $2
|
||||||
|
StrCmp $2 "" "" AddToPath_done
|
||||||
|
|
||||||
|
Call IsNT
|
||||||
|
Pop $1
|
||||||
|
StrCmp $1 1 AddToPath_NT
|
||||||
|
; Not on NT
|
||||||
|
StrCpy $1 $WINDIR 2
|
||||||
|
FileOpen $1 "$1\autoexec.bat" a
|
||||||
|
FileSeek $1 -1 END
|
||||||
|
FileReadByte $1 $2
|
||||||
|
IntCmp $2 26 0 +2 +2 # DOS EOF
|
||||||
|
FileSeek $1 -1 END # write over EOF
|
||||||
|
FileWrite $1 "$\r$\nSET PATH=%PATH%;$3$\r$\n"
|
||||||
|
FileClose $1
|
||||||
|
SetRebootFlag true
|
||||||
|
Goto AddToPath_done
|
||||||
|
|
||||||
|
AddToPath_NT:
|
||||||
|
StrCmp $ADD_TO_PATH_ALL_USERS "1" ReadAllKey
|
||||||
|
ReadRegStr $1 ${NT_current_env} "PATH"
|
||||||
|
Goto DoTrim
|
||||||
|
ReadAllKey:
|
||||||
|
ReadRegStr $1 ${NT_all_env} "PATH"
|
||||||
|
DoTrim:
|
||||||
|
StrCmp $1 "" AddToPath_NTdoIt
|
||||||
|
Push $1
|
||||||
|
Call Trim
|
||||||
|
Pop $1
|
||||||
|
StrCpy $0 "$1;$0"
|
||||||
|
AddToPath_NTdoIt:
|
||||||
|
StrCmp $ADD_TO_PATH_ALL_USERS "1" WriteAllKey
|
||||||
|
WriteRegExpandStr ${NT_current_env} "PATH" $0
|
||||||
|
Goto DoSend
|
||||||
|
WriteAllKey:
|
||||||
|
WriteRegExpandStr ${NT_all_env} "PATH" $0
|
||||||
|
DoSend:
|
||||||
|
SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
|
||||||
|
|
||||||
|
AddToPath_done:
|
||||||
|
Pop $3
|
||||||
|
Pop $2
|
||||||
|
Pop $1
|
||||||
|
Pop $0
|
||||||
|
FunctionEnd
|
||||||
|
|
||||||
|
|
||||||
|
; RemoveFromPath - Remove a given dir from the path
|
||||||
|
; Input: head of the stack
|
||||||
|
|
||||||
|
Function un.RemoveFromPath
|
||||||
|
Exch $0
|
||||||
|
Push $1
|
||||||
|
Push $2
|
||||||
|
Push $3
|
||||||
|
Push $4
|
||||||
|
Push $5
|
||||||
|
Push $6
|
||||||
|
|
||||||
|
IntFmt $6 "%c" 26 # DOS EOF
|
||||||
|
|
||||||
|
Call un.IsNT
|
||||||
|
Pop $1
|
||||||
|
StrCmp $1 1 unRemoveFromPath_NT
|
||||||
|
; Not on NT
|
||||||
|
StrCpy $1 $WINDIR 2
|
||||||
|
FileOpen $1 "$1\autoexec.bat" r
|
||||||
|
GetTempFileName $4
|
||||||
|
FileOpen $2 $4 w
|
||||||
|
GetFullPathName /SHORT $0 $0
|
||||||
|
StrCpy $0 "SET PATH=%PATH%;$0"
|
||||||
|
Goto unRemoveFromPath_dosLoop
|
||||||
|
|
||||||
|
unRemoveFromPath_dosLoop:
|
||||||
|
FileRead $1 $3
|
||||||
|
StrCpy $5 $3 1 -1 # read last char
|
||||||
|
StrCmp $5 $6 0 +2 # if DOS EOF
|
||||||
|
StrCpy $3 $3 -1 # remove DOS EOF so we can compare
|
||||||
|
StrCmp $3 "$0$\r$\n" unRemoveFromPath_dosLoopRemoveLine
|
||||||
|
StrCmp $3 "$0$\n" unRemoveFromPath_dosLoopRemoveLine
|
||||||
|
StrCmp $3 "$0" unRemoveFromPath_dosLoopRemoveLine
|
||||||
|
StrCmp $3 "" unRemoveFromPath_dosLoopEnd
|
||||||
|
FileWrite $2 $3
|
||||||
|
Goto unRemoveFromPath_dosLoop
|
||||||
|
unRemoveFromPath_dosLoopRemoveLine:
|
||||||
|
SetRebootFlag true
|
||||||
|
Goto unRemoveFromPath_dosLoop
|
||||||
|
|
||||||
|
unRemoveFromPath_dosLoopEnd:
|
||||||
|
FileClose $2
|
||||||
|
FileClose $1
|
||||||
|
StrCpy $1 $WINDIR 2
|
||||||
|
Delete "$1\autoexec.bat"
|
||||||
|
CopyFiles /SILENT $4 "$1\autoexec.bat"
|
||||||
|
Delete $4
|
||||||
|
Goto unRemoveFromPath_done
|
||||||
|
|
||||||
|
unRemoveFromPath_NT:
|
||||||
|
StrCmp $ADD_TO_PATH_ALL_USERS "1" unReadAllKey
|
||||||
|
ReadRegStr $1 ${NT_current_env} "PATH"
|
||||||
|
Goto unDoTrim
|
||||||
|
unReadAllKey:
|
||||||
|
ReadRegStr $1 ${NT_all_env} "PATH"
|
||||||
|
unDoTrim:
|
||||||
|
StrCpy $5 $1 1 -1 # copy last char
|
||||||
|
StrCmp $5 ";" +2 # if last char != ;
|
||||||
|
StrCpy $1 "$1;" # append ;
|
||||||
|
Push $1
|
||||||
|
Push "$0;"
|
||||||
|
Call un.StrStr ; Find `$0;` in $1
|
||||||
|
Pop $2 ; pos of our dir
|
||||||
|
StrCmp $2 "" unRemoveFromPath_done
|
||||||
|
; else, it is in path
|
||||||
|
# $0 - path to add
|
||||||
|
# $1 - path var
|
||||||
|
StrLen $3 "$0;"
|
||||||
|
StrLen $4 $2
|
||||||
|
StrCpy $5 $1 -$4 # $5 is now the part before the path to remove
|
||||||
|
StrCpy $6 $2 "" $3 # $6 is now the part after the path to remove
|
||||||
|
StrCpy $3 $5$6
|
||||||
|
|
||||||
|
StrCpy $5 $3 1 -1 # copy last char
|
||||||
|
StrCmp $5 ";" 0 +2 # if last char == ;
|
||||||
|
StrCpy $3 $3 -1 # remove last char
|
||||||
|
|
||||||
|
StrCmp $ADD_TO_PATH_ALL_USERS "1" unWriteAllKey
|
||||||
|
WriteRegExpandStr ${NT_current_env} "PATH" $3
|
||||||
|
Goto unDoSend
|
||||||
|
unWriteAllKey:
|
||||||
|
WriteRegExpandStr ${NT_all_env} "PATH" $3
|
||||||
|
unDoSend:
|
||||||
|
SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
|
||||||
|
|
||||||
|
unRemoveFromPath_done:
|
||||||
|
Pop $6
|
||||||
|
Pop $5
|
||||||
|
Pop $4
|
||||||
|
Pop $3
|
||||||
|
Pop $2
|
||||||
|
Pop $1
|
||||||
|
Pop $0
|
||||||
|
FunctionEnd
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
; Uninstall sutff
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
###########################################
|
||||||
|
# Utility Functions #
|
||||||
|
###########################################
|
||||||
|
|
||||||
|
;====================================================
|
||||||
|
; IsNT - Returns 1 if the current system is NT, 0
|
||||||
|
; otherwise.
|
||||||
|
; Output: head of the stack
|
||||||
|
;====================================================
|
||||||
|
; IsNT
|
||||||
|
; no input
|
||||||
|
; output, top of the stack = 1 if NT or 0 if not
|
||||||
|
;
|
||||||
|
; Usage:
|
||||||
|
; Call IsNT
|
||||||
|
; Pop $R0
|
||||||
|
; ($R0 at this point is 1 or 0)
|
||||||
|
|
||||||
|
!macro IsNT un
|
||||||
|
Function ${un}IsNT
|
||||||
|
Push $0
|
||||||
|
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion
|
||||||
|
StrCmp $0 "" 0 IsNT_yes
|
||||||
|
; we are not NT.
|
||||||
|
Pop $0
|
||||||
|
Push 0
|
||||||
|
Return
|
||||||
|
|
||||||
|
IsNT_yes:
|
||||||
|
; NT!!!
|
||||||
|
Pop $0
|
||||||
|
Push 1
|
||||||
|
FunctionEnd
|
||||||
|
!macroend
|
||||||
|
!insertmacro IsNT ""
|
||||||
|
!insertmacro IsNT "un."
|
||||||
|
|
||||||
|
; StrStr
|
||||||
|
; input, top of stack = string to search for
|
||||||
|
; top of stack-1 = string to search in
|
||||||
|
; output, top of stack (replaces with the portion of the string remaining)
|
||||||
|
; modifies no other variables.
|
||||||
|
;
|
||||||
|
; Usage:
|
||||||
|
; Push "this is a long ass string"
|
||||||
|
; Push "ass"
|
||||||
|
; Call StrStr
|
||||||
|
; Pop $R0
|
||||||
|
; ($R0 at this point is "ass string")
|
||||||
|
|
||||||
|
!macro StrStr un
|
||||||
|
Function ${un}StrStr
|
||||||
|
Exch $R1 ; st=haystack,old$R1, $R1=needle
|
||||||
|
Exch ; st=old$R1,haystack
|
||||||
|
Exch $R2 ; st=old$R1,old$R2, $R2=haystack
|
||||||
|
Push $R3
|
||||||
|
Push $R4
|
||||||
|
Push $R5
|
||||||
|
StrLen $R3 $R1
|
||||||
|
StrCpy $R4 0
|
||||||
|
; $R1=needle
|
||||||
|
; $R2=haystack
|
||||||
|
; $R3=len(needle)
|
||||||
|
; $R4=cnt
|
||||||
|
; $R5=tmp
|
||||||
|
loop:
|
||||||
|
StrCpy $R5 $R2 $R3 $R4
|
||||||
|
StrCmp $R5 $R1 done
|
||||||
|
StrCmp $R5 "" done
|
||||||
|
IntOp $R4 $R4 + 1
|
||||||
|
Goto loop
|
||||||
|
done:
|
||||||
|
StrCpy $R1 $R2 "" $R4
|
||||||
|
Pop $R5
|
||||||
|
Pop $R4
|
||||||
|
Pop $R3
|
||||||
|
Pop $R2
|
||||||
|
Exch $R1
|
||||||
|
FunctionEnd
|
||||||
|
!macroend
|
||||||
|
!insertmacro StrStr ""
|
||||||
|
!insertmacro StrStr "un."
|
||||||
|
|
||||||
|
Function Trim ; Added by Pelaca
|
||||||
|
Exch $R1
|
||||||
|
Push $R2
|
||||||
|
Loop:
|
||||||
|
StrCpy $R2 "$R1" 1 -1
|
||||||
|
StrCmp "$R2" " " RTrim
|
||||||
|
StrCmp "$R2" "$\n" RTrim
|
||||||
|
StrCmp "$R2" "$\r" RTrim
|
||||||
|
StrCmp "$R2" ";" RTrim
|
||||||
|
GoTo Done
|
||||||
|
RTrim:
|
||||||
|
StrCpy $R1 "$R1" -1
|
||||||
|
Goto Loop
|
||||||
|
Done:
|
||||||
|
Pop $R2
|
||||||
|
Exch $R1
|
||||||
|
FunctionEnd
|
||||||
|
|
||||||
|
Function ConditionalAddToRegisty
|
||||||
|
Pop $0
|
||||||
|
Pop $1
|
||||||
|
StrCmp "$0" "" ConditionalAddToRegisty_EmptyString
|
||||||
|
WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" \
|
||||||
|
"$1" "$0"
|
||||||
|
;MessageBox MB_OK "Set Registry: '$1' to '$0'"
|
||||||
|
DetailPrint "Set install registry entry: '$1' to '$0'"
|
||||||
|
ConditionalAddToRegisty_EmptyString:
|
||||||
|
FunctionEnd
|
||||||
|
|
||||||
|
;--------------------------------
|
||||||
|
|
||||||
|
!ifdef CPACK_USES_DOWNLOAD
|
||||||
|
Function DownloadFile
|
||||||
|
IfFileExists $INSTDIR\* +2
|
||||||
|
CreateDirectory $INSTDIR
|
||||||
|
Pop $0
|
||||||
|
|
||||||
|
; Skip if already downloaded
|
||||||
|
IfFileExists $INSTDIR\$0 0 +2
|
||||||
|
Return
|
||||||
|
|
||||||
|
StrCpy $1 "@CPACK_DOWNLOAD_SITE@"
|
||||||
|
|
||||||
|
try_again:
|
||||||
|
NSISdl::download "$1/$0" "$INSTDIR\$0"
|
||||||
|
|
||||||
|
Pop $1
|
||||||
|
StrCmp $1 "success" success
|
||||||
|
StrCmp $1 "Cancelled" cancel
|
||||||
|
MessageBox MB_OK "Download failed: $1"
|
||||||
|
cancel:
|
||||||
|
Return
|
||||||
|
success:
|
||||||
|
FunctionEnd
|
||||||
|
!endif
|
||||||
|
|
||||||
|
;--------------------------------
|
||||||
|
; Installation types
|
||||||
|
@CPACK_NSIS_INSTALLATION_TYPES@
|
||||||
|
|
||||||
|
;--------------------------------
|
||||||
|
; Component sections
|
||||||
|
@CPACK_NSIS_COMPONENT_SECTIONS@
|
||||||
|
|
||||||
|
;--------------------------------
|
||||||
|
; Define some macro setting for the gui
|
||||||
|
@CPACK_NSIS_INSTALLER_MUI_ICON_CODE@
|
||||||
|
@CPACK_NSIS_INSTALLER_ICON_CODE@
|
||||||
|
@CPACK_NSIS_INSTALLER_MUI_COMPONENTS_DESC@
|
||||||
|
@CPACK_NSIS_INSTALLER_MUI_FINISHPAGE_RUN_CODE@
|
||||||
|
|
||||||
|
;--------------------------------
|
||||||
|
;Pages
|
||||||
|
!insertmacro MUI_PAGE_WELCOME
|
||||||
|
|
||||||
|
!insertmacro MUI_PAGE_LICENSE "@CPACK_RESOURCE_FILE_LICENSE@"
|
||||||
|
Page custom InstallOptionsPage
|
||||||
|
!insertmacro MUI_PAGE_DIRECTORY
|
||||||
|
|
||||||
|
;Start Menu Folder Page Configuration
|
||||||
|
!define MUI_STARTMENUPAGE_REGISTRY_ROOT "SHCTX"
|
||||||
|
!define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@"
|
||||||
|
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"
|
||||||
|
!define MUI_STARTMENUPAGE_DEFAULTFOLDER "Purple I2P"
|
||||||
|
!insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER
|
||||||
|
|
||||||
|
@CPACK_NSIS_PAGE_COMPONENTS@
|
||||||
|
|
||||||
|
!insertmacro MUI_PAGE_INSTFILES
|
||||||
|
!insertmacro MUI_PAGE_FINISH
|
||||||
|
|
||||||
|
!insertmacro MUI_UNPAGE_CONFIRM
|
||||||
|
!insertmacro MUI_UNPAGE_INSTFILES
|
||||||
|
|
||||||
|
;--------------------------------
|
||||||
|
;Languages
|
||||||
|
|
||||||
|
!insertmacro MUI_LANGUAGE "English" ;first language is the default language
|
||||||
|
!insertmacro MUI_LANGUAGE "Albanian"
|
||||||
|
!insertmacro MUI_LANGUAGE "Arabic"
|
||||||
|
!insertmacro MUI_LANGUAGE "Basque"
|
||||||
|
!insertmacro MUI_LANGUAGE "Belarusian"
|
||||||
|
!insertmacro MUI_LANGUAGE "Bosnian"
|
||||||
|
!insertmacro MUI_LANGUAGE "Breton"
|
||||||
|
!insertmacro MUI_LANGUAGE "Bulgarian"
|
||||||
|
!insertmacro MUI_LANGUAGE "Croatian"
|
||||||
|
!insertmacro MUI_LANGUAGE "Czech"
|
||||||
|
!insertmacro MUI_LANGUAGE "Danish"
|
||||||
|
!insertmacro MUI_LANGUAGE "Dutch"
|
||||||
|
!insertmacro MUI_LANGUAGE "Estonian"
|
||||||
|
!insertmacro MUI_LANGUAGE "Farsi"
|
||||||
|
!insertmacro MUI_LANGUAGE "Finnish"
|
||||||
|
!insertmacro MUI_LANGUAGE "French"
|
||||||
|
!insertmacro MUI_LANGUAGE "German"
|
||||||
|
!insertmacro MUI_LANGUAGE "Greek"
|
||||||
|
!insertmacro MUI_LANGUAGE "Hebrew"
|
||||||
|
!insertmacro MUI_LANGUAGE "Hungarian"
|
||||||
|
!insertmacro MUI_LANGUAGE "Icelandic"
|
||||||
|
!insertmacro MUI_LANGUAGE "Indonesian"
|
||||||
|
!insertmacro MUI_LANGUAGE "Irish"
|
||||||
|
!insertmacro MUI_LANGUAGE "Italian"
|
||||||
|
!insertmacro MUI_LANGUAGE "Japanese"
|
||||||
|
!insertmacro MUI_LANGUAGE "Korean"
|
||||||
|
!insertmacro MUI_LANGUAGE "Kurdish"
|
||||||
|
!insertmacro MUI_LANGUAGE "Latvian"
|
||||||
|
!insertmacro MUI_LANGUAGE "Lithuanian"
|
||||||
|
!insertmacro MUI_LANGUAGE "Luxembourgish"
|
||||||
|
!insertmacro MUI_LANGUAGE "Macedonian"
|
||||||
|
!insertmacro MUI_LANGUAGE "Malay"
|
||||||
|
!insertmacro MUI_LANGUAGE "Mongolian"
|
||||||
|
!insertmacro MUI_LANGUAGE "Norwegian"
|
||||||
|
!insertmacro MUI_LANGUAGE "Polish"
|
||||||
|
!insertmacro MUI_LANGUAGE "Portuguese"
|
||||||
|
!insertmacro MUI_LANGUAGE "PortugueseBR"
|
||||||
|
!insertmacro MUI_LANGUAGE "Romanian"
|
||||||
|
!insertmacro MUI_LANGUAGE "Russian"
|
||||||
|
!insertmacro MUI_LANGUAGE "Serbian"
|
||||||
|
!insertmacro MUI_LANGUAGE "SerbianLatin"
|
||||||
|
!insertmacro MUI_LANGUAGE "SimpChinese"
|
||||||
|
!insertmacro MUI_LANGUAGE "Slovak"
|
||||||
|
!insertmacro MUI_LANGUAGE "Slovenian"
|
||||||
|
!insertmacro MUI_LANGUAGE "Spanish"
|
||||||
|
!insertmacro MUI_LANGUAGE "Swedish"
|
||||||
|
!insertmacro MUI_LANGUAGE "Thai"
|
||||||
|
!insertmacro MUI_LANGUAGE "TradChinese"
|
||||||
|
!insertmacro MUI_LANGUAGE "Turkish"
|
||||||
|
!insertmacro MUI_LANGUAGE "Ukrainian"
|
||||||
|
!insertmacro MUI_LANGUAGE "Welsh"
|
||||||
|
|
||||||
|
|
||||||
|
;--------------------------------
|
||||||
|
;Reserve Files
|
||||||
|
|
||||||
|
;These files should be inserted before other files in the data block
|
||||||
|
;Keep these lines before any File command
|
||||||
|
;Only for solid compression (by default, solid compression is enabled for BZIP2 and LZMA)
|
||||||
|
|
||||||
|
ReserveFile "NSIS.InstallOptions.ini"
|
||||||
|
!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
|
||||||
|
|
||||||
|
;--------------------------------
|
||||||
|
;Installer Sections
|
||||||
|
|
||||||
|
Section "-Core installation"
|
||||||
|
;Use the entire tree produced by the INSTALL target. Keep the
|
||||||
|
;list of directories here in sync with the RMDir commands below.
|
||||||
|
SetOutPath "$INSTDIR"
|
||||||
|
@CPACK_NSIS_EXTRA_PREINSTALL_COMMANDS@
|
||||||
|
@CPACK_NSIS_FULL_INSTALL@
|
||||||
|
|
||||||
|
;Store installation folder
|
||||||
|
WriteRegStr SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "" $INSTDIR
|
||||||
|
|
||||||
|
;Create uninstaller
|
||||||
|
WriteUninstaller "$INSTDIR\Uninstall.exe"
|
||||||
|
Push "DisplayName"
|
||||||
|
Push "@CPACK_NSIS_DISPLAY_NAME@"
|
||||||
|
Call ConditionalAddToRegisty
|
||||||
|
Push "DisplayVersion"
|
||||||
|
Push "@CPACK_PACKAGE_VERSION@"
|
||||||
|
Call ConditionalAddToRegisty
|
||||||
|
Push "Publisher"
|
||||||
|
Push "@CPACK_PACKAGE_VENDOR@"
|
||||||
|
Call ConditionalAddToRegisty
|
||||||
|
Push "UninstallString"
|
||||||
|
Push "$INSTDIR\Uninstall.exe"
|
||||||
|
Call ConditionalAddToRegisty
|
||||||
|
Push "NoRepair"
|
||||||
|
Push "1"
|
||||||
|
Call ConditionalAddToRegisty
|
||||||
|
|
||||||
|
!ifdef CPACK_NSIS_ADD_REMOVE
|
||||||
|
;Create add/remove functionality
|
||||||
|
Push "ModifyPath"
|
||||||
|
Push "$INSTDIR\AddRemove.exe"
|
||||||
|
Call ConditionalAddToRegisty
|
||||||
|
!else
|
||||||
|
Push "NoModify"
|
||||||
|
Push "1"
|
||||||
|
Call ConditionalAddToRegisty
|
||||||
|
!endif
|
||||||
|
|
||||||
|
; Optional registration
|
||||||
|
Push "DisplayIcon"
|
||||||
|
Push "$INSTDIR\@CPACK_NSIS_INSTALLED_ICON_NAME@"
|
||||||
|
Call ConditionalAddToRegisty
|
||||||
|
Push "HelpLink"
|
||||||
|
Push "@CPACK_NSIS_HELP_LINK@"
|
||||||
|
Call ConditionalAddToRegisty
|
||||||
|
Push "URLInfoAbout"
|
||||||
|
Push "@CPACK_NSIS_URL_INFO_ABOUT@"
|
||||||
|
Call ConditionalAddToRegisty
|
||||||
|
Push "Contact"
|
||||||
|
Push "@CPACK_NSIS_CONTACT@"
|
||||||
|
Call ConditionalAddToRegisty
|
||||||
|
!insertmacro MUI_INSTALLOPTIONS_READ $INSTALL_DESKTOP "NSIS.InstallOptions.ini" "Field 5" "State"
|
||||||
|
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
|
||||||
|
|
||||||
|
;Create shortcuts
|
||||||
|
CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER"
|
||||||
|
@CPACK_NSIS_CREATE_ICONS@
|
||||||
|
@CPACK_NSIS_CREATE_ICONS_EXTRA@
|
||||||
|
CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
|
||||||
|
|
||||||
|
;Read a value from an InstallOptions INI file
|
||||||
|
!insertmacro MUI_INSTALLOPTIONS_READ $DO_NOT_ADD_TO_PATH "NSIS.InstallOptions.ini" "Field 2" "State"
|
||||||
|
!insertmacro MUI_INSTALLOPTIONS_READ $ADD_TO_PATH_ALL_USERS "NSIS.InstallOptions.ini" "Field 3" "State"
|
||||||
|
!insertmacro MUI_INSTALLOPTIONS_READ $ADD_TO_PATH_CURRENT_USER "NSIS.InstallOptions.ini" "Field 4" "State"
|
||||||
|
|
||||||
|
; Write special uninstall registry entries
|
||||||
|
Push "StartMenu"
|
||||||
|
Push "$STARTMENU_FOLDER"
|
||||||
|
Call ConditionalAddToRegisty
|
||||||
|
Push "DoNotAddToPath"
|
||||||
|
Push "$DO_NOT_ADD_TO_PATH"
|
||||||
|
Call ConditionalAddToRegisty
|
||||||
|
Push "AddToPathAllUsers"
|
||||||
|
Push "$ADD_TO_PATH_ALL_USERS"
|
||||||
|
Call ConditionalAddToRegisty
|
||||||
|
Push "AddToPathCurrentUser"
|
||||||
|
Push "$ADD_TO_PATH_CURRENT_USER"
|
||||||
|
Call ConditionalAddToRegisty
|
||||||
|
Push "InstallToDesktop"
|
||||||
|
Push "$INSTALL_DESKTOP"
|
||||||
|
Call ConditionalAddToRegisty
|
||||||
|
|
||||||
|
!insertmacro MUI_STARTMENU_WRITE_END
|
||||||
|
|
||||||
|
@CPACK_NSIS_EXTRA_INSTALL_COMMANDS@
|
||||||
|
|
||||||
|
SectionEnd
|
||||||
|
|
||||||
|
Section "-Add to path"
|
||||||
|
Push $INSTDIR\bin
|
||||||
|
StrCmp "@CPACK_NSIS_MODIFY_PATH@" "ON" 0 doNotAddToPath
|
||||||
|
StrCmp $DO_NOT_ADD_TO_PATH "1" doNotAddToPath 0
|
||||||
|
Call AddToPath
|
||||||
|
doNotAddToPath:
|
||||||
|
SectionEnd
|
||||||
|
|
||||||
|
;--------------------------------
|
||||||
|
; Create custom pages
|
||||||
|
Function InstallOptionsPage
|
||||||
|
!insertmacro MUI_HEADER_TEXT "Install Options" "Choose options for installing @CPACK_NSIS_PACKAGE_NAME@"
|
||||||
|
!insertmacro MUI_INSTALLOPTIONS_DISPLAY "NSIS.InstallOptions.ini"
|
||||||
|
|
||||||
|
FunctionEnd
|
||||||
|
|
||||||
|
;--------------------------------
|
||||||
|
; determine admin versus local install
|
||||||
|
Function un.onInit
|
||||||
|
|
||||||
|
ClearErrors
|
||||||
|
UserInfo::GetName
|
||||||
|
IfErrors noLM
|
||||||
|
Pop $0
|
||||||
|
UserInfo::GetAccountType
|
||||||
|
Pop $1
|
||||||
|
StrCmp $1 "Admin" 0 +3
|
||||||
|
SetShellVarContext all
|
||||||
|
;MessageBox MB_OK 'User "$0" is in the Admin group'
|
||||||
|
Goto done
|
||||||
|
StrCmp $1 "Power" 0 +3
|
||||||
|
SetShellVarContext all
|
||||||
|
;MessageBox MB_OK 'User "$0" is in the Power Users group'
|
||||||
|
Goto done
|
||||||
|
|
||||||
|
noLM:
|
||||||
|
;Get installation folder from registry if available
|
||||||
|
|
||||||
|
done:
|
||||||
|
|
||||||
|
FunctionEnd
|
||||||
|
|
||||||
|
;--- Add/Remove callback functions: ---
|
||||||
|
!macro SectionList MacroName
|
||||||
|
;This macro used to perform operation on multiple sections.
|
||||||
|
;List all of your components in following manner here.
|
||||||
|
@CPACK_NSIS_COMPONENT_SECTION_LIST@
|
||||||
|
!macroend
|
||||||
|
|
||||||
|
Section -FinishComponents
|
||||||
|
;Removes unselected components and writes component status to registry
|
||||||
|
!insertmacro SectionList "FinishSection"
|
||||||
|
|
||||||
|
!ifdef CPACK_NSIS_ADD_REMOVE
|
||||||
|
; Get the name of the installer executable
|
||||||
|
System::Call 'kernel32::GetModuleFileNameA(i 0, t .R0, i 1024) i r1'
|
||||||
|
StrCpy $R3 $R0
|
||||||
|
|
||||||
|
; Strip off the last 13 characters, to see if we have AddRemove.exe
|
||||||
|
StrLen $R1 $R0
|
||||||
|
IntOp $R1 $R0 - 13
|
||||||
|
StrCpy $R2 $R0 13 $R1
|
||||||
|
StrCmp $R2 "AddRemove.exe" addremove_installed
|
||||||
|
|
||||||
|
; We're not running AddRemove.exe, so install it
|
||||||
|
CopyFiles $R3 $INSTDIR\AddRemove.exe
|
||||||
|
|
||||||
|
addremove_installed:
|
||||||
|
!endif
|
||||||
|
SectionEnd
|
||||||
|
;--- End of Add/Remove callback functions ---
|
||||||
|
|
||||||
|
;--------------------------------
|
||||||
|
; Component dependencies
|
||||||
|
Function .onSelChange
|
||||||
|
!insertmacro SectionList MaybeSelectionChanged
|
||||||
|
FunctionEnd
|
||||||
|
|
||||||
|
;--------------------------------
|
||||||
|
;Uninstaller Section
|
||||||
|
|
||||||
|
Section "Uninstall"
|
||||||
|
ReadRegStr $START_MENU SHCTX \
|
||||||
|
"Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "StartMenu"
|
||||||
|
;MessageBox MB_OK "Start menu is in: $START_MENU"
|
||||||
|
ReadRegStr $DO_NOT_ADD_TO_PATH SHCTX \
|
||||||
|
"Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "DoNotAddToPath"
|
||||||
|
ReadRegStr $ADD_TO_PATH_ALL_USERS SHCTX \
|
||||||
|
"Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "AddToPathAllUsers"
|
||||||
|
ReadRegStr $ADD_TO_PATH_CURRENT_USER SHCTX \
|
||||||
|
"Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "AddToPathCurrentUser"
|
||||||
|
;MessageBox MB_OK "Add to path: $DO_NOT_ADD_TO_PATH all users: $ADD_TO_PATH_ALL_USERS"
|
||||||
|
ReadRegStr $INSTALL_DESKTOP SHCTX \
|
||||||
|
"Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "InstallToDesktop"
|
||||||
|
;MessageBox MB_OK "Install to desktop: $INSTALL_DESKTOP "
|
||||||
|
|
||||||
|
@CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS@
|
||||||
|
|
||||||
|
;Remove files we installed.
|
||||||
|
;Keep the list of directories here in sync with the File commands above.
|
||||||
|
@CPACK_NSIS_DELETE_FILES@
|
||||||
|
@CPACK_NSIS_DELETE_DIRECTORIES@
|
||||||
|
|
||||||
|
!ifdef CPACK_NSIS_ADD_REMOVE
|
||||||
|
;Remove the add/remove program
|
||||||
|
Delete "$INSTDIR\AddRemove.exe"
|
||||||
|
!endif
|
||||||
|
|
||||||
|
;Remove the uninstaller itself.
|
||||||
|
Delete "$INSTDIR\Uninstall.exe"
|
||||||
|
DeleteRegKey SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@"
|
||||||
|
|
||||||
|
;Remove the installation directory if it is empty.
|
||||||
|
RMDir "$INSTDIR"
|
||||||
|
|
||||||
|
; Remove the registry entries.
|
||||||
|
DeleteRegKey SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@"
|
||||||
|
|
||||||
|
; Removes all optional components
|
||||||
|
!insertmacro SectionList "RemoveSection_CPack"
|
||||||
|
|
||||||
|
!insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP
|
||||||
|
|
||||||
|
Delete "$SMPROGRAMS\$MUI_TEMP\Uninstall.lnk"
|
||||||
|
@CPACK_NSIS_DELETE_ICONS@
|
||||||
|
@CPACK_NSIS_DELETE_ICONS_EXTRA@
|
||||||
|
|
||||||
|
;Delete empty start menu parent diretories
|
||||||
|
StrCpy $MUI_TEMP "$SMPROGRAMS\$MUI_TEMP"
|
||||||
|
|
||||||
|
startMenuDeleteLoop:
|
||||||
|
ClearErrors
|
||||||
|
RMDir $MUI_TEMP
|
||||||
|
GetFullPathName $MUI_TEMP "$MUI_TEMP\.."
|
||||||
|
|
||||||
|
IfErrors startMenuDeleteLoopDone
|
||||||
|
|
||||||
|
StrCmp "$MUI_TEMP" "$SMPROGRAMS" startMenuDeleteLoopDone startMenuDeleteLoop
|
||||||
|
startMenuDeleteLoopDone:
|
||||||
|
|
||||||
|
; If the user changed the shortcut, then untinstall may not work. This should
|
||||||
|
; try to fix it.
|
||||||
|
StrCpy $MUI_TEMP "$START_MENU"
|
||||||
|
Delete "$SMPROGRAMS\$MUI_TEMP\Uninstall.lnk"
|
||||||
|
@CPACK_NSIS_DELETE_ICONS_EXTRA@
|
||||||
|
|
||||||
|
;Delete empty start menu parent diretories
|
||||||
|
StrCpy $MUI_TEMP "$SMPROGRAMS\$MUI_TEMP"
|
||||||
|
|
||||||
|
secondStartMenuDeleteLoop:
|
||||||
|
ClearErrors
|
||||||
|
RMDir $MUI_TEMP
|
||||||
|
GetFullPathName $MUI_TEMP "$MUI_TEMP\.."
|
||||||
|
|
||||||
|
IfErrors secondStartMenuDeleteLoopDone
|
||||||
|
|
||||||
|
StrCmp "$MUI_TEMP" "$SMPROGRAMS" secondStartMenuDeleteLoopDone secondStartMenuDeleteLoop
|
||||||
|
secondStartMenuDeleteLoopDone:
|
||||||
|
|
||||||
|
DeleteRegKey /ifempty SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@"
|
||||||
|
|
||||||
|
Push $INSTDIR\bin
|
||||||
|
StrCmp $DO_NOT_ADD_TO_PATH_ "1" doNotRemoveFromPath 0
|
||||||
|
Call un.RemoveFromPath
|
||||||
|
doNotRemoveFromPath:
|
||||||
|
SectionEnd
|
||||||
|
|
||||||
|
;--------------------------------
|
||||||
|
; determine admin versus local install
|
||||||
|
; Is install for "AllUsers" or "JustMe"?
|
||||||
|
; Default to "JustMe" - set to "AllUsers" if admin or on Win9x
|
||||||
|
; This function is used for the very first "custom page" of the installer.
|
||||||
|
; This custom page does not show up visibly, but it executes prior to the
|
||||||
|
; first visible page and sets up $INSTDIR properly...
|
||||||
|
; Choose different default installation folder based on SV_ALLUSERS...
|
||||||
|
; "Program Files" for AllUsers, "My Documents" for JustMe...
|
||||||
|
|
||||||
|
Function .onInit
|
||||||
|
StrCmp "@CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL@" "ON" 0 inst
|
||||||
|
|
||||||
|
ReadRegStr $0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "UninstallString"
|
||||||
|
StrCmp $0 "" inst
|
||||||
|
|
||||||
|
MessageBox MB_YESNOCANCEL|MB_ICONEXCLAMATION \
|
||||||
|
"@CPACK_NSIS_PACKAGE_NAME@ is already installed. $\n$\nDo you want to uninstall the old version before installing the new one?" \
|
||||||
|
IDYES uninst IDNO inst
|
||||||
|
Abort
|
||||||
|
|
||||||
|
;Run the uninstaller
|
||||||
|
uninst:
|
||||||
|
ClearErrors
|
||||||
|
StrLen $2 "\Uninstall.exe"
|
||||||
|
StrCpy $3 $0 -$2 # remove "\Uninstall.exe" from UninstallString to get path
|
||||||
|
ExecWait '$0 _?=$3' ;Do not copy the uninstaller to a temp file
|
||||||
|
|
||||||
|
IfErrors uninst_failed inst
|
||||||
|
uninst_failed:
|
||||||
|
MessageBox MB_OK|MB_ICONSTOP "Uninstall failed."
|
||||||
|
Abort
|
||||||
|
|
||||||
|
|
||||||
|
inst:
|
||||||
|
; Reads components status for registry
|
||||||
|
!insertmacro SectionList "InitSection"
|
||||||
|
|
||||||
|
; check to see if /D has been used to change
|
||||||
|
; the install directory by comparing it to the
|
||||||
|
; install directory that is expected to be the
|
||||||
|
; default
|
||||||
|
StrCpy $IS_DEFAULT_INSTALLDIR 0
|
||||||
|
StrCmp "$INSTDIR" "@CPACK_NSIS_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_DIRECTORY@" 0 +2
|
||||||
|
StrCpy $IS_DEFAULT_INSTALLDIR 1
|
||||||
|
|
||||||
|
StrCpy $SV_ALLUSERS "JustMe"
|
||||||
|
; if default install dir then change the default
|
||||||
|
; if it is installed for JustMe
|
||||||
|
StrCmp "$IS_DEFAULT_INSTALLDIR" "1" 0 +2
|
||||||
|
StrCpy $INSTDIR "$DOCUMENTS\@CPACK_PACKAGE_INSTALL_DIRECTORY@"
|
||||||
|
|
||||||
|
ClearErrors
|
||||||
|
UserInfo::GetName
|
||||||
|
IfErrors noLM
|
||||||
|
Pop $0
|
||||||
|
UserInfo::GetAccountType
|
||||||
|
Pop $1
|
||||||
|
StrCmp $1 "Admin" 0 +4
|
||||||
|
SetShellVarContext all
|
||||||
|
;MessageBox MB_OK 'User "$0" is in the Admin group'
|
||||||
|
StrCpy $SV_ALLUSERS "AllUsers"
|
||||||
|
Goto done
|
||||||
|
StrCmp $1 "Power" 0 +4
|
||||||
|
SetShellVarContext all
|
||||||
|
;MessageBox MB_OK 'User "$0" is in the Power Users group'
|
||||||
|
StrCpy $SV_ALLUSERS "AllUsers"
|
||||||
|
Goto done
|
||||||
|
|
||||||
|
noLM:
|
||||||
|
StrCpy $SV_ALLUSERS "AllUsers"
|
||||||
|
;Get installation folder from registry if available
|
||||||
|
|
||||||
|
done:
|
||||||
|
StrCmp $SV_ALLUSERS "AllUsers" 0 +3
|
||||||
|
StrCmp "$IS_DEFAULT_INSTALLDIR" "1" 0 +2
|
||||||
|
StrCpy $INSTDIR "@CPACK_NSIS_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_DIRECTORY@"
|
||||||
|
|
||||||
|
StrCmp "@CPACK_NSIS_MODIFY_PATH@" "ON" 0 noOptionsPage
|
||||||
|
!insertmacro MUI_INSTALLOPTIONS_EXTRACT "NSIS.InstallOptions.ini"
|
||||||
|
|
||||||
|
noOptionsPage:
|
||||||
|
FunctionEnd
|
@ -1,86 +1,245 @@
|
|||||||
Building i2pd for Windows
|
Building i2pd on Windows
|
||||||
=========================
|
=========================
|
||||||
|
|
||||||
!!! WARNING This file may be outdated.
|
There are two approaches available to build i2pd on Windows. The best
|
||||||
|
one depends on your needs and personal preferences. One is to use
|
||||||
|
msys2 and [unix alike infrastructure](build_notes_unix.md). Another
|
||||||
|
one is to use Visual Studio. While there might be no difference for
|
||||||
|
end users of i2pd daemon, developers, however, shall be wary of
|
||||||
|
differences in C++ name mangling between the two compilers when making
|
||||||
|
a choice to be able to link their software against libi2pd.
|
||||||
|
|
||||||
|
If you are a stranger to C++ with no development tools installed on
|
||||||
|
your system and your only goal is to have i2pd up and running from the
|
||||||
|
most recent source, consider using msys2. Although it relies on
|
||||||
|
command line operations, it should be straight forward.
|
||||||
|
|
||||||
|
In this guide, we will use CMake for both approaches and we will
|
||||||
|
assume that you typically have your projects in C:\dev\ as your
|
||||||
|
development location for the sake of convenience. Adjust paths
|
||||||
|
accordingly if it is not the case. Note that msys uses unix-alike
|
||||||
|
paths like /c/dev/ for C:\dev\.
|
||||||
|
|
||||||
|
msys2
|
||||||
|
-----
|
||||||
|
|
||||||
|
Get it from https://msys2.github.io and update it as described
|
||||||
|
there. Use the installer appropriate for the bitness of your Windows
|
||||||
|
OS. You will be able to build 32-bit applications if you install
|
||||||
|
64-bit version of msys2. For 64-bit, use *mingw-w64-x86_64* prefix
|
||||||
|
instead of *mingw-w64-i686* for the packages mentioned below, and use
|
||||||
|
*/mingw64* as CMake find root.
|
||||||
|
|
||||||
|
Install all prerequisites and download i2pd source:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pacman -S mingw-w64-i686-boost mingw-w64-i686-openssl mingw-w64-i686-gcc mingw-w64-i686-miniupnpc cmake git
|
||||||
|
mkdir -p /c/dev/i2pd
|
||||||
|
cd /c/dev/i2pd
|
||||||
|
git clone https://github.com/PurpleI2P/i2pd.git
|
||||||
|
cd i2pd
|
||||||
|
```
|
||||||
|
|
||||||
|
Check with `git status` that you are on *openssl* branch. If it is not
|
||||||
|
the case, do `git checkout openssl`.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git pull origin openssl --ff-only # to update sources if you are rebuilding after a while
|
||||||
|
mkdir -p mingw32.build # CMake build folder
|
||||||
|
cd mingw32.build
|
||||||
|
export PATH=/mingw32/bin:/usr/bin # we need compiler on PATH which is usually heavily cluttered on Windows
|
||||||
|
cmake ../build -G "Unix Makefiles" -DWITH_UPNP=ON -DWITH_PCH=ON \
|
||||||
|
-DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX:PATH=../mingw32.stage -DCMAKE_FIND_ROOT_PATH=/mingw32
|
||||||
|
```
|
||||||
|
|
||||||
|
If your processor has
|
||||||
|
[AES instruction set](https://en.wikipedia.org/wiki/AES_instruction_set),
|
||||||
|
you may try adding `-DWITH_AESNI=ON`. No check is done however, it
|
||||||
|
will compile but will crash with `Illegal instruction` if not supported.
|
||||||
|
|
||||||
|
Make sure CMake found proper libraries and compiler. This might be the
|
||||||
|
case if you have Strawberry Perl installed as it alters PATH and you
|
||||||
|
failed to override it like mentioned above. You should see something
|
||||||
|
like
|
||||||
|
|
||||||
|
```
|
||||||
|
-- The C compiler identification is GNU 5.2.0
|
||||||
|
-- The CXX compiler identification is GNU 5.2.0
|
||||||
|
-- Check for working C compiler: /mingw32/bin/gcc.exe
|
||||||
|
-- Check for working C compiler: /mingw32/bin/gcc.exe -- works
|
||||||
|
-- Detecting C compiler ABI info
|
||||||
|
-- Detecting C compiler ABI info - done
|
||||||
|
-- Detecting C compile features
|
||||||
|
-- Detecting C compile features - done
|
||||||
|
-- Check for working CXX compiler: /mingw32/bin/c++.exe
|
||||||
|
-- Check for working CXX compiler: /mingw32/bin/c++.exe -- works
|
||||||
|
-- Detecting CXX compiler ABI info
|
||||||
|
-- Detecting CXX compiler ABI info - done
|
||||||
|
-- Detecting CXX compile features
|
||||||
|
-- Detecting CXX compile features - done
|
||||||
|
-- Performing Test CXX11_SUPPORTED
|
||||||
|
-- Performing Test CXX11_SUPPORTED - Success
|
||||||
|
-- Performing Test CXX0X_SUPPORTED
|
||||||
|
-- Performing Test CXX0X_SUPPORTED - Success
|
||||||
|
-- Looking for include file pthread.h
|
||||||
|
-- Looking for include file pthread.h - found
|
||||||
|
-- Looking for pthread_create
|
||||||
|
-- Looking for pthread_create - found
|
||||||
|
-- Found Threads: TRUE
|
||||||
|
-- Boost version: 1.59.0
|
||||||
|
-- Found the following Boost libraries:
|
||||||
|
-- system
|
||||||
|
-- filesystem
|
||||||
|
-- regex
|
||||||
|
-- program_options
|
||||||
|
-- date_time
|
||||||
|
-- thread
|
||||||
|
-- chrono
|
||||||
|
-- Found OpenSSL: /mingw32/lib/libssl.dll.a;/mingw32/lib/libcrypto.dll.a (found version "1.0.2d")
|
||||||
|
-- Found MiniUPnP headers: /mingw32/include
|
||||||
|
-- Found ZLIB: /mingw32/lib/libz.dll.a (found version "1.2.8")
|
||||||
|
-- ---------------------------------------
|
||||||
|
-- Build type : RelWithDebInfo
|
||||||
|
-- Compiler vendor : GNU
|
||||||
|
-- Compiler version : 5.2.0
|
||||||
|
-- Compiler path : /mingw32/bin/c++.exe
|
||||||
|
-- Install prefix: : ../mingw32.stage
|
||||||
|
-- Options:
|
||||||
|
-- AESNI : OFF
|
||||||
|
-- HARDENING : OFF
|
||||||
|
-- LIBRARY : ON
|
||||||
|
-- BINARY : ON
|
||||||
|
-- STATIC BUILD : OFF
|
||||||
|
-- UPnP : ON
|
||||||
|
-- PCH : ON
|
||||||
|
-- ---------------------------------------
|
||||||
|
-- Configuring done
|
||||||
|
-- Generating done
|
||||||
|
-- Build files have been written to: /c/dev/i2pd/i2pd/mingw32.build
|
||||||
|
```
|
||||||
|
|
||||||
|
Now it is time to compile everything. If you have a multicore processor
|
||||||
|
you can add `-j` flag.
|
||||||
|
|
||||||
|
make -j4 install
|
||||||
|
|
||||||
|
You should be able to run ./i2pd . If you need to start from the new
|
||||||
|
shell, consider starting *MinGW-w64 Win32 Shell* instead of *MSYS2 Shell* as
|
||||||
|
it adds`/minw32/bin` to the PATH.
|
||||||
|
|
||||||
|
### Caveats
|
||||||
|
|
||||||
|
It is important to restrict PATH as described above. If you have
|
||||||
|
Strawberry Perl and/or Mercurial installed, it will pick up gcc &
|
||||||
|
openssl from the wrong places.
|
||||||
|
|
||||||
|
If you do use precompiled headers to speed up compilation
|
||||||
|
(recommended), things can go wrong if compiler options have changed
|
||||||
|
for whatever reason. Just delete `stdafx.h.gch` found in your build
|
||||||
|
folder, note the file extension.
|
||||||
|
|
||||||
|
If you are an Arch Linux user, refrain from updating system with
|
||||||
|
`pacman -Syu`. Always update runtime separately as described on the
|
||||||
|
home page, otherwise you might end up with DLLs incompatibility
|
||||||
|
problems.
|
||||||
|
|
||||||
|
|
||||||
|
Using Visual Studio
|
||||||
|
-------------------
|
||||||
|
|
||||||
Requirements for building:
|
Requirements for building:
|
||||||
|
|
||||||
* Visual Studio 2013 (tested with VS2013 Update 1, Update 3, and Update 4)
|
* [CMake](https://cmake.org/) (tested with 3.1.3)
|
||||||
* Boost (tested with 1.56, 1.57, and 1.58)
|
* [Visual Studio Community Edition](https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx) (tested with VS2013 Update 4)
|
||||||
* Crypto++ (tested with 5.6.2)
|
* [Boost](http://www.boost.org/) (tested with 1.59)
|
||||||
|
* Optionally [MiniUPnP](http://miniupnp.free.f) (tested with 1.9), we need only few client headers
|
||||||
|
* OpenSSL (tested with 1.0.1p and 1.0.2e), if building from sources (recommended), you'll need as well
|
||||||
|
* [Netwide assembler](www.nasm.us)
|
||||||
|
* Strawberry Perl or ActiveState Perl, do NOT try msys2 perl, it won't work
|
||||||
|
|
||||||
|
|
||||||
Building Boost (32-bit)
|
## Building Boost
|
||||||
-----------------------
|
|
||||||
|
|
||||||
Open a Visual Studio x86 command prompt and run the following:
|
Open a Command Prompt (there is no need to start Visual Studio command
|
||||||
|
prompt to build Boost) and run the following:
|
||||||
|
|
||||||
cd C:\path\to\boost\sources
|
cd C:\dev\boost
|
||||||
bootstrap
|
bootstrap
|
||||||
b2 toolset=msvc-12.0 --build-type=complete --libdir=C:\Boost\lib\Win32 install --with-filesystem --with-program_options --with-regex --with-date_time
|
b2 toolset=msvc-12.0 --build-type=complete --with-filesystem --with-program_options --with-regex --with-date_time
|
||||||
|
|
||||||
|
If you are on 64-bit Windows and you want to build 64-bit version as well
|
||||||
|
|
||||||
Building Boost (64-bit)
|
b2 toolset=msvc-12.0 --build-type=complete --stagedir=stage64 address-model=64 --with-filesystem --with-program_options --with-regex --with-date_time
|
||||||
-----------------------
|
|
||||||
|
|
||||||
Open a Visual Studio x64 command prompt and run the following:
|
After Boost is compiled, set the environment variable `BOOST_ROOT` to
|
||||||
|
the directory Boost was unpacked to, e.g., C:\dev\boost.
|
||||||
|
|
||||||
cd C:\path\to\boost\sources
|
If you are planning on building only particular variant, e.g. Debug
|
||||||
bootstrap
|
only and static linking, and/or you are out of space/time, you might
|
||||||
b2 toolset=msvc-12.0 --build-type=complete --libdir=C:\Boost\lib\x64 architecture=x86 address-model=64 install --with-filesystem --with-program_options --with-regex --with-date_time
|
consider `--build-type=minimal`. Take a look at
|
||||||
|
[appveyor.yml](../appveyor.yml) for details on how test builds are done.
|
||||||
|
|
||||||
After Boost is compiled, set the environment variable `BOOST` to the directory
|
Building OpenSSL
|
||||||
Boost was installed to. If you followed the instructions outlined here, you
|
|
||||||
should set it to `C:\Boost`. Additionally, set the BOOSTVER variable to the
|
|
||||||
version of Boost that you're using, but instead of a '.' use a '_'. For
|
|
||||||
example, I have `BOOSTVER` set to `1_58`.
|
|
||||||
|
|
||||||
Building Crypto++
|
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
* Open the crypttest Solution in VS2013
|
Download OpenSSL, e.g. with git
|
||||||
* Visual Studio will ask to update the Solution/Project. Allow it.
|
|
||||||
* Build the `cryptopp` project, both the Debug and Release targets and for both
|
|
||||||
Win32 and x64.
|
|
||||||
* Create a folder called `cryptopp` in the crypto++ source directory, then copy
|
|
||||||
the header files to this new directory.
|
|
||||||
* Set the `CRYPTOPP` environment variable pointing to the Crypto++ source directory.
|
|
||||||
|
|
||||||
|
git clone https://github.com/openssl/openssl.git
|
||||||
|
cd openssl
|
||||||
|
git checkout OpenSSL_1_0_1p
|
||||||
|
|
||||||
|
Now open Visual Studio command prompt and change directory to that with OpenSSL
|
||||||
|
|
||||||
|
set "PATH=%PATH%;C:\Program Files (x86)\nasm"
|
||||||
|
perl Configure VC-WIN32 --prefix=c:\OpenSSL-Win32
|
||||||
|
ms\do_nasm
|
||||||
|
nmake -f ms\ntdll.mak
|
||||||
|
nmake -f ms\ntdll.mak install
|
||||||
|
|
||||||
|
You should have it installed into C:\OpenSSL-Win32 by now.
|
||||||
|
|
||||||
|
Note that you might consider providing `-DOPENSSL_ROOT_DIR` to CMake
|
||||||
|
and/or create a symlink (with mklink /J) to C:\OpenSSL if you plan on
|
||||||
|
maintaining multiple versions, e.g. 64 bit and/or
|
||||||
|
static/shared. Consult `C:\Program Files
|
||||||
|
(x86)\CMake\share\cmake-3.3\Modules\FindOpenSSL.cmake` for details.
|
||||||
|
|
||||||
|
Get miniupnpc
|
||||||
|
-------------
|
||||||
|
|
||||||
|
If you are behind a UPnP enabled router and don't feel like manually
|
||||||
|
configuring port forwarding, you should consider using
|
||||||
|
[MiniUPnP](http://miniupnp.free.fr) client. I2pd can be built capable
|
||||||
|
of using miniupnpc shared library (DLL) to open up necessary
|
||||||
|
port. You'd want to have include headers around to build i2pd with
|
||||||
|
support for this. Unpack client source code in a sibling folder,
|
||||||
|
e.g. C:\dev\miniupnpc . You may want to remove version number from
|
||||||
|
folder name included in downloaded archive.
|
||||||
|
|
||||||
|
Note that you might need to build DLL yourself for 64-bit systems
|
||||||
|
using msys2 as 64-bit DLLs are not provided by the project.
|
||||||
|
|
||||||
|
|
||||||
|
Creating Visual Studio project
|
||||||
|
------------------------------
|
||||||
|
|
||||||
|
Start CMake GUI, navigate to i2pd directory, choose building directory, e.g. ./out, and configure options.
|
||||||
|
|
||||||
|
Alternatively, if you feel adventurous, try that from the command line
|
||||||
|
|
||||||
|
```
|
||||||
|
cd <i2pd_dir>
|
||||||
|
mkdir out
|
||||||
|
cd out
|
||||||
|
cmake ..\build -G "Visual Studio 12 2013" -DWITH_UPNP=ON -DWITH_PCH=ON -DCMAKE_INSTALL_PREFIX:PATH=C:\dev\Debug_Win32_stage
|
||||||
|
```
|
||||||
|
|
||||||
|
WITH_UPNP will stay off, if necessary files are not found.
|
||||||
|
|
||||||
Building i2pd
|
Building i2pd
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
## Prep work ##
|
You can open generated solution/project with Visual Studio and build
|
||||||
|
from there, alternatively you can use `cmake --build . --config Release --target install` or
|
||||||
I strongly advise setting up your own `INCLUDES` and `LIBS` instead of relying
|
[MSBuild tool](https://msdn.microsoft.com/en-us/library/dd293626.aspx)
|
||||||
on the settings in the i2pd project file. By using your own settings, if the
|
`msbuild i2pd.sln /p:Configuration=Release`.
|
||||||
i2pd devs change the paths in the project file, your builds will still work.
|
|
||||||
|
|
||||||
To do this, create or edit the file
|
|
||||||
`%localappdata%\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user`.
|
|
||||||
|
|
||||||
For comparison, my file is reproduced below:
|
|
||||||
|
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ImportGroup Label="PropertySheets">
|
|
||||||
</ImportGroup>
|
|
||||||
<PropertyGroup Label="UserMacros" />
|
|
||||||
<PropertyGroup>
|
|
||||||
<LibraryPath>$(CRYPTOPP)\$(Platform)\Output\$(Configuration);$(BOOST)\lib\$(Platform);$(LibraryPath)</LibraryPath>
|
|
||||||
<IncludePath>$(CRYPTOPP);$(BOOST)\include\boost-$(BOOSTVER);$(IncludePath)</IncludePath>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemDefinitionGroup />
|
|
||||||
<ItemGroup />
|
|
||||||
</Project>
|
|
||||||
|
|
||||||
|
|
||||||
If you want to build x64 binaries as well, you'll want to edit or create the
|
|
||||||
file `%localappdata%\Microsoft\MSBuild\v4.0\Microsoft.Cpp.x64.user`. If you
|
|
||||||
followed the steps outlined earlier you can copy (or link) the win32 file to
|
|
||||||
the x64 one.
|
|
||||||
|
|
||||||
## Anti-Climatic End ##
|
|
||||||
|
|
||||||
After following the above instructions, you'll be able to build Debug Win32,
|
|
||||||
Debug x64, Release Win32, and Release x64 i2pd binaries.
|
|
||||||
|
2
util.cpp
2
util.cpp
@ -28,7 +28,9 @@
|
|||||||
#include <iphlpapi.h>
|
#include <iphlpapi.h>
|
||||||
#include <shlobj.h>
|
#include <shlobj.h>
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
#pragma comment(lib, "IPHLPAPI.lib")
|
#pragma comment(lib, "IPHLPAPI.lib")
|
||||||
|
#endif
|
||||||
|
|
||||||
#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
|
#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
|
||||||
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
|
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
|
||||||
|
18
version.h
18
version.h
@ -2,7 +2,21 @@
|
|||||||
#define _VERSION_H_
|
#define _VERSION_H_
|
||||||
|
|
||||||
#define CODENAME "Purple"
|
#define CODENAME "Purple"
|
||||||
#define VERSION "2.1.0"
|
|
||||||
#define I2P_VERSION "0.9.23"
|
#define STRINGIZE(x) #x
|
||||||
|
#define MAKE_VERSION(a,b,c) STRINGIZE(a) "." STRINGIZE(b) "." STRINGIZE(c)
|
||||||
|
|
||||||
|
#define I2PD_VERSION_MAJOR 2
|
||||||
|
#define I2PD_VERSION_MINOR 1
|
||||||
|
#define I2PD_VERSION_MICRO 0
|
||||||
|
#define I2PD_VERSION_PATCH 0
|
||||||
|
#define I2PD_VERSION MAKE_VERSION(I2PD_VERSION_MAJOR, I2PD_VERSION_MINOR, I2PD_VERSION_MICRO)
|
||||||
|
#define VERSION I2PD_VERSION
|
||||||
|
|
||||||
|
#define I2P_VERSION_MAJOR 0
|
||||||
|
#define I2P_VERSION_MINOR 9
|
||||||
|
#define I2P_VERSION_MICRO 23
|
||||||
|
#define I2P_VERSION_PATCH 0
|
||||||
|
#define I2P_VERSION MAKE_VERSION(I2P_VERSION_MAJOR, I2P_VERSION_MINOR, I2P_VERSION_MICRO)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user