mirror of
https://github.com/wentasah/ros2nix.git
synced 2025-06-09 15:52:23 +03:00
Add a copy of nix_expression.py from superflore
Specifically
663a454afa/superflore/generators/nix/nix_expression.py
This commit is contained in:
parent
94a71fa564
commit
b746bf9312
1 changed files with 202 additions and 0 deletions
202
ros2nix/nix_expression.py
Normal file
202
ros2nix/nix_expression.py
Normal file
|
@ -0,0 +1,202 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# Copyright (c) 2016 David Bensoussan, Synapticon GmbH
|
||||
# Copyright (c) 2019 Open Source Robotics Foundation, Inc.
|
||||
#
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to
|
||||
# deal in the Software without restriction, including without limitation the
|
||||
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
# sell copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
#
|
||||
from operator import attrgetter
|
||||
import os
|
||||
from textwrap import dedent
|
||||
from time import gmtime, strftime
|
||||
from typing import Iterable, Set
|
||||
import urllib.parse
|
||||
|
||||
from superflore.utils import get_license
|
||||
|
||||
|
||||
def _escape_nix_string(string: str):
|
||||
return '"{}"'.format(string.replace("\\", "\\\\")
|
||||
.replace("${", r"\${")
|
||||
.replace('"', r"\""))
|
||||
|
||||
|
||||
class NixLicense:
|
||||
"""
|
||||
Converts a ROS license to the correct Nix license attribute.
|
||||
"""
|
||||
|
||||
_LICENSE_MAP = {
|
||||
'Apache-2.0': 'asl20',
|
||||
'ASL 2.0': 'asl20',
|
||||
'Boost-1.0': 'boost',
|
||||
'BSD-2': 'bsd2',
|
||||
'BSD-3-Clause': 'bsd3',
|
||||
'BSD': 'bsdOriginal',
|
||||
'CC-BY-NC-SA-4.0': 'cc-by-nc-sa-40',
|
||||
'GPL-1': 'gpl1',
|
||||
'GPL-2': 'gpl2',
|
||||
'GPL-3.0-only': 'gpl3Only',
|
||||
'GPL-3': 'gpl3',
|
||||
'LGPL-2.1': 'lgpl21',
|
||||
'LGPL-2': 'lgpl2',
|
||||
'LGPL-3.0-only': 'lgpl3Only',
|
||||
'LGPL-3': 'lgpl3',
|
||||
'MIT': 'mit',
|
||||
'MPL-1.0': 'mpl10',
|
||||
'MPL-1.1': 'mpl11',
|
||||
'MPL-2.0': 'mpl20',
|
||||
'PD': 'publicDomain',
|
||||
}
|
||||
|
||||
def __init__(self, name):
|
||||
try:
|
||||
name = get_license(name)
|
||||
self.name = self._LICENSE_MAP[name]
|
||||
self.custom = False
|
||||
except KeyError:
|
||||
self.name = name
|
||||
self.custom = True
|
||||
|
||||
@property
|
||||
def nix_code(self) -> str:
|
||||
if self.custom:
|
||||
return _escape_nix_string(self.name)
|
||||
else:
|
||||
return self.name
|
||||
|
||||
|
||||
class NixExpression:
|
||||
def __init__(self, name: str, version: str,
|
||||
src_url: str, src_sha256: str,
|
||||
description: str, licenses: Iterable[NixLicense],
|
||||
distro_name: str,
|
||||
build_type: str,
|
||||
build_inputs: Set[str] = set(),
|
||||
propagated_build_inputs: Set[str] = set(),
|
||||
check_inputs: Set[str] = set(),
|
||||
native_build_inputs: Set[str] = set(),
|
||||
propagated_native_build_inputs: Set[str] = set()
|
||||
) -> None:
|
||||
self.name = name
|
||||
self.version = version
|
||||
self.src_url = src_url
|
||||
self.src_sha256 = src_sha256
|
||||
# fetchurl's naming logic cannot account for URL parameters
|
||||
self.src_name = os.path.basename(
|
||||
urllib.parse.urlparse(self.src_url).path)
|
||||
|
||||
self.description = description
|
||||
self.licenses = licenses
|
||||
self.distro_name = distro_name
|
||||
self.build_type = build_type
|
||||
|
||||
self.build_inputs = build_inputs
|
||||
self.propagated_build_inputs = propagated_build_inputs
|
||||
self.check_inputs = check_inputs
|
||||
self.native_build_inputs = native_build_inputs
|
||||
self.propagated_native_build_inputs = \
|
||||
propagated_native_build_inputs
|
||||
|
||||
@staticmethod
|
||||
def _to_nix_list(it: Iterable[str]) -> str:
|
||||
return '[ ' + ' '.join(it) + ' ]'
|
||||
|
||||
@staticmethod
|
||||
def _to_nix_parameter(dep: str) -> str:
|
||||
return dep.split('.')[0]
|
||||
|
||||
def get_text(self, distributor: str, license_name: str) -> str:
|
||||
"""
|
||||
Generate the Nix expression, given the distributor line
|
||||
and the license text.
|
||||
"""
|
||||
|
||||
ret = []
|
||||
ret += dedent('''
|
||||
# Copyright {} {}
|
||||
# Distributed under the terms of the {} license
|
||||
|
||||
''').format(
|
||||
strftime("%Y", gmtime()), distributor,
|
||||
license_name)
|
||||
|
||||
ret += '{ lib, buildRosPackage, fetchurl, ' + \
|
||||
', '.join(sorted(set(map(self._to_nix_parameter,
|
||||
self.build_inputs |
|
||||
self.propagated_build_inputs |
|
||||
self.check_inputs |
|
||||
self.native_build_inputs |
|
||||
self.propagated_native_build_inputs)))
|
||||
) + ' }:'
|
||||
|
||||
ret += dedent('''
|
||||
buildRosPackage {{
|
||||
pname = "ros-{distro_name}-{name}";
|
||||
version = "{version}";
|
||||
|
||||
src = fetchurl {{
|
||||
url = "{src_url}";
|
||||
name = "{src_name}";
|
||||
sha256 = "{src_sha256}";
|
||||
}};
|
||||
|
||||
buildType = "{build_type}";
|
||||
''').format(
|
||||
distro_name=self.distro_name,
|
||||
name=self.name,
|
||||
version=self.version,
|
||||
src_url=self.src_url,
|
||||
src_name=self.src_name,
|
||||
src_sha256=self.src_sha256,
|
||||
build_type=self.build_type)
|
||||
|
||||
if self.build_inputs:
|
||||
ret += " buildInputs = {};\n" \
|
||||
.format(self._to_nix_list(sorted(self.build_inputs)))
|
||||
|
||||
if self.check_inputs:
|
||||
ret += " checkInputs = {};\n" \
|
||||
.format(self._to_nix_list(sorted(self.check_inputs)))
|
||||
|
||||
if self.propagated_build_inputs:
|
||||
ret += " propagatedBuildInputs = {};\n" \
|
||||
.format(self._to_nix_list(sorted(
|
||||
self.propagated_build_inputs)))
|
||||
|
||||
if self.native_build_inputs:
|
||||
ret += " nativeBuildInputs = {};\n" \
|
||||
.format(self._to_nix_list(sorted(self.native_build_inputs)))
|
||||
|
||||
if self.propagated_native_build_inputs:
|
||||
ret += " propagatedNativeBuildInputs = {};\n".format(
|
||||
self._to_nix_list(sorted(self.propagated_native_build_inputs)))
|
||||
|
||||
ret += dedent('''
|
||||
meta = {{
|
||||
description = {};
|
||||
license = with lib.licenses; {};
|
||||
}};
|
||||
}}
|
||||
''').format(_escape_nix_string(self.description),
|
||||
self._to_nix_list(map(attrgetter('nix_code'),
|
||||
self.licenses)))
|
||||
|
||||
return ''.join(ret)
|
Loading…
Add table
Add a link
Reference in a new issue