1 # Copyright 2014 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
11 def GetNinjaOutputDirectory(chrome_root
, configuration
=None):
12 """Returns <chrome_root>/<output_dir>/(Release|Debug).
14 The output_dir is detected in the following ways, in order of precedence:
15 1. CHROMIUM_OUT_DIR environment variable.
16 2. GYP_GENERATOR_FLAGS environment variable output_dir property.
17 3. Symlink target, if src/out is a symlink.
18 4. Most recently modified (e.g. built) directory called out or out_*.
20 The configuration chosen is the one most recently generated/built, but can be
21 overriden via the <configuration> parameter."""
24 if ('CHROMIUM_OUT_DIR' in os
.environ
and
25 os
.path
.isdir(os
.path
.join(chrome_root
, os
.environ
['CHROMIUM_OUT_DIR']))):
26 output_dirs
= [os
.environ
['CHROMIUM_OUT_DIR']]
28 generator_flags
= os
.getenv('GYP_GENERATOR_FLAGS', '').split(' ')
29 for flag
in generator_flags
:
30 name_value
= flag
.split('=', 1)
31 if (len(name_value
) == 2 and name_value
[0] == 'output_dir' and
32 os
.path
.isdir(os
.path
.join(chrome_root
, name_value
[1]))):
33 output_dirs
= [name_value
[1]]
35 out
= os
.path
.join(chrome_root
, 'out')
36 if os
.path
.islink(out
):
37 out_target
= os
.path
.join(os
.path
.dirname(out
), os
.readlink(out
))
38 if os
.path
.exists(out_target
):
39 output_dirs
= [out_target
]
41 for f
in os
.listdir(chrome_root
):
42 if (re
.match('out(?:$|_)', f
) and
43 os
.path
.isdir(os
.path
.join(chrome_root
, f
))):
46 configs
= [configuration
] if configuration
else ['Debug', 'Release']
47 output_paths
= [os
.path
.join(chrome_root
, out_dir
, config
)
48 for out_dir
in output_dirs
for config
in configs
]
50 def approx_directory_mtime(path
):
51 if not os
.path
.exists(path
):
53 # This is a heuristic; don't recurse into subdirectories.
54 paths
= [path
] + [os
.path
.join(path
, f
) for f
in os
.listdir(path
)]
55 return max(os
.path
.getmtime(p
) for p
in paths
)
57 return max(output_paths
, key
=approx_directory_mtime
)