diff --git a/devel/meson/Makefile b/devel/meson/Makefile index 3650d2e91..8c1a5ef3d 100644 --- a/devel/meson/Makefile +++ b/devel/meson/Makefile @@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=meson PKG_VERSION:=0.55.0 -PKG_RELEASE:=1 +PKG_RELEASE:=2 PYPI_NAME:=meson PKG_HASH:=0a1ae2bfe2ae14ac47593537f93290fb79e9b775c55b4c53c282bc3ca3745b35 diff --git a/devel/meson/patches/010-no-distutils.patch b/devel/meson/patches/010-no-distutils.patch deleted file mode 100644 index fec648401..000000000 --- a/devel/meson/patches/010-no-distutils.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 18955611bafb1924fd1e188359f62d0799acb77e Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Hugo=20Beauz=C3=A9e-Luyssen?= -Date: Fri, 24 Apr 2020 15:40:01 +0200 -Subject: [PATCH] modules: python: Fix python detection without distutils - module - -If distutils isn't present but not required by the called, we can still -return a valid python installation ---- - mesonbuild/modules/python.py | 13 ++++++++----- - 1 file changed, 8 insertions(+), 5 deletions(-) - -diff --git a/mesonbuild/modules/python.py b/mesonbuild/modules/python.py -index a5c58a25c3..31406847a3 100644 ---- a/mesonbuild/modules/python.py -+++ b/mesonbuild/modules/python.py -@@ -266,10 +266,13 @@ import sys - install_paths = sysconfig.get_paths(scheme='posix_prefix', vars={'base': '', 'platbase': '', 'installed_base': ''}) - - def links_against_libpython(): -- from distutils.core import Distribution, Extension -- cmd = Distribution().get_command_obj('build_ext') -- cmd.ensure_finalized() -- return bool(cmd.get_libraries(Extension('dummy', []))) -+ try: -+ from distutils.core import Distribution, Extension -+ cmd = Distribution().get_command_obj('build_ext') -+ cmd.ensure_finalized() -+ return bool(cmd.get_libraries(Extension('dummy', []))) -+ except ModuleNotFoundError: -+ return False - - print (json.dumps ({ - 'variables': sysconfig.get_config_vars(), -@@ -585,7 +588,7 @@ class PythonModule(ExtensionModule): - else: - res = ExternalProgramHolder(NonExistingExternalProgram(), state.subproject) - if required: -- raise mesonlib.MesonException('{} is not a valid python or it is missing setuptools'.format(python)) -+ raise mesonlib.MesonException('{} is not a valid python'.format(python)) - - return res - diff --git a/devel/meson/patches/010-no-setuptools.patch b/devel/meson/patches/010-no-setuptools.patch new file mode 100644 index 000000000..71e97ed9e --- /dev/null +++ b/devel/meson/patches/010-no-setuptools.patch @@ -0,0 +1,685 @@ +From 019ed04331695bb6f5c5fff70dfced34c4ba9012 Mon Sep 17 00:00:00 2001 +From: Daniel Mensinger +Date: Thu, 16 Jul 2020 20:29:34 +0200 +Subject: [PATCH 1/3] mdata: Generate mesondata.py from */data folders + +--- + mesonbuild/mesondata.py | 374 ++++++++++++++++++++++++++++++++++++++++ + tools/gen_data.py | 139 +++++++++++++++ + 2 files changed, 513 insertions(+) + create mode 100644 mesonbuild/mesondata.py + create mode 100755 tools/gen_data.py + +diff --git a/mesonbuild/mesondata.py b/mesonbuild/mesondata.py +new file mode 100644 +index 0000000000..1f223c251b +--- /dev/null ++++ b/mesonbuild/mesondata.py +@@ -0,0 +1,374 @@ ++# Copyright 2020 The Meson development team ++ ++# Licensed under the Apache License, Version 2.0 (the "License"); ++# you may not use this file except in compliance with the License. ++# You may obtain a copy of the License at ++ ++# http://www.apache.org/licenses/LICENSE-2.0 ++ ++# Unless required by applicable law or agreed to in writing, software ++# distributed under the License is distributed on an "AS IS" BASIS, ++# 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. ++ ++ ++#### ++#### WARNING: This is an automatically generated file! Do not edit! ++#### Generated by tools/gen_data.py ++#### ++ ++ ++from pathlib import Path ++import typing as T ++ ++if T.TYPE_CHECKING: ++ from .environment import Environment ++ ++###################### ++# BEGIN Data section # ++###################### ++ ++file_0_data_CMakeListsLLVM_txt = '''\ ++cmake_minimum_required(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION} ) ++ ++set(PACKAGE_FOUND FALSE) ++ ++while(TRUE) ++ find_package(LLVM REQUIRED CONFIG QUIET) ++ ++ # ARCHS has to be set via the CMD interface ++ if(LLVM_FOUND OR "${ARCHS}" STREQUAL "") ++ break() ++ endif() ++ ++ list(GET ARCHS 0 CMAKE_LIBRARY_ARCHITECTURE) ++ list(REMOVE_AT ARCHS 0) ++endwhile() ++ ++if(LLVM_FOUND) ++ set(PACKAGE_FOUND TRUE) ++ ++ foreach(mod IN LISTS LLVM_MESON_MODULES) ++ # Reset variables ++ set(out_mods) ++ set(real_mods) ++ ++ # Generate a lower and upper case version ++ string(TOLOWER "${mod}" mod_L) ++ string(TOUPPER "${mod}" mod_U) ++ ++ # Get the mapped components ++ llvm_map_components_to_libnames(out_mods ${mod} ${mod_L} ${mod_U}) ++ list(SORT out_mods) ++ list(REMOVE_DUPLICATES out_mods) ++ ++ # Make sure that the modules exist ++ foreach(i IN LISTS out_mods) ++ if(TARGET ${i}) ++ list(APPEND real_mods ${i}) ++ endif() ++ endforeach() ++ ++ # Set the output variables ++ set(MESON_LLVM_TARGETS_${mod} ${real_mods}) ++ foreach(i IN LISTS real_mods) ++ set(MESON_TARGET_TO_LLVM_${i} ${mod}) ++ endforeach() ++ endforeach() ++ ++ # Check the following variables: ++ # LLVM_PACKAGE_VERSION ++ # LLVM_VERSION ++ # LLVM_VERSION_STRING ++ if(NOT DEFINED PACKAGE_VERSION) ++ if(DEFINED LLVM_PACKAGE_VERSION) ++ set(PACKAGE_VERSION "${LLVM_PACKAGE_VERSION}") ++ elseif(DEFINED LLVM_VERSION) ++ set(PACKAGE_VERSION "${LLVM_VERSION}") ++ elseif(DEFINED LLVM_VERSION_STRING) ++ set(PACKAGE_VERSION "${LLVM_VERSION_STRING}") ++ endif() ++ endif() ++ ++ # Check the following variables: ++ # LLVM_LIBRARIES ++ # LLVM_LIBS ++ set(libs) ++ if(DEFINED LLVM_LIBRARIES) ++ set(libs LLVM_LIBRARIES) ++ elseif(DEFINED LLVM_LIBS) ++ set(libs LLVM_LIBS) ++ endif() ++ ++ # Check the following variables: ++ # LLVM_INCLUDE_DIRS ++ # LLVM_INCLUDES ++ # LLVM_INCLUDE_DIR ++ set(includes) ++ if(DEFINED LLVM_INCLUDE_DIRS) ++ set(includes LLVM_INCLUDE_DIRS) ++ elseif(DEFINED LLVM_INCLUDES) ++ set(includes LLVM_INCLUDES) ++ elseif(DEFINED LLVM_INCLUDE_DIR) ++ set(includes LLVM_INCLUDE_DIR) ++ endif() ++ ++ # Check the following variables: ++ # LLVM_DEFINITIONS ++ set(definitions) ++ if(DEFINED LLVM_DEFINITIONS) ++ set(definitions LLVM_DEFINITIONS) ++ endif() ++ ++ set(PACKAGE_INCLUDE_DIRS "${${includes}}") ++ set(PACKAGE_DEFINITIONS "${${definitions}}") ++ set(PACKAGE_LIBRARIES "${${libs}}") ++endif() ++''' ++ ++file_1_data_CMakePathInfo_txt = '''\ ++cmake_minimum_required(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}) ++ ++set(TMP_PATHS_LIST) ++list(APPEND TMP_PATHS_LIST ${CMAKE_PREFIX_PATH}) ++list(APPEND TMP_PATHS_LIST ${CMAKE_FRAMEWORK_PATH}) ++list(APPEND TMP_PATHS_LIST ${CMAKE_APPBUNDLE_PATH}) ++list(APPEND TMP_PATHS_LIST $ENV{CMAKE_PREFIX_PATH}) ++list(APPEND TMP_PATHS_LIST $ENV{CMAKE_FRAMEWORK_PATH}) ++list(APPEND TMP_PATHS_LIST $ENV{CMAKE_APPBUNDLE_PATH}) ++list(APPEND TMP_PATHS_LIST ${CMAKE_SYSTEM_PREFIX_PATH}) ++list(APPEND TMP_PATHS_LIST ${CMAKE_SYSTEM_FRAMEWORK_PATH}) ++list(APPEND TMP_PATHS_LIST ${CMAKE_SYSTEM_APPBUNDLE_PATH}) ++ ++set(LIB_ARCH_LIST) ++if(CMAKE_LIBRARY_ARCHITECTURE_REGEX) ++ file(GLOB implicit_dirs RELATIVE /lib /lib/*-linux-gnu* ) ++ foreach(dir ${implicit_dirs}) ++ if("${dir}" MATCHES "${CMAKE_LIBRARY_ARCHITECTURE_REGEX}") ++ list(APPEND LIB_ARCH_LIST "${dir}") ++ endif() ++ endforeach() ++endif() ++ ++# "Export" these variables: ++set(MESON_ARCH_LIST ${LIB_ARCH_LIST}) ++set(MESON_PATHS_LIST ${TMP_PATHS_LIST}) ++set(MESON_CMAKE_ROOT ${CMAKE_ROOT}) ++set(MESON_CMAKE_SYSROOT ${CMAKE_SYSROOT}) ++set(MESON_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH}) ++ ++message(STATUS ${TMP_PATHS_LIST}) ++''' ++ ++file_2_data_CMakeLists_txt = '''\ ++# fail noisily if attempt to use this file without setting: ++# cmake_minimum_required(VERSION ${CMAKE_VERSION}) ++# project(... LANGUAGES ...) ++ ++cmake_policy(SET CMP0000 NEW) ++ ++set(PACKAGE_FOUND FALSE) ++set(_packageName "${NAME}") ++string(TOUPPER "${_packageName}" PACKAGE_NAME) ++ ++while(TRUE) ++ find_package("${NAME}" QUIET COMPONENTS ${COMPS}) ++ ++ # ARCHS has to be set via the CMD interface ++ if(${_packageName}_FOUND OR ${PACKAGE_NAME}_FOUND OR "${ARCHS}" STREQUAL "") ++ break() ++ endif() ++ ++ list(GET ARCHS 0 CMAKE_LIBRARY_ARCHITECTURE) ++ list(REMOVE_AT ARCHS 0) ++endwhile() ++ ++if(${_packageName}_FOUND OR ${PACKAGE_NAME}_FOUND) ++ set(PACKAGE_FOUND TRUE) ++ ++ # Check the following variables: ++ # FOO_VERSION ++ # Foo_VERSION ++ # FOO_VERSION_STRING ++ # Foo_VERSION_STRING ++ if(NOT DEFINED PACKAGE_VERSION) ++ if(DEFINED ${_packageName}_VERSION) ++ set(PACKAGE_VERSION "${${_packageName}_VERSION}") ++ elseif(DEFINED ${PACKAGE_NAME}_VERSION) ++ set(PACKAGE_VERSION "${${PACKAGE_NAME}_VERSION}") ++ elseif(DEFINED ${_packageName}_VERSION_STRING) ++ set(PACKAGE_VERSION "${${_packageName}_VERSION_STRING}") ++ elseif(DEFINED ${PACKAGE_NAME}_VERSION_STRING) ++ set(PACKAGE_VERSION "${${PACKAGE_NAME}_VERSION_STRING}") ++ endif() ++ endif() ++ ++ # Check the following variables: ++ # FOO_LIBRARIES ++ # Foo_LIBRARIES ++ # FOO_LIBS ++ # Foo_LIBS ++ set(libs) ++ if(DEFINED ${_packageName}_LIBRARIES) ++ set(libs ${_packageName}_LIBRARIES) ++ elseif(DEFINED ${PACKAGE_NAME}_LIBRARIES) ++ set(libs ${PACKAGE_NAME}_LIBRARIES) ++ elseif(DEFINED ${_packageName}_LIBS) ++ set(libs ${_packageName}_LIBS) ++ elseif(DEFINED ${PACKAGE_NAME}_LIBS) ++ set(libs ${PACKAGE_NAME}_LIBS) ++ endif() ++ ++ # Check the following variables: ++ # FOO_INCLUDE_DIRS ++ # Foo_INCLUDE_DIRS ++ # FOO_INCLUDES ++ # Foo_INCLUDES ++ # FOO_INCLUDE_DIR ++ # Foo_INCLUDE_DIR ++ set(includes) ++ if(DEFINED ${_packageName}_INCLUDE_DIRS) ++ set(includes ${_packageName}_INCLUDE_DIRS) ++ elseif(DEFINED ${PACKAGE_NAME}_INCLUDE_DIRS) ++ set(includes ${PACKAGE_NAME}_INCLUDE_DIRS) ++ elseif(DEFINED ${_packageName}_INCLUDES) ++ set(includes ${_packageName}_INCLUDES) ++ elseif(DEFINED ${PACKAGE_NAME}_INCLUDES) ++ set(includes ${PACKAGE_NAME}_INCLUDES) ++ elseif(DEFINED ${_packageName}_INCLUDE_DIR) ++ set(includes ${_packageName}_INCLUDE_DIR) ++ elseif(DEFINED ${PACKAGE_NAME}_INCLUDE_DIR) ++ set(includes ${PACKAGE_NAME}_INCLUDE_DIR) ++ endif() ++ ++ # Check the following variables: ++ # FOO_DEFINITIONS ++ # Foo_DEFINITIONS ++ set(definitions) ++ if(DEFINED ${_packageName}_DEFINITIONS) ++ set(definitions ${_packageName}_DEFINITIONS) ++ elseif(DEFINED ${PACKAGE_NAME}_DEFINITIONS) ++ set(definitions ${PACKAGE_NAME}_DEFINITIONS) ++ endif() ++ ++ set(PACKAGE_INCLUDE_DIRS "${${includes}}") ++ set(PACKAGE_DEFINITIONS "${${definitions}}") ++ set(PACKAGE_LIBRARIES "${${libs}}") ++endif() ++''' ++ ++file_3_data_preload_cmake = '''\ ++if(MESON_PS_LOADED) ++ return() ++endif() ++ ++set(MESON_PS_LOADED ON) ++ ++# Dummy macros that have a special meaning in the meson code ++macro(meson_ps_execute_delayed_calls) ++endmacro() ++ ++macro(meson_ps_reload_vars) ++endmacro() ++ ++# Helper macro to inspect the current CMake state ++macro(meson_ps_inspect_vars) ++ set(MESON_PS_CMAKE_CURRENT_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}") ++ set(MESON_PS_CMAKE_CURRENT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}") ++ meson_ps_execute_delayed_calls() ++endmacro() ++ ++ ++# Override some system functions with custom code and forward the args ++# to the original function ++macro(add_custom_command) ++ meson_ps_inspect_vars() ++ _add_custom_command(${ARGV}) ++endmacro() ++ ++macro(add_custom_target) ++ meson_ps_inspect_vars() ++ _add_custom_target(${ARGV}) ++endmacro() ++ ++macro(set_property) ++ meson_ps_inspect_vars() ++ _set_property(${ARGV}) ++endmacro() ++ ++function(set_source_files_properties) ++ set(FILES) ++ set(I 0) ++ set(PROPERTIES OFF) ++ ++ while(I LESS ARGC) ++ if(NOT PROPERTIES) ++ if("${ARGV${I}}" STREQUAL "PROPERTIES") ++ set(PROPERTIES ON) ++ else() ++ list(APPEND FILES "${ARGV${I}}") ++ endif() ++ ++ math(EXPR I "${I} + 1") ++ else() ++ set(ID_IDX ${I}) ++ math(EXPR PROP_IDX "${ID_IDX} + 1") ++ ++ set(ID "${ARGV${ID_IDX}}") ++ set(PROP "${ARGV${PROP_IDX}}") ++ ++ set_property(SOURCE ${FILES} PROPERTY "${ID}" "${PROP}") ++ math(EXPR I "${I} + 2") ++ endif() ++ endwhile() ++endfunction() ++ ++set(MESON_PS_DELAYED_CALLS add_custom_command;add_custom_target;set_property) ++meson_ps_reload_vars() ++''' ++ ++ ++#################### ++# END Data section # ++#################### ++ ++class DataFile: ++ def __init__(self, path: Path, sha256sum: str, data: str) -> None: ++ self.path = path ++ self.sha256sum = sha256sum ++ self.data = data ++ ++ def write_once(self, path: Path) -> None: ++ if not path.exists(): ++ path.write_text(self.data) ++ ++ def write_to_private(self, env: 'Environment') -> Path: ++ out_file = Path(env.scratch_dir) / 'data' / self.path.name ++ out_file.parent.mkdir(exist_ok=True) ++ self.write_once(out_file) ++ return out_file ++ ++ ++mesondata = { ++ 'dependencies/data/CMakeListsLLVM.txt': DataFile( ++ Path('dependencies/data/CMakeListsLLVM.txt'), ++ '412cec3315597041a978d018cdaca282dcd47693793540da88ae2f80d0cbd7cd', ++ file_0_data_CMakeListsLLVM_txt, ++ ), ++ 'dependencies/data/CMakePathInfo.txt': DataFile( ++ Path('dependencies/data/CMakePathInfo.txt'), ++ '90da8b443982d9c87139b7dc84228eb58cab4315764949637208f25e2bda7db2', ++ file_1_data_CMakePathInfo_txt, ++ ), ++ 'dependencies/data/CMakeLists.txt': DataFile( ++ Path('dependencies/data/CMakeLists.txt'), ++ '71a2d58381f912bbfb1c8709884d34d721f682edf2fca001e1f582f0bffd0da7', ++ file_2_data_CMakeLists_txt, ++ ), ++ 'cmake/data/preload.cmake': DataFile( ++ Path('cmake/data/preload.cmake'), ++ '064d047b18a5c919ad016b838bed50c5d40aebe9e53da0e70eff9d52a2c1ca1f', ++ file_3_data_preload_cmake, ++ ), ++} +diff --git a/tools/gen_data.py b/tools/gen_data.py +new file mode 100755 +index 0000000000..2cc05a44e7 +--- /dev/null ++++ b/tools/gen_data.py +@@ -0,0 +1,139 @@ ++#!/usr/bin/env python3 ++ ++# Copyright 2020 Daniel Mensinger ++ ++# Licensed under the Apache License, Version 2.0 (the "License"); ++# you may not use this file except in compliance with the License. ++# You may obtain a copy of the License at ++ ++# http://www.apache.org/licenses/LICENSE-2.0 ++ ++# Unless required by applicable law or agreed to in writing, software ++# distributed under the License is distributed on an "AS IS" BASIS, ++# 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 sys ++import hashlib ++import textwrap ++import re ++from pathlib import Path ++from datetime import datetime ++import typing as T ++ ++class DataFile: ++ file_counter = 0 ++ ++ def __init__(self, path: Path, root: Path): ++ self.path = path ++ self.id = self.path.relative_to(root) ++ self.data_str = f'file_{DataFile.file_counter}_data_' + re.sub('[^a-zA-Z0-9]', '_', self.path.name) ++ DataFile.file_counter += 1 ++ ++ b = self.path.read_bytes() ++ self.data = b.decode() ++ self.sha256sum = hashlib.sha256(b).hexdigest() ++ ++ def __repr__(self) -> str: ++ return f'<{type(self).__name__}: [{self.sha256sum}] {self.id}>' ++ ++def main() -> int: ++ root_dir = Path(__file__).resolve().parents[1] ++ mesonbuild_dir = root_dir / 'mesonbuild' ++ out_file = mesonbuild_dir / 'mesondata.py' ++ ++ data_dirs = mesonbuild_dir.glob('**/data') ++ ++ data_files: T.List[DataFile] = [] ++ ++ for d in data_dirs: ++ for p in d.iterdir(): ++ data_files += [DataFile(p, mesonbuild_dir)] ++ ++ print(f'Found {len(data_files)} data files') ++ ++ # Generate the data script ++ data = '' ++ ++ data += textwrap.dedent(f'''\ ++ # Copyright {datetime.today().year} The Meson development team ++ ++ # Licensed under the Apache License, Version 2.0 (the "License"); ++ # you may not use this file except in compliance with the License. ++ # You may obtain a copy of the License at ++ ++ # http://www.apache.org/licenses/LICENSE-2.0 ++ ++ # Unless required by applicable law or agreed to in writing, software ++ # distributed under the License is distributed on an "AS IS" BASIS, ++ # 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. ++ ++ ++ #### ++ #### WARNING: This is an automatically generated file! Do not edit! ++ #### Generated by {Path(__file__).resolve().relative_to(root_dir)} ++ #### ++ ++ ++ from pathlib import Path ++ import typing as T ++ ++ if T.TYPE_CHECKING: ++ from .environment import Environment ++ ++ ###################### ++ # BEGIN Data section # ++ ###################### ++ ++ ''') ++ ++ for i in data_files: ++ data += f"{i.data_str} = '''\\\n{i.data}'''\n\n" ++ ++ data += textwrap.dedent(f''' ++ #################### ++ # END Data section # ++ #################### ++ ++ class DataFile: ++ def __init__(self, path: Path, sha256sum: str, data: str) -> None: ++ self.path = path ++ self.sha256sum = sha256sum ++ self.data = data ++ ++ def write_once(self, path: Path) -> None: ++ if not path.exists(): ++ path.write_text(self.data) ++ ++ def write_to_private(self, env: 'Environment') -> Path: ++ out_file = Path(env.scratch_dir) / 'data' / self.path.name ++ out_file.parent.mkdir(exist_ok=True) ++ self.write_once(out_file) ++ return out_file ++ ++ ++ mesondata = {{ ++ ''') ++ ++ for i in data_files: ++ data += textwrap.indent(textwrap.dedent(f"""\ ++ '{i.id}': DataFile( ++ Path('{i.id}'), ++ '{i.sha256sum}', ++ {i.data_str}, ++ ), ++ """), ' ') ++ ++ data += textwrap.dedent('''\ ++ } ++ ''') ++ ++ print(f'Updating {out_file}') ++ out_file.write_text(data) ++ return 0 ++ ++if __name__ == '__main__': ++ sys.exit(main()) + +From 05ddd6543d4c4fc33b4c64f26291e73f49733f71 Mon Sep 17 00:00:00 2001 +From: Daniel Mensinger +Date: Thu, 16 Jul 2020 20:33:57 +0200 +Subject: [PATCH 2/3] mdata: remove setuptools and use mesondata instead + +--- + mesonbuild/cmake/interpreter.py | 5 ++--- + mesonbuild/dependencies/base.py | 6 ++---- + setup.py | 5 ----- + 4 files changed, 4 insertions(+), 16 deletions(-) + +diff --git a/mesonbuild/cmake/interpreter.py b/mesonbuild/cmake/interpreter.py +index 05169478e8..f404109cf6 100644 +--- a/mesonbuild/cmake/interpreter.py ++++ b/mesonbuild/cmake/interpreter.py +@@ -15,8 +15,6 @@ + # This class contains the basic functionality needed to run any interpreter + # or an interpreter-based tool. + +-import pkg_resources +- + from .common import CMakeException, CMakeTarget, TargetOptions + from .client import CMakeClient, RequestCMakeInputs, RequestConfigure, RequestCompute, RequestCodeModel + from .fileapi import CMakeFileAPI +@@ -25,6 +23,7 @@ + from .. import mlog, mesonlib + from ..environment import Environment + from ..mesonlib import MachineChoice, OrderedSet, version_compare ++from ..mesondata import mesondata + from ..compilers.compilers import lang_suffixes, header_suffixes, obj_suffixes, lib_suffixes, is_header + from enum import Enum + from functools import lru_cache +@@ -814,7 +813,7 @@ def configure(self, extra_cmake_options: T.List[str]) -> None: + raise CMakeException('Unable to find CMake') + self.trace = CMakeTraceParser(cmake_exe.version(), self.build_dir, permissive=True) + +- preload_file = pkg_resources.resource_filename('mesonbuild', 'cmake/data/preload.cmake') ++ preload_file = mesondata['cmake/data/preload.cmake'].write_to_private(self.env) + + # Prefere CMAKE_PROJECT_INCLUDE over CMAKE_TOOLCHAIN_FILE if possible, + # since CMAKE_PROJECT_INCLUDE was actually designed for code injection. +diff --git a/mesonbuild/dependencies/base.py b/mesonbuild/dependencies/base.py +index 23701da957..4c9c9fe18a 100644 +--- a/mesonbuild/dependencies/base.py ++++ b/mesonbuild/dependencies/base.py +@@ -29,8 +29,6 @@ + from enum import Enum + from pathlib import Path, PurePath + +-import pkg_resources +- + from .. import mlog + from .. import mesonlib + from ..compilers import clib_langs +@@ -40,6 +38,7 @@ + from ..mesonlib import MachineChoice, MesonException, OrderedSet, PerMachine + from ..mesonlib import Popen_safe, version_compare_many, version_compare, listify, stringlistify, extract_as_list, split_args + from ..mesonlib import Version, LibType ++from ..mesondata import mesondata + + if T.TYPE_CHECKING: + from ..compilers.compilers import CompilerType # noqa: F401 +@@ -1512,8 +1511,7 @@ def _setup_cmake_dir(self, cmake_file: str) -> str: + build_dir = self._get_build_dir() + + # Insert language parameters into the CMakeLists.txt and write new CMakeLists.txt +- # Per the warning in pkg_resources, this is *not* a path and os.path and Pathlib are *not* safe to use here. +- cmake_txt = pkg_resources.resource_string('mesonbuild', 'dependencies/data/' + cmake_file).decode() ++ cmake_txt = mesondata['dependencies/data/' + cmake_file].data + + # In general, some Fortran CMake find_package() also require C language enabled, + # even if nothing from C is directly used. An easy Fortran example that fails +diff --git a/setup.py b/setup.py +index 1f95be70c8..145f19c522 100644 +--- a/setup.py ++++ b/setup.py +@@ -37,10 +37,6 @@ + 'mesonbuild.scripts', + 'mesonbuild.templates', + 'mesonbuild.wrap'] +-package_data = { +- 'mesonbuild.dependencies': ['data/CMakeLists.txt', 'data/CMakeListsLLVM.txt', 'data/CMakePathInfo.txt'], +- 'mesonbuild.cmake': ['data/run_ctgt.py', 'data/preload.cmake'], +-} + data_files = [] + if sys.platform != 'win32': + # Only useful on UNIX-like systems +@@ -51,6 +47,5 @@ + setup(name='meson', + version=version, + packages=packages, +- package_data=package_data, + entry_points=entries, + data_files=data_files,) + +From 393d6e133d9abd584a2fc414971628e84ea48b7c Mon Sep 17 00:00:00 2001 +From: Daniel Mensinger +Date: Thu, 16 Jul 2020 20:34:15 +0200 +Subject: [PATCH 3/3] mdata: Add test to ensure mesondata.py is up-to-date + +--- + run_unittests.py | 32 ++++++++++++++++++++++++++++++++ + 1 file changed, 32 insertions(+) + +diff --git a/run_unittests.py b/run_unittests.py +index 820b705b54..2c03a3e75c 100755 +--- a/run_unittests.py ++++ b/run_unittests.py +@@ -1485,6 +1485,38 @@ def test_all_functions_defined_in_ast_interpreter(self): + astint = AstInterpreter('.', '', '') + self.assertEqual(set(interp.funcs.keys()), set(astint.funcs.keys())) + ++ def test_mesondata_is_up_to_date(self): ++ from mesonbuild.mesondata import mesondata ++ err_msg = textwrap.dedent(''' ++ ++ ########################################################### ++ ### mesonbuild.mesondata is not up-to-date ### ++ ### Please regenerate it by running tools/gen_data.py ### ++ ########################################################### ++ ++ ''') ++ ++ root_dir = Path(__file__).resolve().parent ++ mesonbuild_dir = root_dir / 'mesonbuild' ++ ++ data_dirs = mesonbuild_dir.glob('**/data') ++ data_files = [] # type: T.List[T.Tuple(str, str)] ++ ++ for i in data_dirs: ++ for p in i.iterdir(): ++ data_files += [(p.relative_to(mesonbuild_dir).as_posix(), hashlib.sha256(p.read_bytes()).hexdigest())] ++ ++ from pprint import pprint ++ current_files = set(mesondata.keys()) ++ scanned_files = set([x[0] for x in data_files]) ++ ++ self.assertSetEqual(current_files, scanned_files, err_msg + 'Data files were added or removed\n') ++ errors = [] ++ for i in data_files: ++ if mesondata[i[0]].sha256sum != i[1]: ++ errors += [i[0]] ++ ++ self.assertListEqual(errors, [], err_msg + 'Files were changed') + + class BasePlatformTests(unittest.TestCase): + prefix = '/usr'