source: main/trunk/greenstone3/gs3-setup.bat@ 32969

Last change on this file since 32969 was 32969, checked in by ak19, 5 years ago

Fix to a bug discovered and investigated by Kathy: on Win, when there are spaces in the filepath to the GS3 installation, gs3-setup fails to properly detect the bitness of the GS3 installation to determine what bitness of Java to use. (In her case this may have further caused the subsequent problem of no JAVA_HOME and JRE_HOME being found because the bundled JRE gets discounted due to the unknown bitness. In my case, it finds a system JDK to fall back on, but with this fix finds and uses the bundled JRE as it's of the correct bitness.) The quick solution is to use relative filepaths.

  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 15.1 KB
RevLine 
[15071]1@echo off
2
[22069]3setlocal enabledelayedexpansion
4
[31472]5set DEBUG=false
6
[20191]7set java_min_version=1.5.0_00
[15071]8
[27832]9if exist gs3-setup.bat goto prelim
[15071]10 echo This script must be run from within the Greenstone 3 home directory
[27832]11 goto done
[15071]12
[27832]13:prelim
14if "!GSDL3SRCHOME!" == "" goto start
15if "!GSDL3SRCHOME!" == "!CD!" (
16 echo Your environment is already set up for Greenstone3
17 goto done
18) else (
19 echo Your environment was set up for Greenstone 3 in !GSDL3SRCHOME!.
20 echo Overwriting that set up for the current Greenstone 3 in !CD!.
21)
22
[15071]23:start
[15363]24:: ---- Set some relevant environment variables ----
25
26:: this is the default
[22069]27:: greenstone3 (!GSDL3SRCHOME!)
28:: +-- web (!GSDL3HOME!)
[15363]29:: +-- packages
[22069]30:: +-- tomcat (!TOMCAT_HOME!)
31:: +-- ant (!ANT_HOME!)
[15363]32
[24374]33:: set GSDL3SRCHOME to the current directory
[22069]34cd | winutil\setvar.exe GSDL3SRCHOME > !TMP!\setgsdl3.bat
35call !TMP!\setgsdl3.bat
36del !TMP!\setgsdl3.bat
[15363]37
[24374]38:: set GSDL3HOME to the 'web' subdirectory
[22069]39set GSDL3HOME=!GSDL3SRCHOME!\web
[30574]40set WEB_CONTAINING_CLASSES=!GSDL3SRCHOME!\web
[30568]41:: set GSDL3HOME to any web.home property provided, and create that folder if it doesn't exist
42:: Replace forward slashes in web.home with back slashes
43:: http://scripts.dragon-it.co.uk/scripts.nsf/docs/batch-search-replace-substitute!OpenDocument&ExpandSection=3&BaseTarget=East&AutoFramed
[30592]44if exist "!GSDL3SRCHOME!\build.properties" for /F "usebackq tokens=1,2 delims==" %%G in ("!GSDL3SRCHOME!\build.properties") do (
[30568]45 if "%%G"=="web.home" (
46 set GSDL3HOME=%%H
47 set GSDL3HOME=!GSDL3HOME:/=\!
[30574]48 set WEB_CONTAINING_CLASSES=!GSDL3HOME!
[30568]49 if not exist "!GSDL3HOME!" cmd /c "!GSDL3SRCHOME!\userweb.cmd"
[30574]50 goto foundwebhome
51 )
[30568]52)
[15071]53
[30574]54:foundwebhome
[30568]55:: Whatever the web directory is, it should contain the WEB-INF\classes folder, else go back to using default for this
56:: The WEB-INF\classes folder will be absent in a userweb folder, but will be present if GSDL3HOME=GSDL3SRCHOME\web
57:: or if web.home points to GS3 as a webapp inside tomcat
[30574]58if not exist "!GSDL3HOME!\WEB-INF\classes" set WEB_CONTAINING_CLASSES=!GSDL3SRCHOME!\web
[30568]59
[15363]60:: change if using external tomcat or ant
[22069]61set TOMCAT_HOME=!GSDL3SRCHOME!\packages\tomcat
62if exist "!GSDL3SRCHOME!\packages\ant\*.*" set ANT_HOME=!GSDL3SRCHOME!\packages\ant
[15071]63
[15363]64:: other important environment variables
[15071]65set GSDLOS=windows
[15363]66
67:: ---- Set the CLASSPATH and PATH environment variables ----
[22069]68if "!GS_CP_SET!" == "yes" goto skipSetCp
[30574]69set CLASSPATH=!WEB_CONTAINING_CLASSES!\WEB-INF\classes;!GSDL3SRCHOME!\resources\java;!GSDL3SRCHOME!\cp.jar;!CLASSPATH!;
[24603]70set PATH=!GSDL3SRCHOME!\bin;!GSDL3SRCHOME!\bin\script;!GSDL3SRCHOME!\lib\jni;!ANT_HOME!\bin;!PATH!
[15071]71
[20304]72:: Override Imagemagick and Ghostscript paths to the bundled applications shipped with greenstone if they exists otherwise use default environment variables.
[24374]73:: if exist "!GSDL3SRCHOME!\gs2build\bin\windows\ghostscript\bin\gsdll32.dll" set GS_DLL=!GSDL3SRCHOME!\gs2build\bin\windows\ghostscript\bin\gsdll32.dll
74:: if exist "!GSDL3SRCHOME!\gs2build\bin\windows\ghostscript\lib\*.*" set GS_LIB=!GSDL3SRCHOME!\gs2build\bin\windows\ghostscript\lib
75:: if exist "!GSDL3SRCHOME!\gs2build\bin\windows\ghostscript\bin\*.*" set PATH=!GSDL3SRCHOME!\gs2build\bin\windows\ghostscript\bin;!PATH!
76:: if exist "!GSDL3SRCHOME!\gs2build\bin\windows\imagemagick\*.*" set PATH=!GSDL3SRCHOME!\gs2build\bin\windows\imagemagick;!PATH!
[20304]77
[15363]78:: a little dynamic set cp stuff
[22075]79if exist "!TMP!\setcp.bat" del "!TMP!\setcp.bat"
80
81:: http://ss64.com/nt/for_cmd.html, how to deal with spaces in the file list in a for command
82:: Note that TOMCAT_HOME\common\endorsed only exists for Tomcat 5, not Tomcat 6
83:: (where it contains xercesImpl.jar and xml-apis.jar which aren't there in Tomcat 6)
84if exist "!TOMCAT_HOME!\common\endorsed\*.jar" for /f %%j in ('dir/b ^"!TOMCAT_HOME!\common\endorsed\*.jar^"') do echo set CLASSPATH=%%CLASSPATH%%;%%TOMCAT_HOME%%\common\endorsed\%%j>> !TMP!\setcp.bat
85for /f %%j in ('dir/b ^"!TOMCAT_HOME!\lib\*.jar^"') do echo set CLASSPATH=%%CLASSPATH%%;%%TOMCAT_HOME%%\lib\%%j>> !TMP!\setcp.bat
86
[22069]87if exist !TMP!\setcp.bat call !TMP!\setcp.bat
88if exist !TMP!\setcp.bat del !TMP!\setcp.bat
[15363]89
90set GS_CP_SET=yes
[15071]91:skipSetCp
92
[21320]93:: ---- if gs2build is there, run its setup.bat file ----
[31472]94:: http://stackoverflow.com/questions/69068/long-commands-split-over-multiple-lines-in-windows-vista-batch-bat-file
[31473]95endlocal & set DEBUG=%DEBUG%& set RUNJAVA=%RUNJAVA%& set PATH=%PATH%& set GSDLOS=%GSDLOS%& set GSDLHOME=%GSDLHOME%& set GSDL3HOME=%GSDL3HOME%& ^
96set GSDL3SRCHOME=%GSDL3SRCHOME%& set JAVA_HOME=%JAVA_HOME%& set JRE_HOME=%JRE_HOME%& set ANT_HOME=%ANT_HOME%& set CLASSPATH=%CLASSPATH%
[21320]97
98if exist gs2build\setup.bat (
99 echo.
100 echo Running gs2build\setup.bat
101 cd gs2build
102 call setup.bat
103 cd ..
104)
105
106:: ---- Check for any setup files in ext or local folders ----
107if exist ext (
108 for /D %%e IN ("ext/*") do (
109 cd ext\%%e
[24336]110 if EXIST gs3-setup.bat (
111 call gs3-setup.bat
112 ) else (
113 if EXIST setup.bat call setup.bat
114 )
[21320]115 cd ..\..
116 )
117)
118
119
120if exist local\gs3-setup.bat (
121 echo.
122 echo Running local\gs3-setup.bat
123 cd local
124 call gs3-setup.bat
125 cd ..
126)
127
[24374]128setlocal enabledelayedexpansion
129
[15363]130:: ---- Search for java ----
[20300]131set JAVA_MIN_VERSION=1.5.0_00
[31469]132set BUNDLED_JRE=!CD!\packages\jre
133set HINT=!BUNDLED_JRE!
[31447]134
[20300]135::if search4j is present, use it
136set FOUNDJAVAHOME=
137set RUNJAVA=
138if exist bin\search4j.exe (
[22069]139 for /F "tokens=*" %%r in ('bin\search4j.exe -d -p "!HINT!" -m !JAVA_MIN_VERSION!') do set FOUNDJAVAHOME=%%r
140 for /F "tokens=*" %%r in ('bin\search4j.exe -r -p "!HINT!" -m !JAVA_MIN_VERSION!') do set FOUNDJREHOME=%%r
[20300]141)
[15071]142
[31447]143
144echo.
[31472]145if "%DEBUG%" == "true" echo ********************************************************************
[31447]146
147rem Check if any Java found matches the bitness of the Greenstone installation's binaries
148rem The sort of output we want:
149:: Installed GS as 32 bit
150:: Detected java is 64 bit
151:: Changing to use the GS bundled 32 bit jre
152:: We've detected a mismatch, this will only affect MG/MGPP collections for searching and GDBM database collections
153
154:: 1. What bit-ness are this Greenstone installation's binaries?
155:: GNUfile: http://stackoverflow.com/questions/2689168/checking-if-file-is-32bit-or-64bit-on-windows
156:: http://gnuwin32.sourceforge.net/packages/file.htm
[31460]157:: Also http://stackoverflow.com/questions/4089641/programatically-determine-if-native-exe-is-32-bit-or-64-bit
[31447]158:: http://stackoverflow.com/questions/2062020/how-can-i-tell-if-im-running-in-64-bit-jvm-or-32-bit-jvm-from-within-a-program
159:: Messy way: http://superuser.com/questions/358434/how-to-check-if-a-binary-is-32-or-64-bit-on-windows
160
161:: "%GSDLHOME%\bin\windows\GNUfile\bin\file.exe" "%GSDLHOME%\bin\windows\wvWare.exe"
[31460]162:: But we'll test the bitness of gdbmjava.dll itself as it's guaranteed to be present in GS3 and is also dependent on JNI
163:: No need to have the right bitness for GS2, since it doesn't use JNI
[31447]164
165:: See https://ss64.com/nt/for_cmd.html for using batch FOR to loop against the results of another command.
166:: Running
167:: for /f "usebackq delims=" %%G IN (`"gs2build\bin\windows\GNUfile\bin\file.exe" gs2build\bin\windows\wvWare.exe`) do echo %%G
168:: prints out the entire output, e.g.:
169:: gs2build\bin\windows\wvWare.exe; PE32 executable for MS Windows (console) Intel 80386 32-bit
170:: To just get the "PE32" part of that output, set the delimiter char to space and request only the 2nd token:
[31472]171:: Note: Using call before the command to allow 2 sets of double quotes, see
[31447]172:: http://stackoverflow.com/questions/6474738/batch-file-for-f-doesnt-work-if-path-has-spaces
173:: Could use shortfilenames, see http://stackoverflow.com/questions/10227144/convert-long-filename-to-short-filename-8-3-using-cmd-exe
[31472]174if not exist "!GSDL3SRCHOME!\lib\jni\gdbmjava.dll" set bitness=UNKNOWN& goto setupjavahome
[32969]175rem The following breaks when GS3 is installed in a path containing spaces
176rem for /f "usebackq tokens=2 delims= " %%G IN (`call "!GSDLHOME!\bin\windows\GNUfile\bin\file.exe" "!GSDL3SRCHOME!\lib\jni\gdbmjava.dll"`) do set bitness=%%G
177rem So run with relative filepaths:
178for /f "usebackq tokens=2 delims= " %%G IN (`cd gs2build ^&^& call "bin\windows\GNUfile\bin\file.exe" "..\lib\jni\gdbmjava.dll"`) do set bitness=%%G
[31447]179
180if "%bitness%" == "PE32+" (
181 set bitness=64
182 echo The installed Greenstone is 64 bit
183) else (
184 if "%bitness%" == "PE32" (
185 set bitness=32
186 echo The installed Greenstone is 32 bit
187 ) else (
[31472]188 echo WARNING: Greenstone installation is of unknown bitness. "%bitness%" is neither 32 nor 64 bit
[31447]189 set bitness=UNKNOWN
190 )
191)
192
193:: 2. What bitness are any JAVA_HOME else JRE_HOME found by search4j?
194:: If you run the non-existent program "pinky" from batch or the DOS console, the exit value is 9009
195:: The same must be true if java is not installed and therefore not found. echo %errorlevel% produces 9009
196:: If java exists and is 32 bit, then running "java -d32 -version" has a return value of 1. echo %errorlevel% (1)
197:: If java exists and is 64 bit, then running "java -d32 -version" has a return value of 0. echo %errorlevel% (0)
198
199:testjavahome
200:: http://www.robvanderwoude.com/errorlevel.php
201:: https://ss64.com/nt/errorlevel.html
[21988]202if DEFINED FOUNDJAVAHOME (
[31469]203 if "%bitness%" == "UNKNOWN" goto setupjavahome
[31472]204 if "%DEBUG%" == "true" echo Testing bitness of JAVA_HOME found at !FOUNDJAVAHOME!:
[31447]205 "!FOUNDJAVAHOME!\bin\java.exe" -d%bitness% -version 2> nul
[31472]206 if !ERRORLEVEL! equ 1 if "%DEBUG%" == "true" echo The detected JDK java is incompatible with !bitness! bit GS& goto testjre
[31447]207 if !ERRORLEVEL! equ 0 (
[31472]208 if "%DEBUG%" == "true" echo The detected JDK java is a matching %bitness% bit
[31461]209 goto setupjavahome
[31472]210 )
[20300]211)
[15071]212
[31447]213:testjre
214if DEFINED FOUNDJREHOME (
[31469]215 if "%bitness%" == "UNKNOWN" goto setupjrehome
[31472]216 if "%DEBUG%" == "true" echo Testing bitness of JRE_HOME found at !FOUNDJREHOME!:
[31447]217 "!FOUNDJREHOME!\bin\java.exe" -d%bitness% -version 2> nul
[31472]218 if !ERRORLEVEL! equ 1 if "%DEBUG%" == "true" echo The detected JRE java is incompatible with !bitness! bit GS& goto testbundledjre
[31471]219 if !ERRORLEVEL! equ 0 (
[31447]220 rem The JRE_HOME found by search4j may be the bundled JRE, overriding any system JRE_HOME,
[31471]221 rem because the bundled JRE_HOME was provided as HINT to search4j.
[31472]222 if "%DEBUG%" == "true" echo The detected JRE java is a matching %bitness% bit
[31461]223 goto setupjrehome
[31472]224 )
[20307]225)
226
[31447]227:: 3. Fall back to 32 bit JRE bundled with GS
[31469]228:testbundledjre
229if exist "!BUNDLED_JRE!\bin\java.exe" (
230 if "%bitness%" == "UNKNOWN" goto bundledjre
[31472]231 if "%DEBUG%" == "true" echo Testing bitness of bundled JRE at !BUNDLED_JRE!:
[31469]232 "!BUNDLED_JRE!\bin\java.exe" -d%bitness% -version 2> nul
[31472]233 if !ERRORLEVEL! equ 1 if "%DEBUG%" == "true" echo The bundled JRE java is incompatible with !bitness! bit& goto setupjavahome
[31471]234 if !ERRORLEVEL! equ 0 (
[31472]235 if "%DEBUG%" == "true" echo The bundled JRE java is a matching %bitness% bit
236 echo *** Changing to use Greenstone's bundled JRE.
[31469]237 goto bundledjre
238 )
239)
240
[31447]241:bundledjre
242:: We bundled a 32 bit JRE, but what if GS was compiled with 64 bit Java?
243:: All but MG/MGPP and GDBM should still work with 64 bit java.
[31469]244if exist "!BUNDLED_JRE!\bin\java.exe" (
245 set JRE_HOME=!BUNDLED_JRE!
246 ::set JAVA_HOME=!BUNDLED_JRE!
[31467]247 set PATH=!JRE_HOME!\bin;!PATH!
248 set RUNJAVA=!JRE_HOME!\bin\java.exe
[20300]249 goto summaryThenEnd
250)
[15071]251
[31461]252:: 4. If no bundled JRE exists either, we'd still need to check if search4j found a JAVA_HOME or JRE_HOME
253:: and use that even if there was a bitness mismatch btw GS3 and the Java found.
254:: Label summaryThenEnd will print out warnings on any mismatch
255:setupjavahome
256if DEFINED FOUNDJAVAHOME (
[31472]257 echo Using the JAVA_HOME detected at !FOUNDJAVAHOME!
[31471]258 set JAVA_HOME=!FOUNDJAVAHOME!
[31461]259 set PATH=!FOUNDJAVAHOME!\bin;!PATH!
260 set RUNJAVA=!FOUNDJAVAHOME!\bin\java.exe
261 goto summaryThenEnd
262)
263
264:setupjrehome
[31472]265if DEFINED FOUNDJREHOME (
266 if "!FOUNDJREHOME!" == "!BUNDLED_JRE!" (
267 echo Using the bundled JRE detected at !FOUNDJREHOME!
268 ) else (
269 echo Using the JRE detected at !FOUNDJREHOME!
270 )
[31461]271 set JRE_HOME=!FOUNDJREHOME!
272 set PATH=!FOUNDJREHOME!\bin;!PATH!
273 set RUNJAVA=!FOUNDJREHOME!\bin\java.exe
274 goto summaryThenEnd
275)
276
[31472]277if exist "!BUNDLED_JRE!\bin\java.exe" (
278 echo Using the bundled JRE detected at !FOUNDJREHOME!
279 goto bundledjre
280)
[31469]281
[31461]282:: 5. Last ditch effort: search4j couldn't find any java, but check any Java env vars set anyway
[31472]283echo Search4j could not find an appropriate JDK or JRE java.
284echo Attempting to use any JAVA_HOME else JRE_HOME in the environment...
285
[22069]286if exist "!JAVA_HOME!\bin\java.exe" (
287 set PATH=!JAVA_HOME!\bin;!PATH!
288 set RUNJAVA=!JAVA_HOME!\bin\java.exe
[22082]289 echo Using Java at !JAVA_HOME!
290 echo WARNING: Greenstone has not checked the version number of this Java installation
291 echo The source distribution of Greenstone3 requires Java 1.5 or greater
292 echo SVN users may still use Java 1.4
[31447]293 echo.
[20300]294 goto summaryThenEnd
295)
296
[22069]297if exist "!JRE_HOME!\bin\java.exe" (
298 set PATH=!JRE_HOME!\bin;!PATH!
299 set RUNJAVA=!JRE_HOME!\bin\java.exe
[22082]300 echo Using Java at !JRE_HOME!
[31447]301 echo WARNING: Greenstone has not checked the version number of this JRE installation
[22081]302 echo The source distribution of Greenstone3 requires Java 1.5 or greater
[22082]303 echo SVN users may still use Java 1.4
[31447]304 echo.
[20300]305 goto summaryThenEnd
306)
307
[22082]308echo ERROR: Failed to locate Java
[31447]309echo Please set JAVA_HOME or JRE_HOME to point to an appropriate %bitness% bit Java
[20300]310goto end
311
312:summaryThenEnd
[31461]313:: 6. Check that the bitness of any Java found is appropriate and warn if it is not.
[31469]314if "%bitness%" == "UNKNOWN" goto displayvars
[31447]315"!RUNJAVA!" -d%bitness% -version 2> nul
316if !ERRORLEVEL! equ 1 (
[31468]317 echo *** WARNING: Detected mismatch between the bit-ness of your Greenstone installation ^(!bitness! bit^)
318 echo *** and the Java found at !RUNJAVA!.
[31447]319 echo *** Continuing with this Java anyway:
[31472]320 echo *** This will only affect MG/MGPP collections for searching, and GDBM database collections.
321 echo *** Else set JAVA_HOME or JRE_HOME to point to an appropriate %bitness%-bit Java,
322 echo *** or recompile GS with your system Java:
[31447]323 if exist "!JAVA_HOME!" ( echo *** JAVA_HOME at !JAVA_HOME! ) else ( echo *** JRE_HOME at !JRE_HOME! )
324)
[20300]325
[31469]326:displayvars
[31472]327if "%DEBUG%" == "true" echo ********************************************************************
[31447]328echo.
329
[22069]330echo GSDL3SRCHOME : !GSDL3SRCHOME!
331echo GSDL3HOME : !GSDL3HOME!
332echo JAVA : !RUNJAVA!
[22075]333
[22024]334if "!ANT_HOME!" == "" (
[20493]335 echo.
336 echo ANT_HOME is not yet set.
337 echo Please make sure you have Ant version 1.7.1 or higher installed
[22082]338 echo Then set ANT_HOME to the Ant installation folder
[22075]339 echo and add the path to its bin folder to the PATH environment variable
[20493]340) else (
[22024]341 echo ANT_HOME : !ANT_HOME!
[20493]342)
343echo.
[22015]344
[27832]345:done
[22069]346:: End localisation of variables that started with the set local/set enabledelayedexpansion command
[31472]347:: Restore global variables that would otherwise be lost at script's end due to their having been initialised in a
[22069]348:: set local/set enabledelayedexpansion section. See http://ss64.com/nt/endlocal.html
[31473]349endlocal & set RUNJAVA=%RUNJAVA%& set PATH=%PATH%& set GSDLOS=%GSDLOS%& set GSDLHOME=%GSDLHOME%& set GSDL3HOME=%GSDL3HOME%& set GSDL3SRCHOME=%GSDL3SRCHOME%& ^
350set JAVA_HOME=%JAVA_HOME%& set JRE_HOME=%JRE_HOME%& set ANT_HOME=%ANT_HOME%& set CLASSPATH=%CLASSPATH%
[22015]351
[31473]352:end
Note: See TracBrowser for help on using the repository browser.