summaryrefslogtreecommitdiffstats
path: root/site_scons/site_tools/visual_studio_solution.py
blob: 1e4676747103fa068f0da4e0505f8d5b932edd7d (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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#!/usr/bin/python2.4
# Copyright 2008, Google Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
#     * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#     * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following disclaimer
# in the documentation and/or other materials provided with the
# distribution.
#     * Neither the name of Google Inc. nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

"""Visual Studio solution file generation tool for SCons."""


import sys
import SCons.Script


def Solution(env, solution_name,
             environments,
             exclude_pattern=None,
             extra_build_targets=None):
  """Builds an MSVS solution containing all projects underneath build/win.

  Args:
    solution_name: Name of the solution.
    environments: List of environments for variants. Only the first one
      will be used to build the solutions/projects.
    exclude_pattern: Files matching this pattern will not be added to the
      projects and solution.
    extra_build_targets: Dict of extra build targets, indexed by target
      name.  Each extra build target will be given
      its own empty project.
  """

  # Provide an empty dict for the set of extra targets, by default.
  if extra_build_targets is None:
    extra_build_targets = dict()

  # Fail if not on windows for now.
  if sys.platform not in ['win32', 'cygwin']:
    print ('*** Solution file generation skipped '
           '(not supported on this platform).')
    return

  # Add in the msvs tool.
  env.Tool('msvs')

  # Pick out variants
  variants = [e['BUILD_TYPE'] for e in environments]
  # Pick out build targets
  build_targets = [e.subst('$TARGET_ROOT') for e in environments]
  # pick out sources, headers, and resources
  sources, headers, resources, others = env.GatherInputs(
      [env.Dir('$DESTINATION_ROOT')],
      ['.+\\.(c|cc|m|mm|cpp)$',  # source files
       '.+\\.(h|hh|hpp)$',       # header files
       '.+\\.(rc)$',             # resource files
       '.*'],                    # all other files
      exclude_pattern=exclude_pattern,
  )
  # Build main Visual Studio Project file
  project_list = env.MSVSProject(target=solution_name +
                                 env['MSVSPROJECTSUFFIX'],
                                 srcs=sources + headers + others + resources,
                                 incs=[],
                                 misc=[],
                                 resources=[],
                                 auto_build_solution=0,
                                 MSVSCLEANCOM='hammer.bat -c MODE=all',
                                 MSVSBUILDCOM='hammer.bat MODE=all',
                                 MSVSREBUILD='hammer.bat -c MODE=all;'
                                     'hammer.bat MODE=all',
                                 buildtarget=build_targets,
                                 variant=variants)
  # Collect other projects
  for e in extra_build_targets:
    # Explicitly create a node for target, so SCons will expand env variables.
    build_target = env.File(extra_build_targets[e])
    # Create an empty project that only has a build target.
    project_list += env.MSVSProject(target='projects/' + e + '/' + e +
                                    env['MSVSPROJECTSUFFIX'],
                                    srcs=[],
                                    incs=[],
                                    resources=[],
                                    misc=[],
                                    auto_build_solution=0,
                                    MSVSCLEANCOM='rem',
                                    MSVSBUILDCOM='rem',
                                    MSVSREBUILD='rem',
                                    buildtarget=build_target,
                                    variant=variants[0])

  # Build Visual Studio Solution file.
  solution =env.MSVSSolution(target=solution_name + env['MSVSSOLUTIONSUFFIX'],
                             projects=project_list,
                             variant=variants)
  # Explicitly add dependencies.
  env.Depends(solution, project_list)

  return solution


def generate(env):
  # NOTE: SCons requires the use of this name, which fails gpylint.
  """SCons entry point for this tool."""

  # Add in the gather_inputs tool.
  env.Tool('gather_inputs')

  # Add a method to generate a combined solution file.
  env.AddMethod(Solution, 'Solution')