| 
1 | 1 | # frozen_string_literal: true  | 
2 | 2 | 
 
  | 
3 | 3 | require File.expand_path('../../lib/rdkafka/version', __FILE__)  | 
4 |  | -require "mini_portile2"  | 
5 | 4 | require "fileutils"  | 
6 | 5 | require "open-uri"  | 
7 | 6 | 
 
  | 
8 | 7 | task :default => :clean do  | 
9 |  | -  # Download and compile librdkafka  | 
10 |  | -  recipe = MiniPortile.new("librdkafka", Rdkafka::LIBRDKAFKA_VERSION)  | 
 | 8 | +  # For nix users, nix can't locate the file paths because the packages it's requiring aren't managed by the system but are  | 
 | 9 | +  # managed by nix itself, so using the normal file paths doesn't work for nix users.  | 
 | 10 | +  #  | 
 | 11 | +  # Mini_portile causes an issue because it's dependencies are downloaded on the fly and therefore don't exist/aren't  | 
 | 12 | +  # accessible in the nix environment  | 
 | 13 | +  if ENV.fetch('RDKAFKA_EXT_PATH', '').empty?  | 
 | 14 | +    # Download and compile librdkafka if RDKAFKA_EXT_PATH is not set  | 
 | 15 | +    require "mini_portile2"  | 
 | 16 | +    recipe = MiniPortile.new("librdkafka", Rdkafka::LIBRDKAFKA_VERSION)  | 
11 | 17 | 
 
  | 
12 |  | -  # Use default homebrew openssl if we're on mac and the directory exists  | 
13 |  | -  # and each of flags is not empty  | 
14 |  | -  if recipe.host&.include?("darwin") && system("which brew &> /dev/null") && Dir.exist?("#{homebrew_prefix = %x(brew --prefix openssl).strip}")  | 
15 |  | -    ENV["CPPFLAGS"] = "-I#{homebrew_prefix}/include" unless ENV["CPPFLAGS"]  | 
16 |  | -    ENV["LDFLAGS"] = "-L#{homebrew_prefix}/lib" unless ENV["LDFLAGS"]  | 
17 |  | -  end  | 
 | 18 | +    # Use default homebrew openssl if we're on mac and the directory exists  | 
 | 19 | +    # and each of flags is not empty  | 
 | 20 | +    if recipe.host&.include?("darwin") && system("which brew &> /dev/null") && Dir.exist?("#{homebrew_prefix = %x(brew --prefix openssl).strip}")  | 
 | 21 | +      ENV["CPPFLAGS"] = "-I#{homebrew_prefix}/include" unless ENV["CPPFLAGS"]  | 
 | 22 | +      ENV["LDFLAGS"] = "-L#{homebrew_prefix}/lib" unless ENV["LDFLAGS"]  | 
 | 23 | +    end  | 
 | 24 | + | 
 | 25 | +    releases = File.expand_path(File.join(File.dirname(__FILE__), '../dist'))  | 
 | 26 | + | 
 | 27 | +    recipe.files << {  | 
 | 28 | +      :url => "file://#{releases}/librdkafka_#{Rdkafka::LIBRDKAFKA_VERSION}.tar.gz",  | 
 | 29 | +      :sha256 => Rdkafka::LIBRDKAFKA_SOURCE_SHA256  | 
 | 30 | +    }  | 
 | 31 | +    recipe.configure_options = ["--host=#{recipe.host}"]  | 
 | 32 | + | 
 | 33 | +    # Disable using libc regex engine in favor of the embedded one  | 
 | 34 | +    # The default regex engine of librdkafka does not always work exactly as most of the users  | 
 | 35 | +    # would expect, hence this flag allows for changing it to the other one  | 
 | 36 | +    if ENV.key?('RDKAFKA_DISABLE_REGEX_EXT')  | 
 | 37 | +      recipe.configure_options << '--disable-regex-ext'  | 
 | 38 | +    end  | 
18 | 39 | 
 
  | 
19 |  | -  recipe.files << {  | 
20 |  | -    :url => "https://codeload.github.com/edenhill/librdkafka/tar.gz/v#{Rdkafka::LIBRDKAFKA_VERSION}",  | 
21 |  | -    :sha256 => Rdkafka::LIBRDKAFKA_SOURCE_SHA256  | 
22 |  | -  }  | 
23 |  | -  recipe.configure_options = ["--host=#{recipe.host}"]  | 
24 |  | -  recipe.cook  | 
25 |  | -  # Move dynamic library we're interested in  | 
26 |  | -  if recipe.host.include?('darwin')  | 
27 |  | -    from_extension = '1.dylib'  | 
28 |  | -    to_extension   = 'dylib'  | 
 | 40 | +    recipe.cook  | 
 | 41 | +    # Move dynamic library we're interested in  | 
 | 42 | +    if recipe.host.include?('darwin')  | 
 | 43 | +      from_extension = '1.dylib'  | 
 | 44 | +      to_extension   = 'dylib'  | 
 | 45 | +    else  | 
 | 46 | +      from_extension = 'so.1'  | 
 | 47 | +      to_extension = 'so'  | 
 | 48 | +    end  | 
 | 49 | +    lib_path = File.join(File.dirname(__FILE__), "ports/#{recipe.host}/librdkafka/#{Rdkafka::LIBRDKAFKA_VERSION}/lib/librdkafka.#{from_extension}")  | 
 | 50 | +    FileUtils.mv(lib_path, File.join(File.dirname(__FILE__), "librdkafka.#{to_extension}"))  | 
 | 51 | +    # Cleanup files created by miniportile we don't need in the gem  | 
 | 52 | +    FileUtils.rm_rf File.join(File.dirname(__FILE__), "tmp")  | 
 | 53 | +    FileUtils.rm_rf File.join(File.dirname(__FILE__), "ports")  | 
29 | 54 |   else  | 
30 |  | -    from_extension = 'so.1'  | 
31 |  | -    to_extension = 'so'  | 
 | 55 | +    # Otherwise, copy existing libraries to ./ext  | 
 | 56 | +    if ENV['RDKAFKA_EXT_PATH'].nil? || ENV['RDKAFKA_EXT_PATH'].empty?  | 
 | 57 | +      raise "RDKAFKA_EXT_PATH must be set in your nix config when running under nix"  | 
 | 58 | +    end  | 
 | 59 | +    files = [  | 
 | 60 | +      File.join(ENV['RDKAFKA_EXT_PATH'], 'lib', 'librdkafka.dylib'),  | 
 | 61 | +      File.join(ENV['RDKAFKA_EXT_PATH'], 'lib', 'librdkafka.so')  | 
 | 62 | +    ]  | 
 | 63 | +    files.each { |ext| FileUtils.cp(ext, File.dirname(__FILE__)) if File.exist?(ext) }  | 
32 | 64 |   end  | 
33 |  | -  lib_path = File.join(File.dirname(__FILE__), "ports/#{recipe.host}/librdkafka/#{Rdkafka::LIBRDKAFKA_VERSION}/lib/librdkafka.#{from_extension}")  | 
34 |  | -  FileUtils.mv(lib_path, File.join(File.dirname(__FILE__), "librdkafka.#{to_extension}"))  | 
35 |  | -  # Cleanup files created by miniportile we don't need in the gem  | 
36 |  | -  FileUtils.rm_rf File.join(File.dirname(__FILE__), "tmp")  | 
37 |  | -  FileUtils.rm_rf File.join(File.dirname(__FILE__), "ports")  | 
38 | 65 | end  | 
39 | 66 | 
 
  | 
40 | 67 | task :clean do  | 
 | 
0 commit comments