Installing googletest By Hand#
This is for users of Ubuntu 16.04 LTS which does not come with a
proper package for this. There is gtest-dev (or so), but it
appears to only contain headers - libraries are missing.
Clone googletest Repo#
I use to store Git clones in ~/work (you might like it different),
$ cd ~/work
$ git clone https://github.com/google/googletest.git
Create Build Directory#
I put mines in ~/build; again, please deviate as you want. Create
directory, and cd into it.
$ mkdir -p ~/build/googletest
$ cd ~/build/googletest
CMake, Build and Install#
googletest uses CMake to build itself, and this is what the
remainder is: explanations of how to do things in CMake.
We pass two parameters down into the CMake build,
-std=c++11.googletestuses C++-11 features. Ubuntu 16.04 LTS come with GCC version 5.<something> which does not build C++ as C++-11 by default. You can to force it to, though, by giving it that flag. The CMake way to pass compiler flags through is-DCMAKE_CXX_FLAGS=-std=c++11.We do not want to become
root. I only want to makegoogletestavailable to other packages which are built by me myself. So we do not use standard paths (like/usr/local) to installgoogletestto, but rather$HOME/install/googletest. (Again, please deviate.)
Long story short,
$ pwd
/home/jfasch/build/googletest
$ cmake -DCMAKE_CXX_FLAGS=-std=c++11 -DCMAKE_INSTALL_PREFIX=$HOME/install/googletest ~/work/googletest
$ make
$ make install
googletest is now available under /home/jfasch/install/googletest,
$ ls ~/install/googletest/include/gtest/gtest.h
/home/jfasch/install/googletest/include/gtest/gtest.h
$ ls ~/install/googletest/lib64/libgtest.a
/home/jfasch/install/googletest/lib64/libgtest.a
In other words, $HOME/install/googletest is the root of the
googletest install. To build other packages to use that install,
we have to pass a parameter down into their build. (Did somebody
claim life was simlpe?)
Build Packages to Use Our Private googletest Install#
One popular such package (to me at least) that wants googletest is
my own training site, https://github.com/jfasch/jfasch-home. I’ll
take this as a concrete example; others should work just as
well. Provided that they use CMake, of course - this is what I’m
showing here.
jfasch-home uses a CMake “find module” to determine information
about the googletest install, like follows.
Clone that repo,
$ cd ~/work
$ git clone https://github.com/jfasch/jfasch-home
In the toplevel CMakeLists.txt file, it has,
FIND_PACKAGE(GTest REQUIRED)
Down into the tree, in a directory where tests are done, it has,
ADD_EXECUTABLE(simple simple.cc)
TARGET_LINK_LIBRARIES(simple GTest::GTest)
ADD_TEST(simple simple)
(simple is a test program). The emphasis is on how to use gtest,
and the key is GTest::GTest.
So how to pass out private googletest install in?
The ultimate source of information is the code, Luke. Information
about CMake “find modules” is hard to come by on the internet; I use
to look in the file that implements the “find module”. Remember, in
thetoplevel CMakeLists.txt we have FIND_PACKAGE(GTest
REQUIRED); from this we know that there must be a file
/usr/share/cmake/Modules/FindGTest.cmake. It has its own
documentation inside it; read, and know that it accept a CMake
variable GTEST_ROOT which does what we want.
$ mkdir ~/build/jfasch-home
$ cmake -DGTEST_ROOT=$HOME/install/googletest ~/work/jfasch-home
Maybe, paranoidly, verbosely verify that $HOME/install/googletest
is used,
$ make VERBOSE=1
... watch out for build output that mention our googletest install ...