| 
4 | 4 | # Use of this source code is governed by a BSD-style license that can be  | 
5 | 5 | # found in the LICENSE file.  | 
6 | 6 | 
 
  | 
7 |  | - | 
 | 7 | +from __future__ import annotations  | 
8 | 8 | import copy  | 
9 | 9 | import gyp.input  | 
10 | 10 | import argparse  | 
 | 
24 | 24 | DEBUG_VARIABLES = "variables"  | 
25 | 25 | DEBUG_INCLUDES = "includes"  | 
26 | 26 | 
 
  | 
 | 27 | +def EscapeForCString(string: bytes | str) -> str:  | 
 | 28 | +    if isinstance(string, str):  | 
 | 29 | +        string = string.encode(encoding='utf8')  | 
 | 30 | + | 
 | 31 | +    backslash_or_double_quote = {ord('\\'), ord('"')}  | 
 | 32 | +    result = []  | 
 | 33 | +    for char in string:  | 
 | 34 | +        if char in backslash_or_double_quote or not 32 <= char < 127:  | 
 | 35 | +            result += '\\%03o' % char  | 
 | 36 | +        else:  | 
 | 37 | +            result += chr(char)  | 
 | 38 | +    return result  | 
27 | 39 | 
 
  | 
28 | 40 | def DebugOutput(mode, message, *args):  | 
29 | 41 |     if "all" in gyp.debug or mode in gyp.debug:  | 
@@ -106,18 +118,19 @@ def Load(  | 
106 | 118 | 
 
  | 
107 | 119 |     output_dir = params["options"].generator_output or params["options"].toplevel_dir  | 
108 | 120 |     if default_variables["GENERATOR"] == "ninja":  | 
109 |  | -        default_variables.setdefault(  | 
110 |  | -            "PRODUCT_DIR_ABS",  | 
111 |  | -            os.path.join(  | 
112 |  | -                output_dir, "out", default_variables.get("build_type", "default")  | 
113 |  | -            ),  | 
 | 121 | +        product_dir_abs = os.path.join(  | 
 | 122 | +            output_dir, "out", default_variables.get("build_type", "default")  | 
114 | 123 |         )  | 
115 | 124 |     else:  | 
116 |  | -        default_variables.setdefault(  | 
117 |  | -            "PRODUCT_DIR_ABS",  | 
118 |  | -            os.path.join(output_dir, default_variables["CONFIGURATION_NAME"]),  | 
 | 125 | +        product_dir_abs = os.path.join(  | 
 | 126 | +            output_dir, default_variables["CONFIGURATION_NAME"]  | 
119 | 127 |         )  | 
120 | 128 | 
 
  | 
 | 129 | +    default_variables.setdefault("PRODUCT_DIR_ABS", product_dir_abs)  | 
 | 130 | +    default_variables.setdefault(  | 
 | 131 | +        "PRODUCT_DIR_ABS_CSTR", EscapeForCString(product_dir_abs)  | 
 | 132 | +    )  | 
 | 133 | + | 
121 | 134 |     # Give the generator the opportunity to set additional variables based on  | 
122 | 135 |     # the params it will receive in the output phase.  | 
123 | 136 |     if getattr(generator, "CalculateVariables", None):  | 
@@ -253,7 +266,7 @@ def Noop(value):  | 
253 | 266 |     for name, metadata in options._regeneration_metadata.items():  | 
254 | 267 |         opt = metadata["opt"]  | 
255 | 268 |         value = getattr(options, name)  | 
256 |  | -        value_predicate = metadata["type"] == "path" and FixPath or Noop  | 
 | 269 | +        value_predicate = (metadata["type"] == "path" and FixPath) or Noop  | 
257 | 270 |         action = metadata["action"]  | 
258 | 271 |         env_name = metadata["env_name"]  | 
259 | 272 |         if action == "append":  | 
 | 
0 commit comments