Home | History | Annotate | Download | only in scripts
      1 #!/bin/sh
      2 
      3 # These variables are automatically filled in by the configure script.
      4 name="@PACKAGE_TARNAME@"
      5 version="@PACKAGE_VERSION@"
      6 
      7 show_usage()
      8 {
      9   echo "Usage: gmock-config [OPTIONS...]"
     10 }
     11 
     12 show_help()
     13 {
     14   show_usage
     15   cat <<\EOF
     16 
     17 The `gmock-config' script provides access to the necessary compile and linking
     18 flags to connect with Google C++ Mocking Framework, both in a build prior to
     19 installation, and on the system proper after installation. The installation
     20 overrides may be issued in combination with any other queries, but will only
     21 affect installation queries if called on a built but not installed gmock. The
     22 installation queries may not be issued with any other types of queries, and
     23 only one installation query may be made at a time. The version queries and
     24 compiler flag queries may be combined as desired but not mixed. Different
     25 version queries are always combined with logical "and" semantics, and only the
     26 last of any particular query is used while all previous ones ignored. All
     27 versions must be specified as a sequence of numbers separated by periods.
     28 Compiler flag queries output the union of the sets of flags when combined.
     29 
     30  Examples:
     31   gmock-config --min-version=1.0 || echo "Insufficient Google Mock version."
     32 
     33   g++ $(gmock-config --cppflags --cxxflags) -o foo.o -c foo.cpp
     34   g++ $(gmock-config --ldflags --libs) -o foo foo.o
     35 
     36   # When using a built but not installed Google Mock:
     37   g++ $(../../my_gmock_build/scripts/gmock-config ...) ...
     38 
     39   # When using an installed Google Mock, but with installation overrides:
     40   export GMOCK_PREFIX="/opt"
     41   g++ $(gmock-config --libdir="/opt/lib64" ...) ...
     42 
     43  Help:
     44   --usage                    brief usage information
     45   --help                     display this help message
     46 
     47  Installation Overrides:
     48   --prefix=<dir>             overrides the installation prefix
     49   --exec-prefix=<dir>        overrides the executable installation prefix
     50   --libdir=<dir>             overrides the library installation prefix
     51   --includedir=<dir>         overrides the header file installation prefix
     52 
     53  Installation Queries:
     54   --prefix                   installation prefix
     55   --exec-prefix              executable installation prefix
     56   --libdir                   library installation directory
     57   --includedir               header file installation directory
     58   --version                  the version of the Google Mock installation
     59 
     60  Version Queries:
     61   --min-version=VERSION      return 0 if the version is at least VERSION
     62   --exact-version=VERSION    return 0 if the version is exactly VERSION
     63   --max-version=VERSION      return 0 if the version is at most VERSION
     64 
     65  Compilation Flag Queries:
     66   --cppflags                 compile flags specific to the C-like preprocessors
     67   --cxxflags                 compile flags appropriate for C++ programs
     68   --ldflags                  linker flags
     69   --libs                     libraries for linking
     70 
     71 EOF
     72 }
     73 
     74 # This function bounds our version with a min and a max. It uses some clever
     75 # POSIX-compliant variable expansion to portably do all the work in the shell
     76 # and avoid any dependency on a particular "sed" or "awk" implementation.
     77 # Notable is that it will only ever compare the first 3 components of versions.
     78 # Further components will be cleanly stripped off. All versions must be
     79 # unadorned, so "v1.0" will *not* work. The minimum version must be in $1, and
     80 # the max in $2. TODO(chandlerc (at] google.com): If this ever breaks, we should
     81 # investigate expanding this via autom4te from AS_VERSION_COMPARE rather than
     82 # continuing to maintain our own shell version.
     83 check_versions()
     84 {
     85   major_version=${version%%.*}
     86   minor_version="0"
     87   point_version="0"
     88   if test "${version#*.}" != "${version}"; then
     89     minor_version=${version#*.}
     90     minor_version=${minor_version%%.*}
     91   fi
     92   if test "${version#*.*.}" != "${version}"; then
     93     point_version=${version#*.*.}
     94     point_version=${point_version%%.*}
     95   fi
     96 
     97   min_version="$1"
     98   min_major_version=${min_version%%.*}
     99   min_minor_version="0"
    100   min_point_version="0"
    101   if test "${min_version#*.}" != "${min_version}"; then
    102     min_minor_version=${min_version#*.}
    103     min_minor_version=${min_minor_version%%.*}
    104   fi
    105   if test "${min_version#*.*.}" != "${min_version}"; then
    106     min_point_version=${min_version#*.*.}
    107     min_point_version=${min_point_version%%.*}
    108   fi
    109 
    110   max_version="$2"
    111   max_major_version=${max_version%%.*}
    112   max_minor_version="0"
    113   max_point_version="0"
    114   if test "${max_version#*.}" != "${max_version}"; then
    115     max_minor_version=${max_version#*.}
    116     max_minor_version=${max_minor_version%%.*}
    117   fi
    118   if test "${max_version#*.*.}" != "${max_version}"; then
    119     max_point_version=${max_version#*.*.}
    120     max_point_version=${max_point_version%%.*}
    121   fi
    122 
    123   test $(($major_version)) -lt $(($min_major_version)) && exit 1
    124   if test $(($major_version)) -eq $(($min_major_version)); then
    125     test $(($minor_version)) -lt $(($min_minor_version)) && exit 1
    126     if test $(($minor_version)) -eq $(($min_minor_version)); then
    127       test $(($point_version)) -lt $(($min_point_version)) && exit 1
    128     fi
    129   fi
    130 
    131   test $(($major_version)) -gt $(($max_major_version)) && exit 1
    132   if test $(($major_version)) -eq $(($max_major_version)); then
    133     test $(($minor_version)) -gt $(($max_minor_version)) && exit 1
    134     if test $(($minor_version)) -eq $(($max_minor_version)); then
    135       test $(($point_version)) -gt $(($max_point_version)) && exit 1
    136     fi
    137   fi
    138 
    139   exit 0
    140 }
    141 
    142 # Show the usage line when no arguments are specified.
    143 if test $# -eq 0; then
    144   show_usage
    145   exit 1
    146 fi
    147 
    148 while test $# -gt 0; do
    149   case $1 in
    150     --usage)          show_usage;         exit 0;;
    151     --help)           show_help;          exit 0;;
    152 
    153     # Installation overrides
    154     --prefix=*)       GMOCK_PREFIX=${1#--prefix=};;
    155     --exec-prefix=*)  GMOCK_EXEC_PREFIX=${1#--exec-prefix=};;
    156     --libdir=*)       GMOCK_LIBDIR=${1#--libdir=};;
    157     --includedir=*)   GMOCK_INCLUDEDIR=${1#--includedir=};;
    158 
    159     # Installation queries
    160     --prefix|--exec-prefix|--libdir|--includedir|--version)
    161       if test -n "${do_query}"; then
    162         show_usage
    163         exit 1
    164       fi
    165       do_query=${1#--}
    166       ;;
    167 
    168     # Version checking
    169     --min-version=*)
    170       do_check_versions=yes
    171       min_version=${1#--min-version=}
    172       ;;
    173     --max-version=*)
    174       do_check_versions=yes
    175       max_version=${1#--max-version=}
    176       ;;
    177     --exact-version=*)
    178       do_check_versions=yes
    179       exact_version=${1#--exact-version=}
    180       ;;
    181 
    182     # Compiler flag output
    183     --cppflags)       echo_cppflags=yes;;
    184     --cxxflags)       echo_cxxflags=yes;;
    185     --ldflags)        echo_ldflags=yes;;
    186     --libs)           echo_libs=yes;;
    187 
    188     # Everything else is an error
    189     *)                show_usage;         exit 1;;
    190   esac
    191   shift
    192 done
    193 
    194 # These have defaults filled in by the configure script but can also be
    195 # overridden by environment variables or command line parameters.
    196 prefix="${GMOCK_PREFIX:-@prefix@}"
    197 exec_prefix="${GMOCK_EXEC_PREFIX:-@exec_prefix@}"
    198 libdir="${GMOCK_LIBDIR:-@libdir@}"
    199 includedir="${GMOCK_INCLUDEDIR:-@includedir@}"
    200 
    201 # We try and detect if our binary is not located at its installed location. If
    202 # it's not, we provide variables pointing to the source and build tree rather
    203 # than to the install tree. We also locate Google Test using the configured
    204 # gtest-config script rather than searching the PATH and our bindir for one.
    205 # This allows building against a just-built gmock rather than an installed
    206 # gmock.
    207 bindir="@bindir@"
    208 this_relative_bindir=`dirname $0`
    209 this_bindir=`cd ${this_relative_bindir}; pwd -P`
    210 if test "${this_bindir}" = "${this_bindir%${bindir}}"; then
    211   # The path to the script doesn't end in the bindir sequence from Autoconf,
    212   # assume that we are in a build tree.
    213   build_dir=`dirname ${this_bindir}`
    214   src_dir=`cd ${this_bindir}/@top_srcdir@; pwd -P`
    215 
    216   # TODO(chandlerc (at] google.com): This is a dangerous dependency on libtool, we
    217   # should work to remove it, and/or remove libtool altogether, replacing it
    218   # with direct references to the library and a link path.
    219   gmock_libs="${build_dir}/lib/libgmock.la"
    220   gmock_ldflags=""
    221 
    222   # We provide hooks to include from either the source or build dir, where the
    223   # build dir is always preferred. This will potentially allow us to write
    224   # build rules for generated headers and have them automatically be preferred
    225   # over provided versions.
    226   gmock_cppflags="-I${build_dir}/include -I${src_dir}/include"
    227   gmock_cxxflags=""
    228 
    229   # Directly invoke the gtest-config script used during the build process.
    230   gtest_config="@GTEST_CONFIG@"
    231 else
    232   # We're using an installed gmock, although it may be staged under some
    233   # prefix. Assume (as our own libraries do) that we can resolve the prefix,
    234   # and are present in the dynamic link paths.
    235   gmock_ldflags="-L${libdir}"
    236   gmock_libs="-l${name}"
    237   gmock_cppflags="-I${includedir}"
    238   gmock_cxxflags=""
    239 
    240   # We also prefer any gtest-config script installed in our prefix. Lacking
    241   # one, we look in the PATH for one.
    242   gtest_config="${bindir}/gtest-config"
    243   if test ! -x "${gtest_config}"; then
    244     gtest_config=`which gtest-config`
    245   fi
    246 fi
    247 
    248 # Ensure that we have located a Google Test to link against.
    249 if ! test -x "${gtest_config}"; then
    250   echo "Unable to locate Google Test, check your Google Mock configuration" \
    251        "and installation" >&2
    252   exit 1
    253 elif ! "${gtest_config}" "--exact-version=@GTEST_VERSION@"; then
    254   echo "The Google Test found is not the same version as Google Mock was " \
    255        "built against" >&2
    256   exit 1
    257 fi
    258 
    259 # Add the necessary Google Test bits into the various flag variables
    260 gmock_cppflags="${gmock_cppflags} `${gtest_config} --cppflags`"
    261 gmock_cxxflags="${gmock_cxxflags} `${gtest_config} --cxxflags`"
    262 gmock_ldflags="${gmock_ldflags} `${gtest_config} --ldflags`"
    263 gmock_libs="${gmock_libs} `${gtest_config} --libs`"
    264 
    265 # Do an installation query if requested.
    266 if test -n "$do_query"; then
    267   case $do_query in
    268     prefix)           echo $prefix;       exit 0;;
    269     exec-prefix)      echo $exec_prefix;  exit 0;;
    270     libdir)           echo $libdir;       exit 0;;
    271     includedir)       echo $includedir;   exit 0;;
    272     version)          echo $version;      exit 0;;
    273     *)                show_usage;         exit 1;;
    274   esac
    275 fi
    276 
    277 # Do a version check if requested.
    278 if test "$do_check_versions" = "yes"; then
    279   # Make sure we didn't receive a bad combination of parameters.
    280   test "$echo_cppflags" = "yes" && show_usage && exit 1
    281   test "$echo_cxxflags" = "yes" && show_usage && exit 1
    282   test "$echo_ldflags" = "yes"  && show_usage && exit 1
    283   test "$echo_libs" = "yes"     && show_usage && exit 1
    284 
    285   if test "$exact_version" != ""; then
    286     check_versions $exact_version $exact_version
    287     # unreachable
    288   else
    289     check_versions ${min_version:-0.0.0} ${max_version:-9999.9999.9999}
    290     # unreachable
    291   fi
    292 fi
    293 
    294 # Do the output in the correct order so that these can be used in-line of
    295 # a compiler invocation.
    296 output=""
    297 test "$echo_cppflags" = "yes" && output="$output $gmock_cppflags"
    298 test "$echo_cxxflags" = "yes" && output="$output $gmock_cxxflags"
    299 test "$echo_ldflags" = "yes"  && output="$output $gmock_ldflags"
    300 test "$echo_libs" = "yes"     && output="$output $gmock_libs"
    301 echo $output
    302 
    303 exit 0
    304