utils: add check_binary_linkage function
This commit is contained in:
		
							parent
							
								
									a3b0f9e536
								
							
						
					
					
						commit
						2373b6d586
					
				
							
								
								
									
										52
									
								
								Library/Homebrew/test/utils/linkage_spec.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								Library/Homebrew/test/utils/linkage_spec.rb
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,52 @@
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require "utils/linkage"
 | 
			
		||||
 | 
			
		||||
RSpec.describe Utils do
 | 
			
		||||
  [:needs_macos, :needs_linux].each do |needs_os|
 | 
			
		||||
    describe "::binary_linked_to_library?", needs_os do
 | 
			
		||||
      suffix = OS.mac? ? ".dylib" : ".so"
 | 
			
		||||
 | 
			
		||||
      before do
 | 
			
		||||
        mktmpdir do |dir|
 | 
			
		||||
          (dir/"foo.h").write "void foo();"
 | 
			
		||||
          (dir/"foo.c").write <<~C
 | 
			
		||||
            #include <stdio.h>
 | 
			
		||||
            #include "foo.h"
 | 
			
		||||
            void foo() { printf("foo\\\\n"); }
 | 
			
		||||
          C
 | 
			
		||||
          (dir/"bar.c").write <<~C
 | 
			
		||||
            #include <stdio.h>
 | 
			
		||||
            void bar() { printf("bar\\\\n"); }
 | 
			
		||||
          C
 | 
			
		||||
          (dir/"test.c").write <<~C
 | 
			
		||||
            #include "foo.h"
 | 
			
		||||
            int main() { foo(); return 0; }
 | 
			
		||||
          C
 | 
			
		||||
 | 
			
		||||
          system "cc", "-c", "-fpic", dir/"foo.c", "-o", dir/"foo.o"
 | 
			
		||||
          system "cc", "-c", "-fpic", dir/"bar.c", "-o", dir/"bar.o"
 | 
			
		||||
          dll_flag = OS.mac? ? "-dynamiclib" : "-shared"
 | 
			
		||||
          (HOMEBREW_PREFIX/"lib").mkdir
 | 
			
		||||
          system "cc", dll_flag, "-o", HOMEBREW_PREFIX/"lib/libbrewfoo#{suffix}", dir/"foo.o"
 | 
			
		||||
          system "cc", dll_flag, "-o", HOMEBREW_PREFIX/"lib/libbrewbar#{suffix}", dir/"bar.o"
 | 
			
		||||
          rpath_flag = "-Wl,-rpath,#{HOMEBREW_PREFIX}/lib" if OS.linux?
 | 
			
		||||
          system "cc", "-o", dir/"brewtest", dir/"test.c", *rpath_flag, "-L#{HOMEBREW_PREFIX/"lib"}", "-lbrewfoo"
 | 
			
		||||
          (HOMEBREW_PREFIX/"bin").install dir/"brewtest"
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it "returns true if the binary is linked to the library" do
 | 
			
		||||
        result = described_class.binary_linked_to_library?(HOMEBREW_PREFIX/"bin/brewtest",
 | 
			
		||||
                                                           HOMEBREW_PREFIX/"lib/libbrewfoo#{suffix}")
 | 
			
		||||
        expect(result).to be true
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it "returns false if the binary is not linked to the library" do
 | 
			
		||||
        result = described_class.binary_linked_to_library?(HOMEBREW_PREFIX/"bin/brewtest",
 | 
			
		||||
                                                           HOMEBREW_PREFIX/"lib/libbrewbar#{suffix}")
 | 
			
		||||
        expect(result).to be false
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										15
									
								
								Library/Homebrew/utils/linkage.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								Library/Homebrew/utils/linkage.rb
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,15 @@
 | 
			
		||||
# typed: strict
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
module Utils
 | 
			
		||||
  sig {
 | 
			
		||||
    params(binary: T.any(String, Pathname), library: T.any(String, Pathname)).returns(T::Boolean)
 | 
			
		||||
  }
 | 
			
		||||
  def self.binary_linked_to_library?(binary, library)
 | 
			
		||||
    Pathname.new(binary).dynamically_linked_libraries.any? do |dll|
 | 
			
		||||
      next false unless dll.start_with?(HOMEBREW_PREFIX.to_s)
 | 
			
		||||
 | 
			
		||||
      File.realpath(dll) == File.realpath(Pathname.new(library))
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user