ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-4/make/Makefile
(Generate patch)

Comparing trunk/OOPSE-4/make/Makefile (file contents):
Revision 1505 by gezelter, Wed Sep 29 15:58:18 2004 UTC vs.
Revision 1523 by tim, Mon Oct 4 20:56:51 2004 UTC

# Line 33 | Line 33
33   #  $<      - Current dependency
34   #
35   #---------------------------------------------------------------------------
36 + IS_UNIX=1
37 + #packages to be made
38 + Packages = \
39 +        utils \
40 +        math \
41 +        types \
42 +        primitives \
43 +        visitors \
44 +        UseTheForce/DarkSide \
45 +        UseTheForce \
46 +        brains \
47 +        io \
48 +        integrators \
49 +        minimizers \
50 +        constraints \
51 +        profiling \
52 +        restraints \
53 +        applications/oopse \
54 +        applications/dump2Xyz \
55 +        applications/simpleBuilder \
56  
57 + #packages contain libraries
58 + PackageLibs = \
59 +        utils \
60 +        math \
61 +        types \
62 +        primitives \
63 +        visitors \
64 +        UseTheForce/DarkSide \
65 +        UseTheForce \
66 +        brains \
67 +        io \
68 +        integrators \
69 +        minimizers \
70 +        constraints \
71 +        profiling \
72 +        restraints \
73 +
74 + IncludeDirs = \
75 +        /usr/local/include \
76 +        
77 +
78 + LibraryDirs = \
79 +        /usr/local/lib \
80 +        
81 +
82 + Libraries = \
83 +        -lsprng \
84 +        
85 +
86 + LinkOptions = \
87 +         -L/usr/local/intel/compiler81/lib -L/usr/lib -lifport -lifcore -limf -lm -lcxa -lirc -lunwind -lirc_s
88 +
89 + OopseHome       = /usr/local/oopse
90 + ForceParamDir   = /usr/local/oopse/share/forceFields/
91 + SampleSimDir    = /usr/local/oopse/share/samples/
92 + FrcDeclare      = -DFRC_PATH="$(ForceParamDir)"
93 + ParallelDeclare = -DIS_MPI
94 +
95 +
96   #---------------------------------------------------------------------------
97   #
98   #  Directories
99   #
100   #---------------------------------------------------------------------------
42 SourceDir        = $(DEV_ROOT)/src
43 TargetDir        = $(DEV_ROOT)/obj
44 LibDir           = $(DEV_ROOT)/lib
45 MakeDir          = $(DEV_ROOT)/make
46 BinDir           = $(DEV_ROOT)/bin
47 DocsDir          = $(DEV_ROOT)/docs
48 CurrentDir       = $(CURDIR)
101  
102 + SourceDir         = $(DEV_ROOT)/src
103 + TargetDir         = $(DEV_ROOT)/obj
104 + ParallelTargetDir = $(DEV_ROOT)/MPIobj
105 + LibDir            = $(DEV_ROOT)/lib
106 + MakeDir           = $(DEV_ROOT)/make
107 + BinDir            = $(DEV_ROOT)/bin
108 + DocsDir           = $(DEV_ROOT)/docs
109 + CurrentDir        = $(CURDIR)
110 +
111   ifdef Source
112 < Package          = $(subst $(SourceDir)/,,$(CurrentDir))
113 < PackageList      = $(Package)
114 < PackageSourceDir = $(SourceDir)/$(Package)
115 < PackageTargetDir = $(TargetDir)
116 < JavaMainClass    = $(subst /,.,$(Package)).$(Main)
112 > #get the relative path of current package to source directory
113 > # /home/maul/gezelter/src/code/src/UseTheForce/Darkside --> UseTheForce/Darkside
114 > #Package          = $(shell echo $(CurrentDir) | sed -e 's/^.*\/src\/\(.*\)/\1/g')
115 > #use shell script to get the absolute path and then rip it off from $(CurrentDir)
116 > Package          = $(subst $(shell cd $(SourceDir); pwd)/,,$(CurrentDir))
117 >
118 > PackageList              = $(Package)
119 > PackageSourceDir         = $(SourceDir)/$(Package)
120 > PackageTargetDir         = $(TargetDir)
121 > PackageParallelTargetDir = $(ParallelTargetDir)
122 > JavaMainClass            = $(subst /,.,$(Package)).$(Main)
123   else
124 < PackageList      = $(Packages) $(JavaPackages)
124 > PackageList              = $(Packages) $(JavaPackages)
125   endif
126  
127 < PackageListLoop  = $(patsubst %,$(SourceDir)/%/.loop,$(PackageList))
127 > PackageListLoop          = $(patsubst %,$(SourceDir)/%/.loop,$(PackageList))
128  
129 < JRE              = $(JAVA_HOME)/jre/lib/rt.jar
129 > JRE                      = $(JAVA_HOME)/jre/lib/rt.jar
130  
131   ifdef IS_UNIX
132   X = :
# Line 87 | Line 154 | SourceFiles            = $(JavaFiles:%.java=  $(Packag
154                                        $(YaccFiles) $(CorbaFiles), \
155                                        $(Source))
156   ManifestFile           = $(PackageSourceDir)/Manifest
90 SourceFiles            = $(JavaFiles:%.java=  $(PackageSourceDir)/%.java)\
91                         $(CppFiles:%.cpp=    $(PackageSourceDir)/%.cpp)\
92                         $(CFiles:%.c=        $(PackageSourceDir)/%.c)\
93                         $(FortranFiles:%.f=  $(PackageSourceDir)/%.f)\
94                         $(F90Files:%.F90=    $(PackageSourceDir)/%.F90)\
95                         $(LexFiles:%.l=      $(PackageSourceDir)/%.l)\
96                         $(YaccFiles:%.y=     $(PackageSourceDir)/%.y)\
157  
158 + SourceFiles            = $(JavaFiles)\
159 +                         $(CppFiles)\
160 +                         $(CFiles)\
161 +                         $(FortranFiles)\
162 +                         $(F90Files)\
163 +                         $(LexFiles)\
164 +                         $(YaccFiles)
165  
166   # Target
167   JavaClassFiles         = $(JavaFiles:%.java=  $(PackageTargetDir)/%.class)
# Line 104 | Line 171 | ObjectFiles            = $(CFiles:%.c=        $(Packag
171   JniClassFiles          = $(JniSource:%.java=  $(PackageTargetDir)/%.class)
172   JniHeaders             = $(JniSource:%.java=  $(PackageSourceDir)/%.h)
173   ObjectFiles            = $(CFiles:%.c=        $(PackageTargetDir)/%.o)\
174 <                         $(CppFiles:%.cpp=    $(PackageTargetDir)/%.o)\
175 <                         $(FortranFiles:%.f=  $(PackageTargetDir)/%.o)\
176 <                         $(F90Files:%.F90=    $(PackageTargetDir)/%.o)\
177 <                         $(LexFiles:%.l=      $(PackageTargetDir)/%.o)\
178 <                         $(YaccFiles:%.y=     $(PackageTargetDir)/%.o)
174 >                         $(CppFiles:%.cpp=    $(PackageTargetDir)/%.o)\
175 >                                     $(FortranFiles:%.f=  $(PackageTargetDir)/%.o)\
176 >                                     $(F90Files:%.F90=    $(PackageTargetDir)/%.o)\
177 >                                     $(LexFiles:%.l=      $(PackageTargetDir)/%.o)\
178 >                                     $(YaccFiles:%.y=     $(PackageTargetDir)/%.o)
179 > ParallelObjectFiles    = $(CFiles:%.c=        $(PackageParallelTargetDir)/%.o)\
180 >                                     $(CppFiles:%.cpp=    $(PackageParallelTargetDir)/%.o)\
181 >                                     $(FortranFiles:%.f=  $(PackageParallelTargetDir)/%.o)\
182 >                                     $(F90Files:%.F90=    $(PackageParallelTargetDir)/%.o)\
183 >                                     $(LexFiles:%.l=      $(PackageParallelTargetDir)/%.o)\
184 >                                     $(YaccFiles:%.y=     $(PackageParallelTargetDir)/%.o)
185  
186   DerivedSource          = $(YaccFiles:%.y=    %.h) \
187 <                         $(YaccFiles:%.y=    %.c) \
188 <                         $(LexFiles:%.l=     %.c)
187 >                               $(YaccFiles:%.y=    %.c) \
188 >                               $(LexFiles:%.l=     %.c)
189  
190   DerivedCFiles          = $(YaccFiles:%.y=    %.c) \
191 <                         $(LexFiles:%.l=     %.c)
191 >                               $(LexFiles:%.l=     %.c)
192  
193   OtherTargetFiles       = $(OtherSourceFiles:%=$(PackageTargetDir)/%)
194  
# Line 128 | Line 201 | ifneq  "$(words $(ObjectFiles))" "0"
201   endif
202  
203   #if Main is defined, do not build library. It may not be true sometimes
204 < ifneq  "$(words $(ObjectFiles))" "0"
204 > ifneq  "$(words $(ObjectFiles) $(ParallelObjectFiles))" "0"
205    DependencyFile    = $(PackageSourceDir)/Makedepend
206    ifneq "$(Main)" ""
207 <    Executable        = $(BinDir)/$(Main)
207 >    Executable             = $(BinDir)/$(Main)
208 >    ParallelExecutable     = $(BinDir)/$(Main)_MPI
209    else
210 <    SharedLibrary     = $(LibDir)/lib$(subst /,,$(Package)).so
211 <    StaticLibrary     = $(LibDir)/lib$(subst /,,$(Package)).a
210 >    SharedLibrary          = $(LibDir)/lib$(subst /,,$(patsubst %,oopse_%,$(Package))).so
211 >    StaticLibrary          = $(LibDir)/lib$(subst /,,$(patsubst %,oopse_%,$(Package))).a
212 >    ParallelSharedLibrary  = $(LibDir)/lib$(subst /,,$(patsubst %,oopse_%,$(Package)))_MPI.so
213 >    ParallelStaticLibrary  = $(LibDir)/lib$(subst /,,$(patsubst %,oopse_%,$(Package)))_MPI.a
214    endif
215   endif
216   #
# Line 144 | Line 220 | LocalLibs        = $(subst /,,$(Packages))
220   JavaPackageNames = $(subst /,.,$(JavaPackages))
221   IncludePath      = -I$(SourceDir) $(IncludeDirs:%=-I%)
222   LibDirs          = -L$(LibDir)    $(LibraryDirs:%=-L%)
223 < LocalLibs        = $(subst /,,$(Packages))
224 < LibList          = $(LocalLibs:%=-l%) $(Libraries:%=-l%)
223 > LocalLibs        = $(subst /,,$(patsubst %, oopse_%, $(PackageLibs)))
224 > ParallelLocalLibs= $(subst /,,$(patsubst %, oopse_%_MPI, $(PackageLibs)))
225 > LibList          = $(LocalLibs:%=-l%) $(Libraries)
226 > ParallelLibList  = $(LocalLibs:%=-l%) $(Libraries)
227  
228  
229   #---------------------------------------------------------------------------
# Line 160 | Line 238 | MakeDir                = mkdir -p
238   CppCompiler            = icpc
239   Linker                 = icpc
240   MakeDepend             = makedepend
241 < MakeDir                = mkdir -p
241 > Install                = /usr/bin/install -c
242 > InstallProgram         = ${INSTALL}
243 > InstallData            = ${INSTALL} -m 644
244 > MakeDir                = /home/maul/gezelter/tim/code/OOPSE-2.0/ac-tools/shtool mkdir -p -f
245   Delete                 = rm -fr
246   StaticArchiver         = ar
247   DynamicArchiver        = icc
248 < FortranCompiler        = ifort
248 > FortranCompiler        = @FC@
249   F90Compiler            = ifort
250   JavaCompiler           = $(JAVA_HOME)/bin/javac
251   JavaArchiver           = $(JAVA_HOME)/bin/jar
# Line 180 | Line 261 | MakeOptions            = -k -s
261   Lex                    = flex
262  
263  
264 < MakeOptions            = -k -s
264 > MakeOptions            = -k
265   MakeDependOptions      =
266   StaticArchiverOptions  = rc
267   DynamicArchiverOptions = -shared
# Line 188 | Line 269 | FortranOptions         =
269   JniOptions             =
270   RmiOptions             = -d $(TargetDir) -classpath $(ClassPath) \
271                           -sourcepath $(SourceDir)
272 + COptions               = $(FrcDeclare)
273 + CParallelOptions       = $(FrcDeclare) $(ParallelDeclare)
274 + CppOptions             = $(FrcDeclare)
275 + CppParallelOptions     = $(FrcDeclare) $(ParallelDeclare)
276   FortranOptions         =
277 < F90Options             =  -I$(SourceDir) -module $(TargetDir)
277 > F90Options             =  -fpp1  -O -I$(SourceDir) -module $(TargetDir)
278 > F90ParallelOptions     =  -fpp1  -O -I$(SourceDir) -module $(TargetDir)   $(ParallelDeclare)
279   JavaCompilerOptions    = -d $(TargetDir) -classpath $(ClassPath) \
280                           -sourcepath $(SourceDir) -deprecation
281   JavaRunOptions         = -classpath $(ClassPath)
# Line 228 | Line 314 | $(PackageTargetDir)/%.o : $(PackageSourceDir)/%.c
314          $(MakeDir) $@
315  
316   # .c -> .o
317 < $(PackageTargetDir)/%.o : $(PackageSourceDir)/%.c
317 > $(PackageTargetDir)/%.o : %.c
318          $(Print) $@
319 <        $(Print) $(CCompiler) $(COptions) -c $(IncludePath) $< -o $@
234 <        @$(CCompiler) $(COptions) -c $(IncludePath) $< -o $@
319 >        $(CCompiler) $(COptions) -c $(IncludePath) $< -o $@
320  
321 < %.o : $(PackageSourceDir)/%.c
321 > %.o : %.c
322          $(MAKE) $(MakeOptions) $(PackageTargetDir)/$@
323  
324   # .cpp -> .o
325 < $(PackageTargetDir)/%.o : $(PackageSourceDir)/%.cpp
241 <        $(Print) $@
242 <        $(Print) $(CppCompiler) $(CppOptions) -c $(IncludePath) $< -o $@
325 > $(PackageTargetDir)/%.o : %.cpp
326          $(CppCompiler) $(CppOptions) -c $(IncludePath) $< -o $@
327  
328 < %.o : $(PackageSourceDir)/%.cpp
328 > %.o : %.cpp
329          $(MAKE) $(MakeOptions) $(PackageTargetDir)/$@
330  
331   # .f -> .o
332 < $(PackageTargetDir)/%.o : $(PackageSourceDir)/%.f
333 <        $(Print) $@
251 <        $(Print) $(FortranCompiler) $(FortranOptions) -c $< -o $@
252 <        @$(FortranCompiler) $(FortranOptions) -c $< -o $@
332 > $(PackageTargetDir)/%.o : %.f
333 >        $(FortranCompiler) $(FortranOptions) -c $< -o $@
334  
335 < %.o : $(PackageSourceDir)/%.f
335 > %.o : %.f
336          $(MAKE) $(MakeOptions) $(PackageTargetDir)/$@
337  
338   # .F90 -> .o
339 < $(PackageTargetDir)/%.o : $(PackageSourceDir)/%.F90
340 <        $(Print) $@
260 <        $(Print) $(F90Compiler) $(F90Options) -c $< -o $@
261 <        @$(F90Compiler) $(F90Options) -c $< -o $@
339 > $(PackageTargetDir)/%.o : %.F90
340 >        $(F90Compiler) $(F90Options) -c $< -o $@
341  
342 < %.o : $(PackageSourceDir)/%.F90
342 > %.o : %.F90
343          $(MAKE) $(MakeOptions) $(PackageTargetDir)/$@
344  
345   # .java -> .class
346   $(PackageTargetDir)/%.class : $(PackageSourceDir)/%.java
347 <        $(Print) $@
269 <        $(Print) $(JavaCompiler) $(JavaCompilerOptions) $<
270 <        @$(JavaCompiler) $(JavaCompilerOptions) $<
347 >        $(JavaCompiler) $(JavaCompilerOptions) $<
348  
349   %.class : $(PackageSourceDir)/%.java
350          @$(MAKE) $(MakeOptions) $(PackageTargetDir)/$@
351  
352   # .class -> .h
353   $(PackageSourceDir)/%.h : $(PackageTargetDir)/%.class
277        $(Print) $@
278        $(Print) $(JniCompiler) $(JniOptions) $(JavaPackageName).$*
354          $(JniCompiler) $(JniOptions) $(JavaPackageName).$*
355  
356   %.h : %.class
357          $(MAKE) $(MakeOptions) $(PackageSourceDir)/$@
358  
359   #.y -> .h
360 < $(PackageSourceDir)/%.h : $(PackageSourceDir)/%.y
361 <        $(Print) $@
287 <        $(Print) @$(Yacc) -d $?
288 <        @$(Yacc) -d  $?
360 > %.h : %.y
361 >        $(Yacc) -d  $?
362          @$(Move) y.tab.h $*.h
363          @$(Delete) y.tab.c
364  
365   #.y -> .c
366 < $(PackageSourceDir)/%.c : $(PackageSourceDir)/%.y
367 <        $(Print) $@
295 <        $(Print) $(Yacc) -d $?
296 <        @$(Yacc) -d  $?
366 > %.c : %.y
367 >        $(Yacc) -d  $?
368          @$(Move) y.tab.c $*.c
369          @$(Delete) y.tab.h
370  
371   # .l -> .c
372 < $(PackageSourceDir)/%.c : $(PackageSourceDir)/%.l
372 > %.c : %.l
373          $(Print) $@
374          $(Print) $(Lex) -o$@ $?
375          @$(Lex) -o$@ $?
376  
377   # .o -> .a
378   $(LibDir)/%.a : $(ObjectFiles)
379 <        $(Print) $@
309 <        $(Print) $(StaticArchiver) $(StaticArchiverOptions) $@ $(ObjectFiles)
310 <        @$(StaticArchiver) $(StaticArchiverOptions) $@ $(ObjectFiles)
379 >        $(StaticArchiver) $(StaticArchiverOptions) $@ $(ObjectFiles)
380  
381   %.a : $(ObjectFiles)
382 +        $(MAKE) $(MakeOptions) $(LibDir)/$@
383 +
384 + $(LibDir)/%_MPI.a : $(ParallelObjectFiles)
385 +        $(StaticArchiver) $(StaticArchiverOptions) $@ $(ParallelObjectFiles)
386 +
387 + %_MPI.a : $(ParallelObjectFiles)
388          $(MAKE) $(MakeOptions) $(LibDir)/$@
389  
390   # .o -> .so
391   $(LibDir)/%.so : $(ObjectFiles)
317        $(Print) $@    
318        $(Print) $(DynamicArchiver) $(ObjectFiles) $(DynamicArchiverOptions) -o $@
392          $(DynamicArchiver) $(ObjectFiles) $(DynamicArchiverOptions) -o $@
393  
394   %.so : $(ObjectFiles)
395          $(MAKE) $(MakeOptions) $(LibDir)/$@
396  
397 + $(LibDir)/%_MPI.so : $(ParallelObjectFiles)
398 +        $(DynamicArchiver) $(ParallelObjectFiles) $(DynamicArchiverOptions) -o $@
399 +
400 + %_MPI.so : $(ParallelObjectFiles)
401 +        $(MAKE) $(MakeOptions) $(LibDir)/$@
402 +
403   # .class -> .jar
404   $(LibDir)/%.jar : $(JavaClassFiles) $(OtherTargetFiles)
405          $(Print) $@
327        $(Print) $(JavaArchiver) -cf $@ $(JavaClassFilesRel) $(OtherTargetFiles)
406          @cd $(TargetDir); $(JavaArchiver) -cf $@ \
407          $(JavaClassFilesRel) $(OtherTargetFiles)
408  
# Line 356 | Line 434 | $(Executable) : $(ObjectFiles)
434  
435   # Executable
436   $(Executable) : $(ObjectFiles)
359        $(Print) $@
437          $(Linker) $(LinkOptions) $(LibDirs) $(LibList) $(ObjectFiles) -o $@
438  
439 + $(ParallelExecutable) : $(ParallelObjectFiles)
440 +        $(Linker) $(LinkOptions) $(LibDirs) $(ParallelLibList) $(ParallelObjectFiles) -o $@
441 +
442   # Anything else is just copied from source to target
443   $(PackageTargetDir)/% : $(PackageSourceDir)/%
444          $(Print) $@
# Line 382 | Line 462 | _buildall : \
462          $(StaticLibrary) \
463          $(JarFile) \
464          $(Executable)
465 +        
466  
386
467   # make clean
468   clean : $(PackageListLoop)
469          $(Print) Done clean.    
470  
471   _cleanall :
472 <        $(Delete) $(PackageTargetDir)/* \
472 >        $(Delete) $(ObjectFiles) $(ParallelObjectFiles)
473 >
474 > # make distclean
475 > distclean : $(PackageListLoop)
476 >        $(Print) Done clean.    
477 >
478 > _distcleanall :
479 >        $(Delete) $(ObjectFiles) \
480 >                  $(ParallelObjectFiles) \
481                    $(JarFile) \
482                    $(SharedLibrary) \
483                    $(StaticLibrary) \
484 +                  $(ParallelSharedLibrary) \
485 +                  $(ParallelStaticLibrary) \
486                    $(Executable) \
487 <                  $(DependencyFile)
487 >                  $(ParallelExecutable) \
488 >                  $(DependencyFile)
489  
490  
491   # make depend
# Line 406 | Line 497 | $(DependencyFile) : $(DerivedSource)
497   $(DependencyFile) : $(DerivedSource)
498          $(Print) $@
499          @cd $(PackageSourceDir)
500 <        touch Make.temp
501 < ifdef $(CppFiles)
502 <        $(CppCompiler) $(IncludePath) -MM $(CppFiles)  > Make.temp
500 >
501 >        touch Make.ctemp
502 >        touch Make.ctemp
503 >
504 > ifneq "$(words $(CppFiles))" "0"
505 >        $(CppCompiler) $(IncludePath) -MM $(CppFiles)  > Make.cpptemp
506 >        cat Make.cpptemp | sed 's/^[a-zA-Z0-9]/$$\(DEV_ROOT\)\/obj\/&/g' >> $(DependencyFile)
507 >        cat Make.cpptemp | sed 's/^[a-zA-Z0-9]/$$\(DEV_ROOT\)\/MPIobj\/&/g' >> $(DependencyFile)
508   endif
509 < ifdef $(CFiles)
510 <        $(CCompiler)   $(IncludePath) -MM $(CFiles) $(DerivedCFiles)   >> Make.temp
509 >
510 > ifneq "$(words $(CFiles))" "0"
511 >        $(CCompiler)   $(IncludePath) -MM $(CFiles) $(DerivedCFiles)   > Make.ctemp
512 >        cat Make.ctemp | sed 's/^[a-zA-Z0-9]/$$\(DEV_ROOT\)\/obj\/&/g' >> $(DependencyFile)
513 >        cat Make.ctemp | sed 's/^[a-zA-Z0-9]/$$\(DEV_ROOT\)\/MPIobj\/&/g' >> $(DependencyFile)
514 >
515   endif
516 <        cat Make.temp | sed 's/^[a-zA-Z0-9]/$$\(DEV_ROOT\)\/obj\/&/g' >> $(DependencyFile)
517 <        cat Make.temp | sed 's/^[a-zA-Z0-9]/$$\(DEV_ROOT\)\/MPIobj\/&/g' >> $(DependencyFile)
518 < ifdef $(F90Files)
519 <        $(DEV_ROOT)/scripts/sfmakedepend  -I $(DEV_ROOT)/src -d '$$(DEV_ROOT)/obj' -f ./Make.ftemp -h *.F90
516 >
517 > ifneq "$(words $(F90Files))" "0"
518 >        $(DEV_ROOT)/scripts/filepp  -I $(DEV_ROOT)/src -od '$$(DEV_ROOT)/obj/' -D__F90   $(F90Files) > Make.ftemp
519 >        $(DEV_ROOT)/scripts/filepp  -I $(DEV_ROOT)/src -od '$$(DEV_ROOT)/MPIobj/' -DIS_MPI -D__F90   $(F90Files) >> Make.ftemp
520          cat Make.ftemp >> $(DependencyFile)
521   endif
522 <        $(Delete) Make.temp Make.ftemp
522 >        $(Delete) Make.cpptemp Make.ctemp Make.ftemp
523  
524   # make lib
525   lib    : $(PackageListLoop)
# Line 448 | Line 548 | pure : $(Executable).pure
548  
549   pure : $(Executable).pure
550  
551 + cvslog:
552 +        $(DEV_ROOT)/scripts/cvs2cl.pl
553 +
554   # Execute
555   _runexe :
556          $(Executable) $(RunParameters)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines