Ing. Marcos Ortiz Valmaseda escribió: > Jaime Casanova escribió: > >2010/3/12 Ing. Marcos Ortiz Valmaseda <mlor...@uci.cu>: > >>Recuerdo Jaime, que cuando Álvaro y tú vinieron acá, él tenía en su laptop > >>esto configurado. Él ejecutaba pgsql84env si mal no recuerdo y en el mismo > >>prompt de comandos le salía una especie de environment usando esta versión > >>de PostgreSQL, y creo que lo hizo con Debian, porque es lo que tiene > >>instalado en su PC si mal no recuerdo. > >> > > > >ah! pero sino me equivoco eso ha de ser solo un script que cambia el > >directorio levanta la base apropiada y setea variables de ambiente... > > > >aunque si se veia bonito y es mejor que hacerlo manualmente ;) > > > Umm, ya entendí. > OK, tendré que preguntarle entonces a él cómo lo hizo, lancé la > pregunta aquí para si otro a lo mejor quiera hacer lo mismo > compartirlo con todos.
Este es mi script. Se llama "runpg" y hace muchas cosas, dependiendo del segundo parámetro (el primer parámetro lo describo más adelante). "config" invoca configure con los parámetros estándar (que yo defino dentro del mismo script, o bien los puedo sobreescribir con un archivo CONFIGURE_ARGS dentro del árbol del código fuente); "build" construye (make); "install" hace un make install; "init" hace un initdb en la ubicación estándar que yo defino; "server" echa a andar el postmaster; "client" abre un psql; "check" y "pcheck" son para ejecutar los tests de regresión, serial y paralelo respectivamente (requiere tener el server andando); tags actualiza el archivo de ctags y cscope; changelog genera el archivo ChangeLog para esa rama usando cvs2cl; rmderived borra los archivos derivados; update hace un cvs update; showdiff hace un cvs diff y lo pasa por un pager (obviamente puedes redirigirlo si quieres guardar el parche en un archivo); touchchanged hace un "touch" de todos los archivos modificados (esto sirve para forzar a que se recompilen); edit abre un "vi -g" en el directorio base del código fuente. Si uno hace "runpg commands" da una lista de órdenes que conoce (esto es útil para el "bash completion") El primer parámetro debe ser el nombre de un "cvs checkout" de una rama, y el nombre debe empezar con un número, el cual se suma a 55432 para obtener el nombre de puerto base que se pasa a --with-pgport. (Yo uso nombres como "84_rel" y así, de manera que cada nombre es fácil de recordar y quedan en puertos distintos, así que puedo tener los servers corriendo simultáneamente). Si uno le da el nombre de la rama pero ninguna otra opción, emite una serie de definiciones de variables de ambiente. Eso se puede agregar al ambiente existente. Por ej. yo uso `runpg 84_rel` y define PGDATA, PGPORT, y otras cosas útiles. El código se debe poner en un directorio con esta estructura: pgsql/ source/ 84_rel 83_rel etc build/ 84_rel etc install/ (Esto se ubica en /pgsql normalmente, pero uno puede definir la variable de ambiente PGROOT para cambiar esto. Yo tengo "export PGROOT=~/Code/pgsql" o algo por el estilo). Cuando uno hace "config" de una rama del source, se crea el directorio dentro de build y se ejecuta configure allí; los .o quedan en ese otro directorio (esto se conoce como una construcción VPATH). Además tengo un mecanismo rudimentario pero suficiente para hacer completación automática de órdenes en bash. Finalmente, tengo un pequeño script que define funciones para cambiar de un directorio a otro, por ej. si estás en source/84_rel/src/backend y ejecutas "cdbld" te deja parado en build/84_rel/src/backend. También existen cdinst y cdsrc. Además cdpg que te posiciona en pgsql/ (si es que no le pasas ningún parámetro) o bien puedes hacer cdpg 84_rel y te deja en pgsql/84_rel. Como también tiene completación automática, puedes darle cdpg 84<tab> y luego te va completando con los directorios que existen dentro (o sea cdpg 84<tab>s<tab>bac<tab> te completa a 84_rel/src/backend, etc etc) Hace unos años le pasé este script a Michael Glaesemann y él hizo unas cuantas modificaciones para sus propósitos, que yo nunca llegué a adoptar (por pereza, no porque no me gustaran). A Germán Poo también se lo pasé años después, y él hizo un repositorio Mercurial en alguna parte ... ahh, acá está: http://pgsql.calcifer.org/settings/ ... ah! si me hubiera acordado de verlo antes me habría ahorrado tener que escribir la explicación otra vez!! -- Alvaro Herrera http://www.amazon.com/gp/registry/3BP7BYG9PUGI8 "I think my standards have lowered enough that now I think 'good design' is when the page doesn't irritate the living f*ck out of me." (JWZ)
#!/bin/bash # Default "configure" args. They will be overridden with the contents of a # CONFIGURE_ARGS file in the source directory. CONFIGURE_ARGS="--enable-debug --enable-depend --enable-cassert --enable-nls --cache-file=/home/alvherre/tmp/pgconf...@tree@.cache --enable-thread-safety --with-python --with-perl --with-tcl --with-openssl --with-libxml" # The root directory, where everything lies. Defaults to $HOME/CVS/pgsql, # but can be changed by the PGROOT environment variable. ROOT=${PGROOT-/pgsql} # do we have a diff coloring utility? for prog in cdiff colordiff; do which $prog >/dev/null 2>/dev/null if [ $? == 0 ]; then # COLORDIFF=`which $prog` break fi done # If the first argument is "_commands", return the list of known commands if [ ! -z "$1" -a "$1" == '_commands' ]; then for i in config build install init server client check pcheck tags changelog rmderived update showdiff touchchanged edit; do echo $i done exit fi # If the argument is a file, its contents is the real target. Useful to have # a "default" build, pointing to whatever is the current development tree. if [ -f $ROOT/source/$1 ]; then DIR=`cat $ROOT/source/$1` else DIR=$1 fi SRCDIR=$ROOT/source/$DIR INSTDIR=$ROOT/install/$DIR BUILDDIR=$ROOT/build/$DIR PGDATADIR=$INSTDIR/data export LD_LIBRARY_PATH=$INSTDIR/lib if [ -z "$DIR" ]; then LIST=`cd "$SRCDIR" ; find . -maxdepth 1 -mindepth 1 -type d` echo "I need an argument -- one from:" for i in $LIST; do echo -n " "`basename $i` done | (fmt 2>&1 || true) echo "" exit fi PGPORT=$((55432+$(echo $BUILDDIR | sed -e 's/^[^0-9]*\([0-9]*\).*$/\1/' -e 's/^0*//' -e 's/^$/0/' ))) # Miscelaneous functions check_srcdir() { if [ ! -d $SRCDIR ]; then echo "The first argument must be a source directory" >&2 ls $ROOT/source >&2 exit fi } check_blddir() { if [ ! -d $BUILDDIR ]; then echo "The first argument must be a VPATH build directory" >&2 ls $ROOT/build >&2 exit fi } check_backend() { backend=$BUILDDIR/src/backend/postgres if [ ! -f $backend ]; then echo "The backend must exist at $backend" >&2 exit fi } check_instdir() { if [ ! -x $INSTDIR/bin/postmaster ]; then echo "$DIR debe ser un directorio de instalación" >&2 exit fi } runpg_config() { check_srcdir if [ -d $BUILDDIR ]; then echo -n "Desea eliminar $BUILDDIR (y/n)? " unset removed read answer if [ ! -z "$answer" ]; then if [ "$answer" = 's' -o "$answer" = 'y' ]; then rm -fr $BUILDDIR removed=t fi fi if [ -z "$removed" ]; then exit fi fi mkdir $BUILDDIR if [ -f $SRCDIR/CONFIGURE_ARGS ]; then CONFIGURE_ARGS=`cat $SRCDIR/CONFIGURE_ARGS` fi CONFIGURE_ARGS=${CONFIGURE_ARGS//@TREE@/$DIR} cd $BUILDDIR echo $SRCDIR/configure $CONFIGURE_ARGS --prefix=$INSTDIR --with-pgport=$PGPORT $SRCDIR/configure $CONFIGURE_ARGS --prefix=$INSTDIR --with-pgport=$PGPORT make -C src -s distprep cd "$OLDPWD" } runpg_build() { check_srcdir check_blddir cd $BUILDDIR LC_ALL=C make -j3 2>&1 >> $BUILDDIR/build.out | tee -a $BUILDDIR/build.err LC_ALL=C make -j3 -C contrib 2>&1 >> $BUILDDIR/build.out | tee -a $BUILDDIR/build.err cd "$OLDPWD" } runpg_install() { check_backend cd $BUILDDIR LC_ALL=C make -j3 install 2>&1 >> $BUILDDIR/build.out | tee -a $BUILDDIR/build.err LC_ALL=C make -j3 -C contrib install 2>&1 >> $BUILDDIR/build.out | tee -a $BUILDDIR/build.err cd "$OLDPWD" } # Select the action based on the parameters case "$2" in config) runpg_config exit $? ;; build) runpg_build exit $? ;; install) runpg_install exit $? ;; init) check_instdir rm -fr $PGDATADIR $INSTDIR/bin/initdb -D $PGDATADIR exit $? ;; server) check_instdir if [ ! -z $DISPLAY ]; then echo -ne "\033]0;$1 server\007" fi ulimit -c unlimited PGDATA=$PGDATADIR exec $INSTDIR/bin/postmaster exit ;; client) check_instdir export PATH=$INSTDIR/bin:$PATH export PGDATA=$PGDATADIR if [ ! -f $PGDATA/db_created ]; then createdb && createlang plpgsql && createlang plperl && createlang pltcl && createlang plpythonu && touch $PGDATA/db_created fi PGCMD=psql if [ ! -z "$DISPLAY" ]; then echo -ne "\033]0;$1 client\007" fi psql exit ;; check) check_instdir make -C $BUILDDIR/src/test/regress installcheck ;; contribcheck) check_instdir make -s -C $BUILDDIR/contrib installcheck ;; pcheck) check_instdir cd $BUILDDIR/src/test/regress make -C $BUILDDIR/src/test/regress installcheck-parallel ;; tags) check_srcdir cd "$SRCDIR" echo "getting file list for cscope ..." find $SRCDIR $BUILDDIR \( -name "*.[chly]" -o -iname "*makefile*" -o -name "*.mk" -o -name "*.in" -o -name "*.sgml" -o -name "*.sh" -o -name "*.sql" \) -type f > $SRCDIR/cscope.files echo "building cscope database ..." cscope -b echo "building tags file ..." ctags -R echo "done" ;; changelog) check_srcdir cd "$SRCDIR" if [ ! -d CVS ]; then echo "operation is valid only on CVS trees" 1>&2 exit -1 fi common_args="--revisions --no-indent --no-wrap --separate-header" branch_arg="" branch=$(cvs status configure.in | grep 'Sticky Tag' | awk '{print $3}') if [ $branch != "(none)" ]; then branch_arg="--follow $branch" fi if [ ! -f ChangeLog ]; then cvs2cl $common_args $branch_arg else cvs2cl $common_args $branch_arg --accum fi ;; rmderived) check_srcdir cd "$SRCDIR" find . -name .cvsignore | while read line do dir=$(dirname $line) cd $dir rm -fv `cat .cvsignore` cd "$OLDPWD" done ;; update) check_srcdir cd "$SRCDIR" if [ -d CVS ]; then cvs update -Pd elif [ -d .svn ]; then svn update elif [ -d .git ]; then echo "not supported for git trees" >&2 exit -1 fi ;; showdiff) check_srcdir cd "$SRCDIR" if [ ! -z "$COLORDIFF" ]; then pipe="$COLORDIFF" else pipe=cat fi if [ -d CVS ]; then cvs -q diff | $pipe | less -r elif [ -d .svn ]; then svn diff | $pipe | less -r elif [ -d .git ]; then git diff fi ;; touchchanged) check_srcdir cd "$SRCDIR" if [ -d CVS ]; then cvs -q diff | grep ^Index | cut -d" " -f2 | xargs touch elif [ -d .svn ]; then svn diff | grep ^Index | cut -d" " -f2 | xargs touch fi ;; edit) check_srcdir cd "$SRCDIR" vi -g & ;; *) check_instdir echo "export PATH=$INSTDIR/bin:$PATH" echo "export MANPATH=$INSTDIR/share/man" echo "export PGDATA=`echo $PGDATADIR`" echo "export PGPORT=$PGPORT" echo "export PGLIBS=$INSTDIR/lib" echo "export PGINCLUDE=$INSTDIR/include" ;; esac
cdpg() { cd /pgsql/source/$1 } cdsrc() { if ! echo $PWD | grep /pgsql/ >/dev/null 2>&1; then echo $PWD no es correcto para esto return fi NEWDIR=`echo $PWD | sed -e 's,^\(.*/pgsql/\)/,\1,' -e 's,build,source,' -e 's,install,source,'` cd $NEWDIR } cdbld() { if ! echo $PWD | grep /pgsql/ >/dev/null 2>&1; then echo $PWD no es correcto para esto return fi NEWDIR=`echo $PWD | sed -e 's,^\(.*/pgsql/\)/,\1,' -e 's,source,build,' -e 's,install,build,'` cd $NEWDIR } cdinst() { if ! echo $PWD | grep /pgsql/ >/dev/null 2>&1; then echo $PWD no es correcto para esto return fi NEWDIR=`echo $PWD | sed -e 's,^\(.*/pgsql/\)/,\1,' -e 's,source,install,' -e 's,build,install,'` cd $NEWDIR }
_runpg() { local cur prev; COMPREPLY=() cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]} if [ $COMP_CWORD -eq 1 ]; then pushd ${PGROOT-/pgsql/}/source > /dev/null 2>&1 _filedir popd > /dev/null 2>&1 return 0; fi if [ $COMP_CWORD -eq 2 ]; then COMPREPLY=( $(compgen -W '$(runpg _commands)' -- $cur )); return 0; fi _filedir } _cdpg() { local cur; COMPREPLY=() cur=${COMP_WORDS[COMP_CWORD]} pushd ${PGROOT-/pgsql/}/source > /dev/null 2>&1 _filedir -d popd > /dev/null 2>&1 } _postgres() { local cur; COMPREPLY=() cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]} if [ "$prev" == "-c" ]; then COMPREPLY=($(compgen -S= -onospace -W '`LC_ALL=C command postgres --describe-config | cut -d" " -f1`' -- $cur)); return 0 fi COMPREPLY=($(compgen -W '-A -B -c -d -D -e -E -F -N -o -P -s -S -f -i -O -t -W --describe-config --help --version' -- $cur)) return 0 } complete -F _runpg runpg complete -S/ -onospace -F _cdpg cdpg complete -F _postgres postgres postmaster
-- TIP 1: para suscribirte y desuscribirte, visita http://archives.postgresql.org/pgsql-es-ayuda