source: configure @ feb1bad

Last change on this file since feb1bad was feb1bad, checked in by Wilmer van der Gaast <wilmer@…>, at 2010-08-28T12:24:37Z

Pull in Makefile dependencies fix from mainline.

  • Property mode set to 100755
File size: 16.4 KB
Line 
1#!/bin/sh
2
3##############################
4##  Configurer for BitlBee  ##
5##                          ##
6##  Copyright 2004 Lintux   ##
7##  Copyright 2002 Lucumo   ##
8##############################
9
10prefix='/usr/local/'
11bindir='$prefix/sbin/'
12etcdir='$prefix/etc/bitlbee/'
13mandir='$prefix/share/man/'
14datadir='$prefix/share/bitlbee/'
15config='/var/lib/bitlbee/'
16plugindir='$prefix/lib/bitlbee/'
17includedir='$prefix/include/bitlbee/'
18libevent='/usr/'
19pidfile='/var/run/bitlbee.pid'
20ipcsocket='/var/run/bitlbee.sock'
21pcdir='$prefix/lib/pkgconfig'
22systemlibdirs="/lib /lib64 /usr/lib /usr/lib64 /usr/local/lib /usr/local/lib64"
23
24msn=1
25jabber=1
26oscar=1
27yahoo=1
28twitter=1
29twitter=1
30purple=0
31
32debug=0
33strip=1
34gcov=0
35plugins=1
36
37events=glib
38ldap=0
39ssl=auto
40
41arch=`uname -s`
42cpu=`uname -m`
43
44GLIB_MIN_VERSION=2.4
45
46echo BitlBee configure
47
48while [ -n "$1" ]; do
49        e="`expr "X$1" : 'X--\(.*=.*\)'`"
50        if [ -z "$e" ]; then
51                cat<<EOF
52
53Usage: $0 [OPTIONS]
54
55Option          Description                             Default
56
57--prefix=...    Directories to put files in             $prefix
58--bindir=...                                            $bindir
59--etcdir=...                                            $etcdir
60--mandir=...                                            $mandir
61--datadir=...                                           $datadir
62--plugindir=...                                         $plugindir
63--pidfile=...                                           $pidfile
64--config=...                                            $config
65--ipcsocket=...                                         $ipcsocket
66
67--msn=0/1       Disable/enable MSN part                 $msn
68--jabber=0/1    Disable/enable Jabber part              $jabber
69--oscar=0/1     Disable/enable Oscar part (ICQ, AIM)    $oscar
70--yahoo=0/1     Disable/enable Yahoo part               $yahoo
71--twitter=0/1   Disable/enable Twitter part             $twitter
72
73--purple=0/1    Disable/enable libpurple support        $purple
74
75--debug=0/1     Disable/enable debugging                $debug
76--strip=0/1     Disable/enable binary stripping         $strip
77--gcov=0/1      Disable/enable test coverage reporting  $gcov
78--plugins=0/1   Disable/enable plugins support          $plugins
79
80--events=...    Event handler (glib, libevent)          $events
81--ssl=...       SSL library to use (gnutls, nss, openssl, bogus, auto)
82                                                        $ssl
83
84--target=...    Cross compilation target                same as host
85EOF
86                exit;
87        fi
88        eval "$e"
89        shift;
90done
91
92# Expand $prefix and get rid of double slashes
93bindir=`eval echo "$bindir/" | sed 's/\/\{1,\}/\//g'`
94etcdir=`eval echo "$etcdir/" | sed 's/\/\{1,\}/\//g'`
95mandir=`eval echo "$mandir/" | sed 's/\/\{1,\}/\//g'`
96datadir=`eval echo "$datadir/" | sed 's/\/\{1,\}/\//g'`
97config=`eval echo "$config/" | sed 's/\/\{1,\}/\//g'`
98plugindir=`eval echo "$plugindir/" | sed 's/\/\{1,\}/\//g'`
99includedir=`eval echo "$includedir"/ | sed 's/\/\{1,\}/\//g'`
100libevent=`eval echo "$libevent"/ | sed 's/\/\{1,\}/\//g'`
101
102pidfile=`eval echo "$pidfile" | sed 's/\/\{1,\}/\//g'`
103ipcsocket=`eval echo "$ipcsocket" | sed 's/\/\{1,\}/\//g'`
104pcdir=`eval echo "$pcdir" | sed 's/\/\{1,\}/\//g'`
105
106cat<<EOF>Makefile.settings
107## BitlBee settings, generated by configure
108PREFIX=$prefix
109BINDIR=$bindir
110ETCDIR=$etcdir
111MANDIR=$mandir
112DATADIR=$datadir
113PLUGINDIR=$plugindir
114CONFIG=$config
115INCLUDEDIR=$includedir
116PCDIR=$pcdir
117
118TARGET=$target
119ARCH=$arch
120CPU=$cpu
121
122DESTDIR=
123LFLAGS=
124EFLAGS=
125EOF
126
127srcdir="$(dirname $0)"
128if [ "$srcdir" != "." ]; then
129        echo
130        echo "configure script run from a different directory. Will create some symlinks..."
131        if [ ! -e Makefile -o -L Makefile ]; then
132                COPYDIRS="doc lib protocols tests utils"
133                mkdir -p $(cd "$srcdir"; find $COPYDIRS -type d)
134                find . -name Makefile -type l -print0 | xargs -0 rm 2> /dev/null
135                dst="$PWD"
136                cd "$srcdir"
137                for i in $(find . -name Makefile -type f); do
138                        ln -s "$PWD${i#.}" "$dst/$i";
139                done
140                cd "$dst"
141                rm -rf .bzr
142        fi
143       
144        echo "SRCDIR=$srcdir/" >> Makefile.settings
145        CFLAGS="$CFLAGS -I${dst}"
146else
147        srcdir=$PWD
148fi
149
150cat<<EOF>config.h
151/* BitlBee settings, generated by configure
152   
153   Do *NOT* use any of these defines in your code without thinking twice, most
154   of them can/will be overridden at run-time */
155
156#define CONFIG "$config"
157#define ETCDIR "$etcdir"
158#define VARDIR "$datadir"
159#define PLUGINDIR "$plugindir"
160#define PIDFILE "$pidfile"
161#define IPCSOCKET "$ipcsocket"
162#define ARCH "$arch"
163#define CPU "$cpu"
164EOF
165
166
167
168if [ -n "$target" ]; then
169        PKG_CONFIG_LIBDIR=/usr/$target/lib/pkgconfig
170        export PKG_CONFIG_LIBDIR
171        PATH=/usr/$target/bin:$PATH
172        CC=$target-cc
173        LD=$target-ld
174        systemlibdirs="/usr/$target/lib"
175fi
176
177
178if [ "$debug" = "1" ]; then
179        [ -z "$CFLAGS" ] && CFLAGS=-g
180        echo 'DEBUG=1' >> Makefile.settings
181        CFLAGS="$CFLAGS -DDEBUG"
182else
183        [ -z "$CFLAGS" ] && CFLAGS="-O2 -fno-strict-aliasing"
184fi
185
186echo CFLAGS=$CFLAGS $CPPFLAGS >> Makefile.settings
187echo CFLAGS+=-I${srcdir} -I${srcdir}/lib -I${srcdir}/protocols -I. >> Makefile.settings
188
189echo CFLAGS+=-DHAVE_CONFIG_H >> Makefile.settings
190
191if [ -n "$CC" ]; then
192        CC=$CC
193elif type gcc > /dev/null 2> /dev/null; then
194        CC=gcc
195elif type cc > /dev/null 2> /dev/null; then
196        CC=cc
197else
198        echo 'Cannot find a C compiler, aborting.'
199        exit 1;
200fi
201
202echo "CC=$CC" >> Makefile.settings;
203if echo $CC | grep -qw gcc; then
204        # Apparently -Wall is gcc-specific?
205        echo CFLAGS+=-Wall >> Makefile.settings
206fi
207
208if [ -z "$LD" ]; then
209        if type ld > /dev/null 2> /dev/null; then
210                LD=ld
211        else
212                echo 'Cannot find ld, aborting.'
213                exit 1;
214        fi
215fi
216
217echo "LD=$LD" >> Makefile.settings
218
219if [ -z "$PKG_CONFIG" ]; then
220        PKG_CONFIG=pkg-config
221fi
222
223if $PKG_CONFIG --version > /dev/null 2>/dev/null && $PKG_CONFIG glib-2.0; then
224        if $PKG_CONFIG glib-2.0 --atleast-version=$GLIB_MIN_VERSION; then
225                cat<<EOF>>Makefile.settings
226EFLAGS+=`$PKG_CONFIG --libs glib-2.0 gmodule-2.0`
227CFLAGS+=`$PKG_CONFIG --cflags glib-2.0 gmodule-2.0`
228EOF
229        else
230                echo
231                echo 'Found glib2 '`$PKG_CONFIG glib-2.0 --modversion`', but version '$GLIB_MIN_VERSION' or newer is required.'
232                exit 1
233        fi
234else
235        echo
236        echo 'Cannot find glib2 development libraries, aborting. (Install libglib2-dev?)'
237        exit 1
238fi
239
240if [ "$events" = "libevent" ]; then
241        if ! [ -f "${libevent}include/event.h" ]; then
242                echo
243                echo 'Warning: Could not find event.h, you might have to install it and/or specify'
244                echo 'its location using the --libevent= argument. (Example: If event.h is in'
245                echo '/usr/local/include and binaries are in /usr/local/lib: --libevent=/usr/local)'
246        fi
247       
248        echo '#define EVENTS_LIBEVENT' >> config.h
249        cat <<EOF>>Makefile.settings
250EFLAGS+=-levent -L${libevent}lib
251CFLAGS+=-I${libevent}include
252EOF
253elif [ "$events" = "glib" ]; then
254        ## We already use glib anyway, so this is all we need (and in fact not even this, but just to be sure...):
255        echo '#define EVENTS_GLIB' >> config.h
256else
257        echo
258        echo 'ERROR: Unknown event handler specified.'
259        exit 1
260fi
261echo 'EVENT_HANDLER=events_'$events'.o' >> Makefile.settings
262
263detect_gnutls()
264{
265        if $PKG_CONFIG --exists gnutls; then
266                cat <<EOF>>Makefile.settings
267EFLAGS+=`$PKG_CONFIG --libs gnutls`
268CFLAGS+=`$PKG_CONFIG --cflags gnutls`
269EOF
270                ssl=gnutls
271                ret=1
272        elif libgnutls-config --version > /dev/null 2> /dev/null; then
273                cat <<EOF>>Makefile.settings
274EFLAGS+=`libgnutls-config --libs`
275CFLAGS+=`libgnutls-config --cflags`
276EOF
277               
278                ssl=gnutls
279                ret=1;
280        else
281                ret=0;
282        fi;
283}
284
285detect_nss()
286{
287        if $PKG_CONFIG --version > /dev/null 2>/dev/null && $PKG_CONFIG mozilla-nss; then
288                cat<<EOF>>Makefile.settings
289EFLAGS+=`$PKG_CONFIG --libs mozilla-nss`
290CFLAGS+=`$PKG_CONFIG --cflags mozilla-nss`
291EOF
292               
293                ssl=nss
294                ret=1;
295        else
296                ret=0;
297        fi;
298}
299
300detect_ldap()
301{
302        TMPFILE=$(mktemp /tmp/bitlbee-configure.XXXXXX)
303        if $CC -o $TMPFILE -shared -lldap 2>/dev/null >/dev/null; then
304                cat<<EOF>>Makefile.settings
305EFLAGS+=-lldap
306CFLAGS+=
307EOF
308                ldap=1
309                rm -f $TMPFILE
310                ret=1
311        else
312                ldap=0
313                ret=0
314        fi
315}
316
317RESOLV_TESTCODE='
318#include <arpa/nameser.h>
319#include <resolv.h>
320
321int main()
322{
323        ns_initparse( NULL, 0, NULL );
324        ns_parserr( NULL, ns_s_an, 0, NULL );
325}
326'
327
328detect_resolv_dynamic()
329{
330        TMPFILE=$(mktemp /tmp/bitlbee-configure.XXXXXX)
331        ret=1
332        echo "$RESOLV_TESTCODE" | $CC -o $TMPFILE -x c - -lresolv >/dev/null 2>/dev/null
333        if [ "$?" = "0" ]; then
334                echo 'EFLAGS+=-lresolv' >> Makefile.settings
335                ret=0
336        fi
337
338        rm -f $TMPFILE
339        return $ret
340}
341
342detect_resolv_static()
343{
344        TMPFILE=$(mktemp /tmp/bitlbee-configure.XXXXXX)
345        ret=1
346        for i in $systemlibdirs; do
347                if [ -f $i/libresolv.a ]; then
348                        echo "$RESOLV_TESTCODE" | $CC -o $TMPFILE -x c - -Wl,$i/libresolv.a >/dev/null 2>/dev/null
349                        if [ "$?" = "0" ]; then
350                                echo 'EFLAGS+='$i'/libresolv.a' >> Makefile.settings
351                                ret=0
352                        fi
353                fi
354        done
355
356        rm -f $TMPFILE
357        return $ret
358}
359
360if [ "$ssl" = "auto" ]; then
361        detect_gnutls
362        if [ "$ret" = "0" ]; then
363                detect_nss
364        fi
365elif [ "$ssl" = "gnutls" ]; then
366        detect_gnutls
367elif [ "$ssl" = "nss" ]; then
368        detect_nss
369elif [ "$ssl" = "sspi" ]; then
370        echo
371elif [ "$ssl" = "openssl" ]; then
372        echo
373        echo 'No detection code exists for OpenSSL. Make sure that you have a complete'
374        echo 'install of OpenSSL (including devel/header files) before reporting'
375        echo 'compilation problems.'
376        echo
377        echo 'Also, keep in mind that the OpenSSL is, according to some people, not'
378        echo 'completely GPL-compatible. Using GnuTLS or NSS is recommended and better'
379        echo 'supported by us. However, on many BSD machines, OpenSSL can be considered'
380        echo 'part of the operating system, which makes it GPL-compatible.'
381        echo
382        echo 'For more info, see: http://www.openssl.org/support/faq.html#LEGAL2'
383        echo '                    http://www.gnome.org/~markmc/openssl-and-the-gpl.html'
384        echo
385        echo 'Please note that distributing a BitlBee binary which links to OpenSSL is'
386        echo 'probably illegal. If you want to create and distribute a binary BitlBee'
387        echo 'package, you really should use GnuTLS or NSS instead.'
388        echo
389        echo 'Also, the OpenSSL license requires us to say this:'
390        echo ' *    "This product includes software developed by the OpenSSL Project'
391        echo ' *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"'
392       
393        echo 'EFLAGS+=-lssl -lcrypto' >> Makefile.settings
394       
395        ret=1
396elif [ "$ssl" = "bogus" ]; then
397        echo
398        echo 'Using bogus SSL code. This means some features will not work properly.'
399       
400        ## Yes, you, at the console! How can you authenticate if you don't have any SSL!?
401        if [ "$msn" = "1" -o "$yahoo" = "1" ]; then
402                echo
403                echo 'WARNING: The MSN and Yahoo! modules will not work without SSL. Disabling.'
404                msn=0
405                yahoo=0
406        fi
407       
408        ret=1
409else
410        echo
411        echo 'ERROR: Unknown SSL library specified.'
412        exit 1
413fi
414
415if [ "$ret" = "0" ]; then
416        echo
417        echo 'ERROR: Could not find a suitable SSL library (GnuTLS, libnss or OpenSSL).'
418        echo '       Please note that this script doesn'\''t have detection code for OpenSSL,'
419        echo '       so if you want to use that, you have to select it by hand. If you don'\''t'
420        echo '       need SSL support, you can select the "bogus" SSL library. (--ssl=bogus)'
421       
422        exit 1
423fi;
424
425if [ "$msn" = "1" -a "$ssl" != "openssl" ]; then
426        # Needed for MSN only. OpenSSL exports nice cipher functions already,
427        # others don't, so use our own 3des code.
428        echo 'DES=des.o' >> Makefile.settings
429fi
430
431echo 'SSL_CLIENT=ssl_'$ssl'.o' >> Makefile.settings
432
433if detect_resolv_dynamic || detect_resolv_static; then
434        echo '#define HAVE_RESOLV_A' >> config.h
435fi
436
437STORAGES="xml"
438
439if [ "$ldap" = "auto" ]; then
440        detect_ldap
441fi
442
443if [ "$ldap" = 0 ]; then
444        echo "#undef WITH_LDAP" >> config.h
445elif [ "$ldap" = 1 ]; then
446        echo
447        echo 'LDAP support is a work in progress and does NOT work AT ALL right now.'
448        echo
449        exit 1
450       
451        echo "#define WITH_LDAP 1" >> config.h
452        STORAGES="$STORAGES ldap"
453fi
454
455for i in $STORAGES; do
456        STORAGE_OBJS="$STORAGE_OBJS storage_$i.o"
457done
458echo "STORAGE_OBJS="$STORAGE_OBJS >> Makefile.settings
459
460if [ "$strip" = 0 ]; then
461        echo "STRIP=\# skip strip" >> Makefile.settings;
462else
463        if [ "$debug" = 1 ]; then
464                echo
465                echo 'Stripping binaries does not make sense when debugging. Stripping disabled.'
466                echo 'STRIP=\# skip strip' >> Makefile.settings
467                strip=0;
468        elif [ -n "$STRIP" ]; then
469                echo "STRIP=$STRIP" >> Makefile.settings;
470        elif type strip > /dev/null 2> /dev/null; then
471                echo "STRIP=strip" >> Makefile.settings;
472        else
473                echo
474                echo 'No strip utility found, cannot remove unnecessary parts from executable.'
475                echo 'STRIP=\# skip strip' >> Makefile.settings
476                strip=0;
477        fi;
478fi
479
480if [ "$gcov" = "1" ]; then
481        echo "CFLAGS+=--coverage" >> Makefile.settings
482        echo "EFLAGS+=--coverage" >> Makefile.settings
483fi
484
485if [ "$plugins" = 0 ]; then
486        echo '#undef WITH_PLUGINS' >> config.h
487else
488        echo '#define WITH_PLUGINS' >> config.h
489fi
490
491if [ ! -e doc/user-guide/help.txt ] && ! type xmlto > /dev/null 2> /dev/null; then
492        echo
493        echo 'WARNING: Building from an unreleased source tree without prebuilt helpfile.'
494        echo 'Install xmlto if you want online help to work.'
495fi
496
497echo
498if [ -z "$BITLBEE_VERSION" -a -d .bzr ] && type bzr > /dev/null 2> /dev/null; then
499        nick=`bzr nick`
500        if [ -n "$nick" -a "$nick" != "bitlbee" ]; then
501                nick="-$nick"
502        else
503                nick=""
504        fi
505        rev=`bzr revno`
506        echo 'Using bzr revision #'$rev' as version number'
507        BITLBEE_VERSION=\"bzr$nick-$rev\"
508fi
509
510if [ -n "$BITLBEE_VERSION" ]; then
511        echo 'Spoofing version number: '$BITLBEE_VERSION
512        echo '#undef BITLBEE_VERSION' >> config.h
513        echo '#define BITLBEE_VERSION '$BITLBEE_VERSION >> config.h
514        echo
515fi
516
517if ! make helloworld > /dev/null 2>&1; then
518        echo "WARNING: Your version of make (BSD make?) does not support BitlBee's makefiles."
519        echo "BitlBee needs GNU make to build properly. On most systems GNU make is available"
520        echo "under the name 'gmake'."
521        echo
522        if gmake helloworld > /dev/null 2>&1; then
523                echo "gmake seems to be available on your machine, great."
524                echo
525        else
526                echo "gmake is not installed (or not working). Please try to install it."
527                echo
528        fi
529fi
530
531cat <<EOF>bitlbee.pc
532prefix=$prefix
533includedir=$includedir
534
535Name: bitlbee
536Description: IRC to IM gateway
537Requires: glib-2.0
538Version: $BITLBEE_VERSION
539Libs:
540Cflags: -I\${includedir}
541
542EOF
543
544protocols=''
545protoobjs=''
546
547if [ "$purple" = 0 ]; then
548        echo '#undef WITH_PURPLE' >> config.h
549else
550        if ! $PKG_CONFIG purple; then
551                echo
552                echo 'Cannot find libpurple development libraries, aborting. (Install libpurple-dev?)'
553                exit 1
554        fi
555        echo '#define WITH_PURPLE' >> config.h
556        cat<<EOF>>Makefile.settings
557EFLAGS += $($PKG_CONFIG purple --libs)
558PURPLE_CFLAGS += $($PKG_CONFIG purple --cflags)
559EOF
560        protocols=$protocols'purple '
561        protoobjs=$protoobjs'purple_mod.o '
562
563        # Having both libpurple and native IM modules in one binary may
564        # do strange things. Let's not do that.
565        msn=0
566        jabber=0
567        oscar=0
568        yahoo=0
569        twitter=0
570       
571        if [ "$events" = "libevent" ]; then
572                echo
573                echo 'Warning: Some libpurple modules (including msn-pecan) do their event handling'
574                echo 'outside libpurple, talking to GLib directly. At least for now the combination'
575                echo 'libpurple + libevent is *not* recommended!'
576        fi
577fi
578
579case "$CC" in
580*gcc* )
581        echo CFLAGS+=-MD -MF .depend/\$@.d >> Makefile.settings
582        for i in . lib protocols protocols/*/; do
583                mkdir -p $i/.depend
584        done
585esac
586
587if [ "$msn" = 0 ]; then
588        echo '#undef WITH_MSN' >> config.h
589else
590        echo '#define WITH_MSN' >> config.h
591        protocols=$protocols'msn '
592        protoobjs=$protoobjs'msn_mod.o '
593fi
594
595if [ "$jabber" = 0 ]; then
596        echo '#undef WITH_JABBER' >> config.h
597else
598        echo '#define WITH_JABBER' >> config.h
599        protocols=$protocols'jabber '
600        protoobjs=$protoobjs'jabber_mod.o '
601fi
602
603if [ "$oscar" = 0 ]; then
604        echo '#undef WITH_OSCAR' >> config.h
605else
606        echo '#define WITH_OSCAR' >> config.h
607        protocols=$protocols'oscar '
608        protoobjs=$protoobjs'oscar_mod.o '
609fi
610
611if [ "$yahoo" = 0 ]; then
612        echo '#undef WITH_YAHOO' >> config.h
613else
614        echo '#define WITH_YAHOO' >> config.h
615        protocols=$protocols'yahoo '
616        protoobjs=$protoobjs'yahoo_mod.o '
617fi
618
619if [ "$twitter" = 0 ]; then
620        echo '#undef WITH_TWITTER' >> config.h
621else
622        echo '#define WITH_TWITTER' >> config.h
623        protocols=$protocols'twitter '
624        protoobjs=$protoobjs'twitter_mod.o '
625fi
626
627if [ "$protocols" = "PROTOCOLS = " ]; then
628        echo "Warning: You haven't selected any communication protocol to compile!"
629        echo "         BitlBee will run, but you will be unable to connect to IM servers!"
630fi
631
632echo "PROTOCOLS = $protocols" >> Makefile.settings
633echo "PROTOOBJS = $protoobjs" >> Makefile.settings
634
635echo Architecture: $arch
636case "$arch" in
637Linux )
638;;
639GNU/* )
640;;
641*BSD )
642;;
643Darwin )
644        echo 'STRIP=\# skip strip' >> Makefile.settings
645;;
646IRIX )
647;;
648SunOS )
649        echo 'EFLAGS+=-lresolv -lnsl -lsocket' >> Makefile.settings
650        echo 'STRIP=\# skip strip' >> Makefile.settings
651;;
652AIX )
653        echo 'EFLAGS+=-Wl,-brtl' >> Makefile.settings
654;;
655CYGWIN* )
656        echo 'Cygwin is not officially supported.'
657;;
658Windows )
659;;
660* )
661        echo 'We haven'\''t tested BitlBee on many platforms yet, yours is untested. YMMV.'
662        echo 'Please report any problems at http://bugs.bitlbee.org/.'
663;;
664esac
665
666if [ -n "$target" ]; then
667        echo "Cross-compiling for: $target"
668fi
669
670echo
671echo 'Configuration done:'
672
673if [ "$debug" = "1" ]; then
674        echo '  Debugging enabled.'
675else
676        echo '  Debugging disabled.'
677fi
678
679if [ "$strip" = "1" ]; then
680        echo '  Binary stripping enabled.'
681else
682        echo '  Binary stripping disabled.'
683fi
684
685echo '  Using event handler: '$events
686echo '  Using SSL library: '$ssl
687echo '  Building with these storage backends: '$STORAGES
688
689if [ -n "$protocols" ]; then
690        echo '  Building with these protocols:' $protocols
691else
692        echo '  Building without IM-protocol support. We wish you a lot of fun...'
693fi
Note: See TracBrowser for help on using the repository browser.