Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gi-crystal: init at 0.17.0 #243914

Merged
merged 2 commits into from
Jul 18, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions maintainers/maintainer-list.nix
Original file line number Diff line number Diff line change
Expand Up @@ -15718,6 +15718,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";
Expand Down
42 changes: 42 additions & 0 deletions pkgs/development/tools/gi-crystal/default.nix
Original file line number Diff line number Diff line change
@@ -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;
Comment on lines +24 to +25
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please see if we can get tests working by not overwriting the env variable

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can't, it doesn't work. The test rule in the Makefile simply starts generating bindings with custom typelib paths that do not have them, and fails.


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 ];
};
}
57 changes: 57 additions & 0 deletions pkgs/development/tools/gi-crystal/src.patch
Original file line number Diff line number Diff line change
@@ -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}" }
Original file line number Diff line number Diff line change
@@ -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
2 changes: 2 additions & 0 deletions pkgs/top-level/all-packages.nix
Original file line number Diff line number Diff line change
Expand Up @@ -8117,6 +8117,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 { };
Expand Down