aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mesonbuild/backend/ninjabackend.py27
-rw-r--r--mesonbuild/scripts/depscan.py10
2 files changed, 24 insertions, 13 deletions
diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py
index 9b249c3..fb0e77b 100644
--- a/mesonbuild/backend/ninjabackend.py
+++ b/mesonbuild/backend/ninjabackend.py
@@ -11,18 +11,20 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
-import typing as T
+
+from collections import OrderedDict
+from enum import Enum, unique
+from functools import lru_cache
+from pathlib import PurePath, Path
+from textwrap import dedent
+import itertools
+import json
import os
-import re
import pickle
+import re
import shlex
import subprocess
-from collections import OrderedDict
-from enum import Enum, unique
-import itertools
-from textwrap import dedent
-from pathlib import PurePath, Path
-from functools import lru_cache
+import typing as T
from . import backends
from .. import modules
@@ -915,9 +917,16 @@ class NinjaBackend(backends.Backend):
pickle_base = target.name + '.dat'
pickle_file = os.path.join(self.get_target_private_dir(target), pickle_base).replace('\\', '/')
pickle_abs = os.path.join(self.get_target_private_dir_abs(target), pickle_base).replace('\\', '/')
+ json_abs = os.path.join(self.get_target_private_dir_abs(target), f'{target.name}-deps.json').replace('\\', '/')
rule_name = 'depscan'
scan_sources = self.select_sources_to_scan(compiled_sources)
- elem = NinjaBuildElement(self.all_outputs, depscan_file, rule_name, scan_sources)
+
+ # Dump the sources as a json list. This avoids potential probllems where
+ # the number of sources passed to depscan exceedes the limit imposed by
+ # the OS.
+ with open(json_abs, 'w', encoding='utf-8') as f:
+ json.dump(scan_sources, f)
+ elem = NinjaBuildElement(self.all_outputs, depscan_file, rule_name, json_abs)
elem.add_item('picklefile', pickle_file)
scaninfo = TargetDependencyScannerInfo(self.get_target_private_dir(target), source2object)
with open(pickle_abs, 'wb') as p:
diff --git a/mesonbuild/scripts/depscan.py b/mesonbuild/scripts/depscan.py
index 9fc435b..68e7dc4 100644
--- a/mesonbuild/scripts/depscan.py
+++ b/mesonbuild/scripts/depscan.py
@@ -12,10 +12,11 @@
# See the License for the specific language governing permissions and
# limitations under the License.
+import json
+import os
import pathlib
import pickle
import re
-import os
import sys
import typing as T
@@ -194,8 +195,9 @@ class DependencyScanner:
return 0
def run(args: T.List[str]) -> int:
- pickle_file = args[0]
- outfile = args[1]
- sources = args[2:]
+ assert len(args) == 3, 'got wrong number of arguments!'
+ pickle_file, outfile, jsonfile = args
+ with open(jsonfile, 'r', encoding='utf-8') as f:
+ sources = json.load(f)
scanner = DependencyScanner(pickle_file, outfile, sources)
return scanner.scan()