Merge pull request #243914 from sund3RRR/gi-crystal-init

gi-crystal: init at 0.17.0
This commit is contained in:
Pol Dellaiera 2023-07-18 23:29:25 +02:00 committed by GitHub
commit fd1fd2cc08
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 117 additions and 0 deletions

View File

@ -15847,6 +15847,12 @@
githubId = 16734772;
name = "Sumner Evans";
};
sund3RRR = {
email = "evenquantity@gmail.com";
github = "sund3RRR";
githubId = 73298492;
name = "Mikhail Kiselev";
};
suominen = {
email = "kimmo@suominen.com";
github = "suominen";

View File

@ -0,0 +1,42 @@
{ lib
, fetchFromGitHub
, crystal
, gobject-introspection
}:
crystal.buildCrystalPackage rec {
pname = "gi-crystal";
version = "0.17.0";
src = fetchFromGitHub {
owner = "hugopl";
repo = "gi-crystal";
rev = "v${version}";
hash = "sha256-DIH8L8P8lkWzzVUj1Tbf9oTUvu9X7OT66APyUHiDkYk=";
};
# Make sure gi-crystal picks up the name of the so or dylib and not the leading nix store path
# when the package name happens to start with “lib”.
patches = [ ./src.patch ./store-friendly-library-name.patch ];
nativeBuildInputs = [ gobject-introspection ];
buildTargets = [ "generator" ];
doCheck = false;
doInstallCheck = false;
installPhase = ''
runHook preInstall
mkdir $out
cp -r * $out
runHook postInstall
'';
meta = with lib; {
description = "GI Crystal is a binding generator used to generate Crystal bindings for GObject based libraries using GObject Introspection.";
homepage = "https://github.com/hugopl/gi-crystal";
mainProgram = "gi-crystal";
maintainers = with maintainers; [ sund3RRR ];
};
}

View File

@ -0,0 +1,57 @@
--- a/src/generator/main.cr 2023-07-14 18:30:47.687581729 +0300
+++ b/src/generator/main.cr 2023-07-17 07:55:24.177630085 +0300
@@ -1,6 +1,8 @@
require "colorize"
require "log"
require "option_parser"
+require "file"
+require "file_utils"
require "./binding_config"
require "./error"
@@ -43,7 +45,7 @@
end
end
- output_dir = Path.new(project_dir, "lib/gi-crystal/src/auto").normalize if output_dir.nil?
+ output_dir = Path.new(Dir.current, "lib/gi-crystal/src/auto").normalize if output_dir.nil?
extra_bindings = argv.map { |path| Path.new(path).expand.to_s }
{output_dir: output_dir,
@@ -74,11 +76,23 @@
end
end
-private def find_bindings : Array(String)
- find_pattern = Path.new(project_dir, "**/binding.yml").normalize
+private def find_bindings_yml(path) : Array(String)
+ find_pattern = File.join(path, "**/binding.yml")
Dir[find_pattern]
end
+private def find_bindings : Array(String)
+ current_directory = Dir.current
+
+ bindings = find_bindings_yml(current_directory)
+ Dir.glob(File.join(current_directory, "**/*")).each do |path|
+ if File.symlink?(path)
+ bindings += find_bindings_yml(path)
+ end
+ end
+ bindings
+end
+
private def format_files(dir)
# We need to chdir into output dir since the formatter ignores everything under `lib` dir.
Dir.cd(dir) { `crystal tool format` }
@@ -102,7 +116,9 @@
Log.info { "Generating bindings at #{options[:output_dir]}" }
Generator::DocRepo.disable! unless options[:doc_gen]
-
+
+ FileUtils.cp_r(project_dir, File.join(Dir.current, "lib/gi-crystal"))
+
binding_yamls = find_bindings.concat(options[:extra_bindings])
binding_yamls.each do |file|
Log.info { "Using binding config at #{file}" }

View File

@ -0,0 +1,10 @@
--- a/src/generator/lib_gen.cr 1969-12-31 17:00:01.000000000 -0700
+++ b/src/generator/lib_gen.cr 2023-07-14 11:48:41.509397114 -0600
@@ -10,7 +10,7 @@
private def libraries : Array(String)
namespace.shared_libraries.map do |library|
- library[/lib([^\/]+)\.(?:so|.+?\.dylib).*/, 1]
+ library[/(?:\/[^\/]*)+\/lib([^\/]+)\.(?:so|.+?\.dylib).*/, 1]
end
end

View File

@ -8167,6 +8167,8 @@ with pkgs;
ghz = callPackage ../tools/networking/ghz { };
gi-crystal = callPackage ../development/tools/gi-crystal { };
gibberish-detector = with python3Packages; toPythonApplication gibberish-detector;
gibo = callPackage ../tools/misc/gibo { };