aboutsummaryrefslogtreecommitdiff
path: root/cbt.bat
blob: 676573daad27e32d3ee98d7bbf6852006ec3bda9 (plain) (blame)
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
@ECHO OFF
REM Launcher bash script that bootstraps CBT from source.
REM (Some of the code for reporting missing dependencies and waiting for nailgun to come up is a bit weird.)
REM This is inentionally kept as small as posible.
REM Welcome improvements to this file:
REM - reduce code size through better ideas
REM - reduce code size by moving more of this into type-checked Java/Scala code (if possible without performance loss).
REM - reduction of dependencies
REM - performance improvements

REM utility function to log message to stderr with stating the time
setlocal EnableExtensions EnableDelayedExpansion

where javac > nul 2>&1

if ERRORLEVEL 1 (
    ECHO You need to install javac! CBT needs it to bootstrap from Java sources into Scala.
    GOTO :EOF
)

javac -version > %CBT_HOME%temp.txt 2>&1
SET /p javac_version_output=<%CBT_HOME%temp.txt

FOR /f "tokens=2" %%G IN ("%javac_version_output%") DO SET javac_version=%%G 

FOR /f "tokens=2 delims=." %%G IN ("%javac_version%") DO SET javac_version_minor=%%G 

IF javac_version_minor LSS 8 (
  echo You need to install javac version 1.7 or greater!
  echo Current javac version is %javac_version
  GOTO :EOF
)

SET nailgun_installed=0

where ng > nul 2>&1

if ERRORLEVEL 1 (
  ECHO You need to install Nailgun to make CBT slightly faster. > nul 2>&1
) ELSE ( SET nailgun_installed=1 )

where ng-server > nul 2>&1

if ERRORLEVEL 1 (
    ECHO You need to install Nailgun Server to make CBT slightly faster.
) ELSE ( SET nailgun_installed=1 )

IF %nailgun_installed%==0 ECHO Note: nailgun not found. It makes CBT faster! > nul 2>&1

where gpg > nul 2>&1
SET gpg_installed=0
if ERRORLEVEL 1 (
    ECHO You need to install gpg for login.
) ELSE ( SET gpg_installed=0 )



SET NAILGUN_PORT=4444
SET NG=ng --nailgun-port %NAILGUN_PORT%

for /f "delims=" %%i in ('chdir') do SET CWD=%%i

SET CBT_HOME=%~dp0

SET SCALA_VERSION=2.11.8

SET NAILGUN=%CBT_HOME%nailgun_launcher\
SET STAGE1=%CBT_HOME%stage1\
SET TARGET=target\scala-2.11\classes\

mkdir %NAILGUN%%TARGET% > nul 2>&1
mkdir %STAGE1%%TARGET%  > nul 2>&1

SET nailgun_out=%NAILGUN%\target\nailgun.stdout.log
SET nailgun_err=%NAILGUN%\target\nailgun.strerr.log

where nc > nul 2>&1

SET nc_installed=1
SET server_up=0

IF ERRORLEVEL 1 (
    ECHO Note: nc not found. It will make slightly startup faster.
) ELSE ( 
  nc -z -n -w 1 127.0.0.1 %NAILGUN_PORT% > nul 2>&1
  SET server_up=1
)

IF "%1%"=="kill" (
  echo Stopping nailgun 1>&2
  %NG% ng-stop >> %nailgun_out 2>> %nailgun_err%
  GOTO :EOF
)

SET use_nailgun=1

SET res=0
IF %nailgun_installed%==0 SET res=1
IF "%1%"=="publishSigned" SET res=1
IF "%2%"=="publishSigned" SET res=1
IF "%1%"=="direct"        SET res=1
IF "%2%"=="direct"      SET res=1

IF %res%==1 SET use_nailgun=0

REM  IF NOT %server_up%==1
REM >> %nailgun_out 2>> %nailgun_err
IF %use_nailgun%==1 (
  REM try to start nailgun-server, just in case it's not up
  START ng-server 127.0.0.1:%NAILGUN_PORT%  
)

:RUN
  CALL :stage1 %*
  IF NOT "%1%"=="loop" (
    GOTO :EOF
  ) ELSE (
    GOTO :RUN
    echo "======= Restarting CBT =======" 1>&2
  )

:stage1
SETLOCAL
SET NAILGUN_INDICATOR=%NAILGUN%%TARGET%cbt\NailgunLauncher.class
SET changed=0

IF EXIST %NAILGUN_INDICATOR% (
  REM this should recompile nailgun_launcher/ if any .java file is newer than NailgunLauncher.class, FIXME doesn't work
  FOR %%i IN (%NAILGUN%*.java) DO (
    FOR /F %%z IN ('DIR /B /O:D %%i%% %NAILGUN_INDICATOR% 2^> nul') DO SET NEWEST=%%z
    if "%NEWEST:~-4%"=="java" ( SET changed=1 )
  )
) ELSE (
  SET changed=1
)

IF %changed%==1 (
  REM defensive delete of potentially broken class files
  REM DEL /s /q /f %NAILGUN%%TARGET%cbt\*.class > nul 2>&1 

  echo Compiling cbt/nailgun_launcher
  
  dir /B /A:-D %NAILGUN%\*.java > %CBT_HOME%temp.txt
  
  FOR /F "tokens=*" %%j in (%CBT_HOME%temp.txt) do SET "files=!files! %NAILGUN%%%j"

  javac -Xlint:deprecation -d %NAILGUN%%TARGET% !files!

  IF ERRORLEVEL 1 (
    REM triggers recompilation next time.
    DEL %NAILGUN%TARGET/cbt/*.class 2> NUL REM triggers recompilation next time.
    GOTO :eof
  )
  
  IF %use_nailgun%==0 (
    REM echo "Stopping nailgun" 1>&2
    %NG% ng-stop >> %nailgun_out% 2>> %nailgun_err%
    REM echo "Restarting nailgun" 1>&2
    ng-server 127.0.0.1:%NAILGUN_PORT% >> %nailgun_out% 2>> %nailgun_err%
  )
)

REM TODO 0.0 should be replaced by actual spent time, see ./cbt
IF %use_nailgun%==0 java %JAVA_OPTS% -Xmx6072m -Xss10M -XX:+TieredCompilation -XX:TieredStopAtLevel=1 -Xverify:none -cp %NAILGUN%%TARGET% cbt.NailgunLauncher 0.0 %CWD% %*
IF %use_nailgun%==0 GOTO :ENDIF

SET /A counter=0
:BEGINFOR
REM ECHO %counter%
IF /I "%counter%" EQU "10" GOTO :ENDFOR
%NG% ng-cp %NAILGUN%%TARGET%
%NG% cbt.NailgunLauncher check-alive
%NG% ng-cp %NAILGUN%%TARGET% >> %nailgun_out% 2>> %nailgun_err%
%NG% cbt.NailgunLauncher check-alive >> %nailgun_out% 2>> %nailgun_err%

SET isAlive=0
IF %errorlevel%==131 SET isAlive=1
IF %errorlevel%==33  SET isAlive=1


REM IF ERRORLEVEL 1 (
  REM ECHO Waiting for nailgun
REM ) ELSE (
  REM GOTO :ENDFOR 
REM )

SLEEP 2
SET /A counter=%counter% + 1
REM GOTO :BEGINFOR
:ENDFOR
%NG% cbt.NailgunLauncher %CWD% %*
ENDLOCAL
:ENDIF
:ENDPROGRAM
ENDLOCAL
REM DEL %CBT_HOME%temp.txt > NUL 1>&2