Vra

Ek loop autoconf en stel SHELL op '/bin/sh'.Dit skep groot probleme.Hoe om SHELL te dwing om '/bin/bash' vir autoconf te wees?

Ek probeer dit op osx laat loop, dit werk op linux.Linux gebruik SHELL=/bin/bash.osx is verstek na /bin/sh.

Was dit nuttig?

Oplossing

Ek het soortgelyke probleme op Solaris met GCC - en ek gebruik die "standaard" tegniek:

CONFIG_SHELL=/bin/bash ./configure ...

(Of, eintlik, ek gebruik / bin / KSH, maar die opstel van die CONFIG_SHELL env var kan jy autoconf skrifte vertel wat dop om te gebruik.)

Ek kyk na die instel script vir git en GD (hulle gebeur het te onttrek) om seker te maak dat dit nie 'n GCC eienaardige env var.

Ander wenke

Wat is die "groot probleme"? autoconf werk baie hard om 'n konfigureer script wat werk met 'n baie groot persentasie van skulpe op te wek. As jy 'n voorbeeld van 'n konstruk wat autoconf skryf wat nie draagbaar, gee dit asseblief by die autoconf poslys. Aan die ander kant, as die probleme wat jy ervaar is 'n gevolg van jou eie dop kode in configure.ac nie draagbaar (bv, jy met behulp van bashisms) dan die oplossing is om óf ophou met behulp van nie-draagbare kode of vereis dat die gebruiker om uitdruklik gestel SHELL of CONFIG_SHELL by instel tyd.

Dit klink soos die probleem wat jy ervaar is in die omgewing van die gebruiker loop instel. Op Linux, het jou gebruiker SHELL stel om / bin / bash, maar op OS X dit is ingestel op / bin / sh. Die instel script gegenereer deur autoconf doen 'n paar aanvanklike toetse van die dop dit loop onder en nie probeer om te her-exec self met 'n ander dop as die voorwaarde dop ontbreek sekere funksies. Maar as jy die bekendstelling van nie-draagbare dop kode in configure.ac, dan is jy die oortreding van een van die belangrikste filosofie se van autoconf - naamlik dat die instel van skrifte moet draagbaar wees. As jy werklik wil bashisms gebruik in jou dop kode, dan is jy wat jou gebruikers te SHELL = / bin / bash slaag as 'n argument om die instel script. Dit is nie 'n fout in autoconf, maar deur baie sal oorweeg word om 'n fout in die bou van jou projek.

autoconf is veronderstel om port probleme op te los deur die opwekking van 'n script wat "plek" kan hardloop. Dis hoekom dit genereer bisarre kode soos:

if test X$foo = X ; then ...   # check if foo is empty

eerder as:

if [ "$x" = "" ] ; then ...

Daardie soort crufty kode waarskynlik een keer toegelaat hierdie skrifte uit te voer op 'n paar ou Ultrix stelsel of wat ook al.

'n konfigureer script loop nie as gevolg van dop verskille is soos wat na 'n Formule-1 wedloop met 10 liter gas, en drie noodwiele.

As jy die ontwikkeling van 'n konfigureer script met autoconf en dit is sensitief vir of die dop is Bash of die OSX dop, jy doen iets verkeerd, of die autoconf mense het iets. As dit van jou af, los alles dop stukke wat jy bydra tot die script deur hulle draagbare.

Waar word SHELL daarop ingestel?Wat word met /bin/sh bestuur wanneer jy /bin/bash wil hê?

konfigureer skrifte is bedoel om oral te loop, selfs op die verskriklike gebreekte en nie-Bash-skulpe wat in die natuur bestaan.

Wysig:Wat presies is die probleem?

Nog 'n wysiging:Miskien wil jy hê dat die skrif homself weer moet uitvoer, iets soos hierdie.Dit is waarskynlik karretjie:

if test "$SHELL" = "/bin/sh" && test -x /bin/bash; then
    exec /bin/bash -c "$0" "$@"
fi

ln -f /bin/bash /bin/sh

:-P (Nee, dis nie 'n ernstige antwoord. Moet asseblief nie jou stelsel slang deur dit te doen!)

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top