2009-08-22 8 views
9

Nie mogę znaleźć wielu dokumentów na ten temat. Jak mogę spakować klej tak, że rozszerzenie C jest kompilowane, kiedy klejnot jest zainstalowany?Jak zawinąć rozszerzenie Ruby C w Ruby Gem?

W szczególności chcę, aby to zrobić:

  • Linux i MacOSX chciałbym skompilować rozszerzenie C na gem install

  • Windows Chciałbym po prostu zainstalować prekompilowanego .so

każda pomoc w tej sprawie, w szczególności przykład źródła, byłaby bardzo przydatna :)

Odpowiedz

14

Luis Lavena stworzył rake-compiler właśnie w tym celu.

jednak jesteś pewien, że chcesz rozszerzenie C? Rzecz o rozszerzeniach C jest to, że każda implementacja Ruby ma swój własny API rozszerzenia C (i nie oparte na C takie jak XRuby, JRuby, Ruby.NET, IronRuby, HotRuby, MagLev, Red Sun nie mają w ogóle), które oznacza, że ​​twoje rozszerzenie C będzie działało tylko na jednej implementacji. A ponieważ MRI tylko implementuje Ruby 1.8 i YARV tylko implementuje Ruby 1.9, a obecnie znajdujemy się w fazie przejściowej między 1.8 a 1.9, jest szansa, że ​​wiele osób użyje co najmniej dwóch różnych implementacji. (Osobiście używam 5: MRI, YARV, JRuby, IronRuby i Rubinius.)

Może lepiej będzie, jeśli użyjesz Ruby-FFI. Ruby-FFI to FFI (Foreign Function Interface) dla Ruby (duh), który pozwala na powiązanie i mapowanie bibliotek C w czystej Ruby w sposób, który jest przenośny we wszystkich implementacjach Ruby. API FFI został po raz pierwszy opracowany przez Evan Phoenix jako natywny interfejs API rozszerzenia dla Rubinius, następnie został przyjęty przez Charles Oliver Nutter (i zaimplementowany przez Wayne Meissner) dla JRuby. Wayne następnie również napisał Ruby-FFI gem, który zawiera rozszerzenia C dla MRI i YARV. Laurent Sansonetti zaimplementowano Ruby-FFI dla MacRuby, Marc-André Cournoyer 's tinyrb również supports FFI (ponownie napisany przez Wayne Meissner) i programiści MagLev również nad nim pracują. Co oznacza, że ​​jeśli możesz sprawić, by twoja biblioteka działała z FFI w przeciwieństwie do rozszerzenia C, automatycznie wesprzesz 6 implementacji Ruby zamiast tylko jednego.

Jedynym powodem używania rozszerzenia C w przeciwieństwie do rozszerzenia FFI byłoby, jeśli naprawdę chcesz , aby wymagać zachowania specyficznego dla danej implementacji. Jednym z przykładów może być klejnot ParseTree, który dociera w głąb jelita MRI i wyodrębnia reprezentację drzewa parsowania w pamięci.

Na koniec przyjrzyj się projektowi Nice-FFI autorstwa John Croisant, którego celem jest jeszcze lepsze wykorzystanie numeru Ruby-FFI.

+0

Wow, wygląda świetnie! dzięki :) – horseyguy

+0

Nie ma za co! To był całkowity egoizm, przy okazji: używam Ruby na Windowsie, więc im więcej autorów rozszerzeń używa kompilatora rake, tym więcej rozszerzeń jest publikowanych dla Windowsa! (Ale zobacz moją edycję). –

+0

wygląda tak, jak ta odpowiedź pochodzi z '09, a część odpowiedzi musi zostać zaktualizowana – Tilo

0

Mam repozytorium github, które utrzymuję dla własnego odniesienia i te rzeczy pomogły mi.

Ruby_C_extensions

To może pomóc, aby rozejrzeć się na github znaleźć kilka dobrych przykładów klejnotów już napisane tylko do badania, ale iść do przodu i sklonować je i sprawdzić, czy można zbudować je w systemie. Jeśli zostaną zebrane razem, powinny się dobrze układać.

Pamiętaj, że potrzebujesz narzędzi do budowania na dowolnej platformie, z której korzystasz. Oto wideo, które właśnie obejrzałem, mówiące, czego potrzebujesz dla Linuksa.

Python Programming Environment Setup

Teraz wiem, że to mówi Python, on ma pokazać, jak zainstalować pakiety narzędzi konstrukcyjnych.

Używam DevKit dla Windows i to działa dla mnie. W przypadku czego najważniejsza jest instalacja narzędzi.

Używam również kompilatora rake i motyki do ustawienia struktury folderów. Wygląda na to, że musimy oprzeć się o ogrodnictwo, zdobywając prowizję i motykę. :-D

Powiązane problemy