summaryrefslogtreecommitdiffstats
path: root/native_client_sdk/src/libraries/gtest/build.scons
blob: dd3b78839657db0cf9ecbc57853d820bdbde019a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# -*- python -*-
# Copyright (c) 2011 The Chromium Authors.  All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import build_utils
import glob
import os
import shutil
import subprocess
import sys

from SCons import Script

# Directories used throughout this script.
script_dir = os.path.abspath(os.getcwd())
sdk_root_dir = os.getenv('NACL_SDK_ROOT')
build_tools_dir = os.path.join(sdk_root_dir, 'build_tools')
libraries_dir = os.path.join(sdk_root_dir, 'libraries')

# Add the path to build_tools to the shell's python path.
shell_env = os.environ.copy()
python_paths = [build_tools_dir]
python_paths += [shell_env.get('PYTHONPATH', '')]
shell_env['PYTHONPATH'] = os.pathsep.join(python_paths)

# Argv for the install-gtest python script.
script_argv = [
  '--toolchain=%s' % (
      build_utils.NormalizeToolchain(base_dir=sdk_root_dir,
                                     arch='x86',
                                     variant='glibc')),
  '--toolchain=%s' % (
      build_utils.NormalizeToolchain(base_dir=sdk_root_dir,
                                     arch='x86',
                                     variant='newlib')),
  '--working_dir=%s' % script_dir
  ]

# The scons build env.
build_env = Script.Environment().Clone()

# Where the src for gtest and gmock will be found after running the install
# script. We keep them around as a sentinel, to indicate they they have been
# installed. (See BuildGTestLibs below.)
gtest_src = os.path.join(script_dir, 'gtest-1.5.0')
gmock_src = os.path.join(script_dir, 'gmock-1.5.0')


def BuildGTestLibs(env, target, source):
  '''Build and install the gtest/gmock libraries.

  This invokes the gtest_install.py script in the build_tools directory. In turn
  that scripts downloads, untar, patches and build the gtest/gmock libraries.
  Finally, the libraries and related include files are copied to the toolchain.

  Args:
    env: The construction Environment() that is building the examples.
    target: The target that triggered this build.  Not used.
    source: The sources used for this build.  Not used.
  '''
  # If our sentinel, the gtest source is present, do not build.
  if os.path.exists(gtest_src):
    return
  # Remove any old gmock source if still present.
  shutil.rmtree(gmock_src, ignore_errors=True)
  # Invoke the gtest install script.
  script = os.path.join(build_tools_dir, 'install_gtest', 'install_gtest.py')
  py_command = [sys.executable, script]
  subprocess.check_call(py_command + script_argv, env=shell_env)

  # Clean up: remove left-over tgz files.
  for f in glob.iglob(os.path.join(script_dir, '*.tgz')):
    os.remove(f)


def CleanGTestLibs(env, target, suite_name):
  '''Clean the gtest/gmock libraries sources.

  This does a partial clean up of the gtest/gmock projects. It removes the src
  directories. However, the actual libraries and related includes in the
  toolchains are not removed. It is however sufficient to trigger a full
  rebuild of gtest/gmock.

  Args:
    env: The construction Environment() that is building the examples.
    target: The target that triggered this build.
    suite_name: A suite name that should cause this target to be cleaned.
  '''
  # Only do this in 'clean' mode.
  if not build_env.GetOption('clean'):
    return
  # Only clean target if it's on the cmd line or it's a clean all.
  clean_this = True
  if len(COMMAND_LINE_TARGETS) > 0:
    clean_this = False
    for cl_target in COMMAND_LINE_TARGETS:
      if cl_target == suite_name or cl_target == target:
        clean_this = True
        break
  # Delete the src trees for gtest and gmock.
  if clean_this:
    shutil.rmtree(gmock_src, ignore_errors=True)
    shutil.rmtree(gtest_src, ignore_errors=True)


gtest_libs_builder = build_env.Alias('gtest_libs', [], BuildGTestLibs)
build_env.AlwaysBuild(gtest_libs_builder)
CleanGTestLibs(build_env, 'gtest_libs', 'bot')

# ----------------------------------------------------------------------------
build_env.Default('gtest_libs')