From 7b11b5711d7829674de5ff9c1964a8f0acd7a234 Mon Sep 17 00:00:00 2001
From: Raymond Zhao <7199958+rzhao271@users.noreply.github.com>
Date: Thu, 6 Apr 2023 08:29:47 -0700
Subject: [PATCH 1/5] feat(gyp): update gyp to v0.15.0
---
gyp/.flake8 | 4 +-
gyp/.github/workflows/Python_tests.yml | 8 ++-
gyp/CHANGELOG.md | 20 +++++++
gyp/README.md | 23 ++++++++
gyp/pylib/gyp/MSVSNew.py | 24 ++++----
gyp/pylib/gyp/__init__.py | 6 +-
gyp/pylib/gyp/common.py | 21 +++----
gyp/pylib/gyp/easy_xml_test.py | 2 +
gyp/pylib/gyp/generator/analyzer.py | 2 +-
gyp/pylib/gyp/generator/cmake.py | 5 +-
.../gyp/generator/compile_commands_json.py | 2 +-
gyp/pylib/gyp/generator/eclipse.py | 5 +-
gyp/pylib/gyp/generator/make.py | 7 +--
gyp/pylib/gyp/generator/msvs.py | 56 ++++++++-----------
gyp/pylib/gyp/generator/ninja.py | 5 +-
gyp/pylib/gyp/generator/xcode.py | 7 +--
gyp/pylib/gyp/input.py | 45 ++++++---------
gyp/pylib/gyp/msvs_emulation.py | 21 ++-----
gyp/pylib/gyp/win_tool.py | 9 ++-
gyp/pylib/gyp/xcode_emulation.py | 12 +---
gyp/pylib/gyp/xcodeproj_file.py | 27 +++++----
gyp/pyproject.toml | 25 +++++++--
22 files changed, 171 insertions(+), 165 deletions(-)
diff --git a/gyp/.flake8 b/gyp/.flake8
index ea0c7680ef..4b052666aa 100644
--- a/gyp/.flake8
+++ b/gyp/.flake8
@@ -1,4 +1,6 @@
[flake8]
max-complexity = 101
max-line-length = 88
-extend-ignore = E203 # whitespace before ':' to agree with psf/black
+extend-ignore =
+ # whitespace before ':' to agree with psf/black
+ E203
diff --git a/gyp/.github/workflows/Python_tests.yml b/gyp/.github/workflows/Python_tests.yml
index aad135027c..d92c0dc942 100644
--- a/gyp/.github/workflows/Python_tests.yml
+++ b/gyp/.github/workflows/Python_tests.yml
@@ -13,10 +13,10 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
- max-parallel: 8
+ max-parallel: 6
matrix:
os: [macos-latest, ubuntu-latest] # , windows-latest]
- python-version: ["3.7", "3.8", "3.9", "3.10", "3.11-dev"]
+ python-version: ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12-dev"]
steps:
- uses: actions/checkout@v3
- name: Set up Python ${{ matrix.python-version }}
@@ -30,7 +30,9 @@ jobs:
- run: ./gyp -V && ./gyp --version && gyp -V && gyp --version
- name: Lint with flake8
run: flake8 . --ignore=E203,W503 --max-complexity=101 --max-line-length=88 --show-source --statistics
- - name: Test with pytest
+ - name: Lint with ruff # See pyproject.toml for settings
+ run: flake8 .
+ - name: Test with pytest # See pyproject.toml for settings
run: pytest
# - name: Run doctests with pytest
# run: pytest --doctest-modules
diff --git a/gyp/CHANGELOG.md b/gyp/CHANGELOG.md
index 4b4968f6a4..01208c729f 100644
--- a/gyp/CHANGELOG.md
+++ b/gyp/CHANGELOG.md
@@ -1,5 +1,25 @@
# Changelog
+## [0.15.0](https://github.com/nodejs/gyp-next/compare/v0.14.1...v0.15.0) (2023-03-30)
+
+
+### Features
+
+* **msvs:** add SpectreMitigation attribute ([#190](https://github.com/nodejs/gyp-next/issues/190)) ([853e464](https://github.com/nodejs/gyp-next/commit/853e4643b6737224a5aa0720a4108461a0230991))
+
+## [0.14.1](https://github.com/nodejs/gyp-next/compare/v0.14.0...v0.14.1) (2023-02-19)
+
+
+### Bug Fixes
+
+* flake8 extended-ignore ([#186](https://github.com/nodejs/gyp-next/issues/186)) ([c38493c](https://github.com/nodejs/gyp-next/commit/c38493c2556aa63b6dc40ab585c18aef5ca270d3))
+* No build_type in default_variables ([#183](https://github.com/nodejs/gyp-next/issues/183)) ([ac262fe](https://github.com/nodejs/gyp-next/commit/ac262fe82453c4e8dc47529338d157eb0b5ec0fb))
+
+
+### Documentation
+
+* README.md: Add pipx installation and run instructions ([#165](https://github.com/nodejs/gyp-next/issues/165)) ([4d28b15](https://github.com/nodejs/gyp-next/commit/4d28b155568dc35f11c7f86124d1dd42ba428bed))
+
## [0.14.0](https://github.com/nodejs/gyp-next/compare/v0.13.0...v0.14.0) (2022-10-08)
diff --git a/gyp/README.md b/gyp/README.md
index 9ffc2b21e8..be1d7b9ebf 100644
--- a/gyp/README.md
+++ b/gyp/README.md
@@ -5,3 +5,26 @@ Documents are available at [gyp.gsrc.io](https://gyp.gsrc.io), or you can check
__gyp-next__ is [released](https://github.com/nodejs/gyp-next/releases) to the [__Python Packaging Index__](https://pypi.org/project/gyp-next) (PyPI) and can be installed with the command:
* `python3 -m pip install gyp-next`
+
+When used as a command line utility, __gyp-next__ can also be installed with [pipx](https://pypa.github.io/pipx):
+* `pipx install gyp-next`
+```
+Installing to a new venv 'gyp-next'
+ installed package gyp-next 0.13.0, installed using Python 3.10.6
+ These apps are now globally available
+ - gyp
+done! ✨ 🌟 ✨
+```
+
+Or to run __gyp-next__ directly without installing it:
+* `pipx run gyp-next --help`
+```
+NOTE: running app 'gyp' from 'gyp-next'
+usage: usage: gyp [options ...] [build_file ...]
+
+options:
+ -h, --help show this help message and exit
+ --build CONFIGS configuration for build after project generation
+ --check check format of gyp files
+ [ ... ]
+```
diff --git a/gyp/pylib/gyp/MSVSNew.py b/gyp/pylib/gyp/MSVSNew.py
index d6b189760c..b051de46d3 100644
--- a/gyp/pylib/gyp/MSVSNew.py
+++ b/gyp/pylib/gyp/MSVSNew.py
@@ -285,19 +285,17 @@ def Write(self, writer=gyp.common.WriteOnDiff):
"\tEndProjectSection\r\n"
)
- if isinstance(e, MSVSFolder):
- if e.items:
- f.write("\tProjectSection(SolutionItems) = preProject\r\n")
- for i in e.items:
- f.write(f"\t\t{i} = {i}\r\n")
- f.write("\tEndProjectSection\r\n")
-
- if isinstance(e, MSVSProject):
- if e.dependencies:
- f.write("\tProjectSection(ProjectDependencies) = postProject\r\n")
- for d in e.dependencies:
- f.write(f"\t\t{d.get_guid()} = {d.get_guid()}\r\n")
- f.write("\tEndProjectSection\r\n")
+ if isinstance(e, MSVSFolder) and e.items:
+ f.write("\tProjectSection(SolutionItems) = preProject\r\n")
+ for i in e.items:
+ f.write(f"\t\t{i} = {i}\r\n")
+ f.write("\tEndProjectSection\r\n")
+
+ if isinstance(e, MSVSProject) and e.dependencies:
+ f.write("\tProjectSection(ProjectDependencies) = postProject\r\n")
+ for d in e.dependencies:
+ f.write(f"\t\t{d.get_guid()} = {d.get_guid()}\r\n")
+ f.write("\tEndProjectSection\r\n")
f.write("EndProject\r\n")
diff --git a/gyp/pylib/gyp/__init__.py b/gyp/pylib/gyp/__init__.py
index 2aa39d0318..d6cc01307d 100755
--- a/gyp/pylib/gyp/__init__.py
+++ b/gyp/pylib/gyp/__init__.py
@@ -108,7 +108,9 @@ def Load(
if default_variables["GENERATOR"] == "ninja":
default_variables.setdefault(
"PRODUCT_DIR_ABS",
- os.path.join(output_dir, "out", default_variables["build_type"]),
+ os.path.join(
+ output_dir, "out", default_variables.get("build_type", "default")
+ ),
)
else:
default_variables.setdefault(
@@ -622,7 +624,7 @@ def gyp_main(args):
if options.generator_flags:
gen_flags += options.generator_flags
generator_flags = NameValueListToDict(gen_flags)
- if DEBUG_GENERAL in gyp.debug.keys():
+ if DEBUG_GENERAL in gyp.debug:
DebugOutput(DEBUG_GENERAL, "generator_flags: %s", generator_flags)
# Generate all requested formats (use a set in case we got one format request
diff --git a/gyp/pylib/gyp/common.py b/gyp/pylib/gyp/common.py
index d77adee8af..b73a0c55b1 100644
--- a/gyp/pylib/gyp/common.py
+++ b/gyp/pylib/gyp/common.py
@@ -144,20 +144,16 @@ def RelativePath(path, relative_to, follow_path_symlink=True):
# symlink, this option has no effect.
# Convert to normalized (and therefore absolute paths).
- if follow_path_symlink:
- path = os.path.realpath(path)
- else:
- path = os.path.abspath(path)
+ path = os.path.realpath(path) if follow_path_symlink else os.path.abspath(path)
relative_to = os.path.realpath(relative_to)
# On Windows, we can't create a relative path to a different drive, so just
# use the absolute path.
- if sys.platform == "win32":
- if (
- os.path.splitdrive(path)[0].lower()
- != os.path.splitdrive(relative_to)[0].lower()
- ):
- return path
+ if sys.platform == "win32" and (
+ os.path.splitdrive(path)[0].lower()
+ != os.path.splitdrive(relative_to)[0].lower()
+ ):
+ return path
# Split the paths into components.
path_split = path.split(os.path.sep)
@@ -277,10 +273,7 @@ def EncodePOSIXShellArgument(argument):
if not isinstance(argument, str):
argument = str(argument)
- if _quote.search(argument):
- quote = '"'
- else:
- quote = ""
+ quote = '"' if _quote.search(argument) else ""
encoded = quote + re.sub(_escape, r"\\\1", argument) + quote
diff --git a/gyp/pylib/gyp/easy_xml_test.py b/gyp/pylib/gyp/easy_xml_test.py
index 342f693a32..c5808b846b 100755
--- a/gyp/pylib/gyp/easy_xml_test.py
+++ b/gyp/pylib/gyp/easy_xml_test.py
@@ -76,6 +76,7 @@ def test_EasyXml_complex(self):
'\'Debug|Win32\'" Label="Configuration">'
"Application"
"Unicode"
+ "SpectreLoadCF"
""
""
)
@@ -99,6 +100,7 @@ def test_EasyXml_complex(self):
},
["ConfigurationType", "Application"],
["CharacterSet", "Unicode"],
+ ["SpectreMitigation", "SpectreLoadCF"]
],
]
)
diff --git a/gyp/pylib/gyp/generator/analyzer.py b/gyp/pylib/gyp/generator/analyzer.py
index f15df00c36..810d181aea 100644
--- a/gyp/pylib/gyp/generator/analyzer.py
+++ b/gyp/pylib/gyp/generator/analyzer.py
@@ -433,7 +433,7 @@ def _GetUnqualifiedToTargetMapping(all_targets, to_find):
if not to_find:
return {}, []
to_find = set(to_find)
- for target_name in all_targets.keys():
+ for target_name in all_targets:
extracted = gyp.common.ParseQualifiedTarget(target_name)
if len(extracted) > 1 and extracted[1] in to_find:
to_find.remove(extracted[1])
diff --git a/gyp/pylib/gyp/generator/cmake.py b/gyp/pylib/gyp/generator/cmake.py
index c95d18415c..a6f772fe8c 100644
--- a/gyp/pylib/gyp/generator/cmake.py
+++ b/gyp/pylib/gyp/generator/cmake.py
@@ -929,10 +929,7 @@ def WriteTarget(
product_prefix = spec.get("product_prefix", default_product_prefix)
product_name = spec.get("product_name", default_product_name)
product_ext = spec.get("product_extension")
- if product_ext:
- product_ext = "." + product_ext
- else:
- product_ext = default_product_ext
+ product_ext = "." + product_ext if product_ext else default_product_ext
SetTargetProperty(output, cmake_target_name, "PREFIX", product_prefix)
SetTargetProperty(
diff --git a/gyp/pylib/gyp/generator/compile_commands_json.py b/gyp/pylib/gyp/generator/compile_commands_json.py
index f330a04dea..d4541291bb 100644
--- a/gyp/pylib/gyp/generator/compile_commands_json.py
+++ b/gyp/pylib/gyp/generator/compile_commands_json.py
@@ -34,7 +34,7 @@
def IsMac(params):
- return "mac" == gyp.common.GetFlavor(params)
+ return gyp.common.GetFlavor(params) == "mac"
def CalculateVariables(default_variables, params):
diff --git a/gyp/pylib/gyp/generator/eclipse.py b/gyp/pylib/gyp/generator/eclipse.py
index a851b4db75..52aeae6050 100644
--- a/gyp/pylib/gyp/generator/eclipse.py
+++ b/gyp/pylib/gyp/generator/eclipse.py
@@ -248,10 +248,7 @@ def GetAllDefines(target_list, target_dicts, data, config_name, params, compiler
continue
cpp_line_parts = cpp_line.split(" ", 2)
key = cpp_line_parts[1]
- if len(cpp_line_parts) >= 3:
- val = cpp_line_parts[2]
- else:
- val = "1"
+ val = cpp_line_parts[2] if len(cpp_line_parts) >= 3 else "1"
all_defines[key] = val
return all_defines
diff --git a/gyp/pylib/gyp/generator/make.py b/gyp/pylib/gyp/generator/make.py
index 05bb609d16..6530a38f18 100644
--- a/gyp/pylib/gyp/generator/make.py
+++ b/gyp/pylib/gyp/generator/make.py
@@ -681,10 +681,7 @@ def WriteRootHeaderSuffixRules(writer):
def Compilable(filename):
"""Return true if the file is compilable (should be in OBJS)."""
- for res in (filename.endswith(e) for e in COMPILABLE_EXTENSIONS):
- if res:
- return True
- return False
+ return any(res for res in (filename.endswith(e) for e in COMPILABLE_EXTENSIONS))
def Linkable(filename):
@@ -778,7 +775,7 @@ def __init__(self, generator_flags, flavor):
self.suffix_rules_objdir2 = {}
# Generate suffix rules for all compilable extensions.
- for ext in COMPILABLE_EXTENSIONS.keys():
+ for ext in COMPILABLE_EXTENSIONS:
# Suffix rules for source folder.
self.suffix_rules_srcdir.update(
{
diff --git a/gyp/pylib/gyp/generator/msvs.py b/gyp/pylib/gyp/generator/msvs.py
index fd95005784..85c354f765 100644
--- a/gyp/pylib/gyp/generator/msvs.py
+++ b/gyp/pylib/gyp/generator/msvs.py
@@ -164,7 +164,7 @@ def _FixPath(path, separator="\\"):
fixpath_prefix
and path
and not os.path.isabs(path)
- and not path[0] == "$"
+ and path[0] != "$"
and not _IsWindowsAbsPath(path)
):
path = os.path.join(fixpath_prefix, path)
@@ -283,7 +283,7 @@ def _ToolSetOrAppend(tools, tool_name, setting, value, only_if_unset=False):
if not tools.get(tool_name):
tools[tool_name] = dict()
tool = tools[tool_name]
- if "CompileAsWinRT" == setting:
+ if setting == "CompileAsWinRT":
return
if tool.get(setting):
if only_if_unset:
@@ -412,10 +412,7 @@ def _BuildCommandLineForRuleRaw(
return input_dir_preamble + cmd
else:
# Convert cat --> type to mimic unix.
- if cmd[0] == "cat":
- command = ["type"]
- else:
- command = [cmd[0].replace("/", "\\")]
+ command = ["type"] if cmd[0] == "cat" else [cmd[0].replace("/", "\\")]
# Add call before command to ensure that commands can be tied together one
# after the other without aborting in Incredibuild, since IB makes a bat
# file out of the raw command string, and some commands (like python) are
@@ -1384,10 +1381,7 @@ def _GetDefines(config):
"""
defines = []
for d in config.get("defines", []):
- if type(d) == list:
- fd = "=".join([str(dpart) for dpart in d])
- else:
- fd = str(d)
+ fd = "=".join([str(dpart) for dpart in d]) if isinstance(d, list) else str(d)
defines.append(fd)
return defines
@@ -1598,10 +1592,7 @@ def _IdlFilesHandledNonNatively(spec, sources):
if rule["extension"] == "idl" and int(rule.get("msvs_external_rule", 0)):
using_idl = True
break
- if using_idl:
- excluded_idl = [i for i in sources if i.endswith(".idl")]
- else:
- excluded_idl = []
+ excluded_idl = [i for i in sources if i.endswith(".idl")] if using_idl else []
return excluded_idl
@@ -3015,16 +3006,19 @@ def _GetMSBuildConfigurationDetails(spec, build_file):
character_set = msbuild_attributes.get("CharacterSet")
config_type = msbuild_attributes.get("ConfigurationType")
_AddConditionalProperty(properties, condition, "ConfigurationType", config_type)
+ spectre_mitigation = msbuild_attributes.get('SpectreMitigation')
+ if spectre_mitigation:
+ _AddConditionalProperty(properties, condition, "SpectreMitigation",
+ spectre_mitigation)
if config_type == "Driver":
_AddConditionalProperty(properties, condition, "DriverType", "WDM")
_AddConditionalProperty(
properties, condition, "TargetVersion", _ConfigTargetVersion(settings)
)
- if character_set:
- if "msvs_enable_winrt" not in spec:
- _AddConditionalProperty(
- properties, condition, "CharacterSet", character_set
- )
+ if character_set and "msvs_enable_winrt" not in spec:
+ _AddConditionalProperty(
+ properties, condition, "CharacterSet", character_set
+ )
return _GetMSBuildPropertyGroup(spec, "Configuration", properties)
@@ -3104,6 +3098,8 @@ def _ConvertMSVSBuildAttributes(spec, config, build_file):
msbuild_attributes[a] = _ConvertMSVSCharacterSet(msvs_attributes[a])
elif a == "ConfigurationType":
msbuild_attributes[a] = _ConvertMSVSConfigurationType(msvs_attributes[a])
+ elif a == "SpectreMitigation":
+ msbuild_attributes[a] = msvs_attributes[a]
else:
print("Warning: Do not know how to convert MSVS attribute " + a)
return msbuild_attributes
@@ -3326,15 +3322,14 @@ def _GetMSBuildToolSettingsSections(spec, configurations):
for tool_name, tool_settings in sorted(msbuild_settings.items()):
# Skip the tool named '' which is a holder of global settings handled
# by _GetMSBuildConfigurationGlobalProperties.
- if tool_name:
- if tool_settings:
- tool = [tool_name]
- for name, value in sorted(tool_settings.items()):
- formatted_value = _GetValueFormattedForMSBuild(
- tool_name, name, value
- )
- tool.append([name, formatted_value])
- group.append(tool)
+ if tool_name and tool_settings:
+ tool = [tool_name]
+ for name, value in sorted(tool_settings.items()):
+ formatted_value = _GetValueFormattedForMSBuild(
+ tool_name, name, value
+ )
+ tool.append([name, formatted_value])
+ group.append(tool)
groups.append(group)
return groups
@@ -3462,10 +3457,7 @@ def _GetValueFormattedForMSBuild(tool_name, name, value):
"Link": ["AdditionalOptions"],
"Lib": ["AdditionalOptions"],
}
- if tool_name in exceptions and name in exceptions[tool_name]:
- char = " "
- else:
- char = ";"
+ char = " " if name in exceptions.get(tool_name, []) else ";"
formatted_value = char.join(
[MSVSSettings.ConvertVCMacrosToMSBuild(i) for i in value]
)
diff --git a/gyp/pylib/gyp/generator/ninja.py b/gyp/pylib/gyp/generator/ninja.py
index ca04ee13a1..3644b266c4 100644
--- a/gyp/pylib/gyp/generator/ninja.py
+++ b/gyp/pylib/gyp/generator/ninja.py
@@ -1815,10 +1815,7 @@ def ComputeOutputFileName(self, spec, type=None):
"executable": default_variables["EXECUTABLE_SUFFIX"],
}
extension = spec.get("product_extension")
- if extension:
- extension = "." + extension
- else:
- extension = DEFAULT_EXTENSION.get(type, "")
+ extension = "." + extension if extension else DEFAULT_EXTENSION.get(type, "")
if "product_name" in spec:
# If we were given an explicit name, use that.
diff --git a/gyp/pylib/gyp/generator/xcode.py b/gyp/pylib/gyp/generator/xcode.py
index 2f4d17e514..1ac672c387 100644
--- a/gyp/pylib/gyp/generator/xcode.py
+++ b/gyp/pylib/gyp/generator/xcode.py
@@ -439,7 +439,7 @@ def Finalize2(self, xcode_targets, xcode_target_to_target_dict):
# it opens the project file, which will result in unnecessary diffs.
# TODO(mark): This is evil because it relies on internal knowledge of
# PBXProject._other_pbxprojects.
- for other_pbxproject in self.project._other_pbxprojects.keys():
+ for other_pbxproject in self.project._other_pbxprojects:
self.project.AddOrGetProjectReference(other_pbxproject)
self.project.SortRemoteProductReferences()
@@ -1118,10 +1118,7 @@ def GenerateOutput(target_list, target_dicts, data, params):
for concrete_output_index, concrete_output in enumerate(
concrete_outputs
):
- if concrete_output_index == 0:
- bol = ""
- else:
- bol = " "
+ bol = "" if concrete_output_index == 0 else " "
makefile.write(f"{bol}{concrete_output} \\\n")
concrete_output_dir = posixpath.dirname(concrete_output)
diff --git a/gyp/pylib/gyp/input.py b/gyp/pylib/gyp/input.py
index d9699a0a50..b6464e98d2 100644
--- a/gyp/pylib/gyp/input.py
+++ b/gyp/pylib/gyp/input.py
@@ -225,7 +225,7 @@ def LoadOneBuildFile(build_file_path, data, aux_data, includes, is_target, check
return data[build_file_path]
if os.path.exists(build_file_path):
- build_file_contents = open(build_file_path, encoding='utf-8').read()
+ build_file_contents = open(build_file_path, encoding="utf-8").read()
else:
raise GypError(f"{build_file_path} not found (cwd: {os.getcwd()})")
@@ -870,10 +870,7 @@ def ExpandVariables(input, phase, variables, build_file):
# This works around actions/rules which have more inputs than will
# fit on the command line.
if file_list:
- if type(contents) is list:
- contents_list = contents
- else:
- contents_list = contents.split(" ")
+ contents_list = contents if type(contents) is list else contents.split(" ")
replacement = contents_list[0]
if os.path.isabs(replacement):
raise GypError('| cannot handle absolute paths, got "%s"' % replacement)
@@ -1630,15 +1627,14 @@ def RemoveSelfDependencies(targets):
dependencies = target_dict.get(dependency_key, [])
if dependencies:
for t in dependencies:
- if t == target_name:
- if (
- targets[t]
- .get("variables", {})
- .get("prune_self_dependency", 0)
- ):
- target_dict[dependency_key] = Filter(
- dependencies, target_name
- )
+ if t == target_name and (
+ targets[t]
+ .get("variables", {})
+ .get("prune_self_dependency", 0)
+ ):
+ target_dict[dependency_key] = Filter(
+ dependencies, target_name
+ )
def RemoveLinkDependenciesFromNoneTargets(targets):
@@ -2238,10 +2234,7 @@ def is_in_set_or_list(x, s, items):
singleton = False
if type(item) in (str, int):
# The cheap and easy case.
- if is_paths:
- to_item = MakePathRelative(to_file, fro_file, item)
- else:
- to_item = item
+ to_item = MakePathRelative(to_file, fro_file, item) if is_paths else item
if not (type(item) is str and item.startswith("-")):
# Any string that doesn't begin with a "-" is a singleton - it can
@@ -2467,10 +2460,7 @@ def SetUpConfigurations(target, target_dict):
new_configuration_dict = {}
for (key, target_val) in target_dict.items():
key_ext = key[-1:]
- if key_ext in key_suffixes:
- key_base = key[:-1]
- else:
- key_base = key
+ key_base = key[:-1] if key_ext in key_suffixes else key
if key_base not in non_configuration_keys:
new_configuration_dict[key] = gyp.simple_copy.deepcopy(target_val)
@@ -2482,7 +2472,7 @@ def SetUpConfigurations(target, target_dict):
merged_configurations[configuration] = new_configuration_dict
# Put the new configurations back into the target dict as a configuration.
- for configuration in merged_configurations.keys():
+ for configuration in merged_configurations:
target_dict["configurations"][configuration] = merged_configurations[
configuration
]
@@ -2499,19 +2489,16 @@ def SetUpConfigurations(target, target_dict):
delete_keys = []
for key in target_dict:
key_ext = key[-1:]
- if key_ext in key_suffixes:
- key_base = key[:-1]
- else:
- key_base = key
+ key_base = key[:-1] if key_ext in key_suffixes else key
if key_base not in non_configuration_keys:
delete_keys.append(key)
for key in delete_keys:
del target_dict[key]
# Check the configurations to see if they contain invalid keys.
- for configuration in target_dict["configurations"].keys():
+ for configuration in target_dict["configurations"]:
configuration_dict = target_dict["configurations"][configuration]
- for key in configuration_dict.keys():
+ for key in configuration_dict:
if key in invalid_configuration_keys:
raise GypError(
"%s not allowed in the %s configuration, found in "
diff --git a/gyp/pylib/gyp/msvs_emulation.py b/gyp/pylib/gyp/msvs_emulation.py
index 5b9c2712e0..b9748d8be2 100644
--- a/gyp/pylib/gyp/msvs_emulation.py
+++ b/gyp/pylib/gyp/msvs_emulation.py
@@ -93,7 +93,7 @@ def _AddPrefix(element, prefix):
if element is None:
return element
# Note, not Iterable because we don't want to handle strings like that.
- if isinstance(element, list) or isinstance(element, tuple):
+ if isinstance(element, (list, tuple)):
return [prefix + e for e in element]
else:
return prefix + element
@@ -105,7 +105,7 @@ def _DoRemapping(element, map):
if map is not None and element is not None:
if not callable(map):
map = map.get # Assume it's a dict, otherwise a callable to do the remap.
- if isinstance(element, list) or isinstance(element, tuple):
+ if isinstance(element, (list, tuple)):
element = filter(None, [map(elem) for elem in element])
else:
element = map(element)
@@ -117,7 +117,7 @@ def _AppendOrReturn(append, element):
then add |element| to it, adding each item in |element| if it's a list or
tuple."""
if append is not None and element is not None:
- if isinstance(element, list) or isinstance(element, tuple):
+ if isinstance(element, (list, tuple)):
append.extend(element)
else:
append.append(element)
@@ -255,10 +255,7 @@ def GetVSMacroEnv(self, base_to_build=None, config=None):
"""Get a dict of variables mapping internal VS macro names to their gyp
equivalents."""
target_arch = self.GetArch(config)
- if target_arch == "x86":
- target_platform = "Win32"
- else:
- target_platform = target_arch
+ target_platform = "Win32" if target_arch == "x86" else target_arch
target_name = self.spec.get("product_prefix", "") + self.spec.get(
"product_name", self.spec["target_name"]
)
@@ -738,10 +735,7 @@ def GetLdflags(
# TODO(scottmg): This should sort of be somewhere else (not really a flag).
ld("AdditionalDependencies", prefix="")
- if self.GetArch(config) == "x86":
- safeseh_default = "true"
- else:
- safeseh_default = None
+ safeseh_default = "true" if self.GetArch(config) == "x86" else None
ld(
"ImageHasSafeExceptionHandlers",
map={"false": ":NO", "true": ""},
@@ -960,10 +954,7 @@ def GetRuleShellFlags(self, rule):
def _HasExplicitRuleForExtension(self, spec, extension):
"""Determine if there's an explicit rule for a particular extension."""
- for rule in spec.get("rules", []):
- if rule["extension"] == extension:
- return True
- return False
+ return any(rule["extension"] == extension for rule in spec.get("rules", []))
def _HasExplicitIdlActions(self, spec):
"""Determine if an action should not run midl for .idl files."""
diff --git a/gyp/pylib/gyp/win_tool.py b/gyp/pylib/gyp/win_tool.py
index 638eee4002..171d729574 100755
--- a/gyp/pylib/gyp/win_tool.py
+++ b/gyp/pylib/gyp/win_tool.py
@@ -219,11 +219,10 @@ def ExecLinkWithManifests(
our_manifest = "%(out)s.manifest" % variables
# Load and normalize the manifests. mt.exe sometimes removes whitespace,
# and sometimes doesn't unfortunately.
- with open(our_manifest) as our_f:
- with open(assert_manifest) as assert_f:
- translator = str.maketrans('', '', string.whitespace)
- our_data = our_f.read().translate(translator)
- assert_data = assert_f.read().translate(translator)
+ with open(our_manifest) as our_f, open(assert_manifest) as assert_f:
+ translator = str.maketrans("", "", string.whitespace)
+ our_data = our_f.read().translate(translator)
+ assert_data = assert_f.read().translate(translator)
if our_data != assert_data:
os.unlink(out)
diff --git a/gyp/pylib/gyp/xcode_emulation.py b/gyp/pylib/gyp/xcode_emulation.py
index a75d8eeab7..29caf1ce7f 100644
--- a/gyp/pylib/gyp/xcode_emulation.py
+++ b/gyp/pylib/gyp/xcode_emulation.py
@@ -685,10 +685,7 @@ def GetCflags(self, configname, arch=None):
if platform_root:
cflags.append("-F" + platform_root + "/Developer/Library/Frameworks/")
- if sdk_root:
- framework_root = sdk_root
- else:
- framework_root = ""
+ framework_root = sdk_root if sdk_root else ""
config = self.spec["configurations"][self.configname]
framework_dirs = config.get("mac_framework_dirs", [])
for directory in framework_dirs:
@@ -1248,10 +1245,7 @@ def _AdjustLibrary(self, library, config_name=None):
l_flag = "-framework " + os.path.splitext(os.path.basename(library))[0]
else:
m = self.library_re.match(library)
- if m:
- l_flag = "-l" + m.group(1)
- else:
- l_flag = library
+ l_flag = "-l" + m.group(1) if m else library
sdk_root = self._SdkPath(config_name)
if not sdk_root:
@@ -1545,7 +1539,7 @@ def CLTVersion():
except GypError:
continue
- regex = re.compile(r'Command Line Tools for Xcode\s+(?P\S+)')
+ regex = re.compile(r"Command Line Tools for Xcode\s+(?P\S+)")
try:
output = GetStdout(["/usr/sbin/softwareupdate", "--history"])
return re.search(regex, output).groupdict()["version"]
diff --git a/gyp/pylib/gyp/xcodeproj_file.py b/gyp/pylib/gyp/xcodeproj_file.py
index 4e0ec5e882..bd56856a3e 100644
--- a/gyp/pylib/gyp/xcodeproj_file.py
+++ b/gyp/pylib/gyp/xcodeproj_file.py
@@ -2355,9 +2355,8 @@ def __init__(
# property was supplied, set "productName" if it is not present. Also set
# the "PRODUCT_NAME" build setting in each configuration, but only if
# the setting is not present in any build configuration.
- if "name" in self._properties:
- if "productName" not in self._properties:
- self.SetProperty("productName", self._properties["name"])
+ if "name" in self._properties and "productName" not in self._properties:
+ self.SetProperty("productName", self._properties["name"])
if "productName" in self._properties:
if "buildConfigurationList" in self._properties:
@@ -2551,9 +2550,8 @@ def __init__(
== "com.apple.product-type-bundle.unit.test"
or self._properties["productType"]
== "com.apple.product-type-bundle.ui-testing"
- ):
- if force_extension is None:
- force_extension = suffix[1:]
+ ) and force_extension is None:
+ force_extension = suffix[1:]
if force_extension is not None:
# If it's a wrapper (bundle), set WRAPPER_EXTENSION.
@@ -2636,10 +2634,13 @@ def HeadersPhase(self):
# frameworks phases, if any.
insert_at = len(self._properties["buildPhases"])
for index, phase in enumerate(self._properties["buildPhases"]):
- if (
- isinstance(phase, PBXResourcesBuildPhase)
- or isinstance(phase, PBXSourcesBuildPhase)
- or isinstance(phase, PBXFrameworksBuildPhase)
+ if isinstance(
+ phase,
+ (
+ PBXResourcesBuildPhase,
+ PBXSourcesBuildPhase,
+ PBXFrameworksBuildPhase,
+ ),
):
insert_at = index
break
@@ -2658,9 +2659,7 @@ def ResourcesPhase(self):
# phases, if any.
insert_at = len(self._properties["buildPhases"])
for index, phase in enumerate(self._properties["buildPhases"]):
- if isinstance(phase, PBXSourcesBuildPhase) or isinstance(
- phase, PBXFrameworksBuildPhase
- ):
+ if isinstance(phase, (PBXSourcesBuildPhase, PBXFrameworksBuildPhase)):
insert_at = index
break
@@ -2770,7 +2769,7 @@ def __init__(self, properties=None, id=None, parent=None, path=None):
self.path = path
self._other_pbxprojects = {}
# super
- XCContainerPortal.__init__(self, properties, id, parent)
+ return XCContainerPortal.__init__(self, properties, id, parent)
def Name(self):
name = self.path
diff --git a/gyp/pyproject.toml b/gyp/pyproject.toml
index d8a5451520..3c48fb74bf 100644
--- a/gyp/pyproject.toml
+++ b/gyp/pyproject.toml
@@ -4,14 +4,14 @@ build-backend = "setuptools.build_meta"
[project]
name = "gyp-next"
-version = "0.14.0"
+version = "0.15.0"
authors = [
{ name="Node.js contributors", email="ryzokuken@disroot.org" },
]
description = "A fork of the GYP build system for use in the Node.js projects"
readme = "README.md"
license = { file="LICENSE" }
-requires-python = ">=3.6"
+requires-python = ">=3.7"
classifiers = [
"Development Status :: 3 - Alpha",
"Environment :: Console",
@@ -20,15 +20,15 @@ classifiers = [
"Natural Language :: English",
"Programming Language :: Python",
"Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
+ "Programming Language :: Python :: 3.11",
]
[project.optional-dependencies]
-dev = ["flake8", "pytest"]
+dev = ["flake8", "ruff", "pytest"]
[project.scripts]
gyp = "gyp:script_main"
@@ -36,6 +36,23 @@ gyp = "gyp:script_main"
[project.urls]
"Homepage" = "https://github.com/nodejs/gyp-next"
+[tool.ruff]
+line-length = 88
+select = [
+ "C9",
+ "E",
+ "F",
+ "PLC",
+ "PLE",
+ "PLW",
+ "Q",
+ "W",
+ ]
+ target-version = "py37"
+
+ [tool.ruff.mccabe]
+ max-complexity = 101
+
[tool.setuptools]
package-dir = {"" = "pylib"}
packages = ["gyp", "gyp.generator"]
From cd68413c2c6aa5076453165d5afa0e91f30d2be0 Mon Sep 17 00:00:00 2001
From: Raymond Zhao <7199958+rzhao271@users.noreply.github.com>
Date: Thu, 6 Apr 2023 12:51:27 -0700
Subject: [PATCH 2/5] Reapply suggestion
---
gyp/.github/workflows/Python_tests.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/gyp/.github/workflows/Python_tests.yml b/gyp/.github/workflows/Python_tests.yml
index d92c0dc942..063e4bdd3d 100644
--- a/gyp/.github/workflows/Python_tests.yml
+++ b/gyp/.github/workflows/Python_tests.yml
@@ -31,7 +31,7 @@ jobs:
- name: Lint with flake8
run: flake8 . --ignore=E203,W503 --max-complexity=101 --max-line-length=88 --show-source --statistics
- name: Lint with ruff # See pyproject.toml for settings
- run: flake8 .
+ run: ruff .
- name: Test with pytest # See pyproject.toml for settings
run: pytest
# - name: Run doctests with pytest
From 63451d9dc58c367babf1534205fa33d27b08eba4 Mon Sep 17 00:00:00 2001
From: Raymond Zhao <7199958+rzhao271@users.noreply.github.com>
Date: Mon, 1 May 2023 10:38:09 -0700
Subject: [PATCH 3/5] Fix lint error
---
gyp/pylib/gyp/xcodeproj_file.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/gyp/pylib/gyp/xcodeproj_file.py b/gyp/pylib/gyp/xcodeproj_file.py
index bd56856a3e..fe7c3dfc30 100644
--- a/gyp/pylib/gyp/xcodeproj_file.py
+++ b/gyp/pylib/gyp/xcodeproj_file.py
@@ -2769,7 +2769,7 @@ def __init__(self, properties=None, id=None, parent=None, path=None):
self.path = path
self._other_pbxprojects = {}
# super
- return XCContainerPortal.__init__(self, properties, id, parent)
+ XCContainerPortal.__init__(self, properties, id, parent)
def Name(self):
name = self.path
From 74048cb4599523fd1ab4c6e682999ad8287614f9 Mon Sep 17 00:00:00 2001
From: Raymond Zhao <7199958+rzhao271@users.noreply.github.com>
Date: Mon, 1 May 2023 11:18:48 -0700
Subject: [PATCH 4/5] Revert "Fix lint error"
This reverts commit 314fbaf02d5c16cb3a11df3bf127908b572aaaaa.
---
gyp/pylib/gyp/xcodeproj_file.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/gyp/pylib/gyp/xcodeproj_file.py b/gyp/pylib/gyp/xcodeproj_file.py
index fe7c3dfc30..bd56856a3e 100644
--- a/gyp/pylib/gyp/xcodeproj_file.py
+++ b/gyp/pylib/gyp/xcodeproj_file.py
@@ -2769,7 +2769,7 @@ def __init__(self, properties=None, id=None, parent=None, path=None):
self.path = path
self._other_pbxprojects = {}
# super
- XCContainerPortal.__init__(self, properties, id, parent)
+ return XCContainerPortal.__init__(self, properties, id, parent)
def Name(self):
name = self.path
From 92dd58ff60ca0194e80a2647291dba66ca5bdf24 Mon Sep 17 00:00:00 2001
From: Raymond Zhao <7199958+rzhao271@users.noreply.github.com>
Date: Mon, 2 Oct 2023 10:04:10 -0700
Subject: [PATCH 5/5] Remove explicit return
---
gyp/pylib/gyp/xcodeproj_file.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/gyp/pylib/gyp/xcodeproj_file.py b/gyp/pylib/gyp/xcodeproj_file.py
index bd56856a3e..fe7c3dfc30 100644
--- a/gyp/pylib/gyp/xcodeproj_file.py
+++ b/gyp/pylib/gyp/xcodeproj_file.py
@@ -2769,7 +2769,7 @@ def __init__(self, properties=None, id=None, parent=None, path=None):
self.path = path
self._other_pbxprojects = {}
# super
- return XCContainerPortal.__init__(self, properties, id, parent)
+ XCContainerPortal.__init__(self, properties, id, parent)
def Name(self):
name = self.path