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
.googletest
uses 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 makegoogletest
available to other packages which are built by me myself. So we do not use standard paths (like/usr/local
) to installgoogletest
to, 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 ...