source: Sophya/trunk/SophyaLib/BuildMgr/configure@ 3389

Last change on this file since 3389 was 3357, checked in by ansari, 18 years ago

Ajout flag -alsofftwfloat a configure pour prise en charge FFTW en float, en plus de double - Reza 23/10/2007

  • Property svn:executable set to *
File size: 17.1 KB
Line 
1#!/bin/csh
2# SOPHYA configuration managment script
3# C. Magneville / R. Ansari - Mai 2005
4# Updated : 2006, Avr/Mai , Oct 2007
5# Exemple: ./configure -sbase /laltmp/ansari/sbase/ -scxx cxx -extp /exp/planck/ExtLibs/Include/ \
6# -extp /exp/planck/ExtLibs/OSF1-cxx/
7
8#----------------------------------------------------------------------
9#### liste des modules
10set SOPMODOK = ( 1 1 1 1 1 1 1 1 1 )
11set SOPMOD = ( BaseTools SysTools SUtils TArray NTools HiStats SkyMap Samba SkyT )
12set ALLSOPLIBS = ( '-lBaseTools' '-lSysTools' '-lSUtils' '-lTArray' '-lNTools' '-lHiStats' '-lSkyMap' '-lSamba' '-lSkyT' )
13
14set SOPPIOK = ( 1 1 1 )
15set SOPPI = ( PI PIext PIGcont )
16set ALLPILIBS = ( '-lPI' '-lPIext' '-lPIGcont' )
17
18set SOPEXT = ( FitsIOServer IFFTW LinAlg XAstroPack )
19set EXTCURNAME = ( fits fftw lapack astro )
20set SOPEXTOK = ( 1 1 1 1 )
21set EXTINCNAME = ( FitsIO/fitsio.h FFTW/fftw3.h PASDEINC XAstro/astro.h )
22set EXTLIBNAME = ( libcfitsio.a libfftw3.a liblapack.a libxastro.a )
23set ALLEXTLIBS = ( '-lcfitsio' '-lfftw3' '-llapack -lblas' '-lxastro' )
24
25#FFTW2: set EXTINCNAME = ( FitsIO/fitsio.h FFTW/fftw.h PASDEINC XAstro/astro.h )
26#FFTW2: set EXTLIBNAME = ( libcfitsio.a libfftw.a liblapack.a libxastro.a )
27#FFTW2: set ALLEXTLIBS = ( '-lcfitsio' '-lfftw -lrfftw' '-llapack -lblas' '-lxastro' )
28
29set defextinc = ( /usr/include /usr/local/include )
30set defextlib = ( /usr/lib /usr/local/lib )
31
32
33#----------------------------------------------------------------------
34#### Decodage arguments
35set cmdline = "$0 $*"
36set extpath
37set extpathinc
38set extpathlib
39unset incln
40unset mincname
41set compopt
42unset arch64
43unset sasz64
44unset nofpic
45unset nothsafe
46unset boundcheck
47unset sodebug
48unset usefftw2
49unset uselapack2
50unset alsofftwfloat
51unset slballinone
52while ( $#argv > 0 )
53
54if( "$1" == "-h" ) then
55 echo 'configure [-sbase SOPHYABASE] [-scxx SOPHYACXX] [-incln] '
56 echo " [-minc mymake.inc] [-compopt 'cc/cxxOptions'] "
57 echo ' [-arch64] [-sasz64] [-nofpic] [-nothsafe] [-boundcheck] [-sodebug]'
58 echo ' [-extp dir1 -extp dir2 ...] [-extip dir1 -extip dir2 ... ] [-extlp dir1 -extlp dir2 ... ]'
59 echo ' [-noextlib] [-noext fits] [-noext fftw] [-noext lapack] [-noext astro]'
60 echo ' [-noPI] [-slballinone]'
61 echo ' [-alsofftwfloat] [-usefftw2] [-uselapack2] '
62 echo ' (See SOPHYA manual/web pages for a detailed description of configure options)'
63 exit -1
64endif
65if( "$1" == "-sbase" ) then
66 setenv SOPHYABASE $2
67 shift
68endif
69if( "$1" == "-scxx" ) then
70 setenv SOPHYACXX $2
71 shift
72endif
73if( "$1" == "-incln" ) then
74 set incln
75endif
76if( "$1" == "-minc" ) then
77 set mincname = ( $2 )
78 shift
79endif
80if( "$1" == "-compopt" ) then
81 set compopt = ( $2 )
82 shift
83endif
84if( "$1" == "-extp" ) then
85 set extpath = ( $extpath $2 )
86 shift
87endif
88if( "$1" == "-extip" ) then
89 set extpathinc = ( $extpathinc $2 )
90 shift
91endif
92if( "$1" == "-extlp" ) then
93 set extpathlib = ( $extpathlib $2 )
94 shift
95endif
96if( "$1" == "-noextlib" ) then
97 set i = 0
98 while ( $i < $#SOPEXTOK )
99 @ i += 1
100 set SOPEXTOK[$i] = 0
101 end
102endif
103if( "$1" == "-noext" ) then
104 set i = 0
105 while ( $i < $#EXTCURNAME )
106 @ i += 1
107 if( "$2" == "$EXTCURNAME[$i]" ) set SOPEXTOK[$i] = 0
108 end
109 shift
110endif
111if( "$1" == "-PI" ) then
112 set SOPPIOK = ( 0 0 0 )
113endif
114if( "$1" == "-alsofftwfloat" ) then
115# On veut la version float de FFTW, en plus de double
116 set alsofftwfloat
117 set i = 0
118 while ( $i < $#EXTCURNAME )
119 @ i += 1
120 if( "fftw" == "$EXTCURNAME[$i]" ) then
121 set ALLEXTLIBS[$i] = '-lfftw3 -lfftw3f'
122 endif
123 end
124endif
125if( "$1" == "-usefftw2" ) then
126# version FFTW 2 au lieu de V3
127 set usefftw2
128 set i = 0
129 while ( $i < $#EXTCURNAME )
130 @ i += 1
131 if( "fftw" == "$EXTCURNAME[$i]" ) then
132 set EXTINCNAME[$i] = 'FFTW/fftw.h'
133 set EXTLIBNAME[$i] = 'libfftw.a'
134 set ALLEXTLIBS[$i] = '-lfftw -lrfftw'
135 endif
136 end
137endif
138if( "$1" == "-uselapack2" ) then
139# version LAPACK 2 au lieu de V3
140 set uselapack2
141endif
142if( "$1" == "-slballinone" ) then
143# Pour utiliser une seule librairie libsophyaPIext.so au lieu
144# des 3 libsophya.so libextsophya.so libPI.so
145 set slballinone
146endif
147# Decodage options pour flags de machdefs.h
148# Liste de flags : SO_ARCH64 SO_NOFPIC SO_SASIZET64 SO_BOUNDCHECKING SOPHYA_DEBUG
149if( "$1" == "-arch64" ) then
150 set arch64
151endif
152if( "$1" == "-sasz64" ) then
153 set sasz64
154endif
155if( "$1" == "-nofpic" ) then
156 set nofpic
157endif
158if( "$1" == "-nothsafe" ) then
159 set nothsafe
160endif
161if( "$1" == "-boundcheck" ) then
162 set boundcheck
163endif
164if( "$1" == "-sodebug" ) then
165 set sodebug
166endif
167
168
169shift
170end
171
172
173#----------------------------------------------------------------------
174#### Verification generale
175if( ! $?SOPHYABASE ) then
176 echo ERROR: define SOPHYABASE or use script arguments
177 exit -2
178endif
179if( ! $?SOPHYACXX ) then
180 echo ERROR: define SOPHYACXX or use script arguments
181 echo " SOPHYACXX define the name of the C++ compiler (ex: g++ cxx ...)"
182 exit -2
183endif
184if( ! $?TMPDIR ) setenv TMPDIR /tmp
185touch $TMPDIR/tmp_test
186if( $status != 0 ) then
187 echo ERROR: no write acces in temporary directory: $TMPDIR
188 echo '----> define TMPDIR environment variable: "setenv TMPDIR ..."'
189 exit -2
190endif
191rm -f $TMPDIR/tmp_test
192if( ! $?mincname ) then
193 set mincname = `uname`_${SOPHYACXX}_make.inc
194endif
195if( ! -e $mincname ) then
196 echo ERROR: file $mincname NOT found
197 exit -2
198endif
199if( ! -e ../BaseTools/machdefs_mkmf.h ) then
200 echo ERROR: file machdefs_mkmf.h NOT found in BaseTools
201 exit -2
202endif
203echo SOPEXTOK: $SOPEXTOK
204
205#----------------------------------------------------------------------
206#### creation des variables chemins sophya core
207echo " "
208echo ">>>>>> 1/ Creating directory tree under $SOPHYABASE "
209set sinc = $SOPHYABASE/include
210set slib = $SOPHYABASE/lib
211set sslb = $SOPHYABASE/slb
212set sobj = $SOPHYABASE/obj
213set sexe = $SOPHYABASE/exe
214set sconf = $sinc/SophyaConfInfo
215foreach d ( $sinc $slib $sslb $sobj $sexe $sconf )
216 if( ! -d $d ) then
217 mkdir $d
218 if( $status ) then
219 echo ERROR: creation of $d failed
220 exit -3
221 endif
222 echo Directory $d created
223 endif
224 touch $d/tmp_test
225 if( $status ) then
226 echo ERROR: no write acces to $d
227 exit -4
228 endif
229 rm -f $d/tmp_test
230end
231
232
233#----------------------------------------------------------------------
234#### Fichier confinfo - log e configure
235set conflog = $sconf/conf.log
236rm -f $conflog ; touch $conflog
237echo ' --- Log of SOPHYA configure script - Date= ' `date` >> $conflog
238echo "$cmdline" >> $conflog
239set inclistf = $sconf/include.list
240rm -f $inclistf ; touch $inclistf
241
242
243#----------------------------------------------------------------------
244#### liens ou copie des *.h
245echo " "
246if( $?incln ) then
247 echo ">>>>>> 2/ Creating symbolic link for include files in $sinc "
248else
249 echo ">>>>>> 2/ Copying include files to $sinc "
250endif
251
252cd ../ > /dev/null
253set srcd = `pwd`
254set cpln = "cp -p "
255if( $?incln ) set cpln = "ln -s -f "
256foreach d ( $SOPMOD $SOPEXT $SOPPI )
257 if ( -d $srcd/$d ) then
258 if ( $?incln ) then
259 echo Creating link to include files for module $d
260 else
261 echo Copying include files for module $d
262 endif
263
264 cd $srcd/$d;
265 set file = ( *.h )
266 cd $sinc; if( $status == 0 ) rm -f $file
267 # on vire le .h de $file si .h dans excludeinc du module
268 cd $srcd/$d
269 if( -e excludeinc ) then
270 if( `cat excludeinc | wc -l` > 0 ) then
271 set file
272 foreach f ( *.h )
273 grep -q "$f:r\.h" excludeinc
274 if( $status != 0 ) set file = ( $file $f )
275 end
276 endif
277 endif
278 # on copie ou link dans $sinc
279 if( `echo $file | wc -w` > 0 ) then
280 foreach f ( $file )
281 $cpln $srcd/$d/$f $sinc/$f
282 end
283 endif
284 echo $file >> $inclistf
285 endif
286end
287rm -f $sinc/machdefs_ac.h $sinc/machdefs_mkmf.h
288cd $srcd/BuildMgr/.
289
290
291#----------------------------------------------------------------------
292#### lien des .h des librairies externes
293echo " "
294echo ">>>>>> 3/ Include files for external libraries "
295set i = 0
296while ( $i < $#SOPEXT )
297 @ i += 1
298 if( "$EXTINCNAME[$i]" == "PASDEINC" ) continue
299 if( $SOPEXTOK[$i] <= 0 ) continue
300 set nom = $EXTINCNAME[$i]:t
301 set rac = $EXTINCNAME[$i]:h
302 if( -d ../$SOPEXT[$i] ) then
303 echo "Searching include file for $SOPEXT[$i] ..."
304 foreach d ( $extpathinc $extpath $defextinc )
305 set duminc = `find $d -name $nom -print -follow | head -1 `
306 set dumrep = $duminc:h
307 if ( "$dumrep" != "" ) then
308 rm -f $sinc/$rac
309 ln -f -s $dumrep $sinc/$rac
310 echo Includes for $SOPEXT[$i] found in $dumrep
311 break
312 endif
313 end
314 if ( "$dumrep" == "" ) then
315 echo WARNING: Includes for $SOPEXT[$i] NOT found
316 echo " Compilation of module $SOPEXT[$i] disabled"
317 set SOPEXTOK[$i] = 0
318 endif
319 endif
320end
321
322
323#----------------------------------------------------------------------
324#### liens des librairies externes
325echo " "
326echo ">>>>>> 4.1/ External libraries "
327set fpath = $TMPDIR/fpath
328rm -f $fpath; touch $fpath
329set extliblib
330set i = 0
331while ( $i < $#SOPEXT )
332 @ i += 1
333 if( "$EXTLIBNAME[$i]" == "PASDELIB" ) continue
334 if( $SOPEXTOK[$i] <= 0 ) continue
335 set nom = $EXTLIBNAME[$i]
336 if( -d ../$SOPEXT[$i] ) then
337 echo "Searching libraries path for $SOPEXT[$i] ..."
338 foreach d ( $extpathlib $extpath $defextlib )
339 set dumlib = `find $d -name $nom -print -follow | head -1 `
340 if ( "$dumlib" != "" ) then
341 echo "-L$dumlib:h" >> $fpath
342 set extliblib = ( $extliblib $ALLEXTLIBS[$i] )
343 break
344 endif
345 end
346 if ( "$dumlib" == "" ) then
347 echo WARNING: Libraries for $SOPEXT[$i] NOT found
348 echo " Check the generated make.inc file"
349 endif
350 endif
351end
352set extlibpath = `cat $fpath | sort -u`
353echo extlibpath= $extlibpath
354echo extliblib= $extliblib
355rm -f $fpath
356
357
358#----------------------------------------------------------------------
359#### Identification des librairies archives Sophya
360echo " "
361echo ">>>>>> 4.2/ Sophya libraries archives "
362set sopmodlib
363set i = 0
364while ( $i < $#SOPMOD )
365 @ i += 1
366 if( $SOPMODOK[$i] <= 0 ) continue
367 if( -d ../$SOPMOD[$i] ) then
368 set sopmodlib = ( $sopmodlib $ALLSOPLIBS[$i] )
369 else
370 echo "WARNING: module "$SOPMOD[$i]" not found"
371 endif
372end
373echo sopmodlib= $sopmodlib
374
375echo " "
376echo ">>>>>> 4.3/ PI-Sophya libraries archives "
377set soppilib
378set i = 0
379while ( $i < $#SOPPI )
380 @ i += 1
381 if( $SOPPIOK[$i] <= 0 ) continue
382 if( -d ../$SOPPI[$i] ) then
383 set soppilib = ( $soppilib $ALLPILIBS[$i] )
384 else
385 echo "WARNING: module "$SOPPI[$i]" not found"
386 endif
387end
388echo soppilib= $soppilib
389
390#----------------------------------------------------------------------
391#### Generation de sophyamake.inc
392# On le cree dans le repertoire temporaire d'abord
393set mfile = $sinc/sophyamake.inc
394rm -f $mfile
395echo " "
396echo ">>>>>> 5/ Creating $mfile from $mincname "
397echo "# -----------------------------------------------" > $mfile
398echo "# File make.inc - generated by SOPHYA configure" >> $mfile
399echo "# Date" `date` >> $mfile
400echo "# Seed file : $mincname " >> $mfile
401echo "# -----------------------------------------------" >> $mfile
402echo " " >> $mfile
403echo "# SOPHYA Base installation directory " >> $mfile
404echo "SOPHYABASE = $SOPHYABASE" >> $mfile
405echo " " >> $mfile
406echo 'SOPHYAINCP = $(SOPHYABASE)/include/' >> $mfile
407echo 'SOPHYAOBJP = $(SOPHYABASE)/obj/' >> $mfile
408echo 'SOPHYALIBP = $(SOPHYABASE)/lib/' >> $mfile
409echo 'SOPHYASLBP = $(SOPHYABASE)/slb/' >> $mfile
410echo 'SOPHYAEXEP = $(SOPHYABASE)/exe/' >> $mfile
411
412echo " " >> $mfile
413echo "# module libraries " >> $mfile
414echo "SOPMODLIBLIST = $sopmodlib" >> $mfile
415
416echo " " >> $mfile
417echo "# External libraries PATH " >> $mfile
418echo "SOPEXTLIBP = $extlibpath" >> $mfile
419echo "SOPEXTLIBLIST = $extliblib" >> $mfile
420
421echo " " >> $mfile
422echo "# PI libraries " >> $mfile
423echo "SOPPILIBLIST = $soppilib" >> $mfile
424
425echo " " >> $mfile
426cat $mincname >> $mfile
427
428# --- Gestion des flags modifiants les options de compilation et liste de librairies (par sed)
429set sname = `uname`
430set sprgfile = $TMPDIR/compop.scom
431set scmd = "/FLAGS/s/CNFPHFLF/ $compopt/g"
432if ( $?arch64 ) then
433 set a64cf = ' '
434 if ( ( "$sname" == "IRIX64" ) && ("$SOPHYACXX" == "CC" ) ) set a64cf = '-64'
435 if ( "$sname" == "AIX" ) then
436 if ( ("$SOPHYACXX" == "xlC" ) || ("$SOPHYACXX" == "xlc" ) ) set a64cf = '-q64'
437 echo "/ARFLAGS/s/-rcs/-rcs -X 64/" >> $sprgfile
438 endif
439 set scmd = "/FLAGS/s/CNFPHFLF/$a64cf $compopt/g"
440endif
441echo $scmd > $sprgfile
442if ( $?nofpic ) echo "s/-fPIC/ /g" >> $sprgfile
443if( $?slballinone ) then
444 echo "/SOPHYAALLSLBLIST/s/-lPI -lextsophya -lsophya/-lAsophyaextPI/" >> $sprgfile
445 echo "/SOPHYAEXTSLBLIST/s/-lextsophya -lsophya/-lAsophyaextPI/" >> $sprgfile
446endif
447set scmd = "sed -f $sprgfile"
448set mftmp = $TMPDIR/sopmake.inc
449cp $mfile $mftmp
450sed -f $sprgfile $mftmp > $mfile
451rm -f $sprgfile $mftmp
452# --- FIN de gestion des flags modifiants les options de compilation (par sed)
453
454rm -f $mfile:t
455ln -s $mfile $mfile:t
456
457
458#----------------------------------------------------------------------
459#### Copie de machdefs.h
460set mdefname = $TMPDIR/machdefs.h
461echo " "
462echo ">>>>>> 6.a/ Creating machdefs.h from BaseTools/machdefs_mkmf.h"
463rm -f $mdefname; touch $mdefname
464echo "/*** machdefs.h generated by SOPHYA configure ***/" >> $mdefname
465echo "#ifndef MACHDEFS_SEEN" >> $mdefname
466echo "#define MACHDEFS_SEEN" >> $mdefname
467echo "/*------ Code generation switch ---- */" >> $mdefname
468echo "/* System selector (uname) */" >> $mdefname
469# Fait avant - set sname = `uname`
470echo "#ifndef $sname" >> $mdefname
471echo "#define $sname 1 " >> $mdefname
472echo "#endif" >> $mdefname
473
474## Definition de flags de compilation en fonction des options de configure
475if ( $?arch64 ) echo "#define SO_ARCH64 1" >> $mdefname
476if ( $?sasz64 ) echo "#define SO_SASIZET64 1" >> $mdefname
477if ( $?nofpic ) echo "#define SO_NOFPIC 1" >> $mdefname
478if ( $?nothsafe ) echo "#define SO_NOTHSAFE 1" >> $mdefname
479if ( $?boundcheck ) echo "#define SO_BOUNDCHECKING 1" >> $mdefname
480if ( $?sodebug ) echo "#define SOPHYA_DEBUG 1" >> $mdefname
481
482if ( "$sname" == "IRIX64" ) then
483 if ( "$SOPHYACXX" == "CC" ) then
484# __SGICC__ : flag indiquant que c'est le compilo CC de SGI
485 echo "#define __SGICC__ 1" >> $mdefname
486 endif
487endif
488
489
490echo " " >> $mdefname
491grep -v -e '#ifndef *MACHDEFS_SEEN' -e '#define *MACHDEFS_SEEN' ../BaseTools/machdefs_mkmf.h >> $mdefname
492# On ne copie que si machdefs.h est different
493if (-e $sinc/machdefs.h ) then
494 diff $mdefname $sinc/machdefs.h >& /dev/null
495 if ($status != 0) then
496 cp -f -p $mdefname $sinc/machdefs.h
497 echo " file $sinc/machdefs.h changed -> replaced"
498 else
499 echo " file $sinc/machdefs.h has not changed -> kept"
500 endif
501else
502 cp -f -p $mdefname $sinc/machdefs.h
503 echo " file $sinc/machdefs.h created"
504endif
505rm -f $mdefname
506
507
508#### Creation de sspvflags.h
509echo " "
510echo ">>>>>> 6.b/ Creating $sinc/sspvflags.h "
511rm -f $sinc/sspvflags.h; touch $sinc/sspvflags.h
512
513echo "#ifndef SSPVFLAGS_SEEN" >> $sinc/sspvflags.h
514echo "#define SSPVFLAGS_SEEN" >> $sinc/sspvflags.h
515echo " " >> $sinc/sspvflags.h
516echo "/*------ External libraries no-use flag ---- */" >> $sinc/sspvflags.h
517set i = 0
518while ( $i < $#SOPEXTOK )
519 @ i += 1
520 if( $SOPEXTOK[$i] > 0 ) continue
521 echo "#define SOPHYA_NO_$SOPEXT[$i]" >> $sinc/sspvflags.h
522end
523
524echo " " >> $sinc/sspvflags.h
525echo "/*------ SOPOHYA/ExtLibsvVersion selection flags ---- */" >> $sinc/sspvflags.h
526echo " " >> $sinc/sspvflags.h
527if( $?alsofftwfloat ) then
528 echo "/*-- Compile ALSO float version of FFTWServer methods -- */" >> $sinc/sspvflags.h
529 echo "#define ALSO_FFTW_FLOAT_EXTSOP" >> $sinc/sspvflags.h
530endif
531if( $?usefftw2 ) then
532 echo "/*-- Use FFTW V2 instead of V3 -- */" >> $sinc/sspvflags.h
533 echo "#define FFTW_V2_EXTSOP" >> $sinc/sspvflags.h
534endif
535if( $?uselapack2 ) then
536 echo "/*-- Use LAPACK V2 instead of V3 -- */" >> $sinc/sspvflags.h
537 echo "#define LAPACK_V2_EXTSOP" >> $sinc/sspvflags.h
538endif
539echo " " >> $sinc/sspvflags.h
540if( $?slballinone ) then
541 echo "/*------ Use of single shared lib for SOPHYA+extlibs+PI ---- */" >> $sinc/sspvflags.h
542 echo "#define SO_SLBALLINONE " >> $sinc/sspvflags.h
543endif
544echo " " >> $sinc/sspvflags.h
545echo "#endif " >> $sinc/sspvflags.h
546
547
548#----------------------------------------------------------------------
549#### Creation des fichiers contenant les listes d'objets et d'includes
550echo " "
551echo ">>>>>> 7/ Creating object list files for shared library creation "
552set objlistname = $sconf/libsophya.objlist
553echo " 7.a/ Creating $objlistname "
554rm -f $objlistname ; touch $objlistname
555foreach d ( $SOPMOD )
556 rm -f $sconf/$d.conf
557 if ( ! -d ../$d ) continue
558 cat ../$d/objlist.list >> $objlistname
559 touch $sconf/$d.conf
560end
561
562set objlistname = $sconf/libextsophya.objlist
563echo " 7.b/ Creating $objlistname "
564rm -f $objlistname ; touch $objlistname
565set i = 0
566while ( $i < $#SOPEXT )
567 @ i += 1
568 set d = $SOPEXT[$i]
569 rm -f $sconf/$d.conf
570 if( $SOPEXTOK[$i] <= 0 ) continue
571 if ( ! -d ../$d ) continue
572 cat ../$d/objlist.list >> $objlistname
573 touch $sconf/$d.conf
574end
575
576set objlistname = $sconf/libPI.objlist
577echo " 7.c/ Creating $objlistname "
578rm -f $objlistname ; touch $objlistname
579set i = 0
580while ( $i < $#SOPPI )
581 @ i += 1
582 set d = $SOPPI[$i]
583 rm -f $sconf/$d.conf
584 if( $SOPPIOK[$i] <= 0 ) continue
585 if ( ! -d ../$d ) continue
586 cat ../$d/objlist.list >> $objlistname
587 touch $sconf/$d.conf
588end
589
590
591#----------------------------------------------------------------------
592exit 0
Note: See TracBrowser for help on using the repository browser.