2017-10-13 6 views
2

J'essaye de construire Git sur OS X. Git dépend de libidn2. libidn2 2.0.0 échoue:Comment déterminer où 'ar' est appelé dans Makefile?

make all-am 
make[3]: Entering directory '/Users/jwalton/Build-Scripts/libidn2-2.0.0/lib' 
    CC  idna.lo 
    CC  lookup.lo 
    CC  decode.lo 
    CC  register.lo 
    CC  bidi.lo 
    CC  version.lo 
    CC  error.lo 
    CC  punycode.lo 
    CC  free.lo 
    CC  data.lo 
    CC  tr46map.lo 
    CC  tables.lo 
    CC  context.lo 
    CCLD  libidn2.la 
warning: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/nm: no name list 
warning: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/nm: no name list 
copying selected object files to avoid basename conflicts... 
ar: temporary file: No such file or directory 
Makefile:1027: recipe for target 'libidn2.la' failed 
make[3]: *** [libidn2.la] Error 1 
make[3]: Leaving directory '/Users/jwalton/Build-Scripts/libidn2-2.0.0/lib' 
Makefile:955: recipe for target 'all' failed 
make[2]: *** [all] Error 2 
make[2]: Leaving directory '/Users/jwalton/Build-Scripts/libidn2-2.0.0/lib' 
Makefile:1065: recipe for target 'all-recursive' failed 
make[1]: *** [all-recursive] Error 1 
make[1]: Leaving directory '/Users/jwalton/Build-Scripts/libidn2-2.0.0' 
Makefile:974: recipe for target 'all' failed 
make: *** [all] Error 2 

Ma recette pour construire libidn2 trouve tous les Makefiles et fixe AR et ARFLAGS:

if [[ "$IS_DARWIN" -ne "0" ]]; then 
    for mfile in $(find "$PWD" -name 'Makefile'); do 
     echo "Fixing Makefile $mfile" 
     sed -i "" 's|AR = ar|AR = /usr/bin/libtool|g' "$mfile" 
     sed -i "" 's|ARFLAGS = cr|ARFLAGS = -static -o|g' "$mfile" 
    done 
fi 

Je l'ai confirmé qu'il corrige toutes les Makefile:

$ find $PWD -name Makefile -exec grep 'AR =' {} \; | egrep -iv 'amtar|char' 
AR = /usr/bin/libtool 
ac_ct_AR = /usr/bin/libtool 
AR = /usr/bin/libtool 
ac_ct_AR = /usr/bin/libtool 
AR = /usr/bin/libtool 
ac_ct_AR = /usr/bin/libtool 
AR = /usr/bin/libtool 
ac_ct_AR = /usr/bin/libtool 
AR = /usr/bin/libtool 
ac_ct_AR = /usr/bin/libtool 
AR = /usr/bin/libtool 
ac_ct_AR = /usr/bin/libtool 
AR = /usr/bin/libtool 
ac_ct_AR = /usr/bin/libtool 
AR = /usr/bin/libtool 
ac_ct_AR = /usr/bin/libtool 
AR = /usr/bin/libtool 
ac_ct_AR = /usr/bin/libtool 

J'ai également essayé AR="/usr/bin/libtool" ARFLAGS="-static -o" ./configure et make AR="/usr/bin/libtool" ARFLAGS="-static -o", mais les choix ne sont pas respectés. Il produit des builds échouées supplémentaires.

La prise en charge du débogage de Makefile est assez moche, donc je ne sais pas comment procéder. make -d échoue même les tâches les plus simples, comme la fourniture d'un nom de fichier et numéro de ligne. remake -d produit les mêmes résultats inutiles. Le grand projet écrit par quelqu'un d'autre aggrave la situation.

$ make -d 
... 
Putting child 0x7f9bf0c45cf0 (libidn2.la) PID 75531 on the chain. 
Live child 0x7f9bf0c45cf0 (libidn2.la) PID 75531 
    CCLD  libidn2.la 
warning: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/nm: no name list 
warning: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/nm: no name list 
copying selected object files to avoid basename conflicts... 
ar: temporary file: No such file or directory 
Reaping losing child 0x7f9bf0c45cf0 PID 75531 
Makefile:1027: recipe for target 'libidn2.la' failed 

est ici la ligne 1027, ce qui est l'appel à ar:

libidn2.la: $(libidn2_la_OBJECTS) $(libidn2_la_DEPENDENCIES) $(EXTRA_libidn2_la\ 
_DEPENDENCIES) 
     $(AM_V_CCLD)$(libidn2_la_LINK) -rpath $(libdir) $(libidn2_la_OBJECTS) $\ 
(libidn2_la_LIBADD) $(LIBS) 

Comment puis-je trouver où ar est appelé dans la collection de Makefiles?

+2

[Cette annswer] (https://stackoverflow.com/a/5820432/425738) peut aider - essentiellement ajouter 'make V = 1 ... ' – ldav1s

Répondre

-1

Pour une compréhension simple d'une recette ne vous pouvez:

  1. écho la règle (ie echo $ (AM_V_CCLD) $ (libidn2_la_LINK) ...)
  2. ajouter une seconde commande qui ne s'arrête la marque

Si vous avez besoin d'aide supplémentaire, veuillez indiquer ici la sortie make après ces changements.

Dans votre cas, l'utilisation de l'option de makefile --debug = m peut aider

+0

Tout le point de la question est que l'OP ne sait pas quelle règle est la cause de l'erreur, alors comment une suggestion pour modifier la règle aide-t-elle? De plus, l'option '-d' (voir ci-dessus) couvre l'option' --debug = m'. – Beta

+0

Le message d'erreur pointe directement vers la recette, comme indiqué dans la question: "Makefile: 1027: la recette pour la cible 'libidn2.la' a échoué" Veuillez noter que l'option make -d est équivalente à --debug = a qui ne couvre pas --debug = m, comme expliqué à la page 105 du document gmake: [link] (https://www.gnu.org/software/make/manual/make.pdf) –

+0

Ce n'est pas évident - pour moi, de toute façon - que l'OP regarde le bon makefile, mais à la réflexion oui, une commande 'echo' le confirmerait. Et selon votre lien, "Notez que l'option 'all' [--debug = a] active cette option [--debug = m]." – Beta