-
Notifications
You must be signed in to change notification settings - Fork 22
/
install.bat
204 lines (163 loc) · 5.58 KB
/
install.bat
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
@echo off
setlocal EnableDelayedExpansion
set ORIGIN=%cd%
:: Configuration
set VERSION=1.3.1
set VER=%VERSION:.=%
set URL=https://zlib.net/zlib%VER%.zip
set CMAKE_VS_PLATFORM_NAME=x64
set TMPDIR=%HOMEDRIVE%%HOMEPATH%\zlib_tmp
set SRC_DIR=%TMPDIR%\zlib-%VERSION%
set ZIPFILE=zlib%VER%.zip
set ABS_ZIPFILE=%TMPDIR%\%ZIPFILE%
set BUILD_DIR=%SRC_DIR%\build
set LOGFILE=%TMPDIR%\zlib_install.log
echo [0/6] Library(zlib==%VERSION%)
if not exist "%TMPDIR%" (mkdir "%TMPDIR%" && cd /d "%TMPDIR%" || exit /B 1)
call :cleanup_src
call :cleanup_log
copy /y nul "%LOGFILE%" >nul 2>&1
call :log_sysinfo >>"%LOGFILE%" 2>&1
if not defined ARCH (
set ARCH=x64
)
if not defined CMAKE_GENERATOR_PLATFORM (
set CMAKE_GENERATOR_PLATFORM=%ARCH%
)
set GENERATOR_PLATFORM_ARG=-DCMAKE_GENERATOR_PLATFORM:STRING="%CMAKE_GENERATOR_PLATFORM%"
if "%ARCH%" == "x64" (
set PREFIX=-DCMAKE_INSTALL_PREFIX="%PROGRAMFILES%\zlib"
) else (
set PREFIX=-DCMAKE_INSTALL_PREFIX="%PROGRAMFILES(X86)%\zlib"
)
echo|set /p="[1/6] Checking cmake... "
call :setup_cmake_path >>"%LOGFILE%" 2>&1
if not defined CMAKE (
call :failed
echo[
echo Please, install CMAKE: https://cmake.org/download/
exit /B 1
) else (echo done.)
echo|set /p="[2/6] Downloading... "
echo Fetching %URL% >>"%LOGFILE%" 2>&1
cd /d "%TMPDIR%" && call :winget "%URL%" >>"%LOGFILE%" 2>&1
if %ERRORLEVEL% NEQ 0 (call :failed && exit /B 1) else (echo done.)
echo|set /p="[3/6] Extracting... "
powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('%ABS_ZIPFILE%', '%TMPDIR%'); }" >>"%LOGFILE%" 2>&1
if %ERRORLEVEL% NEQ 0 (call :failed && exit /B 1) else (echo done.)
echo|set /p="[4/6] Fixing CMakeLists.txt... "
set OLDSTR=RUNTIME DESTINATION ""\${INSTALL_BIN_DIR}\""
set NEWSTR=RUNTIME DESTINATION ""bin\""
call :search_replace "%OLDSTR%" "%NEWSTR%"
if %ERRORLEVEL% NEQ 0 (call :failed && exit /B 1)
set OLDSTR=ARCHIVE DESTINATION ""\${INSTALL_LIB_DIR}\""
set NEWSTR=ARCHIVE DESTINATION ""lib\""
call :search_replace "%OLDSTR%" "%NEWSTR%"
if %ERRORLEVEL% NEQ 0 (call :failed && exit /B 1)
set OLDSTR=LIBRARY DESTINATION ""\${INSTALL_LIB_DIR}\""
set NEWSTR=LIBRARY DESTINATION ""lib\""
call :search_replace "%OLDSTR%" "%NEWSTR%"
if %ERRORLEVEL% NEQ 0 (call :failed && exit /B 1)
set OLDSTR=DESTINATION ""\${INSTALL_INC_DIR}\""
set NEWSTR=DESTINATION ""include\""
call :search_replace "%OLDSTR%" "%NEWSTR%"
if %ERRORLEVEL% NEQ 0 (call :failed && exit /B 1) else (echo done.)
rd /S /Q "%BUILD_DIR%" >nul 2>&1
mkdir "%BUILD_DIR%" && cd /d "%BUILD_DIR%"
echo|set /p="[5/6] Configuring... "
"%CMAKE%" .. -DCMAKE_BUILD_TYPE=Release %PREFIX% %GENERATOR_PLATFORM_ARG% >>"%LOGFILE%" 2>&1
if %ERRORLEVEL% NEQ 0 (call :failed && exit /B 1) else (echo done.)
echo [6/6] Compiling and installing...
"%CMAKE%" --build . --config Release --target install
if %ERRORLEVEL% NEQ 0 (call :failed && exit /B 1) else (echo done.)
call :cleanup_src
call :goto_origin
echo Details can be found at %LOGFILE%.
@echo on
@goto :eof
:setup_cmake_path
where cmake.exe
cmake.exe /? 2> NUL 1> NUL
if not %ERRORLEVEL%==9009 (echo cmake.exe is accessible by default. && set CMAKE=cmake.exe)
if not defined CMAKE (echo cmake.exe is not accessible by default. Looking into common installation dirs.)
if not defined CMAKE (call :setup_cmake_path_for "%PROGRAMFILES%\CMake\bin")
if not defined CMAKE (call :setup_cmake_path_for "C:\Program Files\CMake\bin")
if not defined CMAKE (call :setup_cmake_path_for "C:\Program Files (x86)\CMake\bin")
@goto :eof
:setup_cmake_path_for
set DIR_PATH=%~1
echo|set /p="Checking !DIR_PATH! ... "
if exist !DIR_PATH!\cmake.exe (
echo found.
set CMAKE=!DIR_PATH!\cmake.exe
) else (
echo not found.
)
@goto :eof
:cleanup_src
del /Q "%ABS_ZIPFILE%" >nul 2>&1
rd /S /Q "%SRC_DIR%" >nul 2>&1
@goto :eof
:cleanup_log
del /Q "%LOGFILE%" >nul 2>&1
@goto :eof
:log_sysinfo
echo -- Environment variables
set
echo[
echo -- System info
systeminfo | findstr /B /C:"OS Name" /C:"OS Version"
echo[
@goto :eof
:cmakefiles_debug
set FILE=%BUILD_DIR%\CMakeFiles\CMakeError.log
if exist "%FILE%" (
echo -- %FILE%
type "%FILE%"
echo[
)
set FILE=%BUILD_DIR%\CMakeFiles\CMakeOutput.log
if exist "%FILE%" (
echo -- %FILE%
type "%FILE%"
echo[
)
@goto :eof
:failed
echo FAILED.
call :cmakefiles_debug >>"%LOGFILE%" 2>&1
echo[
echo ---------------------------------------- log begin ----------------------------------------
type "%LOGFILE%"
echo ---------------------------------------- log end ----------------------------------------
echo LOG: %LOGFILE%
call :cleanup_src
call :goto_origin
@goto :eof
:goto_origin
cd /d %ORIGIN% >nul 2>&1
@goto :eof
:search_replace
set OLDSTR=%~1
set NEWSTR=%~2
cd /d "%SRC_DIR%"
set CMD="(gc CMakeLists.txt) -replace '%OLDSTR%', '%NEWSTR%' | Out-File -encoding ASCII CMakeLists.txt"
powershell -Command %CMD% >>"%LOGFILE%" 2>&1
goto :eof
:winget
set URL=%~1
for %%F in (%URL%) do set FILE=%%~nxF
setlocal EnableDelayedExpansion
set multiLine=$security_protcols = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::SystemDefault^
if ([Net.SecurityProtocolType].GetMember('Tls11').Count -gt 0) {^
$security_protcols = $security_protcols -bor [Net.SecurityProtocolType]::Tls11^
}^
if ([Net.SecurityProtocolType].GetMember('Tls12').Count -gt 0) {^
$security_protcols = $security_protcols -bor [Net.SecurityProtocolType]::Tls12^
}^
[Net.ServicePointManager]::SecurityProtocol = $security_protcols^
Write-Host 'Downloading %URL%... ' -NoNewLine^
(New-Object Net.WebClient).DownloadFile('%URL%', '%FILE%')^
Write-Host 'done.'
powershell -Command !multiLine!
goto:eof