3
votes

L'installation de bson_ext gem échoue sur macOS

Je suis coincé avec l'installation de la gemme bson_ext avec la version 1.5.1. J'ai essayé presque tout ce que j'ai trouvé sur le Web mais rien n'y fait. J'ai essayé de réinstaller ruby, rvm et ainsi de suite.

J'utilise:

  • RVM
  • MacOs Catalina 10.15.6
  • rubis 2.6.5

et après l'installation du bundle, j'ai un journal comme celui-ci:

Fetching bson_ext 1.5.1
Installing bson_ext 1.5.1 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /Users/lukasz/.rvm/gems/ruby-2.6.5/gems/bson_ext-1.5.1/ext/cbson
/Users/lukasz/.rvm/rubies/ruby-2.6.5/bin/ruby -I /Users/lukasz/.rvm/rubies/ruby-2.6.5/lib/ruby/site_ruby/2.6.0 -r ./siteconf20201001-15946-1sze5ll.rb extconf.rb
checking for asprintf()... yes
checking for ruby/st.h... yes
checking for ruby/regex.h... yes
checking for ruby/encoding.h... yes
creating Makefile

current directory: /Users/lukasz/.rvm/gems/ruby-2.6.5/gems/bson_ext-1.5.1/ext/cbson
make "DESTDIR=" clean

