tvheadend/support/configure.inc
Adam Sutton 2b695add0c config: started to add the concept of a configuration version
This is to allow simple detection of a need to migrate, so that it can be done
in one centralised location. Rather than having to have lots of in place dual
config handling.

Some simple stuff will probably continue to be done in place, to avoid
constantly adding migration routines for trivial stuff. But anyting non-trivial
will at least be more easily handled without the need for external scripts.
2014-04-04 09:55:08 +01:00

530 lines
11 KiB
Bash
Executable file

#!/bin/bash
#
# Generic/Simple configure script
#
# Copyright (c) 2012 Adam Sutton <dev@adamsutton.me.uk>
#
# ###########################################################################
# Defaults
# ###########################################################################
CONFIGURE_ARGS="$*"
# System setup
[ -z "$PLATFORM" ] && PLATFORM=linux
[ -z "$CPU" ] && CPU=generic
[ -z "$ARCH" ] && ARCH=`uname -m`
[ -z "$OSENV" ] && OSENV=posix
[ -z "$PYTHON" ] && PYTHON=python
# Paths
[ -z "$prefix" ] && prefix=/usr/local
[ -z "$bindir" ] && bindir=\${prefix}/bin
[ -z "$libdir" ] && libdir=\${prefix}/lib
[ -z "$datadir" ] && datadir=\${prefix}/share
[ -z "$mandir" ] && mandir=\${datadir}/man
# Compiler
[ -z "$CC" ] && CC=cc
[ -z "$CFLAGS" ] && CFLAGS=
[ -z "$LDFLAGS" ] && LDFLAGS=
# Environment
[ -z "$ROOTDIR" ] && ROOTDIR=$(cd "$(dirname "$0")"; pwd)
[ -z "$BUILDDIR" ] && BUILDDIR=$ROOTDIR/build.$PLATFORM
[ -z "$TMPDIR" ] && TMPDIR=/tmp
# Options/Package Lists
[ -z "$OPTIONS" ] && OPTIONS=()
[ -z "$PACKAGES" ] && PACKAGES=()
# ###########################################################################
# Utilities
# ###########################################################################
# Output
TAB=" %-50s"
# Text conversion
function toupper
{
echo "$@" | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
}
# Terminate
function die
{
echo >&2 "ERROR: $@"
exit 1
}
# ###########################################################################
# Enable/Disable
# ###########################################################################
# Enable/Disable option
function _enable
{
local opt=$1 val=$2 ignore=$3 row= k= v=
for row in ${OPTIONS[*]}; do
k=${row%:*}
[ "$k" == "$opt" ] || continue
v=${row#*:}
if [ $v != "$val" ]; then
OPTIONS=(${OPTIONS[@]//$row/$k:$val})
fi
return
done
[ -z "$ignore" ] && OPTIONS=(${OPTIONS[@]} $opt:$val)
}
# Enable option
function enable
{
_enable $1 yes $2
}
# Disable option
function disable
{
_enable $1 no $2
}
# Enable package
function enable_pkg
{
local opt=$1 row= k= v=
for row in ${PACKAGES[*]}; do
[ "$row" == "$opt" ] && return
done
PACKAGES=(${PACKAGES[@]} $opt)
}
# Get enabled state
function _enabled
{
local opt=$1 row= k=
for row in ${OPTIONS[*]}; do
k=${row%:*}
[ "$k" == "$opt" ] || continue
echo ${row#*:}
return
done
echo "no"
}
# Check if enabled
function enabled
{
local val=$(_enabled $1)
[ "$val" == "yes" ] && return 0 || return 1
}
# Check if disabled
function disabled
{
local val=$(_enabled $1)
[ "$val" == "no" ] && return 0 || return 1
}
# Check if enabled (or auto)
function enabled_or_auto
{
local val=$(_enabled $1)
[ "$val" == "yes" -o "$val" == "auto" ] && return 0 || return 1
}
# Check if disabled (or auto)
function disabled_or_auto
{
local val=$(_enabled $1)
[ "$val" == "no" -o "$val" == "auto" ] && return 0 || return 1
}
# ###########################################################################
# Command Line
# ###########################################################################
# Show help
function show_help
{
local opt= val= fmt="%-30s"
echo "Usage: $0 [options]"
echo ""
echo "Miscellaneous"
printf " $fmt Print this message\n" "--help"
echo ""
echo "Installation Paths"
printf " $fmt Installation root [$prefix]\n" "--prefix=DIR$"
printf " $fmt Install binaries in DIR [$bindir]\n" "--bindir=DIR"
printf " $fmt Install libraries in DIR [$libdir]\n" "--libdir=DIR"
printf " $fmt Install man pages in DIR [$mandir]\n" "--mandir=DIR"
printf " $fmt Install data files in DIR [$datadir]\n" "--datadir=DIR"
echo ""
echo "Compiler/Arch"
printf " $fmt Build using compiler [$CC]\n" "--cc=CC"
printf " $fmt Build using C flags\n" "--cflags=CFLAGS"
printf " $fmt Build and optimize for specific CPU\n" "--cpu=CPU"
printf " $fmt Build for architecture [$ARCH]\n" "--arch=ARCH"
printf " $fmt Build for platform [$PLATFORM]\n" "--platform=PLATFORM"
printf " $fmt Use python binary [$PYTHON]\n" "--python=PYTHON"
echo ""
echo "Options"
for opt in ${OPTIONS[*]}; do
val=${opt#*:}
opt=${opt%:*}
if [ "$val" == "yes" ]; then
printf " $fmt Disable ${opt}\n" "--disable-${opt}"
elif [ "$val" == "no" ]; then
printf " $fmt Enable ${opt}\n" "--enable-${opt}"
else
printf " $fmt Disable ${opt}\n" "--disable-${opt}"
printf " $fmt Enable ${opt}\n" "--enable-${opt}"
fi
done
exit 0
}
# Process command line
function parse_args
{
local opt= val=
for opt do
val=${opt#*=}
opt=${opt%=*}
opt=${opt#*--}
case "$opt" in
help)
show_help
;;
*dir|prefix)
eval "$opt=$val"
;;
cc|cflags|arch|cpu|platform|python)
eval "`toupper $opt`=$val"
;;
enable-*)
opt=${opt#*-}
enable $opt 1
;;
disable-*)
opt=${opt#*-}
disable $opt 1
;;
esac
done
}
# ###########################################################################
# Package tests
# ###########################################################################
# Check package
function check_pkg
{
local pkg=$1; shift
local ver=$*
# Version test
cver=$(echo $ver | sed 's/>=/ --atleast-version /'\
| sed 's/<=/ --max-version /'\
| sed 's/==/ --exact-version /')
printf "$TAB" "checking for pkg $pkg $ver ..."
# Check for package
if pkg-config $pkg $cver; then
echo "ok"
enable_pkg $pkg
else
echo "fail"
return 1
fi
}
# ###########################################################################
# Compiler Tests
# ###########################################################################
# Check compiler
function check_cc
{
local hdr=$1
local opt=$2
cat >$TMPDIR/$$.c <<EOF
$hdr
int main() {
#ifdef TEST
return TEST();
#else
return 0;
#endif
}
EOF
$CC $CFLAGS $LDFLAGS $TMPDIR/$$.c -o $TMPDIR/$$.bin $opt &> /dev/null
RET=$?
rm -f $TMPDIR/$$.{c,bin}
return $RET
}
# Check compiler header
function check_cc_header
{
local hdr=$1
local nam=$2
[ -z "$nam" ] && nam=$hdr
printf "$TAB" "checking for cc $hdr.h ..."
# Enable if supported
if check_cc "#include <$1.h>"; then
echo "ok"
enable $nam
else
echo "fail"
return 1
fi
}
# Check some compiler snippet
function check_cc_snippet
{
local nam=$1
local snp=$2
local opt=$3
printf "$TAB" "checking for cc $nam ..."
# Check if supported
if check_cc "$snp" "$opt"; then
echo "ok"
enable $nam
else
echo "fail"
return 1
fi
}
# Check compiler option
function check_cc_option
{
local opt=$1
local nam=$2
[ -z "$nam" ] && nam=$opt
printf "$TAB" "checking for cc -m$opt ..."
# Enable if supported
if check_cc "" -m${opt}; then
echo "ok"
enable $nam
else
echo "fail"
return 1
fi
}
# Check compiler library
function check_cc_lib
{
local opt=$1
local nam=$2
[ -z "$nam" ] && nam=$opt
printf "$TAB" "checking for cc -l$opt ..."
# Enable if supported
if check_cc "" -l${opt}; then
echo "ok"
enable $nam
else
echo "fail"
return 1
fi
}
# ###########################################################################
# Python tests
# ###########################################################################
# Check python
function check_py
{
local hdr=$1
cat >$TMPDIR/$$.py <<EOF
$hdr
EOF
$PYTHON $TMPDIR/$$.py &> /dev/null
RET=$?
rm -f $TMPDIR/$$.py
return $RET
}
# Check python import
function check_py_import
{
local hdr=$1
local nam=$2
[ -z "$nam" ] && nam=py_${hdr}
printf "$TAB" "checking for py module $hdr ..."
# Enable if supported
if check_py "import $hdr"; then
echo "ok"
enable $nam
else
echo "fail"
return 1
fi
}
# ###########################################################################
# Binary checks
# ###########################################################################
function check_bin
{
local bin=$1
local nam=$2
[ -z "$nam" ] && nam=bin_${bin}
printf "$TAB" "checking for $bin ..."
if which $bin &> /dev/null; then
echo "ok"
enable $nam
else
echo "fail"
return 1
fi
}
# ###########################################################################
# Config output
# ###########################################################################
# Print config
function print_config
{
local pkg= fmt=" %-40s %s\n"
# Compiler settings
echo ""
echo "Compiler:"
printf "$fmt" "Using C compiler:" "${CC}"
if [ "${CFLAGS}" != "" ]; then
printf "$fmt" "Using C flags:" "${CFLAGS}"
fi
printf "$fmt" "Build for arch:" "${ARCH}"
echo ""
echo "Binaries:"
printf "$fmt" "Using PYTHON:" "${PYTHON}"
echo ""
# Options
echo "Options:"
for opt in ${OPTIONS[*]}; do
k=${opt%:*}
v=${opt#*:}
if [ "$v" == "yes" ]; then
printf "$fmt" "$k" "yes"
else
printf "$fmt" "$k" "no"
fi
done
echo ""
# Packages
echo "Packages:"
for pkg in ${PACKAGES[*]}; do
printf "$fmt" "${pkg}" "$(pkg-config --modversion $pkg)"
done
echo ""
# Installation
echo "Installation paths:"
printf "$fmt" "Prefix:" "${prefix}"
printf "$fmt" "Binaries:" "${bindir}"
printf "$fmt" "Libraries:" "${libdir}"
printf "$fmt" "Data files:" "${datadir}"
printf "$fmt" "Man pages:" "${mandir}"
echo ""
}
# Write configuration
function write_config
{
local pkg= opt= k= v=
# Create build directory
mkdir -p "${BUILDDIR}"
BUILDDIR=`cd "${BUILDDIR}" && pwd`
# Create make include
CONFIG_MK=${ROOTDIR}/.config.mk
cat > "${CONFIG_MK}" <<EOF
# Automatically generated by configure - DO NOT EDIT!
CONFIGURE_ARGS = ${CONFIGURE_ARGS}
ROOTDIR ?= ${ROOTDIR}
BUILDDIR ?= ${BUILDDIR}
OSENV ?= ${OSENV}
ARCH ?= ${ARCH}
CPU ?= ${CPU}
ifeq (\$(origin CC),default)
CC = ${CC}
endif
PYTHON ?= ${PYTHON}
CFLAGS += ${CFLAGS}
LDFLAGS += ${LDFLAGS}
prefix = ${prefix}
bindir = ${bindir}
mandir = ${mandir}
datadir = ${datadir}
libdir = ${libdir}
EOF
# Create C include
CONFIG_H="${BUILDDIR}/build.h"
cat > "${CONFIG_H}" <<EOF
// Automatically generated by configure - DO NOT EDIT!
EOF
# Create Platform defines
cat > ${CONFIG_H} <<EOF
#define PLATFORM_$(toupper ${PLATFORM}) 1
EOF
# Add package config
for pkg in ${PACKAGES[*]}; do
cat >>"${CONFIG_MK}" <<EOF
LDFLAGS += $(pkg-config --libs $pkg)
CFLAGS += $(pkg-config --cflags $pkg)
EOF
done
# Add configuration
for row in ${OPTIONS[*]}; do
k=$(toupper ${row%:*})
v=${row#*:}
if [ "$v" == "yes" ]; then
cat >>"${CONFIG_H}" <<EOF
#define ENABLE_${k} 1
#define CONFIG_${k} 1
EOF
cat >>"${CONFIG_MK}" <<EOF
CONFIG_${k} = yes
EOF
else
cat >>"${CONFIG_H}" <<EOF
#define ENABLE_${k} 0
EOF
cat >>"${CONFIG_MK}" <<EOF
CONFIG_${k} = no
EOF
fi
done
}