radare2/configure-plugins

252 lines
5.5 KiB
Bash
Executable File

#!/bin/sh
#
# Script to configure "staticability" of plugins
# author: pancake // nopcode
# update: 2010-01-14
#
LANG=C
LC_ALL=C
LOADLIBS=1
export LANG
export LC_ALL
list () {
for a in $STATIC ; do echo "static $a" ; done
for a in $SHARED ; do echo "shared $a" ; done
exit 0
}
help () {
echo "Usage: ./configure-plugins [options]"
echo " -n do nothing.. do not generate any file"
echo " --list list all static and shared plugins"
echo " --rm-static [dir] remove plugins that are already in core from dir"
echo " --static [name ..] define named plugin as static"
echo " --shared [name ..] define named plugin as shared"
echo " --help, -h display this helpful message"
echo "NOTE: static plugins are compiled inside the owner library"
exit 0
}
cfg=./plugins.cfg
if [ ! -f "$cfg" ]; then
cp -f ./plugins.def.cfg plugins.cfg
fi
load () {
if [ -e $cfg ]; then
echo "configure-plugins: Loading $cfg .."
. $cfg
else
echo "configure-plugins: Loading $1 .."
. "$1" #plugins.def.cfg
fi
}
save () {
cp $cfg plugins.cfg
# echo "STATIC=\"$STATIC\"" > $cfg
# echo "SHARED=\"$SHARED\"" >>$cfg
}
generate_configh () {
plugins=""
oldlib=""
for a in ${STATIC} ; do
lib=$(echo $a | cut -d . -f 1) # library
plg=$(echo $a | cut -d . -f 2) # plugin name
if [ ! "$oldlib" = "$lib" ]; then
[ -n "$oldlib" ] && echo " 0"
oldlib=$lib
if type perl > /dev/null 2>&1 ; then
uclib=$(echo $lib | perl -pe 'tr/[a-z]/[A-Z]/')
else
uclib=$(echo $lib | tr '[a-z]' '[A-Z]')
fi
echo
echo "#define R_${uclib}_STATIC_PLUGINS \\"
plugins="${plugins} __${uclib}"
fi
echo " &r_${lib}_plugin_${plg}, \\"
done
[ -n "$oldlib" ] && echo " 0"
# FILL EMPTY PLUGIN ARRAYS WITH LOVE
for a in ${SHARED} ; do
lib=$(echo $a | cut -d . -f 1) # library
plg=$(echo $a | cut -d . -f 2) # plugin name
if [ ! "$oldlib" = "$lib" ]; then
oldlib=$lib
if type perl > /dev/null 2>&1; then
uclib=$(echo $lib | perl -pe 'tr/[a-z]/[A-Z]/')
else
uclib=$(echo $lib | tr '[a-z]' '[A-Z]')
fi
if [ -z "`echo ${plugins} | grep __${uclib}`" ]; then
plugins="${plugins} __${uclib}"
echo
echo "#define R_${uclib}_STATIC_PLUGINS 0"
fi
fi
done
}
generate_configmk () {
plugins=""
oldlib=""
for a in ${STATIC} ; do
lib=$(echo $a | cut -d . -f 1) # library
plg=$(echo $a | cut -d . -f 2) # plugin name
if [ ! "$oldlib" = "$lib" ]; then
[ -n "$oldlib" ] && printf "\n"
oldlib=$lib
if type perl > /dev/null 2>&1 ; then
uclib=$(echo $lib | perl -pe 'tr/[a-z]/[A-Z]/')
else
uclib=$(echo $lib | tr '[a-z]' '[A-Z]')
fi
printf "STATIC_${uclib}_PLUGINS= "
plugins="${plugins} __${uclib}"
fi
printf "p/${plg}.mk "
done
echo
# fill the holes with love
for a in ${SHARED} ; do
lib=$(echo $a | cut -d . -f 1) # library
if type perl > /dev/null 2>&1 ; then
uclib=$(echo $lib | perl -pe 'tr/[a-z]/[A-Z]/')
else
uclib=$(echo $lib | tr '[a-z]' '[A-Z]')
fi
if [ -z "`echo ${plugins} | grep __${uclib}`" ]; then
plugins="${plugins} __${uclib}"
echo "STATIC_${uclib}_PLUGINS="
fi
done
}
generate () {
echo "configure-plugins: Generating libr/config.h .."
cat libr/config.h.head > libr/config.h
echo "#define R2_LOADLIBS ${LOADLIBS}" >> libr/config.h
generate_configh >> libr/config.h
cat libr/config.h.tail >> libr/config.h
echo "configure-plugins: Generating libr/config.mk .."
cat libr/config.mk.head > libr/config.mk
generate_configmk >> libr/config.mk
cat libr/config.mk.tail >> libr/config.mk
return
}
add () {
for a in $1 ; do [ $a = $2 ] && return ; done ; echo $1 $2
}
sub () {
n="" ; for a in $1 ; do [ $a = $2 ] && continue ; n="$n $a" ; done ; echo $n
}
echo | sort -t. > /dev/null 2>&1
if [ $? = 0 ]; then
SORT="sort -t."
else
SORT="sort"
fi
dosort () {
( for a in $1 ; do echo $a ; done ) | tr _ Z | ${SORT} | tr Z _
#( for a in $1 ; do echo $a ; done ) | sort -t. --key=1,1d
}
sort_vars () {
STATIC=$(dosort "$STATIC")
SHARED=$(dosort "$SHARED")
}
make_static () {
STATIC=$(add "$STATIC" $1)
SHARED=$(sub "$SHARED" $1)
}
make_shared () {
SHARED=$(add "$SHARED" $1)
STATIC=$(sub "$STATIC" $1)
}
make_ () { : ; }
MODE=""
DONOTHING=0
DEFCFG=./plugins.def.cfg
rmstatic() {
C=0
if [ -z "$1" ]; then
echo "Missing argument"
exit 1
fi
for a in ${STATIC} ; do
b="`echo $a | tr . _`"
for ext in dll dylib so ; do
f="$b.$ext"
if [ -f "$f" ]; then
C=$(($C+1))
printf " $C found\r"
#echo "rm -f $f"
rm -f "$f"
fi
done
done
echo "Removed $C shared plugins that are already static"
}
RMSTATIC=-
while : ; do
[ -z "$1" ] && break
case "$1" in
"--static") MODE=static ; ;;
"--shared") MODE=shared ; ;;
"--without-gpl") DEFCFG=./plugins.nogpl.cfg ;;
"--disable-loadlibs") LOADLIBS=0 ;;
"--rm-static") RMSTATIC="$2" ; ;;
"--list") sort_vars ; list ; ;;
"-n") DONOTHING=1 ; ;;
"-h"|"--help") help ; ;;
*) eval make_$MODE $1 ; ;;
esac
shift
done
load ${DEFCFG}
sort_vars
if [ - != "${RMSTATIC}" ]; then
if [ -z "${RMSTATIC}" ]; then
echo "Missing argument" >&2
exit
fi
if [ -d "${RMSTATIC}" ]; then
cd "${RMSTATIC}" && rmstatic "${RMSTATIC}"
fi
exit 0
fi
[ ${DONOTHING} = 0 ] && generate
echo SHARED: ${SHARED}
echo STATIC: ${STATIC}
save
exit 0