current directory: /Users/lukasz/.rvm/gems/ruby-2.6.5/gems/bson_ext-1.5.1/ext/cbson
make "DESTDIR="
compiling bson_buffer.c
compiling cbson.c
cbson.c:118:36: warning: passing 'char *' to parameter of type 'const unsigned char *' converts between pointers to integer types with different sign [-Wpointer-sign]
    result_t status = check_string(RSTRING_PTR(string), RSTRING_LEN(string),
                                   ^~~~~~~~~~~~~~~~~~~
/Users/lukasz/.rvm/rubies/ruby-2.6.5/include/ruby-2.6.0/ruby/ruby.h:1003:5: note: expanded from macro 'RSTRING_PTR'
    (!(RBASIC(str)->flags & RSTRING_NOEMBED) ? \
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./encoding_helpers.h:26:44: note: passing argument to parameter 'string' here
result_t check_string(const unsigned char* string, const int length,
                                           ^
cbson.c:118:57: warning: implicit conversion loses integer precision: 'long' to 'int' [-Wshorten-64-to-32]
    result_t status = check_string(RSTRING_PTR(string), RSTRING_LEN(string),
                      ~~~~~~~~~~~~                      ^~~~~~~~~~~~~~~~~~~
/Users/lukasz/.rvm/rubies/ruby-2.6.5/include/ruby-2.6.0/ruby/ruby.h:1000:6: note: expanded from macro 'RSTRING_LEN'
     RSTRING_EMBED_LEN(str) : \
     ^~~~~~~~~~~~~~~~~~~~~~
/Users/lukasz/.rvm/rubies/ruby-2.6.5/include/ruby-2.6.0/ruby/ruby.h:996:6: note: expanded from macro 'RSTRING_EMBED_LEN'
     (long)((RBASIC(str)->flags >> RSTRING_EMBED_LEN_SHIFT) & \
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cbson.c:118:57: warning: implicit conversion loses integer precision: 'long' to 'int' [-Wshorten-64-to-32]
    result_t status = check_string(RSTRING_PTR(string), RSTRING_LEN(string),
                      ~~~~~~~~~~~~                      ^~~~~~~~~~~~~~~~~~~
/Users/lukasz/.rvm/rubies/ruby-2.6.5/include/ruby-2.6.0/ruby/ruby.h:1001:28: note: expanded from macro 'RSTRING_LEN'
     RSTRING(str)->as.heap.len)
     ~~~~~~~~~~~~~~~~~~~~~~^~~
cbson.c:128:45: warning: implicit conversion loses integer precision: 'long' to 'int' [-Wshorten-64-to-32]
    SAFE_WRITE(buffer, RSTRING_PTR(string), RSTRING_LEN(string));
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~
/Users/lukasz/.rvm/rubies/ruby-2.6.5/include/ruby-2.6.0/ruby/ruby.h:1000:6: note: expanded from macro 'RSTRING_LEN'
     RSTRING_EMBED_LEN(str) : \
     ^
/Users/lukasz/.rvm/rubies/ruby-2.6.5/include/ruby-2.6.0/ruby/ruby.h:996:6: note: expanded from macro 'RSTRING_EMBED_LEN'
     (long)((RBASIC(str)->flags >> RSTRING_EMBED_LEN_SHIFT) & \
     ^
cbson.c:68:46: note: expanded from macro 'SAFE_WRITE'
    if (bson_buffer_write((buffer), (data), (size)) != 0)                    \
        ~~~~~~~~~~~~~~~~~                    ^~~~
cbson.c:128:45: warning: implicit conversion loses integer precision: 'long' to 'int' [-Wshorten-64-to-32]
    SAFE_WRITE(buffer, RSTRING_PTR(string), RSTRING_LEN(string));
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~
/Users/lukasz/.rvm/rubies/ruby-2.6.5/include/ruby-2.6.0/ruby/ruby.h:1001:28: note: expanded from macro 'RSTRING_LEN'
     RSTRING(str)->as.heap.len)
                           ^
cbson.c:68:46: note: expanded from macro 'SAFE_WRITE'
    if (bson_buffer_write((buffer), (data), (size)) != 0)                    \
        ~~~~~~~~~~~~~~~~~                    ^~~~
cbson.c:303:20: warning: unused variable 'values' [-Wunused-variable]
            VALUE* values;
                   ^
cbson.c:602:18: error: implicit declaration of function 'bson_buffer_get_max_size' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
    if (length > bson_buffer_get_max_size(buffer)) {
                 ^
cbson.c:602:18: note: did you mean 'bson_buffer_set_max_size'?
./bson_buffer.h:34:6: note: 'bson_buffer_set_max_size' declared here
void bson_buffer_set_max_size(bson_buffer_t buffer, int max_size);
     ^
6 warnings and 1 error generated.
make: *** [cbson.o] Error 1

make failed, exit code 2

Gem files will remain installed in /Users/lukasz/.rvm/gems/ruby-2.6.5/gems/bson_ext-1.5.1 for inspection.
Results logged to /Users/lukasz/.rvm/gems/ruby-2.6.5/extensions/x86_64-darwin-19/2.6.0/bson_ext-1.5.1/gem_make.out

An error occurred while installing bson_ext (1.5.1), and Bundler cannot continue.
Make sure that `gem install bson_ext -v '1.5.1' --source 'https://rubygems.org/'` succeeds before bundling.

In Gemfile:
  bson_ext

Quelqu'un a une idée de ce que je peux essayer d'autre? De plus, je peux dire que bson_ext avec une autre version comme 1.9.1 s'installe avec succès. Mais dans ce projet, je dois utiliser 1.5.1.


1 commentaires

Avez-vous essayé d'exécuter une commande d'installation de gem distincte comme suggéré dans la sortie ci-dessous? gem install bson_ext -v '1.5.1' --source 'https://rubygems.org/' . Parfois, cela peut vous donner un contexte supplémentaire.


3 Réponses :


0
votes

L'installation de la version 1.3.1 a fonctionné pour moi


1 commentaires

Je comprends mais je ne peux pas changer de version dans ce projet et je suis obligé d'utiliser 1.5.1



1
votes

1.5.1 a 9 ans, il n'y a donc aucune raison de croire que cela devrait fonctionner. Et, en effet, cela échoue également pour moi avec la même erreur (Big Sur / 2.7.1 et 2.8.0).

Cela étant dit, si vous insistez à 100% pour le faire et que vous n'avez pas d'alternative telle que changer d'employeur et / ou une carrière prometteuse en archéologie logicielle sur laquelle vous rabattre, essayez ceci:

Accédez au dossier indiqué dans le message d'erreur, /Users/lukasz/.rvm/gems/ruby-2.6.5/gems/bson_ext-1.5.1 for inspection.

De là, accédez à ext/cbson et modifiez le fichier bson_buffer.h .

Vous devez insérer une ligne, près du haut du fichier:

@ in bson_ext-1.5.1 $ gem list bson_ext
*** LOCAL GEMS ***
bson_ext (1.5.1)

lancez make dans ce dossier. Cela devrait fonctionner avec seulement quelques avertissements.

Après cela, vous devez toujours l'installer. Vérifiez l' gem help install pour plus de détails sur le processus. Ceci suit ses instructions:

@ in bson_ext-1.5.1 $ gem spec ../../cache/bson_ext-1.5.1.gem --ruby > ../../specifications/bson_ext-1.5.1.gemspec

Et en effet:

/* A buffer */
typedef struct bson_buffer* bson_buffer_t;
/* A position in the buffer */
typedef int bson_buffer_position;

/***** THE FOLLOWING IS THE LINE YOU NEED TO INSERT ****/
int bson_buffer_get_max_size(bson_buffer_t buffer); 

 /* Allocate and return a new buffer.
 * Return NULL on allocation failure. */
bson_buffer_t bson_buffer_new(void);

Notez que cela se trouvait à nouveau dans le dossier «d'origine».

Même après cela, faire simplement requite 'bson_ext' ne fonctionne pas pour moi et exiger que 'bson' se plaint de son absence. D'après ce message d'erreur, vous pourriez réussir en déplaçant - et je veux être très précis ici - quelque chose , quelque part . Aucune garantie que cela fonctionnera réellement. Probablement pas.


1 commentaires

Belle correction, je n'avais pas le fichier gemspec dans mon dossier de spécifications. J'ai ajouté un fichier vide avec le nom bson_ext-1.5.1.gemspec puis bson_ext-1.5.1.gemspec exécuté la commande: $ gem spec ../../cache/bson_ext-1.5.1.gem --ruby > ../../specifications/bson_ext-1.5.1.gemspec



6
votes

J'ai trouvé une meilleure solution, lorsque vous installez la gemme, ajoutez-la à la fin

-- --with-cflags="-Wno-error=implicit-function-declaration"


0 commentaires