12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718127191272012721127221272312724127251272612727127281272912730127311273212733127341273512736127371273812739127401274112742127431274412745127461274712748127491275012751127521275312754127551275612757127581275912760127611276212763127641276512766127671276812769127701277112772127731277412775127761277712778127791278012781127821278312784127851278612787127881278912790127911279212793127941279512796127971279812799128001280112802128031280412805128061280712808128091281012811128121281312814128151281612817128181281912820128211282212823128241282512826128271282812829128301283112832128331283412835128361283712838128391284012841128421284312844128451284612847128481284912850128511285212853128541285512856128571285812859128601286112862128631286412865128661286712868128691287012871128721287312874128751287612877128781287912880128811288212883128841288512886128871288812889128901289112892128931289412895128961289712898128991290012901129021290312904129051290612907129081290912910129111291212913129141291512916129171291812919129201292112922129231292412925129261292712928129291293012931129321293312934129351293612937129381293912940129411294212943129441294512946129471294812949129501295112952129531295412955129561295712958129591296012961129621296312964129651296612967129681296912970129711297212973129741297512976129771297812979129801298112982129831298412985129861298712988129891299012991129921299312994129951299612997129981299913000130011300213003130041300513006130071300813009130101301113012130131301413015130161301713018130191302013021130221302313024130251302613027130281302913030130311303213033130341303513036130371303813039130401304113042130431304413045130461304713048130491305013051130521305313054130551305613057130581305913060130611306213063130641306513066130671306813069130701307113072130731307413075130761307713078130791308013081130821308313084130851308613087130881308913090130911309213093130941309513096130971309813099131001310113102131031310413105131061310713108131091311013111131121311313114131151311613117131181311913120131211312213123131241312513126131271312813129131301313113132131331313413135131361313713138131391314013141131421314313144131451314613147131481314913150131511315213153131541315513156131571315813159131601316113162131631316413165131661316713168131691317013171131721317313174131751317613177131781317913180131811318213183131841318513186131871318813189131901319113192131931319413195131961319713198131991320013201132021320313204132051320613207132081320913210132111321213213132141321513216132171321813219132201322113222132231322413225132261322713228132291323013231132321323313234132351323613237132381323913240132411324213243132441324513246132471324813249132501325113252132531325413255132561325713258132591326013261132621326313264132651326613267132681326913270132711327213273132741327513276132771327813279132801328113282132831328413285132861328713288132891329013291132921329313294132951329613297132981329913300133011330213303133041330513306133071330813309133101331113312133131331413315133161331713318133191332013321133221332313324133251332613327133281332913330133311333213333133341333513336133371333813339133401334113342133431334413345133461334713348133491335013351133521335313354133551335613357133581335913360133611336213363133641336513366133671336813369133701337113372133731337413375133761337713378133791338013381133821338313384133851338613387133881338913390133911339213393133941339513396133971339813399134001340113402134031340413405134061340713408134091341013411134121341313414134151341613417134181341913420134211342213423134241342513426134271342813429134301343113432134331343413435134361343713438134391344013441134421344313444134451344613447134481344913450134511345213453134541345513456134571345813459134601346113462134631346413465134661346713468134691347013471134721347313474134751347613477134781347913480134811348213483134841348513486134871348813489134901349113492134931349413495134961349713498134991350013501135021350313504135051350613507135081350913510135111351213513135141351513516135171351813519135201352113522135231352413525135261352713528135291353013531135321353313534135351353613537135381353913540135411354213543135441354513546135471354813549135501355113552135531355413555135561355713558135591356013561135621356313564135651356613567135681356913570135711357213573135741357513576135771357813579135801358113582135831358413585135861358713588135891359013591135921359313594135951359613597135981359913600136011360213603136041360513606136071360813609136101361113612136131361413615136161361713618136191362013621136221362313624136251362613627136281362913630136311363213633136341363513636136371363813639136401364113642136431364413645136461364713648136491365013651136521365313654136551365613657136581365913660136611366213663136641366513666136671366813669136701367113672136731367413675136761367713678136791368013681136821368313684136851368613687136881368913690136911369213693136941369513696136971369813699137001370113702137031370413705137061370713708137091371013711137121371313714137151371613717137181371913720137211372213723137241372513726137271372813729137301373113732137331373413735137361373713738137391374013741137421374313744137451374613747137481374913750137511375213753137541375513756137571375813759137601376113762137631376413765137661376713768137691377013771137721377313774137751377613777137781377913780137811378213783137841378513786137871378813789137901379113792137931379413795137961379713798137991380013801138021380313804138051380613807138081380913810138111381213813138141381513816138171381813819138201382113822138231382413825138261382713828138291383013831138321383313834138351383613837138381383913840138411384213843138441384513846138471384813849138501385113852138531385413855138561385713858138591386013861138621386313864138651386613867138681386913870138711387213873138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894138951389613897138981389913900139011390213903139041390513906139071390813909139101391113912139131391413915139161391713918139191392013921139221392313924139251392613927139281392913930139311393213933139341393513936139371393813939139401394113942139431394413945139461394713948139491395013951139521395313954139551395613957139581395913960139611396213963139641396513966139671396813969139701397113972139731397413975139761397713978139791398013981139821398313984139851398613987139881398913990139911399213993139941399513996139971399813999140001400114002140031400414005140061400714008140091401014011140121401314014140151401614017140181401914020140211402214023140241402514026140271402814029140301403114032140331403414035140361403714038140391404014041140421404314044140451404614047140481404914050140511405214053140541405514056140571405814059140601406114062140631406414065140661406714068140691407014071140721407314074140751407614077140781407914080140811408214083140841408514086140871408814089140901409114092140931409414095140961409714098140991410014101141021410314104141051410614107141081410914110141111411214113141141411514116141171411814119141201412114122141231412414125141261412714128141291413014131141321413314134141351413614137141381413914140141411414214143141441414514146141471414814149141501415114152141531415414155141561415714158141591416014161141621416314164141651416614167141681416914170141711417214173141741417514176141771417814179141801418114182141831418414185141861418714188141891419014191141921419314194141951419614197141981419914200142011420214203142041420514206142071420814209142101421114212142131421414215142161421714218142191422014221142221422314224142251422614227142281422914230142311423214233142341423514236142371423814239142401424114242142431424414245142461424714248142491425014251142521425314254142551425614257142581425914260142611426214263142641426514266142671426814269142701427114272142731427414275142761427714278142791428014281142821428314284142851428614287142881428914290142911429214293142941429514296142971429814299143001430114302143031430414305143061430714308143091431014311143121431314314143151431614317143181431914320143211432214323143241432514326143271432814329143301433114332143331433414335143361433714338143391434014341143421434314344143451434614347143481434914350143511435214353143541435514356143571435814359143601436114362143631436414365143661436714368143691437014371143721437314374143751437614377143781437914380143811438214383143841438514386143871438814389143901439114392143931439414395143961439714398143991440014401144021440314404144051440614407144081440914410144111441214413144141441514416144171441814419144201442114422144231442414425144261442714428144291443014431144321443314434144351443614437144381443914440144411444214443144441444514446144471444814449144501445114452144531445414455144561445714458144591446014461144621446314464144651446614467144681446914470144711447214473144741447514476144771447814479144801448114482144831448414485144861448714488144891449014491144921449314494144951449614497144981449914500145011450214503145041450514506145071450814509145101451114512145131451414515145161451714518145191452014521145221452314524145251452614527145281452914530145311453214533145341453514536145371453814539145401454114542145431454414545145461454714548145491455014551145521455314554145551455614557145581455914560145611456214563145641456514566145671456814569145701457114572145731457414575145761457714578145791458014581145821458314584145851458614587145881458914590145911459214593145941459514596145971459814599146001460114602146031460414605146061460714608146091461014611146121461314614146151461614617146181461914620146211462214623146241462514626146271462814629146301463114632146331463414635146361463714638146391464014641146421464314644146451464614647146481464914650146511465214653146541465514656146571465814659146601466114662146631466414665146661466714668146691467014671146721467314674146751467614677146781467914680146811468214683146841468514686146871468814689146901469114692146931469414695146961469714698146991470014701147021470314704147051470614707147081470914710147111471214713147141471514716147171471814719147201472114722147231472414725147261472714728147291473014731147321473314734147351473614737147381473914740147411474214743147441474514746147471474814749147501475114752147531475414755147561475714758147591476014761147621476314764147651476614767147681476914770147711477214773147741477514776147771477814779147801478114782147831478414785147861478714788147891479014791147921479314794147951479614797147981479914800148011480214803148041480514806148071480814809148101481114812148131481414815148161481714818148191482014821148221482314824148251482614827148281482914830148311483214833148341483514836148371483814839148401484114842148431484414845148461484714848148491485014851148521485314854148551485614857148581485914860148611486214863148641486514866148671486814869148701487114872148731487414875148761487714878148791488014881148821488314884148851488614887148881488914890148911489214893148941489514896148971489814899149001490114902149031490414905149061490714908149091491014911149121491314914149151491614917149181491914920149211492214923149241492514926149271492814929149301493114932149331493414935149361493714938149391494014941149421494314944149451494614947149481494914950149511495214953149541495514956149571495814959149601496114962149631496414965149661496714968149691497014971149721497314974149751497614977149781497914980149811498214983149841498514986149871498814989149901499114992149931499414995149961499714998149991500015001150021500315004150051500615007150081500915010150111501215013150141501515016150171501815019150201502115022150231502415025150261502715028150291503015031150321503315034150351503615037150381503915040150411504215043150441504515046150471504815049150501505115052150531505415055150561505715058150591506015061150621506315064150651506615067150681506915070150711507215073150741507515076150771507815079150801508115082150831508415085150861508715088150891509015091150921509315094150951509615097150981509915100151011510215103151041510515106151071510815109151101511115112151131511415115151161511715118151191512015121151221512315124151251512615127151281512915130151311513215133151341513515136151371513815139151401514115142151431514415145151461514715148151491515015151151521515315154151551515615157151581515915160151611516215163151641516515166151671516815169151701517115172151731517415175151761517715178151791518015181151821518315184151851518615187151881518915190151911519215193151941519515196151971519815199152001520115202152031520415205152061520715208152091521015211152121521315214152151521615217152181521915220152211522215223152241522515226152271522815229152301523115232152331523415235152361523715238152391524015241152421524315244152451524615247152481524915250152511525215253152541525515256152571525815259152601526115262152631526415265152661526715268152691527015271152721527315274152751527615277152781527915280152811528215283152841528515286152871528815289152901529115292152931529415295152961529715298152991530015301153021530315304153051530615307153081530915310153111531215313153141531515316153171531815319153201532115322153231532415325153261532715328153291533015331153321533315334153351533615337153381533915340153411534215343153441534515346153471534815349153501535115352153531535415355153561535715358153591536015361153621536315364153651536615367153681536915370153711537215373153741537515376153771537815379153801538115382153831538415385153861538715388153891539015391153921539315394153951539615397153981539915400154011540215403154041540515406154071540815409154101541115412154131541415415154161541715418154191542015421154221542315424154251542615427154281542915430154311543215433154341543515436154371543815439154401544115442154431544415445154461544715448154491545015451154521545315454154551545615457154581545915460154611546215463154641546515466154671546815469154701547115472154731547415475154761547715478154791548015481154821548315484154851548615487154881548915490154911549215493154941549515496154971549815499155001550115502155031550415505155061550715508155091551015511155121551315514155151551615517155181551915520155211552215523155241552515526155271552815529155301553115532155331553415535155361553715538155391554015541155421554315544155451554615547155481554915550155511555215553155541555515556155571555815559155601556115562155631556415565155661556715568155691557015571155721557315574155751557615577155781557915580155811558215583155841558515586155871558815589155901559115592155931559415595155961559715598155991560015601156021560315604156051560615607156081560915610156111561215613156141561515616156171561815619156201562115622156231562415625156261562715628156291563015631156321563315634156351563615637156381563915640156411564215643156441564515646156471564815649156501565115652156531565415655156561565715658156591566015661156621566315664156651566615667156681566915670156711567215673156741567515676156771567815679156801568115682156831568415685156861568715688156891569015691156921569315694156951569615697156981569915700157011570215703157041570515706157071570815709157101571115712157131571415715157161571715718157191572015721157221572315724157251572615727157281572915730157311573215733157341573515736157371573815739157401574115742157431574415745157461574715748157491575015751157521575315754157551575615757157581575915760157611576215763157641576515766157671576815769157701577115772157731577415775157761577715778157791578015781157821578315784157851578615787157881578915790157911579215793157941579515796157971579815799158001580115802158031580415805158061580715808158091581015811158121581315814158151581615817158181581915820158211582215823158241582515826158271582815829158301583115832158331583415835158361583715838158391584015841158421584315844158451584615847158481584915850158511585215853158541585515856158571585815859158601586115862158631586415865158661586715868158691587015871158721587315874158751587615877158781587915880158811588215883158841588515886158871588815889158901589115892158931589415895158961589715898158991590015901159021590315904159051590615907159081590915910159111591215913159141591515916159171591815919159201592115922159231592415925159261592715928159291593015931159321593315934159351593615937159381593915940159411594215943159441594515946159471594815949159501595115952159531595415955159561595715958159591596015961159621596315964159651596615967159681596915970159711597215973159741597515976159771597815979159801598115982159831598415985159861598715988159891599015991159921599315994159951599615997159981599916000160011600216003160041600516006160071600816009160101601116012160131601416015160161601716018160191602016021160221602316024160251602616027160281602916030160311603216033160341603516036160371603816039160401604116042160431604416045160461604716048160491605016051160521605316054160551605616057160581605916060160611606216063160641606516066160671606816069160701607116072160731607416075160761607716078160791608016081160821608316084160851608616087160881608916090160911609216093160941609516096160971609816099161001610116102161031610416105161061610716108161091611016111161121611316114161151611616117161181611916120161211612216123161241612516126161271612816129161301613116132161331613416135161361613716138161391614016141161421614316144161451614616147161481614916150161511615216153161541615516156161571615816159161601616116162161631616416165161661616716168161691617016171161721617316174161751617616177161781617916180161811618216183161841618516186161871618816189161901619116192161931619416195161961619716198161991620016201162021620316204162051620616207162081620916210162111621216213162141621516216162171621816219162201622116222162231622416225162261622716228162291623016231162321623316234162351623616237162381623916240162411624216243162441624516246162471624816249162501625116252162531625416255162561625716258162591626016261162621626316264162651626616267162681626916270162711627216273162741627516276162771627816279162801628116282162831628416285162861628716288162891629016291162921629316294162951629616297162981629916300163011630216303163041630516306163071630816309163101631116312163131631416315163161631716318163191632016321163221632316324163251632616327163281632916330163311633216333163341633516336163371633816339163401634116342163431634416345163461634716348163491635016351163521635316354163551635616357163581635916360163611636216363163641636516366163671636816369163701637116372163731637416375163761637716378163791638016381163821638316384163851638616387163881638916390163911639216393163941639516396163971639816399164001640116402164031640416405164061640716408164091641016411164121641316414164151641616417164181641916420164211642216423164241642516426164271642816429164301643116432164331643416435164361643716438164391644016441164421644316444164451644616447164481644916450164511645216453164541645516456164571645816459164601646116462164631646416465164661646716468164691647016471164721647316474164751647616477164781647916480164811648216483164841648516486164871648816489164901649116492164931649416495164961649716498164991650016501165021650316504165051650616507165081650916510165111651216513165141651516516165171651816519165201652116522165231652416525165261652716528165291653016531165321653316534165351653616537165381653916540165411654216543165441654516546165471654816549165501655116552165531655416555165561655716558165591656016561165621656316564165651656616567165681656916570165711657216573165741657516576165771657816579165801658116582165831658416585165861658716588165891659016591165921659316594165951659616597165981659916600166011660216603166041660516606166071660816609166101661116612166131661416615166161661716618166191662016621166221662316624166251662616627166281662916630166311663216633166341663516636166371663816639166401664116642166431664416645166461664716648166491665016651166521665316654166551665616657166581665916660166611666216663166641666516666166671666816669166701667116672166731667416675166761667716678166791668016681166821668316684166851668616687166881668916690166911669216693166941669516696166971669816699167001670116702167031670416705167061670716708167091671016711167121671316714167151671616717167181671916720167211672216723167241672516726167271672816729167301673116732167331673416735167361673716738167391674016741167421674316744167451674616747167481674916750167511675216753167541675516756167571675816759167601676116762167631676416765167661676716768167691677016771167721677316774167751677616777167781677916780167811678216783167841678516786167871678816789167901679116792167931679416795167961679716798167991680016801168021680316804168051680616807168081680916810168111681216813168141681516816168171681816819168201682116822168231682416825168261682716828168291683016831168321683316834168351683616837168381683916840168411684216843168441684516846168471684816849168501685116852168531685416855168561685716858168591686016861168621686316864168651686616867168681686916870168711687216873168741687516876168771687816879168801688116882168831688416885168861688716888168891689016891168921689316894168951689616897168981689916900169011690216903169041690516906169071690816909169101691116912169131691416915169161691716918169191692016921169221692316924169251692616927169281692916930169311693216933169341693516936169371693816939169401694116942169431694416945169461694716948169491695016951169521695316954169551695616957169581695916960169611696216963169641696516966169671696816969169701697116972169731697416975169761697716978169791698016981169821698316984169851698616987169881698916990169911699216993169941699516996169971699816999170001700117002170031700417005170061700717008170091701017011170121701317014170151701617017170181701917020170211702217023170241702517026170271702817029170301703117032170331703417035170361703717038170391704017041170421704317044170451704617047170481704917050170511705217053170541705517056170571705817059170601706117062170631706417065170661706717068170691707017071170721707317074170751707617077170781707917080170811708217083170841708517086170871708817089170901709117092170931709417095170961709717098170991710017101171021710317104171051710617107171081710917110171111711217113171141711517116171171711817119171201712117122171231712417125171261712717128171291713017131171321713317134171351713617137171381713917140171411714217143171441714517146171471714817149171501715117152171531715417155171561715717158171591716017161171621716317164171651716617167171681716917170171711717217173171741717517176171771717817179171801718117182171831718417185171861718717188171891719017191171921719317194171951719617197171981719917200172011720217203172041720517206172071720817209172101721117212172131721417215172161721717218172191722017221172221722317224172251722617227172281722917230172311723217233172341723517236172371723817239172401724117242172431724417245172461724717248172491725017251172521725317254172551725617257172581725917260172611726217263172641726517266172671726817269172701727117272172731727417275172761727717278172791728017281172821728317284172851728617287172881728917290172911729217293172941729517296172971729817299173001730117302173031730417305173061730717308173091731017311173121731317314173151731617317173181731917320173211732217323173241732517326173271732817329173301733117332173331733417335173361733717338173391734017341173421734317344173451734617347173481734917350173511735217353173541735517356173571735817359173601736117362173631736417365173661736717368173691737017371173721737317374173751737617377173781737917380173811738217383173841738517386173871738817389173901739117392173931739417395173961739717398173991740017401174021740317404174051740617407174081740917410174111741217413174141741517416174171741817419174201742117422174231742417425174261742717428174291743017431174321743317434174351743617437174381743917440174411744217443174441744517446174471744817449174501745117452174531745417455174561745717458174591746017461174621746317464174651746617467174681746917470174711747217473174741747517476174771747817479174801748117482174831748417485174861748717488174891749017491174921749317494174951749617497174981749917500175011750217503175041750517506175071750817509175101751117512175131751417515175161751717518175191752017521175221752317524175251752617527175281752917530175311753217533175341753517536175371753817539175401754117542175431754417545175461754717548175491755017551175521755317554175551755617557175581755917560175611756217563175641756517566175671756817569175701757117572175731757417575175761757717578175791758017581175821758317584175851758617587175881758917590175911759217593175941759517596175971759817599176001760117602176031760417605176061760717608176091761017611176121761317614176151761617617176181761917620176211762217623176241762517626176271762817629176301763117632176331763417635176361763717638176391764017641176421764317644176451764617647176481764917650176511765217653176541765517656176571765817659176601766117662176631766417665176661766717668176691767017671176721767317674176751767617677176781767917680176811768217683176841768517686176871768817689176901769117692176931769417695176961769717698176991770017701177021770317704177051770617707177081770917710177111771217713177141771517716177171771817719177201772117722177231772417725177261772717728177291773017731177321773317734177351773617737177381773917740177411774217743177441774517746177471774817749177501775117752177531775417755177561775717758177591776017761177621776317764177651776617767177681776917770177711777217773177741777517776177771777817779177801778117782177831778417785177861778717788177891779017791177921779317794177951779617797177981779917800178011780217803178041780517806178071780817809178101781117812178131781417815178161781717818178191782017821178221782317824178251782617827178281782917830178311783217833178341783517836178371783817839178401784117842178431784417845178461784717848178491785017851178521785317854178551785617857178581785917860178611786217863178641786517866178671786817869178701787117872178731787417875178761787717878178791788017881178821788317884178851788617887178881788917890178911789217893178941789517896178971789817899179001790117902179031790417905179061790717908179091791017911179121791317914179151791617917179181791917920179211792217923179241792517926179271792817929179301793117932179331793417935179361793717938179391794017941179421794317944179451794617947179481794917950179511795217953179541795517956179571795817959179601796117962179631796417965179661796717968179691797017971179721797317974179751797617977179781797917980179811798217983179841798517986179871798817989179901799117992179931799417995179961799717998179991800018001180021800318004180051800618007180081800918010180111801218013180141801518016180171801818019180201802118022180231802418025180261802718028180291803018031180321803318034180351803618037180381803918040180411804218043180441804518046180471804818049180501805118052180531805418055180561805718058180591806018061180621806318064180651806618067180681806918070180711807218073180741807518076180771807818079180801808118082180831808418085180861808718088180891809018091180921809318094180951809618097180981809918100181011810218103181041810518106181071810818109181101811118112181131811418115181161811718118181191812018121181221812318124181251812618127181281812918130181311813218133181341813518136181371813818139181401814118142181431814418145181461814718148181491815018151181521815318154181551815618157181581815918160181611816218163181641816518166181671816818169181701817118172181731817418175181761817718178181791818018181181821818318184181851818618187181881818918190181911819218193181941819518196181971819818199182001820118202182031820418205182061820718208182091821018211182121821318214182151821618217182181821918220182211822218223182241822518226182271822818229182301823118232182331823418235182361823718238182391824018241182421824318244182451824618247182481824918250182511825218253182541825518256182571825818259182601826118262182631826418265182661826718268182691827018271182721827318274182751827618277182781827918280182811828218283182841828518286182871828818289182901829118292182931829418295182961829718298182991830018301183021830318304183051830618307183081830918310183111831218313183141831518316183171831818319183201832118322183231832418325183261832718328183291833018331183321833318334183351833618337183381833918340183411834218343183441834518346183471834818349183501835118352183531835418355183561835718358183591836018361183621836318364183651836618367183681836918370183711837218373183741837518376183771837818379183801838118382183831838418385183861838718388183891839018391183921839318394183951839618397183981839918400184011840218403184041840518406184071840818409184101841118412184131841418415184161841718418184191842018421184221842318424184251842618427184281842918430184311843218433184341843518436184371843818439184401844118442184431844418445184461844718448184491845018451184521845318454184551845618457184581845918460184611846218463184641846518466184671846818469184701847118472184731847418475184761847718478184791848018481184821848318484184851848618487184881848918490184911849218493184941849518496184971849818499185001850118502185031850418505185061850718508185091851018511185121851318514185151851618517185181851918520185211852218523185241852518526185271852818529185301853118532185331853418535185361853718538185391854018541185421854318544185451854618547185481854918550185511855218553185541855518556185571855818559185601856118562185631856418565185661856718568185691857018571185721857318574185751857618577185781857918580185811858218583185841858518586185871858818589185901859118592185931859418595185961859718598185991860018601186021860318604186051860618607186081860918610186111861218613186141861518616186171861818619186201862118622186231862418625186261862718628186291863018631186321863318634186351863618637186381863918640186411864218643186441864518646186471864818649186501865118652186531865418655186561865718658186591866018661186621866318664186651866618667186681866918670186711867218673186741867518676186771867818679186801868118682186831868418685186861868718688186891869018691186921869318694186951869618697186981869918700187011870218703187041870518706187071870818709187101871118712187131871418715187161871718718187191872018721187221872318724187251872618727187281872918730187311873218733187341873518736187371873818739187401874118742187431874418745187461874718748187491875018751187521875318754187551875618757187581875918760187611876218763187641876518766187671876818769187701877118772187731877418775187761877718778187791878018781187821878318784187851878618787187881878918790187911879218793187941879518796187971879818799188001880118802188031880418805188061880718808188091881018811188121881318814188151881618817188181881918820188211882218823188241882518826188271882818829188301883118832188331883418835188361883718838188391884018841188421884318844188451884618847188481884918850188511885218853188541885518856188571885818859188601886118862188631886418865188661886718868188691887018871188721887318874188751887618877188781887918880188811888218883188841888518886188871888818889188901889118892188931889418895188961889718898188991890018901189021890318904189051890618907189081890918910189111891218913189141891518916189171891818919189201892118922189231892418925189261892718928189291893018931189321893318934189351893618937189381893918940189411894218943189441894518946189471894818949189501895118952189531895418955189561895718958189591896018961189621896318964189651896618967189681896918970189711897218973189741897518976189771897818979189801898118982189831898418985189861898718988189891899018991189921899318994189951899618997189981899919000190011900219003190041900519006190071900819009190101901119012190131901419015190161901719018190191902019021190221902319024190251902619027190281902919030190311903219033190341903519036190371903819039190401904119042190431904419045190461904719048190491905019051190521905319054190551905619057190581905919060190611906219063190641906519066190671906819069190701907119072190731907419075190761907719078190791908019081190821908319084190851908619087190881908919090190911909219093190941909519096190971909819099191001910119102191031910419105191061910719108191091911019111191121911319114191151911619117191181911919120191211912219123191241912519126191271912819129191301913119132191331913419135191361913719138191391914019141191421914319144191451914619147191481914919150191511915219153191541915519156191571915819159191601916119162191631916419165191661916719168191691917019171191721917319174191751917619177191781917919180191811918219183191841918519186191871918819189191901919119192191931919419195191961919719198191991920019201192021920319204192051920619207192081920919210192111921219213192141921519216192171921819219192201922119222192231922419225192261922719228192291923019231192321923319234192351923619237192381923919240192411924219243192441924519246192471924819249192501925119252192531925419255192561925719258192591926019261192621926319264192651926619267192681926919270192711927219273192741927519276192771927819279192801928119282192831928419285192861928719288192891929019291192921929319294192951929619297192981929919300193011930219303193041930519306193071930819309193101931119312193131931419315193161931719318193191932019321193221932319324193251932619327193281932919330193311933219333193341933519336193371933819339193401934119342193431934419345193461934719348193491935019351193521935319354193551935619357193581935919360193611936219363193641936519366193671936819369193701937119372193731937419375193761937719378193791938019381193821938319384193851938619387193881938919390193911939219393193941939519396193971939819399194001940119402194031940419405194061940719408194091941019411194121941319414194151941619417194181941919420194211942219423194241942519426194271942819429194301943119432194331943419435194361943719438194391944019441194421944319444194451944619447194481944919450194511945219453194541945519456194571945819459194601946119462194631946419465194661946719468194691947019471194721947319474194751947619477194781947919480194811948219483194841948519486194871948819489194901949119492194931949419495194961949719498194991950019501195021950319504195051950619507195081950919510195111951219513195141951519516195171951819519195201952119522195231952419525195261952719528195291953019531195321953319534195351953619537195381953919540195411954219543195441954519546195471954819549195501955119552195531955419555195561955719558195591956019561195621956319564195651956619567195681956919570195711957219573195741957519576195771957819579195801958119582195831958419585195861958719588195891959019591195921959319594195951959619597195981959919600196011960219603196041960519606196071960819609196101961119612196131961419615196161961719618196191962019621196221962319624196251962619627196281962919630196311963219633196341963519636196371963819639196401964119642196431964419645196461964719648196491965019651196521965319654196551965619657196581965919660196611966219663196641966519666196671966819669196701967119672196731967419675196761967719678196791968019681196821968319684196851968619687196881968919690196911969219693196941969519696196971969819699197001970119702197031970419705197061970719708197091971019711197121971319714197151971619717197181971919720197211972219723197241972519726197271972819729197301973119732197331973419735197361973719738197391974019741197421974319744197451974619747197481974919750197511975219753197541975519756197571975819759197601976119762197631976419765197661976719768197691977019771197721977319774197751977619777197781977919780197811978219783197841978519786197871978819789197901979119792197931979419795197961979719798197991980019801198021980319804198051980619807198081980919810198111981219813198141981519816198171981819819198201982119822198231982419825198261982719828198291983019831198321983319834198351983619837198381983919840198411984219843198441984519846198471984819849198501985119852198531985419855198561985719858198591986019861198621986319864198651986619867198681986919870198711987219873198741987519876198771987819879198801988119882198831988419885198861988719888198891989019891198921989319894198951989619897198981989919900199011990219903199041990519906199071990819909199101991119912199131991419915199161991719918199191992019921199221992319924199251992619927199281992919930199311993219933199341993519936199371993819939199401994119942199431994419945199461994719948199491995019951199521995319954199551995619957199581995919960199611996219963199641996519966199671996819969199701997119972199731997419975199761997719978199791998019981199821998319984199851998619987199881998919990199911999219993199941999519996199971999819999200002000120002200032000420005200062000720008200092001020011200122001320014200152001620017200182001920020200212002220023200242002520026200272002820029200302003120032200332003420035200362003720038200392004020041200422004320044200452004620047200482004920050200512005220053200542005520056200572005820059200602006120062200632006420065200662006720068200692007020071200722007320074200752007620077200782007920080200812008220083200842008520086200872008820089200902009120092200932009420095200962009720098200992010020101201022010320104201052010620107201082010920110201112011220113201142011520116201172011820119201202012120122201232012420125201262012720128201292013020131201322013320134201352013620137201382013920140201412014220143201442014520146201472014820149201502015120152201532015420155201562015720158201592016020161201622016320164201652016620167201682016920170201712017220173201742017520176201772017820179201802018120182201832018420185201862018720188201892019020191201922019320194201952019620197201982019920200202012020220203202042020520206202072020820209202102021120212202132021420215202162021720218202192022020221202222022320224202252022620227202282022920230202312023220233202342023520236202372023820239202402024120242202432024420245202462024720248202492025020251202522025320254202552025620257202582025920260202612026220263202642026520266202672026820269202702027120272202732027420275202762027720278202792028020281202822028320284202852028620287202882028920290202912029220293202942029520296202972029820299203002030120302203032030420305203062030720308203092031020311203122031320314203152031620317203182031920320203212032220323203242032520326203272032820329203302033120332203332033420335203362033720338203392034020341203422034320344203452034620347203482034920350203512035220353203542035520356203572035820359203602036120362203632036420365203662036720368203692037020371203722037320374203752037620377203782037920380203812038220383203842038520386203872038820389203902039120392203932039420395203962039720398203992040020401204022040320404204052040620407204082040920410204112041220413204142041520416204172041820419204202042120422204232042420425204262042720428204292043020431204322043320434204352043620437204382043920440204412044220443204442044520446204472044820449204502045120452204532045420455204562045720458204592046020461204622046320464204652046620467204682046920470204712047220473204742047520476204772047820479204802048120482204832048420485204862048720488204892049020491204922049320494204952049620497204982049920500205012050220503205042050520506205072050820509205102051120512205132051420515205162051720518205192052020521205222052320524205252052620527205282052920530205312053220533205342053520536205372053820539205402054120542205432054420545205462054720548205492055020551205522055320554205552055620557205582055920560205612056220563205642056520566205672056820569205702057120572205732057420575205762057720578205792058020581205822058320584205852058620587205882058920590205912059220593205942059520596205972059820599206002060120602206032060420605206062060720608206092061020611206122061320614206152061620617206182061920620206212062220623206242062520626206272062820629206302063120632206332063420635206362063720638206392064020641206422064320644206452064620647206482064920650206512065220653206542065520656206572065820659206602066120662206632066420665206662066720668206692067020671206722067320674206752067620677206782067920680206812068220683206842068520686206872068820689206902069120692206932069420695206962069720698206992070020701207022070320704207052070620707207082070920710207112071220713207142071520716207172071820719207202072120722207232072420725207262072720728207292073020731207322073320734207352073620737207382073920740207412074220743207442074520746207472074820749207502075120752207532075420755207562075720758207592076020761207622076320764207652076620767207682076920770207712077220773207742077520776207772077820779207802078120782207832078420785207862078720788207892079020791207922079320794207952079620797207982079920800208012080220803208042080520806208072080820809208102081120812208132081420815208162081720818208192082020821208222082320824208252082620827208282082920830208312083220833208342083520836208372083820839208402084120842208432084420845208462084720848208492085020851208522085320854208552085620857208582085920860208612086220863208642086520866208672086820869208702087120872208732087420875208762087720878208792088020881208822088320884208852088620887208882088920890208912089220893208942089520896208972089820899209002090120902209032090420905209062090720908209092091020911209122091320914209152091620917209182091920920209212092220923209242092520926209272092820929209302093120932209332093420935209362093720938209392094020941209422094320944209452094620947209482094920950209512095220953209542095520956209572095820959209602096120962209632096420965209662096720968209692097020971209722097320974209752097620977209782097920980209812098220983209842098520986209872098820989209902099120992209932099420995209962099720998209992100021001210022100321004210052100621007210082100921010210112101221013210142101521016210172101821019210202102121022210232102421025210262102721028210292103021031210322103321034210352103621037210382103921040210412104221043210442104521046210472104821049210502105121052210532105421055210562105721058210592106021061210622106321064210652106621067210682106921070210712107221073210742107521076210772107821079210802108121082210832108421085210862108721088210892109021091210922109321094210952109621097210982109921100211012110221103211042110521106211072110821109211102111121112211132111421115211162111721118211192112021121211222112321124211252112621127211282112921130211312113221133211342113521136211372113821139211402114121142211432114421145211462114721148211492115021151211522115321154211552115621157211582115921160211612116221163211642116521166211672116821169211702117121172211732117421175211762117721178211792118021181211822118321184211852118621187211882118921190211912119221193211942119521196211972119821199212002120121202212032120421205212062120721208212092121021211212122121321214212152121621217212182121921220212212122221223212242122521226212272122821229212302123121232212332123421235212362123721238212392124021241212422124321244212452124621247212482124921250212512125221253212542125521256212572125821259212602126121262212632126421265212662126721268212692127021271212722127321274212752127621277212782127921280212812128221283212842128521286212872128821289212902129121292212932129421295212962129721298212992130021301213022130321304213052130621307213082130921310213112131221313213142131521316213172131821319213202132121322213232132421325213262132721328213292133021331213322133321334213352133621337213382133921340213412134221343213442134521346213472134821349213502135121352213532135421355213562135721358213592136021361213622136321364213652136621367213682136921370213712137221373213742137521376213772137821379213802138121382213832138421385213862138721388213892139021391213922139321394213952139621397213982139921400214012140221403214042140521406214072140821409214102141121412214132141421415214162141721418214192142021421214222142321424214252142621427214282142921430214312143221433214342143521436214372143821439214402144121442214432144421445214462144721448214492145021451214522145321454214552145621457214582145921460214612146221463214642146521466214672146821469214702147121472214732147421475214762147721478214792148021481214822148321484214852148621487214882148921490214912149221493214942149521496214972149821499215002150121502215032150421505215062150721508215092151021511215122151321514215152151621517215182151921520215212152221523215242152521526215272152821529215302153121532215332153421535215362153721538215392154021541215422154321544215452154621547215482154921550215512155221553215542155521556215572155821559215602156121562215632156421565215662156721568215692157021571215722157321574215752157621577215782157921580215812158221583215842158521586215872158821589215902159121592215932159421595215962159721598215992160021601216022160321604216052160621607216082160921610216112161221613216142161521616216172161821619216202162121622216232162421625216262162721628216292163021631216322163321634216352163621637216382163921640216412164221643216442164521646216472164821649216502165121652216532165421655216562165721658216592166021661216622166321664216652166621667216682166921670216712167221673216742167521676216772167821679216802168121682216832168421685216862168721688216892169021691216922169321694216952169621697216982169921700217012170221703217042170521706217072170821709217102171121712217132171421715217162171721718217192172021721217222172321724217252172621727217282172921730217312173221733217342173521736217372173821739217402174121742217432174421745217462174721748217492175021751217522175321754217552175621757217582175921760217612176221763217642176521766217672176821769217702177121772217732177421775217762177721778217792178021781217822178321784217852178621787217882178921790217912179221793217942179521796217972179821799218002180121802218032180421805218062180721808218092181021811218122181321814218152181621817218182181921820218212182221823218242182521826218272182821829218302183121832218332183421835218362183721838218392184021841218422184321844218452184621847218482184921850218512185221853218542185521856218572185821859218602186121862218632186421865218662186721868218692187021871218722187321874218752187621877218782187921880218812188221883218842188521886218872188821889218902189121892218932189421895218962189721898218992190021901219022190321904219052190621907219082190921910219112191221913219142191521916219172191821919219202192121922219232192421925219262192721928219292193021931219322193321934219352193621937219382193921940219412194221943219442194521946219472194821949219502195121952219532195421955219562195721958219592196021961219622196321964219652196621967219682196921970219712197221973219742197521976219772197821979219802198121982219832198421985219862198721988219892199021991219922199321994219952199621997219982199922000220012200222003220042200522006220072200822009220102201122012220132201422015220162201722018220192202022021220222202322024220252202622027220282202922030220312203222033220342203522036220372203822039220402204122042220432204422045220462204722048220492205022051220522205322054220552205622057220582205922060220612206222063220642206522066220672206822069220702207122072220732207422075220762207722078220792208022081220822208322084220852208622087220882208922090220912209222093220942209522096220972209822099221002210122102221032210422105221062210722108221092211022111221122211322114221152211622117221182211922120221212212222123221242212522126221272212822129221302213122132221332213422135221362213722138221392214022141221422214322144221452214622147221482214922150221512215222153221542215522156221572215822159221602216122162221632216422165221662216722168221692217022171221722217322174221752217622177221782217922180221812218222183221842218522186221872218822189221902219122192221932219422195221962219722198221992220022201222022220322204222052220622207222082220922210222112221222213222142221522216222172221822219222202222122222222232222422225222262222722228222292223022231222322223322234222352223622237222382223922240222412224222243222442224522246222472224822249222502225122252222532225422255222562225722258222592226022261222622226322264222652226622267222682226922270222712227222273222742227522276222772227822279222802228122282222832228422285222862228722288222892229022291222922229322294222952229622297222982229922300223012230222303223042230522306223072230822309223102231122312223132231422315223162231722318223192232022321223222232322324223252232622327223282232922330223312233222333223342233522336223372233822339223402234122342223432234422345223462234722348223492235022351223522235322354223552235622357223582235922360223612236222363223642236522366223672236822369223702237122372223732237422375223762237722378223792238022381223822238322384223852238622387223882238922390223912239222393223942239522396223972239822399224002240122402224032240422405224062240722408224092241022411224122241322414224152241622417224182241922420224212242222423224242242522426224272242822429224302243122432224332243422435224362243722438224392244022441224422244322444224452244622447224482244922450224512245222453224542245522456224572245822459224602246122462224632246422465224662246722468224692247022471224722247322474224752247622477224782247922480224812248222483224842248522486224872248822489224902249122492224932249422495224962249722498224992250022501225022250322504225052250622507225082250922510225112251222513225142251522516225172251822519225202252122522225232252422525225262252722528225292253022531225322253322534225352253622537225382253922540225412254222543225442254522546225472254822549225502255122552225532255422555225562255722558225592256022561225622256322564225652256622567225682256922570225712257222573225742257522576225772257822579225802258122582225832258422585225862258722588225892259022591225922259322594225952259622597225982259922600226012260222603226042260522606226072260822609226102261122612226132261422615226162261722618226192262022621226222262322624226252262622627226282262922630226312263222633226342263522636226372263822639226402264122642226432264422645226462264722648226492265022651226522265322654226552265622657226582265922660226612266222663226642266522666226672266822669226702267122672226732267422675226762267722678226792268022681226822268322684226852268622687226882268922690226912269222693226942269522696226972269822699227002270122702227032270422705227062270722708227092271022711227122271322714227152271622717227182271922720227212272222723227242272522726227272272822729227302273122732227332273422735227362273722738227392274022741227422274322744227452274622747227482274922750227512275222753227542275522756227572275822759227602276122762227632276422765227662276722768227692277022771227722277322774227752277622777227782277922780227812278222783227842278522786227872278822789227902279122792227932279422795227962279722798227992280022801228022280322804228052280622807228082280922810228112281222813228142281522816228172281822819228202282122822228232282422825228262282722828228292283022831228322283322834228352283622837228382283922840228412284222843228442284522846228472284822849228502285122852228532285422855228562285722858228592286022861228622286322864228652286622867228682286922870228712287222873228742287522876228772287822879228802288122882228832288422885228862288722888228892289022891228922289322894228952289622897228982289922900229012290222903229042290522906229072290822909229102291122912229132291422915229162291722918229192292022921229222292322924229252292622927229282292922930229312293222933229342293522936229372293822939229402294122942229432294422945229462294722948229492295022951229522295322954229552295622957229582295922960229612296222963229642296522966229672296822969229702297122972229732297422975229762297722978229792298022981229822298322984229852298622987229882298922990229912299222993229942299522996229972299822999230002300123002230032300423005230062300723008230092301023011230122301323014230152301623017230182301923020230212302223023230242302523026230272302823029230302303123032230332303423035230362303723038230392304023041230422304323044230452304623047230482304923050230512305223053230542305523056230572305823059230602306123062230632306423065230662306723068230692307023071230722307323074230752307623077230782307923080230812308223083230842308523086230872308823089230902309123092230932309423095230962309723098230992310023101231022310323104231052310623107231082310923110231112311223113231142311523116231172311823119231202312123122231232312423125231262312723128231292313023131231322313323134231352313623137231382313923140231412314223143231442314523146231472314823149231502315123152231532315423155231562315723158231592316023161231622316323164231652316623167231682316923170231712317223173231742317523176231772317823179231802318123182231832318423185231862318723188231892319023191231922319323194231952319623197231982319923200232012320223203232042320523206232072320823209232102321123212232132321423215232162321723218232192322023221232222322323224232252322623227232282322923230232312323223233232342323523236232372323823239232402324123242232432324423245232462324723248232492325023251232522325323254232552325623257232582325923260232612326223263232642326523266232672326823269232702327123272232732327423275232762327723278232792328023281232822328323284232852328623287232882328923290232912329223293232942329523296232972329823299233002330123302233032330423305233062330723308233092331023311233122331323314233152331623317233182331923320233212332223323233242332523326233272332823329233302333123332233332333423335233362333723338233392334023341233422334323344233452334623347233482334923350233512335223353233542335523356233572335823359233602336123362233632336423365233662336723368233692337023371233722337323374233752337623377233782337923380233812338223383233842338523386233872338823389233902339123392233932339423395233962339723398233992340023401234022340323404234052340623407234082340923410234112341223413234142341523416234172341823419234202342123422234232342423425234262342723428234292343023431234322343323434234352343623437234382343923440234412344223443234442344523446234472344823449234502345123452234532345423455234562345723458234592346023461234622346323464234652346623467234682346923470234712347223473234742347523476234772347823479234802348123482234832348423485234862348723488234892349023491234922349323494234952349623497234982349923500235012350223503235042350523506235072350823509235102351123512235132351423515235162351723518235192352023521235222352323524235252352623527235282352923530235312353223533235342353523536235372353823539235402354123542235432354423545235462354723548235492355023551235522355323554235552355623557235582355923560235612356223563235642356523566235672356823569235702357123572235732357423575235762357723578235792358023581235822358323584235852358623587235882358923590235912359223593235942359523596235972359823599236002360123602236032360423605236062360723608236092361023611236122361323614236152361623617236182361923620236212362223623236242362523626236272362823629236302363123632236332363423635236362363723638236392364023641236422364323644236452364623647236482364923650236512365223653236542365523656236572365823659236602366123662236632366423665236662366723668236692367023671236722367323674236752367623677236782367923680236812368223683236842368523686236872368823689236902369123692236932369423695236962369723698236992370023701237022370323704237052370623707237082370923710237112371223713237142371523716237172371823719237202372123722237232372423725237262372723728237292373023731237322373323734237352373623737237382373923740237412374223743237442374523746237472374823749237502375123752237532375423755237562375723758237592376023761237622376323764237652376623767237682376923770237712377223773237742377523776237772377823779237802378123782237832378423785237862378723788237892379023791237922379323794237952379623797237982379923800238012380223803238042380523806238072380823809238102381123812238132381423815238162381723818238192382023821238222382323824238252382623827238282382923830238312383223833238342383523836238372383823839238402384123842238432384423845238462384723848238492385023851238522385323854238552385623857238582385923860238612386223863238642386523866238672386823869238702387123872238732387423875238762387723878238792388023881238822388323884238852388623887238882388923890238912389223893238942389523896238972389823899239002390123902239032390423905239062390723908239092391023911239122391323914239152391623917239182391923920239212392223923239242392523926239272392823929239302393123932239332393423935239362393723938239392394023941239422394323944239452394623947239482394923950239512395223953239542395523956239572395823959239602396123962239632396423965239662396723968239692397023971239722397323974239752397623977239782397923980239812398223983239842398523986239872398823989239902399123992239932399423995239962399723998239992400024001240022400324004240052400624007240082400924010240112401224013240142401524016240172401824019240202402124022240232402424025240262402724028240292403024031240322403324034240352403624037240382403924040240412404224043240442404524046240472404824049240502405124052240532405424055240562405724058240592406024061240622406324064240652406624067240682406924070240712407224073240742407524076240772407824079240802408124082240832408424085240862408724088240892409024091240922409324094240952409624097240982409924100241012410224103241042410524106241072410824109241102411124112241132411424115241162411724118241192412024121241222412324124241252412624127241282412924130241312413224133241342413524136241372413824139241402414124142241432414424145241462414724148241492415024151241522415324154241552415624157241582415924160241612416224163241642416524166241672416824169241702417124172241732417424175241762417724178241792418024181241822418324184241852418624187241882418924190241912419224193241942419524196241972419824199242002420124202242032420424205242062420724208242092421024211242122421324214242152421624217242182421924220242212422224223242242422524226242272422824229242302423124232242332423424235242362423724238242392424024241242422424324244242452424624247242482424924250242512425224253242542425524256242572425824259242602426124262242632426424265242662426724268242692427024271242722427324274242752427624277242782427924280242812428224283242842428524286242872428824289242902429124292242932429424295242962429724298242992430024301243022430324304243052430624307243082430924310243112431224313243142431524316243172431824319243202432124322243232432424325243262432724328243292433024331243322433324334243352433624337243382433924340243412434224343243442434524346243472434824349243502435124352243532435424355243562435724358243592436024361243622436324364243652436624367243682436924370243712437224373243742437524376243772437824379243802438124382243832438424385243862438724388243892439024391243922439324394243952439624397243982439924400244012440224403244042440524406244072440824409244102441124412244132441424415244162441724418244192442024421244222442324424244252442624427244282442924430244312443224433244342443524436244372443824439244402444124442244432444424445244462444724448244492445024451244522445324454244552445624457244582445924460244612446224463244642446524466244672446824469244702447124472244732447424475244762447724478244792448024481244822448324484244852448624487244882448924490244912449224493244942449524496244972449824499245002450124502245032450424505245062450724508245092451024511245122451324514245152451624517245182451924520245212452224523245242452524526245272452824529245302453124532245332453424535245362453724538245392454024541245422454324544245452454624547245482454924550245512455224553245542455524556245572455824559245602456124562245632456424565245662456724568245692457024571245722457324574245752457624577245782457924580245812458224583245842458524586245872458824589245902459124592245932459424595245962459724598245992460024601246022460324604246052460624607246082460924610246112461224613246142461524616246172461824619246202462124622246232462424625246262462724628246292463024631246322463324634246352463624637246382463924640246412464224643246442464524646246472464824649246502465124652246532465424655246562465724658246592466024661246622466324664246652466624667246682466924670246712467224673246742467524676246772467824679246802468124682246832468424685246862468724688246892469024691246922469324694246952469624697246982469924700247012470224703247042470524706247072470824709247102471124712247132471424715247162471724718247192472024721247222472324724247252472624727247282472924730247312473224733247342473524736247372473824739247402474124742247432474424745247462474724748247492475024751247522475324754247552475624757247582475924760247612476224763247642476524766247672476824769247702477124772247732477424775247762477724778247792478024781247822478324784247852478624787247882478924790247912479224793247942479524796247972479824799248002480124802248032480424805248062480724808248092481024811248122481324814248152481624817248182481924820248212482224823248242482524826248272482824829248302483124832248332483424835248362483724838248392484024841248422484324844248452484624847248482484924850248512485224853248542485524856248572485824859248602486124862248632486424865248662486724868248692487024871248722487324874248752487624877248782487924880248812488224883248842488524886248872488824889248902489124892248932489424895248962489724898248992490024901249022490324904249052490624907249082490924910249112491224913249142491524916249172491824919249202492124922249232492424925249262492724928249292493024931249322493324934249352493624937249382493924940249412494224943249442494524946249472494824949249502495124952249532495424955249562495724958249592496024961249622496324964249652496624967249682496924970249712497224973249742497524976249772497824979249802498124982249832498424985249862498724988249892499024991249922499324994249952499624997249982499925000250012500225003250042500525006250072500825009250102501125012250132501425015250162501725018250192502025021250222502325024250252502625027250282502925030250312503225033250342503525036250372503825039250402504125042250432504425045250462504725048250492505025051250522505325054250552505625057250582505925060250612506225063250642506525066250672506825069250702507125072250732507425075250762507725078250792508025081250822508325084250852508625087250882508925090250912509225093250942509525096250972509825099251002510125102251032510425105251062510725108251092511025111251122511325114251152511625117251182511925120251212512225123251242512525126251272512825129251302513125132251332513425135251362513725138251392514025141251422514325144251452514625147251482514925150251512515225153251542515525156251572515825159251602516125162251632516425165251662516725168251692517025171251722517325174251752517625177251782517925180251812518225183251842518525186251872518825189251902519125192251932519425195251962519725198251992520025201252022520325204252052520625207252082520925210252112521225213252142521525216252172521825219252202522125222252232522425225252262522725228252292523025231252322523325234252352523625237252382523925240252412524225243252442524525246252472524825249252502525125252252532525425255252562525725258252592526025261252622526325264252652526625267252682526925270252712527225273252742527525276252772527825279252802528125282252832528425285252862528725288252892529025291252922529325294252952529625297252982529925300253012530225303253042530525306253072530825309253102531125312253132531425315253162531725318253192532025321253222532325324253252532625327253282532925330253312533225333253342533525336253372533825339253402534125342253432534425345253462534725348253492535025351253522535325354253552535625357253582535925360253612536225363253642536525366253672536825369253702537125372253732537425375253762537725378253792538025381253822538325384253852538625387253882538925390253912539225393253942539525396253972539825399254002540125402254032540425405254062540725408254092541025411254122541325414254152541625417254182541925420254212542225423254242542525426254272542825429254302543125432254332543425435254362543725438254392544025441254422544325444254452544625447254482544925450254512545225453254542545525456254572545825459254602546125462254632546425465254662546725468254692547025471254722547325474254752547625477254782547925480254812548225483254842548525486254872548825489254902549125492254932549425495254962549725498254992550025501255022550325504255052550625507255082550925510255112551225513255142551525516255172551825519255202552125522255232552425525255262552725528255292553025531255322553325534255352553625537255382553925540255412554225543255442554525546255472554825549255502555125552255532555425555255562555725558255592556025561255622556325564255652556625567255682556925570255712557225573255742557525576255772557825579255802558125582255832558425585255862558725588255892559025591255922559325594255952559625597255982559925600256012560225603256042560525606256072560825609256102561125612256132561425615256162561725618256192562025621256222562325624256252562625627256282562925630256312563225633256342563525636256372563825639256402564125642256432564425645256462564725648256492565025651256522565325654256552565625657256582565925660256612566225663256642566525666256672566825669256702567125672256732567425675256762567725678256792568025681256822568325684256852568625687256882568925690 |
- This is autoconf.info, produced by makeinfo version 4.13 from
- autoconf.texi.
- This manual (24 April 2012) is for GNU Autoconf (version 2.69), a
- package for creating scripts to configure source code packages using
- templates and an M4 macro package.
- Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
- Permission is granted to copy, distribute and/or modify this
- document under the terms of the GNU Free Documentation License,
- Version 1.3 or any later version published by the Free Software
- Foundation; with no Invariant Sections, no Front-Cover texts, and
- no Back-Cover Texts. A copy of the license is included in the
- section entitled "GNU Free Documentation License."
- INFO-DIR-SECTION Software development
- START-INFO-DIR-ENTRY
- * Autoconf: (autoconf). Create source code configuration scripts.
- END-INFO-DIR-ENTRY
- INFO-DIR-SECTION Individual utilities
- START-INFO-DIR-ENTRY
- * autoscan: (autoconf)autoscan Invocation.
- Semi-automatic `configure.ac' writing
- * ifnames: (autoconf)ifnames Invocation. Listing conditionals in source.
- * autoconf-invocation: (autoconf)autoconf Invocation.
- How to create configuration scripts
- * autoreconf: (autoconf)autoreconf Invocation.
- Remaking multiple `configure' scripts
- * autoheader: (autoconf)autoheader Invocation.
- How to create configuration templates
- * autom4te: (autoconf)autom4te Invocation.
- The Autoconf executables backbone
- * configure: (autoconf)configure Invocation. Configuring a package.
- * autoupdate: (autoconf)autoupdate Invocation.
- Automatic update of `configure.ac'
- * config.status: (autoconf)config.status Invocation. Recreating configurations.
- * testsuite: (autoconf)testsuite Invocation. Running an Autotest test suite.
- END-INFO-DIR-ENTRY
- File: autoconf.info, Node: Top, Next: Introduction, Up: (dir)
- Autoconf
- ********
- This manual (24 April 2012) is for GNU Autoconf (version 2.69), a
- package for creating scripts to configure source code packages using
- templates and an M4 macro package.
- Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
- Permission is granted to copy, distribute and/or modify this
- document under the terms of the GNU Free Documentation License,
- Version 1.3 or any later version published by the Free Software
- Foundation; with no Invariant Sections, no Front-Cover texts, and
- no Back-Cover Texts. A copy of the license is included in the
- section entitled "GNU Free Documentation License."
- * Menu:
- * Introduction:: Autoconf's purpose, strengths, and weaknesses
- * The GNU Build System:: A set of tools for portable software packages
- * Making configure Scripts:: How to organize and produce Autoconf scripts
- * Setup:: Initialization and output
- * Existing Tests:: Macros that check for particular features
- * Writing Tests:: How to write new feature checks
- * Results:: What to do with results from feature checks
- * Programming in M4:: Layers on top of which Autoconf is written
- * Programming in M4sh:: Shell portability layer
- * Writing Autoconf Macros:: Adding new macros to Autoconf
- * Portable Shell:: Shell script portability pitfalls
- * Portable Make:: Makefile portability pitfalls
- * Portable C and C++:: C and C++ portability pitfalls
- * Manual Configuration:: Selecting features that can't be guessed
- * Site Configuration:: Local defaults for `configure'
- * Running configure Scripts:: How to use the Autoconf output
- * config.status Invocation:: Recreating a configuration
- * Obsolete Constructs:: Kept for backward compatibility
- * Using Autotest:: Creating portable test suites
- * FAQ:: Frequent Autoconf Questions, with answers
- * History:: History of Autoconf
- * GNU Free Documentation License:: License for copying this manual
- * Indices:: Indices of symbols, concepts, etc.
- --- The Detailed Node Listing ---
- The GNU Build System
- * Automake:: Escaping makefile hell
- * Gnulib:: The GNU portability library
- * Libtool:: Building libraries portably
- * Pointers:: More info on the GNU build system
- Making `configure' Scripts
- * Writing Autoconf Input:: What to put in an Autoconf input file
- * autoscan Invocation:: Semi-automatic `configure.ac' writing
- * ifnames Invocation:: Listing the conditionals in source code
- * autoconf Invocation:: How to create configuration scripts
- * autoreconf Invocation:: Remaking multiple `configure' scripts
- Writing `configure.ac'
- * Shell Script Compiler:: Autoconf as solution of a problem
- * Autoconf Language:: Programming in Autoconf
- * Autoconf Input Layout:: Standard organization of `configure.ac'
- Initialization and Output Files
- * Initializing configure:: Option processing etc.
- * Versioning:: Dealing with Autoconf versions
- * Notices:: Copyright, version numbers in `configure'
- * Input:: Where Autoconf should find files
- * Output:: Outputting results from the configuration
- * Configuration Actions:: Preparing the output based on results
- * Configuration Files:: Creating output files
- * Makefile Substitutions:: Using output variables in makefiles
- * Configuration Headers:: Creating a configuration header file
- * Configuration Commands:: Running arbitrary instantiation commands
- * Configuration Links:: Links depending on the configuration
- * Subdirectories:: Configuring independent packages together
- * Default Prefix:: Changing the default installation prefix
- Substitutions in Makefiles
- * Preset Output Variables:: Output variables that are always set
- * Installation Directory Variables:: Other preset output variables
- * Changed Directory Variables:: Warnings about `datarootdir'
- * Build Directories:: Supporting multiple concurrent compiles
- * Automatic Remaking:: Makefile rules for configuring
- Configuration Header Files
- * Header Templates:: Input for the configuration headers
- * autoheader Invocation:: How to create configuration templates
- * Autoheader Macros:: How to specify CPP templates
- Existing Tests
- * Common Behavior:: Macros' standard schemes
- * Alternative Programs:: Selecting between alternative programs
- * Files:: Checking for the existence of files
- * Libraries:: Library archives that might be missing
- * Library Functions:: C library functions that might be missing
- * Header Files:: Header files that might be missing
- * Declarations:: Declarations that may be missing
- * Structures:: Structures or members that might be missing
- * Types:: Types that might be missing
- * Compilers and Preprocessors:: Checking for compiling programs
- * System Services:: Operating system services
- * Posix Variants:: Special kludges for specific Posix variants
- * Erlang Libraries:: Checking for the existence of Erlang libraries
- Common Behavior
- * Standard Symbols:: Symbols defined by the macros
- * Default Includes:: Includes used by the generic macros
- Alternative Programs
- * Particular Programs:: Special handling to find certain programs
- * Generic Programs:: How to find other programs
- Library Functions
- * Function Portability:: Pitfalls with usual functions
- * Particular Functions:: Special handling to find certain functions
- * Generic Functions:: How to find other functions
- Header Files
- * Header Portability:: Collected knowledge on common headers
- * Particular Headers:: Special handling to find certain headers
- * Generic Headers:: How to find other headers
- Declarations
- * Particular Declarations:: Macros to check for certain declarations
- * Generic Declarations:: How to find other declarations
- Structures
- * Particular Structures:: Macros to check for certain structure members
- * Generic Structures:: How to find other structure members
- Types
- * Particular Types:: Special handling to find certain types
- * Generic Types:: How to find other types
- Compilers and Preprocessors
- * Specific Compiler Characteristics:: Some portability issues
- * Generic Compiler Characteristics:: Language independent tests and features
- * C Compiler:: Checking its characteristics
- * C++ Compiler:: Likewise
- * Objective C Compiler:: Likewise
- * Objective C++ Compiler:: Likewise
- * Erlang Compiler and Interpreter:: Likewise
- * Fortran Compiler:: Likewise
- * Go Compiler:: Likewise
- Writing Tests
- * Language Choice:: Selecting which language to use for testing
- * Writing Test Programs:: Forging source files for compilers
- * Running the Preprocessor:: Detecting preprocessor symbols
- * Running the Compiler:: Detecting language or header features
- * Running the Linker:: Detecting library features
- * Runtime:: Testing for runtime features
- * Systemology:: A zoology of operating systems
- * Multiple Cases:: Tests for several possible values
- Writing Test Programs
- * Guidelines:: General rules for writing test programs
- * Test Functions:: Avoiding pitfalls in test programs
- * Generating Sources:: Source program boilerplate
- Results of Tests
- * Defining Symbols:: Defining C preprocessor symbols
- * Setting Output Variables:: Replacing variables in output files
- * Special Chars in Variables:: Characters to beware of in variables
- * Caching Results:: Speeding up subsequent `configure' runs
- * Printing Messages:: Notifying `configure' users
- Caching Results
- * Cache Variable Names:: Shell variables used in caches
- * Cache Files:: Files `configure' uses for caching
- * Cache Checkpointing:: Loading and saving the cache file
- Programming in M4
- * M4 Quotation:: Protecting macros from unwanted expansion
- * Using autom4te:: The Autoconf executables backbone
- * Programming in M4sugar:: Convenient pure M4 macros
- * Debugging via autom4te:: Figuring out what M4 was doing
- M4 Quotation
- * Active Characters:: Characters that change the behavior of M4
- * One Macro Call:: Quotation and one macro call
- * Quoting and Parameters:: M4 vs. shell parameters
- * Quotation and Nested Macros:: Macros calling macros
- * Changequote is Evil:: Worse than INTERCAL: M4 + changequote
- * Quadrigraphs:: Another way to escape special characters
- * Balancing Parentheses:: Dealing with unbalanced parentheses
- * Quotation Rule Of Thumb:: One parenthesis, one quote
- Using `autom4te'
- * autom4te Invocation:: A GNU M4 wrapper
- * Customizing autom4te:: Customizing the Autoconf package
- Programming in M4sugar
- * Redefined M4 Macros:: M4 builtins changed in M4sugar
- * Diagnostic Macros:: Diagnostic messages from M4sugar
- * Diversion support:: Diversions in M4sugar
- * Conditional constructs:: Conditions in M4
- * Looping constructs:: Iteration in M4
- * Evaluation Macros:: More quotation and evaluation control
- * Text processing Macros:: String manipulation in M4
- * Number processing Macros:: Arithmetic computation in M4
- * Set manipulation Macros:: Set manipulation in M4
- * Forbidden Patterns:: Catching unexpanded macros
- Programming in M4sh
- * Common Shell Constructs:: Portability layer for common shell constructs
- * Polymorphic Variables:: Support for indirect variable names
- * Initialization Macros:: Macros to establish a sane shell environment
- * File Descriptor Macros:: File descriptor macros for input and output
- Writing Autoconf Macros
- * Macro Definitions:: Basic format of an Autoconf macro
- * Macro Names:: What to call your new macros
- * Reporting Messages:: Notifying `autoconf' users
- * Dependencies Between Macros:: What to do when macros depend on other macros
- * Obsoleting Macros:: Warning about old ways of doing things
- * Coding Style:: Writing Autoconf macros a` la Autoconf
- Dependencies Between Macros
- * Prerequisite Macros:: Ensuring required information
- * Suggested Ordering:: Warning about possible ordering problems
- * One-Shot Macros:: Ensuring a macro is called only once
- Portable Shell Programming
- * Shellology:: A zoology of shells
- * Invoking the Shell:: Invoking the shell as a command
- * Here-Documents:: Quirks and tricks
- * File Descriptors:: FDs and redirections
- * Signal Handling:: Shells, signals, and headaches
- * File System Conventions:: File names
- * Shell Pattern Matching:: Pattern matching
- * Shell Substitutions:: Variable and command expansions
- * Assignments:: Varying side effects of assignments
- * Parentheses:: Parentheses in shell scripts
- * Slashes:: Slashes in shell scripts
- * Special Shell Variables:: Variables you should not change
- * Shell Functions:: What to look out for if you use them
- * Limitations of Builtins:: Portable use of not so portable /bin/sh
- * Limitations of Usual Tools:: Portable use of portable tools
- Portable Make Programming
- * $< in Ordinary Make Rules:: $< in ordinary rules
- * Failure in Make Rules:: Failing portably in rules
- * Special Chars in Names:: Special Characters in Macro Names
- * Backslash-Newline-Empty:: Empty lines after backslash-newline
- * Backslash-Newline Comments:: Spanning comments across line boundaries
- * Long Lines in Makefiles:: Line length limitations
- * Macros and Submakes:: `make macro=value' and submakes
- * The Make Macro MAKEFLAGS:: `$(MAKEFLAGS)' portability issues
- * The Make Macro SHELL:: `$(SHELL)' portability issues
- * Parallel Make:: Parallel `make' quirks
- * Comments in Make Rules:: Other problems with Make comments
- * Newlines in Make Rules:: Using literal newlines in rules
- * Comments in Make Macros:: Other problems with Make comments in macros
- * Trailing whitespace in Make Macros:: Macro substitution problems
- * Command-line Macros and whitespace:: Whitespace trimming of values
- * obj/ and Make:: Don't name a subdirectory `obj'
- * make -k Status:: Exit status of `make -k'
- * VPATH and Make:: `VPATH' woes
- * Single Suffix Rules:: Single suffix rules and separated dependencies
- * Timestamps and Make:: Subsecond timestamp resolution
- `VPATH' and Make
- * Variables listed in VPATH:: `VPATH' must be literal on ancient hosts
- * VPATH and Double-colon:: Problems with `::' on ancient hosts
- * $< in Explicit Rules:: `$<' does not work in ordinary rules
- * Automatic Rule Rewriting:: `VPATH' goes wild on Solaris
- * Tru64 Directory Magic:: `mkdir' goes wild on Tru64
- * Make Target Lookup:: More details about `VPATH' lookup
- Portable C and C++ Programming
- * Varieties of Unportability:: How to make your programs unportable
- * Integer Overflow:: When integers get too large
- * Preprocessor Arithmetic:: `#if' expression problems
- * Null Pointers:: Properties of null pointers
- * Buffer Overruns:: Subscript errors and the like
- * Volatile Objects:: `volatile' and signals
- * Floating Point Portability:: Portable floating-point arithmetic
- * Exiting Portably:: Exiting and the exit status
- Integer Overflow
- * Integer Overflow Basics:: Why integer overflow is a problem
- * Signed Overflow Examples:: Examples of code assuming wraparound
- * Optimization and Wraparound:: Optimizations that break uses of wraparound
- * Signed Overflow Advice:: Practical advice for signed overflow issues
- * Signed Integer Division:: `INT_MIN / -1' and `INT_MIN % -1'
- Manual Configuration
- * Specifying Target Triplets:: Specifying target triplets
- * Canonicalizing:: Getting the canonical system type
- * Using System Type:: What to do with the system type
- Site Configuration
- * Help Formatting:: Customizing `configure --help'
- * External Software:: Working with other optional software
- * Package Options:: Selecting optional features
- * Pretty Help Strings:: Formatting help string
- * Option Checking:: Controlling checking of `configure' options
- * Site Details:: Configuring site details
- * Transforming Names:: Changing program names when installing
- * Site Defaults:: Giving `configure' local defaults
- Transforming Program Names When Installing
- * Transformation Options:: `configure' options to transform names
- * Transformation Examples:: Sample uses of transforming names
- * Transformation Rules:: Makefile uses of transforming names
- Running `configure' Scripts
- * Basic Installation:: Instructions for typical cases
- * Compilers and Options:: Selecting compilers and optimization
- * Multiple Architectures:: Compiling for multiple architectures at once
- * Installation Names:: Installing in different directories
- * Optional Features:: Selecting optional features
- * Particular Systems:: Particular systems
- * System Type:: Specifying the system type
- * Sharing Defaults:: Setting site-wide defaults for `configure'
- * Defining Variables:: Specifying the compiler etc.
- * configure Invocation:: Changing how `configure' runs
- Obsolete Constructs
- * Obsolete config.status Use:: Obsolete convention for `config.status'
- * acconfig Header:: Additional entries in `config.h.in'
- * autoupdate Invocation:: Automatic update of `configure.ac'
- * Obsolete Macros:: Backward compatibility macros
- * Autoconf 1:: Tips for upgrading your files
- * Autoconf 2.13:: Some fresher tips
- Upgrading From Version 1
- * Changed File Names:: Files you might rename
- * Changed Makefiles:: New things to put in `Makefile.in'
- * Changed Macros:: Macro calls you might replace
- * Changed Results:: Changes in how to check test results
- * Changed Macro Writing:: Better ways to write your own macros
- Upgrading From Version 2.13
- * Changed Quotation:: Broken code which used to work
- * New Macros:: Interaction with foreign macros
- * Hosts and Cross-Compilation:: Bugward compatibility kludges
- * AC_LIBOBJ vs LIBOBJS:: LIBOBJS is a forbidden token
- * AC_ACT_IFELSE vs AC_TRY_ACT:: A more generic scheme for testing sources
- Generating Test Suites with Autotest
- * Using an Autotest Test Suite:: Autotest and the user
- * Writing Testsuites:: Autotest macros
- * testsuite Invocation:: Running `testsuite' scripts
- * Making testsuite Scripts:: Using autom4te to create `testsuite'
- Using an Autotest Test Suite
- * testsuite Scripts:: The concepts of Autotest
- * Autotest Logs:: Their contents
- Frequent Autoconf Questions, with answers
- * Distributing:: Distributing `configure' scripts
- * Why GNU M4:: Why not use the standard M4?
- * Bootstrapping:: Autoconf and GNU M4 require each other?
- * Why Not Imake:: Why GNU uses `configure' instead of Imake
- * Defining Directories:: Passing `datadir' to program
- * Autom4te Cache:: What is it? Can I remove it?
- * Present But Cannot Be Compiled:: Compiler and Preprocessor Disagree
- * Expanded Before Required:: Expanded Before Required
- * Debugging:: Debugging `configure' scripts
- History of Autoconf
- * Genesis:: Prehistory and naming of `configure'
- * Exodus:: The plagues of M4 and Perl
- * Leviticus:: The priestly code of portability arrives
- * Numbers:: Growth and contributors
- * Deuteronomy:: Approaching the promises of easy configuration
- Indices
- * Environment Variable Index:: Index of environment variables used
- * Output Variable Index:: Index of variables set in output files
- * Preprocessor Symbol Index:: Index of C preprocessor symbols defined
- * Cache Variable Index:: Index of documented cache variables
- * Autoconf Macro Index:: Index of Autoconf macros
- * M4 Macro Index:: Index of M4, M4sugar, and M4sh macros
- * Autotest Macro Index:: Index of Autotest macros
- * Program & Function Index:: Index of those with portability problems
- * Concept Index:: General index
- File: autoconf.info, Node: Introduction, Next: The GNU Build System, Prev: Top, Up: Top
- 1 Introduction
- **************
- A physicist, an engineer, and a computer scientist were discussing the
- nature of God. "Surely a Physicist," said the physicist, "because
- early in the Creation, God made Light; and you know, Maxwell's
- equations, the dual nature of electromagnetic waves, the relativistic
- consequences..." "An Engineer!," said the engineer, "because
- before making Light, God split the Chaos into Land and Water; it takes a
- hell of an engineer to handle that big amount of mud, and orderly
- separation of solids from liquids..." The computer scientist
- shouted: "And the Chaos, where do you think it was coming from, hmm?"
- --Anonymous
- Autoconf is a tool for producing shell scripts that automatically
- configure software source code packages to adapt to many kinds of
- Posix-like systems. The configuration scripts produced by Autoconf are
- independent of Autoconf when they are run, so their users do not need
- to have Autoconf.
- The configuration scripts produced by Autoconf require no manual user
- intervention when run; they do not normally even need an argument
- specifying the system type. Instead, they individually test for the
- presence of each feature that the software package they are for might
- need. (Before each check, they print a one-line message stating what
- they are checking for, so the user doesn't get too bored while waiting
- for the script to finish.) As a result, they deal well with systems
- that are hybrids or customized from the more common Posix variants.
- There is no need to maintain files that list the features supported by
- each release of each variant of Posix.
- For each software package that Autoconf is used with, it creates a
- configuration script from a template file that lists the system features
- that the package needs or can use. After the shell code to recognize
- and respond to a system feature has been written, Autoconf allows it to
- be shared by many software packages that can use (or need) that feature.
- If it later turns out that the shell code needs adjustment for some
- reason, it needs to be changed in only one place; all of the
- configuration scripts can be regenerated automatically to take advantage
- of the updated code.
- Those who do not understand Autoconf are condemned to reinvent it,
- poorly. The primary goal of Autoconf is making the _user's_ life
- easier; making the _maintainer's_ life easier is only a secondary goal.
- Put another way, the primary goal is not to make the generation of
- `configure' automatic for package maintainers (although patches along
- that front are welcome, since package maintainers form the user base of
- Autoconf); rather, the goal is to make `configure' painless, portable,
- and predictable for the end user of each "autoconfiscated" package.
- And to this degree, Autoconf is highly successful at its goal -- most
- complaints to the Autoconf list are about difficulties in writing
- Autoconf input, and not in the behavior of the resulting `configure'.
- Even packages that don't use Autoconf will generally provide a
- `configure' script, and the most common complaint about these
- alternative home-grown scripts is that they fail to meet one or more of
- the GNU Coding Standards (*note Configuration:
- (standards)Configuration.) that users have come to expect from
- Autoconf-generated `configure' scripts.
- The Metaconfig package is similar in purpose to Autoconf, but the
- scripts it produces require manual user intervention, which is quite
- inconvenient when configuring large source trees. Unlike Metaconfig
- scripts, Autoconf scripts can support cross-compiling, if some care is
- taken in writing them.
- Autoconf does not solve all problems related to making portable
- software packages--for a more complete solution, it should be used in
- concert with other GNU build tools like Automake and Libtool. These
- other tools take on jobs like the creation of a portable, recursive
- makefile with all of the standard targets, linking of shared libraries,
- and so on. *Note The GNU Build System::, for more information.
- Autoconf imposes some restrictions on the names of macros used with
- `#if' in C programs (*note Preprocessor Symbol Index::).
- Autoconf requires GNU M4 version 1.4.6 or later in order to generate
- the scripts. It uses features that some versions of M4, including GNU
- M4 1.3, do not have. Autoconf works better with GNU M4 version 1.4.14
- or later, though this is not required.
- *Note Autoconf 1::, for information about upgrading from version 1.
- *Note History::, for the story of Autoconf's development. *Note FAQ::,
- for answers to some common questions about Autoconf.
- See the Autoconf web page (http://www.gnu.org/software/autoconf/)
- for up-to-date information, details on the mailing lists, pointers to a
- list of known bugs, etc.
- Mail suggestions to the Autoconf mailing list <autoconf@gnu.org>.
- Past suggestions are archived
- (http://lists.gnu.org/archive/html/autoconf/).
- Mail bug reports to the Autoconf Bugs mailing list
- <bug-autoconf@gnu.org>. Past bug reports are archived
- (http://lists.gnu.org/archive/html/bug-autoconf/).
- If possible, first check that your bug is not already solved in
- current development versions, and that it has not been reported yet.
- Be sure to include all the needed information and a short
- `configure.ac' that demonstrates the problem.
- Autoconf's development tree is accessible via `git'; see the
- Autoconf Summary (http://savannah.gnu.org/projects/autoconf/) for
- details, or view the actual repository
- (http://git.sv.gnu.org/gitweb/?p=autoconf.git). Anonymous CVS access
- is also available, see `README' for more details. Patches relative to
- the current `git' version can be sent for review to the Autoconf
- Patches mailing list <autoconf-patches@gnu.org>, with discussion on
- prior patches archived
- (http://lists.gnu.org/archive/html/autoconf-patches/); and all commits
- are posted in the read-only Autoconf Commit mailing list
- <autoconf-commit@gnu.org>, which is also archived
- (http://lists.gnu.org/archive/html/autoconf-commit/).
- Because of its mission, the Autoconf package itself includes only a
- set of often-used macros that have already demonstrated their
- usefulness. Nevertheless, if you wish to share your macros, or find
- existing ones, see the Autoconf Macro Archive
- (http://www.gnu.org/software/autoconf-archive/), which is kindly run by
- Peter Simons <simons@cryp.to>.
- File: autoconf.info, Node: The GNU Build System, Next: Making configure Scripts, Prev: Introduction, Up: Top
- 2 The GNU Build System
- **********************
- Autoconf solves an important problem--reliable discovery of
- system-specific build and runtime information--but this is only one
- piece of the puzzle for the development of portable software. To this
- end, the GNU project has developed a suite of integrated utilities to
- finish the job Autoconf started: the GNU build system, whose most
- important components are Autoconf, Automake, and Libtool. In this
- chapter, we introduce you to those tools, point you to sources of more
- information, and try to convince you to use the entire GNU build system
- for your software.
- * Menu:
- * Automake:: Escaping makefile hell
- * Gnulib:: The GNU portability library
- * Libtool:: Building libraries portably
- * Pointers:: More info on the GNU build system
- File: autoconf.info, Node: Automake, Next: Gnulib, Up: The GNU Build System
- 2.1 Automake
- ============
- The ubiquity of `make' means that a makefile is almost the only viable
- way to distribute automatic build rules for software, but one quickly
- runs into its numerous limitations. Its lack of support for automatic
- dependency tracking, recursive builds in subdirectories, reliable
- timestamps (e.g., for network file systems), and so on, mean that
- developers must painfully (and often incorrectly) reinvent the wheel
- for each project. Portability is non-trivial, thanks to the quirks of
- `make' on many systems. On top of all this is the manual labor
- required to implement the many standard targets that users have come to
- expect (`make install', `make distclean', `make uninstall', etc.).
- Since you are, of course, using Autoconf, you also have to insert
- repetitive code in your `Makefile.in' to recognize `@CC@', `@CFLAGS@',
- and other substitutions provided by `configure'. Into this mess steps
- "Automake".
- Automake allows you to specify your build needs in a `Makefile.am'
- file with a vastly simpler and more powerful syntax than that of a plain
- makefile, and then generates a portable `Makefile.in' for use with
- Autoconf. For example, the `Makefile.am' to build and install a simple
- "Hello world" program might look like:
- bin_PROGRAMS = hello
- hello_SOURCES = hello.c
- The resulting `Makefile.in' (~400 lines) automatically supports all the
- standard targets, the substitutions provided by Autoconf, automatic
- dependency tracking, `VPATH' building, and so on. `make' builds the
- `hello' program, and `make install' installs it in `/usr/local/bin' (or
- whatever prefix was given to `configure', if not `/usr/local').
- The benefits of Automake increase for larger packages (especially
- ones with subdirectories), but even for small programs the added
- convenience and portability can be substantial. And that's not all...
- File: autoconf.info, Node: Gnulib, Next: Libtool, Prev: Automake, Up: The GNU Build System
- 2.2 Gnulib
- ==========
- GNU software has a well-deserved reputation for running on many
- different types of systems. While our primary goal is to write
- software for the GNU system, many users and developers have been
- introduced to us through the systems that they were already using.
- Gnulib is a central location for common GNU code, intended to be
- shared among free software packages. Its components are typically
- shared at the source level, rather than being a library that gets built,
- installed, and linked against. The idea is to copy files from Gnulib
- into your own source tree. There is no distribution tarball; developers
- should just grab source modules from the repository. The source files
- are available online, under various licenses, mostly GNU GPL or GNU
- LGPL.
- Gnulib modules typically contain C source code along with Autoconf
- macros used to configure the source code. For example, the Gnulib
- `stdbool' module implements a `stdbool.h' header that nearly conforms
- to C99, even on old-fashioned hosts that lack `stdbool.h'. This module
- contains a source file for the replacement header, along with an
- Autoconf macro that arranges to use the replacement header on
- old-fashioned systems.
- File: autoconf.info, Node: Libtool, Next: Pointers, Prev: Gnulib, Up: The GNU Build System
- 2.3 Libtool
- ===========
- Often, one wants to build not only programs, but libraries, so that
- other programs can benefit from the fruits of your labor. Ideally, one
- would like to produce _shared_ (dynamically linked) libraries, which
- can be used by multiple programs without duplication on disk or in
- memory and can be updated independently of the linked programs.
- Producing shared libraries portably, however, is the stuff of
- nightmares--each system has its own incompatible tools, compiler flags,
- and magic incantations. Fortunately, GNU provides a solution:
- "Libtool".
- Libtool handles all the requirements of building shared libraries for
- you, and at this time seems to be the _only_ way to do so with any
- portability. It also handles many other headaches, such as: the
- interaction of Make rules with the variable suffixes of shared
- libraries, linking reliably with shared libraries before they are
- installed by the superuser, and supplying a consistent versioning system
- (so that different versions of a library can be installed or upgraded
- without breaking binary compatibility). Although Libtool, like
- Autoconf, can be used without Automake, it is most simply utilized in
- conjunction with Automake--there, Libtool is used automatically
- whenever shared libraries are needed, and you need not know its syntax.
- File: autoconf.info, Node: Pointers, Prev: Libtool, Up: The GNU Build System
- 2.4 Pointers
- ============
- Developers who are used to the simplicity of `make' for small projects
- on a single system might be daunted at the prospect of learning to use
- Automake and Autoconf. As your software is distributed to more and
- more users, however, you otherwise quickly find yourself putting lots
- of effort into reinventing the services that the GNU build tools
- provide, and making the same mistakes that they once made and overcame.
- (Besides, since you're already learning Autoconf, Automake is a piece
- of cake.)
- There are a number of places that you can go to for more information
- on the GNU build tools.
- - Web
- The project home pages for Autoconf
- (http://www.gnu.org/software/autoconf/), Automake
- (http://www.gnu.org/software/automake/), Gnulib
- (http://www.gnu.org/software/gnulib/), and Libtool
- (http://www.gnu.org/software/libtool/).
- - Automake Manual
- *Note Automake: (automake)Top, for more information on Automake.
- - Books
- The book `GNU Autoconf, Automake and Libtool'(1) describes the
- complete GNU build environment. You can also find the entire book
- on-line (http://sources.redhat.com/autobook/).
- ---------- Footnotes ----------
- (1) `GNU Autoconf, Automake and Libtool', by G. V. Vaughan, B.
- Elliston, T. Tromey, and I. L. Taylor. SAMS (originally New Riders),
- 2000, ISBN 1578701902.
- File: autoconf.info, Node: Making configure Scripts, Next: Setup, Prev: The GNU Build System, Up: Top
- 3 Making `configure' Scripts
- ****************************
- The configuration scripts that Autoconf produces are by convention
- called `configure'. When run, `configure' creates several files,
- replacing configuration parameters in them with appropriate values.
- The files that `configure' creates are:
- - one or more `Makefile' files, usually one in each subdirectory of
- the package (*note Makefile Substitutions::);
- - optionally, a C header file, the name of which is configurable,
- containing `#define' directives (*note Configuration Headers::);
- - a shell script called `config.status' that, when run, recreates
- the files listed above (*note config.status Invocation::);
- - an optional shell script normally called `config.cache' (created
- when using `configure --config-cache') that saves the results of
- running many of the tests (*note Cache Files::);
- - a file called `config.log' containing any messages produced by
- compilers, to help debugging if `configure' makes a mistake.
- To create a `configure' script with Autoconf, you need to write an
- Autoconf input file `configure.ac' (or `configure.in') and run
- `autoconf' on it. If you write your own feature tests to supplement
- those that come with Autoconf, you might also write files called
- `aclocal.m4' and `acsite.m4'. If you use a C header file to contain
- `#define' directives, you might also run `autoheader', and you can
- distribute the generated file `config.h.in' with the package.
- Here is a diagram showing how the files that can be used in
- configuration are produced. Programs that are executed are suffixed by
- `*'. Optional files are enclosed in square brackets (`[]').
- `autoconf' and `autoheader' also read the installed Autoconf macro
- files (by reading `autoconf.m4').
- Files used in preparing a software package for distribution, when using
- just Autoconf:
- your source files --> [autoscan*] --> [configure.scan] --> configure.ac
- configure.ac --.
- | .------> autoconf* -----> configure
- [aclocal.m4] --+---+
- | `-----> [autoheader*] --> [config.h.in]
- [acsite.m4] ---'
- Makefile.in
- Additionally, if you use Automake, the following additional productions
- come into play:
- [acinclude.m4] --.
- |
- [local macros] --+--> aclocal* --> aclocal.m4
- |
- configure.ac ----'
- configure.ac --.
- +--> automake* --> Makefile.in
- Makefile.am ---'
- Files used in configuring a software package:
- .-------------> [config.cache]
- configure* ------------+-------------> config.log
- |
- [config.h.in] -. v .-> [config.h] -.
- +--> config.status* -+ +--> make*
- Makefile.in ---' `-> Makefile ---'
- * Menu:
- * Writing Autoconf Input:: What to put in an Autoconf input file
- * autoscan Invocation:: Semi-automatic `configure.ac' writing
- * ifnames Invocation:: Listing the conditionals in source code
- * autoconf Invocation:: How to create configuration scripts
- * autoreconf Invocation:: Remaking multiple `configure' scripts
- File: autoconf.info, Node: Writing Autoconf Input, Next: autoscan Invocation, Up: Making configure Scripts
- 3.1 Writing `configure.ac'
- ==========================
- To produce a `configure' script for a software package, create a file
- called `configure.ac' that contains invocations of the Autoconf macros
- that test the system features your package needs or can use. Autoconf
- macros already exist to check for many features; see *note Existing
- Tests::, for their descriptions. For most other features, you can use
- Autoconf template macros to produce custom checks; see *note Writing
- Tests::, for information about them. For especially tricky or
- specialized features, `configure.ac' might need to contain some
- hand-crafted shell commands; see *note Portable Shell Programming:
- Portable Shell. The `autoscan' program can give you a good start in
- writing `configure.ac' (*note autoscan Invocation::, for more
- information).
- Previous versions of Autoconf promoted the name `configure.in',
- which is somewhat ambiguous (the tool needed to process this file is not
- described by its extension), and introduces a slight confusion with
- `config.h.in' and so on (for which `.in' means "to be processed by
- `configure'"). Using `configure.ac' is now preferred.
- * Menu:
- * Shell Script Compiler:: Autoconf as solution of a problem
- * Autoconf Language:: Programming in Autoconf
- * Autoconf Input Layout:: Standard organization of `configure.ac'
- File: autoconf.info, Node: Shell Script Compiler, Next: Autoconf Language, Up: Writing Autoconf Input
- 3.1.1 A Shell Script Compiler
- -----------------------------
- Just as for any other computer language, in order to properly program
- `configure.ac' in Autoconf you must understand _what_ problem the
- language tries to address and _how_ it does so.
- The problem Autoconf addresses is that the world is a mess. After
- all, you are using Autoconf in order to have your package compile
- easily on all sorts of different systems, some of them being extremely
- hostile. Autoconf itself bears the price for these differences:
- `configure' must run on all those systems, and thus `configure' must
- limit itself to their lowest common denominator of features.
- Naturally, you might then think of shell scripts; who needs
- `autoconf'? A set of properly written shell functions is enough to
- make it easy to write `configure' scripts by hand. Sigh!
- Unfortunately, even in 2008, where shells without any function support
- are far and few between, there are pitfalls to avoid when making use of
- them. Also, finding a Bourne shell that accepts shell functions is not
- trivial, even though there is almost always one on interesting porting
- targets.
- So, what is really needed is some kind of compiler, `autoconf', that
- takes an Autoconf program, `configure.ac', and transforms it into a
- portable shell script, `configure'.
- How does `autoconf' perform this task?
- There are two obvious possibilities: creating a brand new language or
- extending an existing one. The former option is attractive: all sorts
- of optimizations could easily be implemented in the compiler and many
- rigorous checks could be performed on the Autoconf program (e.g.,
- rejecting any non-portable construct). Alternatively, you can extend
- an existing language, such as the `sh' (Bourne shell) language.
- Autoconf does the latter: it is a layer on top of `sh'. It was
- therefore most convenient to implement `autoconf' as a macro expander:
- a program that repeatedly performs "macro expansions" on text input,
- replacing macro calls with macro bodies and producing a pure `sh'
- script in the end. Instead of implementing a dedicated Autoconf macro
- expander, it is natural to use an existing general-purpose macro
- language, such as M4, and implement the extensions as a set of M4
- macros.
- File: autoconf.info, Node: Autoconf Language, Next: Autoconf Input Layout, Prev: Shell Script Compiler, Up: Writing Autoconf Input
- 3.1.2 The Autoconf Language
- ---------------------------
- The Autoconf language differs from many other computer languages
- because it treats actual code the same as plain text. Whereas in C,
- for instance, data and instructions have different syntactic status, in
- Autoconf their status is rigorously the same. Therefore, we need a
- means to distinguish literal strings from text to be expanded:
- quotation.
- When calling macros that take arguments, there must not be any white
- space between the macro name and the open parenthesis.
- AC_INIT ([oops], [1.0]) # incorrect
- AC_INIT([hello], [1.0]) # good
- Arguments should be enclosed within the quote characters `[' and
- `]', and be separated by commas. Any leading blanks or newlines in
- arguments are ignored, unless they are quoted. You should always quote
- an argument that might contain a macro name, comma, parenthesis, or a
- leading blank or newline. This rule applies recursively for every macro
- call, including macros called from other macros. For more details on
- quoting rules, see *note Programming in M4::.
- For instance:
- AC_CHECK_HEADER([stdio.h],
- [AC_DEFINE([HAVE_STDIO_H], [1],
- [Define to 1 if you have <stdio.h>.])],
- [AC_MSG_ERROR([sorry, can't do anything for you])])
- is quoted properly. You may safely simplify its quotation to:
- AC_CHECK_HEADER([stdio.h],
- [AC_DEFINE([HAVE_STDIO_H], 1,
- [Define to 1 if you have <stdio.h>.])],
- [AC_MSG_ERROR([sorry, can't do anything for you])])
- because `1' cannot contain a macro call. Here, the argument of
- `AC_MSG_ERROR' must be quoted; otherwise, its comma would be
- interpreted as an argument separator. Also, the second and third
- arguments of `AC_CHECK_HEADER' must be quoted, since they contain macro
- calls. The three arguments `HAVE_STDIO_H', `stdio.h', and `Define to 1
- if you have <stdio.h>.' do not need quoting, but if you unwisely
- defined a macro with a name like `Define' or `stdio' then they would
- need quoting. Cautious Autoconf users would keep the quotes, but many
- Autoconf users find such precautions annoying, and would rewrite the
- example as follows:
- AC_CHECK_HEADER(stdio.h,
- [AC_DEFINE(HAVE_STDIO_H, 1,
- [Define to 1 if you have <stdio.h>.])],
- [AC_MSG_ERROR([sorry, can't do anything for you])])
- This is safe, so long as you adopt good naming conventions and do not
- define macros with names like `HAVE_STDIO_H', `stdio', or `h'. Though
- it is also safe here to omit the quotes around `Define to 1 if you have
- <stdio.h>.' this is not recommended, as message strings are more likely
- to inadvertently contain commas.
- The following example is wrong and dangerous, as it is underquoted:
- AC_CHECK_HEADER(stdio.h,
- AC_DEFINE(HAVE_STDIO_H, 1,
- Define to 1 if you have <stdio.h>.),
- AC_MSG_ERROR([sorry, can't do anything for you]))
- In other cases, you may have to use text that also resembles a macro
- call. You must quote that text even when it is not passed as a macro
- argument. For example, these two approaches in `configure.ac' (quoting
- just the potential problems, or quoting the entire line) will protect
- your script in case autoconf ever adds a macro `AC_DC':
- echo "Hard rock was here! --[AC_DC]"
- [echo "Hard rock was here! --AC_DC"]
- which results in this text in `configure':
- echo "Hard rock was here! --AC_DC"
- echo "Hard rock was here! --AC_DC"
- When you use the same text in a macro argument, you must therefore have
- an extra quotation level (since one is stripped away by the macro
- substitution). In general, then, it is a good idea to _use double
- quoting for all literal string arguments_, either around just the
- problematic portions, or over the entire argument:
- AC_MSG_WARN([[AC_DC] stinks --Iron Maiden])
- AC_MSG_WARN([[AC_DC stinks --Iron Maiden]])
- However, the above example triggers a warning about a possibly
- unexpanded macro when running `autoconf', because it collides with the
- namespace of macros reserved for the Autoconf language. To be really
- safe, you can use additional escaping (either a quadrigraph, or
- creative shell constructs) to silence that particular warning:
- echo "Hard rock was here! --AC""_DC"
- AC_MSG_WARN([[AC@&t@_DC stinks --Iron Maiden]])
- You are now able to understand one of the constructs of Autoconf that
- has been continually misunderstood... The rule of thumb is that
- _whenever you expect macro expansion, expect quote expansion_; i.e.,
- expect one level of quotes to be lost. For instance:
- AC_COMPILE_IFELSE(AC_LANG_SOURCE([char b[10];]), [],
- [AC_MSG_ERROR([you lose])])
- is incorrect: here, the first argument of `AC_LANG_SOURCE' is `char
- b[10];' and is expanded once, which results in `char b10;'; and the
- `AC_LANG_SOURCE' is also expanded prior to being passed to
- `AC_COMPILE_IFELSE'. (There was an idiom common in Autoconf's past to
- address this issue via the M4 `changequote' primitive, but do not use
- it!) Let's take a closer look: the author meant the first argument to
- be understood as a literal, and therefore it must be quoted twice;
- likewise, the intermediate `AC_LANG_SOURCE' macro should be quoted once
- so that it is only expanded after the rest of the body of
- `AC_COMPILE_IFELSE' is in place:
- AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char b[10];]])], [],
- [AC_MSG_ERROR([you lose])])
- Voila`, you actually produce `char b[10];' this time!
- On the other hand, descriptions (e.g., the last parameter of
- `AC_DEFINE' or `AS_HELP_STRING') are not literals--they are subject to
- line breaking, for example--and should not be double quoted. Even if
- these descriptions are short and are not actually broken, double
- quoting them yields weird results.
- Some macros take optional arguments, which this documentation
- represents as [ARG] (not to be confused with the quote characters).
- You may just leave them empty, or use `[]' to make the emptiness of the
- argument explicit, or you may simply omit the trailing commas. The
- three lines below are equivalent:
- AC_CHECK_HEADERS([stdio.h], [], [], [])
- AC_CHECK_HEADERS([stdio.h],,,)
- AC_CHECK_HEADERS([stdio.h])
- It is best to put each macro call on its own line in `configure.ac'.
- Most of the macros don't add extra newlines; they rely on the newline
- after the macro call to terminate the commands. This approach makes
- the generated `configure' script a little easier to read by not
- inserting lots of blank lines. It is generally safe to set shell
- variables on the same line as a macro call, because the shell allows
- assignments without intervening newlines.
- You can include comments in `configure.ac' files by starting them
- with the `#'. For example, it is helpful to begin `configure.ac' files
- with a line like this:
- # Process this file with autoconf to produce a configure script.
- File: autoconf.info, Node: Autoconf Input Layout, Prev: Autoconf Language, Up: Writing Autoconf Input
- 3.1.3 Standard `configure.ac' Layout
- ------------------------------------
- The order in which `configure.ac' calls the Autoconf macros is not
- important, with a few exceptions. Every `configure.ac' must contain a
- call to `AC_INIT' before the checks, and a call to `AC_OUTPUT' at the
- end (*note Output::). Additionally, some macros rely on other macros
- having been called first, because they check previously set values of
- some variables to decide what to do. These macros are noted in the
- individual descriptions (*note Existing Tests::), and they also warn
- you when `configure' is created if they are called out of order.
- To encourage consistency, here is a suggested order for calling the
- Autoconf macros. Generally speaking, the things near the end of this
- list are those that could depend on things earlier in it. For example,
- library functions could be affected by types and libraries.
- Autoconf requirements
- `AC_INIT(PACKAGE, VERSION, BUG-REPORT-ADDRESS)'
- information on the package
- checks for programs
- checks for libraries
- checks for header files
- checks for types
- checks for structures
- checks for compiler characteristics
- checks for library functions
- checks for system services
- `AC_CONFIG_FILES([FILE...])'
- `AC_OUTPUT'
- File: autoconf.info, Node: autoscan Invocation, Next: ifnames Invocation, Prev: Writing Autoconf Input, Up: Making configure Scripts
- 3.2 Using `autoscan' to Create `configure.ac'
- =============================================
- The `autoscan' program can help you create and/or maintain a
- `configure.ac' file for a software package. `autoscan' examines source
- files in the directory tree rooted at a directory given as a command
- line argument, or the current directory if none is given. It searches
- the source files for common portability problems and creates a file
- `configure.scan' which is a preliminary `configure.ac' for that
- package, and checks a possibly existing `configure.ac' for completeness.
- When using `autoscan' to create a `configure.ac', you should
- manually examine `configure.scan' before renaming it to `configure.ac';
- it probably needs some adjustments. Occasionally, `autoscan' outputs a
- macro in the wrong order relative to another macro, so that `autoconf'
- produces a warning; you need to move such macros manually. Also, if
- you want the package to use a configuration header file, you must add a
- call to `AC_CONFIG_HEADERS' (*note Configuration Headers::). You might
- also have to change or add some `#if' directives to your program in
- order to make it work with Autoconf (*note ifnames Invocation::, for
- information about a program that can help with that job).
- When using `autoscan' to maintain a `configure.ac', simply consider
- adding its suggestions. The file `autoscan.log' contains detailed
- information on why a macro is requested.
- `autoscan' uses several data files (installed along with Autoconf)
- to determine which macros to output when it finds particular symbols in
- a package's source files. These data files all have the same format:
- each line consists of a symbol, one or more blanks, and the Autoconf
- macro to output if that symbol is encountered. Lines starting with `#'
- are comments.
- `autoscan' accepts the following options:
- `--help'
- `-h'
- Print a summary of the command line options and exit.
- `--version'
- `-V'
- Print the version number of Autoconf and exit.
- `--verbose'
- `-v'
- Print the names of the files it examines and the potentially
- interesting symbols it finds in them. This output can be
- voluminous.
- `--debug'
- `-d'
- Don't remove temporary files.
- `--include=DIR'
- `-I DIR'
- Append DIR to the include path. Multiple invocations accumulate.
- `--prepend-include=DIR'
- `-B DIR'
- Prepend DIR to the include path. Multiple invocations accumulate.
- File: autoconf.info, Node: ifnames Invocation, Next: autoconf Invocation, Prev: autoscan Invocation, Up: Making configure Scripts
- 3.3 Using `ifnames' to List Conditionals
- ========================================
- `ifnames' can help you write `configure.ac' for a software package. It
- prints the identifiers that the package already uses in C preprocessor
- conditionals. If a package has already been set up to have some
- portability, `ifnames' can thus help you figure out what its
- `configure' needs to check for. It may help fill in some gaps in a
- `configure.ac' generated by `autoscan' (*note autoscan Invocation::).
- `ifnames' scans all of the C source files named on the command line
- (or the standard input, if none are given) and writes to the standard
- output a sorted list of all the identifiers that appear in those files
- in `#if', `#elif', `#ifdef', or `#ifndef' directives. It prints each
- identifier on a line, followed by a space-separated list of the files
- in which that identifier occurs.
- `ifnames' accepts the following options:
- `--help'
- `-h'
- Print a summary of the command line options and exit.
- `--version'
- `-V'
- Print the version number of Autoconf and exit.
- File: autoconf.info, Node: autoconf Invocation, Next: autoreconf Invocation, Prev: ifnames Invocation, Up: Making configure Scripts
- 3.4 Using `autoconf' to Create `configure'
- ==========================================
- To create `configure' from `configure.ac', run the `autoconf' program
- with no arguments. `autoconf' processes `configure.ac' with the M4
- macro processor, using the Autoconf macros. If you give `autoconf' an
- argument, it reads that file instead of `configure.ac' and writes the
- configuration script to the standard output instead of to `configure'.
- If you give `autoconf' the argument `-', it reads from the standard
- input instead of `configure.ac' and writes the configuration script to
- the standard output.
- The Autoconf macros are defined in several files. Some of the files
- are distributed with Autoconf; `autoconf' reads them first. Then it
- looks for the optional file `acsite.m4' in the directory that contains
- the distributed Autoconf macro files, and for the optional file
- `aclocal.m4' in the current directory. Those files can contain your
- site's or the package's own Autoconf macro definitions (*note Writing
- Autoconf Macros::, for more information). If a macro is defined in
- more than one of the files that `autoconf' reads, the last definition
- it reads overrides the earlier ones.
- `autoconf' accepts the following options:
- `--help'
- `-h'
- Print a summary of the command line options and exit.
- `--version'
- `-V'
- Print the version number of Autoconf and exit.
- `--verbose'
- `-v'
- Report processing steps.
- `--debug'
- `-d'
- Don't remove the temporary files.
- `--force'
- `-f'
- Remake `configure' even if newer than its input files.
- `--include=DIR'
- `-I DIR'
- Append DIR to the include path. Multiple invocations accumulate.
- `--prepend-include=DIR'
- `-B DIR'
- Prepend DIR to the include path. Multiple invocations accumulate.
- `--output=FILE'
- `-o FILE'
- Save output (script or trace) to FILE. The file `-' stands for
- the standard output.
- `--warnings=CATEGORY'
- `-W CATEGORY'
- Report the warnings related to CATEGORY (which can actually be a
- comma separated list). *Note Reporting Messages::, macro
- `AC_DIAGNOSE', for a comprehensive list of categories. Special
- values include:
- `all'
- report all the warnings
- `none'
- report none
- `error'
- treats warnings as errors
- `no-CATEGORY'
- disable warnings falling into CATEGORY
- Warnings about `syntax' are enabled by default, and the environment
- variable `WARNINGS', a comma separated list of categories, is
- honored as well. Passing `-W CATEGORY' actually behaves as if you
- had passed `--warnings syntax,$WARNINGS,CATEGORY'. To disable the
- defaults and `WARNINGS', and then enable warnings about obsolete
- constructs, use `-W none,obsolete'.
- Because `autoconf' uses `autom4te' behind the scenes, it displays
- a back trace for errors, but not for warnings; if you want them,
- just pass `-W error'. *Note autom4te Invocation::, for some
- examples.
- `--trace=MACRO[:FORMAT]'
- `-t MACRO[:FORMAT]'
- Do not create the `configure' script, but list the calls to MACRO
- according to the FORMAT. Multiple `--trace' arguments can be used
- to list several macros. Multiple `--trace' arguments for a single
- macro are not cumulative; instead, you should just make FORMAT as
- long as needed.
- The FORMAT is a regular string, with newlines if desired, and
- several special escape codes. It defaults to `$f:$l:$n:$%'; see
- *note autom4te Invocation::, for details on the FORMAT.
- `--initialization'
- `-i'
- By default, `--trace' does not trace the initialization of the
- Autoconf macros (typically the `AC_DEFUN' definitions). This
- results in a noticeable speedup, but can be disabled by this
- option.
- It is often necessary to check the content of a `configure.ac' file,
- but parsing it yourself is extremely fragile and error-prone. It is
- suggested that you rely upon `--trace' to scan `configure.ac'. For
- instance, to find the list of variables that are substituted, use:
- $ autoconf -t AC_SUBST
- configure.ac:2:AC_SUBST:ECHO_C
- configure.ac:2:AC_SUBST:ECHO_N
- configure.ac:2:AC_SUBST:ECHO_T
- More traces deleted
- The example below highlights the difference between `$@', `$*', and
- `$%'.
- $ cat configure.ac
- AC_DEFINE(This, is, [an
- [example]])
- $ autoconf -t 'AC_DEFINE:@: $@
- *: $*
- %: $%'
- @: [This],[is],[an
- [example]]
- *: This,is,an
- [example]
- %: This:is:an [example]
- The FORMAT gives you a lot of freedom:
- $ autoconf -t 'AC_SUBST:$$ac_subst{"$1"} = "$f:$l";'
- $ac_subst{"ECHO_C"} = "configure.ac:2";
- $ac_subst{"ECHO_N"} = "configure.ac:2";
- $ac_subst{"ECHO_T"} = "configure.ac:2";
- More traces deleted
- A long SEPARATOR can be used to improve the readability of complex
- structures, and to ease their parsing (for instance when no single
- character is suitable as a separator):
- $ autoconf -t 'AM_MISSING_PROG:${|:::::|}*'
- ACLOCAL|:::::|aclocal|:::::|$missing_dir
- AUTOCONF|:::::|autoconf|:::::|$missing_dir
- AUTOMAKE|:::::|automake|:::::|$missing_dir
- More traces deleted
- File: autoconf.info, Node: autoreconf Invocation, Prev: autoconf Invocation, Up: Making configure Scripts
- 3.5 Using `autoreconf' to Update `configure' Scripts
- ====================================================
- Installing the various components of the GNU Build System can be
- tedious: running `autopoint' for Gettext, `automake' for `Makefile.in'
- etc. in each directory. It may be needed either because some tools
- such as `automake' have been updated on your system, or because some of
- the sources such as `configure.ac' have been updated, or finally,
- simply in order to install the GNU Build System in a fresh tree.
- `autoreconf' runs `autoconf', `autoheader', `aclocal', `automake',
- `libtoolize', and `autopoint' (when appropriate) repeatedly to update
- the GNU Build System in the specified directories and their
- subdirectories (*note Subdirectories::). By default, it only remakes
- those files that are older than their sources. The environment
- variables `AUTOM4TE', `AUTOCONF', `AUTOHEADER', `AUTOMAKE', `ACLOCAL',
- `AUTOPOINT', `LIBTOOLIZE', `M4', and `MAKE' may be used to override the
- invocation of the respective tools.
- If you install a new version of some tool, you can make `autoreconf'
- remake _all_ of the files by giving it the `--force' option.
- *Note Automatic Remaking::, for Make rules to automatically rebuild
- `configure' scripts when their source files change. That method
- handles the timestamps of configuration header templates properly, but
- does not pass `--autoconf-dir=DIR' or `--localdir=DIR'.
- Gettext supplies the `autopoint' command to add translation
- infrastructure to a source package. If you use `autopoint', your
- `configure.ac' should invoke both `AM_GNU_GETTEXT' and
- `AM_GNU_GETTEXT_VERSION(GETTEXT-VERSION)'. *Note Invoking the
- `autopoint' Program: (gettext)autopoint Invocation, for further details.
- `autoreconf' accepts the following options:
- `--help'
- `-h'
- Print a summary of the command line options and exit.
- `--version'
- `-V'
- Print the version number of Autoconf and exit.
- `--verbose'
- `-v'
- Print the name of each directory `autoreconf' examines and the
- commands it runs. If given two or more times, pass `--verbose' to
- subordinate tools that support it.
- `--debug'
- `-d'
- Don't remove the temporary files.
- `--force'
- `-f'
- Remake even `configure' scripts and configuration headers that are
- newer than their input files (`configure.ac' and, if present,
- `aclocal.m4').
- `--install'
- `-i'
- Install the missing auxiliary files in the package. By default,
- files are copied; this can be changed with `--symlink'.
- If deemed appropriate, this option triggers calls to `automake
- --add-missing', `libtoolize', `autopoint', etc.
- `--no-recursive'
- Do not rebuild files in subdirectories to configure (see *note
- Subdirectories::, macro `AC_CONFIG_SUBDIRS').
- `--symlink'
- `-s'
- When used with `--install', install symbolic links to the missing
- auxiliary files instead of copying them.
- `--make'
- `-m'
- When the directories were configured, update the configuration by
- running `./config.status --recheck && ./config.status', and then
- run `make'.
- `--include=DIR'
- `-I DIR'
- Append DIR to the include path. Multiple invocations accumulate.
- Passed on to `aclocal', `autoconf' and `autoheader' internally.
- `--prepend-include=DIR'
- `-B DIR'
- Prepend DIR to the include path. Multiple invocations accumulate.
- Passed on to `autoconf' and `autoheader' internally.
- `--warnings=CATEGORY'
- `-W CATEGORY'
- Report the warnings related to CATEGORY (which can actually be a
- comma separated list).
- `cross'
- related to cross compilation issues.
- `obsolete'
- report the uses of obsolete constructs.
- `portability'
- portability issues
- `syntax'
- dubious syntactic constructs.
- `all'
- report all the warnings
- `none'
- report none
- `error'
- treats warnings as errors
- `no-CATEGORY'
- disable warnings falling into CATEGORY
- Warnings about `syntax' are enabled by default, and the environment
- variable `WARNINGS', a comma separated list of categories, is
- honored as well. Passing `-W CATEGORY' actually behaves as if you
- had passed `--warnings syntax,$WARNINGS,CATEGORY'. To disable the
- defaults and `WARNINGS', and then enable warnings about obsolete
- constructs, use `-W none,obsolete'.
- If you want `autoreconf' to pass flags that are not listed here on
- to `aclocal', set `ACLOCAL_AMFLAGS' in your `Makefile.am'. Due to a
- limitation in the Autoconf implementation these flags currently must be
- set on a single line in `Makefile.am', without any backslash-newlines.
- File: autoconf.info, Node: Setup, Next: Existing Tests, Prev: Making configure Scripts, Up: Top
- 4 Initialization and Output Files
- *********************************
- Autoconf-generated `configure' scripts need some information about how
- to initialize, such as how to find the package's source files and about
- the output files to produce. The following sections describe the
- initialization and the creation of output files.
- * Menu:
- * Initializing configure:: Option processing etc.
- * Versioning:: Dealing with Autoconf versions
- * Notices:: Copyright, version numbers in `configure'
- * Input:: Where Autoconf should find files
- * Output:: Outputting results from the configuration
- * Configuration Actions:: Preparing the output based on results
- * Configuration Files:: Creating output files
- * Makefile Substitutions:: Using output variables in makefiles
- * Configuration Headers:: Creating a configuration header file
- * Configuration Commands:: Running arbitrary instantiation commands
- * Configuration Links:: Links depending on the configuration
- * Subdirectories:: Configuring independent packages together
- * Default Prefix:: Changing the default installation prefix
- File: autoconf.info, Node: Initializing configure, Next: Versioning, Up: Setup
- 4.1 Initializing `configure'
- ============================
- Every `configure' script must call `AC_INIT' before doing anything else
- that produces output. Calls to silent macros, such as `AC_DEFUN', may
- also occur prior to `AC_INIT', although these are generally used via
- `aclocal.m4', since that is implicitly included before the start of
- `configure.ac'. The only other required macro is `AC_OUTPUT' (*note
- Output::).
- -- Macro: AC_INIT (PACKAGE, VERSION, [BUG-REPORT], [TARNAME], [URL])
- Process any command-line arguments and perform initialization and
- verification.
- Set the name of the PACKAGE and its VERSION. These are typically
- used in `--version' support, including that of `configure'. The
- optional argument BUG-REPORT should be the email to which users
- should send bug reports. The package TARNAME differs from
- PACKAGE: the latter designates the full package name (e.g., `GNU
- Autoconf'), while the former is meant for distribution tar ball
- names (e.g., `autoconf'). It defaults to PACKAGE with `GNU '
- stripped, lower-cased, and all characters other than alphanumerics
- and underscores are changed to `-'. If provided, URL should be
- the home page for the package.
- The arguments of `AC_INIT' must be static, i.e., there should not
- be any shell computation, quotes, or newlines, but they can be
- computed by M4. This is because the package information strings
- are expanded at M4 time into several contexts, and must give the
- same text at shell time whether used in single-quoted strings,
- double-quoted strings, quoted here-documents, or unquoted
- here-documents. It is permissible to use `m4_esyscmd' or
- `m4_esyscmd_s' for computing a version string that changes with
- every commit to a version control system (in fact, Autoconf does
- just that, for all builds of the development tree made between
- releases).
- The following M4 macros (e.g., `AC_PACKAGE_NAME'), output variables
- (e.g., `PACKAGE_NAME'), and preprocessor symbols (e.g.,
- `PACKAGE_NAME'), are defined by `AC_INIT':
- `AC_PACKAGE_NAME', `PACKAGE_NAME'
- Exactly PACKAGE.
- `AC_PACKAGE_TARNAME', `PACKAGE_TARNAME'
- Exactly TARNAME, possibly generated from PACKAGE.
- `AC_PACKAGE_VERSION', `PACKAGE_VERSION'
- Exactly VERSION.
- `AC_PACKAGE_STRING', `PACKAGE_STRING'
- Exactly `PACKAGE VERSION'.
- `AC_PACKAGE_BUGREPORT', `PACKAGE_BUGREPORT'
- Exactly BUG-REPORT, if one was provided. Typically an email
- address, or URL to a bug management web page.
- `AC_PACKAGE_URL', `PACKAGE_URL'
- Exactly URL, if one was provided. If URL was empty, but
- PACKAGE begins with `GNU ', then this defaults to
- `http://www.gnu.org/software/TARNAME/', otherwise, no URL is
- assumed.
- If your `configure' script does its own option processing, it should
- inspect `$@' or `$*' immediately after calling `AC_INIT', because other
- Autoconf macros liberally use the `set' command to process strings, and
- this has the side effect of updating `$@' and `$*'. However, we
- suggest that you use standard macros like `AC_ARG_ENABLE' instead of
- attempting to implement your own option processing. *Note Site
- Configuration::.
- File: autoconf.info, Node: Versioning, Next: Notices, Prev: Initializing configure, Up: Setup
- 4.2 Dealing with Autoconf versions
- ==================================
- The following optional macros can be used to help choose the minimum
- version of Autoconf that can successfully compile a given
- `configure.ac'.
- -- Macro: AC_PREREQ (VERSION)
- Ensure that a recent enough version of Autoconf is being used. If
- the version of Autoconf being used to create `configure' is
- earlier than VERSION, print an error message to the standard error
- output and exit with failure (exit status is 63). For example:
- AC_PREREQ([2.69])
- This macro may be used before `AC_INIT'.
- -- Macro: AC_AUTOCONF_VERSION
- This macro was introduced in Autoconf 2.62. It identifies the
- version of Autoconf that is currently parsing the input file, in a
- format suitable for `m4_version_compare' (*note
- m4_version_compare::); in other words, for this release of
- Autoconf, its value is `2.69'. One potential use of this macro is
- for writing conditional fallbacks based on when a feature was
- added to Autoconf, rather than using `AC_PREREQ' to require the
- newer version of Autoconf. However, remember that the Autoconf
- philosophy favors feature checks over version checks.
- You should not expand this macro directly; use
- `m4_defn([AC_AUTOCONF_VERSION])' instead. This is because some
- users might have a beta version of Autoconf installed, with
- arbitrary letters included in its version string. This means it
- is possible for the version string to contain the name of a
- defined macro, such that expanding `AC_AUTOCONF_VERSION' would
- trigger the expansion of that macro during rescanning, and change
- the version string to be different than what you intended to check.
- File: autoconf.info, Node: Notices, Next: Input, Prev: Versioning, Up: Setup
- 4.3 Notices in `configure'
- ==========================
- The following macros manage version numbers for `configure' scripts.
- Using them is optional.
- -- Macro: AC_COPYRIGHT (COPYRIGHT-NOTICE)
- State that, in addition to the Free Software Foundation's
- copyright on the Autoconf macros, parts of your `configure' are
- covered by the COPYRIGHT-NOTICE.
- The COPYRIGHT-NOTICE shows up in both the head of `configure' and
- in `configure --version'.
- -- Macro: AC_REVISION (REVISION-INFO)
- Copy revision stamp REVISION-INFO into the `configure' script,
- with any dollar signs or double-quotes removed. This macro lets
- you put a revision stamp from `configure.ac' into `configure'
- without RCS or CVS changing it when you check in `configure'.
- That way, you can determine easily which revision of
- `configure.ac' a particular `configure' corresponds to.
- For example, this line in `configure.ac':
- AC_REVISION([$Revision: 1.30 $])
- produces this in `configure':
- #!/bin/sh
- # From configure.ac Revision: 1.30
- File: autoconf.info, Node: Input, Next: Output, Prev: Notices, Up: Setup
- 4.4 Finding `configure' Input
- =============================
- -- Macro: AC_CONFIG_SRCDIR (UNIQUE-FILE-IN-SOURCE-DIR)
- UNIQUE-FILE-IN-SOURCE-DIR is some file that is in the package's
- source directory; `configure' checks for this file's existence to
- make sure that the directory that it is told contains the source
- code in fact does. Occasionally people accidentally specify the
- wrong directory with `--srcdir'; this is a safety check. *Note
- configure Invocation::, for more information.
- Packages that do manual configuration or use the `install' program
- might need to tell `configure' where to find some other shell scripts
- by calling `AC_CONFIG_AUX_DIR', though the default places it looks are
- correct for most cases.
- -- Macro: AC_CONFIG_AUX_DIR (DIR)
- Use the auxiliary build tools (e.g., `install-sh', `config.sub',
- `config.guess', Cygnus `configure', Automake and Libtool scripts,
- etc.) that are in directory DIR. These are auxiliary files used
- in configuration. DIR can be either absolute or relative to
- `SRCDIR'. The default is `SRCDIR' or `SRCDIR/..' or
- `SRCDIR/../..', whichever is the first that contains `install-sh'.
- The other files are not checked for, so that using
- `AC_PROG_INSTALL' does not automatically require distributing the
- other auxiliary files. It checks for `install.sh' also, but that
- name is obsolete because some `make' have a rule that creates
- `install' from it if there is no makefile.
- The auxiliary directory is commonly named `build-aux'. If you
- need portability to DOS variants, do not name the auxiliary
- directory `aux'. *Note File System Conventions::.
- -- Macro: AC_REQUIRE_AUX_FILE (FILE)
- Declares that FILE is expected in the directory defined above. In
- Autoconf proper, this macro does nothing: its sole purpose is to be
- traced by third-party tools to produce a list of expected auxiliary
- files. For instance it is called by macros like `AC_PROG_INSTALL'
- (*note Particular Programs::) or `AC_CANONICAL_BUILD' (*note
- Canonicalizing::) to register the auxiliary files they need.
- Similarly, packages that use `aclocal' should declare where local
- macros can be found using `AC_CONFIG_MACRO_DIR'.
- -- Macro: AC_CONFIG_MACRO_DIR (DIR)
- Specify DIR as the location of additional local Autoconf macros.
- This macro is intended for use by future versions of commands like
- `autoreconf' that trace macro calls. It should be called directly
- from `configure.ac' so that tools that install macros for
- `aclocal' can find the macros' declarations.
- Note that if you use `aclocal' from Automake to generate
- `aclocal.m4', you must also set `ACLOCAL_AMFLAGS = -I DIR' in your
- top-level `Makefile.am'. Due to a limitation in the Autoconf
- implementation of `autoreconf', these include directives currently
- must be set on a single line in `Makefile.am', without any
- backslash-newlines.
- File: autoconf.info, Node: Output, Next: Configuration Actions, Prev: Input, Up: Setup
- 4.5 Outputting Files
- ====================
- Every Autoconf script, e.g., `configure.ac', should finish by calling
- `AC_OUTPUT'. That is the macro that generates and runs
- `config.status', which in turn creates the makefiles and any other
- files resulting from configuration. This is the only required macro
- besides `AC_INIT' (*note Input::).
- -- Macro: AC_OUTPUT
- Generate `config.status' and launch it. Call this macro once, at
- the end of `configure.ac'.
- `config.status' performs all the configuration actions: all the
- output files (see *note Configuration Files::, macro
- `AC_CONFIG_FILES'), header files (see *note Configuration
- Headers::, macro `AC_CONFIG_HEADERS'), commands (see *note
- Configuration Commands::, macro `AC_CONFIG_COMMANDS'), links (see
- *note Configuration Links::, macro `AC_CONFIG_LINKS'),
- subdirectories to configure (see *note Subdirectories::, macro
- `AC_CONFIG_SUBDIRS') are honored.
- The location of your `AC_OUTPUT' invocation is the exact point
- where configuration actions are taken: any code afterwards is
- executed by `configure' once `config.status' was run. If you want
- to bind actions to `config.status' itself (independently of
- whether `configure' is being run), see *note Running Arbitrary
- Configuration Commands: Configuration Commands.
- Historically, the usage of `AC_OUTPUT' was somewhat different.
- *Note Obsolete Macros::, for a description of the arguments that
- `AC_OUTPUT' used to support.
- If you run `make' in subdirectories, you should run it using the
- `make' variable `MAKE'. Most versions of `make' set `MAKE' to the name
- of the `make' program plus any options it was given. (But many do not
- include in it the values of any variables set on the command line, so
- those are not passed on automatically.) Some old versions of `make' do
- not set this variable. The following macro allows you to use it even
- with those versions.
- -- Macro: AC_PROG_MAKE_SET
- If the Make command, `$MAKE' if set or else `make', predefines
- `$(MAKE)', define output variable `SET_MAKE' to be empty.
- Otherwise, define `SET_MAKE' to a macro definition that sets
- `$(MAKE)', such as `MAKE=make'. Calls `AC_SUBST' for `SET_MAKE'.
- If you use this macro, place a line like this in each `Makefile.in'
- that runs `MAKE' on other directories:
- @SET_MAKE@
- File: autoconf.info, Node: Configuration Actions, Next: Configuration Files, Prev: Output, Up: Setup
- 4.6 Performing Configuration Actions
- ====================================
- `configure' is designed so that it appears to do everything itself, but
- there is actually a hidden slave: `config.status'. `configure' is in
- charge of examining your system, but it is `config.status' that
- actually takes the proper actions based on the results of `configure'.
- The most typical task of `config.status' is to _instantiate_ files.
- This section describes the common behavior of the four standard
- instantiating macros: `AC_CONFIG_FILES', `AC_CONFIG_HEADERS',
- `AC_CONFIG_COMMANDS' and `AC_CONFIG_LINKS'. They all have this
- prototype:
- AC_CONFIG_ITEMS(TAG..., [COMMANDS], [INIT-CMDS])
- where the arguments are:
- TAG...
- A blank-or-newline-separated list of tags, which are typically the
- names of the files to instantiate.
- You are encouraged to use literals as TAGS. In particular, you
- should avoid
- ... && my_foos="$my_foos fooo"
- ... && my_foos="$my_foos foooo"
- AC_CONFIG_ITEMS([$my_foos])
- and use this instead:
- ... && AC_CONFIG_ITEMS([fooo])
- ... && AC_CONFIG_ITEMS([foooo])
- The macros `AC_CONFIG_FILES' and `AC_CONFIG_HEADERS' use special
- TAG values: they may have the form `OUTPUT' or `OUTPUT:INPUTS'.
- The file OUTPUT is instantiated from its templates, INPUTS
- (defaulting to `OUTPUT.in').
- `AC_CONFIG_FILES([Makefile:boiler/top.mk:boiler/bot.mk])', for
- example, asks for the creation of the file `Makefile' that
- contains the expansion of the output variables in the
- concatenation of `boiler/top.mk' and `boiler/bot.mk'.
- The special value `-' might be used to denote the standard output
- when used in OUTPUT, or the standard input when used in the
- INPUTS. You most probably don't need to use this in
- `configure.ac', but it is convenient when using the command line
- interface of `./config.status', see *note config.status
- Invocation::, for more details.
- The INPUTS may be absolute or relative file names. In the latter
- case they are first looked for in the build tree, and then in the
- source tree. Input files should be text files, and a line length
- below 2000 bytes should be safe.
- COMMANDS
- Shell commands output literally into `config.status', and
- associated with a tag that the user can use to tell `config.status'
- which commands to run. The commands are run each time a TAG
- request is given to `config.status', typically each time the file
- `TAG' is created.
- The variables set during the execution of `configure' are _not_
- available here: you first need to set them via the INIT-CMDS.
- Nonetheless the following variables are precomputed:
- `srcdir'
- The name of the top source directory, assuming that the
- working directory is the top build directory. This is what
- the `configure' option `--srcdir' sets.
- `ac_top_srcdir'
- The name of the top source directory, assuming that the
- working directory is the current build directory.
- `ac_top_build_prefix'
- The name of the top build directory, assuming that the working
- directory is the current build directory. It can be empty,
- or else ends with a slash, so that you may concatenate it.
- `ac_srcdir'
- The name of the corresponding source directory, assuming that
- the working directory is the current build directory.
- `tmp'
- The name of a temporary directory within the build tree,
- which you can use if you need to create additional temporary
- files. The directory is cleaned up when `config.status' is
- done or interrupted. Please use package-specific file name
- prefixes to avoid clashing with files that `config.status'
- may use internally.
- The "current" directory refers to the directory (or
- pseudo-directory) containing the input part of TAGS. For
- instance, running
- AC_CONFIG_COMMANDS([deep/dir/out:in/in.in], [...], [...])
- with `--srcdir=../package' produces the following values:
- # Argument of --srcdir
- srcdir='../package'
- # Reversing deep/dir
- ac_top_build_prefix='../../'
- # Concatenation of $ac_top_build_prefix and srcdir
- ac_top_srcdir='../../../package'
- # Concatenation of $ac_top_srcdir and deep/dir
- ac_srcdir='../../../package/deep/dir'
- independently of `in/in.in'.
- INIT-CMDS
- Shell commands output _unquoted_ near the beginning of
- `config.status', and executed each time `config.status' runs
- (regardless of the tag). Because they are unquoted, for example,
- `$var' is output as the value of `var'. INIT-CMDS is typically
- used by `configure' to give `config.status' some variables it
- needs to run the COMMANDS.
- You should be extremely cautious in your variable names: all the
- INIT-CMDS share the same name space and may overwrite each other
- in unpredictable ways. Sorry...
- All these macros can be called multiple times, with different TAG
- values, of course!
- File: autoconf.info, Node: Configuration Files, Next: Makefile Substitutions, Prev: Configuration Actions, Up: Setup
- 4.7 Creating Configuration Files
- ================================
- Be sure to read the previous section, *note Configuration Actions::.
- -- Macro: AC_CONFIG_FILES (FILE..., [CMDS], [INIT-CMDS])
- Make `AC_OUTPUT' create each `FILE' by copying an input file (by
- default `FILE.in'), substituting the output variable values. This
- macro is one of the instantiating macros; see *note Configuration
- Actions::. *Note Makefile Substitutions::, for more information
- on using output variables. *Note Setting Output Variables::, for
- more information on creating them. This macro creates the
- directory that the file is in if it doesn't exist. Usually,
- makefiles are created this way, but other files, such as
- `.gdbinit', can be specified as well.
- Typical calls to `AC_CONFIG_FILES' look like this:
- AC_CONFIG_FILES([Makefile src/Makefile man/Makefile X/Imakefile])
- AC_CONFIG_FILES([autoconf], [chmod +x autoconf])
- You can override an input file name by appending to FILE a
- colon-separated list of input files. Examples:
- AC_CONFIG_FILES([Makefile:boiler/top.mk:boiler/bot.mk]
- [lib/Makefile:boiler/lib.mk])
- Doing this allows you to keep your file names acceptable to DOS
- variants, or to prepend and/or append boilerplate to the file.
- File: autoconf.info, Node: Makefile Substitutions, Next: Configuration Headers, Prev: Configuration Files, Up: Setup
- 4.8 Substitutions in Makefiles
- ==============================
- Each subdirectory in a distribution that contains something to be
- compiled or installed should come with a file `Makefile.in', from which
- `configure' creates a file `Makefile' in that directory. To create
- `Makefile', `configure' performs a simple variable substitution,
- replacing occurrences of `@VARIABLE@' in `Makefile.in' with the value
- that `configure' has determined for that variable. Variables that are
- substituted into output files in this way are called "output
- variables". They are ordinary shell variables that are set in
- `configure'. To make `configure' substitute a particular variable into
- the output files, the macro `AC_SUBST' must be called with that
- variable name as an argument. Any occurrences of `@VARIABLE@' for
- other variables are left unchanged. *Note Setting Output Variables::,
- for more information on creating output variables with `AC_SUBST'.
- A software package that uses a `configure' script should be
- distributed with a file `Makefile.in', but no makefile; that way, the
- user has to properly configure the package for the local system before
- compiling it.
- *Note Makefile Conventions: (standards)Makefile Conventions, for
- more information on what to put in makefiles.
- * Menu:
- * Preset Output Variables:: Output variables that are always set
- * Installation Directory Variables:: Other preset output variables
- * Changed Directory Variables:: Warnings about `datarootdir'
- * Build Directories:: Supporting multiple concurrent compiles
- * Automatic Remaking:: Makefile rules for configuring
- File: autoconf.info, Node: Preset Output Variables, Next: Installation Directory Variables, Up: Makefile Substitutions
- 4.8.1 Preset Output Variables
- -----------------------------
- Some output variables are preset by the Autoconf macros. Some of the
- Autoconf macros set additional output variables, which are mentioned in
- the descriptions for those macros. *Note Output Variable Index::, for a
- complete list of output variables. *Note Installation Directory
- Variables::, for the list of the preset ones related to installation
- directories. Below are listed the other preset ones, many of which are
- precious variables (*note Setting Output Variables::, `AC_ARG_VAR').
- The preset variables which are available during `config.status'
- (*note Configuration Actions::) may also be used during `configure'
- tests. For example, it is permissible to reference `$srcdir' when
- constructing a list of directories to pass via option `-I' during a
- compiler feature check. When used in this manner, coupled with the
- fact that `configure' is always run from the top build directory, it is
- sufficient to use just `$srcdir' instead of `$top_srcdir'.
- -- Variable: CFLAGS
- Debugging and optimization options for the C compiler. If it is
- not set in the environment when `configure' runs, the default
- value is set when you call `AC_PROG_CC' (or empty if you don't).
- `configure' uses this variable when compiling or linking programs
- to test for C features.
- If a compiler option affects only the behavior of the preprocessor
- (e.g., `-DNAME'), it should be put into `CPPFLAGS' instead. If it
- affects only the linker (e.g., `-LDIRECTORY'), it should be put
- into `LDFLAGS' instead. If it affects only the compiler proper,
- `CFLAGS' is the natural home for it. If an option affects
- multiple phases of the compiler, though, matters get tricky. One
- approach to put such options directly into `CC', e.g., `CC='gcc
- -m64''. Another is to put them into both `CPPFLAGS' and
- `LDFLAGS', but not into `CFLAGS'.
- However, remember that some `Makefile' variables are reserved by
- the GNU Coding Standards for the use of the "user"--the person
- building the package. For instance, `CFLAGS' is one such variable.
- Sometimes package developers are tempted to set user variables
- such as `CFLAGS' because it appears to make their job easier.
- However, the package itself should never set a user variable,
- particularly not to include switches that are required for proper
- compilation of the package. Since these variables are documented
- as being for the package builder, that person rightfully expects
- to be able to override any of these variables at build time. If
- the package developer needs to add switches without interfering
- with the user, the proper way to do that is to introduce an
- additional variable. Automake makes this easy by introducing
- `AM_CFLAGS' (*note Flag Variables Ordering: (automake)Flag
- Variables Ordering.), but the concept is the same even if Automake
- is not used.
- -- Variable: configure_input
- A comment saying that the file was generated automatically by
- `configure' and giving the name of the input file. `AC_OUTPUT'
- adds a comment line containing this variable to the top of every
- makefile it creates. For other files, you should reference this
- variable in a comment at the top of each input file. For example,
- an input shell script should begin like this:
- #!/bin/sh
- # @configure_input@
- The presence of that line also reminds people editing the file
- that it needs to be processed by `configure' in order to be used.
- -- Variable: CPPFLAGS
- Preprocessor options for the C, C++, Objective C, and Objective C++
- preprocessors and compilers. If it is not set in the environment
- when `configure' runs, the default value is empty. `configure'
- uses this variable when preprocessing or compiling programs to
- test for C, C++, Objective C, and Objective C++ features.
- This variable's contents should contain options like `-I', `-D',
- and `-U' that affect only the behavior of the preprocessor.
- Please see the explanation of `CFLAGS' for what you can do if an
- option affects other phases of the compiler as well.
- Currently, `configure' always links as part of a single invocation
- of the compiler that also preprocesses and compiles, so it uses
- this variable also when linking programs. However, it is unwise to
- depend on this behavior because the GNU Coding Standards do not
- require it and many packages do not use `CPPFLAGS' when linking
- programs.
- *Note Special Chars in Variables::, for limitations that `CPPFLAGS'
- might run into.
- -- Variable: CXXFLAGS
- Debugging and optimization options for the C++ compiler. It acts
- like `CFLAGS', but for C++ instead of C.
- -- Variable: DEFS
- `-D' options to pass to the C compiler. If `AC_CONFIG_HEADERS' is
- called, `configure' replaces `@DEFS@' with `-DHAVE_CONFIG_H'
- instead (*note Configuration Headers::). This variable is not
- defined while `configure' is performing its tests, only when
- creating the output files. *Note Setting Output Variables::, for
- how to check the results of previous tests.
- -- Variable: ECHO_C
- -- Variable: ECHO_N
- -- Variable: ECHO_T
- How does one suppress the trailing newline from `echo' for
- question-answer message pairs? These variables provide a way:
- echo $ECHO_N "And the winner is... $ECHO_C"
- sleep 100000000000
- echo "${ECHO_T}dead."
- Some old and uncommon `echo' implementations offer no means to
- achieve this, in which case `ECHO_T' is set to tab. You might not
- want to use it.
- -- Variable: ERLCFLAGS
- Debugging and optimization options for the Erlang compiler. If it
- is not set in the environment when `configure' runs, the default
- value is empty. `configure' uses this variable when compiling
- programs to test for Erlang features.
- -- Variable: FCFLAGS
- Debugging and optimization options for the Fortran compiler. If it
- is not set in the environment when `configure' runs, the default
- value is set when you call `AC_PROG_FC' (or empty if you don't).
- `configure' uses this variable when compiling or linking programs
- to test for Fortran features.
- -- Variable: FFLAGS
- Debugging and optimization options for the Fortran 77 compiler.
- If it is not set in the environment when `configure' runs, the
- default value is set when you call `AC_PROG_F77' (or empty if you
- don't). `configure' uses this variable when compiling or linking
- programs to test for Fortran 77 features.
- -- Variable: LDFLAGS
- Options for the linker. If it is not set in the environment when
- `configure' runs, the default value is empty. `configure' uses
- this variable when linking programs to test for C, C++, Objective
- C, Objective C++, Fortran, and Go features.
- This variable's contents should contain options like `-s' and `-L'
- that affect only the behavior of the linker. Please see the
- explanation of `CFLAGS' for what you can do if an option also
- affects other phases of the compiler.
- Don't use this variable to pass library names (`-l') to the
- linker; use `LIBS' instead.
- -- Variable: LIBS
- `-l' options to pass to the linker. The default value is empty,
- but some Autoconf macros may prepend extra libraries to this
- variable if those libraries are found and provide necessary
- functions, see *note Libraries::. `configure' uses this variable
- when linking programs to test for C, C++, Objective C, Objective
- C++, Fortran, and Go features.
- -- Variable: OBJCFLAGS
- Debugging and optimization options for the Objective C compiler.
- It acts like `CFLAGS', but for Objective C instead of C.
- -- Variable: OBJCXXFLAGS
- Debugging and optimization options for the Objective C++ compiler.
- It acts like `CXXFLAGS', but for Objective C++ instead of C++.
- -- Variable: GOFLAGS
- Debugging and optimization options for the Go compiler. It acts
- like `CFLAGS', but for Go instead of C.
- -- Variable: builddir
- Rigorously equal to `.'. Added for symmetry only.
- -- Variable: abs_builddir
- Absolute name of `builddir'.
- -- Variable: top_builddir
- The relative name of the top level of the current build tree. In
- the top-level directory, this is the same as `builddir'.
- -- Variable: top_build_prefix
- The relative name of the top level of the current build tree with
- final slash if nonempty. This is the same as `top_builddir',
- except that it contains zero or more runs of `../', so it should
- not be appended with a slash for concatenation. This helps for
- `make' implementations that otherwise do not treat `./file' and
- `file' as equal in the toplevel build directory.
- -- Variable: abs_top_builddir
- Absolute name of `top_builddir'.
- -- Variable: srcdir
- The name of the directory that contains the source code for that
- makefile.
- -- Variable: abs_srcdir
- Absolute name of `srcdir'.
- -- Variable: top_srcdir
- The name of the top-level source code directory for the package.
- In the top-level directory, this is the same as `srcdir'.
- -- Variable: abs_top_srcdir
- Absolute name of `top_srcdir'.
- File: autoconf.info, Node: Installation Directory Variables, Next: Changed Directory Variables, Prev: Preset Output Variables, Up: Makefile Substitutions
- 4.8.2 Installation Directory Variables
- --------------------------------------
- The following variables specify the directories for package
- installation, see *note Variables for Installation Directories:
- (standards)Directory Variables, for more information. Each variable
- corresponds to an argument of `configure'; trailing slashes are
- stripped so that expressions such as `${prefix}/lib' expand with only
- one slash between directory names. See the end of this section for
- details on when and how to use these variables.
- -- Variable: bindir
- The directory for installing executables that users run.
- -- Variable: datadir
- The directory for installing idiosyncratic read-only
- architecture-independent data.
- -- Variable: datarootdir
- The root of the directory tree for read-only
- architecture-independent data files.
- -- Variable: docdir
- The directory for installing documentation files (other than Info
- and man).
- -- Variable: dvidir
- The directory for installing documentation files in DVI format.
- -- Variable: exec_prefix
- The installation prefix for architecture-dependent files. By
- default it's the same as `prefix'. You should avoid installing
- anything directly to `exec_prefix'. However, the default value for
- directories containing architecture-dependent files should be
- relative to `exec_prefix'.
- -- Variable: htmldir
- The directory for installing HTML documentation.
- -- Variable: includedir
- The directory for installing C header files.
- -- Variable: infodir
- The directory for installing documentation in Info format.
- -- Variable: libdir
- The directory for installing object code libraries.
- -- Variable: libexecdir
- The directory for installing executables that other programs run.
- -- Variable: localedir
- The directory for installing locale-dependent but
- architecture-independent data, such as message catalogs. This
- directory usually has a subdirectory per locale.
- -- Variable: localstatedir
- The directory for installing modifiable single-machine data.
- -- Variable: mandir
- The top-level directory for installing documentation in man format.
- -- Variable: oldincludedir
- The directory for installing C header files for non-GCC compilers.
- -- Variable: pdfdir
- The directory for installing PDF documentation.
- -- Variable: prefix
- The common installation prefix for all files. If `exec_prefix' is
- defined to a different value, `prefix' is used only for
- architecture-independent files.
- -- Variable: psdir
- The directory for installing PostScript documentation.
- -- Variable: sbindir
- The directory for installing executables that system
- administrators run.
- -- Variable: sharedstatedir
- The directory for installing modifiable architecture-independent
- data.
- -- Variable: sysconfdir
- The directory for installing read-only single-machine data.
- Most of these variables have values that rely on `prefix' or
- `exec_prefix'. It is deliberate that the directory output variables
- keep them unexpanded: typically `@datarootdir@' is replaced by
- `${prefix}/share', not `/usr/local/share', and `@datadir@' is replaced
- by `${datarootdir}'.
- This behavior is mandated by the GNU Coding Standards, so that when
- the user runs:
- `make'
- she can still specify a different prefix from the one specified to
- `configure', in which case, if needed, the package should hard
- code dependencies corresponding to the make-specified prefix.
- `make install'
- she can specify a different installation location, in which case
- the package _must_ still depend on the location which was compiled
- in (i.e., never recompile when `make install' is run). This is an
- extremely important feature, as many people may decide to install
- all the files of a package grouped together, and then install
- links from the final locations to there.
- In order to support these features, it is essential that
- `datarootdir' remains defined as `${prefix}/share', so that its value
- can be expanded based on the current value of `prefix'.
- A corollary is that you should not use these variables except in
- makefiles. For instance, instead of trying to evaluate `datadir' in
- `configure' and hard-coding it in makefiles using e.g.,
- `AC_DEFINE_UNQUOTED([DATADIR], ["$datadir"], [Data directory.])', you
- should add `-DDATADIR='$(datadir)'' to your makefile's definition of
- `CPPFLAGS' (`AM_CPPFLAGS' if you are also using Automake).
- Similarly, you should not rely on `AC_CONFIG_FILES' to replace
- `bindir' and friends in your shell scripts and other files; instead,
- let `make' manage their replacement. For instance Autoconf ships
- templates of its shell scripts ending with `.in', and uses a makefile
- snippet similar to the following to build scripts like `autoheader' and
- `autom4te':
- edit = sed \
- -e 's|@bindir[@]|$(bindir)|g' \
- -e 's|@pkgdatadir[@]|$(pkgdatadir)|g' \
- -e 's|@prefix[@]|$(prefix)|g'
- autoheader autom4te: Makefile
- rm -f $@ $@.tmp
- srcdir=''; \
- test -f ./$@.in || srcdir=$(srcdir)/; \
- $(edit) $${srcdir}$@.in >$@.tmp
- chmod +x $@.tmp
- chmod a-w $@.tmp
- mv $@.tmp $@
- autoheader: $(srcdir)/autoheader.in
- autom4te: $(srcdir)/autom4te.in
- Some details are noteworthy:
- `@bindir[@]'
- The brackets prevent `configure' from replacing `@bindir@' in the
- Sed expression itself. Brackets are preferable to a backslash
- here, since Posix says `\@' is not portable.
- `$(bindir)'
- Don't use `@bindir@'! Use the matching makefile variable instead.
- `$(pkgdatadir)'
- The example takes advantage of the variable `$(pkgdatadir)'
- provided by Automake; it is equivalent to `$(datadir)/$(PACKAGE)'.
- `/'
- Don't use `/' in the Sed expressions that replace file names since
- most likely the variables you use, such as `$(bindir)', contain
- `/'. Use a shell metacharacter instead, such as `|'.
- special characters
- File names, file name components, and the value of `VPATH' should
- not contain shell metacharacters or white space. *Note Special
- Chars in Variables::.
- dependency on `Makefile'
- Since `edit' uses values that depend on the configuration specific
- values (`prefix', etc.) and not only on `VERSION' and so forth,
- the output depends on `Makefile', not `configure.ac'.
- `$@'
- The main rule is generic, and uses `$@' extensively to avoid the
- need for multiple copies of the rule.
- Separated dependencies and single suffix rules
- You can't use them! The above snippet cannot be (portably)
- rewritten as:
- autoconf autoheader: Makefile
- .in:
- rm -f $@ $@.tmp
- $(edit) $< >$@.tmp
- chmod +x $@.tmp
- mv $@.tmp $@
- *Note Single Suffix Rules::, for details.
- `$(srcdir)'
- Be sure to specify the name of the source directory, otherwise the
- package won't support separated builds.
- For the more specific installation of Erlang libraries, the
- following variables are defined:
- -- Variable: ERLANG_INSTALL_LIB_DIR
- The common parent directory of Erlang library installation
- directories. This variable is set by calling the
- `AC_ERLANG_SUBST_INSTALL_LIB_DIR' macro in `configure.ac'.
- -- Variable: ERLANG_INSTALL_LIB_DIR_LIBRARY
- The installation directory for Erlang library LIBRARY. This
- variable is set by using the `AC_ERLANG_SUBST_INSTALL_LIB_SUBDIR'
- macro in `configure.ac'.
- *Note Erlang Libraries::, for details.
- File: autoconf.info, Node: Changed Directory Variables, Next: Build Directories, Prev: Installation Directory Variables, Up: Makefile Substitutions
- 4.8.3 Changed Directory Variables
- ---------------------------------
- In Autoconf 2.60, the set of directory variables has changed, and the
- defaults of some variables have been adjusted (*note Installation
- Directory Variables::) to changes in the GNU Coding Standards.
- Notably, `datadir', `infodir', and `mandir' are now expressed in terms
- of `datarootdir'. If you are upgrading from an earlier Autoconf
- version, you may need to adjust your files to ensure that the directory
- variables are substituted correctly (*note Defining Directories::), and
- that a definition of `datarootdir' is in place. For example, in a
- `Makefile.in', adding
- datarootdir = @datarootdir@
- is usually sufficient. If you use Automake to create `Makefile.in', it
- will add this for you.
- To help with the transition, Autoconf warns about files that seem to
- use `datarootdir' without defining it. In some cases, it then expands
- the value of `$datarootdir' in substitutions of the directory
- variables. The following example shows such a warning:
- $ cat configure.ac
- AC_INIT
- AC_CONFIG_FILES([Makefile])
- AC_OUTPUT
- $ cat Makefile.in
- prefix = @prefix@
- datadir = @datadir@
- $ autoconf
- $ configure
- configure: creating ./config.status
- config.status: creating Makefile
- config.status: WARNING:
- Makefile.in seems to ignore the --datarootdir setting
- $ cat Makefile
- prefix = /usr/local
- datadir = ${prefix}/share
- Usually one can easily change the file to accommodate both older and
- newer Autoconf releases:
- $ cat Makefile.in
- prefix = @prefix@
- datarootdir = @datarootdir@
- datadir = @datadir@
- $ configure
- configure: creating ./config.status
- config.status: creating Makefile
- $ cat Makefile
- prefix = /usr/local
- datarootdir = ${prefix}/share
- datadir = ${datarootdir}
- In some cases, however, the checks may not be able to detect that a
- suitable initialization of `datarootdir' is in place, or they may fail
- to detect that such an initialization is necessary in the output file.
- If, after auditing your package, there are still spurious `configure'
- warnings about `datarootdir', you may add the line
- AC_DEFUN([AC_DATAROOTDIR_CHECKED])
- to your `configure.ac' to disable the warnings. This is an exception
- to the usual rule that you should not define a macro whose name begins
- with `AC_' (*note Macro Names::).
- File: autoconf.info, Node: Build Directories, Next: Automatic Remaking, Prev: Changed Directory Variables, Up: Makefile Substitutions
- 4.8.4 Build Directories
- -----------------------
- You can support compiling a software package for several architectures
- simultaneously from the same copy of the source code. The object files
- for each architecture are kept in their own directory.
- To support doing this, `make' uses the `VPATH' variable to find the
- files that are in the source directory. GNU Make can do this. Most
- other recent `make' programs can do this as well, though they may have
- difficulties and it is often simpler to recommend GNU `make' (*note
- VPATH and Make::). Older `make' programs do not support `VPATH'; when
- using them, the source code must be in the same directory as the object
- files.
- If you are using GNU Automake, the remaining details in this section
- are already covered for you, based on the contents of your
- `Makefile.am'. But if you are using Autoconf in isolation, then
- supporting `VPATH' requires the following in your `Makefile.in':
- srcdir = @srcdir@
- VPATH = @srcdir@
- Do not set `VPATH' to the value of another variable (*note Variables
- listed in VPATH::.
- `configure' substitutes the correct value for `srcdir' when it
- produces `Makefile'.
- Do not use the `make' variable `$<', which expands to the file name
- of the file in the source directory (found with `VPATH'), except in
- implicit rules. (An implicit rule is one such as `.c.o', which tells
- how to create a `.o' file from a `.c' file.) Some versions of `make'
- do not set `$<' in explicit rules; they expand it to an empty value.
- Instead, Make command lines should always refer to source files by
- prefixing them with `$(srcdir)/'. For example:
- time.info: time.texinfo
- $(MAKEINFO) '$(srcdir)/time.texinfo'
- File: autoconf.info, Node: Automatic Remaking, Prev: Build Directories, Up: Makefile Substitutions
- 4.8.5 Automatic Remaking
- ------------------------
- You can put rules like the following in the top-level `Makefile.in' for
- a package to automatically update the configuration information when
- you change the configuration files. This example includes all of the
- optional files, such as `aclocal.m4' and those related to configuration
- header files. Omit from the `Makefile.in' rules for any of these files
- that your package does not use.
- The `$(srcdir)/' prefix is included because of limitations in the
- `VPATH' mechanism.
- The `stamp-' files are necessary because the timestamps of
- `config.h.in' and `config.h' are not changed if remaking them does not
- change their contents. This feature avoids unnecessary recompilation.
- You should include the file `stamp-h.in' in your package's
- distribution, so that `make' considers `config.h.in' up to date. Don't
- use `touch' (*note Limitations of Usual Tools: touch.); instead, use
- `echo' (using `date' would cause needless differences, hence CVS
- conflicts, etc.).
- $(srcdir)/configure: configure.ac aclocal.m4
- cd '$(srcdir)' && autoconf
- # autoheader might not change config.h.in, so touch a stamp file.
- $(srcdir)/config.h.in: stamp-h.in
- $(srcdir)/stamp-h.in: configure.ac aclocal.m4
- cd '$(srcdir)' && autoheader
- echo timestamp > '$(srcdir)/stamp-h.in'
- config.h: stamp-h
- stamp-h: config.h.in config.status
- ./config.status
- Makefile: Makefile.in config.status
- ./config.status
- config.status: configure
- ./config.status --recheck
- (Be careful if you copy these lines directly into your makefile, as you
- need to convert the indented lines to start with the tab character.)
- In addition, you should use
- AC_CONFIG_FILES([stamp-h], [echo timestamp > stamp-h])
- so `config.status' ensures that `config.h' is considered up to date.
- *Note Output::, for more information about `AC_OUTPUT'.
- *Note config.status Invocation::, for more examples of handling
- configuration-related dependencies.
- File: autoconf.info, Node: Configuration Headers, Next: Configuration Commands, Prev: Makefile Substitutions, Up: Setup
- 4.9 Configuration Header Files
- ==============================
- When a package contains more than a few tests that define C preprocessor
- symbols, the command lines to pass `-D' options to the compiler can get
- quite long. This causes two problems. One is that the `make' output
- is hard to visually scan for errors. More seriously, the command lines
- can exceed the length limits of some operating systems. As an
- alternative to passing `-D' options to the compiler, `configure'
- scripts can create a C header file containing `#define' directives.
- The `AC_CONFIG_HEADERS' macro selects this kind of output. Though it
- can be called anywhere between `AC_INIT' and `AC_OUTPUT', it is
- customary to call it right after `AC_INIT'.
- The package should `#include' the configuration header file before
- any other header files, to prevent inconsistencies in declarations (for
- example, if it redefines `const').
- To provide for VPATH builds, remember to pass the C compiler a `-I.'
- option (or `-I..'; whichever directory contains `config.h'). Even if
- you use `#include "config.h"', the preprocessor searches only the
- directory of the currently read file, i.e., the source directory, not
- the build directory.
- With the appropriate `-I' option, you can use `#include <config.h>'.
- Actually, it's a good habit to use it, because in the rare case when
- the source directory contains another `config.h', the build directory
- should be searched first.
- -- Macro: AC_CONFIG_HEADERS (HEADER ..., [CMDS], [INIT-CMDS])
- This macro is one of the instantiating macros; see *note
- Configuration Actions::. Make `AC_OUTPUT' create the file(s) in
- the blank-or-newline-separated list HEADER containing C
- preprocessor `#define' statements, and replace `@DEFS@' in
- generated files with `-DHAVE_CONFIG_H' instead of the value of
- `DEFS'. The usual name for HEADER is `config.h'.
- If HEADER already exists and its contents are identical to what
- `AC_OUTPUT' would put in it, it is left alone. Doing this allows
- making some changes in the configuration without needlessly causing
- object files that depend on the header file to be recompiled.
- Usually the input file is named `HEADER.in'; however, you can
- override the input file name by appending to HEADER a
- colon-separated list of input files. For example, you might need
- to make the input file name acceptable to DOS variants:
- AC_CONFIG_HEADERS([config.h:config.hin])
- -- Macro: AH_HEADER
- This macro is defined as the name of the first declared config
- header and undefined if no config headers have been declared up to
- this point. A third-party macro may, for example, require use of
- a config header without invoking AC_CONFIG_HEADERS twice, like
- this:
- AC_CONFIG_COMMANDS_PRE(
- [m4_ifndef([AH_HEADER], [AC_CONFIG_HEADERS([config.h])])])
- *Note Configuration Actions::, for more details on HEADER.
- * Menu:
- * Header Templates:: Input for the configuration headers
- * autoheader Invocation:: How to create configuration templates
- * Autoheader Macros:: How to specify CPP templates
- File: autoconf.info, Node: Header Templates, Next: autoheader Invocation, Up: Configuration Headers
- 4.9.1 Configuration Header Templates
- ------------------------------------
- Your distribution should contain a template file that looks as you want
- the final header file to look, including comments, with `#undef'
- statements which are used as hooks. For example, suppose your
- `configure.ac' makes these calls:
- AC_CONFIG_HEADERS([conf.h])
- AC_CHECK_HEADERS([unistd.h])
- Then you could have code like the following in `conf.h.in'. The
- `conf.h' created by `configure' defines `HAVE_UNISTD_H' to 1, if and
- only if the system has `unistd.h'.
- /* Define as 1 if you have unistd.h. */
- #undef HAVE_UNISTD_H
- The format of the template file is stricter than what the C
- preprocessor is required to accept. A directive line should contain
- only whitespace, `#undef', and `HAVE_UNISTD_H'. The use of `#define'
- instead of `#undef', or of comments on the same line as `#undef', is
- strongly discouraged. Each hook should only be listed once. Other
- preprocessor lines, such as `#ifdef' or `#include', are copied verbatim
- from the template into the generated header.
- Since it is a tedious task to keep a template header up to date, you
- may use `autoheader' to generate it, see *note autoheader Invocation::.
- During the instantiation of the header, each `#undef' line in the
- template file for each symbol defined by `AC_DEFINE' is changed to an
- appropriate `#define'. If the corresponding `AC_DEFINE' has not been
- executed during the `configure' run, the `#undef' line is commented
- out. (This is important, e.g., for `_POSIX_SOURCE': on many systems,
- it can be implicitly defined by the compiler, and undefining it in the
- header would then break compilation of subsequent headers.)
- Currently, _all_ remaining `#undef' lines in the header template are
- commented out, whether or not there was a corresponding `AC_DEFINE' for
- the macro name; but this behavior is not guaranteed for future releases
- of Autoconf.
- Generally speaking, since you should not use `#define', and you
- cannot guarantee whether a `#undef' directive in the header template
- will be converted to a `#define' or commented out in the generated
- header file, the template file cannot be used for conditional
- definition effects. Consequently, if you need to use the construct
- #ifdef THIS
- # define THAT
- #endif
- you must place it outside of the template. If you absolutely need to
- hook it to the config header itself, please put the directives to a
- separate file, and `#include' that file from the config header
- template. If you are using `autoheader', you would probably use
- `AH_BOTTOM' to append the `#include' directive.
- File: autoconf.info, Node: autoheader Invocation, Next: Autoheader Macros, Prev: Header Templates, Up: Configuration Headers
- 4.9.2 Using `autoheader' to Create `config.h.in'
- ------------------------------------------------
- The `autoheader' program can create a template file of C `#define'
- statements for `configure' to use. It searches for the first
- invocation of `AC_CONFIG_HEADERS' in `configure' sources to determine
- the name of the template. (If the first call of `AC_CONFIG_HEADERS'
- specifies more than one input file name, `autoheader' uses the first
- one.)
- It is recommended that only one input file is used. If you want to
- append a boilerplate code, it is preferable to use `AH_BOTTOM([#include
- <conf_post.h>])'. File `conf_post.h' is not processed during the
- configuration then, which make things clearer. Analogically, `AH_TOP'
- can be used to prepend a boilerplate code.
- In order to do its job, `autoheader' needs you to document all of
- the symbols that you might use. Typically this is done via an
- `AC_DEFINE' or `AC_DEFINE_UNQUOTED' call whose first argument is a
- literal symbol and whose third argument describes the symbol (*note
- Defining Symbols::). Alternatively, you can use `AH_TEMPLATE' (*note
- Autoheader Macros::), or you can supply a suitable input file for a
- subsequent configuration header file. Symbols defined by Autoconf's
- builtin tests are already documented properly; you need to document
- only those that you define yourself.
- You might wonder why `autoheader' is needed: after all, why would
- `configure' need to "patch" a `config.h.in' to produce a `config.h'
- instead of just creating `config.h' from scratch? Well, when
- everything rocks, the answer is just that we are wasting our time
- maintaining `autoheader': generating `config.h' directly is all that is
- needed. When things go wrong, however, you'll be thankful for the
- existence of `autoheader'.
- The fact that the symbols are documented is important in order to
- _check_ that `config.h' makes sense. The fact that there is a
- well-defined list of symbols that should be defined (or not) is also
- important for people who are porting packages to environments where
- `configure' cannot be run: they just have to _fill in the blanks_.
- But let's come back to the point: the invocation of `autoheader'...
- If you give `autoheader' an argument, it uses that file instead of
- `configure.ac' and writes the header file to the standard output
- instead of to `config.h.in'. If you give `autoheader' an argument of
- `-', it reads the standard input instead of `configure.ac' and writes
- the header file to the standard output.
- `autoheader' accepts the following options:
- `--help'
- `-h'
- Print a summary of the command line options and exit.
- `--version'
- `-V'
- Print the version number of Autoconf and exit.
- `--verbose'
- `-v'
- Report processing steps.
- `--debug'
- `-d'
- Don't remove the temporary files.
- `--force'
- `-f'
- Remake the template file even if newer than its input files.
- `--include=DIR'
- `-I DIR'
- Append DIR to the include path. Multiple invocations accumulate.
- `--prepend-include=DIR'
- `-B DIR'
- Prepend DIR to the include path. Multiple invocations accumulate.
- `--warnings=CATEGORY'
- `-W CATEGORY'
- Report the warnings related to CATEGORY (which can actually be a
- comma separated list). Current categories include:
- `obsolete'
- report the uses of obsolete constructs
- `all'
- report all the warnings
- `none'
- report none
- `error'
- treats warnings as errors
- `no-CATEGORY'
- disable warnings falling into CATEGORY
- File: autoconf.info, Node: Autoheader Macros, Prev: autoheader Invocation, Up: Configuration Headers
- 4.9.3 Autoheader Macros
- -----------------------
- `autoheader' scans `configure.ac' and figures out which C preprocessor
- symbols it might define. It knows how to generate templates for
- symbols defined by `AC_CHECK_HEADERS', `AC_CHECK_FUNCS' etc., but if
- you `AC_DEFINE' any additional symbol, you must define a template for
- it. If there are missing templates, `autoheader' fails with an error
- message.
- The template for a SYMBOL is created by `autoheader' from the
- DESCRIPTION argument to an `AC_DEFINE'; see *note Defining Symbols::.
- For special needs, you can use the following macros.
- -- Macro: AH_TEMPLATE (KEY, DESCRIPTION)
- Tell `autoheader' to generate a template for KEY. This macro
- generates standard templates just like `AC_DEFINE' when a
- DESCRIPTION is given.
- For example:
- AH_TEMPLATE([CRAY_STACKSEG_END],
- [Define to one of _getb67, GETB67, getb67
- for Cray-2 and Cray-YMP systems. This
- function is required for alloca.c support
- on those systems.])
- generates the following template, with the description properly
- justified.
- /* Define to one of _getb67, GETB67, getb67 for Cray-2 and
- Cray-YMP systems. This function is required for alloca.c
- support on those systems. */
- #undef CRAY_STACKSEG_END
- -- Macro: AH_VERBATIM (KEY, TEMPLATE)
- Tell `autoheader' to include the TEMPLATE as-is in the header
- template file. This TEMPLATE is associated with the KEY, which is
- used to sort all the different templates and guarantee their
- uniqueness. It should be a symbol that can be defined via
- `AC_DEFINE'.
- -- Macro: AH_TOP (TEXT)
- Include TEXT at the top of the header template file.
- -- Macro: AH_BOTTOM (TEXT)
- Include TEXT at the bottom of the header template file.
- Please note that TEXT gets included "verbatim" to the template file,
- not to the resulting config header, so it can easily get mangled when
- the template is processed. There is rarely a need for something other
- than
- AH_BOTTOM([#include <custom.h>])
- File: autoconf.info, Node: Configuration Commands, Next: Configuration Links, Prev: Configuration Headers, Up: Setup
- 4.10 Running Arbitrary Configuration Commands
- =============================================
- You can execute arbitrary commands before, during, and after
- `config.status' is run. The three following macros accumulate the
- commands to run when they are called multiple times.
- `AC_CONFIG_COMMANDS' replaces the obsolete macro `AC_OUTPUT_COMMANDS';
- see *note Obsolete Macros::, for details.
- -- Macro: AC_CONFIG_COMMANDS (TAG..., [CMDS], [INIT-CMDS])
- Specify additional shell commands to run at the end of
- `config.status', and shell commands to initialize any variables
- from `configure'. Associate the commands with TAG. Since
- typically the CMDS create a file, TAG should naturally be the name
- of that file. If needed, the directory hosting TAG is created.
- This macro is one of the instantiating macros; see *note
- Configuration Actions::.
- Here is an unrealistic example:
- fubar=42
- AC_CONFIG_COMMANDS([fubar],
- [echo this is extra $fubar, and so on.],
- [fubar=$fubar])
- Here is a better one:
- AC_CONFIG_COMMANDS([timestamp], [date >timestamp])
- The following two macros look similar, but in fact they are not of
- the same breed: they are executed directly by `configure', so you
- cannot use `config.status' to rerun them.
- -- Macro: AC_CONFIG_COMMANDS_PRE (CMDS)
- Execute the CMDS right before creating `config.status'.
- This macro presents the last opportunity to call `AC_SUBST',
- `AC_DEFINE', or `AC_CONFIG_ITEMS' macros.
- -- Macro: AC_CONFIG_COMMANDS_POST (CMDS)
- Execute the CMDS right after creating `config.status'.
- File: autoconf.info, Node: Configuration Links, Next: Subdirectories, Prev: Configuration Commands, Up: Setup
- 4.11 Creating Configuration Links
- =================================
- You may find it convenient to create links whose destinations depend
- upon results of tests. One can use `AC_CONFIG_COMMANDS' but the
- creation of relative symbolic links can be delicate when the package is
- built in a directory different from the source directory.
- -- Macro: AC_CONFIG_LINKS (DEST:SOURCE..., [CMDS], [INIT-CMDS])
- Make `AC_OUTPUT' link each of the existing files SOURCE to the
- corresponding link name DEST. Makes a symbolic link if possible,
- otherwise a hard link if possible, otherwise a copy. The DEST and
- SOURCE names should be relative to the top level source or build
- directory. This macro is one of the instantiating macros; see
- *note Configuration Actions::.
- For example, this call:
- AC_CONFIG_LINKS([host.h:config/$machine.h
- object.h:config/$obj_format.h])
- creates in the current directory `host.h' as a link to
- `SRCDIR/config/$machine.h', and `object.h' as a link to
- `SRCDIR/config/$obj_format.h'.
- The tempting value `.' for DEST is invalid: it makes it impossible
- for `config.status' to guess the links to establish.
- One can then run:
- ./config.status host.h object.h
- to create the links.
- File: autoconf.info, Node: Subdirectories, Next: Default Prefix, Prev: Configuration Links, Up: Setup
- 4.12 Configuring Other Packages in Subdirectories
- =================================================
- In most situations, calling `AC_OUTPUT' is sufficient to produce
- makefiles in subdirectories. However, `configure' scripts that control
- more than one independent package can use `AC_CONFIG_SUBDIRS' to run
- `configure' scripts for other packages in subdirectories.
- -- Macro: AC_CONFIG_SUBDIRS (DIR ...)
- Make `AC_OUTPUT' run `configure' in each subdirectory DIR in the
- given blank-or-newline-separated list. Each DIR should be a
- literal, i.e., please do not use:
- if test "x$package_foo_enabled" = xyes; then
- my_subdirs="$my_subdirs foo"
- fi
- AC_CONFIG_SUBDIRS([$my_subdirs])
- because this prevents `./configure --help=recursive' from
- displaying the options of the package `foo'. Instead, you should
- write:
- if test "x$package_foo_enabled" = xyes; then
- AC_CONFIG_SUBDIRS([foo])
- fi
- If a given DIR is not found at `configure' run time, a warning is
- reported; if the subdirectory is optional, write:
- if test -d "$srcdir/foo"; then
- AC_CONFIG_SUBDIRS([foo])
- fi
- If a given DIR contains `configure.gnu', it is run instead of
- `configure'. This is for packages that might use a non-Autoconf
- script `Configure', which can't be called through a wrapper
- `configure' since it would be the same file on case-insensitive
- file systems. Likewise, if a DIR contains `configure.in' but no
- `configure', the Cygnus `configure' script found by
- `AC_CONFIG_AUX_DIR' is used.
- The subdirectory `configure' scripts are given the same command
- line options that were given to this `configure' script, with minor
- changes if needed, which include:
- - adjusting a relative name for the cache file;
- - adjusting a relative name for the source directory;
- - propagating the current value of `$prefix', including if it
- was defaulted, and if the default values of the top level and
- of the subdirectory `configure' differ.
- This macro also sets the output variable `subdirs' to the list of
- directories `DIR ...'. Make rules can use this variable to
- determine which subdirectories to recurse into.
- This macro may be called multiple times.
- File: autoconf.info, Node: Default Prefix, Prev: Subdirectories, Up: Setup
- 4.13 Default Prefix
- ===================
- By default, `configure' sets the prefix for files it installs to
- `/usr/local'. The user of `configure' can select a different prefix
- using the `--prefix' and `--exec-prefix' options. There are two ways
- to change the default: when creating `configure', and when running it.
- Some software packages might want to install in a directory other
- than `/usr/local' by default. To accomplish that, use the
- `AC_PREFIX_DEFAULT' macro.
- -- Macro: AC_PREFIX_DEFAULT (PREFIX)
- Set the default installation prefix to PREFIX instead of
- `/usr/local'.
- It may be convenient for users to have `configure' guess the
- installation prefix from the location of a related program that they
- have already installed. If you wish to do that, you can call
- `AC_PREFIX_PROGRAM'.
- -- Macro: AC_PREFIX_PROGRAM (PROGRAM)
- If the user did not specify an installation prefix (using the
- `--prefix' option), guess a value for it by looking for PROGRAM in
- `PATH', the way the shell does. If PROGRAM is found, set the
- prefix to the parent of the directory containing PROGRAM, else
- default the prefix as described above (`/usr/local' or
- `AC_PREFIX_DEFAULT'). For example, if PROGRAM is `gcc' and the
- `PATH' contains `/usr/local/gnu/bin/gcc', set the prefix to
- `/usr/local/gnu'.
- File: autoconf.info, Node: Existing Tests, Next: Writing Tests, Prev: Setup, Up: Top
- 5 Existing Tests
- ****************
- These macros test for particular system features that packages might
- need or want to use. If you need to test for a kind of feature that
- none of these macros check for, you can probably do it by calling
- primitive test macros with appropriate arguments (*note Writing
- Tests::).
- These tests print messages telling the user which feature they're
- checking for, and what they find. They cache their results for future
- `configure' runs (*note Caching Results::).
- Some of these macros set output variables. *Note Makefile
- Substitutions::, for how to get their values. The phrase "define NAME"
- is used below as a shorthand to mean "define the C preprocessor symbol
- NAME to the value 1". *Note Defining Symbols::, for how to get those
- symbol definitions into your program.
- * Menu:
- * Common Behavior:: Macros' standard schemes
- * Alternative Programs:: Selecting between alternative programs
- * Files:: Checking for the existence of files
- * Libraries:: Library archives that might be missing
- * Library Functions:: C library functions that might be missing
- * Header Files:: Header files that might be missing
- * Declarations:: Declarations that may be missing
- * Structures:: Structures or members that might be missing
- * Types:: Types that might be missing
- * Compilers and Preprocessors:: Checking for compiling programs
- * System Services:: Operating system services
- * Posix Variants:: Special kludges for specific Posix variants
- * Erlang Libraries:: Checking for the existence of Erlang libraries
- File: autoconf.info, Node: Common Behavior, Next: Alternative Programs, Up: Existing Tests
- 5.1 Common Behavior
- ===================
- Much effort has been expended to make Autoconf easy to learn. The most
- obvious way to reach this goal is simply to enforce standard interfaces
- and behaviors, avoiding exceptions as much as possible. Because of
- history and inertia, unfortunately, there are still too many exceptions
- in Autoconf; nevertheless, this section describes some of the common
- rules.
- * Menu:
- * Standard Symbols:: Symbols defined by the macros
- * Default Includes:: Includes used by the generic macros
- File: autoconf.info, Node: Standard Symbols, Next: Default Includes, Up: Common Behavior
- 5.1.1 Standard Symbols
- ----------------------
- All the generic macros that `AC_DEFINE' a symbol as a result of their
- test transform their ARGUMENT values to a standard alphabet. First,
- ARGUMENT is converted to upper case and any asterisks (`*') are each
- converted to `P'. Any remaining characters that are not alphanumeric
- are converted to underscores.
- For instance,
- AC_CHECK_TYPES([struct $Expensive*])
- defines the symbol `HAVE_STRUCT__EXPENSIVEP' if the check succeeds.
- File: autoconf.info, Node: Default Includes, Prev: Standard Symbols, Up: Common Behavior
- 5.1.2 Default Includes
- ----------------------
- Several tests depend upon a set of header files. Since these headers
- are not universally available, tests actually have to provide a set of
- protected includes, such as:
- #ifdef TIME_WITH_SYS_TIME
- # include <sys/time.h>
- # include <time.h>
- #else
- # ifdef HAVE_SYS_TIME_H
- # include <sys/time.h>
- # else
- # include <time.h>
- # endif
- #endif
- Unless you know exactly what you are doing, you should avoid using
- unconditional includes, and check the existence of the headers you
- include beforehand (*note Header Files::).
- Most generic macros use the following macro to provide the default
- set of includes:
- -- Macro: AC_INCLUDES_DEFAULT ([INCLUDE-DIRECTIVES])
- Expand to INCLUDE-DIRECTIVES if defined, otherwise to:
- #include <stdio.h>
- #ifdef HAVE_SYS_TYPES_H
- # include <sys/types.h>
- #endif
- #ifdef HAVE_SYS_STAT_H
- # include <sys/stat.h>
- #endif
- #ifdef STDC_HEADERS
- # include <stdlib.h>
- # include <stddef.h>
- #else
- # ifdef HAVE_STDLIB_H
- # include <stdlib.h>
- # endif
- #endif
- #ifdef HAVE_STRING_H
- # if !defined STDC_HEADERS && defined HAVE_MEMORY_H
- # include <memory.h>
- # endif
- # include <string.h>
- #endif
- #ifdef HAVE_STRINGS_H
- # include <strings.h>
- #endif
- #ifdef HAVE_INTTYPES_H
- # include <inttypes.h>
- #endif
- #ifdef HAVE_STDINT_H
- # include <stdint.h>
- #endif
- #ifdef HAVE_UNISTD_H
- # include <unistd.h>
- #endif
- If the default includes are used, then check for the presence of
- these headers and their compatibility, i.e., you don't need to run
- `AC_HEADER_STDC', nor check for `stdlib.h' etc.
- These headers are checked for in the same order as they are
- included. For instance, on some systems `string.h' and
- `strings.h' both exist, but conflict. Then `HAVE_STRING_H' is
- defined, not `HAVE_STRINGS_H'.
- File: autoconf.info, Node: Alternative Programs, Next: Files, Prev: Common Behavior, Up: Existing Tests
- 5.2 Alternative Programs
- ========================
- These macros check for the presence or behavior of particular programs.
- They are used to choose between several alternative programs and to
- decide what to do once one has been chosen. If there is no macro
- specifically defined to check for a program you need, and you don't need
- to check for any special properties of it, then you can use one of the
- general program-check macros.
- * Menu:
- * Particular Programs:: Special handling to find certain programs
- * Generic Programs:: How to find other programs
- File: autoconf.info, Node: Particular Programs, Next: Generic Programs, Up: Alternative Programs
- 5.2.1 Particular Program Checks
- -------------------------------
- These macros check for particular programs--whether they exist, and in
- some cases whether they support certain features.
- -- Macro: AC_PROG_AWK
- Check for `gawk', `mawk', `nawk', and `awk', in that order, and
- set output variable `AWK' to the first one that is found. It
- tries `gawk' first because that is reported to be the best
- implementation. The result can be overridden by setting the
- variable `AWK' or the cache variable `ac_cv_prog_AWK'.
- Using this macro is sufficient to avoid the pitfalls of traditional
- `awk' (*note Limitations of Usual Tools: awk.).
- -- Macro: AC_PROG_GREP
- Look for the best available `grep' or `ggrep' that accepts the
- longest input lines possible, and that supports multiple `-e'
- options. Set the output variable `GREP' to whatever is chosen.
- *Note Limitations of Usual Tools: grep, for more information about
- portability problems with the `grep' command family. The result
- can be overridden by setting the `GREP' variable and is cached in
- the `ac_cv_path_GREP' variable.
- -- Macro: AC_PROG_EGREP
- Check whether `$GREP -E' works, or else look for the best available
- `egrep' or `gegrep' that accepts the longest input lines possible.
- Set the output variable `EGREP' to whatever is chosen. The result
- can be overridden by setting the `EGREP' variable and is cached in
- the `ac_cv_path_EGREP' variable.
- -- Macro: AC_PROG_FGREP
- Check whether `$GREP -F' works, or else look for the best available
- `fgrep' or `gfgrep' that accepts the longest input lines possible.
- Set the output variable `FGREP' to whatever is chosen. The result
- can be overridden by setting the `FGREP' variable and is cached in
- the `ac_cv_path_FGREP' variable.
- -- Macro: AC_PROG_INSTALL
- Set output variable `INSTALL' to the name of a BSD-compatible
- `install' program, if one is found in the current `PATH'.
- Otherwise, set `INSTALL' to `DIR/install-sh -c', checking the
- directories specified to `AC_CONFIG_AUX_DIR' (or its default
- directories) to determine DIR (*note Output::). Also set the
- variables `INSTALL_PROGRAM' and `INSTALL_SCRIPT' to `${INSTALL}'
- and `INSTALL_DATA' to `${INSTALL} -m 644'.
- `@INSTALL@' is special, as its value may vary for different
- configuration files.
- This macro screens out various instances of `install' known not to
- work. It prefers to find a C program rather than a shell script,
- for speed. Instead of `install-sh', it can also use `install.sh',
- but that name is obsolete because some `make' programs have a rule
- that creates `install' from it if there is no makefile. Further,
- this macro requires `install' to be able to install multiple files
- into a target directory in a single invocation.
- Autoconf comes with a copy of `install-sh' that you can use. If
- you use `AC_PROG_INSTALL', you must include either `install-sh' or
- `install.sh' in your distribution; otherwise `configure' produces
- an error message saying it can't find them--even if the system
- you're on has a good `install' program. This check is a safety
- measure to prevent you from accidentally leaving that file out,
- which would prevent your package from installing on systems that
- don't have a BSD-compatible `install' program.
- If you need to use your own installation program because it has
- features not found in standard `install' programs, there is no
- reason to use `AC_PROG_INSTALL'; just put the file name of your
- program into your `Makefile.in' files.
- The result of the test can be overridden by setting the variable
- `INSTALL' or the cache variable `ac_cv_path_install'.
- -- Macro: AC_PROG_MKDIR_P
- Set output variable `MKDIR_P' to a program that ensures that for
- each argument, a directory named by this argument exists, creating
- it and its parent directories if needed, and without race
- conditions when two instances of the program attempt to make the
- same directory at nearly the same time.
- This macro uses the `mkdir -p' command if possible. Otherwise, it
- falls back on invoking `install-sh' with the `-d' option, so your
- package should contain `install-sh' as described under
- `AC_PROG_INSTALL'. An `install-sh' file that predates Autoconf
- 2.60 or Automake 1.10 is vulnerable to race conditions, so if you
- want to support parallel installs from different packages into the
- same directory you need to make sure you have an up-to-date
- `install-sh'. In particular, be careful about using `autoreconf
- -if' if your Automake predates Automake 1.10.
- This macro is related to the `AS_MKDIR_P' macro (*note Programming
- in M4sh::), but it sets an output variable intended for use in
- other files, whereas `AS_MKDIR_P' is intended for use in scripts
- like `configure'. Also, `AS_MKDIR_P' does not accept options, but
- `MKDIR_P' supports the `-m' option, e.g., a makefile might invoke
- `$(MKDIR_P) -m 0 dir' to create an inaccessible directory, and
- conversely a makefile should use `$(MKDIR_P) -- $(FOO)' if FOO
- might yield a value that begins with `-'. Finally, `AS_MKDIR_P'
- does not check for race condition vulnerability, whereas
- `AC_PROG_MKDIR_P' does.
- `@MKDIR_P@' is special, as its value may vary for different
- configuration files.
- The result of the test can be overridden by setting the variable
- `MKDIR_P' or the cache variable `ac_cv_path_mkdir'.
- -- Macro: AC_PROG_LEX
- If `flex' is found, set output variable `LEX' to `flex' and
- `LEXLIB' to `-lfl', if that library is in a standard place.
- Otherwise set `LEX' to `lex' and `LEXLIB' to `-ll', if found. If
- neither variant is available, set `LEX' to `:'; for packages that
- ship the generated `file.yy.c' alongside the source `file.l', this
- default allows users without a lexer generator to still build the
- package even if the timestamp for `file.l' is inadvertently
- changed.
- Define `YYTEXT_POINTER' if `yytext' defaults to `char *' instead
- of to `char []'. Also set output variable `LEX_OUTPUT_ROOT' to
- the base of the file name that the lexer generates; usually
- `lex.yy', but sometimes something else. These results vary
- according to whether `lex' or `flex' is being used.
- You are encouraged to use Flex in your sources, since it is both
- more pleasant to use than plain Lex and the C source it produces
- is portable. In order to ensure portability, however, you must
- either provide a function `yywrap' or, if you don't use it (e.g.,
- your scanner has no `#include'-like feature), simply include a
- `%noyywrap' statement in the scanner's source. Once this done,
- the scanner is portable (unless _you_ felt free to use nonportable
- constructs) and does not depend on any library. In this case, and
- in this case only, it is suggested that you use this Autoconf
- snippet:
- AC_PROG_LEX
- if test "x$LEX" != xflex; then
- LEX="$SHELL $missing_dir/missing flex"
- AC_SUBST([LEX_OUTPUT_ROOT], [lex.yy])
- AC_SUBST([LEXLIB], [''])
- fi
- The shell script `missing' can be found in the Automake
- distribution.
- Remember that the user may have supplied an alternate location in
- `LEX', so if Flex is required, it is better to check that the user
- provided something sufficient by parsing the output of `$LEX
- --version' than by simply relying on `test "x$LEX" = xflex'.
- To ensure backward compatibility, Automake's `AM_PROG_LEX' invokes
- (indirectly) this macro twice, which causes an annoying but benign
- "`AC_PROG_LEX' invoked multiple times" warning. Future versions
- of Automake will fix this issue; meanwhile, just ignore this
- message.
- As part of running the test, this macro may delete any file in the
- configuration directory named `lex.yy.c' or `lexyy.c'.
- The result of this test can be influenced by setting the variable
- `LEX' or the cache variable `ac_cv_prog_LEX'.
- -- Macro: AC_PROG_LN_S
- If `ln -s' works on the current file system (the operating system
- and file system support symbolic links), set the output variable
- `LN_S' to `ln -s'; otherwise, if `ln' works, set `LN_S' to `ln',
- and otherwise set it to `cp -pR'.
- If you make a link in a directory other than the current
- directory, its meaning depends on whether `ln' or `ln -s' is used.
- To safely create links using `$(LN_S)', either find out which form
- is used and adjust the arguments, or always invoke `ln' in the
- directory where the link is to be created.
- In other words, it does not work to do:
- $(LN_S) foo /x/bar
- Instead, do:
- (cd /x && $(LN_S) foo bar)
- -- Macro: AC_PROG_RANLIB
- Set output variable `RANLIB' to `ranlib' if `ranlib' is found, and
- otherwise to `:' (do nothing).
- -- Macro: AC_PROG_SED
- Set output variable `SED' to a Sed implementation that conforms to
- Posix and does not have arbitrary length limits. Report an error
- if no acceptable Sed is found. *Note Limitations of Usual Tools:
- sed, for more information about portability problems with Sed.
- The result of this test can be overridden by setting the `SED'
- variable and is cached in the `ac_cv_path_SED' variable.
- -- Macro: AC_PROG_YACC
- If `bison' is found, set output variable `YACC' to `bison -y'.
- Otherwise, if `byacc' is found, set `YACC' to `byacc'. Otherwise
- set `YACC' to `yacc'. The result of this test can be influenced
- by setting the variable `YACC' or the cache variable
- `ac_cv_prog_YACC'.
- File: autoconf.info, Node: Generic Programs, Prev: Particular Programs, Up: Alternative Programs
- 5.2.2 Generic Program and File Checks
- -------------------------------------
- These macros are used to find programs not covered by the "particular"
- test macros. If you need to check the behavior of a program as well as
- find out whether it is present, you have to write your own test for it
- (*note Writing Tests::). By default, these macros use the environment
- variable `PATH'. If you need to check for a program that might not be
- in the user's `PATH', you can pass a modified path to use instead, like
- this:
- AC_PATH_PROG([INETD], [inetd], [/usr/libexec/inetd],
- [$PATH$PATH_SEPARATOR/usr/libexec$PATH_SEPARATOR]dnl
- [/usr/sbin$PATH_SEPARATOR/usr/etc$PATH_SEPARATOR/etc])
- You are strongly encouraged to declare the VARIABLE passed to
- `AC_CHECK_PROG' etc. as precious. *Note Setting Output Variables::,
- `AC_ARG_VAR', for more details.
- -- Macro: AC_CHECK_PROG (VARIABLE, PROG-TO-CHECK-FOR, VALUE-IF-FOUND,
- [VALUE-IF-NOT-FOUND], [PATH = `$PATH'], [REJECT])
- Check whether program PROG-TO-CHECK-FOR exists in PATH. If it is
- found, set VARIABLE to VALUE-IF-FOUND, otherwise to
- VALUE-IF-NOT-FOUND, if given. Always pass over REJECT (an
- absolute file name) even if it is the first found in the search
- path; in that case, set VARIABLE using the absolute file name of
- the PROG-TO-CHECK-FOR found that is not REJECT. If VARIABLE was
- already set, do nothing. Calls `AC_SUBST' for VARIABLE. The
- result of this test can be overridden by setting the VARIABLE
- variable or the cache variable `ac_cv_prog_VARIABLE'.
- -- Macro: AC_CHECK_PROGS (VARIABLE, PROGS-TO-CHECK-FOR,
- [VALUE-IF-NOT-FOUND], [PATH = `$PATH'])
- Check for each program in the blank-separated list
- PROGS-TO-CHECK-FOR existing in the PATH. If one is found, set
- VARIABLE to the name of that program. Otherwise, continue
- checking the next program in the list. If none of the programs in
- the list are found, set VARIABLE to VALUE-IF-NOT-FOUND; if
- VALUE-IF-NOT-FOUND is not specified, the value of VARIABLE is not
- changed. Calls `AC_SUBST' for VARIABLE. The result of this test
- can be overridden by setting the VARIABLE variable or the cache
- variable `ac_cv_prog_VARIABLE'.
- -- Macro: AC_CHECK_TARGET_TOOL (VARIABLE, PROG-TO-CHECK-FOR,
- [VALUE-IF-NOT-FOUND], [PATH = `$PATH'])
- Like `AC_CHECK_PROG', but first looks for PROG-TO-CHECK-FOR with a
- prefix of the target type as determined by `AC_CANONICAL_TARGET',
- followed by a dash (*note Canonicalizing::). If the tool cannot
- be found with a prefix, and if the build and target types are
- equal, then it is also searched for without a prefix.
- As noted in *note Specifying Target Triplets::, the target is
- rarely specified, because most of the time it is the same as the
- host: it is the type of system for which any compiler tool in the
- package produces code. What this macro looks for is, for example,
- _a tool (assembler, linker, etc.) that the compiler driver (`gcc'
- for the GNU C Compiler) uses to produce objects, archives or
- executables_.
- -- Macro: AC_CHECK_TOOL (VARIABLE, PROG-TO-CHECK-FOR,
- [VALUE-IF-NOT-FOUND], [PATH = `$PATH'])
- Like `AC_CHECK_PROG', but first looks for PROG-TO-CHECK-FOR with a
- prefix of the host type as specified by `--host', followed by a
- dash. For example, if the user runs `configure --build=x86_64-gnu
- --host=i386-gnu', then this call:
- AC_CHECK_TOOL([RANLIB], [ranlib], [:])
- sets `RANLIB' to `i386-gnu-ranlib' if that program exists in PATH,
- or otherwise to `ranlib' if that program exists in PATH, or to `:'
- if neither program exists.
- When cross-compiling, this macro will issue a warning if no program
- prefixed with the host type could be found. For more information,
- see *note Specifying Target Triplets::.
- -- Macro: AC_CHECK_TARGET_TOOLS (VARIABLE, PROGS-TO-CHECK-FOR,
- [VALUE-IF-NOT-FOUND], [PATH = `$PATH'])
- Like `AC_CHECK_TARGET_TOOL', each of the tools in the list
- PROGS-TO-CHECK-FOR are checked with a prefix of the target type as
- determined by `AC_CANONICAL_TARGET', followed by a dash (*note
- Canonicalizing::). If none of the tools can be found with a
- prefix, and if the build and target types are equal, then the
- first one without a prefix is used. If a tool is found, set
- VARIABLE to the name of that program. If none of the tools in the
- list are found, set VARIABLE to VALUE-IF-NOT-FOUND; if
- VALUE-IF-NOT-FOUND is not specified, the value of VARIABLE is not
- changed. Calls `AC_SUBST' for VARIABLE.
- -- Macro: AC_CHECK_TOOLS (VARIABLE, PROGS-TO-CHECK-FOR,
- [VALUE-IF-NOT-FOUND], [PATH = `$PATH'])
- Like `AC_CHECK_TOOL', each of the tools in the list
- PROGS-TO-CHECK-FOR are checked with a prefix of the host type as
- determined by `AC_CANONICAL_HOST', followed by a dash (*note
- Canonicalizing::). If none of the tools can be found with a
- prefix, then the first one without a prefix is used. If a tool is
- found, set VARIABLE to the name of that program. If none of the
- tools in the list are found, set VARIABLE to VALUE-IF-NOT-FOUND; if
- VALUE-IF-NOT-FOUND is not specified, the value of VARIABLE is not
- changed. Calls `AC_SUBST' for VARIABLE.
- When cross-compiling, this macro will issue a warning if no program
- prefixed with the host type could be found. For more information,
- see *note Specifying Target Triplets::.
- -- Macro: AC_PATH_PROG (VARIABLE, PROG-TO-CHECK-FOR,
- [VALUE-IF-NOT-FOUND], [PATH = `$PATH'])
- Like `AC_CHECK_PROG', but set VARIABLE to the absolute name of
- PROG-TO-CHECK-FOR if found. The result of this test can be
- overridden by setting the VARIABLE variable. A positive result of
- this test is cached in the `ac_cv_path_VARIABLE' variable.
- -- Macro: AC_PATH_PROGS (VARIABLE, PROGS-TO-CHECK-FOR,
- [VALUE-IF-NOT-FOUND], [PATH = `$PATH'])
- Like `AC_CHECK_PROGS', but if any of PROGS-TO-CHECK-FOR are found,
- set VARIABLE to the absolute name of the program found. The
- result of this test can be overridden by setting the VARIABLE
- variable. A positive result of this test is cached in the
- `ac_cv_path_VARIABLE' variable.
- -- Macro: AC_PATH_PROGS_FEATURE_CHECK (VARIABLE, PROGS-TO-CHECK-FOR,
- FEATURE-TEST, [ACTION-IF-NOT-FOUND], [PATH = `$PATH'])
- This macro was introduced in Autoconf 2.62. If VARIABLE is not
- empty, then set the cache variable `ac_cv_path_VARIABLE' to its
- value. Otherwise, check for each program in the blank-separated
- list PROGS-TO-CHECK-FOR existing in PATH. For each program found,
- execute FEATURE-TEST with `ac_path_VARIABLE' set to the absolute
- name of the candidate program. If no invocation of FEATURE-TEST
- sets the shell variable `ac_cv_path_VARIABLE', then
- ACTION-IF-NOT-FOUND is executed. FEATURE-TEST will be run even
- when `ac_cv_path_VARIABLE' is set, to provide the ability to
- choose a better candidate found later in PATH; to accept the
- current setting and bypass all further checks, FEATURE-TEST can
- execute `ac_path_VARIABLE_found=:'.
- Note that this macro has some subtle differences from
- `AC_CHECK_PROGS'. It is designed to be run inside `AC_CACHE_VAL',
- therefore, it should have no side effects. In particular,
- VARIABLE is not set to the final value of `ac_cv_path_VARIABLE',
- nor is `AC_SUBST' automatically run. Also, on failure, any action
- can be performed, whereas `AC_CHECK_PROGS' only performs
- `VARIABLE=VALUE-IF-NOT-FOUND'.
- Here is an example, similar to what Autoconf uses in its own
- configure script. It will search for an implementation of `m4'
- that supports the `indir' builtin, even if it goes by the name
- `gm4' or is not the first implementation on `PATH'.
- AC_CACHE_CHECK([for m4 that supports indir], [ac_cv_path_M4],
- [AC_PATH_PROGS_FEATURE_CHECK([M4], [m4 gm4],
- [[m4out=`echo 'changequote([,])indir([divnum])' | $ac_path_M4`
- test "x$m4out" = x0 \
- && ac_cv_path_M4=$ac_path_M4 ac_path_M4_found=:]],
- [AC_MSG_ERROR([could not find m4 that supports indir])])])
- AC_SUBST([M4], [$ac_cv_path_M4])
- -- Macro: AC_PATH_TARGET_TOOL (VARIABLE, PROG-TO-CHECK-FOR,
- [VALUE-IF-NOT-FOUND], [PATH = `$PATH'])
- Like `AC_CHECK_TARGET_TOOL', but set VARIABLE to the absolute name
- of the program if it is found.
- -- Macro: AC_PATH_TOOL (VARIABLE, PROG-TO-CHECK-FOR,
- [VALUE-IF-NOT-FOUND], [PATH = `$PATH'])
- Like `AC_CHECK_TOOL', but set VARIABLE to the absolute name of the
- program if it is found.
- When cross-compiling, this macro will issue a warning if no program
- prefixed with the host type could be found. For more information,
- see *note Specifying Target Triplets::.
- File: autoconf.info, Node: Files, Next: Libraries, Prev: Alternative Programs, Up: Existing Tests
- 5.3 Files
- =========
- You might also need to check for the existence of files. Before using
- these macros, ask yourself whether a runtime test might not be a better
- solution. Be aware that, like most Autoconf macros, they test a feature
- of the host machine, and therefore, they die when cross-compiling.
- -- Macro: AC_CHECK_FILE (FILE, [ACTION-IF-FOUND],
- [ACTION-IF-NOT-FOUND])
- Check whether file FILE exists on the native system. If it is
- found, execute ACTION-IF-FOUND, otherwise do ACTION-IF-NOT-FOUND,
- if given. The result of this test is cached in the
- `ac_cv_file_FILE' variable, with characters not suitable for a
- variable name mapped to underscores.
- -- Macro: AC_CHECK_FILES (FILES, [ACTION-IF-FOUND],
- [ACTION-IF-NOT-FOUND])
- Executes `AC_CHECK_FILE' once for each file listed in FILES.
- Additionally, defines `HAVE_FILE' (*note Standard Symbols::) for
- each file found. The results of each test are cached in the
- `ac_cv_file_FILE' variable, with characters not suitable for a
- variable name mapped to underscores.
- File: autoconf.info, Node: Libraries, Next: Library Functions, Prev: Files, Up: Existing Tests
- 5.4 Library Files
- =================
- The following macros check for the presence of certain C, C++, Fortran,
- or Go library archive files.
- -- Macro: AC_CHECK_LIB (LIBRARY, FUNCTION, [ACTION-IF-FOUND],
- [ACTION-IF-NOT-FOUND], [OTHER-LIBRARIES])
- Test whether the library LIBRARY is available by trying to link a
- test program that calls function FUNCTION with the library.
- FUNCTION should be a function provided by the library. Use the
- base name of the library; e.g., to check for `-lmp', use `mp' as
- the LIBRARY argument.
- ACTION-IF-FOUND is a list of shell commands to run if the link
- with the library succeeds; ACTION-IF-NOT-FOUND is a list of shell
- commands to run if the link fails. If ACTION-IF-FOUND is not
- specified, the default action prepends `-lLIBRARY' to `LIBS' and
- defines `HAVE_LIBLIBRARY' (in all capitals). This macro is
- intended to support building `LIBS' in a right-to-left
- (least-dependent to most-dependent) fashion such that library
- dependencies are satisfied as a natural side effect of consecutive
- tests. Linkers are sensitive to library ordering so the order in
- which `LIBS' is generated is important to reliable detection of
- libraries.
- If linking with LIBRARY results in unresolved symbols that would
- be resolved by linking with additional libraries, give those
- libraries as the OTHER-LIBRARIES argument, separated by spaces:
- e.g., `-lXt -lX11'. Otherwise, this macro may fail to detect that
- LIBRARY is present, because linking the test program can fail with
- unresolved symbols. The OTHER-LIBRARIES argument should be
- limited to cases where it is desirable to test for one library in
- the presence of another that is not already in `LIBS'.
- `AC_CHECK_LIB' requires some care in usage, and should be avoided
- in some common cases. Many standard functions like `gethostbyname'
- appear in the standard C library on some hosts, and in special
- libraries like `nsl' on other hosts. On some hosts the special
- libraries contain variant implementations that you may not want to
- use. These days it is normally better to use
- `AC_SEARCH_LIBS([gethostbyname], [nsl])' instead of
- `AC_CHECK_LIB([nsl], [gethostbyname])'.
- The result of this test is cached in the
- `ac_cv_lib_LIBRARY_FUNCTION' variable.
- -- Macro: AC_SEARCH_LIBS (FUNCTION, SEARCH-LIBS, [ACTION-IF-FOUND],
- [ACTION-IF-NOT-FOUND], [OTHER-LIBRARIES])
- Search for a library defining FUNCTION if it's not already
- available. This equates to calling
- `AC_LINK_IFELSE([AC_LANG_CALL([], [FUNCTION])])' first with no
- libraries, then for each library listed in SEARCH-LIBS.
- Prepend `-lLIBRARY' to `LIBS' for the first library found to
- contain FUNCTION, and run ACTION-IF-FOUND. If the function is not
- found, run ACTION-IF-NOT-FOUND.
- If linking with LIBRARY results in unresolved symbols that would
- be resolved by linking with additional libraries, give those
- libraries as the OTHER-LIBRARIES argument, separated by spaces:
- e.g., `-lXt -lX11'. Otherwise, this macro fails to detect that
- FUNCTION is present, because linking the test program always fails
- with unresolved symbols.
- The result of this test is cached in the `ac_cv_search_FUNCTION'
- variable as `none required' if FUNCTION is already available, as
- `no' if no library containing FUNCTION was found, otherwise as the
- `-lLIBRARY' option that needs to be prepended to `LIBS'.
- File: autoconf.info, Node: Library Functions, Next: Header Files, Prev: Libraries, Up: Existing Tests
- 5.5 Library Functions
- =====================
- The following macros check for particular C library functions. If
- there is no macro specifically defined to check for a function you need,
- and you don't need to check for any special properties of it, then you
- can use one of the general function-check macros.
- * Menu:
- * Function Portability:: Pitfalls with usual functions
- * Particular Functions:: Special handling to find certain functions
- * Generic Functions:: How to find other functions
- File: autoconf.info, Node: Function Portability, Next: Particular Functions, Up: Library Functions
- 5.5.1 Portability of C Functions
- --------------------------------
- Most usual functions can either be missing, or be buggy, or be limited
- on some architectures. This section tries to make an inventory of these
- portability issues. By definition, this list always requires
- additions. A much more complete list is maintained by the Gnulib
- project (*note Gnulib::), covering *note Current Posix Functions:
- (gnulib)Function Substitutes, *note Legacy Functions: (gnulib)Legacy
- Function Substitutes, and *note Glibc Functions: (gnulib)Glibc Function
- Substitutes. Please help us keep the gnulib list as complete as
- possible.
- `exit'
- On ancient hosts, `exit' returned `int'. This is because `exit'
- predates `void', and there was a long tradition of it returning
- `int'.
- On current hosts, the problem more likely is that `exit' is not
- declared, due to C++ problems of some sort or another. For this
- reason we suggest that test programs not invoke `exit', but return
- from `main' instead.
- `free'
- The C standard says a call `free (NULL)' does nothing, but some
- old systems don't support this (e.g., NextStep).
- `isinf'
- `isnan'
- The C99 standard says that `isinf' and `isnan' are macros. On
- some systems just macros are available (e.g., HP-UX and Solaris
- 10), on some systems both macros and functions (e.g., glibc
- 2.3.2), and on some systems only functions (e.g., IRIX 6 and
- Solaris 9). In some cases these functions are declared in
- nonstandard headers like `<sunmath.h>' and defined in non-default
- libraries like `-lm' or `-lsunmath'.
- The C99 `isinf' and `isnan' macros work correctly with `long
- double' arguments, but pre-C99 systems that use functions
- typically assume `double' arguments. On such a system, `isinf'
- incorrectly returns true for a finite `long double' argument that
- is outside the range of `double'.
- The best workaround for these issues is to use gnulib modules
- `isinf' and `isnan' (*note Gnulib::). But a lighter weight
- solution involves code like the following.
- #include <math.h>
- #ifndef isnan
- # define isnan(x) \
- (sizeof (x) == sizeof (long double) ? isnan_ld (x) \
- : sizeof (x) == sizeof (double) ? isnan_d (x) \
- : isnan_f (x))
- static inline int isnan_f (float x) { return x != x; }
- static inline int isnan_d (double x) { return x != x; }
- static inline int isnan_ld (long double x) { return x != x; }
- #endif
- #ifndef isinf
- # define isinf(x) \
- (sizeof (x) == sizeof (long double) ? isinf_ld (x) \
- : sizeof (x) == sizeof (double) ? isinf_d (x) \
- : isinf_f (x))
- static inline int isinf_f (float x)
- { return !isnan (x) && isnan (x - x); }
- static inline int isinf_d (double x)
- { return !isnan (x) && isnan (x - x); }
- static inline int isinf_ld (long double x)
- { return !isnan (x) && isnan (x - x); }
- #endif
- Use `AC_C_INLINE' (*note C Compiler::) so that this code works on
- compilers that lack the `inline' keyword. Some optimizing
- compilers mishandle these definitions, but systems with that bug
- typically have many other floating point corner-case compliance
- problems anyway, so it's probably not worth worrying about.
- `malloc'
- The C standard says a call `malloc (0)' is implementation
- dependent. It can return either `NULL' or a new non-null pointer.
- The latter is more common (e.g., the GNU C Library) but is by no
- means universal. `AC_FUNC_MALLOC' can be used to insist on
- non-`NULL' (*note Particular Functions::).
- `putenv'
- Posix prefers `setenv' to `putenv'; among other things, `putenv'
- is not required of all Posix implementations, but `setenv' is.
- Posix specifies that `putenv' puts the given string directly in
- `environ', but some systems make a copy of it instead (e.g., glibc
- 2.0, or BSD). And when a copy is made, `unsetenv' might not free
- it, causing a memory leak (e.g., FreeBSD 4).
- On some systems `putenv ("FOO")' removes `FOO' from the
- environment, but this is not standard usage and it dumps core on
- some systems (e.g., AIX).
- On MinGW, a call `putenv ("FOO=")' removes `FOO' from the
- environment, rather than inserting it with an empty value.
- `realloc'
- The C standard says a call `realloc (NULL, size)' is equivalent to
- `malloc (size)', but some old systems don't support this (e.g.,
- NextStep).
- `signal' handler
- Normally `signal' takes a handler function with a return type of
- `void', but some old systems required `int' instead. Any actual
- `int' value returned is not used; this is only a difference in the
- function prototype demanded.
- All systems we know of in current use return `void'. The `int'
- was to support K&R C, where of course `void' is not available.
- The obsolete macro `AC_TYPE_SIGNAL' (*note AC_TYPE_SIGNAL::) can
- be used to establish the correct type in all cases.
- In most cases, it is more robust to use `sigaction' when it is
- available, rather than `signal'.
- `snprintf'
- The C99 standard says that if the output array isn't big enough
- and if no other errors occur, `snprintf' and `vsnprintf' truncate
- the output and return the number of bytes that ought to have been
- produced. Some older systems return the truncated length (e.g.,
- GNU C Library 2.0.x or IRIX 6.5), some a negative value (e.g.,
- earlier GNU C Library versions), and some the buffer length
- without truncation (e.g., 32-bit Solaris 7). Also, some buggy
- older systems ignore the length and overrun the buffer (e.g.,
- 64-bit Solaris 7).
- `sprintf'
- The C standard says `sprintf' and `vsprintf' return the number of
- bytes written. On some ancient systems (SunOS 4 for instance)
- they return the buffer pointer instead, but these no longer need
- to be worried about.
- `sscanf'
- On various old systems, e.g., HP-UX 9, `sscanf' requires that its
- input string be writable (though it doesn't actually change it).
- This can be a problem when using `gcc' since it normally puts
- constant strings in read-only memory (*note Incompatibilities of
- GCC: (gcc)Incompatibilities.). Apparently in some cases even
- having format strings read-only can be a problem.
- `strerror_r'
- Posix specifies that `strerror_r' returns an `int', but many
- systems (e.g., GNU C Library version 2.2.4) provide a different
- version returning a `char *'. `AC_FUNC_STRERROR_R' can detect
- which is in use (*note Particular Functions::).
- `strnlen'
- AIX 4.3 provides a broken version which produces the following
- results:
- strnlen ("foobar", 0) = 0
- strnlen ("foobar", 1) = 3
- strnlen ("foobar", 2) = 2
- strnlen ("foobar", 3) = 1
- strnlen ("foobar", 4) = 0
- strnlen ("foobar", 5) = 6
- strnlen ("foobar", 6) = 6
- strnlen ("foobar", 7) = 6
- strnlen ("foobar", 8) = 6
- strnlen ("foobar", 9) = 6
- `sysconf'
- `_SC_PAGESIZE' is standard, but some older systems (e.g., HP-UX 9)
- have `_SC_PAGE_SIZE' instead. This can be tested with `#ifdef'.
- `unlink'
- The Posix spec says that `unlink' causes the given file to be
- removed only after there are no more open file handles for it.
- Some non-Posix hosts have trouble with this requirement, though,
- and some DOS variants even corrupt the file system.
- `unsetenv'
- On MinGW, `unsetenv' is not available, but a variable `FOO' can be
- removed with a call `putenv ("FOO=")', as described under `putenv'
- above.
- `va_copy'
- The C99 standard provides `va_copy' for copying `va_list'
- variables. It may be available in older environments too, though
- possibly as `__va_copy' (e.g., `gcc' in strict pre-C99 mode).
- These can be tested with `#ifdef'. A fallback to `memcpy (&dst,
- &src, sizeof (va_list))' gives maximum portability.
- `va_list'
- `va_list' is not necessarily just a pointer. It can be a `struct'
- (e.g., `gcc' on Alpha), which means `NULL' is not portable. Or it
- can be an array (e.g., `gcc' in some PowerPC configurations),
- which means as a function parameter it can be effectively
- call-by-reference and library routines might modify the value back
- in the caller (e.g., `vsnprintf' in the GNU C Library 2.1).
- Signed `>>'
- Normally the C `>>' right shift of a signed type replicates the
- high bit, giving a so-called "arithmetic" shift. But care should
- be taken since Standard C doesn't require that behavior. On those
- few processors without a native arithmetic shift (for instance Cray
- vector systems) zero bits may be shifted in, the same as a shift
- of an unsigned type.
- Integer `/'
- C divides signed integers by truncating their quotient toward zero,
- yielding the same result as Fortran. However, before C99 the
- standard allowed C implementations to take the floor or ceiling of
- the quotient in some cases. Hardly any implementations took
- advantage of this freedom, though, and it's probably not worth
- worrying about this issue nowadays.
- File: autoconf.info, Node: Particular Functions, Next: Generic Functions, Prev: Function Portability, Up: Library Functions
- 5.5.2 Particular Function Checks
- --------------------------------
- These macros check for particular C functions--whether they exist, and
- in some cases how they respond when given certain arguments.
- -- Macro: AC_FUNC_ALLOCA
- Check how to get `alloca'. Tries to get a builtin version by
- checking for `alloca.h' or the predefined C preprocessor macros
- `__GNUC__' and `_AIX'. If this macro finds `alloca.h', it defines
- `HAVE_ALLOCA_H'.
- If those attempts fail, it looks for the function in the standard C
- library. If any of those methods succeed, it defines
- `HAVE_ALLOCA'. Otherwise, it sets the output variable `ALLOCA' to
- `${LIBOBJDIR}alloca.o' and defines `C_ALLOCA' (so programs can
- periodically call `alloca (0)' to garbage collect). This variable
- is separate from `LIBOBJS' so multiple programs can share the
- value of `ALLOCA' without needing to create an actual library, in
- case only some of them use the code in `LIBOBJS'. The
- `${LIBOBJDIR}' prefix serves the same purpose as in `LIBOBJS'
- (*note AC_LIBOBJ vs LIBOBJS::).
- This macro does not try to get `alloca' from the System V R3
- `libPW' or the System V R4 `libucb' because those libraries
- contain some incompatible functions that cause trouble. Some
- versions do not even contain `alloca' or contain a buggy version.
- If you still want to use their `alloca', use `ar' to extract
- `alloca.o' from them instead of compiling `alloca.c'.
- Source files that use `alloca' should start with a piece of code
- like the following, to declare it properly.
- #ifdef STDC_HEADERS
- # include <stdlib.h>
- # include <stddef.h>
- #else
- # ifdef HAVE_STDLIB_H
- # include <stdlib.h>
- # endif
- #endif
- #ifdef HAVE_ALLOCA_H
- # include <alloca.h>
- #elif !defined alloca
- # ifdef __GNUC__
- # define alloca __builtin_alloca
- # elif defined _AIX
- # define alloca __alloca
- # elif defined _MSC_VER
- # include <malloc.h>
- # define alloca _alloca
- # elif !defined HAVE_ALLOCA
- # ifdef __cplusplus
- extern "C"
- # endif
- void *alloca (size_t);
- # endif
- #endif
- -- Macro: AC_FUNC_CHOWN
- If the `chown' function is available and works (in particular, it
- should accept `-1' for `uid' and `gid'), define `HAVE_CHOWN'. The
- result of this macro is cached in the `ac_cv_func_chown_works'
- variable.
- -- Macro: AC_FUNC_CLOSEDIR_VOID
- If the `closedir' function does not return a meaningful value,
- define `CLOSEDIR_VOID'. Otherwise, callers ought to check its
- return value for an error indicator.
- Currently this test is implemented by running a test program. When
- cross compiling the pessimistic assumption that `closedir' does not
- return a meaningful value is made.
- The result of this macro is cached in the
- `ac_cv_func_closedir_void' variable.
- This macro is obsolescent, as `closedir' returns a meaningful value
- on current systems. New programs need not use this macro.
- -- Macro: AC_FUNC_ERROR_AT_LINE
- If the `error_at_line' function is not found, require an
- `AC_LIBOBJ' replacement of `error'.
- The result of this macro is cached in the `ac_cv_lib_error_at_line'
- variable.
- The `AC_FUNC_ERROR_AT_LINE' macro is obsolescent. New programs
- should use Gnulib's `error' module. *Note Gnulib::.
- -- Macro: AC_FUNC_FNMATCH
- If the `fnmatch' function conforms to Posix, define
- `HAVE_FNMATCH'. Detect common implementation bugs, for example,
- the bugs in Solaris 2.4.
- Unlike the other specific `AC_FUNC' macros, `AC_FUNC_FNMATCH' does
- not replace a broken/missing `fnmatch'. This is for historical
- reasons. See `AC_REPLACE_FNMATCH' below.
- The result of this macro is cached in the
- `ac_cv_func_fnmatch_works' variable.
- This macro is obsolescent. New programs should use Gnulib's
- `fnmatch-posix' module. *Note Gnulib::.
- -- Macro: AC_FUNC_FNMATCH_GNU
- Behave like `AC_REPLACE_FNMATCH' (_replace_) but also test whether
- `fnmatch' supports GNU extensions. Detect common implementation
- bugs, for example, the bugs in the GNU C Library 2.1.
- The result of this macro is cached in the `ac_cv_func_fnmatch_gnu'
- variable.
- This macro is obsolescent. New programs should use Gnulib's
- `fnmatch-gnu' module. *Note Gnulib::.
- -- Macro: AC_FUNC_FORK
- This macro checks for the `fork' and `vfork' functions. If a
- working `fork' is found, define `HAVE_WORKING_FORK'. This macro
- checks whether `fork' is just a stub by trying to run it.
- If `vfork.h' is found, define `HAVE_VFORK_H'. If a working
- `vfork' is found, define `HAVE_WORKING_VFORK'. Otherwise, define
- `vfork' to be `fork' for backward compatibility with previous
- versions of `autoconf'. This macro checks for several known
- errors in implementations of `vfork' and considers the system to
- not have a working `vfork' if it detects any of them. It is not
- considered to be an implementation error if a child's invocation
- of `signal' modifies the parent's signal handler, since child
- processes rarely change their signal handlers.
- Since this macro defines `vfork' only for backward compatibility
- with previous versions of `autoconf' you're encouraged to define it
- yourself in new code:
- #ifndef HAVE_WORKING_VFORK
- # define vfork fork
- #endif
- The results of this macro are cached in the `ac_cv_func_fork_works'
- and `ac_cv_func_vfork_works' variables. In order to override the
- test, you also need to set the `ac_cv_func_fork' and
- `ac_cv_func_vfork' variables.
- -- Macro: AC_FUNC_FSEEKO
- If the `fseeko' function is available, define `HAVE_FSEEKO'.
- Define `_LARGEFILE_SOURCE' if necessary to make the prototype
- visible on some systems (e.g., glibc 2.2). Otherwise linkage
- problems may occur when compiling with `AC_SYS_LARGEFILE' on
- largefile-sensitive systems where `off_t' does not default to a
- 64bit entity. All systems with `fseeko' also supply `ftello'.
- -- Macro: AC_FUNC_GETGROUPS
- If the `getgroups' function is available and works (unlike on
- Ultrix 4.3, where `getgroups (0, 0)' always fails), define
- `HAVE_GETGROUPS'. Set `GETGROUPS_LIBS' to any libraries needed to
- get that function. This macro runs `AC_TYPE_GETGROUPS'.
- -- Macro: AC_FUNC_GETLOADAVG
- Check how to get the system load averages. To perform its tests
- properly, this macro needs the file `getloadavg.c'; therefore, be
- sure to set the `AC_LIBOBJ' replacement directory properly (see
- *note Generic Functions::, `AC_CONFIG_LIBOBJ_DIR').
- If the system has the `getloadavg' function, define
- `HAVE_GETLOADAVG', and set `GETLOADAVG_LIBS' to any libraries
- necessary to get that function. Also add `GETLOADAVG_LIBS' to
- `LIBS'. Otherwise, require an `AC_LIBOBJ' replacement for
- `getloadavg' with source code in `DIR/getloadavg.c', and possibly
- define several other C preprocessor macros and output variables:
- 1. Define `C_GETLOADAVG'.
- 2. Define `SVR4', `DGUX', `UMAX', or `UMAX4_3' if on those
- systems.
- 3. If `nlist.h' is found, define `HAVE_NLIST_H'.
- 4. If `struct nlist' has an `n_un.n_name' member, define
- `HAVE_STRUCT_NLIST_N_UN_N_NAME'. The obsolete symbol
- `NLIST_NAME_UNION' is still defined, but do not depend upon
- it.
- 5. Programs may need to be installed set-group-ID (or
- set-user-ID) for `getloadavg' to work. In this case, define
- `GETLOADAVG_PRIVILEGED', set the output variable `NEED_SETGID'
- to `true' (and otherwise to `false'), and set `KMEM_GROUP' to
- the name of the group that should own the installed program.
- The `AC_FUNC_GETLOADAVG' macro is obsolescent. New programs should
- use Gnulib's `getloadavg' module. *Note Gnulib::.
- -- Macro: AC_FUNC_GETMNTENT
- Check for `getmntent' in the standard C library, and then in the
- `sun', `seq', and `gen' libraries, for UNICOS, IRIX 4, PTX, and
- UnixWare, respectively. Then, if `getmntent' is available, define
- `HAVE_GETMNTENT' and set `ac_cv_func_getmntent' to `yes'.
- Otherwise set `ac_cv_func_getmntent' to `no'.
- The result of this macro can be overridden by setting the cache
- variable `ac_cv_search_getmntent'.
- -- Macro: AC_FUNC_GETPGRP
- Define `GETPGRP_VOID' if it is an error to pass 0 to `getpgrp';
- this is the Posix behavior. On older BSD systems, you must pass 0
- to `getpgrp', as it takes an argument and behaves like Posix's
- `getpgid'.
- #ifdef GETPGRP_VOID
- pid = getpgrp ();
- #else
- pid = getpgrp (0);
- #endif
- This macro does not check whether `getpgrp' exists at all; if you
- need to work in that situation, first call `AC_CHECK_FUNC' for
- `getpgrp'.
- The result of this macro is cached in the `ac_cv_func_getpgrp_void'
- variable.
- This macro is obsolescent, as current systems have a `getpgrp'
- whose signature conforms to Posix. New programs need not use this
- macro.
- -- Macro: AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK
- If `link' is a symbolic link, then `lstat' should treat `link/'
- the same as `link/.'. However, many older `lstat' implementations
- incorrectly ignore trailing slashes.
- It is safe to assume that if `lstat' incorrectly ignores trailing
- slashes, then other symbolic-link-aware functions like `unlink'
- also incorrectly ignore trailing slashes.
- If `lstat' behaves properly, define
- `LSTAT_FOLLOWS_SLASHED_SYMLINK', otherwise require an `AC_LIBOBJ'
- replacement of `lstat'.
- The result of this macro is cached in the
- `ac_cv_func_lstat_dereferences_slashed_symlink' variable.
- The `AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK' macro is obsolescent.
- New programs should use Gnulib's `lstat' module. *Note Gnulib::.
- -- Macro: AC_FUNC_MALLOC
- If the `malloc' function is compatible with the GNU C library
- `malloc' (i.e., `malloc (0)' returns a valid pointer), define
- `HAVE_MALLOC' to 1. Otherwise define `HAVE_MALLOC' to 0, ask for
- an `AC_LIBOBJ' replacement for `malloc', and define `malloc' to
- `rpl_malloc' so that the native `malloc' is not used in the main
- project.
- Typically, the replacement file `malloc.c' should look like (note
- the `#undef malloc'):
- #include <config.h>
- #undef malloc
- #include <sys/types.h>
- void *malloc ();
- /* Allocate an N-byte block of memory from the heap.
- If N is zero, allocate a 1-byte block. */
- void *
- rpl_malloc (size_t n)
- {
- if (n == 0)
- n = 1;
- return malloc (n);
- }
- The result of this macro is cached in the
- `ac_cv_func_malloc_0_nonnull' variable.
- -- Macro: AC_FUNC_MBRTOWC
- Define `HAVE_MBRTOWC' to 1 if the function `mbrtowc' and the type
- `mbstate_t' are properly declared.
- The result of this macro is cached in the `ac_cv_func_mbrtowc'
- variable.
- -- Macro: AC_FUNC_MEMCMP
- If the `memcmp' function is not available, or does not work on
- 8-bit data (like the one on SunOS 4.1.3), or fails when comparing
- 16 bytes or more and with at least one buffer not starting on a
- 4-byte boundary (such as the one on NeXT x86 OpenStep), require an
- `AC_LIBOBJ' replacement for `memcmp'.
- The result of this macro is cached in the
- `ac_cv_func_memcmp_working' variable.
- This macro is obsolescent, as current systems have a working
- `memcmp'. New programs need not use this macro.
- -- Macro: AC_FUNC_MKTIME
- If the `mktime' function is not available, or does not work
- correctly, require an `AC_LIBOBJ' replacement for `mktime'. For
- the purposes of this test, `mktime' should conform to the Posix
- standard and should be the inverse of `localtime'.
- The result of this macro is cached in the
- `ac_cv_func_working_mktime' variable.
- The `AC_FUNC_MKTIME' macro is obsolescent. New programs should
- use Gnulib's `mktime' module. *Note Gnulib::.
- -- Macro: AC_FUNC_MMAP
- If the `mmap' function exists and works correctly, define
- `HAVE_MMAP'. This checks only private fixed mapping of
- already-mapped memory.
- The result of this macro is cached in the
- `ac_cv_func_mmap_fixed_mapped' variable.
- -- Macro: AC_FUNC_OBSTACK
- If the obstacks are found, define `HAVE_OBSTACK', else require an
- `AC_LIBOBJ' replacement for `obstack'.
- The result of this macro is cached in the `ac_cv_func_obstack'
- variable.
- -- Macro: AC_FUNC_REALLOC
- If the `realloc' function is compatible with the GNU C library
- `realloc' (i.e., `realloc (NULL, 0)' returns a valid pointer),
- define `HAVE_REALLOC' to 1. Otherwise define `HAVE_REALLOC' to 0,
- ask for an `AC_LIBOBJ' replacement for `realloc', and define
- `realloc' to `rpl_realloc' so that the native `realloc' is not
- used in the main project. See `AC_FUNC_MALLOC' for details.
- The result of this macro is cached in the
- `ac_cv_func_realloc_0_nonnull' variable.
- -- Macro: AC_FUNC_SELECT_ARGTYPES
- Determines the correct type to be passed for each of the `select'
- function's arguments, and defines those types in
- `SELECT_TYPE_ARG1', `SELECT_TYPE_ARG234', and `SELECT_TYPE_ARG5'
- respectively. `SELECT_TYPE_ARG1' defaults to `int',
- `SELECT_TYPE_ARG234' defaults to `int *', and `SELECT_TYPE_ARG5'
- defaults to `struct timeval *'.
- This macro is obsolescent, as current systems have a `select' whose
- signature conforms to Posix. New programs need not use this macro.
- -- Macro: AC_FUNC_SETPGRP
- If `setpgrp' takes no argument (the Posix version), define
- `SETPGRP_VOID'. Otherwise, it is the BSD version, which takes two
- process IDs as arguments. This macro does not check whether
- `setpgrp' exists at all; if you need to work in that situation,
- first call `AC_CHECK_FUNC' for `setpgrp'.
- The result of this macro is cached in the `ac_cv_func_setpgrp_void'
- variable.
- This macro is obsolescent, as current systems have a `setpgrp'
- whose signature conforms to Posix. New programs need not use this
- macro.
- -- Macro: AC_FUNC_STAT
- -- Macro: AC_FUNC_LSTAT
- Determine whether `stat' or `lstat' have the bug that it succeeds
- when given the zero-length file name as argument. The `stat' and
- `lstat' from SunOS 4.1.4 and the Hurd (as of 1998-11-01) do this.
- If it does, then define `HAVE_STAT_EMPTY_STRING_BUG' (or
- `HAVE_LSTAT_EMPTY_STRING_BUG') and ask for an `AC_LIBOBJ'
- replacement of it.
- The results of these macros are cached in the
- `ac_cv_func_stat_empty_string_bug' and the
- `ac_cv_func_lstat_empty_string_bug' variables, respectively.
- These macros are obsolescent, as no current systems have the bug.
- New programs need not use these macros.
- -- Macro: AC_FUNC_STRCOLL
- If the `strcoll' function exists and works correctly, define
- `HAVE_STRCOLL'. This does a bit more than
- `AC_CHECK_FUNCS(strcoll)', because some systems have incorrect
- definitions of `strcoll' that should not be used.
- The result of this macro is cached in the
- `ac_cv_func_strcoll_works' variable.
- -- Macro: AC_FUNC_STRERROR_R
- If `strerror_r' is available, define `HAVE_STRERROR_R', and if it
- is declared, define `HAVE_DECL_STRERROR_R'. If it returns a `char
- *' message, define `STRERROR_R_CHAR_P'; otherwise it returns an
- `int' error number. The Thread-Safe Functions option of Posix
- requires `strerror_r' to return `int', but many systems
- (including, for example, version 2.2.4 of the GNU C Library)
- return a `char *' value that is not necessarily equal to the
- buffer argument.
- The result of this macro is cached in the
- `ac_cv_func_strerror_r_char_p' variable.
- -- Macro: AC_FUNC_STRFTIME
- Check for `strftime' in the `intl' library, for SCO Unix. Then,
- if `strftime' is available, define `HAVE_STRFTIME'.
- This macro is obsolescent, as no current systems require the `intl'
- library for `strftime'. New programs need not use this macro.
- -- Macro: AC_FUNC_STRTOD
- If the `strtod' function does not exist or doesn't work correctly,
- ask for an `AC_LIBOBJ' replacement of `strtod'. In this case,
- because `strtod.c' is likely to need `pow', set the output
- variable `POW_LIB' to the extra library needed.
- This macro caches its result in the `ac_cv_func_strtod' variable
- and depends upon the result in the `ac_cv_func_pow' variable.
- The `AC_FUNC_STRTOD' macro is obsolescent. New programs should
- use Gnulib's `strtod' module. *Note Gnulib::.
- -- Macro: AC_FUNC_STRTOLD
- If the `strtold' function exists and conforms to C99, define
- `HAVE_STRTOLD'.
- This macro caches its result in the `ac_cv_func_strtold' variable.
- -- Macro: AC_FUNC_STRNLEN
- If the `strnlen' function is not available, or is buggy (like the
- one from AIX 4.3), require an `AC_LIBOBJ' replacement for it.
- This macro caches its result in the `ac_cv_func_strnlen_working'
- variable.
- -- Macro: AC_FUNC_UTIME_NULL
- If `utime (FILE, NULL)' sets FILE's timestamp to the present,
- define `HAVE_UTIME_NULL'.
- This macro caches its result in the `ac_cv_func_utime_null'
- variable.
- This macro is obsolescent, as all current systems have a `utime'
- that behaves this way. New programs need not use this macro.
- -- Macro: AC_FUNC_VPRINTF
- If `vprintf' is found, define `HAVE_VPRINTF'. Otherwise, if
- `_doprnt' is found, define `HAVE_DOPRNT'. (If `vprintf' is
- available, you may assume that `vfprintf' and `vsprintf' are also
- available.)
- This macro is obsolescent, as all current systems have `vprintf'.
- New programs need not use this macro.
- -- Macro: AC_REPLACE_FNMATCH
- If the `fnmatch' function does not conform to Posix (see
- `AC_FUNC_FNMATCH'), ask for its `AC_LIBOBJ' replacement.
- The files `fnmatch.c', `fnmatch_loop.c', and `fnmatch_.h' in the
- `AC_LIBOBJ' replacement directory are assumed to contain a copy of
- the source code of GNU `fnmatch'. If necessary, this source code
- is compiled as an `AC_LIBOBJ' replacement, and the `fnmatch_.h'
- file is linked to `fnmatch.h' so that it can be included in place
- of the system `<fnmatch.h>'.
- This macro caches its result in the `ac_cv_func_fnmatch_works'
- variable.
- This macro is obsolescent, as it assumes the use of particular
- source files. New programs should use Gnulib's `fnmatch-posix'
- module, which provides this macro along with the source files.
- *Note Gnulib::.
- File: autoconf.info, Node: Generic Functions, Prev: Particular Functions, Up: Library Functions
- 5.5.3 Generic Function Checks
- -----------------------------
- These macros are used to find functions not covered by the "particular"
- test macros. If the functions might be in libraries other than the
- default C library, first call `AC_CHECK_LIB' for those libraries. If
- you need to check the behavior of a function as well as find out
- whether it is present, you have to write your own test for it (*note
- Writing Tests::).
- -- Macro: AC_CHECK_FUNC (FUNCTION, [ACTION-IF-FOUND],
- [ACTION-IF-NOT-FOUND])
- If C function FUNCTION is available, run shell commands
- ACTION-IF-FOUND, otherwise ACTION-IF-NOT-FOUND. If you just want
- to define a symbol if the function is available, consider using
- `AC_CHECK_FUNCS' instead. This macro checks for functions with C
- linkage even when `AC_LANG(C++)' has been called, since C is more
- standardized than C++. (*note Language Choice::, for more
- information about selecting the language for checks.)
- This macro caches its result in the `ac_cv_func_FUNCTION' variable.
- -- Macro: AC_CHECK_FUNCS (FUNCTION..., [ACTION-IF-FOUND],
- [ACTION-IF-NOT-FOUND])
- For each FUNCTION enumerated in the blank-or-newline-separated
- argument list, define `HAVE_FUNCTION' (in all capitals) if it is
- available. If ACTION-IF-FOUND is given, it is additional shell
- code to execute when one of the functions is found. You can give
- it a value of `break' to break out of the loop on the first match.
- If ACTION-IF-NOT-FOUND is given, it is executed when one of the
- functions is not found.
- Results are cached for each FUNCTION as in `AC_CHECK_FUNC'.
- -- Macro: AC_CHECK_FUNCS_ONCE (FUNCTION...)
- For each FUNCTION enumerated in the blank-or-newline-separated
- argument list, define `HAVE_FUNCTION' (in all capitals) if it is
- available. This is a once-only variant of `AC_CHECK_FUNCS'. It
- generates the checking code at most once, so that `configure' is
- smaller and faster; but the checks cannot be conditionalized and
- are always done once, early during the `configure' run.
- Autoconf follows a philosophy that was formed over the years by those
- who have struggled for portability: isolate the portability issues in
- specific files, and then program as if you were in a Posix environment.
- Some functions may be missing or unfixable, and your package must be
- ready to replace them.
- Suitable replacements for many such problem functions are available
- from Gnulib (*note Gnulib::).
- -- Macro: AC_LIBOBJ (FUNCTION)
- Specify that `FUNCTION.c' must be included in the executables to
- replace a missing or broken implementation of FUNCTION.
- Technically, it adds `FUNCTION.$ac_objext' to the output variable
- `LIBOBJS' if it is not already in, and calls `AC_LIBSOURCE' for
- `FUNCTION.c'. You should not directly change `LIBOBJS', since
- this is not traceable.
- -- Macro: AC_LIBSOURCE (FILE)
- Specify that FILE might be needed to compile the project. If you
- need to know what files might be needed by a `configure.ac', you
- should trace `AC_LIBSOURCE'. FILE must be a literal.
- This macro is called automatically from `AC_LIBOBJ', but you must
- call it explicitly if you pass a shell variable to `AC_LIBOBJ'. In
- that case, since shell variables cannot be traced statically, you
- must pass to `AC_LIBSOURCE' any possible files that the shell
- variable might cause `AC_LIBOBJ' to need. For example, if you
- want to pass a variable `$foo_or_bar' to `AC_LIBOBJ' that holds
- either `"foo"' or `"bar"', you should do:
- AC_LIBSOURCE([foo.c])
- AC_LIBSOURCE([bar.c])
- AC_LIBOBJ([$foo_or_bar])
- There is usually a way to avoid this, however, and you are
- encouraged to simply call `AC_LIBOBJ' with literal arguments.
- Note that this macro replaces the obsolete `AC_LIBOBJ_DECL', with
- slightly different semantics: the old macro took the function name,
- e.g., `foo', as its argument rather than the file name.
- -- Macro: AC_LIBSOURCES (FILES)
- Like `AC_LIBSOURCE', but accepts one or more FILES in a
- comma-separated M4 list. Thus, the above example might be
- rewritten:
- AC_LIBSOURCES([foo.c, bar.c])
- AC_LIBOBJ([$foo_or_bar])
- -- Macro: AC_CONFIG_LIBOBJ_DIR (DIRECTORY)
- Specify that `AC_LIBOBJ' replacement files are to be found in
- DIRECTORY, a name relative to the top level of the source tree.
- The replacement directory defaults to `.', the top level
- directory, and the most typical value is `lib', corresponding to
- `AC_CONFIG_LIBOBJ_DIR([lib])'.
- `configure' might need to know the replacement directory for the
- following reasons: (i) some checks use the replacement files, (ii)
- some macros bypass broken system headers by installing links to the
- replacement headers (iii) when used in conjunction with Automake,
- within each makefile, DIRECTORY is used as a relative path from
- `$(top_srcdir)' to each object named in `LIBOBJS' and `LTLIBOBJS',
- etc.
- It is common to merely check for the existence of a function, and ask
- for its `AC_LIBOBJ' replacement if missing. The following macro is a
- convenient shorthand.
- -- Macro: AC_REPLACE_FUNCS (FUNCTION...)
- Like `AC_CHECK_FUNCS', but uses `AC_LIBOBJ(FUNCTION)' as
- ACTION-IF-NOT-FOUND. You can declare your replacement function by
- enclosing the prototype in `#ifndef HAVE_FUNCTION'. If the system
- has the function, it probably declares it in a header file you
- should be including, so you shouldn't redeclare it lest your
- declaration conflict.
- File: autoconf.info, Node: Header Files, Next: Declarations, Prev: Library Functions, Up: Existing Tests
- 5.6 Header Files
- ================
- The following macros check for the presence of certain C header files.
- If there is no macro specifically defined to check for a header file
- you need, and you don't need to check for any special properties of it,
- then you can use one of the general header-file check macros.
- * Menu:
- * Header Portability:: Collected knowledge on common headers
- * Particular Headers:: Special handling to find certain headers
- * Generic Headers:: How to find other headers
- File: autoconf.info, Node: Header Portability, Next: Particular Headers, Up: Header Files
- 5.6.1 Portability of Headers
- ----------------------------
- This section documents some collected knowledge about common headers,
- and the problems they cause. By definition, this list always requires
- additions. A much more complete list is maintained by the Gnulib
- project (*note Gnulib::), covering *note Posix Headers: (gnulib)Header
- File Substitutes. and *note Glibc Headers: (gnulib)Glibc Header File
- Substitutes. Please help us keep the gnulib list as complete as
- possible.
- `limits.h'
- C99 says that `limits.h' defines `LLONG_MIN', `LLONG_MAX', and
- `ULLONG_MAX', but many almost-C99 environments (e.g., default GCC
- 4.0.2 + glibc 2.4) do not define them.
- `inttypes.h' vs. `stdint.h'
- The C99 standard says that `inttypes.h' includes `stdint.h', so
- there's no need to include `stdint.h' separately in a standard
- environment. Some implementations have `inttypes.h' but not
- `stdint.h' (e.g., Solaris 7), but we don't know of any
- implementation that has `stdint.h' but not `inttypes.h'.
- `linux/irda.h'
- It requires `linux/types.h' and `sys/socket.h'.
- `linux/random.h'
- It requires `linux/types.h'.
- `net/if.h'
- On Darwin, this file requires that `sys/socket.h' be included
- beforehand. One should run:
- AC_CHECK_HEADERS([sys/socket.h])
- AC_CHECK_HEADERS([net/if.h], [], [],
- [#include <stdio.h>
- #ifdef STDC_HEADERS
- # include <stdlib.h>
- # include <stddef.h>
- #else
- # ifdef HAVE_STDLIB_H
- # include <stdlib.h>
- # endif
- #endif
- #ifdef HAVE_SYS_SOCKET_H
- # include <sys/socket.h>
- #endif
- ])
- `netinet/if_ether.h'
- On Darwin, this file requires that `stdio.h' and `sys/socket.h' be
- included beforehand. One should run:
- AC_CHECK_HEADERS([sys/socket.h])
- AC_CHECK_HEADERS([netinet/if_ether.h], [], [],
- [#include <stdio.h>
- #ifdef STDC_HEADERS
- # include <stdlib.h>
- # include <stddef.h>
- #else
- # ifdef HAVE_STDLIB_H
- # include <stdlib.h>
- # endif
- #endif
- #ifdef HAVE_SYS_SOCKET_H
- # include <sys/socket.h>
- #endif
- ])
- `stdint.h'
- See above, item `inttypes.h' vs. `stdint.h'.
- `stdlib.h'
- On many systems (e.g., Darwin), `stdio.h' is a prerequisite.
- `sys/mount.h'
- On FreeBSD 4.8 on ia32 and using gcc version 2.95.4,
- `sys/params.h' is a prerequisite.
- `sys/ptem.h'
- On Solaris 8, `sys/stream.h' is a prerequisite.
- `sys/socket.h'
- On Darwin, `stdlib.h' is a prerequisite.
- `sys/ucred.h'
- On Tru64 5.1, `sys/types.h' is a prerequisite.
- `X11/extensions/scrnsaver.h'
- Using XFree86, this header requires `X11/Xlib.h', which is probably
- so required that you might not even consider looking for it.
- AC_CHECK_HEADERS([X11/extensions/scrnsaver.h], [], [],
- [[#include <X11/Xlib.h>
- ]])
- File: autoconf.info, Node: Particular Headers, Next: Generic Headers, Prev: Header Portability, Up: Header Files
- 5.6.2 Particular Header Checks
- ------------------------------
- These macros check for particular system header files--whether they
- exist, and in some cases whether they declare certain symbols.
- -- Macro: AC_CHECK_HEADER_STDBOOL
- Check whether `stdbool.h' exists and conforms to C99, and cache the
- result in the `ac_cv_header_stdbool_h' variable. If the type
- `_Bool' is defined, define `HAVE__BOOL' to 1.
- This macro is intended for use by Gnulib (*note Gnulib::) and other
- packages that supply a substitute `stdbool.h' on platforms lacking
- a conforming one. The `AC_HEADER_STDBOOL' macro is better for code
- that explicitly checks for `stdbool.h'.
- -- Macro: AC_HEADER_ASSERT
- Check whether to enable assertions in the style of `assert.h'.
- Assertions are enabled by default, but the user can override this
- by invoking `configure' with the `--disable-assert' option.
- -- Macro: AC_HEADER_DIRENT
- Check for the following header files. For the first one that is
- found and defines `DIR', define the listed C preprocessor macro:
- `dirent.h' `HAVE_DIRENT_H'
- `sys/ndir.h' `HAVE_SYS_NDIR_H'
- `sys/dir.h' `HAVE_SYS_DIR_H'
- `ndir.h' `HAVE_NDIR_H'
- The directory-library declarations in your source code should look
- something like the following:
- #include <sys/types.h>
- #ifdef HAVE_DIRENT_H
- # include <dirent.h>
- # define NAMLEN(dirent) strlen ((dirent)->d_name)
- #else
- # define dirent direct
- # define NAMLEN(dirent) ((dirent)->d_namlen)
- # ifdef HAVE_SYS_NDIR_H
- # include <sys/ndir.h>
- # endif
- # ifdef HAVE_SYS_DIR_H
- # include <sys/dir.h>
- # endif
- # ifdef HAVE_NDIR_H
- # include <ndir.h>
- # endif
- #endif
- Using the above declarations, the program would declare variables
- to be of type `struct dirent', not `struct direct', and would
- access the length of a directory entry name by passing a pointer
- to a `struct dirent' to the `NAMLEN' macro.
- This macro also checks for the SCO Xenix `dir' and `x' libraries.
- This macro is obsolescent, as all current systems with directory
- libraries have `<dirent.h>'. New programs need not use this macro.
- Also see `AC_STRUCT_DIRENT_D_INO' and `AC_STRUCT_DIRENT_D_TYPE'
- (*note Particular Structures::).
- -- Macro: AC_HEADER_MAJOR
- If `sys/types.h' does not define `major', `minor', and `makedev',
- but `sys/mkdev.h' does, define `MAJOR_IN_MKDEV'; otherwise, if
- `sys/sysmacros.h' does, define `MAJOR_IN_SYSMACROS'.
- -- Macro: AC_HEADER_RESOLV
- Checks for header `resolv.h', checking for prerequisites first.
- To properly use `resolv.h', your code should contain something like
- the following:
- #ifdef HAVE_SYS_TYPES_H
- # include <sys/types.h>
- #endif
- #ifdef HAVE_NETINET_IN_H
- # include <netinet/in.h> /* inet_ functions / structs */
- #endif
- #ifdef HAVE_ARPA_NAMESER_H
- # include <arpa/nameser.h> /* DNS HEADER struct */
- #endif
- #ifdef HAVE_NETDB_H
- # include <netdb.h>
- #endif
- #include <resolv.h>
- -- Macro: AC_HEADER_STAT
- If the macros `S_ISDIR', `S_ISREG', etc. defined in `sys/stat.h'
- do not work properly (returning false positives), define
- `STAT_MACROS_BROKEN'. This is the case on Tektronix UTekV, Amdahl
- UTS and Motorola System V/88.
- This macro is obsolescent, as no current systems have the bug.
- New programs need not use this macro.
- -- Macro: AC_HEADER_STDBOOL
- If `stdbool.h' exists and conforms to C99, define `HAVE_STDBOOL_H'
- to 1; if the type `_Bool' is defined, define `HAVE__BOOL' to 1.
- To fulfill the C99 requirements, your program could contain the
- following code:
- #ifdef HAVE_STDBOOL_H
- # include <stdbool.h>
- #else
- # ifndef HAVE__BOOL
- # ifdef __cplusplus
- typedef bool _Bool;
- # else
- # define _Bool signed char
- # endif
- # endif
- # define bool _Bool
- # define false 0
- # define true 1
- # define __bool_true_false_are_defined 1
- #endif
- Alternatively you can use the `stdbool' package of Gnulib (*note
- Gnulib::). It simplifies your code so that it can say just
- `#include <stdbool.h>', and it adds support for less-common
- platforms.
- This macro caches its result in the `ac_cv_header_stdbool_h'
- variable.
- This macro differs from `AC_CHECK_HEADER_STDBOOL' only in that it
- defines `HAVE_STDBOOL_H' whereas `AC_CHECK_HEADER_STDBOOL' does
- not.
- -- Macro: AC_HEADER_STDC
- Define `STDC_HEADERS' if the system has C header files conforming
- to ANSI C89 (ISO C90). Specifically, this macro checks for
- `stdlib.h', `stdarg.h', `string.h', and `float.h'; if the system
- has those, it probably has the rest of the C89 header files. This
- macro also checks whether `string.h' declares `memchr' (and thus
- presumably the other `mem' functions), whether `stdlib.h' declare
- `free' (and thus presumably `malloc' and other related functions),
- and whether the `ctype.h' macros work on characters with the high
- bit set, as the C standard requires.
- If you use this macro, your code can refer to `STDC_HEADERS' to
- determine whether the system has conforming header files (and
- probably C library functions).
- This macro caches its result in the `ac_cv_header_stdc' variable.
- This macro is obsolescent, as current systems have conforming
- header files. New programs need not use this macro.
- Nowadays `string.h' is part of the C standard and declares
- functions like `strcpy', and `strings.h' is standardized by Posix
- and declares BSD functions like `bcopy'; but historically, string
- functions were a major sticking point in this area. If you still
- want to worry about portability to ancient systems without
- standard headers, there is so much variation that it is probably
- easier to declare the functions you use than to figure out exactly
- what the system header files declare. Some ancient systems
- contained a mix of functions from the C standard and from BSD;
- some were mostly standard but lacked `memmove'; some defined the
- BSD functions as macros in `string.h' or `strings.h'; some had
- only the BSD functions but `string.h'; some declared the memory
- functions in `memory.h', some in `string.h'; etc. It is probably
- sufficient to check for one string function and one memory
- function; if the library had the standard versions of those then
- it probably had most of the others. If you put the following in
- `configure.ac':
- # This example is obsolescent.
- # Nowadays you can omit these macro calls.
- AC_HEADER_STDC
- AC_CHECK_FUNCS([strchr memcpy])
- then, in your code, you can use declarations like this:
- /* This example is obsolescent.
- Nowadays you can just #include <string.h>. */
- #ifdef STDC_HEADERS
- # include <string.h>
- #else
- # ifndef HAVE_STRCHR
- # define strchr index
- # define strrchr rindex
- # endif
- char *strchr (), *strrchr ();
- # ifndef HAVE_MEMCPY
- # define memcpy(d, s, n) bcopy ((s), (d), (n))
- # define memmove(d, s, n) bcopy ((s), (d), (n))
- # endif
- #endif
- If you use a function like `memchr', `memset', `strtok', or
- `strspn', which have no BSD equivalent, then macros don't suffice
- to port to ancient hosts; you must provide an implementation of
- each function. An easy way to incorporate your implementations
- only when needed (since the ones in system C libraries may be hand
- optimized) is to, taking `memchr' for example, put it in
- `memchr.c' and use `AC_REPLACE_FUNCS([memchr])'.
- -- Macro: AC_HEADER_SYS_WAIT
- If `sys/wait.h' exists and is compatible with Posix, define
- `HAVE_SYS_WAIT_H'. Incompatibility can occur if `sys/wait.h' does
- not exist, or if it uses the old BSD `union wait' instead of `int'
- to store a status value. If `sys/wait.h' is not Posix compatible,
- then instead of including it, define the Posix macros with their
- usual interpretations. Here is an example:
- #include <sys/types.h>
- #ifdef HAVE_SYS_WAIT_H
- # include <sys/wait.h>
- #endif
- #ifndef WEXITSTATUS
- # define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8)
- #endif
- #ifndef WIFEXITED
- # define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
- #endif
- This macro caches its result in the `ac_cv_header_sys_wait_h'
- variable.
- This macro is obsolescent, as current systems are compatible with
- Posix. New programs need not use this macro.
- `_POSIX_VERSION' is defined when `unistd.h' is included on Posix
- systems. If there is no `unistd.h', it is definitely not a Posix
- system. However, some non-Posix systems do have `unistd.h'.
- The way to check whether the system supports Posix is:
- #ifdef HAVE_UNISTD_H
- # include <sys/types.h>
- # include <unistd.h>
- #endif
- #ifdef _POSIX_VERSION
- /* Code for Posix systems. */
- #endif
- -- Macro: AC_HEADER_TIME
- If a program may include both `time.h' and `sys/time.h', define
- `TIME_WITH_SYS_TIME'. On some ancient systems, `sys/time.h'
- included `time.h', but `time.h' was not protected against multiple
- inclusion, so programs could not explicitly include both files.
- This macro is useful in programs that use, for example, `struct
- timeval' as well as `struct tm'. It is best used in conjunction
- with `HAVE_SYS_TIME_H', which can be checked for using
- `AC_CHECK_HEADERS([sys/time.h])'.
- #ifdef TIME_WITH_SYS_TIME
- # include <sys/time.h>
- # include <time.h>
- #else
- # ifdef HAVE_SYS_TIME_H
- # include <sys/time.h>
- # else
- # include <time.h>
- # endif
- #endif
- This macro caches its result in the `ac_cv_header_time' variable.
- This macro is obsolescent, as current systems can include both
- files when they exist. New programs need not use this macro.
- -- Macro: AC_HEADER_TIOCGWINSZ
- If the use of `TIOCGWINSZ' requires `<sys/ioctl.h>', then define
- `GWINSZ_IN_SYS_IOCTL'. Otherwise `TIOCGWINSZ' can be found in
- `<termios.h>'.
- Use:
- #ifdef HAVE_TERMIOS_H
- # include <termios.h>
- #endif
- #ifdef GWINSZ_IN_SYS_IOCTL
- # include <sys/ioctl.h>
- #endif
- File: autoconf.info, Node: Generic Headers, Prev: Particular Headers, Up: Header Files
- 5.6.3 Generic Header Checks
- ---------------------------
- These macros are used to find system header files not covered by the
- "particular" test macros. If you need to check the contents of a header
- as well as find out whether it is present, you have to write your own
- test for it (*note Writing Tests::).
- -- Macro: AC_CHECK_HEADER (HEADER-FILE, [ACTION-IF-FOUND],
- [ACTION-IF-NOT-FOUND], [INCLUDES])
- If the system header file HEADER-FILE is compilable, execute shell
- commands ACTION-IF-FOUND, otherwise execute ACTION-IF-NOT-FOUND.
- If you just want to define a symbol if the header file is
- available, consider using `AC_CHECK_HEADERS' instead.
- INCLUDES is decoded to determine the appropriate include
- directives. If omitted or empty, `configure' will check for both
- header existence (with the preprocessor) and usability (with the
- compiler), using `AC_INCLUDES_DEFAULT' for the compile test. If
- there is a discrepancy between the results, a warning is issued to
- the user, and the compiler results are favored (*note Present But
- Cannot Be Compiled::). In general, favoring the compiler results
- means that a header will be treated as not found even though the
- file exists, because you did not provide enough prerequisites.
- Providing a non-empty INCLUDES argument allows the code to provide
- any prerequisites prior to including the header under test; it is
- common to use the argument `AC_INCLUDES_DEFAULT' (*note Default
- Includes::). With an explicit fourth argument, no preprocessor
- test is needed. As a special case, an INCLUDES of exactly `-'
- triggers the older preprocessor check, which merely determines
- existence of the file in the preprocessor search path; this should
- only be used as a last resort (it is safer to determine the actual
- prerequisites and perform a compiler check, or else use
- `AC_PREPROC_IFELSE' to make it obvious that only a preprocessor
- check is desired).
- This macro caches its result in the `ac_cv_header_HEADER-FILE'
- variable, with characters not suitable for a variable name mapped
- to underscores.
- -- Macro: AC_CHECK_HEADERS (HEADER-FILE..., [ACTION-IF-FOUND],
- [ACTION-IF-NOT-FOUND], [INCLUDES])
- For each given system header file HEADER-FILE in the
- blank-separated argument list that exists, define
- `HAVE_HEADER-FILE' (in all capitals). If ACTION-IF-FOUND is
- given, it is additional shell code to execute when one of the
- header files is found. You can give it a value of `break' to
- break out of the loop on the first match. If ACTION-IF-NOT-FOUND
- is given, it is executed when one of the header files is not found.
- INCLUDES is interpreted as in `AC_CHECK_HEADER', in order to
- choose the set of preprocessor directives supplied before the
- header under test.
- This macro caches its result in the `ac_cv_header_HEADER-FILE'
- variable, with characters not suitable for a variable name mapped
- to underscores.
- Previous versions of Autoconf merely checked whether the header was
- accepted by the preprocessor. This was changed because the old test was
- inappropriate for typical uses. Headers are typically used to compile,
- not merely to preprocess, and the old behavior sometimes accepted
- headers that clashed at compile-time (*note Present But Cannot Be
- Compiled::). If you need to check whether a header is preprocessable,
- you can use `AC_PREPROC_IFELSE' (*note Running the Preprocessor::).
- Actually requiring a header to compile improves the robustness of the
- test, but it also requires that you make sure that headers that must be
- included before the HEADER-FILE be part of the INCLUDES, (*note Default
- Includes::). If looking for `bar.h', which requires that `foo.h' be
- included before if it exists, we suggest the following scheme:
- AC_CHECK_HEADERS([foo.h])
- AC_CHECK_HEADERS([bar.h], [], [],
- [#ifdef HAVE_FOO_H
- # include <foo.h>
- #endif
- ])
- The following variant generates smaller, faster `configure' files if
- you do not need the full power of `AC_CHECK_HEADERS'.
- -- Macro: AC_CHECK_HEADERS_ONCE (HEADER-FILE...)
- For each given system header file HEADER-FILE in the
- blank-separated argument list that exists, define
- `HAVE_HEADER-FILE' (in all capitals). This is a once-only variant
- of `AC_CHECK_HEADERS'. It generates the checking code at most
- once, so that `configure' is smaller and faster; but the checks
- cannot be conditionalized and are always done once, early during
- the `configure' run. Thus, this macro is only safe for checking
- headers that do not have prerequisites beyond what
- `AC_INCLUDES_DEFAULT' provides.
- File: autoconf.info, Node: Declarations, Next: Structures, Prev: Header Files, Up: Existing Tests
- 5.7 Declarations
- ================
- The following macros check for the declaration of variables and
- functions. If there is no macro specifically defined to check for a
- symbol you need, then you can use the general macros (*note Generic
- Declarations::) or, for more complex tests, you may use
- `AC_COMPILE_IFELSE' (*note Running the Compiler::).
- * Menu:
- * Particular Declarations:: Macros to check for certain declarations
- * Generic Declarations:: How to find other declarations
- File: autoconf.info, Node: Particular Declarations, Next: Generic Declarations, Up: Declarations
- 5.7.1 Particular Declaration Checks
- -----------------------------------
- There are no specific macros for declarations.
- File: autoconf.info, Node: Generic Declarations, Prev: Particular Declarations, Up: Declarations
- 5.7.2 Generic Declaration Checks
- --------------------------------
- These macros are used to find declarations not covered by the
- "particular" test macros.
- -- Macro: AC_CHECK_DECL (SYMBOL, [ACTION-IF-FOUND],
- [ACTION-IF-NOT-FOUND], [INCLUDES = `AC_INCLUDES_DEFAULT'])
- If SYMBOL (a function, variable, or constant) is not declared in
- INCLUDES and a declaration is needed, run the shell commands
- ACTION-IF-NOT-FOUND, otherwise ACTION-IF-FOUND. INCLUDES is a
- series of include directives, defaulting to `AC_INCLUDES_DEFAULT'
- (*note Default Includes::), which are used prior to the
- declaration under test.
- This macro actually tests whether SYMBOL is defined as a macro or
- can be used as an r-value, not whether it is really declared,
- because it is much safer to avoid introducing extra declarations
- when they are not needed. In order to facilitate use of C++ and
- overloaded function declarations, it is possible to specify
- function argument types in parentheses for types which can be
- zero-initialized:
- AC_CHECK_DECL([basename(char *)])
- This macro caches its result in the `ac_cv_have_decl_SYMBOL'
- variable, with characters not suitable for a variable name mapped
- to underscores.
- -- Macro: AC_CHECK_DECLS (SYMBOLS, [ACTION-IF-FOUND],
- [ACTION-IF-NOT-FOUND], [INCLUDES = `AC_INCLUDES_DEFAULT'])
- For each of the SYMBOLS (_comma_-separated list with optional
- function argument types for C++ overloads), define
- `HAVE_DECL_SYMBOL' (in all capitals) to `1' if SYMBOL is declared,
- otherwise to `0'. If ACTION-IF-NOT-FOUND is given, it is
- additional shell code to execute when one of the function
- declarations is needed, otherwise ACTION-IF-FOUND is executed.
- INCLUDES is a series of include directives, defaulting to
- `AC_INCLUDES_DEFAULT' (*note Default Includes::), which are used
- prior to the declarations under test.
- This macro uses an M4 list as first argument:
- AC_CHECK_DECLS([strdup])
- AC_CHECK_DECLS([strlen])
- AC_CHECK_DECLS([malloc, realloc, calloc, free])
- AC_CHECK_DECLS([j0], [], [], [[#include <math.h>]])
- AC_CHECK_DECLS([[basename(char *)], [dirname(char *)]])
- Unlike the other `AC_CHECK_*S' macros, when a SYMBOL is not
- declared, `HAVE_DECL_SYMBOL' is defined to `0' instead of leaving
- `HAVE_DECL_SYMBOL' undeclared. When you are _sure_ that the check
- was performed, use `HAVE_DECL_SYMBOL' in `#if':
- #if !HAVE_DECL_SYMBOL
- extern char *symbol;
- #endif
- If the test may have not been performed, however, because it is
- safer _not_ to declare a symbol than to use a declaration that
- conflicts with the system's one, you should use:
- #if defined HAVE_DECL_MALLOC && !HAVE_DECL_MALLOC
- void *malloc (size_t *s);
- #endif
- You fall into the second category only in extreme situations:
- either your files may be used without being configured, or they
- are used during the configuration. In most cases the traditional
- approach is enough.
- This macro caches its results in `ac_cv_have_decl_SYMBOL'
- variables, with characters not suitable for a variable name mapped
- to underscores.
- -- Macro: AC_CHECK_DECLS_ONCE (SYMBOLS)
- For each of the SYMBOLS (_comma_-separated list), define
- `HAVE_DECL_SYMBOL' (in all capitals) to `1' if SYMBOL is declared
- in the default include files, otherwise to `0'. This is a
- once-only variant of `AC_CHECK_DECLS'. It generates the checking
- code at most once, so that `configure' is smaller and faster; but
- the checks cannot be conditionalized and are always done once,
- early during the `configure' run.
- File: autoconf.info, Node: Structures, Next: Types, Prev: Declarations, Up: Existing Tests
- 5.8 Structures
- ==============
- The following macros check for the presence of certain members in C
- structures. If there is no macro specifically defined to check for a
- member you need, then you can use the general structure-member macros
- (*note Generic Structures::) or, for more complex tests, you may use
- `AC_COMPILE_IFELSE' (*note Running the Compiler::).
- * Menu:
- * Particular Structures:: Macros to check for certain structure members
- * Generic Structures:: How to find other structure members
- File: autoconf.info, Node: Particular Structures, Next: Generic Structures, Up: Structures
- 5.8.1 Particular Structure Checks
- ---------------------------------
- The following macros check for certain structures or structure members.
- -- Macro: AC_STRUCT_DIRENT_D_INO
- Perform all the actions of `AC_HEADER_DIRENT' (*note Particular
- Headers::). Then, if `struct dirent' contains a `d_ino' member,
- define `HAVE_STRUCT_DIRENT_D_INO'.
- `HAVE_STRUCT_DIRENT_D_INO' indicates only the presence of `d_ino',
- not whether its contents are always reliable. Traditionally, a
- zero `d_ino' indicated a deleted directory entry, though current
- systems hide this detail from the user and never return zero
- `d_ino' values. Many current systems report an incorrect `d_ino'
- for a directory entry that is a mount point.
- -- Macro: AC_STRUCT_DIRENT_D_TYPE
- Perform all the actions of `AC_HEADER_DIRENT' (*note Particular
- Headers::). Then, if `struct dirent' contains a `d_type' member,
- define `HAVE_STRUCT_DIRENT_D_TYPE'.
- -- Macro: AC_STRUCT_ST_BLOCKS
- If `struct stat' contains an `st_blocks' member, define
- `HAVE_STRUCT_STAT_ST_BLOCKS'. Otherwise, require an `AC_LIBOBJ'
- replacement of `fileblocks'. The former name, `HAVE_ST_BLOCKS' is
- to be avoided, as its support will cease in the future.
- This macro caches its result in the
- `ac_cv_member_struct_stat_st_blocks' variable.
- -- Macro: AC_STRUCT_TM
- If `time.h' does not define `struct tm', define `TM_IN_SYS_TIME',
- which means that including `sys/time.h' had better define `struct
- tm'.
- This macro is obsolescent, as `time.h' defines `struct tm' in
- current systems. New programs need not use this macro.
- -- Macro: AC_STRUCT_TIMEZONE
- Figure out how to get the current timezone. If `struct tm' has a
- `tm_zone' member, define `HAVE_STRUCT_TM_TM_ZONE' (and the
- obsoleted `HAVE_TM_ZONE'). Otherwise, if the external array
- `tzname' is found, define `HAVE_TZNAME'; if it is declared, define
- `HAVE_DECL_TZNAME'.
- File: autoconf.info, Node: Generic Structures, Prev: Particular Structures, Up: Structures
- 5.8.2 Generic Structure Checks
- ------------------------------
- These macros are used to find structure members not covered by the
- "particular" test macros.
- -- Macro: AC_CHECK_MEMBER (AGGREGATE.MEMBER, [ACTION-IF-FOUND],
- [ACTION-IF-NOT-FOUND], [INCLUDES = `AC_INCLUDES_DEFAULT'])
- Check whether MEMBER is a member of the aggregate AGGREGATE. If
- no INCLUDES are specified, the default includes are used (*note
- Default Includes::).
- AC_CHECK_MEMBER([struct passwd.pw_gecos], [],
- [AC_MSG_ERROR([we need `passwd.pw_gecos'])],
- [[#include <pwd.h>]])
- You can use this macro for submembers:
- AC_CHECK_MEMBER(struct top.middle.bot)
- This macro caches its result in the
- `ac_cv_member_AGGREGATE_MEMBER' variable, with characters not
- suitable for a variable name mapped to underscores.
- -- Macro: AC_CHECK_MEMBERS (MEMBERS, [ACTION-IF-FOUND],
- [ACTION-IF-NOT-FOUND], [INCLUDES = `AC_INCLUDES_DEFAULT'])
- Check for the existence of each `AGGREGATE.MEMBER' of MEMBERS
- using the previous macro. When MEMBER belongs to AGGREGATE,
- define `HAVE_AGGREGATE_MEMBER' (in all capitals, with spaces and
- dots replaced by underscores). If ACTION-IF-FOUND is given, it is
- executed for each of the found members. If ACTION-IF-NOT-FOUND is
- given, it is executed for each of the members that could not be
- found.
- INCLUDES is a series of include directives, defaulting to
- `AC_INCLUDES_DEFAULT' (*note Default Includes::), which are used
- prior to the members under test.
- This macro uses M4 lists:
- AC_CHECK_MEMBERS([struct stat.st_rdev, struct stat.st_blksize])
- File: autoconf.info, Node: Types, Next: Compilers and Preprocessors, Prev: Structures, Up: Existing Tests
- 5.9 Types
- =========
- The following macros check for C types, either builtin or typedefs. If
- there is no macro specifically defined to check for a type you need, and
- you don't need to check for any special properties of it, then you can
- use a general type-check macro.
- * Menu:
- * Particular Types:: Special handling to find certain types
- * Generic Types:: How to find other types
- File: autoconf.info, Node: Particular Types, Next: Generic Types, Up: Types
- 5.9.1 Particular Type Checks
- ----------------------------
- These macros check for particular C types in `sys/types.h', `stdlib.h',
- `stdint.h', `inttypes.h' and others, if they exist.
- The Gnulib `stdint' module is an alternate way to define many of
- these symbols; it is useful if you prefer your code to assume a
- C99-or-better environment. *Note Gnulib::.
- -- Macro: AC_TYPE_GETGROUPS
- Define `GETGROUPS_T' to be whichever of `gid_t' or `int' is the
- base type of the array argument to `getgroups'.
- This macro caches the base type in the `ac_cv_type_getgroups'
- variable.
- -- Macro: AC_TYPE_INT8_T
- If `stdint.h' or `inttypes.h' does not define the type `int8_t',
- define `int8_t' to a signed integer type that is exactly 8 bits
- wide and that uses two's complement representation, if such a type
- exists. If you are worried about porting to hosts that lack such
- a type, you can use the results of this macro in C89-or-later code
- as follows:
- #if HAVE_STDINT_H
- # include <stdint.h>
- #endif
- #if defined INT8_MAX || defined int8_t
- _code using int8_t_
- #else
- _complicated alternative using >8-bit 'signed char'_
- #endif
- This macro caches the type in the `ac_cv_c_int8_t' variable.
- -- Macro: AC_TYPE_INT16_T
- This is like `AC_TYPE_INT8_T', except for 16-bit integers.
- -- Macro: AC_TYPE_INT32_T
- This is like `AC_TYPE_INT8_T', except for 32-bit integers.
- -- Macro: AC_TYPE_INT64_T
- This is like `AC_TYPE_INT8_T', except for 64-bit integers.
- -- Macro: AC_TYPE_INTMAX_T
- If `stdint.h' or `inttypes.h' defines the type `intmax_t', define
- `HAVE_INTMAX_T'. Otherwise, define `intmax_t' to the widest
- signed integer type.
- -- Macro: AC_TYPE_INTPTR_T
- If `stdint.h' or `inttypes.h' defines the type `intptr_t', define
- `HAVE_INTPTR_T'. Otherwise, define `intptr_t' to a signed integer
- type wide enough to hold a pointer, if such a type exists.
- -- Macro: AC_TYPE_LONG_DOUBLE
- If the C compiler supports a working `long double' type, define
- `HAVE_LONG_DOUBLE'. The `long double' type might have the same
- range and precision as `double'.
- This macro caches its result in the `ac_cv_type_long_double'
- variable.
- This macro is obsolescent, as current C compilers support `long
- double'. New programs need not use this macro.
- -- Macro: AC_TYPE_LONG_DOUBLE_WIDER
- If the C compiler supports a working `long double' type with more
- range or precision than the `double' type, define
- `HAVE_LONG_DOUBLE_WIDER'.
- This macro caches its result in the `ac_cv_type_long_double_wider'
- variable.
- -- Macro: AC_TYPE_LONG_LONG_INT
- If the C compiler supports a working `long long int' type, define
- `HAVE_LONG_LONG_INT'. However, this test does not test `long long
- int' values in preprocessor `#if' expressions, because too many
- compilers mishandle such expressions. *Note Preprocessor
- Arithmetic::.
- This macro caches its result in the `ac_cv_type_long_long_int'
- variable.
- -- Macro: AC_TYPE_MBSTATE_T
- Define `HAVE_MBSTATE_T' if `<wchar.h>' declares the `mbstate_t'
- type. Also, define `mbstate_t' to be a type if `<wchar.h>' does
- not declare it.
- This macro caches its result in the `ac_cv_type_mbstate_t'
- variable.
- -- Macro: AC_TYPE_MODE_T
- Define `mode_t' to a suitable type, if standard headers do not
- define it.
- This macro caches its result in the `ac_cv_type_mode_t' variable.
- -- Macro: AC_TYPE_OFF_T
- Define `off_t' to a suitable type, if standard headers do not
- define it.
- This macro caches its result in the `ac_cv_type_off_t' variable.
- -- Macro: AC_TYPE_PID_T
- Define `pid_t' to a suitable type, if standard headers do not
- define it.
- This macro caches its result in the `ac_cv_type_pid_t' variable.
- -- Macro: AC_TYPE_SIZE_T
- Define `size_t' to a suitable type, if standard headers do not
- define it.
- This macro caches its result in the `ac_cv_type_size_t' variable.
- -- Macro: AC_TYPE_SSIZE_T
- Define `ssize_t' to a suitable type, if standard headers do not
- define it.
- This macro caches its result in the `ac_cv_type_ssize_t' variable.
- -- Macro: AC_TYPE_UID_T
- Define `uid_t' and `gid_t' to suitable types, if standard headers
- do not define them.
- This macro caches its result in the `ac_cv_type_uid_t' variable.
- -- Macro: AC_TYPE_UINT8_T
- If `stdint.h' or `inttypes.h' does not define the type `uint8_t',
- define `uint8_t' to an unsigned integer type that is exactly 8
- bits wide, if such a type exists. This is like `AC_TYPE_INT8_T',
- except for unsigned integers.
- -- Macro: AC_TYPE_UINT16_T
- This is like `AC_TYPE_UINT8_T', except for 16-bit integers.
- -- Macro: AC_TYPE_UINT32_T
- This is like `AC_TYPE_UINT8_T', except for 32-bit integers.
- -- Macro: AC_TYPE_UINT64_T
- This is like `AC_TYPE_UINT8_T', except for 64-bit integers.
- -- Macro: AC_TYPE_UINTMAX_T
- If `stdint.h' or `inttypes.h' defines the type `uintmax_t', define
- `HAVE_UINTMAX_T'. Otherwise, define `uintmax_t' to the widest
- unsigned integer type.
- -- Macro: AC_TYPE_UINTPTR_T
- If `stdint.h' or `inttypes.h' defines the type `uintptr_t', define
- `HAVE_UINTPTR_T'. Otherwise, define `uintptr_t' to an unsigned
- integer type wide enough to hold a pointer, if such a type exists.
- -- Macro: AC_TYPE_UNSIGNED_LONG_LONG_INT
- If the C compiler supports a working `unsigned long long int' type,
- define `HAVE_UNSIGNED_LONG_LONG_INT'. However, this test does not
- test `unsigned long long int' values in preprocessor `#if'
- expressions, because too many compilers mishandle such expressions.
- *Note Preprocessor Arithmetic::.
- This macro caches its result in the
- `ac_cv_type_unsigned_long_long_int' variable.
- File: autoconf.info, Node: Generic Types, Prev: Particular Types, Up: Types
- 5.9.2 Generic Type Checks
- -------------------------
- These macros are used to check for types not covered by the "particular"
- test macros.
- -- Macro: AC_CHECK_TYPE (TYPE, [ACTION-IF-FOUND],
- [ACTION-IF-NOT-FOUND], [INCLUDES = `AC_INCLUDES_DEFAULT'])
- Check whether TYPE is defined. It may be a compiler builtin type
- or defined by the INCLUDES. INCLUDES is a series of include
- directives, defaulting to `AC_INCLUDES_DEFAULT' (*note Default
- Includes::), which are used prior to the type under test.
- In C, TYPE must be a type-name, so that the expression `sizeof
- (TYPE)' is valid (but `sizeof ((TYPE))' is not). The same test is
- applied when compiling for C++, which means that in C++ TYPE
- should be a type-id and should not be an anonymous `struct' or
- `union'.
- This macro caches its result in the `ac_cv_type_TYPE' variable,
- with `*' mapped to `p' and other characters not suitable for a
- variable name mapped to underscores.
- -- Macro: AC_CHECK_TYPES (TYPES, [ACTION-IF-FOUND],
- [ACTION-IF-NOT-FOUND], [INCLUDES = `AC_INCLUDES_DEFAULT'])
- For each TYPE of the TYPES that is defined, define `HAVE_TYPE' (in
- all capitals). Each TYPE must follow the rules of
- `AC_CHECK_TYPE'. If no INCLUDES are specified, the default
- includes are used (*note Default Includes::). If ACTION-IF-FOUND
- is given, it is additional shell code to execute when one of the
- types is found. If ACTION-IF-NOT-FOUND is given, it is executed
- when one of the types is not found.
- This macro uses M4 lists:
- AC_CHECK_TYPES([ptrdiff_t])
- AC_CHECK_TYPES([unsigned long long int, uintmax_t])
- AC_CHECK_TYPES([float_t], [], [], [[#include <math.h>]])
- Autoconf, up to 2.13, used to provide to another version of
- `AC_CHECK_TYPE', broken by design. In order to keep backward
- compatibility, a simple heuristic, quite safe but not totally, is
- implemented. In case of doubt, read the documentation of the former
- `AC_CHECK_TYPE', see *note Obsolete Macros::.
- File: autoconf.info, Node: Compilers and Preprocessors, Next: System Services, Prev: Types, Up: Existing Tests
- 5.10 Compilers and Preprocessors
- ================================
- All the tests for compilers (`AC_PROG_CC', `AC_PROG_CXX',
- `AC_PROG_F77') define the output variable `EXEEXT' based on the output
- of the compiler, typically to the empty string if Posix and `.exe' if a
- DOS variant.
- They also define the output variable `OBJEXT' based on the output of
- the compiler, after `.c' files have been excluded, typically to `o' if
- Posix, `obj' if a DOS variant.
- If the compiler being used does not produce executables, the tests
- fail. If the executables can't be run, and cross-compilation is not
- enabled, they fail too. *Note Manual Configuration::, for more on
- support for cross compiling.
- * Menu:
- * Specific Compiler Characteristics:: Some portability issues
- * Generic Compiler Characteristics:: Language independent tests and features
- * C Compiler:: Checking its characteristics
- * C++ Compiler:: Likewise
- * Objective C Compiler:: Likewise
- * Objective C++ Compiler:: Likewise
- * Erlang Compiler and Interpreter:: Likewise
- * Fortran Compiler:: Likewise
- * Go Compiler:: Likewise
- File: autoconf.info, Node: Specific Compiler Characteristics, Next: Generic Compiler Characteristics, Up: Compilers and Preprocessors
- 5.10.1 Specific Compiler Characteristics
- ----------------------------------------
- Some compilers exhibit different behaviors.
- Static/Dynamic Expressions
- Autoconf relies on a trick to extract one bit of information from
- the C compiler: using negative array sizes. For instance the
- following excerpt of a C source demonstrates how to test whether
- `int' objects are 4 bytes wide:
- static int test_array[sizeof (int) == 4 ? 1 : -1];
- To our knowledge, there is a single compiler that does not support
- this trick: the HP C compilers (the real ones, not only the
- "bundled") on HP-UX 11.00. They incorrectly reject the above
- program with the diagnostic "Variable-length arrays cannot have
- static storage." This bug comes from HP compilers' mishandling of
- `sizeof (int)', not from the `? 1 : -1', and Autoconf works around
- this problem by casting `sizeof (int)' to `long int' before
- comparing it.
- File: autoconf.info, Node: Generic Compiler Characteristics, Next: C Compiler, Prev: Specific Compiler Characteristics, Up: Compilers and Preprocessors
- 5.10.2 Generic Compiler Characteristics
- ---------------------------------------
- -- Macro: AC_CHECK_SIZEOF (TYPE-OR-EXPR, [UNUSED], [INCLUDES =
- `AC_INCLUDES_DEFAULT'])
- Define `SIZEOF_TYPE-OR-EXPR' (*note Standard Symbols::) to be the
- size in bytes of TYPE-OR-EXPR, which may be either a type or an
- expression returning a value that has a size. If the expression
- `sizeof (TYPE-OR-EXPR)' is invalid, the result is 0. INCLUDES is
- a series of include directives, defaulting to
- `AC_INCLUDES_DEFAULT' (*note Default Includes::), which are used
- prior to the expression under test.
- This macro now works even when cross-compiling. The UNUSED
- argument was used when cross-compiling.
- For example, the call
- AC_CHECK_SIZEOF([int *])
- defines `SIZEOF_INT_P' to be 8 on DEC Alpha AXP systems.
- This macro caches its result in the `ac_cv_sizeof_TYPE-OR-EXPR'
- variable, with `*' mapped to `p' and other characters not suitable
- for a variable name mapped to underscores.
- -- Macro: AC_CHECK_ALIGNOF (TYPE, [INCLUDES = `AC_INCLUDES_DEFAULT'])
- Define `ALIGNOF_TYPE' (*note Standard Symbols::) to be the
- alignment in bytes of TYPE. `TYPE y;' must be valid as a
- structure member declaration. If `type' is unknown, the result is
- 0. If no INCLUDES are specified, the default includes are used
- (*note Default Includes::).
- This macro caches its result in the `ac_cv_alignof_TYPE-OR-EXPR'
- variable, with `*' mapped to `p' and other characters not suitable
- for a variable name mapped to underscores.
- -- Macro: AC_COMPUTE_INT (VAR, EXPRESSION, [INCLUDES =
- `AC_INCLUDES_DEFAULT'], [ACTION-IF-FAILS])
- Store into the shell variable VAR the value of the integer
- EXPRESSION. The value should fit in an initializer in a C
- variable of type `signed long'. To support cross compilation (in
- which case, the macro only works on hosts that use twos-complement
- arithmetic), it should be possible to evaluate the expression at
- compile-time. If no INCLUDES are specified, the default includes
- are used (*note Default Includes::).
- Execute ACTION-IF-FAILS if the value cannot be determined
- correctly.
- -- Macro: AC_LANG_WERROR
- Normally Autoconf ignores warnings generated by the compiler,
- linker, and preprocessor. If this macro is used, warnings count
- as fatal errors for the current language. This macro is useful
- when the results of configuration are used where warnings are
- unacceptable; for instance, if parts of a program are built with
- the GCC `-Werror' option. If the whole program is built using
- `-Werror' it is often simpler to put `-Werror' in the compiler
- flags (`CFLAGS', etc.).
- -- Macro: AC_OPENMP
- OpenMP (http://www.openmp.org/) specifies extensions of C, C++,
- and Fortran that simplify optimization of shared memory
- parallelism, which is a common problem on multicore CPUs.
- If the current language is C, the macro `AC_OPENMP' sets the
- variable `OPENMP_CFLAGS' to the C compiler flags needed for
- supporting OpenMP. `OPENMP_CFLAGS' is set to empty if the
- compiler already supports OpenMP, if it has no way to activate
- OpenMP support, or if the user rejects OpenMP support by invoking
- `configure' with the `--disable-openmp' option.
- `OPENMP_CFLAGS' needs to be used when compiling programs, when
- preprocessing program source, and when linking programs.
- Therefore you need to add `$(OPENMP_CFLAGS)' to the `CFLAGS' of C
- programs that use OpenMP. If you preprocess OpenMP-specific C
- code, you also need to add `$(OPENMP_CFLAGS)' to `CPPFLAGS'. The
- presence of OpenMP support is revealed at compile time by the
- preprocessor macro `_OPENMP'.
- Linking a program with `OPENMP_CFLAGS' typically adds one more
- shared library to the program's dependencies, so its use is
- recommended only on programs that actually require OpenMP.
- If the current language is C++, `AC_OPENMP' sets the variable
- `OPENMP_CXXFLAGS', suitably for the C++ compiler. The same remarks
- hold as for C.
- If the current language is Fortran 77 or Fortran, `AC_OPENMP' sets
- the variable `OPENMP_FFLAGS' or `OPENMP_FCFLAGS', respectively.
- Similar remarks as for C hold, except that `CPPFLAGS' is not used
- for Fortran, and no preprocessor macro signals OpenMP support.
- For portability, it is best to avoid spaces between `#' and
- `pragma omp'. That is, write `#pragma omp', not `# pragma omp'.
- The Sun WorkShop 6.2 C compiler chokes on the latter.
- This macro caches its result in the `ac_cv_prog_c_openmp',
- `ac_cv_prog_cxx_openmp', `ac_cv_prog_f77_openmp', or
- `ac_cv_prog_fc_openmp' variable, depending on the current language.
- File: autoconf.info, Node: C Compiler, Next: C++ Compiler, Prev: Generic Compiler Characteristics, Up: Compilers and Preprocessors
- 5.10.3 C Compiler Characteristics
- ---------------------------------
- The following macros provide ways to find and exercise a C Compiler.
- There are a few constructs that ought to be avoided, but do not deserve
- being checked for, since they can easily be worked around.
- Don't use lines containing solitary backslashes
- They tickle a bug in the HP-UX C compiler (checked on HP-UX 10.20,
- 11.00, and 11i). When given the following source:
- #ifdef __STDC__
- /\
- * A comment with backslash-newlines in it. %{ %} *\
- \
- /
- char str[] = "\\
- " A string with backslash-newlines in it %{ %} \\
- "";
- char apostrophe = '\\
- \
- '\
- ';
- #endif
- the compiler incorrectly fails with the diagnostics
- "Non-terminating comment at end of file" and "Missing `#endif' at
- end of file." Removing the lines with solitary backslashes solves
- the problem.
- Don't compile several files at once if output matters to you
- Some compilers, such as HP's, report names of files being compiled
- when given more than one file operand. For instance:
- $ cc a.c b.c
- a.c:
- b.c:
- This can cause problems if you observe the output of the compiler
- to detect failures. Invoking `cc -c a.c && cc -c b.c && cc -o c
- a.o b.o' solves the issue.
- Don't rely on `#error' failing
- The IRIX C compiler does not fail when #error is preprocessed; it
- simply emits a diagnostic and continues, exiting successfully. So,
- instead of an error directive like `#error "Unsupported word size"'
- it is more portable to use an invalid directive like `#Unsupported
- word size' in Autoconf tests. In ordinary source code, `#error' is
- OK, since installers with inadequate compilers like IRIX can simply
- examine these compilers' diagnostic output.
- Don't rely on correct `#line' support
- On Solaris, `c89' (at least Sun C 5.3 through 5.8) diagnoses
- `#line' directives whose line numbers are greater than 32767.
- Nothing in Posix makes this invalid. That is why Autoconf stopped
- issuing `#line' directives.
- -- Macro: AC_PROG_CC ([COMPILER-SEARCH-LIST])
- Determine a C compiler to use. If `CC' is not already set in the
- environment, check for `gcc' and `cc', then for other C compilers.
- Set output variable `CC' to the name of the compiler found.
- This macro may, however, be invoked with an optional first argument
- which, if specified, must be a blank-separated list of C compilers
- to search for. This just gives the user an opportunity to specify
- an alternative search list for the C compiler. For example, if
- you didn't like the default order, then you could invoke
- `AC_PROG_CC' like this:
- AC_PROG_CC([gcc cl cc])
- If the C compiler does not handle function prototypes correctly by
- default, try to add an option to output variable `CC' to make it
- so. This macro tries various options that select
- standard-conformance modes on various systems.
- After calling this macro you can check whether the C compiler has
- been set to accept ANSI C89 (ISO C90); if not, the shell variable
- `ac_cv_prog_cc_c89' is set to `no'. See also `AC_C_PROTOTYPES'
- below.
- If using the GNU C compiler, set shell variable `GCC' to `yes'.
- If output variable `CFLAGS' was not already set, set it to `-g
- -O2' for the GNU C compiler (`-O2' on systems where GCC does not
- accept `-g'), or `-g' for other compilers. If your package does
- not like this default, then it is acceptable to insert the line `:
- ${CFLAGS=""}' after `AC_INIT' and before `AC_PROG_CC' to select an
- empty default instead.
- Many Autoconf macros use a compiler, and thus call
- `AC_REQUIRE([AC_PROG_CC])' to ensure that the compiler has been
- determined before the body of the outermost `AC_DEFUN' macro.
- Although `AC_PROG_CC' is safe to directly expand multiple times, it
- performs certain checks (such as the proper value of `EXEEXT') only
- on the first invocation. Therefore, care must be used when
- invoking this macro from within another macro rather than at the
- top level (*note Expanded Before Required::).
- -- Macro: AC_PROG_CC_C_O
- If the C compiler does not accept the `-c' and `-o' options
- simultaneously, define `NO_MINUS_C_MINUS_O'. This macro actually
- tests both the compiler found by `AC_PROG_CC', and, if different,
- the first `cc' in the path. The test fails if one fails. This
- macro was created for GNU Make to choose the default C compilation
- rule.
- For the compiler COMPILER, this macro caches its result in the
- `ac_cv_prog_cc_COMPILER_c_o' variable.
- -- Macro: AC_PROG_CPP
- Set output variable `CPP' to a command that runs the C
- preprocessor. If `$CC -E' doesn't work, `/lib/cpp' is used. It
- is only portable to run `CPP' on files with a `.c' extension.
- Some preprocessors don't indicate missing include files by the
- error status. For such preprocessors an internal variable is set
- that causes other macros to check the standard error from the
- preprocessor and consider the test failed if any warnings have
- been reported. For most preprocessors, though, warnings do not
- cause include-file tests to fail unless `AC_PROG_CPP_WERROR' is
- also specified.
- -- Macro: AC_PROG_CPP_WERROR
- This acts like `AC_PROG_CPP', except it treats warnings from the
- preprocessor as errors even if the preprocessor exit status
- indicates success. This is useful for avoiding headers that
- generate mandatory warnings, such as deprecation notices.
- The following macros check for C compiler or machine architecture
- features. To check for characteristics not listed here, use
- `AC_COMPILE_IFELSE' (*note Running the Compiler::) or `AC_RUN_IFELSE'
- (*note Runtime::).
- -- Macro: AC_PROG_CC_STDC
- If the C compiler cannot compile ISO Standard C (currently C99),
- try to add an option to output variable `CC' to make it work. If
- the compiler does not support C99, fall back to supporting ANSI
- C89 (ISO C90).
- After calling this macro you can check whether the C compiler has
- been set to accept Standard C; if not, the shell variable
- `ac_cv_prog_cc_stdc' is set to `no'.
- -- Macro: AC_PROG_CC_C89
- If the C compiler is not in ANSI C89 (ISO C90) mode by default,
- try to add an option to output variable `CC' to make it so. This
- macro tries various options that select ANSI C89 on some system or
- another, preferring extended functionality modes over strict
- conformance modes. It considers the compiler to be in ANSI C89
- mode if it handles function prototypes correctly.
- After calling this macro you can check whether the C compiler has
- been set to accept ANSI C89; if not, the shell variable
- `ac_cv_prog_cc_c89' is set to `no'.
- This macro is called automatically by `AC_PROG_CC'.
- -- Macro: AC_PROG_CC_C99
- If the C compiler is not in C99 mode by default, try to add an
- option to output variable `CC' to make it so. This macro tries
- various options that select C99 on some system or another,
- preferring extended functionality modes over strict conformance
- modes. It considers the compiler to be in C99 mode if it handles
- `_Bool', `//' comments, flexible array members, `inline', signed
- and unsigned `long long int', mixed code and declarations, named
- initialization of structs, `restrict', `va_copy', varargs macros,
- variable declarations in `for' loops, and variable length arrays.
- After calling this macro you can check whether the C compiler has
- been set to accept C99; if not, the shell variable
- `ac_cv_prog_cc_c99' is set to `no'.
- -- Macro: AC_C_BACKSLASH_A
- Define `HAVE_C_BACKSLASH_A' to 1 if the C compiler understands
- `\a'.
- This macro is obsolescent, as current C compilers understand `\a'.
- New programs need not use this macro.
- -- Macro: AC_C_BIGENDIAN ([ACTION-IF-TRUE], [ACTION-IF-FALSE],
- [ACTION-IF-UNKNOWN], [ACTION-IF-UNIVERSAL])
- If words are stored with the most significant byte first (like
- Motorola and SPARC CPUs), execute ACTION-IF-TRUE. If words are
- stored with the least significant byte first (like Intel and VAX
- CPUs), execute ACTION-IF-FALSE.
- This macro runs a test-case if endianness cannot be determined
- from the system header files. When cross-compiling, the test-case
- is not run but grep'ed for some magic values. ACTION-IF-UNKNOWN
- is executed if the latter case fails to determine the byte sex of
- the host system.
- In some cases a single run of a compiler can generate code for
- multiple architectures. This can happen, for example, when
- generating Mac OS X universal binary files, which work on both
- PowerPC and Intel architectures. In this case, the different
- variants might be for different architectures whose endiannesses
- differ. If `configure' detects this, it executes
- ACTION-IF-UNIVERSAL instead of ACTION-IF-UNKNOWN.
- The default for ACTION-IF-TRUE is to define `WORDS_BIGENDIAN'.
- The default for ACTION-IF-FALSE is to do nothing. The default for
- ACTION-IF-UNKNOWN is to abort configure and tell the installer how
- to bypass this test. And finally, the default for
- ACTION-IF-UNIVERSAL is to ensure that `WORDS_BIGENDIAN' is defined
- if and only if a universal build is detected and the current code
- is big-endian; this default works only if `autoheader' is used
- (*note autoheader Invocation::).
- If you use this macro without specifying ACTION-IF-UNIVERSAL, you
- should also use `AC_CONFIG_HEADERS'; otherwise `WORDS_BIGENDIAN'
- may be set incorrectly for Mac OS X universal binary files.
- -- Macro: AC_C_CONST
- If the C compiler does not fully support the `const' keyword,
- define `const' to be empty. Some C compilers that do not define
- `__STDC__' do support `const'; some compilers that define
- `__STDC__' do not completely support `const'. Programs can simply
- use `const' as if every C compiler supported it; for those that
- don't, the makefile or configuration header file defines it as
- empty.
- Occasionally installers use a C++ compiler to compile C code,
- typically because they lack a C compiler. This causes problems
- with `const', because C and C++ treat `const' differently. For
- example:
- const int foo;
- is valid in C but not in C++. These differences unfortunately
- cannot be papered over by defining `const' to be empty.
- If `autoconf' detects this situation, it leaves `const' alone, as
- this generally yields better results in practice. However, using a
- C++ compiler to compile C code is not recommended or supported, and
- installers who run into trouble in this area should get a C
- compiler like GCC to compile their C code.
- This macro caches its result in the `ac_cv_c_const' variable.
- This macro is obsolescent, as current C compilers support `const'.
- New programs need not use this macro.
- -- Macro: AC_C_RESTRICT
- If the C compiler recognizes a variant spelling for the `restrict'
- keyword (`__restrict', `__restrict__', or `_Restrict'), then
- define `restrict' to that; this is more likely to do the right
- thing with compilers that support language variants where plain
- `restrict' is not a keyword. Otherwise, if the C compiler
- recognizes the `restrict' keyword, don't do anything. Otherwise,
- define `restrict' to be empty. Thus, programs may simply use
- `restrict' as if every C compiler supported it; for those that do
- not, the makefile or configuration header defines it away.
- Although support in C++ for the `restrict' keyword is not
- required, several C++ compilers do accept the keyword. This macro
- works for them, too.
- This macro caches `no' in the `ac_cv_c_restrict' variable if
- `restrict' is not supported, and a supported spelling otherwise.
- -- Macro: AC_C_VOLATILE
- If the C compiler does not understand the keyword `volatile',
- define `volatile' to be empty. Programs can simply use `volatile'
- as if every C compiler supported it; for those that do not, the
- makefile or configuration header defines it as empty.
- If the correctness of your program depends on the semantics of
- `volatile', simply defining it to be empty does, in a sense, break
- your code. However, given that the compiler does not support
- `volatile', you are at its mercy anyway. At least your program
- compiles, when it wouldn't before. *Note Volatile Objects::, for
- more about `volatile'.
- In general, the `volatile' keyword is a standard C feature, so you
- might expect that `volatile' is available only when `__STDC__' is
- defined. However, Ultrix 4.3's native compiler does support
- volatile, but does not define `__STDC__'.
- This macro is obsolescent, as current C compilers support
- `volatile'. New programs need not use this macro.
- -- Macro: AC_C_INLINE
- If the C compiler supports the keyword `inline', do nothing.
- Otherwise define `inline' to `__inline__' or `__inline' if it
- accepts one of those, otherwise define `inline' to be empty.
- -- Macro: AC_C_CHAR_UNSIGNED
- If the C type `char' is unsigned, define `__CHAR_UNSIGNED__',
- unless the C compiler predefines it.
- These days, using this macro is not necessary. The same
- information can be determined by this portable alternative, thus
- avoiding the use of preprocessor macros in the namespace reserved
- for the implementation.
- #include <limits.h>
- #if CHAR_MIN == 0
- # define CHAR_UNSIGNED 1
- #endif
- -- Macro: AC_C_STRINGIZE
- If the C preprocessor supports the stringizing operator, define
- `HAVE_STRINGIZE'. The stringizing operator is `#' and is found in
- macros such as this:
- #define x(y) #y
- This macro is obsolescent, as current C compilers support the
- stringizing operator. New programs need not use this macro.
- -- Macro: AC_C_FLEXIBLE_ARRAY_MEMBER
- If the C compiler supports flexible array members, define
- `FLEXIBLE_ARRAY_MEMBER' to nothing; otherwise define it to 1.
- That way, a declaration like this:
- struct s
- {
- size_t n_vals;
- double val[FLEXIBLE_ARRAY_MEMBER];
- };
- will let applications use the "struct hack" even with compilers
- that do not support flexible array members. To allocate and use
- such an object, you can use code like this:
- size_t i;
- size_t n = compute_value_count ();
- struct s *p =
- malloc (offsetof (struct s, val)
- + n * sizeof (double));
- p->n_vals = n;
- for (i = 0; i < n; i++)
- p->val[i] = compute_value (i);
- -- Macro: AC_C_VARARRAYS
- If the C compiler supports variable-length arrays, define
- `HAVE_C_VARARRAYS'. A variable-length array is an array of
- automatic storage duration whose length is determined at run time,
- when the array is declared.
- -- Macro: AC_C_TYPEOF
- If the C compiler supports GCC's `typeof' syntax either directly or
- through a different spelling of the keyword (e.g., `__typeof__'),
- define `HAVE_TYPEOF'. If the support is available only through a
- different spelling, define `typeof' to that spelling.
- -- Macro: AC_C_PROTOTYPES
- If function prototypes are understood by the compiler (as
- determined by `AC_PROG_CC'), define `PROTOTYPES' and
- `__PROTOTYPES'. Defining `__PROTOTYPES' is for the benefit of
- header files that cannot use macros that infringe on user name
- space.
- This macro is obsolescent, as current C compilers support
- prototypes. New programs need not use this macro.
- -- Macro: AC_PROG_GCC_TRADITIONAL
- Add `-traditional' to output variable `CC' if using the GNU C
- compiler and `ioctl' does not work properly without
- `-traditional'. That usually happens when the fixed header files
- have not been installed on an old system.
- This macro is obsolescent, since current versions of the GNU C
- compiler fix the header files automatically when installed.
- File: autoconf.info, Node: C++ Compiler, Next: Objective C Compiler, Prev: C Compiler, Up: Compilers and Preprocessors
- 5.10.4 C++ Compiler Characteristics
- -----------------------------------
- -- Macro: AC_PROG_CXX ([COMPILER-SEARCH-LIST])
- Determine a C++ compiler to use. Check whether the environment
- variable `CXX' or `CCC' (in that order) is set; if so, then set
- output variable `CXX' to its value.
- Otherwise, if the macro is invoked without an argument, then
- search for a C++ compiler under the likely names (first `g++' and
- `c++' then other names). If none of those checks succeed, then as
- a last resort set `CXX' to `g++'.
- This macro may, however, be invoked with an optional first argument
- which, if specified, must be a blank-separated list of C++
- compilers to search for. This just gives the user an opportunity
- to specify an alternative search list for the C++ compiler. For
- example, if you didn't like the default order, then you could
- invoke `AC_PROG_CXX' like this:
- AC_PROG_CXX([gcc cl KCC CC cxx cc++ xlC aCC c++ g++])
- If using the GNU C++ compiler, set shell variable `GXX' to `yes'.
- If output variable `CXXFLAGS' was not already set, set it to `-g
- -O2' for the GNU C++ compiler (`-O2' on systems where G++ does not
- accept `-g'), or `-g' for other compilers. If your package does
- not like this default, then it is acceptable to insert the line `:
- ${CXXFLAGS=""}' after `AC_INIT' and before `AC_PROG_CXX' to select
- an empty default instead.
- -- Macro: AC_PROG_CXXCPP
- Set output variable `CXXCPP' to a command that runs the C++
- preprocessor. If `$CXX -E' doesn't work, `/lib/cpp' is used. It
- is portable to run `CXXCPP' only on files with a `.c', `.C',
- `.cc', or `.cpp' extension.
- Some preprocessors don't indicate missing include files by the
- error status. For such preprocessors an internal variable is set
- that causes other macros to check the standard error from the
- preprocessor and consider the test failed if any warnings have
- been reported. However, it is not known whether such broken
- preprocessors exist for C++.
- -- Macro: AC_PROG_CXX_C_O
- Test whether the C++ compiler accepts the options `-c' and `-o'
- simultaneously, and define `CXX_NO_MINUS_C_MINUS_O', if it does
- not.
- File: autoconf.info, Node: Objective C Compiler, Next: Objective C++ Compiler, Prev: C++ Compiler, Up: Compilers and Preprocessors
- 5.10.5 Objective C Compiler Characteristics
- -------------------------------------------
- -- Macro: AC_PROG_OBJC ([COMPILER-SEARCH-LIST])
- Determine an Objective C compiler to use. If `OBJC' is not already
- set in the environment, check for Objective C compilers. Set
- output variable `OBJC' to the name of the compiler found.
- This macro may, however, be invoked with an optional first argument
- which, if specified, must be a blank-separated list of Objective C
- compilers to search for. This just gives the user an opportunity
- to specify an alternative search list for the Objective C
- compiler. For example, if you didn't like the default order, then
- you could invoke `AC_PROG_OBJC' like this:
- AC_PROG_OBJC([gcc objcc objc])
- If using the GNU Objective C compiler, set shell variable `GOBJC'
- to `yes'. If output variable `OBJCFLAGS' was not already set, set
- it to `-g -O2' for the GNU Objective C compiler (`-O2' on systems
- where `gcc' does not accept `-g'), or `-g' for other compilers.
- -- Macro: AC_PROG_OBJCPP
- Set output variable `OBJCPP' to a command that runs the Objective C
- preprocessor. If `$OBJC -E' doesn't work, `/lib/cpp' is used.
- File: autoconf.info, Node: Objective C++ Compiler, Next: Erlang Compiler and Interpreter, Prev: Objective C Compiler, Up: Compilers and Preprocessors
- 5.10.6 Objective C++ Compiler Characteristics
- ---------------------------------------------
- -- Macro: AC_PROG_OBJCXX ([COMPILER-SEARCH-LIST])
- Determine an Objective C++ compiler to use. If `OBJCXX' is not
- already set in the environment, check for Objective C++ compilers.
- Set output variable `OBJCXX' to the name of the compiler found.
- This macro may, however, be invoked with an optional first argument
- which, if specified, must be a blank-separated list of Objective
- C++ compilers to search for. This just gives the user an
- opportunity to specify an alternative search list for the
- Objective C++ compiler. For example, if you didn't like the
- default order, then you could invoke `AC_PROG_OBJCXX' like this:
- AC_PROG_OBJCXX([gcc g++ objcc++ objcxx])
- If using the GNU Objective C++ compiler, set shell variable
- `GOBJCXX' to `yes'. If output variable `OBJCXXFLAGS' was not
- already set, set it to `-g -O2' for the GNU Objective C++ compiler
- (`-O2' on systems where `gcc' does not accept `-g'), or `-g' for
- other compilers.
- -- Macro: AC_PROG_OBJCXXCPP
- Set output variable `OBJCXXCPP' to a command that runs the
- Objective C++ preprocessor. If `$OBJCXX -E' doesn't work,
- `/lib/cpp' is used.
- File: autoconf.info, Node: Erlang Compiler and Interpreter, Next: Fortran Compiler, Prev: Objective C++ Compiler, Up: Compilers and Preprocessors
- 5.10.7 Erlang Compiler and Interpreter Characteristics
- ------------------------------------------------------
- Autoconf defines the following macros for determining paths to the
- essential Erlang/OTP programs:
- -- Macro: AC_ERLANG_PATH_ERLC ([VALUE-IF-NOT-FOUND], [PATH = `$PATH'])
- Determine an Erlang compiler to use. If `ERLC' is not already set
- in the environment, check for `erlc'. Set output variable `ERLC'
- to the complete path of the compiler command found. In addition,
- if `ERLCFLAGS' is not set in the environment, set it to an empty
- value.
- The two optional arguments have the same meaning as the two last
- arguments of macro `AC_PATH_PROG' for looking for the `erlc'
- program. For example, to look for `erlc' only in the
- `/usr/lib/erlang/bin' directory:
- AC_ERLANG_PATH_ERLC([not found], [/usr/lib/erlang/bin])
- -- Macro: AC_ERLANG_NEED_ERLC ([PATH = `$PATH'])
- A simplified variant of the `AC_ERLANG_PATH_ERLC' macro, that
- prints an error message and exits the `configure' script if the
- `erlc' program is not found.
- -- Macro: AC_ERLANG_PATH_ERL ([VALUE-IF-NOT-FOUND], [PATH = `$PATH'])
- Determine an Erlang interpreter to use. If `ERL' is not already
- set in the environment, check for `erl'. Set output variable
- `ERL' to the complete path of the interpreter command found.
- The two optional arguments have the same meaning as the two last
- arguments of macro `AC_PATH_PROG' for looking for the `erl'
- program. For example, to look for `erl' only in the
- `/usr/lib/erlang/bin' directory:
- AC_ERLANG_PATH_ERL([not found], [/usr/lib/erlang/bin])
- -- Macro: AC_ERLANG_NEED_ERL ([PATH = `$PATH'])
- A simplified variant of the `AC_ERLANG_PATH_ERL' macro, that
- prints an error message and exits the `configure' script if the
- `erl' program is not found.
- File: autoconf.info, Node: Fortran Compiler, Next: Go Compiler, Prev: Erlang Compiler and Interpreter, Up: Compilers and Preprocessors
- 5.10.8 Fortran Compiler Characteristics
- ---------------------------------------
- The Autoconf Fortran support is divided into two categories: legacy
- Fortran 77 macros (`F77'), and modern Fortran macros (`FC'). The
- former are intended for traditional Fortran 77 code, and have output
- variables like `F77', `FFLAGS', and `FLIBS'. The latter are for newer
- programs that can (or must) compile under the newer Fortran standards,
- and have output variables like `FC', `FCFLAGS', and `FCLIBS'.
- Except for the macros `AC_FC_SRCEXT', `AC_FC_FREEFORM',
- `AC_FC_FIXEDFORM', and `AC_FC_LINE_LENGTH' (see below), the `FC' and
- `F77' macros behave almost identically, and so they are documented
- together in this section.
- -- Macro: AC_PROG_F77 ([COMPILER-SEARCH-LIST])
- Determine a Fortran 77 compiler to use. If `F77' is not already
- set in the environment, then check for `g77' and `f77', and then
- some other names. Set the output variable `F77' to the name of
- the compiler found.
- This macro may, however, be invoked with an optional first argument
- which, if specified, must be a blank-separated list of Fortran 77
- compilers to search for. This just gives the user an opportunity
- to specify an alternative search list for the Fortran 77 compiler.
- For example, if you didn't like the default order, then you could
- invoke `AC_PROG_F77' like this:
- AC_PROG_F77([fl32 f77 fort77 xlf g77 f90 xlf90])
- If using `g77' (the GNU Fortran 77 compiler), then set the shell
- variable `G77' to `yes'. If the output variable `FFLAGS' was not
- already set in the environment, then set it to `-g -02' for `g77'
- (or `-O2' where `g77' does not accept `-g'). Otherwise, set
- `FFLAGS' to `-g' for all other Fortran 77 compilers.
- The result of the GNU test is cached in the
- `ac_cv_f77_compiler_gnu' variable, acceptance of `-g' in the
- `ac_cv_prog_f77_g' variable.
- -- Macro: AC_PROG_FC ([COMPILER-SEARCH-LIST], [DIALECT])
- Determine a Fortran compiler to use. If `FC' is not already set in
- the environment, then `dialect' is a hint to indicate what Fortran
- dialect to search for; the default is to search for the newest
- available dialect. Set the output variable `FC' to the name of
- the compiler found.
- By default, newer dialects are preferred over older dialects, but
- if `dialect' is specified then older dialects are preferred
- starting with the specified dialect. `dialect' can currently be
- one of Fortran 77, Fortran 90, or Fortran 95. However, this is
- only a hint of which compiler _name_ to prefer (e.g., `f90' or
- `f95'), and no attempt is made to guarantee that a particular
- language standard is actually supported. Thus, it is preferable
- that you avoid the `dialect' option, and use AC_PROG_FC only for
- code compatible with the latest Fortran standard.
- This macro may, alternatively, be invoked with an optional first
- argument which, if specified, must be a blank-separated list of
- Fortran compilers to search for, just as in `AC_PROG_F77'.
- If using `gfortran' or `g77' (the GNU Fortran compilers), then set
- the shell variable `GFC' to `yes'. If the output variable
- `FCFLAGS' was not already set in the environment, then set it to
- `-g -02' for GNU `g77' (or `-O2' where `g77' does not accept
- `-g'). Otherwise, set `FCFLAGS' to `-g' for all other Fortran
- compilers.
- The result of the GNU test is cached in the `ac_cv_fc_compiler_gnu'
- variable, acceptance of `-g' in the `ac_cv_prog_fc_g' variable.
- -- Macro: AC_PROG_F77_C_O
- -- Macro: AC_PROG_FC_C_O
- Test whether the Fortran compiler accepts the options `-c' and
- `-o' simultaneously, and define `F77_NO_MINUS_C_MINUS_O' or
- `FC_NO_MINUS_C_MINUS_O', respectively, if it does not.
- The result of the test is cached in the `ac_cv_prog_f77_c_o' or
- `ac_cv_prog_fc_c_o' variable, respectively.
- The following macros check for Fortran compiler characteristics. To
- check for characteristics not listed here, use `AC_COMPILE_IFELSE'
- (*note Running the Compiler::) or `AC_RUN_IFELSE' (*note Runtime::),
- making sure to first set the current language to Fortran 77 or Fortran
- via `AC_LANG([Fortran 77])' or `AC_LANG(Fortran)' (*note Language
- Choice::).
- -- Macro: AC_F77_LIBRARY_LDFLAGS
- -- Macro: AC_FC_LIBRARY_LDFLAGS
- Determine the linker flags (e.g., `-L' and `-l') for the "Fortran
- intrinsic and runtime libraries" that are required to successfully
- link a Fortran program or shared library. The output variable
- `FLIBS' or `FCLIBS' is set to these flags (which should be
- included after `LIBS' when linking).
- This macro is intended to be used in those situations when it is
- necessary to mix, e.g., C++ and Fortran source code in a single
- program or shared library (*note Mixing Fortran 77 With C and C++:
- (automake)Mixing Fortran 77 With C and C++.).
- For example, if object files from a C++ and Fortran compiler must
- be linked together, then the C++ compiler/linker must be used for
- linking (since special C++-ish things need to happen at link time
- like calling global constructors, instantiating templates,
- enabling exception support, etc.).
- However, the Fortran intrinsic and runtime libraries must be
- linked in as well, but the C++ compiler/linker doesn't know by
- default how to add these Fortran 77 libraries. Hence, this macro
- was created to determine these Fortran libraries.
- The macros `AC_F77_DUMMY_MAIN' and `AC_FC_DUMMY_MAIN' or
- `AC_F77_MAIN' and `AC_FC_MAIN' are probably also necessary to link
- C/C++ with Fortran; see below. Further, it is highly recommended
- that you use `AC_CONFIG_HEADERS' (*note Configuration Headers::)
- because the complex defines that the function wrapper macros create
- may not work with C/C++ compiler drivers.
- These macros internally compute the flag needed to verbose linking
- output and cache it in `ac_cv_prog_f77_v' or `ac_cv_prog_fc_v'
- variables, respectively. The computed linker flags are cached in
- `ac_cv_f77_libs' or `ac_cv_fc_libs', respectively.
- -- Macro: AC_F77_DUMMY_MAIN ([ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND =
- `AC_MSG_FAILURE'])
- -- Macro: AC_FC_DUMMY_MAIN ([ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND =
- `AC_MSG_FAILURE'])
- With many compilers, the Fortran libraries detected by
- `AC_F77_LIBRARY_LDFLAGS' or `AC_FC_LIBRARY_LDFLAGS' provide their
- own `main' entry function that initializes things like Fortran
- I/O, and which then calls a user-provided entry function named
- (say) `MAIN__' to run the user's program. The `AC_F77_DUMMY_MAIN'
- and `AC_FC_DUMMY_MAIN' or `AC_F77_MAIN' and `AC_FC_MAIN' macros
- figure out how to deal with this interaction.
- When using Fortran for purely numerical functions (no I/O, etc.)
- often one prefers to provide one's own `main' and skip the Fortran
- library initializations. In this case, however, one may still
- need to provide a dummy `MAIN__' routine in order to prevent
- linking errors on some systems. `AC_F77_DUMMY_MAIN' or
- `AC_FC_DUMMY_MAIN' detects whether any such routine is _required_
- for linking, and what its name is; the shell variable
- `F77_DUMMY_MAIN' or `FC_DUMMY_MAIN' holds this name, `unknown'
- when no solution was found, and `none' when no such dummy main is
- needed.
- By default, ACTION-IF-FOUND defines `F77_DUMMY_MAIN' or
- `FC_DUMMY_MAIN' to the name of this routine (e.g., `MAIN__') _if_
- it is required. ACTION-IF-NOT-FOUND defaults to exiting with an
- error.
- In order to link with Fortran routines, the user's C/C++ program
- should then include the following code to define the dummy main if
- it is needed:
- #ifdef F77_DUMMY_MAIN
- # ifdef __cplusplus
- extern "C"
- # endif
- int F77_DUMMY_MAIN () { return 1; }
- #endif
- (Replace `F77' with `FC' for Fortran instead of Fortran 77.)
- Note that this macro is called automatically from `AC_F77_WRAPPERS'
- or `AC_FC_WRAPPERS'; there is generally no need to call it
- explicitly unless one wants to change the default actions.
- The result of this macro is cached in the `ac_cv_f77_dummy_main' or
- `ac_cv_fc_dummy_main' variable, respectively.
- -- Macro: AC_F77_MAIN
- -- Macro: AC_FC_MAIN
- As discussed above, many Fortran libraries allow you to provide an
- entry point called (say) `MAIN__' instead of the usual `main',
- which is then called by a `main' function in the Fortran libraries
- that initializes things like Fortran I/O. The `AC_F77_MAIN' and
- `AC_FC_MAIN' macros detect whether it is _possible_ to utilize
- such an alternate main function, and defines `F77_MAIN' and
- `FC_MAIN' to the name of the function. (If no alternate main
- function name is found, `F77_MAIN' and `FC_MAIN' are simply
- defined to `main'.)
- Thus, when calling Fortran routines from C that perform things
- like I/O, one should use this macro and declare the "main"
- function like so:
- #ifdef __cplusplus
- extern "C"
- #endif
- int F77_MAIN (int argc, char *argv[]);
- (Again, replace `F77' with `FC' for Fortran instead of Fortran 77.)
- The result of this macro is cached in the `ac_cv_f77_main' or
- `ac_cv_fc_main' variable, respectively.
- -- Macro: AC_F77_WRAPPERS
- -- Macro: AC_FC_WRAPPERS
- Defines C macros `F77_FUNC (name, NAME)', `FC_FUNC (name, NAME)',
- `F77_FUNC_(name, NAME)', and `FC_FUNC_(name, NAME)' to properly
- mangle the names of C/C++ identifiers, and identifiers with
- underscores, respectively, so that they match the name-mangling
- scheme used by the Fortran compiler.
- Fortran is case-insensitive, and in order to achieve this the
- Fortran compiler converts all identifiers into a canonical case
- and format. To call a Fortran subroutine from C or to write a C
- function that is callable from Fortran, the C program must
- explicitly use identifiers in the format expected by the Fortran
- compiler. In order to do this, one simply wraps all C identifiers
- in one of the macros provided by `AC_F77_WRAPPERS' or
- `AC_FC_WRAPPERS'. For example, suppose you have the following
- Fortran 77 subroutine:
- subroutine foobar (x, y)
- double precision x, y
- y = 3.14159 * x
- return
- end
- You would then declare its prototype in C or C++ as:
- #define FOOBAR_F77 F77_FUNC (foobar, FOOBAR)
- #ifdef __cplusplus
- extern "C" /* prevent C++ name mangling */
- #endif
- void FOOBAR_F77 (double *x, double *y);
- Note that we pass both the lowercase and uppercase versions of the
- function name to `F77_FUNC' so that it can select the right one.
- Note also that all parameters to Fortran 77 routines are passed as
- pointers (*note Mixing Fortran 77 With C and C++: (automake)Mixing
- Fortran 77 With C and C++.).
- (Replace `F77' with `FC' for Fortran instead of Fortran 77.)
- Although Autoconf tries to be intelligent about detecting the
- name-mangling scheme of the Fortran compiler, there may be Fortran
- compilers that it doesn't support yet. In this case, the above
- code generates a compile-time error, but some other behavior
- (e.g., disabling Fortran-related features) can be induced by
- checking whether `F77_FUNC' or `FC_FUNC' is defined.
- Now, to call that routine from a C program, we would do something
- like:
- {
- double x = 2.7183, y;
- FOOBAR_F77 (&x, &y);
- }
- If the Fortran identifier contains an underscore (e.g., `foo_bar'),
- you should use `F77_FUNC_' or `FC_FUNC_' instead of `F77_FUNC' or
- `FC_FUNC' (with the same arguments). This is because some Fortran
- compilers mangle names differently if they contain an underscore.
- The name mangling scheme is encoded in the `ac_cv_f77_mangling' or
- `ac_cv_fc_mangling' cache variable, respectively, and also used for
- the `AC_F77_FUNC' and `AC_FC_FUNC' macros described below.
- -- Macro: AC_F77_FUNC (NAME, [SHELLVAR])
- -- Macro: AC_FC_FUNC (NAME, [SHELLVAR])
- Given an identifier NAME, set the shell variable SHELLVAR to hold
- the mangled version NAME according to the rules of the Fortran
- linker (see also `AC_F77_WRAPPERS' or `AC_FC_WRAPPERS'). SHELLVAR
- is optional; if it is not supplied, the shell variable is simply
- NAME. The purpose of this macro is to give the caller a way to
- access the name-mangling information other than through the C
- preprocessor as above, for example, to call Fortran routines from
- some language other than C/C++.
- -- Macro: AC_FC_SRCEXT (EXT, [ACTION-IF-SUCCESS], [ACTION-IF-FAILURE =
- `AC_MSG_FAILURE'])
- -- Macro: AC_FC_PP_SRCEXT (EXT, [ACTION-IF-SUCCESS],
- [ACTION-IF-FAILURE = `AC_MSG_FAILURE'])
- By default, the `FC' macros perform their tests using a `.f'
- extension for source-code files. Some compilers, however, only
- enable newer language features for appropriately named files,
- e.g., Fortran 90 features only for `.f90' files, or preprocessing
- only with `.F' files or maybe other upper-case extensions. On the
- other hand, some other compilers expect all source files to end in
- `.f' and require special flags to support other file name
- extensions. The `AC_FC_SRCEXT' and `AC_FC_PP_SRCEXT' macros deal
- with these issues.
- The `AC_FC_SRCEXT' macro tries to get the `FC' compiler to accept
- files ending with the extension `.EXT' (i.e., EXT does _not_
- contain the dot). If any special compiler flags are needed for
- this, it stores them in the output variable `FCFLAGS_EXT'. This
- extension and these flags are then used for all subsequent `FC'
- tests (until `AC_FC_SRCEXT' or `AC_FC_PP_SRCEXT' is called another
- time).
- For example, you would use `AC_FC_SRCEXT(f90)' to employ the
- `.f90' extension in future tests, and it would set the
- `FCFLAGS_f90' output variable with any extra flags that are needed
- to compile such files.
- Similarly, the `AC_FC_PP_SRCEXT' macro tries to get the `FC'
- compiler to preprocess and compile files with the extension
- `.EXT'. When both `fpp' and `cpp' style preprocessing are
- provided, the former is preferred, as the latter may treat
- continuation lines, `//' tokens, and white space differently from
- what some Fortran dialects expect. Conversely, if you do not want
- files to be preprocessed, use only lower-case characters in the
- file name extension. Like with `AC_FC_SRCEXT(f90)', any needed
- flags are stored in the `FCFLAGS_EXT' variable.
- The `FCFLAGS_EXT' flags can _not_ be simply absorbed into
- `FCFLAGS', for two reasons based on the limitations of some
- compilers. First, only one `FCFLAGS_EXT' can be used at a time,
- so files with different extensions must be compiled separately.
- Second, `FCFLAGS_EXT' must appear _immediately_ before the
- source-code file name when compiling. So, continuing the example
- above, you might compile a `foo.f90' file in your makefile with the
- command:
- foo.o: foo.f90
- $(FC) -c $(FCFLAGS) $(FCFLAGS_f90) '$(srcdir)/foo.f90'
- If `AC_FC_SRCEXT' or `AC_FC_PP_SRCEXT' succeeds in compiling files
- with the EXT extension, it calls ACTION-IF-SUCCESS (defaults to
- nothing). If it fails, and cannot find a way to make the `FC'
- compiler accept such files, it calls ACTION-IF-FAILURE (defaults
- to exiting with an error message).
- The `AC_FC_SRCEXT' and `AC_FC_PP_SRCEXT' macros cache their
- results in `ac_cv_fc_srcext_EXT' and `ac_cv_fc_pp_srcext_EXT'
- variables, respectively.
- -- Macro: AC_FC_PP_DEFINE ([ACTION-IF-SUCCESS], [ACTION-IF-FAILURE =
- `AC_MSG_FAILURE'])
- Find a flag to specify defines for preprocessed Fortran. Not all
- Fortran compilers use `-D'. Substitute `FC_DEFINE' with the
- result and call ACTION-IF-SUCCESS (defaults to nothing) if
- successful, and ACTION-IF-FAILURE (defaults to failing with an
- error message) if not.
- This macro calls `AC_FC_PP_SRCEXT([F])' in order to learn how to
- preprocess a `conftest.F' file, but restores a previously used
- Fortran source file extension afterwards again.
- The result of this test is cached in the `ac_cv_fc_pp_define'
- variable.
- -- Macro: AC_FC_FREEFORM ([ACTION-IF-SUCCESS], [ACTION-IF-FAILURE =
- `AC_MSG_FAILURE'])
- Try to ensure that the Fortran compiler (`$FC') allows free-format
- source code (as opposed to the older fixed-format style from
- Fortran 77). If necessary, it may add some additional flags to
- `FCFLAGS'.
- This macro is most important if you are using the default `.f'
- extension, since many compilers interpret this extension as
- indicating fixed-format source unless an additional flag is
- supplied. If you specify a different extension with
- `AC_FC_SRCEXT', such as `.f90', then `AC_FC_FREEFORM' ordinarily
- succeeds without modifying `FCFLAGS'. For extensions which the
- compiler does not know about, the flag set by the `AC_FC_SRCEXT'
- macro might let the compiler assume Fortran 77 by default, however.
- If `AC_FC_FREEFORM' succeeds in compiling free-form source, it
- calls ACTION-IF-SUCCESS (defaults to nothing). If it fails, it
- calls ACTION-IF-FAILURE (defaults to exiting with an error
- message).
- The result of this test, or `none' or `unknown', is cached in the
- `ac_cv_fc_freeform' variable.
- -- Macro: AC_FC_FIXEDFORM ([ACTION-IF-SUCCESS], [ACTION-IF-FAILURE =
- `AC_MSG_FAILURE'])
- Try to ensure that the Fortran compiler (`$FC') allows the old
- fixed-format source code (as opposed to free-format style). If
- necessary, it may add some additional flags to `FCFLAGS'.
- This macro is needed for some compilers alias names like `xlf95'
- which assume free-form source code by default, and in case you
- want to use fixed-form source with an extension like `.f90' which
- many compilers interpret as free-form by default. If you specify
- a different extension with `AC_FC_SRCEXT', such as `.f', then
- `AC_FC_FIXEDFORM' ordinarily succeeds without modifying `FCFLAGS'.
- If `AC_FC_FIXEDFORM' succeeds in compiling fixed-form source, it
- calls ACTION-IF-SUCCESS (defaults to nothing). If it fails, it
- calls ACTION-IF-FAILURE (defaults to exiting with an error
- message).
- The result of this test, or `none' or `unknown', is cached in the
- `ac_cv_fc_fixedform' variable.
- -- Macro: AC_FC_LINE_LENGTH ([LENGTH], [ACTION-IF-SUCCESS],
- [ACTION-IF-FAILURE = `AC_MSG_FAILURE'])
- Try to ensure that the Fortran compiler (`$FC') accepts long source
- code lines. The LENGTH argument may be given as 80, 132, or
- unlimited, and defaults to 132. Note that line lengths above 254
- columns are not portable, and some compilers do not accept more
- than 132 columns at least for fixed format source. If necessary,
- it may add some additional flags to `FCFLAGS'.
- If `AC_FC_LINE_LENGTH' succeeds in compiling fixed-form source, it
- calls ACTION-IF-SUCCESS (defaults to nothing). If it fails, it
- calls ACTION-IF-FAILURE (defaults to exiting with an error
- message).
- The result of this test, or `none' or `unknown', is cached in the
- `ac_cv_fc_line_length' variable.
- -- Macro: AC_FC_CHECK_BOUNDS ([ACTION-IF-SUCCESS], [ACTION-IF-FAILURE
- = `AC_MSG_FAILURE'])
- The `AC_FC_CHECK_BOUNDS' macro tries to enable array bounds
- checking in the Fortran compiler. If successful, the
- ACTION-IF-SUCCESS is called and any needed flags are added to
- `FCFLAGS'. Otherwise, ACTION-IF-FAILURE is called, which defaults
- to failing with an error message. The macro currently requires
- Fortran 90 or a newer dialect.
- The result of the macro is cached in the `ac_cv_fc_check_bounds'
- variable.
- -- Macro: AC_F77_IMPLICIT_NONE ([ACTION-IF-SUCCESS],
- [ACTION-IF-FAILURE = `AC_MSG_FAILURE'])
- -- Macro: AC_FC_IMPLICIT_NONE ([ACTION-IF-SUCCESS], [ACTION-IF-FAILURE
- = `AC_MSG_FAILURE'])
- Try to disallow implicit declarations in the Fortran compiler. If
- successful, ACTION-IF-SUCCESS is called and any needed flags are
- added to `FFLAGS' or `FCFLAGS', respectively. Otherwise,
- ACTION-IF-FAILURE is called, which defaults to failing with an
- error message.
- The result of these macros are cached in the
- `ac_cv_f77_implicit_none' and `ac_cv_fc_implicit_none' variables,
- respectively.
- -- Macro: AC_FC_MODULE_EXTENSION
- Find the Fortran 90 module file name extension. Most Fortran 90
- compilers store module information in files separate from the
- object files. The module files are usually named after the name
- of the module rather than the source file name, with characters
- possibly turned to upper case, plus an extension, often `.mod'.
- Not all compilers use module files at all, or by default. The Cray
- Fortran compiler requires `-e m' in order to store and search
- module information in `.mod' files rather than in object files.
- Likewise, the Fujitsu Fortran compilers uses the `-Am' option to
- indicate how module information is stored.
- The `AC_FC_MODULE_EXTENSION' macro computes the module extension
- without the leading dot, and stores that in the `FC_MODEXT'
- variable. If the compiler does not produce module files, or the
- extension cannot be determined, `FC_MODEXT' is empty. Typically,
- the result of this macro may be used in cleanup `make' rules as
- follows:
- clean-modules:
- -test -z "$(FC_MODEXT)" || rm -f *.$(FC_MODEXT)
- The extension, or `unknown', is cached in the
- `ac_cv_fc_module_ext' variable.
- -- Macro: AC_FC_MODULE_FLAG ([ACTION-IF-SUCCESS], [ACTION-IF-FAILURE =
- `AC_MSG_FAILURE'])
- Find the compiler flag to include Fortran 90 module information
- from another directory, and store that in the `FC_MODINC' variable.
- Call ACTION-IF-SUCCESS (defaults to nothing) if successful, and
- set `FC_MODINC' to empty and call ACTION-IF-FAILURE (defaults to
- exiting with an error message) if not.
- Most Fortran 90 compilers provide a way to specify module
- directories. Some have separate flags for the directory to write
- module files to, and directories to search them in, whereas others
- only allow writing to the current directory or to the first
- directory specified in the include path. Further, with some
- compilers, the module search path and the preprocessor search path
- can only be modified with the same flag. Thus, for portability,
- write module files to the current directory only and list that as
- first directory in the search path.
- There may be no whitespace between `FC_MODINC' and the following
- directory name, but `FC_MODINC' may contain trailing white space.
- For example, if you use Automake and would like to search `../lib'
- for module files, you can use the following:
- AM_FCFLAGS = $(FC_MODINC). $(FC_MODINC)../lib
- Inside `configure' tests, you can use:
- if test -n "$FC_MODINC"; then
- FCFLAGS="$FCFLAGS $FC_MODINC. $FC_MODINC../lib"
- fi
- The flag is cached in the `ac_cv_fc_module_flag' variable. The
- substituted value of `FC_MODINC' may refer to the `ac_empty' dummy
- placeholder empty variable, to avoid losing the significant
- trailing whitespace in a `Makefile'.
- -- Macro: AC_FC_MODULE_OUTPUT_FLAG ([ACTION-IF-SUCCESS],
- [ACTION-IF-FAILURE = `AC_MSG_FAILURE'])
- Find the compiler flag to write Fortran 90 module information to
- another directory, and store that in the `FC_MODOUT' variable.
- Call ACTION-IF-SUCCESS (defaults to nothing) if successful, and
- set `FC_MODOUT' to empty and call ACTION-IF-FAILURE (defaults to
- exiting with an error message) if not.
- Not all Fortran 90 compilers write module files, and of those that
- do, not all allow writing to a directory other than the current
- one, nor do all have separate flags for writing and reading; see
- the description of `AC_FC_MODULE_FLAG' above. If you need to be
- able to write to another directory, for maximum portability use
- `FC_MODOUT' before any `FC_MODINC' and include both the current
- directory and the one you write to in the search path:
- AM_FCFLAGS = $(FC_MODOUT)../mod $(FC_MODINC)../mod $(FC_MODINC). ...
- The flag is cached in the `ac_cv_fc_module_output_flag' variable.
- The substituted value of `FC_MODOUT' may refer to the `ac_empty'
- dummy placeholder empty variable, to avoid losing the significant
- trailing whitespace in a `Makefile'.
- File: autoconf.info, Node: Go Compiler, Prev: Fortran Compiler, Up: Compilers and Preprocessors
- 5.10.9 Go Compiler Characteristics
- ----------------------------------
- Autoconf provides basic support for the Go programming language when
- using the `gccgo' compiler (there is currently no support for the `6g'
- and `8g' compilers).
- -- Macro: AC_PROG_GO ([COMPILER-SEARCH-LIST])
- Find the Go compiler to use. Check whether the environment
- variable `GOC' is set; if so, then set output variable `GOC' to its
- value.
- Otherwise, if the macro is invoked without an argument, then
- search for a Go compiler named `gccgo'. If it is not found, then
- as a last resort set `GOC' to `gccgo'.
- This macro may be invoked with an optional first argument which, if
- specified, must be a blank-separated list of Go compilers to
- search for.
- If output variable `GOFLAGS' was not already set, set it to `-g
- -O2'. If your package does not like this default, `GOFLAGS' may
- be set before `AC_PROG_GO'.
- File: autoconf.info, Node: System Services, Next: Posix Variants, Prev: Compilers and Preprocessors, Up: Existing Tests
- 5.11 System Services
- ====================
- The following macros check for operating system services or
- capabilities.
- -- Macro: AC_PATH_X
- Try to locate the X Window System include files and libraries. If
- the user gave the command line options `--x-includes=DIR' and
- `--x-libraries=DIR', use those directories.
- If either or both were not given, get the missing values by running
- `xmkmf' (or an executable pointed to by the `XMKMF' environment
- variable) on a trivial `Imakefile' and examining the makefile that
- it produces. Setting `XMKMF' to `false' disables this method.
- If this method fails to find the X Window System, `configure'
- looks for the files in several directories where they often reside.
- If either method is successful, set the shell variables
- `x_includes' and `x_libraries' to their locations, unless they are
- in directories the compiler searches by default.
- If both methods fail, or the user gave the command line option
- `--without-x', set the shell variable `no_x' to `yes'; otherwise
- set it to the empty string.
- -- Macro: AC_PATH_XTRA
- An enhanced version of `AC_PATH_X'. It adds the C compiler flags
- that X needs to output variable `X_CFLAGS', and the X linker flags
- to `X_LIBS'. Define `X_DISPLAY_MISSING' if X is not available.
- This macro also checks for special libraries that some systems
- need in order to compile X programs. It adds any that the system
- needs to output variable `X_EXTRA_LIBS'. And it checks for
- special X11R6 libraries that need to be linked with before
- `-lX11', and adds any found to the output variable `X_PRE_LIBS'.
- -- Macro: AC_SYS_INTERPRETER
- Check whether the system supports starting scripts with a line of
- the form `#!/bin/sh' to select the interpreter to use for the
- script. After running this macro, shell code in `configure.ac'
- can check the shell variable `interpval'; it is set to `yes' if
- the system supports `#!', `no' if not.
- -- Macro: AC_SYS_LARGEFILE
- Arrange for 64-bit file offsets, known as large-file support
- (http://www.unix-systems.org/version2/whatsnew/lfs20mar.html). On
- some hosts, one must use special compiler options to build
- programs that can access large files. Append any such options to
- the output variable `CC'. Define `_FILE_OFFSET_BITS' and
- `_LARGE_FILES' if necessary.
- Large-file support can be disabled by configuring with the
- `--disable-largefile' option.
- If you use this macro, check that your program works even when
- `off_t' is wider than `long int', since this is common when
- large-file support is enabled. For example, it is not correct to
- print an arbitrary `off_t' value `X' with `printf ("%ld", (long
- int) X)'.
- The LFS introduced the `fseeko' and `ftello' functions to replace
- their C counterparts `fseek' and `ftell' that do not use `off_t'.
- Take care to use `AC_FUNC_FSEEKO' to make their prototypes
- available when using them and large-file support is enabled.
- -- Macro: AC_SYS_LONG_FILE_NAMES
- If the system supports file names longer than 14 characters, define
- `HAVE_LONG_FILE_NAMES'.
- -- Macro: AC_SYS_POSIX_TERMIOS
- Check to see if the Posix termios headers and functions are
- available on the system. If so, set the shell variable
- `ac_cv_sys_posix_termios' to `yes'. If not, set the variable to
- `no'.
- File: autoconf.info, Node: Posix Variants, Next: Erlang Libraries, Prev: System Services, Up: Existing Tests
- 5.12 Posix Variants
- ===================
- The following macro makes it possible to use features of Posix that are
- extensions to C, as well as platform extensions not defined by Posix.
- -- Macro: AC_USE_SYSTEM_EXTENSIONS
- This macro was introduced in Autoconf 2.60. If possible, enable
- extensions to C or Posix on hosts that normally disable the
- extensions, typically due to standards-conformance namespace
- issues. This should be called before any macros that run the C
- compiler. The following preprocessor macros are defined where
- appropriate:
- `_GNU_SOURCE'
- Enable extensions on GNU/Linux.
- `__EXTENSIONS__'
- Enable general extensions on Solaris.
- `_POSIX_PTHREAD_SEMANTICS'
- Enable threading extensions on Solaris.
- `_TANDEM_SOURCE'
- Enable extensions for the HP NonStop platform.
- `_ALL_SOURCE'
- Enable extensions for AIX 3, and for Interix.
- `_POSIX_SOURCE'
- Enable Posix functions for Minix.
- `_POSIX_1_SOURCE'
- Enable additional Posix functions for Minix.
- `_MINIX'
- Identify Minix platform. This particular preprocessor macro
- is obsolescent, and may be removed in a future release of
- Autoconf.
- File: autoconf.info, Node: Erlang Libraries, Prev: Posix Variants, Up: Existing Tests
- 5.13 Erlang Libraries
- =====================
- The following macros check for an installation of Erlang/OTP, and for
- the presence of certain Erlang libraries. All those macros require the
- configuration of an Erlang interpreter and an Erlang compiler (*note
- Erlang Compiler and Interpreter::).
- -- Macro: AC_ERLANG_SUBST_ERTS_VER
- Set the output variable `ERLANG_ERTS_VER' to the version of the
- Erlang runtime system (as returned by Erlang's
- `erlang:system_info(version)' function). The result of this test
- is cached if caching is enabled when running `configure'. The
- `ERLANG_ERTS_VER' variable is not intended to be used for testing
- for features of specific ERTS versions, but to be used for
- substituting the ERTS version in Erlang/OTP release resource files
- (`.rel' files), as shown below.
- -- Macro: AC_ERLANG_SUBST_ROOT_DIR
- Set the output variable `ERLANG_ROOT_DIR' to the path to the base
- directory in which Erlang/OTP is installed (as returned by Erlang's
- `code:root_dir/0' function). The result of this test is cached if
- caching is enabled when running `configure'.
- -- Macro: AC_ERLANG_SUBST_LIB_DIR
- Set the output variable `ERLANG_LIB_DIR' to the path of the library
- directory of Erlang/OTP (as returned by Erlang's `code:lib_dir/0'
- function), which subdirectories each contain an installed
- Erlang/OTP library. The result of this test is cached if caching
- is enabled when running `configure'.
- -- Macro: AC_ERLANG_CHECK_LIB (LIBRARY, [ACTION-IF-FOUND],
- [ACTION-IF-NOT-FOUND])
- Test whether the Erlang/OTP library LIBRARY is installed by
- calling Erlang's `code:lib_dir/1' function. The result of this
- test is cached if caching is enabled when running `configure'.
- ACTION-IF-FOUND is a list of shell commands to run if the library
- is installed; ACTION-IF-NOT-FOUND is a list of shell commands to
- run if it is not. Additionally, if the library is installed, the
- output variable `ERLANG_LIB_DIR_LIBRARY' is set to the path to the
- library installation directory, and the output variable
- `ERLANG_LIB_VER_LIBRARY' is set to the version number that is part
- of the subdirectory name, if it is in the standard form
- (`LIBRARY-VERSION'). If the directory name does not have a
- version part, `ERLANG_LIB_VER_LIBRARY' is set to the empty string.
- If the library is not installed, `ERLANG_LIB_DIR_LIBRARY' and
- `ERLANG_LIB_VER_LIBRARY' are set to `"not found"'. For example,
- to check if library `stdlib' is installed:
- AC_ERLANG_CHECK_LIB([stdlib],
- [echo "stdlib version \"$ERLANG_LIB_VER_stdlib\""
- echo "is installed in \"$ERLANG_LIB_DIR_stdlib\""],
- [AC_MSG_ERROR([stdlib was not found!])])
- The `ERLANG_LIB_VER_LIBRARY' variables (set by
- `AC_ERLANG_CHECK_LIB') and the `ERLANG_ERTS_VER' variable (set by
- `AC_ERLANG_SUBST_ERTS_VER') are not intended to be used for
- testing for features of specific versions of libraries or of the
- Erlang runtime system. Those variables are intended to be
- substituted in Erlang release resource files (`.rel' files). For
- instance, to generate a `example.rel' file for an application
- depending on the `stdlib' library, `configure.ac' could contain:
- AC_ERLANG_SUBST_ERTS_VER
- AC_ERLANG_CHECK_LIB([stdlib],
- [],
- [AC_MSG_ERROR([stdlib was not found!])])
- AC_CONFIG_FILES([example.rel])
- The `example.rel.in' file used to generate `example.rel' should
- contain:
- {release,
- {"@PACKAGE@", "@VERSION@"},
- {erts, "@ERLANG_ERTS_VER@"},
- [{stdlib, "@ERLANG_LIB_VER_stdlib@"},
- {@PACKAGE@, "@VERSION@"}]}.
- In addition to the above macros, which test installed Erlang
- libraries, the following macros determine the paths to the directories
- into which newly built Erlang libraries are to be installed:
- -- Macro: AC_ERLANG_SUBST_INSTALL_LIB_DIR
- Set the `ERLANG_INSTALL_LIB_DIR' output variable to the directory
- into which every built Erlang library should be installed in a
- separate subdirectory. If this variable is not set in the
- environment when `configure' runs, its default value is
- `${libdir}/erlang/lib'.
- -- Macro: AC_ERLANG_SUBST_INSTALL_LIB_SUBDIR (LIBRARY, VERSION)
- Set the `ERLANG_INSTALL_LIB_DIR_LIBRARY' output variable to the
- directory into which the built Erlang library LIBRARY version
- VERSION should be installed. If this variable is not set in the
- environment when `configure' runs, its default value is
- `$ERLANG_INSTALL_LIB_DIR/LIBRARY-VERSION', the value of the
- `ERLANG_INSTALL_LIB_DIR' variable being set by the
- `AC_ERLANG_SUBST_INSTALL_LIB_DIR' macro.
- File: autoconf.info, Node: Writing Tests, Next: Results, Prev: Existing Tests, Up: Top
- 6 Writing Tests
- ***************
- If the existing feature tests don't do something you need, you have to
- write new ones. These macros are the building blocks. They provide
- ways for other macros to check whether various kinds of features are
- available and report the results.
- This chapter contains some suggestions and some of the reasons why
- the existing tests are written the way they are. You can also learn a
- lot about how to write Autoconf tests by looking at the existing ones.
- If something goes wrong in one or more of the Autoconf tests, this
- information can help you understand the assumptions behind them, which
- might help you figure out how to best solve the problem.
- These macros check the output of the compiler system of the current
- language (*note Language Choice::). They do not cache the results of
- their tests for future use (*note Caching Results::), because they don't
- know enough about the information they are checking for to generate a
- cache variable name. They also do not print any messages, for the same
- reason. The checks for particular kinds of features call these macros
- and do cache their results and print messages about what they're
- checking for.
- When you write a feature test that could be applicable to more than
- one software package, the best thing to do is encapsulate it in a new
- macro. *Note Writing Autoconf Macros::, for how to do that.
- * Menu:
- * Language Choice:: Selecting which language to use for testing
- * Writing Test Programs:: Forging source files for compilers
- * Running the Preprocessor:: Detecting preprocessor symbols
- * Running the Compiler:: Detecting language or header features
- * Running the Linker:: Detecting library features
- * Runtime:: Testing for runtime features
- * Systemology:: A zoology of operating systems
- * Multiple Cases:: Tests for several possible values
- File: autoconf.info, Node: Language Choice, Next: Writing Test Programs, Up: Writing Tests
- 6.1 Language Choice
- ===================
- Autoconf-generated `configure' scripts check for the C compiler and its
- features by default. Packages that use other programming languages
- (maybe more than one, e.g., C and C++) need to test features of the
- compilers for the respective languages. The following macros determine
- which programming language is used in the subsequent tests in
- `configure.ac'.
- -- Macro: AC_LANG (LANGUAGE)
- Do compilation tests using the compiler, preprocessor, and file
- extensions for the specified LANGUAGE.
- Supported languages are:
- `C'
- Do compilation tests using `CC' and `CPP' and use extension
- `.c' for test programs. Use compilation flags: `CPPFLAGS'
- with `CPP', and both `CPPFLAGS' and `CFLAGS' with `CC'.
- `C++'
- Do compilation tests using `CXX' and `CXXCPP' and use
- extension `.C' for test programs. Use compilation flags:
- `CPPFLAGS' with `CXXCPP', and both `CPPFLAGS' and `CXXFLAGS'
- with `CXX'.
- `Fortran 77'
- Do compilation tests using `F77' and use extension `.f' for
- test programs. Use compilation flags: `FFLAGS'.
- `Fortran'
- Do compilation tests using `FC' and use extension `.f' (or
- whatever has been set by `AC_FC_SRCEXT') for test programs.
- Use compilation flags: `FCFLAGS'.
- `Erlang'
- Compile and execute tests using `ERLC' and `ERL' and use
- extension `.erl' for test Erlang modules. Use compilation
- flags: `ERLCFLAGS'.
- `Objective C'
- Do compilation tests using `OBJC' and `OBJCPP' and use
- extension `.m' for test programs. Use compilation flags:
- `CPPFLAGS' with `OBJCPP', and both `CPPFLAGS' and `OBJCFLAGS'
- with `OBJC'.
- `Objective C++'
- Do compilation tests using `OBJCXX' and `OBJCXXCPP' and use
- extension `.mm' for test programs. Use compilation flags:
- `CPPFLAGS' with `OBJCXXCPP', and both `CPPFLAGS' and
- `OBJCXXFLAGS' with `OBJCXX'.
- `Go'
- Do compilation tests using `GOC' and use extension `.go' for
- test programs. Use compilation flags `GOFLAGS'.
- -- Macro: AC_LANG_PUSH (LANGUAGE)
- Remember the current language (as set by `AC_LANG') on a stack, and
- then select the LANGUAGE. Use this macro and `AC_LANG_POP' in
- macros that need to temporarily switch to a particular language.
- -- Macro: AC_LANG_POP ([LANGUAGE])
- Select the language that is saved on the top of the stack, as set
- by `AC_LANG_PUSH', and remove it from the stack.
- If given, LANGUAGE specifies the language we just _quit_. It is a
- good idea to specify it when it's known (which should be the
- case...), since Autoconf detects inconsistencies.
- AC_LANG_PUSH([Fortran 77])
- # Perform some tests on Fortran 77.
- # ...
- AC_LANG_POP([Fortran 77])
- -- Macro: AC_LANG_ASSERT (LANGUAGE)
- Check statically that the current language is LANGUAGE. You
- should use this in your language specific macros to avoid that
- they be called with an inappropriate language.
- This macro runs only at `autoconf' time, and incurs no cost at
- `configure' time. Sadly enough and because Autoconf is a two
- layer language (1), the macros `AC_LANG_PUSH' and `AC_LANG_POP'
- cannot be "optimizing", therefore as much as possible you ought to
- avoid using them to wrap your code, rather, require from the user
- to run the macro with a correct current language, and check it
- with `AC_LANG_ASSERT'. And anyway, that may help the user
- understand she is running a Fortran macro while expecting a result
- about her Fortran 77 compiler...
- -- Macro: AC_REQUIRE_CPP
- Ensure that whichever preprocessor would currently be used for
- tests has been found. Calls `AC_REQUIRE' (*note Prerequisite
- Macros::) with an argument of either `AC_PROG_CPP' or
- `AC_PROG_CXXCPP', depending on which language is current.
- ---------- Footnotes ----------
- (1) Because M4 is not aware of Sh code, especially conditionals,
- some optimizations that look nice statically may produce incorrect
- results at runtime.
- File: autoconf.info, Node: Writing Test Programs, Next: Running the Preprocessor, Prev: Language Choice, Up: Writing Tests
- 6.2 Writing Test Programs
- =========================
- Autoconf tests follow a common scheme: feed some program with some
- input, and most of the time, feed a compiler with some source file.
- This section is dedicated to these source samples.
- * Menu:
- * Guidelines:: General rules for writing test programs
- * Test Functions:: Avoiding pitfalls in test programs
- * Generating Sources:: Source program boilerplate
- File: autoconf.info, Node: Guidelines, Next: Test Functions, Up: Writing Test Programs
- 6.2.1 Guidelines for Test Programs
- ----------------------------------
- The most important rule to follow when writing testing samples is:
- _Look for realism._
- This motto means that testing samples must be written with the same
- strictness as real programs are written. In particular, you should
- avoid "shortcuts" and simplifications.
- Don't just play with the preprocessor if you want to prepare a
- compilation. For instance, using `cpp' to check whether a header is
- functional might let your `configure' accept a header which causes some
- _compiler_ error. Do not hesitate to check a header with other headers
- included before, especially required headers.
- Make sure the symbols you use are properly defined, i.e., refrain
- from simply declaring a function yourself instead of including the
- proper header.
- Test programs should not write to standard output. They should exit
- with status 0 if the test succeeds, and with status 1 otherwise, so
- that success can be distinguished easily from a core dump or other
- failure; segmentation violations and other failures produce a nonzero
- exit status. Unless you arrange for `exit' to be declared, test
- programs should `return', not `exit', from `main', because on many
- systems `exit' is not declared by default.
- Test programs can use `#if' or `#ifdef' to check the values of
- preprocessor macros defined by tests that have already run. For
- example, if you call `AC_HEADER_STDBOOL', then later on in
- `configure.ac' you can have a test program that includes `stdbool.h'
- conditionally:
- #ifdef HAVE_STDBOOL_H
- # include <stdbool.h>
- #endif
- Both `#if HAVE_STDBOOL_H' and `#ifdef HAVE_STDBOOL_H' will work with
- any standard C compiler. Some developers prefer `#if' because it is
- easier to read, while others prefer `#ifdef' because it avoids
- diagnostics with picky compilers like GCC with the `-Wundef' option.
- If a test program needs to use or create a data file, give it a name
- that starts with `conftest', such as `conftest.data'. The `configure'
- script cleans up by running `rm -f -r conftest*' after running test
- programs and if the script is interrupted.
- File: autoconf.info, Node: Test Functions, Next: Generating Sources, Prev: Guidelines, Up: Writing Test Programs
- 6.2.2 Test Functions
- --------------------
- These days it's safe to assume support for function prototypes
- (introduced in C89).
- Functions that test programs declare should also be conditionalized
- for C++, which requires `extern "C"' prototypes. Make sure to not
- include any header files containing clashing prototypes.
- #ifdef __cplusplus
- extern "C"
- #endif
- void *valloc (size_t);
- If a test program calls a function with invalid parameters (just to
- see whether it exists), organize the program to ensure that it never
- invokes that function. You can do this by calling it in another
- function that is never invoked. You can't do it by putting it after a
- call to `exit', because GCC version 2 knows that `exit' never returns
- and optimizes out any code that follows it in the same block.
- If you include any header files, be sure to call the functions
- relevant to them with the correct number of arguments, even if they are
- just 0, to avoid compilation errors due to prototypes. GCC version 2
- has internal prototypes for several functions that it automatically
- inlines; for example, `memcpy'. To avoid errors when checking for
- them, either pass them the correct number of arguments or redeclare them
- with a different return type (such as `char').
- File: autoconf.info, Node: Generating Sources, Prev: Test Functions, Up: Writing Test Programs
- 6.2.3 Generating Sources
- ------------------------
- Autoconf provides a set of macros that can be used to generate test
- source files. They are written to be language generic, i.e., they
- actually depend on the current language (*note Language Choice::) to
- "format" the output properly.
- -- Macro: AC_LANG_CONFTEST (SOURCE)
- Save the SOURCE text in the current test source file:
- `conftest.EXTENSION' where the EXTENSION depends on the current
- language. As of Autoconf 2.63b, the source file also contains the
- results of all of the `AC_DEFINE' performed so far.
- Note that the SOURCE is evaluated exactly once, like regular
- Autoconf macro arguments, and therefore (i) you may pass a macro
- invocation, (ii) if not, be sure to double quote if needed.
- This macro issues a warning during `autoconf' processing if SOURCE
- does not include an expansion of the macro
- `AC_LANG_DEFINES_PROVIDED' (note that both `AC_LANG_SOURCE' and
- `AC_LANG_PROGRAM' call this macro, and thus avoid the warning).
- This macro is seldom called directly, but is used under the hood
- by more common macros such as `AC_COMPILE_IFELSE' and
- `AC_RUN_IFELSE'.
- -- Macro: AC_LANG_DEFINES_PROVIDED
- This macro is called as a witness that the file
- `conftest.EXTENSION' appropriate for the current language is
- complete, including all previously determined results from
- `AC_DEFINE'. This macro is seldom called directly, but exists if
- you have a compelling reason to write a conftest file without using
- `AC_LANG_SOURCE', yet still want to avoid a syntax warning from
- `AC_LANG_CONFTEST'.
- -- Macro: AC_LANG_SOURCE (SOURCE)
- Expands into the SOURCE, with the definition of all the
- `AC_DEFINE' performed so far. This macro includes an expansion of
- `AC_LANG_DEFINES_PROVIDED'.
- In many cases, you may find it more convenient to use the wrapper
- `AC_LANG_PROGRAM'.
- For instance, executing (observe the double quotation!):
- AC_INIT([Hello], [1.0], [bug-hello@example.org], [],
- [http://www.example.org/])
- AC_DEFINE([HELLO_WORLD], ["Hello, World\n"],
- [Greetings string.])
- AC_LANG([C])
- AC_LANG_CONFTEST(
- [AC_LANG_SOURCE([[const char hw[] = "Hello, World\n";]])])
- gcc -E -dD conftest.c
- on a system with `gcc' installed, results in:
- ...
- # 1 "conftest.c"
- #define PACKAGE_NAME "Hello"
- #define PACKAGE_TARNAME "hello"
- #define PACKAGE_VERSION "1.0"
- #define PACKAGE_STRING "Hello 1.0"
- #define PACKAGE_BUGREPORT "bug-hello@example.org"
- #define PACKAGE_URL "http://www.example.org/"
- #define HELLO_WORLD "Hello, World\n"
- const char hw[] = "Hello, World\n";
- When the test language is Fortran, Erlang, or Go, the `AC_DEFINE'
- definitions are not automatically translated into constants in the
- source code by this macro.
- -- Macro: AC_LANG_PROGRAM (PROLOGUE, BODY)
- Expands into a source file which consists of the PROLOGUE, and
- then BODY as body of the main function (e.g., `main' in C). Since
- it uses `AC_LANG_SOURCE', the features of the latter are available.
- For instance:
- AC_INIT([Hello], [1.0], [bug-hello@example.org], [],
- [http://www.example.org/])
- AC_DEFINE([HELLO_WORLD], ["Hello, World\n"],
- [Greetings string.])
- AC_LANG_CONFTEST(
- [AC_LANG_PROGRAM([[const char hw[] = "Hello, World\n";]],
- [[fputs (hw, stdout);]])])
- gcc -E -dD conftest.c
- on a system with `gcc' installed, results in:
- ...
- # 1 "conftest.c"
- #define PACKAGE_NAME "Hello"
- #define PACKAGE_TARNAME "hello"
- #define PACKAGE_VERSION "1.0"
- #define PACKAGE_STRING "Hello 1.0"
- #define PACKAGE_BUGREPORT "bug-hello@example.org"
- #define PACKAGE_URL "http://www.example.org/"
- #define HELLO_WORLD "Hello, World\n"
- const char hw[] = "Hello, World\n";
- int
- main ()
- {
- fputs (hw, stdout);
- ;
- return 0;
- }
- In Erlang tests, the created source file is that of an Erlang module
- called `conftest' (`conftest.erl'). This module defines and exports at
- least one `start/0' function, which is called to perform the test. The
- PROLOGUE is optional code that is inserted between the module header and
- the `start/0' function definition. BODY is the body of the `start/0'
- function without the final period (*note Runtime::, about constraints
- on this function's behavior).
- For instance:
- AC_INIT([Hello], [1.0], [bug-hello@example.org])
- AC_LANG(Erlang)
- AC_LANG_CONFTEST(
- [AC_LANG_PROGRAM([[-define(HELLO_WORLD, "Hello, world!").]],
- [[io:format("~s~n", [?HELLO_WORLD])]])])
- cat conftest.erl
- results in:
- -module(conftest).
- -export([start/0]).
- -define(HELLO_WORLD, "Hello, world!").
- start() ->
- io:format("~s~n", [?HELLO_WORLD])
- .
- -- Macro: AC_LANG_CALL (PROLOGUE, FUNCTION)
- Expands into a source file which consists of the PROLOGUE, and
- then a call to the FUNCTION as body of the main function (e.g.,
- `main' in C). Since it uses `AC_LANG_PROGRAM', the feature of the
- latter are available.
- This function will probably be replaced in the future by a version
- which would enable specifying the arguments. The use of this
- macro is not encouraged, as it violates strongly the typing system.
- This macro cannot be used for Erlang tests.
- -- Macro: AC_LANG_FUNC_LINK_TRY (FUNCTION)
- Expands into a source file which uses the FUNCTION in the body of
- the main function (e.g., `main' in C). Since it uses
- `AC_LANG_PROGRAM', the features of the latter are available.
- As `AC_LANG_CALL', this macro is documented only for completeness.
- It is considered to be severely broken, and in the future will be
- removed in favor of actual function calls (with properly typed
- arguments).
- This macro cannot be used for Erlang tests.
- File: autoconf.info, Node: Running the Preprocessor, Next: Running the Compiler, Prev: Writing Test Programs, Up: Writing Tests
- 6.3 Running the Preprocessor
- ============================
- Sometimes one might need to run the preprocessor on some source file.
- _Usually it is a bad idea_, as you typically need to _compile_ your
- project, not merely run the preprocessor on it; therefore you certainly
- want to run the compiler, not the preprocessor. Resist the temptation
- of following the easiest path.
- Nevertheless, if you need to run the preprocessor, then use
- `AC_PREPROC_IFELSE'.
- The macros described in this section cannot be used for tests in
- Erlang, Fortran, or Go, since those languages require no preprocessor.
- -- Macro: AC_PREPROC_IFELSE (INPUT, [ACTION-IF-TRUE],
- [ACTION-IF-FALSE])
- Run the preprocessor of the current language (*note Language
- Choice::) on the INPUT, run the shell commands ACTION-IF-TRUE on
- success, ACTION-IF-FALSE otherwise. The INPUT can be made by
- `AC_LANG_PROGRAM' and friends.
- This macro uses `CPPFLAGS', but not `CFLAGS', because `-g', `-O',
- etc. are not valid options to many C preprocessors.
- It is customary to report unexpected failures with
- `AC_MSG_FAILURE'. If needed, ACTION-IF-TRUE can further access
- the preprocessed output in the file `conftest.i'.
- For instance:
- AC_INIT([Hello], [1.0], [bug-hello@example.org])
- AC_DEFINE([HELLO_WORLD], ["Hello, World\n"],
- [Greetings string.])
- AC_PREPROC_IFELSE(
- [AC_LANG_PROGRAM([[const char hw[] = "Hello, World\n";]],
- [[fputs (hw, stdout);]])],
- [AC_MSG_RESULT([OK])],
- [AC_MSG_FAILURE([unexpected preprocessor failure])])
- results in:
- checking for gcc... gcc
- checking for C compiler default output file name... a.out
- checking whether the C compiler works... yes
- checking whether we are cross compiling... no
- checking for suffix of executables...
- checking for suffix of object files... o
- checking whether we are using the GNU C compiler... yes
- checking whether gcc accepts -g... yes
- checking for gcc option to accept ISO C89... none needed
- checking how to run the C preprocessor... gcc -E
- OK
- The macro `AC_TRY_CPP' (*note Obsolete Macros::) used to play the
- role of `AC_PREPROC_IFELSE', but double quotes its argument, making it
- impossible to use it to elaborate sources. You are encouraged to get
- rid of your old use of the macro `AC_TRY_CPP' in favor of
- `AC_PREPROC_IFELSE', but, in the first place, are you sure you need to
- run the _preprocessor_ and not the compiler?
- -- Macro: AC_EGREP_HEADER (PATTERN, HEADER-FILE, ACTION-IF-FOUND,
- [ACTION-IF-NOT-FOUND])
- If the output of running the preprocessor on the system header file
- HEADER-FILE matches the extended regular expression PATTERN,
- execute shell commands ACTION-IF-FOUND, otherwise execute
- ACTION-IF-NOT-FOUND.
- -- Macro: AC_EGREP_CPP (PATTERN, PROGRAM, [ACTION-IF-FOUND],
- [ACTION-IF-NOT-FOUND])
- PROGRAM is the text of a C or C++ program, on which shell
- variable, back quote, and backslash substitutions are performed.
- If the output of running the preprocessor on PROGRAM matches the
- extended regular expression PATTERN, execute shell commands
- ACTION-IF-FOUND, otherwise execute ACTION-IF-NOT-FOUND.
- File: autoconf.info, Node: Running the Compiler, Next: Running the Linker, Prev: Running the Preprocessor, Up: Writing Tests
- 6.4 Running the Compiler
- ========================
- To check for a syntax feature of the current language's (*note Language
- Choice::) compiler, such as whether it recognizes a certain keyword, or
- simply to try some library feature, use `AC_COMPILE_IFELSE' to try to
- compile a small program that uses that feature.
- -- Macro: AC_COMPILE_IFELSE (INPUT, [ACTION-IF-TRUE],
- [ACTION-IF-FALSE])
- Run the compiler and compilation flags of the current language
- (*note Language Choice::) on the INPUT, run the shell commands
- ACTION-IF-TRUE on success, ACTION-IF-FALSE otherwise. The INPUT
- can be made by `AC_LANG_PROGRAM' and friends.
- It is customary to report unexpected failures with
- `AC_MSG_FAILURE'. This macro does not try to link; use
- `AC_LINK_IFELSE' if you need to do that (*note Running the
- Linker::). If needed, ACTION-IF-TRUE can further access the
- just-compiled object file `conftest.$OBJEXT'.
- This macro uses `AC_REQUIRE' for the compiler associated with the
- current language, which means that if the compiler has not yet been
- determined, the compiler determination will be made prior to the
- body of the outermost `AC_DEFUN' macro that triggered this macro to
- expand (*note Expanded Before Required::).
- For tests in Erlang, the INPUT must be the source code of a module
- named `conftest'. `AC_COMPILE_IFELSE' generates a `conftest.beam' file
- that can be interpreted by the Erlang virtual machine (`ERL'). It is
- recommended to use `AC_LANG_PROGRAM' to specify the test program, to
- ensure that the Erlang module has the right name.
- File: autoconf.info, Node: Running the Linker, Next: Runtime, Prev: Running the Compiler, Up: Writing Tests
- 6.5 Running the Linker
- ======================
- To check for a library, a function, or a global variable, Autoconf
- `configure' scripts try to compile and link a small program that uses
- it. This is unlike Metaconfig, which by default uses `nm' or `ar' on
- the C library to try to figure out which functions are available.
- Trying to link with the function is usually a more reliable approach
- because it avoids dealing with the variations in the options and output
- formats of `nm' and `ar' and in the location of the standard libraries.
- It also allows configuring for cross-compilation or checking a
- function's runtime behavior if needed. On the other hand, it can be
- slower than scanning the libraries once, but accuracy is more important
- than speed.
- `AC_LINK_IFELSE' is used to compile test programs to test for
- functions and global variables. It is also used by `AC_CHECK_LIB' to
- check for libraries (*note Libraries::), by adding the library being
- checked for to `LIBS' temporarily and trying to link a small program.
- -- Macro: AC_LINK_IFELSE (INPUT, [ACTION-IF-TRUE], [ACTION-IF-FALSE])
- Run the compiler (and compilation flags) and the linker of the
- current language (*note Language Choice::) on the INPUT, run the
- shell commands ACTION-IF-TRUE on success, ACTION-IF-FALSE
- otherwise. The INPUT can be made by `AC_LANG_PROGRAM' and
- friends. If needed, ACTION-IF-TRUE can further access the
- just-linked program file `conftest$EXEEXT'.
- `LDFLAGS' and `LIBS' are used for linking, in addition to the
- current compilation flags.
- It is customary to report unexpected failures with
- `AC_MSG_FAILURE'. This macro does not try to execute the program;
- use `AC_RUN_IFELSE' if you need to do that (*note Runtime::).
- The `AC_LINK_IFELSE' macro cannot be used for Erlang tests, since
- Erlang programs are interpreted and do not require linking.
- File: autoconf.info, Node: Runtime, Next: Systemology, Prev: Running the Linker, Up: Writing Tests
- 6.6 Checking Runtime Behavior
- =============================
- Sometimes you need to find out how a system performs at runtime, such
- as whether a given function has a certain capability or bug. If you
- can, make such checks when your program runs instead of when it is
- configured. You can check for things like the machine's endianness when
- your program initializes itself.
- If you really need to test for a runtime behavior while configuring,
- you can write a test program to determine the result, and compile and
- run it using `AC_RUN_IFELSE'. Avoid running test programs if possible,
- because this prevents people from configuring your package for
- cross-compiling.
- -- Macro: AC_RUN_IFELSE (INPUT, [ACTION-IF-TRUE], [ACTION-IF-FALSE],
- [ACTION-IF-CROSS-COMPILING = `AC_MSG_FAILURE'])
- Run the compiler (and compilation flags) and the linker of the
- current language (*note Language Choice::) on the INPUT, then
- execute the resulting program. If the program returns an exit
- status of 0 when executed, run shell commands ACTION-IF-TRUE.
- Otherwise, run shell commands ACTION-IF-FALSE.
- The INPUT can be made by `AC_LANG_PROGRAM' and friends. `LDFLAGS'
- and `LIBS' are used for linking, in addition to the compilation
- flags of the current language (*note Language Choice::).
- Additionally, ACTION-IF-TRUE can run `./conftest$EXEEXT' for
- further testing.
- In the ACTION-IF-FALSE section, the failing exit status is
- available in the shell variable `$?'. This exit status might be
- that of a failed compilation, or it might be that of a failed
- program execution.
- If cross-compilation mode is enabled (this is the case if either
- the compiler being used does not produce executables that run on
- the system where `configure' is being run, or if the options
- `--build' and `--host' were both specified and their values are
- different), then the test program is not run. If the optional
- shell commands ACTION-IF-CROSS-COMPILING are given, those commands
- are run instead; typically these commands provide pessimistic
- defaults that allow cross-compilation to work even if the guess
- was wrong. If the fourth argument is empty or omitted, but
- cross-compilation is detected, then `configure' prints an error
- message and exits. If you want your package to be useful in a
- cross-compilation scenario, you _should_ provide a non-empty
- ACTION-IF-CROSS-COMPILING clause, as well as wrap the
- `AC_RUN_IFELSE' compilation inside an `AC_CACHE_CHECK' (*note
- Caching Results::) which allows the user to override the
- pessimistic default if needed.
- It is customary to report unexpected failures with
- `AC_MSG_FAILURE'.
- `autoconf' prints a warning message when creating `configure' each
- time it encounters a call to `AC_RUN_IFELSE' with no
- ACTION-IF-CROSS-COMPILING argument given. If you are not concerned
- about users configuring your package for cross-compilation, you may
- ignore the warning. A few of the macros distributed with Autoconf
- produce this warning message; but if this is a problem for you, please
- report it as a bug, along with an appropriate pessimistic guess to use
- instead.
- To configure for cross-compiling you can also choose a value for
- those parameters based on the canonical system name (*note Manual
- Configuration::). Alternatively, set up a test results cache file with
- the correct values for the host system (*note Caching Results::).
- To provide a default for calls of `AC_RUN_IFELSE' that are embedded
- in other macros, including a few of the ones that come with Autoconf,
- you can test whether the shell variable `cross_compiling' is set to
- `yes', and then use an alternate method to get the results instead of
- calling the macros.
- It is also permissible to temporarily assign to `cross_compiling' in
- order to force tests to behave as though they are in a
- cross-compilation environment, particularly since this provides a way to
- test your ACTION-IF-CROSS-COMPILING even when you are not using a
- cross-compiler.
- # We temporarily set cross-compile mode to force AC_COMPUTE_INT
- # to use the slow link-only method
- save_cross_compiling=$cross_compiling
- cross_compiling=yes
- AC_COMPUTE_INT([...])
- cross_compiling=$save_cross_compiling
- A C or C++ runtime test should be portable. *Note Portable C and
- C++::.
- Erlang tests must exit themselves the Erlang VM by calling the
- `halt/1' function: the given status code is used to determine the
- success of the test (status is `0') or its failure (status is different
- than `0'), as explained above. It must be noted that data output
- through the standard output (e.g., using `io:format/2') may be
- truncated when halting the VM. Therefore, if a test must output
- configuration information, it is recommended to create and to output
- data into the temporary file named `conftest.out', using the functions
- of module `file'. The `conftest.out' file is automatically deleted by
- the `AC_RUN_IFELSE' macro. For instance, a simplified implementation
- of Autoconf's `AC_ERLANG_SUBST_LIB_DIR' macro is:
- AC_INIT([LibdirTest], [1.0], [bug-libdirtest@example.org])
- AC_ERLANG_NEED_ERL
- AC_LANG(Erlang)
- AC_RUN_IFELSE(
- [AC_LANG_PROGRAM([], [dnl
- file:write_file("conftest.out", code:lib_dir()),
- halt(0)])],
- [echo "code:lib_dir() returned: `cat conftest.out`"],
- [AC_MSG_FAILURE([test Erlang program execution failed])])
- File: autoconf.info, Node: Systemology, Next: Multiple Cases, Prev: Runtime, Up: Writing Tests
- 6.7 Systemology
- ===============
- This section aims at presenting some systems and pointers to
- documentation. It may help you addressing particular problems reported
- by users.
- Posix-conforming systems (http://www.opengroup.org/susv3) are
- derived from the Unix operating system
- (http://www.bell-labs.com/history/unix/).
- The Rosetta Stone for Unix (http://bhami.com/rosetta.html) contains
- a table correlating the features of various Posix-conforming systems.
- Unix History (http://www.levenez.com/unix/) is a simplified diagram of
- how many Unix systems were derived from each other.
- The Heirloom Project (http://heirloom.sourceforge.net/) provides
- some variants of traditional implementations of Unix utilities.
- Darwin
- Darwin is also known as Mac OS X. Beware that the file system
- _can_ be case-preserving, but case insensitive. This can cause
- nasty problems, since for instance the installation attempt for a
- package having an `INSTALL' file can result in `make install'
- report that nothing was to be done!
- That's all dependent on whether the file system is a UFS (case
- sensitive) or HFS+ (case preserving). By default Apple wants you
- to install the OS on HFS+. Unfortunately, there are some pieces of
- software which really need to be built on UFS. We may want to
- rebuild Darwin to have both UFS and HFS+ available (and put the
- /local/build tree on the UFS).
- QNX 4.25
- QNX is a realtime operating system running on Intel architecture
- meant to be scalable from the small embedded systems to the hundred
- processor super-computer. It claims to be Posix certified. More
- information is available on the QNX home page
- (http://www.qnx.com/).
- Tru64
- Documentation of several versions of Tru64
- (http://h30097.www3.hp.com/docs/) is available in different
- formats.
- Unix version 7
- Officially this was called the "Seventh Edition" of "the UNIX
- time-sharing system" but we use the more-common name "Unix version
- 7". Documentation is available in the Unix Seventh Edition Manual
- (http://plan9.bell-labs.com/7thEdMan/). Previous versions of Unix
- are called "Unix version 6", etc., but they were not as widely
- used.
- File: autoconf.info, Node: Multiple Cases, Prev: Systemology, Up: Writing Tests
- 6.8 Multiple Cases
- ==================
- Some operations are accomplished in several possible ways, depending on
- the OS variant. Checking for them essentially requires a "case
- statement". Autoconf does not directly provide one; however, it is
- easy to simulate by using a shell variable to keep track of whether a
- way to perform the operation has been found yet.
- Here is an example that uses the shell variable `fstype' to keep
- track of whether the remaining cases need to be checked. Note that
- since the value of `fstype' is under our control, we don't have to use
- the longer `test "x$fstype" = xno'.
- AC_MSG_CHECKING([how to get file system type])
- fstype=no
- # The order of these tests is important.
- AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/statvfs.h>
- #include <sys/fstyp.h>]])],
- [AC_DEFINE([FSTYPE_STATVFS], [1],
- [Define if statvfs exists.])
- fstype=SVR4])
- if test $fstype = no; then
- AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/statfs.h>
- #include <sys/fstyp.h>]])],
- [AC_DEFINE([FSTYPE_USG_STATFS], [1],
- [Define if USG statfs.])
- fstype=SVR3])
- fi
- if test $fstype = no; then
- AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/statfs.h>
- #include <sys/vmount.h>]])]),
- [AC_DEFINE([FSTYPE_AIX_STATFS], [1],
- [Define if AIX statfs.])
- fstype=AIX])
- fi
- # (more cases omitted here)
- AC_MSG_RESULT([$fstype])
- File: autoconf.info, Node: Results, Next: Programming in M4, Prev: Writing Tests, Up: Top
- 7 Results of Tests
- ******************
- Once `configure' has determined whether a feature exists, what can it
- do to record that information? There are four sorts of things it can
- do: define a C preprocessor symbol, set a variable in the output files,
- save the result in a cache file for future `configure' runs, and print
- a message letting the user know the result of the test.
- * Menu:
- * Defining Symbols:: Defining C preprocessor symbols
- * Setting Output Variables:: Replacing variables in output files
- * Special Chars in Variables:: Characters to beware of in variables
- * Caching Results:: Speeding up subsequent `configure' runs
- * Printing Messages:: Notifying `configure' users
- File: autoconf.info, Node: Defining Symbols, Next: Setting Output Variables, Up: Results
- 7.1 Defining C Preprocessor Symbols
- ===================================
- A common action to take in response to a feature test is to define a C
- preprocessor symbol indicating the results of the test. That is done by
- calling `AC_DEFINE' or `AC_DEFINE_UNQUOTED'.
- By default, `AC_OUTPUT' places the symbols defined by these macros
- into the output variable `DEFS', which contains an option
- `-DSYMBOL=VALUE' for each symbol defined. Unlike in Autoconf version
- 1, there is no variable `DEFS' defined while `configure' is running.
- To check whether Autoconf macros have already defined a certain C
- preprocessor symbol, test the value of the appropriate cache variable,
- as in this example:
- AC_CHECK_FUNC([vprintf], [AC_DEFINE([HAVE_VPRINTF], [1],
- [Define if vprintf exists.])])
- if test "x$ac_cv_func_vprintf" != xyes; then
- AC_CHECK_FUNC([_doprnt], [AC_DEFINE([HAVE_DOPRNT], [1],
- [Define if _doprnt exists.])])
- fi
- If `AC_CONFIG_HEADERS' has been called, then instead of creating
- `DEFS', `AC_OUTPUT' creates a header file by substituting the correct
- values into `#define' statements in a template file. *Note
- Configuration Headers::, for more information about this kind of output.
- -- Macro: AC_DEFINE (VARIABLE, VALUE, [DESCRIPTION])
- -- Macro: AC_DEFINE (VARIABLE)
- Define VARIABLE to VALUE (verbatim), by defining a C preprocessor
- macro for VARIABLE. VARIABLE should be a C identifier, optionally
- suffixed by a parenthesized argument list to define a C
- preprocessor macro with arguments. The macro argument list, if
- present, should be a comma-separated list of C identifiers,
- possibly terminated by an ellipsis `...' if C99 syntax is employed.
- VARIABLE should not contain comments, white space, trigraphs,
- backslash-newlines, universal character names, or non-ASCII
- characters.
- VALUE may contain backslash-escaped newlines, which will be
- preserved if you use `AC_CONFIG_HEADERS' but flattened if passed
- via `@DEFS@' (with no effect on the compilation, since the
- preprocessor sees only one line in the first place). VALUE should
- not contain raw newlines. If you are not using
- `AC_CONFIG_HEADERS', VALUE should not contain any `#' characters,
- as `make' tends to eat them. To use a shell variable, use
- `AC_DEFINE_UNQUOTED' instead.
- DESCRIPTION is only useful if you are using `AC_CONFIG_HEADERS'.
- In this case, DESCRIPTION is put into the generated `config.h.in'
- as the comment before the macro define. The following example
- defines the C preprocessor variable `EQUATION' to be the string
- constant `"$a > $b"':
- AC_DEFINE([EQUATION], ["$a > $b"],
- [Equation string.])
- If neither VALUE nor DESCRIPTION are given, then VALUE defaults to
- 1 instead of to the empty string. This is for backwards
- compatibility with older versions of Autoconf, but this usage is
- obsolescent and may be withdrawn in future versions of Autoconf.
- If the VARIABLE is a literal string, it is passed to
- `m4_pattern_allow' (*note Forbidden Patterns::).
- If multiple `AC_DEFINE' statements are executed for the same
- VARIABLE name (not counting any parenthesized argument list), the
- last one wins.
- -- Macro: AC_DEFINE_UNQUOTED (VARIABLE, VALUE, [DESCRIPTION])
- -- Macro: AC_DEFINE_UNQUOTED (VARIABLE)
- Like `AC_DEFINE', but three shell expansions are
- performed--once--on VARIABLE and VALUE: variable expansion (`$'),
- command substitution (``'), and backslash escaping (`\'), as if in
- an unquoted here-document. Single and double quote characters in
- the value have no special meaning. Use this macro instead of
- `AC_DEFINE' when VARIABLE or VALUE is a shell variable. Examples:
- AC_DEFINE_UNQUOTED([config_machfile], ["$machfile"],
- [Configuration machine file.])
- AC_DEFINE_UNQUOTED([GETGROUPS_T], [$ac_cv_type_getgroups],
- [getgroups return type.])
- AC_DEFINE_UNQUOTED([$ac_tr_hdr], [1],
- [Translated header name.])
- Due to a syntactical bizarreness of the Bourne shell, do not use
- semicolons to separate `AC_DEFINE' or `AC_DEFINE_UNQUOTED' calls from
- other macro calls or shell code; that can cause syntax errors in the
- resulting `configure' script. Use either blanks or newlines. That is,
- do this:
- AC_CHECK_HEADER([elf.h],
- [AC_DEFINE([SVR4], [1], [System V Release 4]) LIBS="-lelf $LIBS"])
- or this:
- AC_CHECK_HEADER([elf.h],
- [AC_DEFINE([SVR4], [1], [System V Release 4])
- LIBS="-lelf $LIBS"])
- instead of this:
- AC_CHECK_HEADER([elf.h],
- [AC_DEFINE([SVR4], [1], [System V Release 4]); LIBS="-lelf $LIBS"])
- File: autoconf.info, Node: Setting Output Variables, Next: Special Chars in Variables, Prev: Defining Symbols, Up: Results
- 7.2 Setting Output Variables
- ============================
- Another way to record the results of tests is to set "output
- variables", which are shell variables whose values are substituted into
- files that `configure' outputs. The two macros below create new output
- variables. *Note Preset Output Variables::, for a list of output
- variables that are always available.
- -- Macro: AC_SUBST (VARIABLE, [VALUE])
- Create an output variable from a shell variable. Make `AC_OUTPUT'
- substitute the variable VARIABLE into output files (typically one
- or more makefiles). This means that `AC_OUTPUT' replaces
- instances of `@VARIABLE@' in input files with the value that the
- shell variable VARIABLE has when `AC_OUTPUT' is called. The value
- can contain any non-`NUL' character, including newline. If you
- are using Automake 1.11 or newer, for newlines in values you might
- want to consider using `AM_SUBST_NOTMAKE' to prevent `automake'
- from adding a line `VARIABLE = @VARIABLE@' to the `Makefile.in'
- files (*note Automake: (automake)Optional.).
- Variable occurrences should not overlap: e.g., an input file should
- not contain `@VAR1@VAR2@' if VAR1 and VAR2 are variable names.
- The substituted value is not rescanned for more output variables;
- occurrences of `@VARIABLE@' in the value are inserted literally
- into the output file. (The algorithm uses the special marker
- `|#_!!_#|' internally, so neither the substituted value nor the
- output file may contain `|#_!!_#|'.)
- If VALUE is given, in addition assign it to VARIABLE.
- The string VARIABLE is passed to `m4_pattern_allow' (*note
- Forbidden Patterns::).
- -- Macro: AC_SUBST_FILE (VARIABLE)
- Another way to create an output variable from a shell variable.
- Make `AC_OUTPUT' insert (without substitutions) the contents of
- the file named by shell variable VARIABLE into output files. This
- means that `AC_OUTPUT' replaces instances of `@VARIABLE@' in
- output files (such as `Makefile.in') with the contents of the file
- that the shell variable VARIABLE names when `AC_OUTPUT' is called.
- Set the variable to `/dev/null' for cases that do not have a file
- to insert. This substitution occurs only when the `@VARIABLE@' is
- on a line by itself, optionally surrounded by spaces and tabs. The
- substitution replaces the whole line, including the spaces, tabs,
- and the terminating newline.
- This macro is useful for inserting makefile fragments containing
- special dependencies or other `make' directives for particular host
- or target types into makefiles. For example, `configure.ac' could
- contain:
- AC_SUBST_FILE([host_frag])
- host_frag=$srcdir/conf/sun4.mh
- and then a `Makefile.in' could contain:
- @host_frag@
- The string VARIABLE is passed to `m4_pattern_allow' (*note
- Forbidden Patterns::).
- Running `configure' in varying environments can be extremely
- dangerous. If for instance the user runs `CC=bizarre-cc ./configure',
- then the cache, `config.h', and many other output files depend upon
- `bizarre-cc' being the C compiler. If for some reason the user runs
- `./configure' again, or if it is run via `./config.status --recheck',
- (*Note Automatic Remaking::, and *note config.status Invocation::),
- then the configuration can be inconsistent, composed of results
- depending upon two different compilers.
- Environment variables that affect this situation, such as `CC'
- above, are called "precious variables", and can be declared as such by
- `AC_ARG_VAR'.
- -- Macro: AC_ARG_VAR (VARIABLE, DESCRIPTION)
- Declare VARIABLE is a precious variable, and include its
- DESCRIPTION in the variable section of `./configure --help'.
- Being precious means that
- - VARIABLE is substituted via `AC_SUBST'.
- - The value of VARIABLE when `configure' was launched is saved
- in the cache, including if it was not specified on the command
- line but via the environment. Indeed, while `configure' can
- notice the definition of `CC' in `./configure CC=bizarre-cc',
- it is impossible to notice it in `CC=bizarre-cc ./configure',
- which, unfortunately, is what most users do.
- We emphasize that it is the _initial_ value of VARIABLE which
- is saved, not that found during the execution of `configure'.
- Indeed, specifying `./configure FOO=foo' and letting
- `./configure' guess that `FOO' is `foo' can be two different
- things.
- - VARIABLE is checked for consistency between two `configure'
- runs. For instance:
- $ ./configure --silent --config-cache
- $ CC=cc ./configure --silent --config-cache
- configure: error: `CC' was not set in the previous run
- configure: error: changes in the environment can compromise \
- the build
- configure: error: run `make distclean' and/or \
- `rm config.cache' and start over
- and similarly if the variable is unset, or if its content is
- changed. If the content has white space changes only, then
- the error is degraded to a warning only, but the old value is
- reused.
- - VARIABLE is kept during automatic reconfiguration (*note
- config.status Invocation::) as if it had been passed as a
- command line argument, including when no cache is used:
- $ CC=/usr/bin/cc ./configure var=raboof --silent
- $ ./config.status --recheck
- running CONFIG_SHELL=/bin/sh /bin/sh ./configure var=raboof \
- CC=/usr/bin/cc --no-create --no-recursion
- File: autoconf.info, Node: Special Chars in Variables, Next: Caching Results, Prev: Setting Output Variables, Up: Results
- 7.3 Special Characters in Output Variables
- ==========================================
- Many output variables are intended to be evaluated both by `make' and
- by the shell. Some characters are expanded differently in these two
- contexts, so to avoid confusion these variables' values should not
- contain any of the following characters:
- " # $ & ' ( ) * ; < > ? [ \ ^ ` |
- Also, these variables' values should neither contain newlines, nor
- start with `~', nor contain white space or `:' immediately followed by
- `~'. The values can contain nonempty sequences of white space
- characters like tabs and spaces, but each such sequence might
- arbitrarily be replaced by a single space during substitution.
- These restrictions apply both to the values that `configure'
- computes, and to the values set directly by the user. For example, the
- following invocations of `configure' are problematic, since they
- attempt to use special characters within `CPPFLAGS' and white space
- within `$(srcdir)':
- CPPFLAGS='-DOUCH="&\"#$*?"' '../My Source/ouch-1.0/configure'
- '../My Source/ouch-1.0/configure' CPPFLAGS='-DOUCH="&\"#$*?"'
- File: autoconf.info, Node: Caching Results, Next: Printing Messages, Prev: Special Chars in Variables, Up: Results
- 7.4 Caching Results
- ===================
- To avoid checking for the same features repeatedly in various
- `configure' scripts (or in repeated runs of one script), `configure'
- can optionally save the results of many checks in a "cache file" (*note
- Cache Files::). If a `configure' script runs with caching enabled and
- finds a cache file, it reads the results of previous runs from the
- cache and avoids rerunning those checks. As a result, `configure' can
- then run much faster than if it had to perform all of the checks every
- time.
- -- Macro: AC_CACHE_VAL (CACHE-ID, COMMANDS-TO-SET-IT)
- Ensure that the results of the check identified by CACHE-ID are
- available. If the results of the check were in the cache file
- that was read, and `configure' was not given the `--quiet' or
- `--silent' option, print a message saying that the result was
- cached; otherwise, run the shell commands COMMANDS-TO-SET-IT. If
- the shell commands are run to determine the value, the value is
- saved in the cache file just before `configure' creates its output
- files. *Note Cache Variable Names::, for how to choose the name
- of the CACHE-ID variable.
- The COMMANDS-TO-SET-IT _must have no side effects_ except for
- setting the variable CACHE-ID, see below.
- -- Macro: AC_CACHE_CHECK (MESSAGE, CACHE-ID, COMMANDS-TO-SET-IT)
- A wrapper for `AC_CACHE_VAL' that takes care of printing the
- messages. This macro provides a convenient shorthand for the most
- common way to use these macros. It calls `AC_MSG_CHECKING' for
- MESSAGE, then `AC_CACHE_VAL' with the CACHE-ID and COMMANDS
- arguments, and `AC_MSG_RESULT' with CACHE-ID.
- The COMMANDS-TO-SET-IT _must have no side effects_ except for
- setting the variable CACHE-ID, see below.
- It is common to find buggy macros using `AC_CACHE_VAL' or
- `AC_CACHE_CHECK', because people are tempted to call `AC_DEFINE' in the
- COMMANDS-TO-SET-IT. Instead, the code that _follows_ the call to
- `AC_CACHE_VAL' should call `AC_DEFINE', by examining the value of the
- cache variable. For instance, the following macro is broken:
- AC_DEFUN([AC_SHELL_TRUE],
- [AC_CACHE_CHECK([whether true(1) works], [my_cv_shell_true_works],
- [my_cv_shell_true_works=no
- (true) 2>/dev/null && my_cv_shell_true_works=yes
- if test "x$my_cv_shell_true_works" = xyes; then
- AC_DEFINE([TRUE_WORKS], [1],
- [Define if `true(1)' works properly.])
- fi])
- ])
- This fails if the cache is enabled: the second time this macro is run,
- `TRUE_WORKS' _will not be defined_. The proper implementation is:
- AC_DEFUN([AC_SHELL_TRUE],
- [AC_CACHE_CHECK([whether true(1) works], [my_cv_shell_true_works],
- [my_cv_shell_true_works=no
- (true) 2>/dev/null && my_cv_shell_true_works=yes])
- if test "x$my_cv_shell_true_works" = xyes; then
- AC_DEFINE([TRUE_WORKS], [1],
- [Define if `true(1)' works properly.])
- fi
- ])
- Also, COMMANDS-TO-SET-IT should not print any messages, for example
- with `AC_MSG_CHECKING'; do that before calling `AC_CACHE_VAL', so the
- messages are printed regardless of whether the results of the check are
- retrieved from the cache or determined by running the shell commands.
- * Menu:
- * Cache Variable Names:: Shell variables used in caches
- * Cache Files:: Files `configure' uses for caching
- * Cache Checkpointing:: Loading and saving the cache file
- File: autoconf.info, Node: Cache Variable Names, Next: Cache Files, Up: Caching Results
- 7.4.1 Cache Variable Names
- --------------------------
- The names of cache variables should have the following format:
- PACKAGE-PREFIX_cv_VALUE-TYPE_SPECIFIC-VALUE_[ADDITIONAL-OPTIONS]
- for example, `ac_cv_header_stat_broken' or
- `ac_cv_prog_gcc_traditional'. The parts of the variable name are:
- PACKAGE-PREFIX
- An abbreviation for your package or organization; the same prefix
- you begin local Autoconf macros with, except lowercase by
- convention. For cache values used by the distributed Autoconf
- macros, this value is `ac'.
- `_cv_'
- Indicates that this shell variable is a cache value. This string
- _must_ be present in the variable name, including the leading
- underscore.
- VALUE-TYPE
- A convention for classifying cache values, to produce a rational
- naming system. The values used in Autoconf are listed in *note
- Macro Names::.
- SPECIFIC-VALUE
- Which member of the class of cache values this test applies to.
- For example, which function (`alloca'), program (`gcc'), or output
- variable (`INSTALL').
- ADDITIONAL-OPTIONS
- Any particular behavior of the specific member that this test
- applies to. For example, `broken' or `set'. This part of the
- name may be omitted if it does not apply.
- The values assigned to cache variables may not contain newlines.
- Usually, their values are Boolean (`yes' or `no') or the names of files
- or functions; so this is not an important restriction. *note Cache
- Variable Index:: for an index of cache variables with documented
- semantics.
- File: autoconf.info, Node: Cache Files, Next: Cache Checkpointing, Prev: Cache Variable Names, Up: Caching Results
- 7.4.2 Cache Files
- -----------------
- A cache file is a shell script that caches the results of configure
- tests run on one system so they can be shared between configure scripts
- and configure runs. It is not useful on other systems. If its contents
- are invalid for some reason, the user may delete or edit it, or override
- documented cache variables on the `configure' command line.
- By default, `configure' uses no cache file, to avoid problems caused
- by accidental use of stale cache files.
- To enable caching, `configure' accepts `--config-cache' (or `-C') to
- cache results in the file `config.cache'. Alternatively,
- `--cache-file=FILE' specifies that FILE be the cache file. The cache
- file is created if it does not exist already. When `configure' calls
- `configure' scripts in subdirectories, it uses the `--cache-file'
- argument so that they share the same cache. *Note Subdirectories::,
- for information on configuring subdirectories with the
- `AC_CONFIG_SUBDIRS' macro.
- `config.status' only pays attention to the cache file if it is given
- the `--recheck' option, which makes it rerun `configure'.
- It is wrong to try to distribute cache files for particular system
- types. There is too much room for error in doing that, and too much
- administrative overhead in maintaining them. For any features that
- can't be guessed automatically, use the standard method of the canonical
- system type and linking files (*note Manual Configuration::).
- The site initialization script can specify a site-wide cache file to
- use, instead of the usual per-program cache. In this case, the cache
- file gradually accumulates information whenever someone runs a new
- `configure' script. (Running `configure' merges the new cache results
- with the existing cache file.) This may cause problems, however, if
- the system configuration (e.g., the installed libraries or compilers)
- changes and the stale cache file is not deleted.
- If `configure' is interrupted at the right time when it updates a
- cache file outside of the build directory where the `configure' script
- is run, it may leave behind a temporary file named after the cache file
- with digits following it. You may safely delete such a file.
- File: autoconf.info, Node: Cache Checkpointing, Prev: Cache Files, Up: Caching Results
- 7.4.3 Cache Checkpointing
- -------------------------
- If your configure script, or a macro called from `configure.ac', happens
- to abort the configure process, it may be useful to checkpoint the cache
- a few times at key points using `AC_CACHE_SAVE'. Doing so reduces the
- amount of time it takes to rerun the configure script with (hopefully)
- the error that caused the previous abort corrected.
- -- Macro: AC_CACHE_LOAD
- Loads values from existing cache file, or creates a new cache file
- if a cache file is not found. Called automatically from `AC_INIT'.
- -- Macro: AC_CACHE_SAVE
- Flushes all cached values to the cache file. Called automatically
- from `AC_OUTPUT', but it can be quite useful to call
- `AC_CACHE_SAVE' at key points in `configure.ac'.
- For instance:
- ... AC_INIT, etc. ...
- # Checks for programs.
- AC_PROG_CC
- AC_PROG_AWK
- ... more program checks ...
- AC_CACHE_SAVE
- # Checks for libraries.
- AC_CHECK_LIB([nsl], [gethostbyname])
- AC_CHECK_LIB([socket], [connect])
- ... more lib checks ...
- AC_CACHE_SAVE
- # Might abort...
- AM_PATH_GTK([1.0.2], [], [AC_MSG_ERROR([GTK not in path])])
- AM_PATH_GTKMM([0.9.5], [], [AC_MSG_ERROR([GTK not in path])])
- ... AC_OUTPUT, etc. ...
- File: autoconf.info, Node: Printing Messages, Prev: Caching Results, Up: Results
- 7.5 Printing Messages
- =====================
- `configure' scripts need to give users running them several kinds of
- information. The following macros print messages in ways appropriate
- for each kind. The arguments to all of them get enclosed in shell
- double quotes, so the shell performs variable and back-quote
- substitution on them.
- These macros are all wrappers around the `echo' shell command. They
- direct output to the appropriate file descriptor (*note File Descriptor
- Macros::). `configure' scripts should rarely need to run `echo'
- directly to print messages for the user. Using these macros makes it
- easy to change how and when each kind of message is printed; such
- changes need only be made to the macro definitions and all the callers
- change automatically.
- To diagnose static issues, i.e., when `autoconf' is run, see *note
- Diagnostic Macros::.
- -- Macro: AC_MSG_CHECKING (FEATURE-DESCRIPTION)
- Notify the user that `configure' is checking for a particular
- feature. This macro prints a message that starts with `checking '
- and ends with `...' and no newline. It must be followed by a call
- to `AC_MSG_RESULT' to print the result of the check and the
- newline. The FEATURE-DESCRIPTION should be something like
- `whether the Fortran compiler accepts C++ comments' or `for c89'.
- This macro prints nothing if `configure' is run with the `--quiet'
- or `--silent' option.
- -- Macro: AC_MSG_RESULT (RESULT-DESCRIPTION)
- Notify the user of the results of a check. RESULT-DESCRIPTION is
- almost always the value of the cache variable for the check,
- typically `yes', `no', or a file name. This macro should follow a
- call to `AC_MSG_CHECKING', and the RESULT-DESCRIPTION should be
- the completion of the message printed by the call to
- `AC_MSG_CHECKING'.
- This macro prints nothing if `configure' is run with the `--quiet'
- or `--silent' option.
- -- Macro: AC_MSG_NOTICE (MESSAGE)
- Deliver the MESSAGE to the user. It is useful mainly to print a
- general description of the overall purpose of a group of feature
- checks, e.g.,
- AC_MSG_NOTICE([checking if stack overflow is detectable])
- This macro prints nothing if `configure' is run with the `--quiet'
- or `--silent' option.
- -- Macro: AC_MSG_ERROR (ERROR-DESCRIPTION, [EXIT-STATUS = `$?/1'])
- Notify the user of an error that prevents `configure' from
- completing. This macro prints an error message to the standard
- error output and exits `configure' with EXIT-STATUS (`$?' by
- default, except that `0' is converted to `1'). ERROR-DESCRIPTION
- should be something like `invalid value $HOME for \$HOME'.
- The ERROR-DESCRIPTION should start with a lower-case letter, and
- "cannot" is preferred to "can't".
- -- Macro: AC_MSG_FAILURE (ERROR-DESCRIPTION, [EXIT-STATUS])
- This `AC_MSG_ERROR' wrapper notifies the user of an error that
- prevents `configure' from completing _and_ that additional details
- are provided in `config.log'. This is typically used when
- abnormal results are found during a compilation.
- -- Macro: AC_MSG_WARN (PROBLEM-DESCRIPTION)
- Notify the `configure' user of a possible problem. This macro
- prints the message to the standard error output; `configure'
- continues running afterward, so macros that call `AC_MSG_WARN'
- should provide a default (back-up) behavior for the situations
- they warn about. PROBLEM-DESCRIPTION should be something like `ln
- -s seems to make hard links'.
- File: autoconf.info, Node: Programming in M4, Next: Programming in M4sh, Prev: Results, Up: Top
- 8 Programming in M4
- *******************
- Autoconf is written on top of two layers: "M4sugar", which provides
- convenient macros for pure M4 programming, and "M4sh", which provides
- macros dedicated to shell script generation.
- As of this version of Autoconf, these two layers still contain
- experimental macros, whose interface might change in the future. As a
- matter of fact, _anything that is not documented must not be used_.
- * Menu:
- * M4 Quotation:: Protecting macros from unwanted expansion
- * Using autom4te:: The Autoconf executables backbone
- * Programming in M4sugar:: Convenient pure M4 macros
- * Debugging via autom4te:: Figuring out what M4 was doing
- File: autoconf.info, Node: M4 Quotation, Next: Using autom4te, Up: Programming in M4
- 8.1 M4 Quotation
- ================
- The most common problem with existing macros is an improper quotation.
- This section, which users of Autoconf can skip, but which macro writers
- _must_ read, first justifies the quotation scheme that was chosen for
- Autoconf and then ends with a rule of thumb. Understanding the former
- helps one to follow the latter.
- * Menu:
- * Active Characters:: Characters that change the behavior of M4
- * One Macro Call:: Quotation and one macro call
- * Quoting and Parameters:: M4 vs. shell parameters
- * Quotation and Nested Macros:: Macros calling macros
- * Changequote is Evil:: Worse than INTERCAL: M4 + changequote
- * Quadrigraphs:: Another way to escape special characters
- * Balancing Parentheses:: Dealing with unbalanced parentheses
- * Quotation Rule Of Thumb:: One parenthesis, one quote
- File: autoconf.info, Node: Active Characters, Next: One Macro Call, Up: M4 Quotation
- 8.1.1 Active Characters
- -----------------------
- To fully understand where proper quotation is important, you first need
- to know what the special characters are in Autoconf: `#' introduces a
- comment inside which no macro expansion is performed, `,' separates
- arguments, `[' and `]' are the quotes themselves(1), `(' and `)' (which
- M4 tries to match by pairs), and finally `$' inside a macro definition.
- In order to understand the delicate case of macro calls, we first
- have to present some obvious failures. Below they are "obvious-ified",
- but when you find them in real life, they are usually in disguise.
- Comments, introduced by a hash and running up to the newline, are
- opaque tokens to the top level: active characters are turned off, and
- there is no macro expansion:
- # define([def], ine)
- =># define([def], ine)
- Each time there can be a macro expansion, there is a quotation
- expansion, i.e., one level of quotes is stripped:
- int tab[10];
- =>int tab10;
- [int tab[10];]
- =>int tab[10];
- Without this in mind, the reader might try hopelessly to use her
- macro `array':
- define([array], [int tab[10];])
- array
- =>int tab10;
- [array]
- =>array
- How can you correctly output the intended results(2)?
- ---------- Footnotes ----------
- (1) By itself, M4 uses ``' and `''; it is the M4sugar layer that
- sets up the preferred quotes of `[' and `]'.
- (2) Using `defn'.
- File: autoconf.info, Node: One Macro Call, Next: Quoting and Parameters, Prev: Active Characters, Up: M4 Quotation
- 8.1.2 One Macro Call
- --------------------
- Let's proceed on the interaction between active characters and macros
- with this small macro, which just returns its first argument:
- define([car], [$1])
- The two pairs of quotes above are not part of the arguments of
- `define'; rather, they are understood by the top level when it tries to
- find the arguments of `define'. Therefore, assuming `car' is not
- already defined, it is equivalent to write:
- define(car, $1)
- But, while it is acceptable for a `configure.ac' to avoid unnecessary
- quotes, it is bad practice for Autoconf macros which must both be more
- robust and also advocate perfect style.
- At the top level, there are only two possibilities: either you quote
- or you don't:
- car(foo, bar, baz)
- =>foo
- [car(foo, bar, baz)]
- =>car(foo, bar, baz)
- Let's pay attention to the special characters:
- car(#)
- error-->EOF in argument list
- The closing parenthesis is hidden in the comment; with a hypothetical
- quoting, the top level understood it this way:
- car([#)]
- Proper quotation, of course, fixes the problem:
- car([#])
- =>#
- Here are more examples:
- car(foo, bar)
- =>foo
- car([foo, bar])
- =>foo, bar
- car((foo, bar))
- =>(foo, bar)
- car([(foo], [bar)])
- =>(foo
- define([a], [b])
- =>
- car(a)
- =>b
- car([a])
- =>b
- car([[a]])
- =>a
- car([[[a]]])
- =>[a]
- File: autoconf.info, Node: Quoting and Parameters, Next: Quotation and Nested Macros, Prev: One Macro Call, Up: M4 Quotation
- 8.1.3 Quoting and Parameters
- ----------------------------
- When M4 encounters `$' within a macro definition, followed immediately
- by a character it recognizes (`0'...`9', `#', `@', or `*'), it will
- perform M4 parameter expansion. This happens regardless of how many
- layers of quotes the parameter expansion is nested within, or even if
- it occurs in text that will be rescanned as a comment.
- define([none], [$1])
- =>
- define([one], [[$1]])
- =>
- define([two], [[[$1]]])
- =>
- define([comment], [# $1])
- =>
- define([active], [ACTIVE])
- =>
- none([active])
- =>ACTIVE
- one([active])
- =>active
- two([active])
- =>[active]
- comment([active])
- =># active
- On the other hand, since autoconf generates shell code, you often
- want to output shell variable expansion, rather than performing M4
- parameter expansion. To do this, you must use M4 quoting to separate
- the `$' from the next character in the definition of your macro. If
- the macro definition occurs in single-quoted text, then insert another
- level of quoting; if the usage is already inside a double-quoted
- string, then split it into concatenated strings.
- define([single], [a single-quoted $[]1 definition])
- =>
- define([double], [[a double-quoted $][1 definition]])
- =>
- single
- =>a single-quoted $1 definition
- double
- =>a double-quoted $1 definition
- Posix states that M4 implementations are free to provide
- implementation extensions when `${' is encountered in a macro
- definition. Autoconf reserves the longer sequence `${{' for use with
- planned extensions that will be available in the future GNU M4 2.0, but
- guarantees that all other instances of `${' will be output literally.
- Therefore, this idiom can also be used to output shell code parameter
- references:
- define([first], [${1}])first
- =>${1}
- Posix also states that `$11' should expand to the first parameter
- concatenated with a literal `1', although some versions of GNU M4
- expand the eleventh parameter instead. For portability, you should
- only use single-digit M4 parameter expansion.
- With this in mind, we can explore the cases where macros invoke
- macros...
- File: autoconf.info, Node: Quotation and Nested Macros, Next: Changequote is Evil, Prev: Quoting and Parameters, Up: M4 Quotation
- 8.1.4 Quotation and Nested Macros
- ---------------------------------
- The examples below use the following macros:
- define([car], [$1])
- define([active], [ACT, IVE])
- define([array], [int tab[10]])
- Each additional embedded macro call introduces other possible
- interesting quotations:
- car(active)
- =>ACT
- car([active])
- =>ACT, IVE
- car([[active]])
- =>active
- In the first case, the top level looks for the arguments of `car',
- and finds `active'. Because M4 evaluates its arguments before applying
- the macro, `active' is expanded, which results in:
- car(ACT, IVE)
- =>ACT
- In the second case, the top level gives `active' as first and only
- argument of `car', which results in:
- active
- =>ACT, IVE
- i.e., the argument is evaluated _after_ the macro that invokes it. In
- the third case, `car' receives `[active]', which results in:
- [active]
- =>active
- exactly as we already saw above.
- The example above, applied to a more realistic example, gives:
- car(int tab[10];)
- =>int tab10;
- car([int tab[10];])
- =>int tab10;
- car([[int tab[10];]])
- =>int tab[10];
- Huh? The first case is easily understood, but why is the second wrong,
- and the third right? To understand that, you must know that after M4
- expands a macro, the resulting text is immediately subjected to macro
- expansion and quote removal. This means that the quote removal occurs
- twice--first before the argument is passed to the `car' macro, and
- second after the `car' macro expands to the first argument.
- As the author of the Autoconf macro `car', you then consider it to
- be incorrect that your users have to double-quote the arguments of
- `car', so you "fix" your macro. Let's call it `qar' for quoted car:
- define([qar], [[$1]])
- and check that `qar' is properly fixed:
- qar([int tab[10];])
- =>int tab[10];
- Ahhh! That's much better.
- But note what you've done: now that the result of `qar' is always a
- literal string, the only time a user can use nested macros is if she
- relies on an _unquoted_ macro call:
- qar(active)
- =>ACT
- qar([active])
- =>active
- leaving no way for her to reproduce what she used to do with `car':
- car([active])
- =>ACT, IVE
- Worse yet: she wants to use a macro that produces a set of `cpp' macros:
- define([my_includes], [#include <stdio.h>])
- car([my_includes])
- =>#include <stdio.h>
- qar(my_includes)
- error-->EOF in argument list
- This macro, `qar', because it double quotes its arguments, forces
- its users to leave their macro calls unquoted, which is dangerous.
- Commas and other active symbols are interpreted by M4 before they are
- given to the macro, often not in the way the users expect. Also,
- because `qar' behaves differently from the other macros, it's an
- exception that should be avoided in Autoconf.
- File: autoconf.info, Node: Changequote is Evil, Next: Quadrigraphs, Prev: Quotation and Nested Macros, Up: M4 Quotation
- 8.1.5 `changequote' is Evil
- ---------------------------
- The temptation is often high to bypass proper quotation, in particular
- when it's late at night. Then, many experienced Autoconf hackers
- finally surrender to the dark side of the force and use the ultimate
- weapon: `changequote'.
- The M4 builtin `changequote' belongs to a set of primitives that
- allow one to adjust the syntax of the language to adjust it to one's
- needs. For instance, by default M4 uses ``' and `'' as quotes, but in
- the context of shell programming (and actually of most programming
- languages), that's about the worst choice one can make: because of
- strings and back-quoted expressions in shell code (such as `'this'' and
- ``that`'), and because of literal characters in usual programming
- languages (as in `'0''), there are many unbalanced ``' and `''. Proper
- M4 quotation then becomes a nightmare, if not impossible. In order to
- make M4 useful in such a context, its designers have equipped it with
- `changequote', which makes it possible to choose another pair of
- quotes. M4sugar, M4sh, Autoconf, and Autotest all have chosen to use
- `[' and `]'. Not especially because they are unlikely characters, but
- _because they are characters unlikely to be unbalanced_.
- There are other magic primitives, such as `changecom' to specify
- what syntactic forms are comments (it is common to see `changecom(<!--,
- -->)' when M4 is used to produce HTML pages), `changeword' and
- `changesyntax' to change other syntactic details (such as the character
- to denote the Nth argument, `$' by default, the parentheses around
- arguments, etc.).
- These primitives are really meant to make M4 more useful for specific
- domains: they should be considered like command line options:
- `--quotes', `--comments', `--words', and `--syntax'. Nevertheless,
- they are implemented as M4 builtins, as it makes M4 libraries self
- contained (no need for additional options).
- There lies the problem...
- The problem is that it is then tempting to use them in the middle of
- an M4 script, as opposed to its initialization. This, if not carefully
- thought out, can lead to disastrous effects: _you are changing the
- language in the middle of the execution_. Changing and restoring the
- syntax is often not enough: if you happened to invoke macros in between,
- these macros are lost, as the current syntax is probably not the one
- they were implemented with.
- File: autoconf.info, Node: Quadrigraphs, Next: Balancing Parentheses, Prev: Changequote is Evil, Up: M4 Quotation
- 8.1.6 Quadrigraphs
- ------------------
- When writing an Autoconf macro you may occasionally need to generate
- special characters that are difficult to express with the standard
- Autoconf quoting rules. For example, you may need to output the regular
- expression `[^[]', which matches any character other than `['. This
- expression contains unbalanced brackets so it cannot be put easily into
- an M4 macro.
- Additionally, there are a few m4sugar macros (such as `m4_split' and
- `m4_expand') which internally use special markers in addition to the
- regular quoting characters. If the arguments to these macros contain
- the literal strings `-=<{(' or `)}>=-', the macros might behave
- incorrectly.
- You can work around these problems by using one of the following
- "quadrigraphs":
- `@<:@'
- `['
- `@:>@'
- `]'
- `@S|@'
- `$'
- `@%:@'
- `#'
- `@{:@'
- `('
- `@:}@'
- `)'
- `@&t@'
- Expands to nothing.
- Quadrigraphs are replaced at a late stage of the translation process,
- after `m4' is run, so they do not get in the way of M4 quoting. For
- example, the string `^@<:@', independently of its quotation, appears as
- `^[' in the output.
- The empty quadrigraph can be used:
- - to mark trailing spaces explicitly
- Trailing spaces are smashed by `autom4te'. This is a feature.
- - to produce quadrigraphs and other strings reserved by m4sugar
- For instance `@<@&t@:@' produces `@<:@'. For a more contrived
- example:
- m4_define([a], [A])m4_define([b], [B])m4_define([c], [C])dnl
- m4_split([a )}>=- b -=<{( c])
- =>[a], [], [B], [], [c]
- m4_split([a )}@&t@>=- b -=<@&t@{( c])
- =>[a], [)}>=-], [b], [-=<{(], [c]
- - to escape _occurrences_ of forbidden patterns
- For instance you might want to mention `AC_FOO' in a comment, while
- still being sure that `autom4te' still catches unexpanded `AC_*'.
- Then write `AC@&t@_FOO'.
- The name `@&t@' was suggested by Paul Eggert:
- I should give some credit to the `@&t@' pun. The `&' is my own
- invention, but the `t' came from the source code of the ALGOL68C
- compiler, written by Steve Bourne (of Bourne shell fame), and
- which used `mt' to denote the empty string. In C, it would have
- looked like something like:
- char const mt[] = "";
- but of course the source code was written in Algol 68.
- I don't know where he got `mt' from: it could have been his own
- invention, and I suppose it could have been a common pun around the
- Cambridge University computer lab at the time.
- File: autoconf.info, Node: Balancing Parentheses, Next: Quotation Rule Of Thumb, Prev: Quadrigraphs, Up: M4 Quotation
- 8.1.7 Dealing with unbalanced parentheses
- -----------------------------------------
- One of the pitfalls of portable shell programming is that `case'
- statements require unbalanced parentheses (*note Limitations of Shell
- Builtins: case.). With syntax highlighting editors, the presence of
- unbalanced `)' can interfere with editors that perform syntax
- highlighting of macro contents based on finding the matching `('.
- Another concern is how much editing must be done when transferring code
- snippets between shell scripts and macro definitions. But most
- importantly, the presence of unbalanced parentheses can introduce
- expansion bugs.
- For an example, here is an underquoted attempt to use the macro
- `my_case', which happens to expand to a portable `case' statement:
- AC_DEFUN([my_case],
- [case $file_name in
- *.c) echo "C source code";;
- esac])
- AS_IF(:, my_case)
- In the above example, the `AS_IF' call underquotes its arguments. As a
- result, the unbalanced `)' generated by the premature expansion of
- `my_case' results in expanding `AS_IF' with a truncated parameter, and
- the expansion is syntactically invalid:
- if :; then
- case $file_name in
- *.c
- fi echo "C source code";;
- esac)
- If nothing else, this should emphasize the importance of the quoting
- arguments to macro calls. On the other hand, there are several
- variations for defining `my_case' to be more robust, even when used
- without proper quoting, each with some benefits and some drawbacks.
- Creative literal shell comment
- AC_DEFUN([my_case],
- [case $file_name in #(
- *.c) echo "C source code";;
- esac])
- This version provides balanced parentheses to several editors, and
- can be copied and pasted into a terminal as is. Unfortunately, it
- is still unbalanced as an Autoconf argument, since `#(' is an M4
- comment that masks the normal properties of `('.
- Quadrigraph shell comment
- AC_DEFUN([my_case],
- [case $file_name in @%:@(
- *.c) echo "C source code";;
- esac])
- This version provides balanced parentheses to even more editors,
- and can be used as a balanced Autoconf argument. Unfortunately,
- it requires some editing before it can be copied and pasted into a
- terminal, and the use of the quadrigraph `@%:@' for `#' reduces
- readability.
- Quoting just the parenthesis
- AC_DEFUN([my_case],
- [case $file_name in
- *.c[)] echo "C source code";;
- esac])
- This version quotes the `)', so that it can be used as a balanced
- Autoconf argument. As written, this is not balanced to an editor,
- but it can be coupled with `[#(]' to meet that need, too.
- However, it still requires some edits before it can be copied and
- pasted into a terminal.
- Double-quoting the entire statement
- AC_DEFUN([my_case],
- [[case $file_name in #(
- *.c) echo "C source code";;
- esac]])
- Since the entire macro is double-quoted, there is no problem with
- using this as an Autoconf argument; and since the double-quoting
- is over the entire statement, this code can be easily copied and
- pasted into a terminal. However, the double quoting prevents the
- expansion of any macros inside the case statement, which may cause
- its own set of problems.
- Using `AS_CASE'
- AC_DEFUN([my_case],
- [AS_CASE([$file_name],
- [*.c], [echo "C source code"])])
- This version avoids the balancing issue altogether, by relying on
- `AS_CASE' (*note Common Shell Constructs::); it also allows for the
- expansion of `AC_REQUIRE' to occur prior to the entire case
- statement, rather than within a branch of the case statement that
- might not be taken. However, the abstraction comes with a penalty
- that it is no longer a quick copy, paste, and edit to get back to
- shell code.
- File: autoconf.info, Node: Quotation Rule Of Thumb, Prev: Balancing Parentheses, Up: M4 Quotation
- 8.1.8 Quotation Rule Of Thumb
- -----------------------------
- To conclude, the quotation rule of thumb is:
- _One pair of quotes per pair of parentheses._
- Never over-quote, never under-quote, in particular in the definition
- of macros. In the few places where the macros need to use brackets
- (usually in C program text or regular expressions), properly quote _the
- arguments_!
- It is common to read Autoconf programs with snippets like:
- AC_TRY_LINK(
- changequote(<<, >>)dnl
- <<#include <time.h>
- #ifndef tzname /* For SGI. */
- extern char *tzname[]; /* RS6000 and others reject char **tzname. */
- #endif>>,
- changequote([, ])dnl
- [atoi (*tzname);], ac_cv_var_tzname=yes, ac_cv_var_tzname=no)
- which is incredibly useless since `AC_TRY_LINK' is _already_ double
- quoting, so you just need:
- AC_TRY_LINK(
- [#include <time.h>
- #ifndef tzname /* For SGI. */
- extern char *tzname[]; /* RS6000 and others reject char **tzname. */
- #endif],
- [atoi (*tzname);],
- [ac_cv_var_tzname=yes],
- [ac_cv_var_tzname=no])
- The M4-fluent reader might note that these two examples are rigorously
- equivalent, since M4 swallows both the `changequote(<<, >>)' and `<<'
- `>>' when it "collects" the arguments: these quotes are not part of the
- arguments!
- Simplified, the example above is just doing this:
- changequote(<<, >>)dnl
- <<[]>>
- changequote([, ])dnl
- instead of simply:
- [[]]
- With macros that do not double quote their arguments (which is the
- rule), double-quote the (risky) literals:
- AC_LINK_IFELSE([AC_LANG_PROGRAM(
- [[#include <time.h>
- #ifndef tzname /* For SGI. */
- extern char *tzname[]; /* RS6000 and others reject char **tzname. */
- #endif]],
- [atoi (*tzname);])],
- [ac_cv_var_tzname=yes],
- [ac_cv_var_tzname=no])
- Please note that the macro `AC_TRY_LINK' is obsolete, so you really
- should be using `AC_LINK_IFELSE' instead.
- *Note Quadrigraphs::, for what to do if you run into a hopeless case
- where quoting does not suffice.
- When you create a `configure' script using newly written macros,
- examine it carefully to check whether you need to add more quotes in
- your macros. If one or more words have disappeared in the M4 output,
- you need more quotes. When in doubt, quote.
- However, it's also possible to put on too many layers of quotes. If
- this happens, the resulting `configure' script may contain unexpanded
- macros. The `autoconf' program checks for this problem by looking for
- the string `AC_' in `configure'. However, this heuristic does not work
- in general: for example, it does not catch overquoting in `AC_DEFINE'
- descriptions.
- File: autoconf.info, Node: Using autom4te, Next: Programming in M4sugar, Prev: M4 Quotation, Up: Programming in M4
- 8.2 Using `autom4te'
- ====================
- The Autoconf suite, including M4sugar, M4sh, and Autotest, in addition
- to Autoconf per se, heavily rely on M4. All these different uses
- revealed common needs factored into a layer over M4: `autom4te'(1).
- `autom4te' is a preprocessor that is like `m4'. It supports M4
- extensions designed for use in tools like Autoconf.
- * Menu:
- * autom4te Invocation:: A GNU M4 wrapper
- * Customizing autom4te:: Customizing the Autoconf package
- ---------- Footnotes ----------
- (1) Yet another great name from Lars J. Aas.
- File: autoconf.info, Node: autom4te Invocation, Next: Customizing autom4te, Up: Using autom4te
- 8.2.1 Invoking `autom4te'
- -------------------------
- The command line arguments are modeled after M4's:
- autom4te OPTIONS FILES
- where the FILES are directly passed to `m4'. By default, GNU M4 is
- found during configuration, but the environment variable `M4' can be
- set to tell `autom4te' where to look. In addition to the regular
- expansion, it handles the replacement of the quadrigraphs (*note
- Quadrigraphs::), and of `__oline__', the current line in the output.
- It supports an extended syntax for the FILES:
- `FILE.m4f'
- This file is an M4 frozen file. Note that _all the previous files
- are ignored_. See the option `--melt' for the rationale.
- `FILE?'
- If found in the library path, the FILE is included for expansion,
- otherwise it is ignored instead of triggering a failure.
- Of course, it supports the Autoconf common subset of options:
- `--help'
- `-h'
- Print a summary of the command line options and exit.
- `--version'
- `-V'
- Print the version number of Autoconf and exit.
- `--verbose'
- `-v'
- Report processing steps.
- `--debug'
- `-d'
- Don't remove the temporary files and be even more verbose.
- `--include=DIR'
- `-I DIR'
- Also look for input files in DIR. Multiple invocations accumulate.
- `--output=FILE'
- `-o FILE'
- Save output (script or trace) to FILE. The file `-' stands for
- the standard output.
- As an extension of `m4', it includes the following options:
- `--warnings=CATEGORY'
- `-W CATEGORY'
- Report the warnings related to CATEGORY (which can actually be a
- comma separated list). *Note Reporting Messages::, macro
- `AC_DIAGNOSE', for a comprehensive list of categories. Special
- values include:
- `all'
- report all the warnings
- `none'
- report none
- `error'
- treats warnings as errors
- `no-CATEGORY'
- disable warnings falling into CATEGORY
- Warnings about `syntax' are enabled by default, and the environment
- variable `WARNINGS', a comma separated list of categories, is
- honored. `autom4te -W CATEGORY' actually behaves as if you had
- run:
- autom4te --warnings=syntax,$WARNINGS,CATEGORY
- For example, if you want to disable defaults and `WARNINGS' of
- `autom4te', but enable the warnings about obsolete constructs, you
- would use `-W none,obsolete'.
- `autom4te' displays a back trace for errors, but not for warnings;
- if you want them, just pass `-W error'.
- `--melt'
- `-M'
- Do not use frozen files. Any argument `FILE.m4f' is replaced by
- `FILE.m4'. This helps tracing the macros which are executed only
- when the files are frozen, typically `m4_define'. For instance,
- running:
- autom4te --melt 1.m4 2.m4f 3.m4 4.m4f input.m4
- is roughly equivalent to running:
- m4 1.m4 2.m4 3.m4 4.m4 input.m4
- while
- autom4te 1.m4 2.m4f 3.m4 4.m4f input.m4
- is equivalent to:
- m4 --reload-state=4.m4f input.m4
- `--freeze'
- `-F'
- Produce a frozen state file. `autom4te' freezing is stricter than
- M4's: it must produce no warnings, and no output other than empty
- lines (a line with white space is _not_ empty) and comments
- (starting with `#'). Unlike `m4''s similarly-named option, this
- option takes no argument:
- autom4te 1.m4 2.m4 3.m4 --freeze --output=3.m4f
- corresponds to
- m4 1.m4 2.m4 3.m4 --freeze-state=3.m4f
- `--mode=OCTAL-MODE'
- `-m OCTAL-MODE'
- Set the mode of the non-traces output to OCTAL-MODE; by default
- `0666'.
- As another additional feature over `m4', `autom4te' caches its
- results. GNU M4 is able to produce a regular output and traces at the
- same time. Traces are heavily used in the GNU Build System:
- `autoheader' uses them to build `config.h.in', `autoreconf' to
- determine what GNU Build System components are used, `automake' to
- "parse" `configure.ac' etc. To avoid recomputation, traces are cached
- while performing regular expansion, and conversely. This cache is
- (actually, the caches are) stored in the directory `autom4te.cache'.
- _It can safely be removed_ at any moment (especially if for some reason
- `autom4te' considers it trashed).
- `--cache=DIRECTORY'
- `-C DIRECTORY'
- Specify the name of the directory where the result should be
- cached. Passing an empty value disables caching. Be sure to pass
- a relative file name, as for the time being, global caches are not
- supported.
- `--no-cache'
- Don't cache the results.
- `--force'
- `-f'
- If a cache is used, consider it obsolete (but update it anyway).
- Because traces are so important to the GNU Build System, `autom4te'
- provides high level tracing features as compared to M4, and helps
- exploiting the cache:
- `--trace=MACRO[:FORMAT]'
- `-t MACRO[:FORMAT]'
- Trace the invocations of MACRO according to the FORMAT. Multiple
- `--trace' arguments can be used to list several macros. Multiple
- `--trace' arguments for a single macro are not cumulative;
- instead, you should just make FORMAT as long as needed.
- The FORMAT is a regular string, with newlines if desired, and
- several special escape codes. It defaults to `$f:$l:$n:$%'. It
- can use the following special escapes:
- `$$'
- The character `$'.
- `$f'
- The file name from which MACRO is called.
- `$l'
- The line number from which MACRO is called.
- `$d'
- The depth of the MACRO call. This is an M4 technical detail
- that you probably don't want to know about.
- `$n'
- The name of the MACRO.
- `$NUM'
- The NUMth argument of the call to MACRO.
- `$@'
- `$SEP@'
- `${SEPARATOR}@'
- All the arguments passed to MACRO, separated by the character
- SEP or the string SEPARATOR (`,' by default). Each argument
- is quoted, i.e., enclosed in a pair of square brackets.
- `$*'
- `$SEP*'
- `${SEPARATOR}*'
- As above, but the arguments are not quoted.
- `$%'
- `$SEP%'
- `${SEPARATOR}%'
- As above, but the arguments are not quoted, all new line
- characters in the arguments are smashed, and the default
- separator is `:'.
- The escape `$%' produces single-line trace outputs (unless
- you put newlines in the `separator'), while `$@' and `$*' do
- not.
- *Note autoconf Invocation::, for examples of trace uses.
- `--preselect=MACRO'
- `-p MACRO'
- Cache the traces of MACRO, but do not enable traces. This is
- especially important to save CPU cycles in the future. For
- instance, when invoked, `autoconf' preselects all the macros that
- `autoheader', `automake', `autoreconf', etc., trace, so that
- running `m4' is not needed to trace them: the cache suffices.
- This results in a huge speed-up.
- Finally, `autom4te' introduces the concept of "Autom4te libraries".
- They consists in a powerful yet extremely simple feature: sets of
- combined command line arguments:
- `--language=LANGUAGE'
- `-l LANGUAGE'
- Use the LANGUAGE Autom4te library. Current languages include:
- `M4sugar'
- create M4sugar output.
- `M4sh'
- create M4sh executable shell scripts.
- `Autotest'
- create Autotest executable test suites.
- `Autoconf-without-aclocal-m4'
- create Autoconf executable configure scripts without reading
- `aclocal.m4'.
- `Autoconf'
- create Autoconf executable configure scripts. This language
- inherits all the characteristics of
- `Autoconf-without-aclocal-m4' and additionally reads
- `aclocal.m4'.
- `--prepend-include=DIR'
- `-B DIR'
- Prepend directory DIR to the search path. This is used to include
- the language-specific files before any third-party macros.
- As an example, if Autoconf is installed in its default location,
- `/usr/local', the command `autom4te -l m4sugar foo.m4' is strictly
- equivalent to the command:
- autom4te --prepend-include /usr/local/share/autoconf \
- m4sugar/m4sugar.m4f --warnings syntax foo.m4
- Recursive expansion applies here: the command `autom4te -l m4sh foo.m4'
- is the same as `autom4te --language M4sugar m4sugar/m4sh.m4f foo.m4',
- i.e.:
- autom4te --prepend-include /usr/local/share/autoconf \
- m4sugar/m4sugar.m4f m4sugar/m4sh.m4f --mode 777 foo.m4
- The definition of the languages is stored in `autom4te.cfg'.
- File: autoconf.info, Node: Customizing autom4te, Prev: autom4te Invocation, Up: Using autom4te
- 8.2.2 Customizing `autom4te'
- ----------------------------
- One can customize `autom4te' via `~/.autom4te.cfg' (i.e., as found in
- the user home directory), and `./.autom4te.cfg' (i.e., as found in the
- directory from which `autom4te' is run). The order is first reading
- `autom4te.cfg', then `~/.autom4te.cfg', then `./.autom4te.cfg', and
- finally the command line arguments.
- In these text files, comments are introduced with `#', and empty
- lines are ignored. Customization is performed on a per-language basis,
- wrapped in between a `begin-language: "LANGUAGE"', `end-language:
- "LANGUAGE"' pair.
- Customizing a language stands for appending options (*note autom4te
- Invocation::) to the current definition of the language. Options, and
- more generally arguments, are introduced by `args: ARGUMENTS'. You may
- use the traditional shell syntax to quote the ARGUMENTS.
- As an example, to disable Autoconf caches (`autom4te.cache')
- globally, include the following lines in `~/.autom4te.cfg':
- ## ------------------ ##
- ## User Preferences. ##
- ## ------------------ ##
- begin-language: "Autoconf-without-aclocal-m4"
- args: --no-cache
- end-language: "Autoconf-without-aclocal-m4"
- File: autoconf.info, Node: Programming in M4sugar, Next: Debugging via autom4te, Prev: Using autom4te, Up: Programming in M4
- 8.3 Programming in M4sugar
- ==========================
- M4 by itself provides only a small, but sufficient, set of all-purpose
- macros. M4sugar introduces additional generic macros. Its name was
- coined by Lars J. Aas: "Readability And Greater Understanding Stands 4
- M4sugar".
- M4sugar reserves the macro namespace `^_m4_' for internal use, and
- the macro namespace `^m4_' for M4sugar macros. You should not define
- your own macros into these namespaces.
- * Menu:
- * Redefined M4 Macros:: M4 builtins changed in M4sugar
- * Diagnostic Macros:: Diagnostic messages from M4sugar
- * Diversion support:: Diversions in M4sugar
- * Conditional constructs:: Conditions in M4
- * Looping constructs:: Iteration in M4
- * Evaluation Macros:: More quotation and evaluation control
- * Text processing Macros:: String manipulation in M4
- * Number processing Macros:: Arithmetic computation in M4
- * Set manipulation Macros:: Set manipulation in M4
- * Forbidden Patterns:: Catching unexpanded macros
- File: autoconf.info, Node: Redefined M4 Macros, Next: Diagnostic Macros, Up: Programming in M4sugar
- 8.3.1 Redefined M4 Macros
- -------------------------
- With a few exceptions, all the M4 native macros are moved in the `m4_'
- pseudo-namespace, e.g., M4sugar renames `define' as `m4_define' etc.
- The list of macros unchanged from M4, except for their name, is:
- - m4_builtin
- - m4_changecom
- - m4_changequote
- - m4_debugfile
- - m4_debugmode
- - m4_decr
- - m4_define
- - m4_divnum
- - m4_errprint
- - m4_esyscmd
- - m4_eval
- - m4_format
- - m4_ifdef
- - m4_incr
- - m4_index
- - m4_indir
- - m4_len
- - m4_pushdef
- - m4_shift
- - m4_substr
- - m4_syscmd
- - m4_sysval
- - m4_traceoff
- - m4_traceon
- - m4_translit
- Some M4 macros are redefined, and are slightly incompatible with
- their native equivalent.
- -- Macro: __file__
- -- Macro: __line__
- All M4 macros starting with `__' retain their original name: for
- example, no `m4__file__' is defined.
- -- Macro: __oline__
- This is not technically a macro, but a feature of Autom4te. The
- sequence `__oline__' can be used similarly to the other m4sugar
- location macros, but rather than expanding to the location of the
- input file, it is translated to the line number where it appears
- in the output file after all other M4 expansions.
- -- Macro: dnl
- This macro kept its original name: no `m4_dnl' is defined.
- -- Macro: m4_bpatsubst (STRING, REGEXP, [REPLACEMENT])
- This macro corresponds to `patsubst'. The name `m4_patsubst' is
- kept for future versions of M4sugar, once GNU M4 2.0 is released
- and supports extended regular expression syntax.
- -- Macro: m4_bregexp (STRING, REGEXP, [REPLACEMENT])
- This macro corresponds to `regexp'. The name `m4_regexp' is kept
- for future versions of M4sugar, once GNU M4 2.0 is released and
- supports extended regular expression syntax.
- -- Macro: m4_copy (SOURCE, DEST)
- -- Macro: m4_copy_force (SOURCE, DEST)
- -- Macro: m4_rename (SOURCE, DEST)
- -- Macro: m4_rename_force (SOURCE, DEST)
- These macros aren't directly builtins, but are closely related to
- `m4_pushdef' and `m4_defn'. `m4_copy' and `m4_rename' ensure that
- DEST is undefined, while `m4_copy_force' and `m4_rename_force'
- overwrite any existing definition. All four macros then proceed
- to copy the entire pushdef stack of definitions of SOURCE over to
- DEST. `m4_copy' and `m4_copy_force' preserve the source
- (including in the special case where SOURCE is undefined), while
- `m4_rename' and `m4_rename_force' undefine the original macro name
- (making it an error to rename an undefined SOURCE).
- Note that attempting to invoke a renamed macro might not work,
- since the macro may have a dependence on helper macros accessed
- via composition of `$0' but that were not also renamed; likewise,
- other macros may have a hard-coded dependence on SOURCE and could
- break if SOURCE has been deleted. On the other hand, it is always
- safe to rename a macro to temporarily move it out of the way, then
- rename it back later to restore original semantics.
- -- Macro: m4_defn (MACRO...)
- This macro fails if MACRO is not defined, even when using older
- versions of M4 that did not warn. See `m4_undefine'.
- Unfortunately, in order to support these older versions of M4,
- there are some situations involving unbalanced quotes where
- concatenating multiple macros together will work in newer M4 but
- not in m4sugar; use quadrigraphs to work around this.
- -- Macro: m4_divert (DIVERSION)
- M4sugar relies heavily on diversions, so rather than behaving as a
- primitive, `m4_divert' behaves like:
- m4_divert_pop()m4_divert_push([DIVERSION])
- *Note Diversion support::, for more details about the use of the
- diversion stack. In particular, this implies that DIVERSION
- should be a named diversion rather than a raw number. But be
- aware that it is seldom necessary to explicitly change the
- diversion stack, and that when done incorrectly, it can lead to
- syntactically invalid scripts.
- -- Macro: m4_dumpdef (NAME...)
- -- Macro: m4_dumpdefs (NAME...)
- `m4_dumpdef' is like the M4 builtin, except that this version
- requires at least one argument, output always goes to standard
- error rather than the current debug file, no sorting is done on
- multiple arguments, and an error is issued if any NAME is
- undefined. `m4_dumpdefs' is a convenience macro that calls
- `m4_dumpdef' for all of the `m4_pushdef' stack of definitions,
- starting with the current, and silently does nothing if NAME is
- undefined.
- Unfortunately, due to a limitation in M4 1.4.x, any macro defined
- as a builtin is output as the empty string. This behavior is
- rectified by using M4 1.6 or newer. However, this behavior
- difference means that `m4_dumpdef' should only be used while
- developing m4sugar macros, and never in the final published form
- of a macro.
- -- Macro: m4_esyscmd_s (COMMAND)
- Like `m4_esyscmd', this macro expands to the result of running
- COMMAND in a shell. The difference is that any trailing newlines
- are removed, so that the output behaves more like shell command
- substitution.
- -- Macro: m4_exit (EXIT-STATUS)
- This macro corresponds to `m4exit'.
- -- Macro: m4_if (COMMENT)
- -- Macro: m4_if (STRING-1, STRING-2, EQUAL, [NOT-EQUAL])
- -- Macro: m4_if (STRING-1, STRING-2, EQUAL-1, STRING-3, STRING-4,
- EQUAL-2, ..., [NOT-EQUAL])
- This macro corresponds to `ifelse'. STRING-1 and STRING-2 are
- compared literally, so usually one of the two arguments is passed
- unquoted. *Note Conditional constructs::, for more conditional
- idioms.
- -- Macro: m4_include (FILE)
- -- Macro: m4_sinclude (FILE)
- Like the M4 builtins, but warn against multiple inclusions of FILE.
- -- Macro: m4_mkstemp (TEMPLATE)
- -- Macro: m4_maketemp (TEMPLATE)
- Posix requires `maketemp' to replace the trailing `X' characters
- in TEMPLATE with the process id, without regards to the existence
- of a file by that name, but this a security hole. When this was
- pointed out to the Posix folks, they agreed to invent a new macro
- `mkstemp' that always creates a uniquely named file, but not all
- versions of GNU M4 support the new macro. In M4sugar,
- `m4_maketemp' and `m4_mkstemp' are synonyms for each other, and
- both have the secure semantics regardless of which macro the
- underlying M4 provides.
- -- Macro: m4_popdef (MACRO...)
- This macro fails if MACRO is not defined, even when using older
- versions of M4 that did not warn. See `m4_undefine'.
- -- Macro: m4_undefine (MACRO...)
- This macro fails if MACRO is not defined, even when using older
- versions of M4 that did not warn. Use
- m4_ifdef([MACRO], [m4_undefine([MACRO])])
- if you are not sure whether MACRO is defined.
- -- Macro: m4_undivert (DIVERSION...)
- Unlike the M4 builtin, at least one DIVERSION must be specified.
- Also, since the M4sugar diversion stack prefers named diversions,
- the use of `m4_undivert' to include files is risky. *Note
- Diversion support::, for more details about the use of the
- diversion stack. But be aware that it is seldom necessary to
- explicitly change the diversion stack, and that when done
- incorrectly, it can lead to syntactically invalid scripts.
- -- Macro: m4_wrap (TEXT)
- -- Macro: m4_wrap_lifo (TEXT)
- These macros correspond to `m4wrap'. Posix requires arguments of
- multiple wrap calls to be reprocessed at EOF in the same order as
- the original calls (first-in, first-out). GNU M4 versions through
- 1.4.10, however, reprocess them in reverse order (last-in,
- first-out). Both orders are useful, therefore, you can rely on
- `m4_wrap' to provide FIFO semantics and `m4_wrap_lifo' for LIFO
- semantics, regardless of the underlying GNU M4 version.
- Unlike the GNU M4 builtin, these macros only recognize one
- argument, and avoid token pasting between consecutive invocations.
- On the other hand, nested calls to `m4_wrap' from within wrapped
- text work just as in the builtin.
- File: autoconf.info, Node: Diagnostic Macros, Next: Diversion support, Prev: Redefined M4 Macros, Up: Programming in M4sugar
- 8.3.2 Diagnostic messages from M4sugar
- --------------------------------------
- When macros statically diagnose abnormal situations, benign or fatal,
- they should report them using these macros. For issuing dynamic issues,
- i.e., when `configure' is run, see *note Printing Messages::.
- -- Macro: m4_assert (EXPRESSION, [EXIT-STATUS = `1'])
- Assert that the arithmetic EXPRESSION evaluates to non-zero.
- Otherwise, issue a fatal error, and exit `autom4te' with
- EXIT-STATUS.
- -- Macro: m4_errprintn (MESSAGE)
- Similar to the builtin `m4_errprint', except that a newline is
- guaranteed after MESSAGE.
- -- Macro: m4_fatal (MESSAGE)
- Report a severe error MESSAGE prefixed with the current location,
- and have `autom4te' die.
- -- Macro: m4_location
- Useful as a prefix in a message line. Short for:
- __file__:__line__
- -- Macro: m4_warn (CATEGORY, MESSAGE)
- Report MESSAGE as a warning (or as an error if requested by the
- user) if warnings of the CATEGORY are turned on. If the message
- is emitted, it is prefixed with the current location, and followed
- by a call trace of all macros defined via `AC_DEFUN' used to get
- to the current expansion. You are encouraged to use standard
- categories, which currently include:
- `all'
- messages that don't fall into one of the following
- categories. Use of an empty CATEGORY is equivalent.
- `cross'
- related to cross compilation issues.
- `obsolete'
- use of an obsolete construct.
- `syntax'
- dubious syntactic constructs, incorrectly ordered macro calls.
- File: autoconf.info, Node: Diversion support, Next: Conditional constructs, Prev: Diagnostic Macros, Up: Programming in M4sugar
- 8.3.3 Diversion support
- -----------------------
- M4sugar makes heavy use of diversions under the hood, because it is
- often the case that text that must appear early in the output is not
- discovered until late in the input. Additionally, some of the
- topological sorting algorithms used in resolving macro dependencies use
- diversions. However, most macros should not need to change diversions
- directly, but rather rely on higher-level M4sugar macros to manage
- diversions transparently. If you change diversions improperly, you
- risk generating a syntactically invalid script, because an incorrect
- diversion will violate assumptions made by many macros about whether
- prerequisite text has been previously output. In short, if you
- manually change the diversion, you should not expect any macros
- provided by the Autoconf package to work until you have restored the
- diversion stack back to its original state.
- In the rare case that it is necessary to write a macro that
- explicitly outputs text to a different diversion, it is important to be
- aware of an M4 limitation regarding diversions: text only goes to a
- diversion if it is not part of argument collection. Therefore, any
- macro that changes the current diversion cannot be used as an unquoted
- argument to another macro, but must be expanded at the top level. The
- macro `m4_expand' will diagnose any attempt to change diversions, since
- it is generally useful only as an argument to another macro. The
- following example shows what happens when diversion manipulation is
- attempted within macro arguments:
- m4_do([normal text]
- m4_divert_push([KILL])unwanted[]m4_divert_pop([KILL])
- [m4_divert_push([KILL])discarded[]m4_divert_pop([KILL])])dnl
- =>normal text
- =>unwanted
- Notice that the unquoted text `unwanted' is output, even though it was
- processed while the current diversion was `KILL', because it was
- collected as part of the argument to `m4_do'. However, the text
- `discarded' disappeared as desired, because the diversion changes were
- single-quoted, and were not expanded until the top-level rescan of the
- output of `m4_do'.
- To make diversion management easier, M4sugar uses the concept of
- named diversions. Rather than using diversion numbers directly, it is
- nicer to associate a name with each diversion. The diversion number
- associated with a particular diversion name is an implementation
- detail, and a syntax warning is issued if a diversion number is used
- instead of a name. In general, you should not output text to a named
- diversion until after calling the appropriate initialization routine
- for your language (`m4_init', `AS_INIT', `AT_INIT', ...), although
- there are some exceptions documented below.
- M4sugar defines two named diversions.
- `KILL'
- Text written to this diversion is discarded. This is the default
- diversion once M4sugar is initialized.
- `GROW'
- This diversion is used behind the scenes by topological sorting
- macros, such as `AC_REQUIRE'.
- M4sh adds several more named diversions.
- `BINSH'
- This diversion is reserved for the `#!' interpreter line.
- `HEADER-REVISION'
- This diversion holds text from `AC_REVISION'.
- `HEADER-COMMENT'
- This diversion holds comments about the purpose of a file.
- `HEADER-COPYRIGHT'
- This diversion is managed by `AC_COPYRIGHT'.
- `M4SH-SANITIZE'
- This diversion contains M4sh sanitization code, used to ensure
- M4sh is executing in a reasonable shell environment.
- `M4SH-INIT'
- This diversion contains M4sh initialization code, initializing
- variables that are required by other M4sh macros.
- `BODY'
- This diversion contains the body of the shell code, and is the
- default diversion once M4sh is initialized.
- Autotest inherits diversions from M4sh, and changes the default
- diversion from `BODY' back to `KILL'. It also adds several more named
- diversions, with the following subset designed for developer use.
- `PREPARE_TESTS'
- This diversion contains initialization sequences which are executed
- after `atconfig' and `atlocal', and after all command line
- arguments have been parsed, but prior to running any tests. It
- can be used to set up state that is required across all tests.
- This diversion will work even before `AT_INIT'.
- Autoconf inherits diversions from M4sh, and adds the following named
- diversions which developers can utilize.
- `DEFAULTS'
- This diversion contains shell variable assignments to set defaults
- that must be in place before arguments are parsed. This diversion
- is placed early enough in `configure' that it is unsafe to expand
- any autoconf macros into this diversion.
- `HELP_ENABLE'
- If `AC_PRESERVE_HELP_ORDER' was used, then text placed in this
- diversion will be included as part of a quoted here-doc providing
- all of the `--help' output of `configure' related to options
- created by `AC_ARG_WITH' and `AC_ARG_ENABLE'.
- `INIT_PREPARE'
- This diversion occurs after all command line options have been
- parsed, but prior to the main body of the `configure' script. This
- diversion is the last chance to insert shell code such as variable
- assignments or shell function declarations that will used by the
- expansion of other macros.
- For now, the remaining named diversions of Autoconf, Autoheader, and
- Autotest are not documented. In other words, intentionally outputting
- text into an undocumented diversion is subject to breakage in a future
- release of Autoconf.
- -- Macro: m4_cleardivert (DIVERSION...)
- Permanently discard any text that has been diverted into DIVERSION.
- -- Macro: m4_divert_once (DIVERSION, [CONTENT])
- Similar to `m4_divert_text', except that CONTENT is only output to
- DIVERSION if this is the first time that `m4_divert_once' has been
- called with its particular arguments.
- -- Macro: m4_divert_pop ([DIVERSION])
- If provided, check that the current diversion is indeed DIVERSION.
- Then change to the diversion located earlier on the stack, giving
- an error if an attempt is made to pop beyond the initial m4sugar
- diversion of `KILL'.
- -- Macro: m4_divert_push (DIVERSION)
- Remember the former diversion on the diversion stack, and output
- subsequent text into DIVERSION. M4sugar maintains a diversion
- stack, and issues an error if there is not a matching pop for every
- push.
- -- Macro: m4_divert_text (DIVERSION, [CONTENT])
- Output CONTENT and a newline into DIVERSION, without affecting the
- current diversion. Shorthand for:
- m4_divert_push([DIVERSION])CONTENT
- m4_divert_pop([DIVERSION])dnl
- One use of `m4_divert_text' is to develop two related macros, where
- macro `MY_A' does the work, but adjusts what work is performed
- based on whether the optional macro `MY_B' has also been expanded.
- Of course, it is possible to use `AC_BEFORE' within `MY_A' to
- require that `MY_B' occurs first, if it occurs at all. But this
- imposes an ordering restriction on the user; it would be nicer if
- macros `MY_A' and `MY_B' can be invoked in either order. The trick
- is to let `MY_B' leave a breadcrumb in an early diversion, which
- `MY_A' can then use to determine whether `MY_B' has been expanded.
- AC_DEFUN([MY_A],
- [# various actions
- if test -n "$b_was_used"; then
- # extra action
- fi])
- AC_DEFUN([MY_B],
- [AC_REQUIRE([MY_A])dnl
- m4_divert_text([INIT_PREPARE], [b_was_used=true])])
- -- Macro: m4_init
- Initialize the M4sugar environment, setting up the default named
- diversion to be `KILL'.
- File: autoconf.info, Node: Conditional constructs, Next: Looping constructs, Prev: Diversion support, Up: Programming in M4sugar
- 8.3.4 Conditional constructs
- ----------------------------
- The following macros provide additional conditional constructs as
- convenience wrappers around `m4_if'.
- -- Macro: m4_bmatch (STRING, REGEX-1, VALUE-1, [REGEX-2], [VALUE-2],
- ..., [DEFAULT])
- The string STRING is repeatedly compared against a series of REGEX
- arguments; if a match is found, the expansion is the corresponding
- VALUE, otherwise, the macro moves on to the next REGEX. If no
- REGEX match, then the result is the optional DEFAULT, or nothing.
- -- Macro: m4_bpatsubsts (STRING, REGEX-1, SUBST-1, [REGEX-2],
- [SUBST-2], ...)
- The string STRING is altered by REGEX-1 and SUBST-1, as if by:
- m4_bpatsubst([[STRING]], [REGEX], [SUBST])
- The result of the substitution is then passed through the next set
- of REGEX and SUBST, and so forth. An empty SUBST implies deletion
- of any matched portions in the current string. Note that this
- macro over-quotes STRING; this behavior is intentional, so that
- the result of each step of the recursion remains as a quoted
- string. However, it means that anchors (`^' and `$' in the REGEX
- will line up with the extra quotations, and not the characters of
- the original string. The overquoting is removed after the final
- substitution.
- -- Macro: m4_case (STRING, VALUE-1, IF-VALUE-1, [VALUE-2],
- [IF-VALUE-2], ..., [DEFAULT])
- Test STRING against multiple VALUE possibilities, resulting in the
- first IF-VALUE for a match, or in the optional DEFAULT. This is
- shorthand for:
- m4_if([STRING], [VALUE-1], [IF-VALUE-1],
- [STRING], [VALUE-2], [IF-VALUE-2], ...,
- [DEFAULT])
- -- Macro: m4_cond (TEST-1, VALUE-1, IF-VALUE-1, [TEST-2], [VALUE-2],
- [IF-VALUE-2], ..., [DEFAULT])
- This macro was introduced in Autoconf 2.62. Similar to `m4_if',
- except that each TEST is expanded only when it is encountered.
- This is useful for short-circuiting expensive tests; while `m4_if'
- requires all its strings to be expanded up front before doing
- comparisons, `m4_cond' only expands a TEST when all earlier tests
- have failed.
- For an example, these two sequences give the same result, but in
- the case where `$1' does not contain a backslash, the `m4_cond'
- version only expands `m4_index' once, instead of five times, for
- faster computation if this is a common case for `$1'. Notice that
- every third argument is unquoted for `m4_if', and quoted for
- `m4_cond':
- m4_if(m4_index([$1], [\]), [-1], [$2],
- m4_eval(m4_index([$1], [\\]) >= 0), [1], [$2],
- m4_eval(m4_index([$1], [\$]) >= 0), [1], [$2],
- m4_eval(m4_index([$1], [\`]) >= 0), [1], [$3],
- m4_eval(m4_index([$1], [\"]) >= 0), [1], [$3],
- [$2])
- m4_cond([m4_index([$1], [\])], [-1], [$2],
- [m4_eval(m4_index([$1], [\\]) >= 0)], [1], [$2],
- [m4_eval(m4_index([$1], [\$]) >= 0)], [1], [$2],
- [m4_eval(m4_index([$1], [\`]) >= 0)], [1], [$3],
- [m4_eval(m4_index([$1], [\"]) >= 0)], [1], [$3],
- [$2])
- -- Macro: m4_default (EXPR-1, EXPR-2)
- -- Macro: m4_default_quoted (EXPR-1, EXPR-2)
- -- Macro: m4_default_nblank (EXPR-1, [EXPR-2])
- -- Macro: m4_default_nblank_quoted (EXPR-1, [EXPR-2])
- If EXPR-1 contains text, use it. Otherwise, select EXPR-2.
- `m4_default' expands the result, while `m4_default_quoted' does
- not. Useful for providing a fixed default if the expression that
- results in EXPR-1 would otherwise be empty. The difference
- between `m4_default' and `m4_default_nblank' is whether an
- argument consisting of just blanks (space, tab, newline) is
- significant. When using the expanding versions, note that an
- argument may contain text but still expand to an empty string.
- m4_define([active], [ACTIVE])dnl
- m4_define([empty], [])dnl
- m4_define([demo1], [m4_default([$1], [$2])])dnl
- m4_define([demo2], [m4_default_quoted([$1], [$2])])dnl
- m4_define([demo3], [m4_default_nblank([$1], [$2])])dnl
- m4_define([demo4], [m4_default_nblank_quoted([$1], [$2])])dnl
- demo1([active], [default])
- =>ACTIVE
- demo1([], [active])
- =>ACTIVE
- demo1([empty], [text])
- =>
- -demo1([ ], [active])-
- =>- -
- demo2([active], [default])
- =>active
- demo2([], [active])
- =>active
- demo2([empty], [text])
- =>empty
- -demo2([ ], [active])-
- =>- -
- demo3([active], [default])
- =>ACTIVE
- demo3([], [active])
- =>ACTIVE
- demo3([empty], [text])
- =>
- -demo3([ ], [active])-
- =>-ACTIVE-
- demo4([active], [default])
- =>active
- demo4([], [active])
- =>active
- demo4([empty], [text])
- =>empty
- -demo4([ ], [active])-
- =>-active-
- -- Macro: m4_define_default (MACRO, [DEFAULT-DEFINITION])
- If MACRO does not already have a definition, then define it to
- DEFAULT-DEFINITION.
- -- Macro: m4_ifblank (COND, [IF-BLANK], [IF-TEXT])
- -- Macro: m4_ifnblank (COND, [IF-TEXT], [IF-BLANK])
- If COND is empty or consists only of blanks (space, tab, newline),
- then expand IF-BLANK; otherwise, expand IF-TEXT. Two variants
- exist, in order to make it easier to select the correct logical
- sense when using only two parameters. Note that this is more
- efficient than the equivalent behavior of:
- m4_ifval(m4_normalize([COND]), IF-TEXT, IF-BLANK)
- -- Macro: m4_ifndef (MACRO, IF-NOT-DEFINED, [IF-DEFINED])
- This is shorthand for:
- m4_ifdef([MACRO], [IF-DEFINED], [IF-NOT-DEFINED])
- -- Macro: m4_ifset (MACRO, [IF-TRUE], [IF-FALSE])
- If MACRO is undefined, or is defined as the empty string, expand
- to IF-FALSE. Otherwise, expands to IF-TRUE. Similar to:
- m4_ifval(m4_defn([MACRO]), [IF-TRUE], [IF-FALSE])
- except that it is not an error if MACRO is undefined.
- -- Macro: m4_ifval (COND, [IF-TRUE], [IF-FALSE])
- Expands to IF-TRUE if COND is not empty, otherwise to IF-FALSE.
- This is shorthand for:
- m4_if([COND], [], [IF-FALSE], [IF-TRUE])
- -- Macro: m4_ifvaln (COND, [IF-TRUE], [IF-FALSE])
- Similar to `m4_ifval', except guarantee that a newline is present
- after any non-empty expansion. Often followed by `dnl'.
- -- Macro: m4_n (TEXT)
- Expand to TEXT, and add a newline if TEXT is not empty. Often
- followed by `dnl'.
- File: autoconf.info, Node: Looping constructs, Next: Evaluation Macros, Prev: Conditional constructs, Up: Programming in M4sugar
- 8.3.5 Looping constructs
- ------------------------
- The following macros are useful in implementing recursive algorithms in
- M4, including loop operations. An M4 list is formed by quoting a list
- of quoted elements; generally the lists are comma-separated, although
- `m4_foreach_w' is whitespace-separated. For example, the list `[[a],
- [b,c]]' contains two elements: `[a]' and `[b,c]'. It is common to see
- lists with unquoted elements when those elements are not likely to be
- macro names, as in `[fputc_unlocked, fgetc_unlocked]'.
- Although not generally recommended, it is possible for quoted lists
- to have side effects; all side effects are expanded only once, and
- prior to visiting any list element. On the other hand, the fact that
- unquoted macros are expanded exactly once means that macros without
- side effects can be used to generate lists. For example,
- m4_foreach([i], [[1], [2], [3]m4_errprintn([hi])], [i])
- error-->hi
- =>123
- m4_define([list], [[1], [2], [3]])
- =>
- m4_foreach([i], [list], [i])
- =>123
- -- Macro: m4_argn (N, [ARG]...)
- Extracts argument N (larger than 0) from the remaining arguments.
- If there are too few arguments, the empty string is used. For any
- N besides 1, this is more efficient than the similar
- `m4_car(m4_shiftn([N], [], [ARG...]))'.
- -- Macro: m4_car (ARG...)
- Expands to the quoted first ARG. Can be used with `m4_cdr' to
- recursively iterate through a list. Generally, when using quoted
- lists of quoted elements, `m4_car' should be called without any
- extra quotes.
- -- Macro: m4_cdr (ARG...)
- Expands to a quoted list of all but the first ARG, or the empty
- string if there was only one argument. Generally, when using
- quoted lists of quoted elements, `m4_cdr' should be called without
- any extra quotes.
- For example, this is a simple implementation of `m4_map'; note how
- each iteration checks for the end of recursion, then merely
- applies the first argument to the first element of the list, then
- repeats with the rest of the list. (The actual implementation in
- M4sugar is a bit more involved, to gain some speed and share code
- with `m4_map_sep', and also to avoid expanding side effects in
- `$2' twice).
- m4_define([m4_map], [m4_ifval([$2],
- [m4_apply([$1], m4_car($2))[]$0([$1], m4_cdr($2))])])dnl
- m4_map([ m4_eval], [[[1]], [[1+1]], [[10],[16]]])
- => 1 2 a
- -- Macro: m4_for (VAR, FIRST, LAST, [STEP], EXPRESSION)
- Loop over the numeric values between FIRST and LAST including
- bounds by increments of STEP. For each iteration, expand
- EXPRESSION with the numeric value assigned to VAR. If STEP is
- omitted, it defaults to `1' or `-1' depending on the order of the
- limits. If given, STEP has to match this order. The number of
- iterations is determined independently from definition of VAR;
- iteration cannot be short-circuited or lengthened by modifying VAR
- from within EXPRESSION.
- -- Macro: m4_foreach (VAR, LIST, EXPRESSION)
- Loop over the comma-separated M4 list LIST, assigning each value
- to VAR, and expand EXPRESSION. The following example outputs two
- lines:
- m4_foreach([myvar], [[foo], [bar, baz]],
- [echo myvar
- ])dnl
- =>echo foo
- =>echo bar, baz
- Note that for some forms of EXPRESSION, it may be faster to use
- `m4_map_args'.
- -- Macro: m4_foreach_w (VAR, LIST, EXPRESSION)
- Loop over the white-space-separated list LIST, assigning each value
- to VAR, and expand EXPRESSION. If VAR is only referenced once in
- EXPRESSION, it is more efficient to use `m4_map_args_w'.
- The deprecated macro `AC_FOREACH' is an alias of `m4_foreach_w'.
- -- Macro: m4_map (MACRO, LIST)
- -- Macro: m4_mapall (MACRO, LIST)
- -- Macro: m4_map_sep (MACRO, SEPARATOR, LIST)
- -- Macro: m4_mapall_sep (MACRO, SEPARATOR, LIST)
- Loop over the comma separated quoted list of argument descriptions
- in LIST, and invoke MACRO with the arguments. An argument
- description is in turn a comma-separated quoted list of quoted
- elements, suitable for `m4_apply'. The macros `m4_map' and
- `m4_map_sep' ignore empty argument descriptions, while `m4_mapall'
- and `m4_mapall_sep' invoke MACRO with no arguments. The macros
- `m4_map_sep' and `m4_mapall_sep' additionally expand SEPARATOR
- between invocations of MACRO.
- Note that SEPARATOR is expanded, unlike in `m4_join'. When
- separating output with commas, this means that the map result can
- be used as a series of arguments, by using a single-quoted comma as
- SEPARATOR, or as a single string, by using a double-quoted comma.
- m4_map([m4_count], [])
- =>
- m4_map([ m4_count], [[],
- [[1]],
- [[1], [2]]])
- => 1 2
- m4_mapall([ m4_count], [[],
- [[1]],
- [[1], [2]]])
- => 0 1 2
- m4_map_sep([m4_eval], [,], [[[1+2]],
- [[10], [16]]])
- =>3,a
- m4_map_sep([m4_echo], [,], [[[a]], [[b]]])
- =>a,b
- m4_count(m4_map_sep([m4_echo], [,], [[[a]], [[b]]]))
- =>2
- m4_map_sep([m4_echo], [[,]], [[[a]], [[b]]])
- =>a,b
- m4_count(m4_map_sep([m4_echo], [[,]], [[[a]], [[b]]]))
- =>1
- -- Macro: m4_map_args (MACRO, ARG...)
- Repeatedly invoke MACRO with each successive ARG as its only
- argument. In the following example, three solutions are presented
- with the same expansion; the solution using `m4_map_args' is the
- most efficient.
- m4_define([active], [ACTIVE])dnl
- m4_foreach([var], [[plain], [active]], [ m4_echo(m4_defn([var]))])
- => plain active
- m4_map([ m4_echo], [[[plain]], [[active]]])
- => plain active
- m4_map_args([ m4_echo], [plain], [active])
- => plain active
- In cases where it is useful to operate on additional parameters
- besides the list elements, the macro `m4_curry' can be used in
- MACRO to supply the argument currying necessary to generate the
- desired argument list. In the following example, `list_add_n' is
- more efficient than `list_add_x'. On the other hand, using
- `m4_map_args_sep' can be even more efficient.
- m4_define([list], [[1], [2], [3]])dnl
- m4_define([add], [m4_eval(([$1]) + ([$2]))])dnl
- dnl list_add_n(N, ARG...)
- dnl Output a list consisting of each ARG added to N
- m4_define([list_add_n],
- [m4_shift(m4_map_args([,m4_curry([add], [$1])], m4_shift($@)))])dnl
- list_add_n([1], list)
- =>2,3,4
- list_add_n([2], list)
- =>3,4,5
- m4_define([list_add_x],
- [m4_shift(m4_foreach([var], m4_dquote(m4_shift($@)),
- [,add([$1],m4_defn([var]))]))])dnl
- list_add_x([1], list)
- =>2,3,4
- -- Macro: m4_map_args_pair (MACRO, [MACRO-END = `macro'], ARG...)
- For every pair of arguments ARG, invoke MACRO with two arguments.
- If there is an odd number of arguments, invoke MACRO-END, which
- defaults to MACRO, with the remaining argument.
- m4_map_args_pair([, m4_reverse], [], [1], [2], [3])
- =>, 2, 1, 3
- m4_map_args_pair([, m4_reverse], [, m4_dquote], [1], [2], [3])
- =>, 2, 1, [3]
- m4_map_args_pair([, m4_reverse], [, m4_dquote], [1], [2], [3], [4])
- =>, 2, 1, 4, 3
- -- Macro: m4_map_args_sep ([PRE], [POST], [SEP], ARG...)
- Expand the sequence `PRE[ARG]POST' for each argument, additionally
- expanding SEP between arguments. One common use of this macro is
- constructing a macro call, where the opening and closing
- parentheses are split between PRE and POST; in particular,
- `m4_map_args([MACRO], [ARG])' is equivalent to
- `m4_map_args_sep([MACRO(], [)], [], [ARG])'. This macro provides
- the most efficient means for iterating over an arbitrary list of
- arguments, particularly when repeatedly constructing a macro call
- with more arguments than ARG.
- -- Macro: m4_map_args_w (STRING, [PRE], [POST], [SEP])
- Expand the sequence `PRE[word]POST' for each word in the
- whitespace-separated STRING, additionally expanding SEP between
- words. This macro provides the most efficient means for iterating
- over a whitespace-separated string. In particular,
- `m4_map_args_w([STRING], [ACTION(], [)])' is more efficient than
- `m4_foreach_w([var], [STRING], [ACTION(m4_defn([var]))])'.
- -- Macro: m4_shiftn (COUNT, ...)
- -- Macro: m4_shift2 (...)
- -- Macro: m4_shift3 (...)
- `m4_shiftn' performs COUNT iterations of `m4_shift', along with
- validation that enough arguments were passed in to match the shift
- count, and that the count is positive. `m4_shift2' and
- `m4_shift3' are specializations of `m4_shiftn', introduced in
- Autoconf 2.62, and are more efficient for two and three shifts,
- respectively.
- -- Macro: m4_stack_foreach (MACRO, ACTION)
- -- Macro: m4_stack_foreach_lifo (MACRO, ACTION)
- For each of the `m4_pushdef' definitions of MACRO, expand ACTION
- with the single argument of a definition of MACRO.
- `m4_stack_foreach' starts with the oldest definition, while
- `m4_stack_foreach_lifo' starts with the current definition.
- ACTION should not push or pop definitions of MACRO, nor is there
- any guarantee that the current definition of MACRO matches the
- argument that was passed to ACTION. The macro `m4_curry' can be
- used if ACTION needs more than one argument, although in that case
- it is more efficient to use M4_STACK_FOREACH_SEP.
- Due to technical limitations, there are a few low-level m4sugar
- functions, such as `m4_pushdef', that cannot be used as the MACRO
- argument.
- m4_pushdef([a], [1])m4_pushdef([a], [2])dnl
- m4_stack_foreach([a], [ m4_incr])
- => 2 3
- m4_stack_foreach_lifo([a], [ m4_curry([m4_substr], [abcd])])
- => cd bcd
- -- Macro: m4_stack_foreach_sep (MACRO, [PRE], [POST], [SEP])
- -- Macro: m4_stack_foreach_sep_lifo (MACRO, [PRE], [POST], [SEP])
- Expand the sequence `PRE[definition]POST' for each `m4_pushdef'
- definition of MACRO, additionally expanding SEP between
- definitions. `m4_stack_foreach_sep' visits the oldest definition
- first, while `m4_stack_foreach_sep_lifo' visits the current
- definition first. This macro provides the most efficient means
- for iterating over a pushdef stack. In particular,
- `m4_stack_foreach([MACRO], [ACTION])' is short for
- `m4_stack_foreach_sep([MACRO], [ACTION(], [)])'.
- File: autoconf.info, Node: Evaluation Macros, Next: Text processing Macros, Prev: Looping constructs, Up: Programming in M4sugar
- 8.3.6 Evaluation Macros
- -----------------------
- The following macros give some control over the order of the evaluation
- by adding or removing levels of quotes.
- -- Macro: m4_apply (MACRO, LIST)
- Apply the elements of the quoted, comma-separated LIST as the
- arguments to MACRO. If LIST is empty, invoke MACRO without
- arguments. Note the difference between `m4_indir', which expects
- its first argument to be a macro name but can use names that are
- otherwise invalid, and `m4_apply', where MACRO can contain other
- text, but must end in a valid macro name.
- m4_apply([m4_count], [])
- =>0
- m4_apply([m4_count], [[]])
- =>1
- m4_apply([m4_count], [[1], [2]])
- =>2
- m4_apply([m4_join], [[|], [1], [2]])
- =>1|2
- -- Macro: m4_count (ARG, ...)
- This macro returns the decimal count of the number of arguments it
- was passed.
- -- Macro: m4_curry (MACRO, ARG...)
- This macro performs argument currying. The expansion of this
- macro is another macro name that expects exactly one argument;
- that argument is then appended to the ARG list, and then MACRO is
- expanded with the resulting argument list.
- m4_curry([m4_curry], [m4_reverse], [1])([2])([3])
- =>3, 2, 1
- Unfortunately, due to a limitation in M4 1.4.x, it is not possible
- to pass the definition of a builtin macro as the argument to the
- output of `m4_curry'; the empty string is used instead of the
- builtin token. This behavior is rectified by using M4 1.6 or
- newer.
- -- Macro: m4_do (ARG, ...)
- This macro loops over its arguments and expands each ARG in
- sequence. Its main use is for readability; it allows the use of
- indentation and fewer `dnl' to result in the same expansion. This
- macro guarantees that no expansion will be concatenated with
- subsequent text; to achieve full concatenation, use
- `m4_unquote(m4_join([], ARG...))'.
- m4_define([ab],[1])m4_define([bc],[2])m4_define([abc],[3])dnl
- m4_do([a],[b])c
- =>abc
- m4_unquote(m4_join([],[a],[b]))c
- =>3
- m4_define([a],[A])m4_define([b],[B])m4_define([c],[C])dnl
- m4_define([AB],[4])m4_define([BC],[5])m4_define([ABC],[6])dnl
- m4_do([a],[b])c
- =>ABC
- m4_unquote(m4_join([],[a],[b]))c
- =>3
- -- Macro: m4_dquote (ARG, ...)
- Return the arguments as a quoted list of quoted arguments.
- Conveniently, if there is just one ARG, this effectively adds a
- level of quoting.
- -- Macro: m4_dquote_elt (ARG, ...)
- Return the arguments as a series of double-quoted arguments.
- Whereas `m4_dquote' returns a single argument, `m4_dquote_elt'
- returns as many arguments as it was passed.
- -- Macro: m4_echo (ARG, ...)
- Return the arguments, with the same level of quoting. Other than
- discarding whitespace after unquoted commas, this macro is a no-op.
- -- Macro: m4_expand (ARG)
- Return the expansion of ARG as a quoted string. Whereas
- `m4_quote' is designed to collect expanded text into a single
- argument, `m4_expand' is designed to perform one level of expansion
- on quoted text. One distinction is in the treatment of whitespace
- following a comma in the original ARG. Any time multiple
- arguments are collected into one with `m4_quote', the M4 argument
- collection rules discard the whitespace. However, with
- `m4_expand', whitespace is preserved, even after the expansion of
- macros contained in ARG. Additionally, `m4_expand' is able to
- expand text that would involve an unterminated comment, whereas
- expanding that same text as the argument to `m4_quote' runs into
- difficulty in finding the end of the argument. Since manipulating
- diversions during argument collection is inherently unsafe,
- `m4_expand' issues an error if ARG attempts to change the current
- diversion (*note Diversion support::).
- m4_define([active], [ACT, IVE])dnl
- m4_define([active2], [[ACT, IVE]])dnl
- m4_quote(active, active)
- =>ACT,IVE,ACT,IVE
- m4_expand([active, active])
- =>ACT, IVE, ACT, IVE
- m4_quote(active2, active2)
- =>ACT, IVE,ACT, IVE
- m4_expand([active2, active2])
- =>ACT, IVE, ACT, IVE
- m4_expand([# m4_echo])
- =># m4_echo
- m4_quote(# m4_echo)
- )
- =># m4_echo)
- =>
- Note that `m4_expand' cannot handle an ARG that expands to literal
- unbalanced quotes, but that quadrigraphs can be used when
- unbalanced output is necessary. Likewise, unbalanced parentheses
- should be supplied with double quoting or a quadrigraph.
- m4_define([pattern], [[!@<:@]])dnl
- m4_define([bar], [BAR])dnl
- m4_expand([case $foo in
- m4_defn([pattern])@:}@ bar ;;
- *[)] blah ;;
- esac])
- =>case $foo in
- => [![]) BAR ;;
- => *) blah ;;
- =>esac
- -- Macro: m4_ignore (...)
- This macro was introduced in Autoconf 2.62. Expands to nothing,
- ignoring all of its arguments. By itself, this isn't very useful.
- However, it can be used to conditionally ignore an arbitrary
- number of arguments, by deciding which macro name to apply to a
- list of arguments.
- dnl foo outputs a message only if [debug] is defined.
- m4_define([foo],
- [m4_ifdef([debug],[AC_MSG_NOTICE],[m4_ignore])([debug message])])
- Note that for earlier versions of Autoconf, the macro `__gnu__' can
- serve the same purpose, although it is less readable.
- -- Macro: m4_make_list (ARG, ...)
- This macro exists to aid debugging of M4sugar algorithms. Its net
- effect is similar to `m4_dquote'--it produces a quoted list of
- quoted arguments, for each ARG. The difference is that this
- version uses a comma-newline separator instead of just comma, to
- improve readability of the list; with the result that it is less
- efficient than `m4_dquote'.
- m4_define([zero],[0])m4_define([one],[1])m4_define([two],[2])dnl
- m4_dquote(zero, [one], [[two]])
- =>[0],[one],[[two]]
- m4_make_list(zero, [one], [[two]])
- =>[0],
- =>[one],
- =>[[two]]
- m4_foreach([number], m4_dquote(zero, [one], [[two]]), [ number])
- => 0 1 two
- m4_foreach([number], m4_make_list(zero, [one], [[two]]), [ number])
- => 0 1 two
- -- Macro: m4_quote (ARG, ...)
- Return the arguments as a single entity, i.e., wrap them into a
- pair of quotes. This effectively collapses multiple arguments
- into one, although it loses whitespace after unquoted commas in
- the process.
- -- Macro: m4_reverse (ARG, ...)
- Outputs each argument with the same level of quoting, but in
- reverse order, and with space following each comma for readability.
- m4_define([active], [ACT,IVE])
- =>
- m4_reverse(active, [active])
- =>active, IVE, ACT
- -- Macro: m4_unquote (ARG, ...)
- This macro was introduced in Autoconf 2.62. Expand each argument,
- separated by commas. For a single ARG, this effectively removes a
- layer of quoting, and `m4_unquote([ARG])' is more efficient than
- the equivalent `m4_do([ARG])'. For multiple arguments, this
- results in an unquoted list of expansions. This is commonly used
- with `m4_split', in order to convert a single quoted list into a
- series of quoted elements.
- The following example aims at emphasizing the difference between
- several scenarios: not using these macros, using `m4_defn', using
- `m4_quote', using `m4_dquote', and using `m4_expand'.
- $ cat example.m4
- dnl Overquote, so that quotes are visible.
- m4_define([show], [$[]1 = [$1], $[]@ = [$@]])
- m4_define([a], [A])
- m4_define([mkargs], [1, 2[,] 3])
- m4_define([arg1], [[$1]])
- m4_divert([0])dnl
- show(a, b)
- show([a, b])
- show(m4_quote(a, b))
- show(m4_dquote(a, b))
- show(m4_expand([a, b]))
- arg1(mkargs)
- arg1([mkargs])
- arg1(m4_defn([mkargs]))
- arg1(m4_quote(mkargs))
- arg1(m4_dquote(mkargs))
- arg1(m4_expand([mkargs]))
- $ autom4te -l m4sugar example.m4
- $1 = A, $@ = [A],[b]
- $1 = a, b, $@ = [a, b]
- $1 = A,b, $@ = [A,b]
- $1 = [A],[b], $@ = [[A],[b]]
- $1 = A, b, $@ = [A, b]
- 1
- mkargs
- 1, 2[,] 3
- 1,2, 3
- [1],[2, 3]
- 1, 2, 3
- File: autoconf.info, Node: Text processing Macros, Next: Number processing Macros, Prev: Evaluation Macros, Up: Programming in M4sugar
- 8.3.7 String manipulation in M4
- -------------------------------
- The following macros may be used to manipulate strings in M4. Many of
- the macros in this section intentionally result in quoted strings as
- output, rather than subjecting the arguments to further expansions. As
- a result, if you are manipulating text that contains active M4
- characters, the arguments are passed with single quoting rather than
- double.
- -- Macro: m4_append (MACRO-NAME, STRING, [SEPARATOR])
- -- Macro: m4_append_uniq (MACRO-NAME, STRING, [SEPARATOR] [IF-UNIQ],
- [IF-DUPLICATE])
- Redefine MACRO-NAME to its former contents with SEPARATOR and
- STRING added at the end. If MACRO-NAME was undefined before (but
- not if it was defined but empty), then no SEPARATOR is added. As
- of Autoconf 2.62, neither STRING nor SEPARATOR are expanded during
- this macro; instead, they are expanded when MACRO-NAME is invoked.
- `m4_append' can be used to grow strings, and `m4_append_uniq' to
- grow strings without duplicating substrings. Additionally,
- `m4_append_uniq' takes two optional parameters as of Autoconf 2.62;
- IF-UNIQ is expanded if STRING was appended, and IF-DUPLICATE is
- expanded if STRING was already present. Also, `m4_append_uniq'
- warns if SEPARATOR is not empty, but occurs within STRING, since
- that can lead to duplicates.
- Note that `m4_append' can scale linearly in the length of the final
- string, depending on the quality of the underlying M4
- implementation, while `m4_append_uniq' has an inherent quadratic
- scaling factor. If an algorithm can tolerate duplicates in the
- final string, use the former for speed. If duplicates must be
- avoided, consider using `m4_set_add' instead (*note Set
- manipulation Macros::).
- m4_define([active], [ACTIVE])dnl
- m4_append([sentence], [This is an])dnl
- m4_append([sentence], [ active ])dnl
- m4_append([sentence], [symbol.])dnl
- sentence
- =>This is an ACTIVE symbol.
- m4_undefine([active])dnl
- =>This is an active symbol.
- m4_append_uniq([list], [one], [, ], [new], [existing])
- =>new
- m4_append_uniq([list], [one], [, ], [new], [existing])
- =>existing
- m4_append_uniq([list], [two], [, ], [new], [existing])
- =>new
- m4_append_uniq([list], [three], [, ], [new], [existing])
- =>new
- m4_append_uniq([list], [two], [, ], [new], [existing])
- =>existing
- list
- =>one, two, three
- m4_dquote(list)
- =>[one],[two],[three]
- m4_append([list2], [one], [[, ]])dnl
- m4_append_uniq([list2], [two], [[, ]])dnl
- m4_append([list2], [three], [[, ]])dnl
- list2
- =>one, two, three
- m4_dquote(list2)
- =>[one, two, three]
- -- Macro: m4_append_uniq_w (MACRO-NAME, STRINGS)
- This macro was introduced in Autoconf 2.62. It is similar to
- `m4_append_uniq', but treats STRINGS as a whitespace separated
- list of words to append, and only appends unique words.
- MACRO-NAME is updated with a single space between new words.
- m4_append_uniq_w([numbers], [1 1 2])dnl
- m4_append_uniq_w([numbers], [ 2 3 ])dnl
- numbers
- =>1 2 3
- -- Macro: m4_chomp (STRING)
- -- Macro: m4_chomp_all (STRING)
- Output STRING in quotes, but without a trailing newline. The
- macro `m4_chomp' is slightly faster, and removes at most one
- newline; the macro `m4_chomp_all' removes all consecutive trailing
- newlines. Unlike `m4_flatten', embedded newlines are left intact,
- and backslash does not influence the result.
- -- Macro: m4_combine ([SEPARATOR], PREFIX-LIST, [INFIX], SUFFIX-1,
- [SUFFIX-2], ...)
- This macro produces a quoted string containing the pairwise
- combination of every element of the quoted, comma-separated
- PREFIX-LIST, and every element from the SUFFIX arguments. Each
- pairwise combination is joined with INFIX in the middle, and
- successive pairs are joined by SEPARATOR. No expansion occurs on
- any of the arguments. No output occurs if either the PREFIX or
- SUFFIX list is empty, but the lists can contain empty elements.
- m4_define([a], [oops])dnl
- m4_combine([, ], [[a], [b], [c]], [-], [1], [2], [3])
- =>a-1, a-2, a-3, b-1, b-2, b-3, c-1, c-2, c-3
- m4_combine([, ], [[a], [b]], [-])
- =>
- m4_combine([, ], [[a], [b]], [-], [])
- =>a-, b-
- m4_combine([, ], [], [-], [1], [2])
- =>
- m4_combine([, ], [[]], [-], [1], [2])
- =>-1, -2
- -- Macro: m4_escape (STRING)
- Convert all instances of `[', `]', `#', and `$' within STRING into
- their respective quadrigraphs. The result is still a quoted
- string.
- -- Macro: m4_flatten (STRING)
- Flatten STRING into a single line. Delete all backslash-newline
- pairs, and replace all remaining newlines with a space. The
- result is still a quoted string.
- -- Macro: m4_join ([SEPARATOR], ARGS...)
- -- Macro: m4_joinall ([SEPARATOR], ARGS...)
- Concatenate each ARG, separated by SEPARATOR. `joinall' uses
- every argument, while `join' omits empty arguments so that there
- are no back-to-back separators in the output. The result is a
- quoted string.
- m4_define([active], [ACTIVE])dnl
- m4_join([|], [one], [], [active], [two])
- =>one|active|two
- m4_joinall([|], [one], [], [active], [two])
- =>one||active|two
- Note that if all you intend to do is join ARGS with commas between
- them, to form a quoted list suitable for `m4_foreach', it is more
- efficient to use `m4_dquote'.
- -- Macro: m4_newline ([TEXT])
- This macro was introduced in Autoconf 2.62, and expands to a
- newline, followed by any TEXT. It is primarily useful for
- maintaining macro formatting, and ensuring that M4 does not
- discard leading whitespace during argument collection.
- -- Macro: m4_normalize (STRING)
- Remove leading and trailing spaces and tabs, sequences of
- backslash-then-newline, and replace multiple spaces, tabs, and
- newlines with a single space. This is a combination of
- `m4_flatten' and `m4_strip'. To determine if STRING consists only
- of bytes that would be removed by `m4_normalize', you can use
- `m4_ifblank'.
- -- Macro: m4_re_escape (STRING)
- Backslash-escape all characters in STRING that are active in
- regexps.
- -- Macro: m4_split (STRING, [REGEXP = `[\t ]+'])
- Split STRING into an M4 list of elements quoted by `[' and `]',
- while keeping white space at the beginning and at the end. If
- REGEXP is given, use it instead of `[\t ]+' for splitting. If
- STRING is empty, the result is an empty list.
- -- Macro: m4_strip (STRING)
- Strip whitespace from STRING. Sequences of spaces and tabs are
- reduced to a single space, then leading and trailing spaces are
- removed. The result is still a quoted string. Note that this
- does not interfere with newlines; if you want newlines stripped as
- well, consider `m4_flatten', or do it all at once with
- `m4_normalize'. To quickly test if STRING has only whitespace,
- use `m4_ifblank'.
- -- Macro: m4_text_box (MESSAGE, [FRAME = `-'])
- Add a text box around MESSAGE, using FRAME as the border character
- above and below the message. The FRAME argument must be a single
- byte, and does not support quadrigraphs. The frame correctly
- accounts for the subsequent expansion of MESSAGE. For example:
- m4_define([macro], [abc])dnl
- m4_text_box([macro])
- =>## --- ##
- =>## abc ##
- =>## --- ##
- The MESSAGE must contain balanced quotes and parentheses, although
- quadrigraphs can be used to work around this.
- -- Macro: m4_text_wrap (STRING, [PREFIX], [PREFIX1 = `PREFIX'], [WIDTH
- = `79'])
- Break STRING into a series of whitespace-separated words, then
- output those words separated by spaces, and wrapping lines any
- time the output would exceed WIDTH columns. If given, PREFIX1
- begins the first line, and PREFIX begins all wrapped lines. If
- PREFIX1 is longer than PREFIX, then the first line consists of
- just PREFIX1. If PREFIX is longer than PREFIX1, padding is
- inserted so that the first word of STRING begins at the same
- indentation as all wrapped lines. Note that using literal tab
- characters in any of the arguments will interfere with the
- calculation of width. No expansions occur on PREFIX, PREFIX1, or
- the words of STRING, although quadrigraphs are recognized.
- For some examples:
- m4_text_wrap([Short string */], [ ], [/* ], [20])
- =>/* Short string */
- m4_text_wrap([Much longer string */], [ ], [/* ], [20])
- =>/* Much longer
- => string */
- m4_text_wrap([Short doc.], [ ], [ --short ], [30])
- => --short Short doc.
- m4_text_wrap([Short doc.], [ ], [ --too-wide ], [30])
- => --too-wide
- => Short doc.
- m4_text_wrap([Super long documentation.], [ ],
- [ --too-wide ], 30)
- => --too-wide
- => Super long
- => documentation.
- -- Macro: m4_tolower (STRING)
- -- Macro: m4_toupper (STRING)
- Return STRING with letters converted to upper or lower case,
- respectively.
- File: autoconf.info, Node: Number processing Macros, Next: Set manipulation Macros, Prev: Text processing Macros, Up: Programming in M4sugar
- 8.3.8 Arithmetic computation in M4
- ----------------------------------
- The following macros facilitate integer arithmetic operations. Where a
- parameter is documented as taking an arithmetic expression, you can use
- anything that can be parsed by `m4_eval'.
- -- Macro: m4_cmp (EXPR-1, EXPR-2)
- Compare the arithmetic expressions EXPR-1 and EXPR-2, and expand
- to `-1' if EXPR-1 is smaller, `0' if they are equal, and `1' if
- EXPR-1 is larger.
- -- Macro: m4_list_cmp (LIST-1, LIST-2)
- Compare the two M4 lists consisting of comma-separated arithmetic
- expressions, left to right. Expand to `-1' for the first element
- pairing where the value from LIST-1 is smaller, `1' where the
- value from LIST-2 is smaller, or `0' if both lists have the same
- values. If one list is shorter than the other, the remaining
- elements of the longer list are compared against zero.
- m4_list_cmp([1, 0], [1])
- =>0
- m4_list_cmp([1, [1 * 0]], [1, 0])
- =>0
- m4_list_cmp([1, 2], [1, 0])
- =>1
- m4_list_cmp([1, [1+1], 3],[1, 2])
- =>1
- m4_list_cmp([1, 2, -3], [1, 2])
- =>-1
- m4_list_cmp([1, 0], [1, 2])
- =>-1
- m4_list_cmp([1], [1, 2])
- =>-1
- -- Macro: m4_max (ARG, ...)
- This macro was introduced in Autoconf 2.62. Expand to the decimal
- value of the maximum arithmetic expression among all the arguments.
- -- Macro: m4_min (ARG, ...)
- This macro was introduced in Autoconf 2.62. Expand to the decimal
- value of the minimum arithmetic expression among all the arguments.
- -- Macro: m4_sign (EXPR)
- Expand to `-1' if the arithmetic expression EXPR is negative, `1'
- if it is positive, and `0' if it is zero.
- -- Macro: m4_version_compare (VERSION-1, VERSION-2)
- This macro was introduced in Autoconf 2.53, but had a number of
- usability limitations that were not lifted until Autoconf 2.62.
- Compare the version strings VERSION-1 and VERSION-2, and expand to
- `-1' if VERSION-1 is smaller, `0' if they are the same, or `1'
- VERSION-2 is smaller. Version strings must be a list of elements
- separated by `.', `,' or `-', where each element is a number along
- with optional case-insensitive letters designating beta releases.
- The comparison stops at the leftmost element that contains a
- difference, although a 0 element compares equal to a missing
- element.
- It is permissible to include commit identifiers in VERSION, such
- as an abbreviated SHA1 of the commit, provided there is still a
- monotonically increasing prefix to allow for accurate version-based
- comparisons. For example, this paragraph was written when the
- development snapshot of autoconf claimed to be at version
- `2.61a-248-dc51', or 248 commits after the 2.61a release, with an
- abbreviated commit identification of `dc51'.
- m4_version_compare([1.1], [2.0])
- =>-1
- m4_version_compare([2.0b], [2.0a])
- =>1
- m4_version_compare([1.1.1], [1.1.1a])
- =>-1
- m4_version_compare([1.2], [1.1.1a])
- =>1
- m4_version_compare([1.0], [1])
- =>0
- m4_version_compare([1.1pre], [1.1PRE])
- =>0
- m4_version_compare([1.1a], [1,10])
- =>-1
- m4_version_compare([2.61a], [2.61a-248-dc51])
- =>-1
- m4_version_compare([2.61b], [2.61a-248-dc51])
- =>1
- -- Macro: m4_version_prereq (VERSION, [IF-NEW-ENOUGH], [IF-OLD =
- `m4_fatal'])
- Compares VERSION against the version of Autoconf currently
- running. If the running version is at VERSION or newer, expand
- IF-NEW-ENOUGH, but if VERSION is larger than the version currently
- executing, expand IF-OLD, which defaults to printing an error
- message and exiting m4sugar with status 63. When given only one
- argument, this behaves like `AC_PREREQ' (*note Versioning::).
- Remember that the autoconf philosophy favors feature checks over
- version checks.
- File: autoconf.info, Node: Set manipulation Macros, Next: Forbidden Patterns, Prev: Number processing Macros, Up: Programming in M4sugar
- 8.3.9 Set manipulation in M4
- ----------------------------
- Sometimes, it is necessary to track a set of data, where the order does
- not matter and where there are no duplicates in the set. The following
- macros facilitate set manipulations. Each set is an opaque object,
- which can only be accessed via these basic operations. The underlying
- implementation guarantees linear scaling for set creation, which is more
- efficient than using the quadratic `m4_append_uniq'. Both set names
- and values can be arbitrary strings, except for unbalanced quotes.
- This implementation ties up memory for removed elements until the next
- operation that must traverse all the elements of a set; and although
- that may slow down some operations until the memory for removed elements
- is pruned, it still guarantees linear performance.
- -- Macro: m4_set_add (SET, VALUE, [IF-UNIQ], [IF-DUP])
- Adds the string VALUE as a member of set SET. Expand IF-UNIQ if
- the element was added, or IF-DUP if it was previously in the set.
- Operates in amortized constant time, so that set creation scales
- linearly.
- -- Macro: m4_set_add_all (SET, VALUE...)
- Adds each VALUE to the set SET. This is slightly more efficient
- than repeatedly invoking `m4_set_add'.
- -- Macro: m4_set_contains (SET, VALUE, [IF-PRESENT], [IF-ABSENT])
- Expands IF-PRESENT if the string VALUE is a member of SET,
- otherwise IF-ABSENT.
- m4_set_contains([a], [1], [yes], [no])
- =>no
- m4_set_add([a], [1], [added], [dup])
- =>added
- m4_set_add([a], [1], [added], [dup])
- =>dup
- m4_set_contains([a], [1], [yes], [no])
- =>yes
- m4_set_remove([a], [1], [removed], [missing])
- =>removed
- m4_set_contains([a], [1], [yes], [no])
- =>no
- m4_set_remove([a], [1], [removed], [missing])
- =>missing
- -- Macro: m4_set_contents (SET, [SEP])
- -- Macro: m4_set_dump (SET, [SEP])
- Expands to a single string consisting of all the members of the set
- SET, each separated by SEP, which is not expanded.
- `m4_set_contents' leaves the elements in SET but reclaims any
- memory occupied by removed elements, while `m4_set_dump' is a
- faster one-shot action that also deletes the set. No provision is
- made for disambiguating members that contain a non-empty SEP as a
- substring; use `m4_set_empty' to distinguish between an empty set
- and the set containing only the empty string. The order of the
- output is unspecified; in the current implementation, part of the
- speed of `m4_set_dump' results from using a different output order
- than `m4_set_contents'. These macros scale linearly in the size
- of the set before memory pruning, and `m4_set_contents([SET],
- [SEP])' is faster than `m4_joinall([SEP]m4_set_listc([SET]))'.
- m4_set_add_all([a], [1], [2], [3])
- =>
- m4_set_contents([a], [-])
- =>1-2-3
- m4_joinall([-]m4_set_listc([a]))
- =>1-2-3
- m4_set_dump([a], [-])
- =>3-2-1
- m4_set_contents([a])
- =>
- m4_set_add([a], [])
- =>
- m4_set_contents([a], [-])
- =>
- -- Macro: m4_set_delete (SET)
- Delete all elements and memory associated with SET. This is
- linear in the set size, and faster than removing one element at a
- time.
- -- Macro: m4_set_difference (SETA, SETB)
- -- Macro: m4_set_intersection (SETA, SETB)
- -- Macro: m4_set_union (SETA, SETB)
- Compute the relation between SETA and SETB, and output the result
- as a list of quoted arguments without duplicates and with a
- leading comma. Set difference selects the elements in SETA but
- not SETB, intersection selects only elements in both sets, and
- union selects elements in either set. These actions are linear in
- the sum of the set sizes. The leading comma is necessary to
- distinguish between no elements and the empty string as the only
- element.
- m4_set_add_all([a], [1], [2], [3])
- =>
- m4_set_add_all([b], [3], [], [4])
- =>
- m4_set_difference([a], [b])
- =>,1,2
- m4_set_difference([b], [a])
- =>,,4
- m4_set_intersection([a], [b])
- =>,3
- m4_set_union([a], [b])
- =>,1,2,3,,4
- -- Macro: m4_set_empty (SET, [IF-EMPTY], [IF-ELEMENTS])
- Expand IF-EMPTY if the set SET has no elements, otherwise expand
- IF-ELEMENTS. This macro operates in constant time. Using this
- macro can help disambiguate output from `m4_set_contents' or
- `m4_set_list'.
- -- Macro: m4_set_foreach (SET, VARIABLE, ACTION)
- For each element in the set SET, expand ACTION with the macro
- VARIABLE defined as the set element. Behavior is unspecified if
- ACTION recursively lists the contents of SET (although listing
- other sets is acceptable), or if it modifies the set in any way
- other than removing the element currently contained in VARIABLE.
- This macro is faster than the corresponding `m4_foreach([VARIABLE],
- m4_indir([m4_dquote]m4_set_listc([SET])), [ACTION])', although
- `m4_set_map' might be faster still.
- m4_set_add_all([a]m4_for([i], [1], [5], [], [,i]))
- =>
- m4_set_contents([a])
- =>12345
- m4_set_foreach([a], [i],
- [m4_if(m4_eval(i&1), [0], [m4_set_remove([a], i, [i])])])
- =>24
- m4_set_contents([a])
- =>135
- -- Macro: m4_set_list (SET)
- -- Macro: m4_set_listc (SET)
- Produce a list of arguments, where each argument is a quoted
- element from the set SET. The variant `m4_set_listc' is
- unambiguous, by adding a leading comma if there are any set
- elements, whereas the variant `m4_set_list' cannot distinguish
- between an empty set and a set containing only the empty string.
- These can be directly used in macros that take multiple arguments,
- such as `m4_join' or `m4_set_add_all', or wrapped by `m4_dquote'
- for macros that take a quoted list, such as `m4_map' or
- `m4_foreach'. Any memory occupied by removed elements is
- reclaimed during these macros.
- m4_set_add_all([a], [1], [2], [3])
- =>
- m4_set_list([a])
- =>1,2,3
- m4_set_list([b])
- =>
- m4_set_listc([b])
- =>
- m4_count(m4_set_list([b]))
- =>1
- m4_set_empty([b], [0], [m4_count(m4_set_list([b]))])
- =>0
- m4_set_add([b], [])
- =>
- m4_set_list([b])
- =>
- m4_set_listc([b])
- =>,
- m4_count(m4_set_list([b]))
- =>1
- m4_set_empty([b], [0], [m4_count(m4_set_list([b]))])
- =>1
- -- Macro: m4_set_map (SET, ACTION)
- For each element in the set SET, expand ACTION with a single
- argument of the set element. Behavior is unspecified if ACTION
- recursively lists the contents of SET (although listing other sets
- is acceptable), or if it modifies the set in any way other than
- removing the element passed as an argument. This macro is faster
- than either corresponding counterpart of
- `m4_map_args([ACTION]m4_set_listc([SET]))' or
- `m4_set_foreach([SET], [var], [ACTION(m4_defn([var]))])'. It is
- possible to use `m4_curry' if more than one argument is needed for
- ACTION, although it is more efficient to use `m4_set_map_sep' in
- that case.
- -- Macro: m4_set_map_sep (SET, [PRE], [POST], [SEP])
- For each element in the set SET, expand `PRE[element]POST',
- additionally expanding SEP between elements. Behavior is
- unspecified if the expansion recursively lists the contents of SET
- (although listing other sets is acceptable), or if it modifies the
- set in any way other than removing the element visited by the
- expansion. This macro provides the most efficient means for
- non-destructively visiting the elements of a set; in particular,
- `m4_set_map([SET], [ACTION])' is equivalent to
- `m4_set_map_sep([SET], [ACTION(], [)])'.
- -- Macro: m4_set_remove (SET, VALUE, [IF-PRESENT], [IF-ABSENT])
- If VALUE is an element in the set SET, then remove it and expand
- IF-PRESENT. Otherwise expand IF-ABSENT. This macro operates in
- constant time so that multiple removals will scale linearly rather
- than quadratically; but when used outside of `m4_set_foreach' or
- `m4_set_map', it leaves memory occupied until the set is later
- compacted by `m4_set_contents' or `m4_set_list'. Several other
- set operations are then less efficient between the time of element
- removal and subsequent memory compaction, but still maintain their
- guaranteed scaling performance.
- -- Macro: m4_set_size (SET)
- Expand to the size of the set SET. This implementation operates
- in constant time, and is thus more efficient than
- `m4_eval(m4_count(m4_set_listc([set])) - 1)'.
- File: autoconf.info, Node: Forbidden Patterns, Prev: Set manipulation Macros, Up: Programming in M4sugar
- 8.3.10 Forbidden Patterns
- -------------------------
- M4sugar provides a means to define suspicious patterns, patterns
- describing tokens which should not be found in the output. For
- instance, if an Autoconf `configure' script includes tokens such as
- `AC_DEFINE', or `dnl', then most probably something went wrong
- (typically a macro was not evaluated because of overquotation).
- M4sugar forbids all the tokens matching `^_?m4_' and `^dnl$'.
- Additional layers, such as M4sh and Autoconf, add additional forbidden
- patterns to the list.
- -- Macro: m4_pattern_forbid (PATTERN)
- Declare that no token matching PATTERN must be found in the output.
- Comments are not checked; this can be a problem if, for instance,
- you have some macro left unexpanded after an `#include'. No
- consensus is currently found in the Autoconf community, as some
- people consider it should be valid to name macros in comments
- (which doesn't make sense to the authors of this documentation:
- input, such as macros, should be documented by `dnl' comments;
- reserving `#'-comments to document the output).
- Of course, you might encounter exceptions to these generic rules, for
- instance you might have to refer to `$m4_flags'.
- -- Macro: m4_pattern_allow (PATTERN)
- Any token matching PATTERN is allowed, including if it matches an
- `m4_pattern_forbid' pattern.
- File: autoconf.info, Node: Debugging via autom4te, Prev: Programming in M4sugar, Up: Programming in M4
- 8.4 Debugging via autom4te
- ==========================
- At times, it is desirable to see what was happening inside m4, to see
- why output was not matching expectations. However, post-processing done
- by `autom4te' means that directly using the m4 builtin `m4_traceon' is
- likely to interfere with operation. Also, frequent diversion changes
- and the concept of forbidden tokens make it difficult to use `m4_defn'
- to generate inline comments in the final output.
- There are a couple of tools to help with this. One is the use of the
- `--trace' option provided by `autom4te' (as well as each of the
- programs that wrap `autom4te', such as `autoconf'), in order to inspect
- when a macro is called and with which arguments. For example, when
- this paragraph was written, the autoconf version could be found by:
- $ autoconf --trace=AC_INIT
- configure.ac:23:AC_INIT:GNU Autoconf:2.63b.95-3963:bug-autoconf@gnu.org
- $ autoconf --trace='AC_INIT:version is $2'
- version is 2.63b.95-3963
- Another trick is to print out the expansion of various m4
- expressions to standard error or to an independent file, with no
- further m4 expansion, and without interfering with diversion changes or
- the post-processing done to standard output. `m4_errprintn' shows a
- given expression on standard error. For example, if you want to see
- the expansion of an autoconf primitive or of one of your autoconf
- macros, you can do it like this:
- $ cat <<\EOF > configure.ac
- AC_INIT
- m4_errprintn([The definition of AC_DEFINE_UNQUOTED:])
- m4_errprintn(m4_defn([AC_DEFINE_UNQUOTED]))
- AC_OUTPUT
- EOF
- $ autoconf
- error-->The definition of AC_DEFINE_UNQUOTED:
- error-->_AC_DEFINE_Q([], $@)
- File: autoconf.info, Node: Programming in M4sh, Next: Writing Autoconf Macros, Prev: Programming in M4, Up: Top
- 9 Programming in M4sh
- *********************
- M4sh, pronounced "mash", is aiming at producing portable Bourne shell
- scripts. This name was coined by Lars J. Aas, who notes that,
- according to the Webster's Revised Unabridged Dictionary (1913):
- Mash \Mash\, n. [Akin to G. meisch, maisch, meische, maische,
- mash, wash, and prob. to AS. miscian to mix. See "Mix".]
- 1. A mass of mixed ingredients reduced to a soft pulpy state by
- beating or pressure...
- 2. A mixture of meal or bran and water fed to animals.
- 3. A mess; trouble. [Obs.] -Beau. & Fl.
- M4sh reserves the M4 macro namespace `^_AS_' for internal use, and
- the namespace `^AS_' for M4sh macros. It also reserves the shell and
- environment variable namespace `^as_', and the here-document delimiter
- namespace `^_AS[A-Z]' in the output file. You should not define your
- own macros or output shell code that conflicts with these namespaces.
- * Menu:
- * Common Shell Constructs:: Portability layer for common shell constructs
- * Polymorphic Variables:: Support for indirect variable names
- * Initialization Macros:: Macros to establish a sane shell environment
- * File Descriptor Macros:: File descriptor macros for input and output
- File: autoconf.info, Node: Common Shell Constructs, Next: Polymorphic Variables, Up: Programming in M4sh
- 9.1 Common Shell Constructs
- ===========================
- M4sh provides portable alternatives for some common shell constructs
- that unfortunately are not portable in practice.
- -- Macro: AS_BOX (TEXT, [CHAR = `-'])
- Expand into shell code that will output TEXT surrounded by a box
- with CHAR in the top and bottom border. TEXT should not contain a
- newline, but may contain shell expansions valid for unquoted
- here-documents. CHAR defaults to `-', but can be any character
- except `/', `'', `"', `\', `&', or ``'. This is useful for
- outputting a comment box into log files to separate distinct
- phases of script operation.
- -- Macro: AS_CASE (WORD, [PATTERN1], [IF-MATCHED1], ..., [DEFAULT])
- Expand into a shell `case' statement, where WORD is matched
- against one or more patterns. IF-MATCHED is run if the
- corresponding pattern matched WORD, else DEFAULT is run. Avoids
- several portability issues (*note Limitations of Shell Builtins:
- case.).
- -- Macro: AS_DIRNAME (FILE-NAME)
- Output the directory portion of FILE-NAME. For example, if
- `$file' is `/one/two/three', the command
- `dir=`AS_DIRNAME(["$file"])`' sets `dir' to `/one/two'.
- This interface may be improved in the future to avoid forks and
- losing trailing newlines.
- -- Macro: AS_ECHO (WORD)
- Emits WORD to the standard output, followed by a newline. WORD
- must be a single shell word (typically a quoted string). The
- bytes of WORD are output as-is, even if it starts with "-" or
- contains "\". Redirections can be placed outside the macro
- invocation. This is much more portable than using `echo' (*note
- Limitations of Shell Builtins: echo.).
- -- Macro: AS_ECHO_N (WORD)
- Emits WORD to the standard output, without a following newline.
- WORD must be a single shell word (typically a quoted string) and,
- for portability, should not include more than one newline. The
- bytes of WORD are output as-is, even if it starts with "-" or
- contains "\". Redirections can be placed outside the macro
- invocation.
- -- Macro: AS_ESCAPE (STRING, [CHARS = ``\"$'])
- Expands to STRING, with any characters in CHARS escaped with a
- backslash (`\'). CHARS should be at most four bytes long, and
- only contain characters from the set ``\"$'; however, characters
- may be safely listed more than once in CHARS for the sake of
- syntax highlighting editors. The current implementation expands
- STRING after adding escapes; if STRING contains macro calls that
- in turn expand to text needing shell quoting, you can use
- `AS_ESCAPE(m4_dquote(m4_expand([string])))'.
- The default for CHARS (`\"$`') is the set of characters needing
- escapes when STRING will be used literally within double quotes.
- One common variant is the set of characters to protect when STRING
- will be used literally within back-ticks or an unquoted
- here-document (`\$`'). Another common variant is `""', which can
- be used to form a double-quoted string containing the same
- expansions that would have occurred if STRING were expanded in an
- unquoted here-document; however, when using this variant, care
- must be taken that STRING does not use double quotes within
- complex variable expansions (such as `${foo-`echo "hi"`}') that
- would be broken with improper escapes.
- This macro is often used with `AS_ECHO'. For an example, observe
- the output generated by the shell code generated from this snippet:
- foo=bar
- AS_ECHO(["AS_ESCAPE(["$foo" = ])AS_ESCAPE(["$foo"], [""])"])
- =>"$foo" = "bar"
- m4_define([macro], [a, [\b]])
- AS_ECHO(["AS_ESCAPE([[macro]])"])
- =>macro
- AS_ECHO(["AS_ESCAPE([macro])"])
- =>a, b
- AS_ECHO(["AS_ESCAPE(m4_dquote(m4_expand([macro])))"])
- =>a, \b
- To escape a string that will be placed within single quotes, use:
- m4_bpatsubst([[STRING]], ['], ['\\''])
- -- Macro: AS_EXECUTABLE_P (FILE)
- Emit code to probe whether FILE is a regular file with executable
- permissions (and not a directory with search permissions). The
- caller is responsible for quoting FILE.
- -- Macro: AS_EXIT ([STATUS = `$?'])
- Emit code to exit the shell with STATUS, defaulting to `$?'. This
- macro works around shells that see the exit status of the command
- prior to `exit' inside a `trap 0' handler (*note Limitations of
- Shell Builtins: trap.).
- -- Macro: AS_IF (TEST1, [RUN-IF-TRUE1], ..., [RUN-IF-FALSE])
- Run shell code TEST1. If TEST1 exits with a zero status then run
- shell code RUN-IF-TRUE1, else examine further tests. If no test
- exits with a zero status, run shell code RUN-IF-FALSE, with
- simplifications if either RUN-IF-TRUE1 or RUN-IF-FALSE is empty.
- For example,
- AS_IF([test "x$foo" = xyes], [HANDLE_FOO([yes])],
- [test "x$foo" != xno], [HANDLE_FOO([maybe])],
- [echo foo not specified])
- ensures any required macros of `HANDLE_FOO' are expanded before
- the first test.
- -- Macro: AS_MKDIR_P (FILE-NAME)
- Make the directory FILE-NAME, including intervening directories as
- necessary. This is equivalent to `mkdir -p -- FILE-NAME', except
- that it is portable to older versions of `mkdir' that lack support
- for the `-p' option or for the `--' delimiter (*note Limitations
- of Usual Tools: mkdir.). Also, `AS_MKDIR_P' succeeds if FILE-NAME
- is a symbolic link to an existing directory, even though Posix is
- unclear whether `mkdir -p' should succeed in that case. If
- creation of FILE-NAME fails, exit the script.
- Also see the `AC_PROG_MKDIR_P' macro (*note Particular Programs::).
- -- Macro: AS_SET_STATUS (STATUS)
- Emit shell code to set the value of `$?' to STATUS, as efficiently
- as possible. However, this is not guaranteed to abort a shell
- running with `set -e' (*note Limitations of Shell Builtins: set.).
- This should also be used at the end of a complex shell function
- instead of `return' (*note Shell Functions::) to avoid a DJGPP
- shell bug.
- -- Macro: AS_TR_CPP (EXPRESSION)
- Transform EXPRESSION into a valid right-hand side for a C
- `#define'. For example:
- # This outputs "#define HAVE_CHAR_P 1".
- # Notice the m4 quoting around #, to prevent an m4 comment
- type="char *"
- echo "[#]define AS_TR_CPP([HAVE_$type]) 1"
- -- Macro: AS_TR_SH (EXPRESSION)
- Transform EXPRESSION into shell code that generates a valid shell
- variable name. The result is literal when possible at m4 time,
- but must be used with `eval' if EXPRESSION causes shell
- indirections. For example:
- # This outputs "Have it!".
- header="sys/some file.h"
- eval AS_TR_SH([HAVE_$header])=yes
- if test "x$HAVE_sys_some_file_h" = xyes; then echo "Have it!"; fi
- -- Macro: AS_SET_CATFILE (VAR, DIR, FILE)
- Set the polymorphic shell variable VAR to DIR/FILE, but optimizing
- the common cases (DIR or FILE is `.', FILE is absolute, etc.).
- -- Macro: AS_UNSET (VAR)
- Unsets the shell variable VAR, working around bugs in older shells
- (*note Limitations of Shell Builtins: unset.). VAR can be a
- literal or indirect variable name.
- -- Macro: AS_VERSION_COMPARE (VERSION-1, VERSION-2, [ACTION-IF-LESS],
- [ACTION-IF-EQUAL], [ACTION-IF-GREATER])
- Compare two strings VERSION-1 and VERSION-2, possibly containing
- shell variables, as version strings, and expand ACTION-IF-LESS,
- ACTION-IF-EQUAL, or ACTION-IF-GREATER depending upon the result.
- The algorithm to compare is similar to the one used by strverscmp
- in glibc (*note String/Array Comparison: (libc)String/Array
- Comparison.).
- File: autoconf.info, Node: Polymorphic Variables, Next: Initialization Macros, Prev: Common Shell Constructs, Up: Programming in M4sh
- 9.2 Support for indirect variable names
- =======================================
- Often, it is convenient to write a macro that will emit shell code
- operating on a shell variable. The simplest case is when the variable
- name is known. But a more powerful idiom is writing shell code that can
- work through an indirection, where another variable or command
- substitution produces the name of the variable to actually manipulate.
- M4sh supports the notion of polymorphic shell variables, making it easy
- to write a macro that can deal with either literal or indirect variable
- names and output shell code appropriate for both use cases. Behavior is
- undefined if expansion of an indirect variable does not result in a
- literal variable name.
- -- Macro: AS_LITERAL_IF (EXPRESSION, [IF-LITERAL], [IF-NOT],
- [IF-SIMPLE-REF = `IF-NOT'])
- -- Macro: AS_LITERAL_WORD_IF (EXPRESSION, [IF-LITERAL], [IF-NOT],
- [IF-SIMPLE-REF = `IF-NOT'])
- If the expansion of EXPRESSION is definitely a shell literal,
- expand IF-LITERAL. If the expansion of EXPRESSION looks like it
- might contain shell indirections (such as `$var' or ``expr`'),
- then IF-NOT is expanded. Sometimes, it is possible to output
- optimized code if EXPRESSION consists only of shell variable
- expansions (such as `${var}'), in which case IF-SIMPLE-REF can be
- provided; but defaulting to IF-NOT should always be safe.
- `AS_LITERAL_WORD_IF' only expands IF-LITERAL if EXPRESSION looks
- like a single shell word, containing no whitespace; while
- `AS_LITERAL_IF' allows whitespace in EXPRESSION.
- In order to reduce the time spent recognizing whether an
- EXPRESSION qualifies as a literal or a simple indirection, the
- implementation is somewhat conservative: EXPRESSION must be a
- single shell word (possibly after stripping whitespace),
- consisting only of bytes that would have the same meaning whether
- unquoted or enclosed in double quotes (for example, `a.b' results
- in IF-LITERAL, even though it is not a valid shell variable name;
- while both `'a'' and `[$]' result in IF-NOT, because they behave
- differently than `"'a'"' and `"[$]"'). This macro can be used in
- contexts for recognizing portable file names (such as in the
- implementation of `AC_LIBSOURCE'), or coupled with some
- transliterations for forming valid variable names (such as in the
- implementation of `AS_TR_SH', which uses an additional
- `m4_translit' to convert `.' to `_').
- This example shows how to read the contents of the shell variable
- `bar', exercising all three arguments to `AS_LITERAL_IF'. It
- results in a script that will output the line `hello' three times.
- AC_DEFUN([MY_ACTION],
- [AS_LITERAL_IF([$1],
- [echo "$$1"],
- [AS_VAR_COPY([var], [$1])
- echo "$var"],
- [eval 'echo "$'"$1"\"])])
- foo=bar bar=hello
- MY_ACTION([bar])
- MY_ACTION([`echo bar`])
- MY_ACTION([$foo])
- -- Macro: AS_VAR_APPEND (VAR, TEXT)
- Emit shell code to append the shell expansion of TEXT to the end
- of the current contents of the polymorphic shell variable VAR,
- taking advantage of shells that provide the `+=' extension for more
- efficient scaling.
- For situations where the final contents of VAR are relatively
- short (less than 256 bytes), it is more efficient to use the
- simpler code sequence of `VAR=${VAR}TEXT' (or its polymorphic
- equivalent of `AS_VAR_COPY([t], [VAR])' and `AS_VAR_SET([VAR],
- ["$t"TEXT])'). But in the case when the script will be repeatedly
- appending text into `var', issues of scaling start to become
- apparent. A naive implementation requires execution time linear
- to the length of the current contents of VAR as well as the length
- of TEXT for a single append, for an overall quadratic scaling with
- multiple appends. This macro takes advantage of shells which
- provide the extension `VAR+=TEXT', which can provide amortized
- constant time for a single append, for an overall linear scaling
- with multiple appends. Note that unlike `AS_VAR_SET', this macro
- requires that TEXT be quoted properly to avoid field splitting and
- file name expansion.
- -- Macro: AS_VAR_ARITH (VAR, EXPRESSION)
- Emit shell code to compute the arithmetic expansion of EXPRESSION,
- assigning the result as the contents of the polymorphic shell
- variable VAR. The code takes advantage of shells that provide
- `$(())' for fewer forks, but uses `expr' as a fallback.
- Therefore, the syntax for a valid EXPRESSION is rather limited:
- all operators must occur as separate shell arguments and with
- proper quoting, there is no portable equality operator, all
- variables containing numeric values must be expanded prior to the
- computation, all numeric values must be provided in decimal
- without leading zeroes, and the first shell argument should not be
- a negative number. In the following example, this snippet will
- print `(2+3)*4 == 20'.
- bar=3
- AS_VAR_ARITH([foo], [\( 2 + $bar \) \* 4])
- echo "(2+$bar)*4 == $foo"
- -- Macro: AS_VAR_COPY (DEST, SOURCE)
- Emit shell code to assign the contents of the polymorphic shell
- variable SOURCE to the polymorphic shell variable DEST. For
- example, executing this M4sh snippet will output `bar hi':
- foo=bar bar=hi
- AS_VAR_COPY([a], [foo])
- AS_VAR_COPY([b], [$foo])
- echo "$a $b"
- When it is necessary to access the contents of an indirect variable
- inside a shell double-quoted context, the recommended idiom is to
- first copy the contents into a temporary literal shell variable.
- for header in stdint_h inttypes_h ; do
- AS_VAR_COPY([var], [ac_cv_header_$header])
- echo "$header detected: $var"
- done
- -- Macro: AS_VAR_IF (VAR, [WORD], [IF-EQUAL], [IF-NOT-EQUAL])
- Output a shell conditional statement. If the contents of the
- polymorphic shell variable VAR match the string WORD, execute
- IF-EQUAL; otherwise execute IF-NOT-EQUAL. WORD must be a single
- shell word (typically a quoted string). Avoids shell bugs if an
- interrupt signal arrives while a command substitution in VAR is
- being expanded.
- -- Macro: AS_VAR_PUSHDEF (M4-NAME, VALUE)
- -- Macro: AS_VAR_POPDEF (M4-NAME)
- A common M4sh idiom involves composing shell variable names from
- an m4 argument (for example, writing a macro that uses a cache
- variable). VALUE can be an arbitrary string, which will be
- transliterated into a valid shell name by `AS_TR_SH'. In order to
- access the composed variable name based on VALUE, it is easier to
- declare a temporary m4 macro M4-NAME with `AS_VAR_PUSHDEF', then
- use that macro as the argument to subsequent `AS_VAR' macros as a
- polymorphic variable name, and finally free the temporary macro
- with `AS_VAR_POPDEF'. These macros are often followed with `dnl',
- to avoid excess newlines in the output.
- Here is an involved example, that shows the power of writing
- macros that can handle composed shell variable names:
- m4_define([MY_CHECK_HEADER],
- [AS_VAR_PUSHDEF([my_Header], [ac_cv_header_$1])dnl
- AS_VAR_IF([my_Header], [yes], [echo "header $1 detected"])dnl
- AS_VAR_POPDEF([my_Header])dnl
- ])
- MY_CHECK_HEADER([stdint.h])
- for header in inttypes.h stdlib.h ; do
- MY_CHECK_HEADER([$header])
- done
- In the above example, `MY_CHECK_HEADER' can operate on polymorphic
- variable names. In the first invocation, the m4 argument is
- `stdint.h', which transliterates into a literal `stdint_h'. As a
- result, the temporary macro `my_Header' expands to the literal
- shell name `ac_cv_header_stdint_h'. In the second invocation, the
- m4 argument to `MY_CHECK_HEADER' is `$header', and the temporary
- macro `my_Header' expands to the indirect shell name
- `$as_my_Header'. During the shell execution of the for loop, when
- `$header' contains `inttypes.h', then `$as_my_Header' contains
- `ac_cv_header_inttypes_h'. If this script is then run on a
- platform where all three headers have been previously detected, the
- output of the script will include:
- header stdint.h detected
- header inttypes.h detected
- header stdlib.h detected
- -- Macro: AS_VAR_SET (VAR, [VALUE])
- Emit shell code to assign the contents of the polymorphic shell
- variable VAR to the shell expansion of VALUE. VALUE is not
- subject to field splitting or file name expansion, so if command
- substitution is used, it may be done with ``""`' rather than using
- an intermediate variable (*note Shell Substitutions::). However,
- VALUE does undergo rescanning for additional macro names; behavior
- is unspecified if late expansion results in any shell
- meta-characters.
- -- Macro: AS_VAR_SET_IF (VAR, [IF-SET], [IF-UNDEF])
- Emit a shell conditional statement, which executes IF-SET if the
- polymorphic shell variable `var' is set to any value, and IF-UNDEF
- otherwise.
- -- Macro: AS_VAR_TEST_SET (VAR)
- Emit a shell statement that results in a successful exit status
- only if the polymorphic shell variable `var' is set.
- File: autoconf.info, Node: Initialization Macros, Next: File Descriptor Macros, Prev: Polymorphic Variables, Up: Programming in M4sh
- 9.3 Initialization Macros
- =========================
- -- Macro: AS_BOURNE_COMPATIBLE
- Set up the shell to be more compatible with the Bourne shell as
- standardized by Posix, if possible. This may involve setting
- environment variables, or setting options, or similar
- implementation-specific actions. This macro is deprecated, since
- `AS_INIT' already invokes it.
- -- Macro: AS_INIT
- Initialize the M4sh environment. This macro calls `m4_init', then
- outputs the `#! /bin/sh' line, a notice about where the output was
- generated from, and code to sanitize the environment for the rest
- of the script. Among other initializations, this sets `SHELL' to
- the shell chosen to run the script (*note CONFIG_SHELL::), and
- `LC_ALL' to ensure the C locale. Finally, it changes the current
- diversion to `BODY'. `AS_INIT' is called automatically by
- `AC_INIT' and `AT_INIT', so shell code in `configure',
- `config.status', and `testsuite' all benefit from a sanitized
- shell environment.
- -- Macro: AS_INIT_GENERATED (FILE, [COMMENT])
- Emit shell code to start the creation of a subsidiary shell script
- in FILE, including changing FILE to be executable. This macro
- populates the child script with information learned from the parent
- (thus, the emitted code is equivalent in effect, but more
- efficient, than the code output by `AS_INIT',
- `AS_BOURNE_COMPATIBLE', and `AS_SHELL_SANITIZE'). If present,
- COMMENT is output near the beginning of the child, prior to the
- shell initialization code, and is subject to parameter expansion,
- command substitution, and backslash quote removal. The parent
- script should check the exit status after this macro, in case FILE
- could not be properly created (for example, if the disk was full).
- If successfully created, the parent script can then proceed to
- append additional M4sh constructs into the child script.
- Note that the child script starts life without a log file open, so
- if the parent script uses logging (*note AS_MESSAGE_LOG_FD::), you
- must temporarily disable any attempts to use the log file until
- after emitting code to open a log within the child. On the other
- hand, if the parent script has `AS_MESSAGE_FD' redirected
- somewhere besides `1', then the child script already has code that
- copies stdout to that descriptor. Currently, the suggested idiom
- for writing a M4sh shell script from within another script is:
- AS_INIT_GENERATED([FILE], [[# My child script.
- ]]) || { AS_ECHO(["Failed to create child script"]); AS_EXIT; }
- m4_pushdef([AS_MESSAGE_LOG_FD])dnl
- cat >> "FILE" <<\__EOF__
- # Code to initialize AS_MESSAGE_LOG_FD
- m4_popdef([AS_MESSAGE_LOG_FD])dnl
- # Additional code
- __EOF__
- This, however, may change in the future as the M4sh interface is
- stabilized further.
- Also, be aware that use of `LINENO' within the child script may
- report line numbers relative to their location in the parent
- script, even when using `AS_LINENO_PREPARE', if the parent script
- was unable to locate a shell with working `LINENO' support.
- -- Macro: AS_LINENO_PREPARE
- Find a shell that supports the special variable `LINENO', which
- contains the number of the currently executing line. This macro is
- automatically invoked by `AC_INIT' in configure scripts.
- -- Macro: AS_ME_PREPARE
- Set up variable `as_me' to be the basename of the currently
- executing script. This macro is automatically invoked by
- `AC_INIT' in configure scripts.
- -- Macro: AS_TMPDIR (PREFIX, [DIR = `${TMPDIR:=/tmp}'])
- Create, as safely as possible, a temporary sub-directory within
- DIR with a name starting with PREFIX. PREFIX should be 2-4
- characters, to make it slightly easier to identify the owner of
- the directory. If DIR is omitted, then the value of `TMPDIR' will
- be used (defaulting to `/tmp'). On success, the name of the newly
- created directory is stored in the shell variable `tmp'. On
- error, the script is aborted.
- Typically, this macro is coupled with some exit traps to delete
- the created directory and its contents on exit or interrupt.
- However, there is a slight window between when the directory is
- created and when the name is actually known to the shell, so an
- interrupt at the right moment might leave the temporary directory
- behind. Hence it is important to use a PREFIX that makes it
- easier to determine if a leftover temporary directory from an
- interrupted script is safe to delete.
- The use of the output variable `$tmp' rather than something in the
- `as_' namespace is historical; it has the unfortunate consequence
- that reusing this otherwise common name for any other purpose
- inside your script has the potential to break any cleanup traps
- designed to remove the temporary directory.
- -- Macro: AS_SHELL_SANITIZE
- Initialize the shell suitably for `configure' scripts. This has
- the effect of `AS_BOURNE_COMPATIBLE', and sets some other
- environment variables for predictable results from configuration
- tests. For example, it sets `LC_ALL' to change to the default C
- locale. *Note Special Shell Variables::. This macro is
- deprecated, since `AS_INIT' already invokes it.
- File: autoconf.info, Node: File Descriptor Macros, Prev: Initialization Macros, Up: Programming in M4sh
- 9.4 File Descriptor Macros
- ==========================
- The following macros define file descriptors used to output messages
- (or input values) from `configure' scripts. For example:
- echo "$wombats found" >&AS_MESSAGE_LOG_FD
- echo 'Enter desired kangaroo count:' >&AS_MESSAGE_FD
- read kangaroos <&AS_ORIGINAL_STDIN_FD`
- However doing so is seldom needed, because Autoconf provides higher
- level macros as described below.
- -- Macro: AS_MESSAGE_FD
- The file descriptor for `checking for...' messages and results.
- By default, `AS_INIT' sets this to `1' for standalone M4sh
- clients. However, `AC_INIT' shuffles things around to another file
- descriptor, in order to allow the `-q' option of `configure' to
- choose whether messages should go to the script's standard output
- or be discarded.
- If you want to display some messages, consider using one of the
- printing macros (*note Printing Messages::) instead. Copies of
- messages output via these macros are also recorded in `config.log'.
- -- Macro: AS_MESSAGE_LOG_FD
- This must either be empty, or expand to a file descriptor for log
- messages. By default, `AS_INIT' sets this macro to the empty
- string for standalone M4sh clients, thus disabling logging.
- However, `AC_INIT' shuffles things around so that both `configure'
- and `config.status' use `config.log' for log messages. Macros
- that run tools, like `AC_COMPILE_IFELSE' (*note Running the
- Compiler::), redirect all output to this descriptor. You may want
- to do so if you develop such a low-level macro.
- -- Macro: AS_ORIGINAL_STDIN_FD
- This must expand to a file descriptor for the original standard
- input. By default, `AS_INIT' sets this macro to `0' for standalone
- M4sh clients. However, `AC_INIT' shuffles things around for
- safety.
- When `configure' runs, it may accidentally execute an interactive
- command that has the same name as the non-interactive meant to be
- used or checked. If the standard input was the terminal, such
- interactive programs would cause `configure' to stop, pending some
- user input. Therefore `configure' redirects its standard input
- from `/dev/null' during its initialization. This is not normally
- a problem, since `configure' normally does not need user input.
- In the extreme case where your `configure' script really needs to
- obtain some values from the original standard input, you can read
- them explicitly from `AS_ORIGINAL_STDIN_FD'.
- File: autoconf.info, Node: Writing Autoconf Macros, Next: Portable Shell, Prev: Programming in M4sh, Up: Top
- 10 Writing Autoconf Macros
- **************************
- When you write a feature test that could be applicable to more than one
- software package, the best thing to do is encapsulate it in a new macro.
- Here are some instructions and guidelines for writing Autoconf macros.
- * Menu:
- * Macro Definitions:: Basic format of an Autoconf macro
- * Macro Names:: What to call your new macros
- * Reporting Messages:: Notifying `autoconf' users
- * Dependencies Between Macros:: What to do when macros depend on other macros
- * Obsoleting Macros:: Warning about old ways of doing things
- * Coding Style:: Writing Autoconf macros a` la Autoconf
- File: autoconf.info, Node: Macro Definitions, Next: Macro Names, Up: Writing Autoconf Macros
- 10.1 Macro Definitions
- ======================
- -- Macro: AC_DEFUN (NAME, [BODY])
- Autoconf macros are defined using the `AC_DEFUN' macro, which is
- similar to the M4 builtin `m4_define' macro; this creates a macro
- named NAME and with BODY as its expansion. In addition to
- defining a macro, `AC_DEFUN' adds to it some code that is used to
- constrain the order in which macros are called, while avoiding
- redundant output (*note Prerequisite Macros::).
- An Autoconf macro definition looks like this:
- AC_DEFUN(MACRO-NAME, MACRO-BODY)
- You can refer to any arguments passed to the macro as `$1', `$2',
- etc. *Note How to define new macros: (m4.info)Definitions, for more
- complete information on writing M4 macros.
- Most macros fall in one of two general categories. The first
- category includes macros which take arguments, in order to generate
- output parameterized by those arguments. Macros in this category are
- designed to be directly expanded, often multiple times, and should not
- be used as the argument to `AC_REQUIRE'. The other category includes
- macros which are shorthand for a fixed block of text, and therefore do
- not take arguments. For this category of macros, directly expanding
- the macro multiple times results in redundant output, so it is more
- common to use the macro as the argument to `AC_REQUIRE', or to declare
- the macro with `AC_DEFUN_ONCE' (*note One-Shot Macros::).
- Be sure to properly quote both the MACRO-BODY _and_ the MACRO-NAME
- to avoid any problems if the macro happens to have been previously
- defined.
- Each macro should have a header comment that gives its prototype,
- and a brief description. When arguments have default values, display
- them in the prototype. For example:
- # AC_MSG_ERROR(ERROR, [EXIT-STATUS = 1])
- # --------------------------------------
- m4_define([AC_MSG_ERROR],
- [{ AS_MESSAGE([error: $1], [2])
- exit m4_default([$2], [1]); }])
- Comments about the macro should be left in the header comment. Most
- other comments make their way into `configure', so just keep using `#'
- to introduce comments.
- If you have some special comments about pure M4 code, comments that
- make no sense in `configure' and in the header comment, then use the
- builtin `dnl': it causes M4 to discard the text through the next
- newline.
- Keep in mind that `dnl' is rarely needed to introduce comments;
- `dnl' is more useful to get rid of the newlines following macros that
- produce no output, such as `AC_REQUIRE'.
- Public third-party macros need to use `AC_DEFUN', and not
- `m4_define', in order to be found by `aclocal' (*note Extending
- aclocal: (automake)Extending aclocal.). Additionally, if it is ever
- determined that a macro should be made obsolete, it is easy to convert
- from `AC_DEFUN' to `AU_DEFUN' in order to have `autoupdate' assist the
- user in choosing a better alternative, but there is no corresponding
- way to make `m4_define' issue an upgrade notice (*note AU_DEFUN::).
- There is another subtle, but important, difference between using
- `m4_define' and `AC_DEFUN': only the former is unaffected by
- `AC_REQUIRE'. When writing a file, it is always safe to replace a
- block of text with a `m4_define' macro that will expand to the same
- text. But replacing a block of text with an `AC_DEFUN' macro with the
- same content does not necessarily give the same results, because it
- changes the location where any embedded but unsatisfied `AC_REQUIRE'
- invocations within the block will be expanded. For an example of this,
- see *note Expanded Before Required::.
- File: autoconf.info, Node: Macro Names, Next: Reporting Messages, Prev: Macro Definitions, Up: Writing Autoconf Macros
- 10.2 Macro Names
- ================
- All of the public Autoconf macros have all-uppercase names in the
- namespace `^AC_' to prevent them from accidentally conflicting with
- other text; Autoconf also reserves the namespace `^_AC_' for internal
- macros. All shell variables that they use for internal purposes have
- mostly-lowercase names starting with `ac_'. Autoconf also uses
- here-document delimiters in the namespace `^_AC[A-Z]'. During
- `configure', files produced by Autoconf make heavy use of the file
- system namespace `^conf'.
- Since Autoconf is built on top of M4sugar (*note Programming in
- M4sugar::) and M4sh (*note Programming in M4sh::), you must also be
- aware of those namespaces (`^_?\(m4\|AS\)_'). And since `configure.ac'
- is also designed to be scanned by Autoheader, Autoscan, Autoupdate, and
- Automake, you should be aware of the `^_?A[HNUM]_' namespaces. In
- general, you _should not use_ the namespace of a package that does not
- own the macro or shell code you are writing.
- To ensure that your macros don't conflict with present or future
- Autoconf macros, you should prefix your own macro names and any shell
- variables they use with some other sequence. Possibilities include your
- initials, or an abbreviation for the name of your organization or
- software package. Historically, people have not always followed the
- rule of using a namespace appropriate for their package, and this has
- made it difficult for determining the origin of a macro (and where to
- report bugs about that macro), as well as difficult for the true
- namespace owner to add new macros without interference from pre-existing
- uses of third-party macros. Perhaps the best example of this confusion
- is the `AM_GNU_GETTEXT' macro, which belongs, not to Automake, but to
- Gettext.
- Most of the Autoconf macros' names follow a structured naming
- convention that indicates the kind of feature check by the name. The
- macro names consist of several words, separated by underscores, going
- from most general to most specific. The names of their cache variables
- use the same convention (*note Cache Variable Names::, for more
- information on them).
- The first word of the name after the namespace initials (such as
- `AC_') usually tells the category of the feature being tested. Here
- are the categories used in Autoconf for specific test macros, the kind
- of macro that you are more likely to write. They are also used for
- cache variables, in all-lowercase. Use them where applicable; where
- they're not, invent your own categories.
- `C'
- C language builtin features.
- `DECL'
- Declarations of C variables in header files.
- `FUNC'
- Functions in libraries.
- `GROUP'
- Posix group owners of files.
- `HEADER'
- Header files.
- `LIB'
- C libraries.
- `PROG'
- The base names of programs.
- `MEMBER'
- Members of aggregates.
- `SYS'
- Operating system features.
- `TYPE'
- C builtin or declared types.
- `VAR'
- C variables in libraries.
- After the category comes the name of the particular feature being
- tested. Any further words in the macro name indicate particular aspects
- of the feature. For example, `AC_PROG_CC_STDC' checks whether the C
- compiler supports ISO Standard C.
- An internal macro should have a name that starts with an underscore;
- Autoconf internals should therefore start with `_AC_'. Additionally, a
- macro that is an internal subroutine of another macro should have a
- name that starts with an underscore and the name of that other macro,
- followed by one or more words saying what the internal macro does. For
- example, `AC_PATH_X' has internal macros `_AC_PATH_X_XMKMF' and
- `_AC_PATH_X_DIRECT'.
- File: autoconf.info, Node: Reporting Messages, Next: Dependencies Between Macros, Prev: Macro Names, Up: Writing Autoconf Macros
- 10.3 Reporting Messages
- =======================
- When macros statically diagnose abnormal situations, benign or fatal, it
- is possible to make `autoconf' detect the problem, and refuse to create
- `configure' in the case of an error. The macros in this section are
- considered obsolescent, and new code should use M4sugar macros for this
- purpose, see *note Diagnostic Macros::.
- On the other hand, it is possible to want to detect errors when
- `configure' is run, which are dependent on the environment of the user
- rather than the maintainer. For dynamic diagnostics, see *note
- Printing Messages::.
- -- Macro: AC_DIAGNOSE (CATEGORY, MESSAGE)
- Report MESSAGE as a warning (or as an error if requested by the
- user) if warnings of the CATEGORY are turned on. This macro is
- obsolescent; you are encouraged to use:
- m4_warn([CATEGORY], [MESSAGE])
- instead. *Note m4_warn::, for more details, including valid
- CATEGORY names.
- -- Macro: AC_WARNING (MESSAGE)
- Report MESSAGE as a syntax warning. This macro is obsolescent;
- you are encouraged to use:
- m4_warn([syntax], [MESSAGE])
- instead. *Note m4_warn::, for more details, as well as better
- finer-grained categories of warnings (not all problems have to do
- with syntax).
- -- Macro: AC_FATAL (MESSAGE)
- Report a severe error MESSAGE, and have `autoconf' die. This
- macro is obsolescent; you are encouraged to use:
- m4_fatal([MESSAGE])
- instead. *Note m4_fatal::, for more details.
- When the user runs `autoconf -W error', warnings from `m4_warn'
- (including those issued through `AC_DIAGNOSE' and `AC_WARNING') are
- reported as errors, see *note autoconf Invocation::.
- File: autoconf.info, Node: Dependencies Between Macros, Next: Obsoleting Macros, Prev: Reporting Messages, Up: Writing Autoconf Macros
- 10.4 Dependencies Between Macros
- ================================
- Some Autoconf macros depend on other macros having been called first in
- order to work correctly. Autoconf provides a way to ensure that certain
- macros are called if needed and a way to warn the user if macros are
- called in an order that might cause incorrect operation.
- * Menu:
- * Prerequisite Macros:: Ensuring required information
- * Suggested Ordering:: Warning about possible ordering problems
- * One-Shot Macros:: Ensuring a macro is called only once
- File: autoconf.info, Node: Prerequisite Macros, Next: Suggested Ordering, Up: Dependencies Between Macros
- 10.4.1 Prerequisite Macros
- --------------------------
- A macro that you write might need to use values that have previously
- been computed by other macros. For example, `AC_DECL_YYTEXT' examines
- the output of `flex' or `lex', so it depends on `AC_PROG_LEX' having
- been called first to set the shell variable `LEX'.
- Rather than forcing the user of the macros to keep track of the
- dependencies between them, you can use the `AC_REQUIRE' macro to do it
- automatically. `AC_REQUIRE' can ensure that a macro is only called if
- it is needed, and only called once.
- -- Macro: AC_REQUIRE (MACRO-NAME)
- If the M4 macro MACRO-NAME has not already been called, call it
- (without any arguments). Make sure to quote MACRO-NAME with
- square brackets. MACRO-NAME must have been defined using
- `AC_DEFUN' or else contain a call to `AC_PROVIDE' to indicate that
- it has been called.
- `AC_REQUIRE' must be used inside a macro defined by `AC_DEFUN'; it
- must not be called from the top level. Also, it does not make
- sense to require a macro that takes parameters.
- `AC_REQUIRE' is often misunderstood. It really implements
- dependencies between macros in the sense that if one macro depends upon
- another, the latter is expanded _before_ the body of the former. To be
- more precise, the required macro is expanded before the outermost
- defined macro in the current expansion stack. In particular,
- `AC_REQUIRE([FOO])' is not replaced with the body of `FOO'. For
- instance, this definition of macros:
- AC_DEFUN([TRAVOLTA],
- [test "$body_temperature_in_celsius" -gt "38" &&
- dance_floor=occupied])
- AC_DEFUN([NEWTON_JOHN],
- [test "x$hair_style" = xcurly &&
- dance_floor=occupied])
- AC_DEFUN([RESERVE_DANCE_FLOOR],
- [if date | grep '^Sat.*pm' >/dev/null 2>&1; then
- AC_REQUIRE([TRAVOLTA])
- AC_REQUIRE([NEWTON_JOHN])
- fi])
- with this `configure.ac'
- AC_INIT([Dance Manager], [1.0], [bug-dance@example.org])
- RESERVE_DANCE_FLOOR
- if test "x$dance_floor" = xoccupied; then
- AC_MSG_ERROR([cannot pick up here, let's move])
- fi
- does not leave you with a better chance to meet a kindred soul at other
- times than Saturday night since it expands into:
- test "$body_temperature_in_Celsius" -gt "38" &&
- dance_floor=occupied
- test "x$hair_style" = xcurly &&
- dance_floor=occupied
- fi
- if date | grep '^Sat.*pm' >/dev/null 2>&1; then
- fi
- This behavior was chosen on purpose: (i) it prevents messages in
- required macros from interrupting the messages in the requiring macros;
- (ii) it avoids bad surprises when shell conditionals are used, as in:
- if ...; then
- AC_REQUIRE([SOME_CHECK])
- fi
- ...
- SOME_CHECK
- However, this implementation can lead to another class of problems.
- Consider the case where an outer macro first expands, then indirectly
- requires, an inner macro:
- AC_DEFUN([TESTA], [[echo in A
- if test -n "$SEEN_A" ; then echo duplicate ; fi
- SEEN_A=:]])
- AC_DEFUN([TESTB], [AC_REQUIRE([TESTA])[echo in B
- if test -z "$SEEN_A" ; then echo bug ; fi]])
- AC_DEFUN([TESTC], [AC_REQUIRE([TESTB])[echo in C]])
- AC_DEFUN([OUTER], [[echo in OUTER]
- TESTA
- TESTC])
- OUTER
- Prior to Autoconf 2.64, the implementation of `AC_REQUIRE' recognized
- that `TESTB' needed to be hoisted prior to the expansion of `OUTER',
- but because `TESTA' had already been directly expanded, it failed to
- hoist `TESTA'. Therefore, the expansion of `TESTB' occurs prior to its
- prerequisites, leading to the following output:
- in B
- bug
- in OUTER
- in A
- in C
- Newer Autoconf is smart enough to recognize this situation, and hoists
- `TESTA' even though it has already been expanded, but issues a syntax
- warning in the process. This is because the hoisted expansion of
- `TESTA' defeats the purpose of using `AC_REQUIRE' to avoid redundant
- code, and causes its own set of problems if the hoisted macro is not
- idempotent:
- in A
- in B
- in OUTER
- in A
- duplicate
- in C
- The bug is not in Autoconf, but in the macro definitions. If you
- ever pass a particular macro name to `AC_REQUIRE', then you are implying
- that the macro only needs to be expanded once. But to enforce this,
- either the macro must be declared with `AC_DEFUN_ONCE' (although this
- only helps in Autoconf 2.64 or newer), or all uses of that macro should
- be through `AC_REQUIRE'; directly expanding the macro defeats the point
- of using `AC_REQUIRE' to eliminate redundant expansion. In the
- example, this rule of thumb was violated because `TESTB' requires
- `TESTA' while `OUTER' directly expands it. One way of fixing the bug
- is to factor `TESTA' into two macros, the portion designed for direct
- and repeated use (here, named `TESTA'), and the portion designed for
- one-shot output and used only inside `AC_REQUIRE' (here, named
- `TESTA_PREREQ'). Then, by fixing all clients to use the correct
- calling convention according to their needs:
- AC_DEFUN([TESTA], [AC_REQUIRE([TESTA_PREREQ])[echo in A]])
- AC_DEFUN([TESTA_PREREQ], [[echo in A_PREREQ
- if test -n "$SEEN_A" ; then echo duplicate ; fi
- SEEN_A=:]])
- AC_DEFUN([TESTB], [AC_REQUIRE([TESTA_PREREQ])[echo in B
- if test -z "$SEEN_A" ; then echo bug ; fi]])
- AC_DEFUN([TESTC], [AC_REQUIRE([TESTB])[echo in C]])
- AC_DEFUN([OUTER], [[echo in OUTER]
- TESTA
- TESTC])
- OUTER
- the resulting output will then obey all dependency rules and avoid any
- syntax warnings, whether the script is built with old or new Autoconf
- versions:
- in A_PREREQ
- in B
- in OUTER
- in A
- in C
- The helper macros `AS_IF' and `AS_CASE' may be used to enforce
- expansion of required macros outside of shell conditional constructs.
- You are furthermore encouraged, although not required, to put all
- `AC_REQUIRE' calls at the beginning of a macro. You can use `dnl' to
- avoid the empty lines they leave.
- File: autoconf.info, Node: Suggested Ordering, Next: One-Shot Macros, Prev: Prerequisite Macros, Up: Dependencies Between Macros
- 10.4.2 Suggested Ordering
- -------------------------
- Some macros should be run before another macro if both are called, but
- neither _requires_ that the other be called. For example, a macro that
- changes the behavior of the C compiler should be called before any
- macros that run the C compiler. Many of these dependencies are noted in
- the documentation.
- Autoconf provides the `AC_BEFORE' macro to warn users when macros
- with this kind of dependency appear out of order in a `configure.ac'
- file. The warning occurs when creating `configure' from
- `configure.ac', not when running `configure'.
- For example, `AC_PROG_CPP' checks whether the C compiler can run the
- C preprocessor when given the `-E' option. It should therefore be
- called after any macros that change which C compiler is being used,
- such as `AC_PROG_CC'. So `AC_PROG_CC' contains:
- AC_BEFORE([$0], [AC_PROG_CPP])dnl
- This warns the user if a call to `AC_PROG_CPP' has already occurred
- when `AC_PROG_CC' is called.
- -- Macro: AC_BEFORE (THIS-MACRO-NAME, CALLED-MACRO-NAME)
- Make M4 print a warning message to the standard error output if
- CALLED-MACRO-NAME has already been called. THIS-MACRO-NAME should
- be the name of the macro that is calling `AC_BEFORE'. The macro
- CALLED-MACRO-NAME must have been defined using `AC_DEFUN' or else
- contain a call to `AC_PROVIDE' to indicate that it has been called.
- File: autoconf.info, Node: One-Shot Macros, Prev: Suggested Ordering, Up: Dependencies Between Macros
- 10.4.3 One-Shot Macros
- ----------------------
- Some macros should be called only once, either because calling them
- multiple time is unsafe, or because it is bad style. For instance
- Autoconf ensures that `AC_CANONICAL_BUILD' and cousins (*note
- Canonicalizing::) are evaluated only once, because it makes no sense to
- run these expensive checks more than once. Such one-shot macros can be
- defined using `AC_DEFUN_ONCE'.
- -- Macro: AC_DEFUN_ONCE (MACRO-NAME, MACRO-BODY)
- Declare macro MACRO-NAME like `AC_DEFUN' would (*note Macro
- Definitions::), but add additional logic that guarantees that only
- the first use of the macro (whether by direct expansion or
- `AC_REQUIRE') causes an expansion of MACRO-BODY; the expansion
- will occur before the start of any enclosing macro defined by
- `AC_DEFUN'. Subsequent expansions are silently ignored.
- Generally, it does not make sense for MACRO-BODY to use parameters
- such as `$1'.
- Prior to Autoconf 2.64, a macro defined by `AC_DEFUN_ONCE' would
- emit a warning if it was directly expanded a second time, so for
- portability, it is better to use `AC_REQUIRE' than direct invocation of
- MACRO-NAME inside a macro defined by `AC_DEFUN' (*note Prerequisite
- Macros::).
- File: autoconf.info, Node: Obsoleting Macros, Next: Coding Style, Prev: Dependencies Between Macros, Up: Writing Autoconf Macros
- 10.5 Obsoleting Macros
- ======================
- Configuration and portability technology has evolved over the years.
- Often better ways of solving a particular problem are developed, or
- ad-hoc approaches are systematized. This process has occurred in many
- parts of Autoconf. One result is that some of the macros are now
- considered "obsolete"; they still work, but are no longer considered
- the best thing to do, hence they should be replaced with more modern
- macros. Ideally, `autoupdate' should replace the old macro calls with
- their modern implementation.
- Autoconf provides a simple means to obsolete a macro.
- -- Macro: AU_DEFUN (OLD-MACRO, IMPLEMENTATION, [MESSAGE])
- Define OLD-MACRO as IMPLEMENTATION. The only difference with
- `AC_DEFUN' is that the user is warned that OLD-MACRO is now
- obsolete.
- If she then uses `autoupdate', the call to OLD-MACRO is replaced
- by the modern IMPLEMENTATION. MESSAGE should include information
- on what to do after running `autoupdate'; `autoupdate' prints it
- as a warning, and includes it in the updated `configure.ac' file.
- The details of this macro are hairy: if `autoconf' encounters an
- `AU_DEFUN'ed macro, all macros inside its second argument are
- expanded as usual. However, when `autoupdate' is run, only M4 and
- M4sugar macros are expanded here, while all other macros are
- disabled and appear literally in the updated `configure.ac'.
- -- Macro: AU_ALIAS (OLD-NAME, NEW-NAME)
- Used if the OLD-NAME is to be replaced by a call to NEW-MACRO with
- the same parameters. This happens for example if the macro was
- renamed.
- File: autoconf.info, Node: Coding Style, Prev: Obsoleting Macros, Up: Writing Autoconf Macros
- 10.6 Coding Style
- =================
- The Autoconf macros follow a strict coding style. You are encouraged to
- follow this style, especially if you intend to distribute your macro,
- either by contributing it to Autoconf itself or the Autoconf Macro
- Archive (http://www.gnu.org/software/autoconf-archive/), or by other
- means.
- The first requirement is to pay great attention to the quotation.
- For more details, see *note Autoconf Language::, and *note M4
- Quotation::.
- Do not try to invent new interfaces. It is likely that there is a
- macro in Autoconf that resembles the macro you are defining: try to
- stick to this existing interface (order of arguments, default values,
- etc.). We _are_ conscious that some of these interfaces are not
- perfect; nevertheless, when harmless, homogeneity should be preferred
- over creativity.
- Be careful about clashes both between M4 symbols and between shell
- variables.
- If you stick to the suggested M4 naming scheme (*note Macro Names::),
- you are unlikely to generate conflicts. Nevertheless, when you need to
- set a special value, _avoid using a regular macro name_; rather, use an
- "impossible" name. For instance, up to version 2.13, the macro
- `AC_SUBST' used to remember what SYMBOL macros were already defined by
- setting `AC_SUBST_SYMBOL', which is a regular macro name. But since
- there is a macro named `AC_SUBST_FILE', it was just impossible to
- `AC_SUBST(FILE)'! In this case, `AC_SUBST(SYMBOL)' or
- `_AC_SUBST(SYMBOL)' should have been used (yes, with the parentheses).
- No Autoconf macro should ever enter the user-variable name space;
- i.e., except for the variables that are the actual result of running the
- macro, all shell variables should start with `ac_'. In addition, small
- macros or any macro that is likely to be embedded in other macros
- should be careful not to use obvious names.
- Do not use `dnl' to introduce comments: most of the comments you are
- likely to write are either header comments which are not output anyway,
- or comments that should make their way into `configure'. There are
- exceptional cases where you do want to comment special M4 constructs,
- in which case `dnl' is right, but keep in mind that it is unlikely.
- M4 ignores the leading blanks and newlines before each argument.
- Use this feature to indent in such a way that arguments are (more or
- less) aligned with the opening parenthesis of the macro being called.
- For instance, instead of
- AC_CACHE_CHECK(for EMX OS/2 environment,
- ac_cv_emxos2,
- [AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [return __EMX__;])],
- [ac_cv_emxos2=yes], [ac_cv_emxos2=no])])
- write
- AC_CACHE_CHECK([for EMX OS/2 environment], [ac_cv_emxos2],
- [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [return __EMX__;])],
- [ac_cv_emxos2=yes],
- [ac_cv_emxos2=no])])
- or even
- AC_CACHE_CHECK([for EMX OS/2 environment],
- [ac_cv_emxos2],
- [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],
- [return __EMX__;])],
- [ac_cv_emxos2=yes],
- [ac_cv_emxos2=no])])
- When using `AC_RUN_IFELSE' or any macro that cannot work when
- cross-compiling, provide a pessimistic value (typically `no').
- Feel free to use various tricks to prevent auxiliary tools, such as
- syntax-highlighting editors, from behaving improperly. For instance,
- instead of:
- m4_bpatsubst([$1], [$"])
- use
- m4_bpatsubst([$1], [$""])
- so that Emacsen do not open an endless "string" at the first quote.
- For the same reasons, avoid:
- test $[#] != 0
- and use:
- test $[@%:@] != 0
- Otherwise, the closing bracket would be hidden inside a `#'-comment,
- breaking the bracket-matching highlighting from Emacsen. Note the
- preferred style to escape from M4: `$[1]', `$[@]', etc. Do not escape
- when it is unnecessary. Common examples of useless quotation are
- `[$]$1' (write `$$1'), `[$]var' (use `$var'), etc. If you add
- portability issues to the picture, you'll prefer `${1+"$[@]"}' to
- `"[$]@"', and you'll prefer do something better than hacking Autoconf
- `:-)'.
- When using `sed', don't use `-e' except for indenting purposes.
- With the `s' and `y' commands, the preferred separator is `/' unless
- `/' itself might appear in the pattern or replacement, in which case
- you should use `|', or optionally `,' if you know the pattern and
- replacement cannot contain a file name. If none of these characters
- will do, choose a printable character that cannot appear in the pattern
- or replacement. Characters from the set `"#$&'()*;<=>?`|~' are good
- choices if the pattern or replacement might contain a file name, since
- they have special meaning to the shell and are less likely to occur in
- file names.
- *Note Macro Definitions::, for details on how to define a macro. If
- a macro doesn't use `AC_REQUIRE', is expected to never be the object of
- an `AC_REQUIRE' directive, and macros required by other macros inside
- arguments do not need to be expanded before this macro, then use
- `m4_define'. In case of doubt, use `AC_DEFUN'. Also take into account
- that public third-party macros need to use `AC_DEFUN' in order to be
- found by `aclocal' (*note Extending aclocal: (automake)Extending
- aclocal.). All the `AC_REQUIRE' statements should be at the beginning
- of the macro, and each statement should be followed by `dnl'.
- You should not rely on the number of arguments: instead of checking
- whether an argument is missing, test that it is not empty. It provides
- both a simpler and a more predictable interface to the user, and saves
- room for further arguments.
- Unless the macro is short, try to leave the closing `])' at the
- beginning of a line, followed by a comment that repeats the name of the
- macro being defined. This introduces an additional newline in
- `configure'; normally, that is not a problem, but if you want to remove
- it you can use `[]dnl' on the last line. You can similarly use `[]dnl'
- after a macro call to remove its newline. `[]dnl' is recommended
- instead of `dnl' to ensure that M4 does not interpret the `dnl' as
- being attached to the preceding text or macro output. For example,
- instead of:
- AC_DEFUN([AC_PATH_X],
- [AC_MSG_CHECKING([for X])
- AC_REQUIRE_CPP()
- # ...omitted...
- AC_MSG_RESULT([libraries $x_libraries, headers $x_includes])
- fi])
- you would write:
- AC_DEFUN([AC_PATH_X],
- [AC_REQUIRE_CPP()[]dnl
- AC_MSG_CHECKING([for X])
- # ...omitted...
- AC_MSG_RESULT([libraries $x_libraries, headers $x_includes])
- fi[]dnl
- ])# AC_PATH_X
- If the macro is long, try to split it into logical chunks.
- Typically, macros that check for a bug in a function and prepare its
- `AC_LIBOBJ' replacement should have an auxiliary macro to perform this
- setup. Do not hesitate to introduce auxiliary macros to factor your
- code.
- In order to highlight the recommended coding style, here is a macro
- written the old way:
- dnl Check for EMX on OS/2.
- dnl _AC_EMXOS2
- AC_DEFUN(_AC_EMXOS2,
- [AC_CACHE_CHECK(for EMX OS/2 environment, ac_cv_emxos2,
- [AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, return __EMX__;)],
- ac_cv_emxos2=yes, ac_cv_emxos2=no)])
- test "x$ac_cv_emxos2" = xyes && EMXOS2=yes])
- and the new way:
- # _AC_EMXOS2
- # ----------
- # Check for EMX on OS/2.
- m4_define([_AC_EMXOS2],
- [AC_CACHE_CHECK([for EMX OS/2 environment], [ac_cv_emxos2],
- [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [return __EMX__;])],
- [ac_cv_emxos2=yes],
- [ac_cv_emxos2=no])])
- test "x$ac_cv_emxos2" = xyes && EMXOS2=yes[]dnl
- ])# _AC_EMXOS2
- File: autoconf.info, Node: Portable Shell, Next: Portable Make, Prev: Writing Autoconf Macros, Up: Top
- 11 Portable Shell Programming
- *****************************
- When writing your own checks, there are some shell-script programming
- techniques you should avoid in order to make your code portable. The
- Bourne shell and upward-compatible shells like the Korn shell and Bash
- have evolved over the years, and many features added to the original
- System7 shell are now supported on all interesting porting targets.
- However, the following discussion between Russ Allbery and Robert Lipe
- is worth reading:
- Russ Allbery:
- The GNU assumption that `/bin/sh' is the one and only shell leads
- to a permanent deadlock. Vendors don't want to break users'
- existing shell scripts, and there are some corner cases in the
- Bourne shell that are not completely compatible with a Posix
- shell. Thus, vendors who have taken this route will _never_
- (OK..."never say never") replace the Bourne shell (as `/bin/sh')
- with a Posix shell.
- Robert Lipe:
- This is exactly the problem. While most (at least most System
- V's) do have a Bourne shell that accepts shell functions most
- vendor `/bin/sh' programs are not the Posix shell.
- So while most modern systems do have a shell _somewhere_ that
- meets the Posix standard, the challenge is to find it.
- For this reason, part of the job of M4sh (*note Programming in
- M4sh::) is to find such a shell. But to prevent trouble, if you're not
- using M4sh you should not take advantage of features that were added
- after Unix version 7, circa 1977 (*note Systemology::); you should not
- use aliases, negated character classes, or even `unset'. `#' comments,
- while not in Unix version 7, were retrofitted in the original Bourne
- shell and can be assumed to be part of the least common denominator.
- On the other hand, if you're using M4sh you can assume that the shell
- has the features that were added in SVR2 (circa 1984), including shell
- functions, `return', `unset', and I/O redirection for builtins. For
- more information, refer to `http://www.in-ulm.de/~mascheck/bourne/'.
- However, some pitfalls have to be avoided for portable use of these
- constructs; these will be documented in the rest of this chapter. See
- in particular *note Shell Functions:: and *note Limitations of Shell
- Builtins: Limitations of Builtins.
- Some ancient systems have quite small limits on the length of the
- `#!' line; for instance, 32 bytes (not including the newline) on SunOS
- 4. However, these ancient systems are no longer of practical concern.
- The set of external programs you should run in a `configure' script
- is fairly small. *Note Utilities in Makefiles: (standards)Utilities in
- Makefiles, for the list. This restriction allows users to start out
- with a fairly small set of programs and build the rest, avoiding too
- many interdependencies between packages.
- Some of these external utilities have a portable subset of features;
- see *note Limitations of Usual Tools::.
- There are other sources of documentation about shells. The
- specification for the Posix Shell Command Language
- (http://www.opengroup.org/susv3/utilities/xcu_chap02.html), though more
- generous than the restrictive shell subset described above, is fairly
- portable nowadays. Also please see the Shell FAQs
- (http://www.faqs.org/faqs/unix-faq/shell/).
- * Menu:
- * Shellology:: A zoology of shells
- * Invoking the Shell:: Invoking the shell as a command
- * Here-Documents:: Quirks and tricks
- * File Descriptors:: FDs and redirections
- * Signal Handling:: Shells, signals, and headaches
- * File System Conventions:: File names
- * Shell Pattern Matching:: Pattern matching
- * Shell Substitutions:: Variable and command expansions
- * Assignments:: Varying side effects of assignments
- * Parentheses:: Parentheses in shell scripts
- * Slashes:: Slashes in shell scripts
- * Special Shell Variables:: Variables you should not change
- * Shell Functions:: What to look out for if you use them
- * Limitations of Builtins:: Portable use of not so portable /bin/sh
- * Limitations of Usual Tools:: Portable use of portable tools
- File: autoconf.info, Node: Shellology, Next: Invoking the Shell, Up: Portable Shell
- 11.1 Shellology
- ===============
- There are several families of shells, most prominently the Bourne family
- and the C shell family which are deeply incompatible. If you want to
- write portable shell scripts, avoid members of the C shell family. The
- the Shell difference FAQ
- (http://www.faqs.org/faqs/unix-faq/shell/shell-differences/) includes a
- small history of Posix shells, and a comparison between several of them.
- Below we describe some of the members of the Bourne shell family.
- Ash
- Ash is often used on GNU/Linux and BSD systems as a light-weight
- Bourne-compatible shell. Ash 0.2 has some bugs that are fixed in
- the 0.3.x series, but portable shell scripts should work around
- them, since version 0.2 is still shipped with many GNU/Linux
- distributions.
- To be compatible with Ash 0.2:
- - don't use `$?' after expanding empty or unset variables, or
- at the start of an `eval':
- foo=
- false
- $foo
- echo "Do not use it: $?"
- false
- eval 'echo "Do not use it: $?"'
- - don't use command substitution within variable expansion:
- cat ${FOO=`bar`}
- - beware that single builtin substitutions are not performed by
- a subshell, hence their effect applies to the current shell!
- *Note Shell Substitutions::, item "Command Substitution".
- Bash
- To detect whether you are running Bash, test whether
- `BASH_VERSION' is set. To require Posix compatibility, run `set
- -o posix'. *Note Bash Posix Mode: (bash)Bash POSIX Mode, for
- details.
- Bash 2.05 and later
- Versions 2.05 and later of Bash use a different format for the
- output of the `set' builtin, designed to make evaluating its
- output easier. However, this output is not compatible with earlier
- versions of Bash (or with many other shells, probably). So if you
- use Bash 2.05 or higher to execute `configure', you'll need to use
- Bash 2.05 for all other build tasks as well.
- Ksh
- The Korn shell is compatible with the Bourne family and it mostly
- conforms to Posix. It has two major variants commonly called
- `ksh88' and `ksh93', named after the years of initial release. It
- is usually called `ksh', but is called `sh' on some hosts if you
- set your path appropriately.
- Solaris systems have three variants: `/usr/bin/ksh' is `ksh88'; it
- is standard on Solaris 2.0 and later. `/usr/xpg4/bin/sh' is a
- Posix-compliant variant of `ksh88'; it is standard on Solaris 9
- and later. `/usr/dt/bin/dtksh' is `ksh93'. Variants that are not
- standard may be parts of optional packages. There is no extra
- charge for these packages, but they are not part of a minimal OS
- install and therefore some installations may not have it.
- Starting with Tru64 Version 4.0, the Korn shell `/usr/bin/ksh' is
- also available as `/usr/bin/posix/sh'. If the environment
- variable `BIN_SH' is set to `xpg4', subsidiary invocations of the
- standard shell conform to Posix.
- Pdksh
- A public-domain clone of the Korn shell called `pdksh' is widely
- available: it has most of the `ksh88' features along with a few of
- its own. It usually sets `KSH_VERSION', except if invoked as
- `/bin/sh' on OpenBSD, and similarly to Bash you can require Posix
- compatibility by running `set -o posix'. Unfortunately, with
- `pdksh' 5.2.14 (the latest stable version as of January 2007)
- Posix mode is buggy and causes `pdksh' to depart from Posix in at
- least one respect, see *note Shell Substitutions::.
- Zsh
- To detect whether you are running `zsh', test whether
- `ZSH_VERSION' is set. By default `zsh' is _not_ compatible with
- the Bourne shell: you must execute `emulate sh', and for `zsh'
- versions before 3.1.6-dev-18 you must also set `NULLCMD' to `:'.
- *Note Compatibility: (zsh)Compatibility, for details.
- The default Mac OS X `sh' was originally Zsh; it was changed to
- Bash in Mac OS X 10.2.
- File: autoconf.info, Node: Invoking the Shell, Next: Here-Documents, Prev: Shellology, Up: Portable Shell
- 11.2 Invoking the Shell
- =======================
- The Korn shell (up to at least version M-12/28/93d) has a bug when
- invoked on a file whose name does not contain a slash. It first
- searches for the file's name in `PATH', and if found it executes that
- rather than the original file. For example, assuming there is a binary
- executable `/usr/bin/script' in your `PATH', the last command in the
- following example fails because the Korn shell finds `/usr/bin/script'
- and refuses to execute it as a shell script:
- $ touch xxyzzyz script
- $ ksh xxyzzyz
- $ ksh ./script
- $ ksh script
- ksh: script: cannot execute
- Bash 2.03 has a bug when invoked with the `-c' option: if the
- option-argument ends in backslash-newline, Bash incorrectly reports a
- syntax error. The problem does not occur if a character follows the
- backslash:
- $ $ bash -c 'echo foo \
- > '
- bash: -c: line 2: syntax error: unexpected end of file
- $ bash -c 'echo foo \
- > '
- foo
- *Note Backslash-Newline-Empty::, for how this can cause problems in
- makefiles.
- File: autoconf.info, Node: Here-Documents, Next: File Descriptors, Prev: Invoking the Shell, Up: Portable Shell
- 11.3 Here-Documents
- ===================
- Don't rely on `\' being preserved just because it has no special
- meaning together with the next symbol. In the native `sh' on OpenBSD
- 2.7 `\"' expands to `"' in here-documents with unquoted delimiter. As
- a general rule, if `\\' expands to `\' use `\\' to get `\'.
- With OpenBSD 2.7's `sh'
- $ cat <<EOF
- > \" \\
- > EOF
- " \
- and with Bash:
- bash-2.04$ cat <<EOF
- > \" \\
- > EOF
- \" \
- Using command substitutions in a here-document that is fed to a shell
- function is not portable. For example, with Solaris 10 `/bin/sh':
- $ kitty () { cat; }
- $ kitty <<EOF
- > `echo ok`
- > EOF
- /tmp/sh199886: cannot open
- $ echo $?
- 1
- Some shells mishandle large here-documents: for example, Solaris 10
- `dtksh' and the UnixWare 7.1.1 Posix shell, which are derived from Korn
- shell version M-12/28/93d, mishandle braced variable expansion that
- crosses a 1024- or 4096-byte buffer boundary within a here-document.
- Only the part of the variable name after the boundary is used. For
- example, `${variable}' could be replaced by the expansion of `${ble}'.
- If the end of the variable name is aligned with the block boundary, the
- shell reports an error, as if you used `${}'. Instead of
- `${variable-default}', the shell may expand `${riable-default}', or
- even `${fault}'. This bug can often be worked around by omitting the
- braces: `$variable'. The bug was fixed in `ksh93g' (1998-04-30) but as
- of 2006 many operating systems were still shipping older versions with
- the bug.
- Empty here-documents are not portable either; with the following
- code, `zsh' up to at least version 4.3.10 creates a file with a single
- newline, whereas other shells create an empty file:
- cat >file <<EOF
- EOF
- Many shells (including the Bourne shell) implement here-documents
- inefficiently. In particular, some shells can be extremely inefficient
- when a single statement contains many here-documents. For instance if
- your `configure.ac' includes something like:
- if <cross_compiling>; then
- assume this and that
- else
- check this
- check that
- check something else
- ...
- on and on forever
- ...
- fi
- A shell parses the whole `if'/`fi' construct, creating temporary
- files for each here-document in it. Some shells create links for such
- here-documents on every `fork', so that the clean-up code they had
- installed correctly removes them. It is creating the links that can
- take the shell forever.
- Moving the tests out of the `if'/`fi', or creating multiple
- `if'/`fi' constructs, would improve the performance significantly.
- Anyway, this kind of construct is not exactly the typical use of
- Autoconf. In fact, it's even not recommended, because M4 macros can't
- look into shell conditionals, so we may fail to expand a macro when it
- was expanded before in a conditional path, and the condition turned out
- to be false at runtime, and we end up not executing the macro at all.
- Be careful with the use of `<<-' to unindent here-documents. The
- behavior is only portable for stripping leading <TAB>s, and things can
- silently break if an overzealous editor converts to using leading
- spaces (not all shells are nice enough to warn about unterminated
- here-documents).
- $ printf 'cat <<-x\n\t1\n\t 2\n\tx\n' | bash && echo done
- 1
- 2
- done
- $ printf 'cat <<-x\n 1\n 2\n x\n' | bash-3.2 && echo done
- 1
- 2
- x
- done
- File: autoconf.info, Node: File Descriptors, Next: Signal Handling, Prev: Here-Documents, Up: Portable Shell
- 11.4 File Descriptors
- =====================
- Most shells, if not all (including Bash, Zsh, Ash), output traces on
- stderr, even for subshells. This might result in undesirable content
- if you meant to capture the standard-error output of the inner command:
- $ ash -x -c '(eval "echo foo >&2") 2>stderr'
- $ cat stderr
- + eval echo foo >&2
- + echo foo
- foo
- $ bash -x -c '(eval "echo foo >&2") 2>stderr'
- $ cat stderr
- + eval 'echo foo >&2'
- ++ echo foo
- foo
- $ zsh -x -c '(eval "echo foo >&2") 2>stderr'
- # Traces on startup files deleted here.
- $ cat stderr
- +zsh:1> eval echo foo >&2
- +zsh:1> echo foo
- foo
- One workaround is to grep out uninteresting lines, hoping not to remove
- good ones.
- If you intend to redirect both standard error and standard output,
- redirect standard output first. This works better with HP-UX, since
- its shell mishandles tracing if standard error is redirected first:
- $ sh -x -c ': 2>err >out'
- + :
- + 2> err $ cat err
- 1> out
- Don't try to redirect the standard error of a command substitution.
- It must be done _inside_ the command substitution. When running `: `cd
- /zorglub` 2>/dev/null' expect the error message to escape, while `: `cd
- /zorglub 2>/dev/null`' works properly.
- On the other hand, some shells, such as Solaris or FreeBSD
- `/bin/sh', warn about missing programs before performing redirections.
- Therefore, to silently check whether a program exists, it is necessary
- to perform redirections on a subshell or brace group:
- $ /bin/sh -c 'nosuch 2>/dev/null'
- nosuch: not found
- $ /bin/sh -c '(nosuch) 2>/dev/null'
- $ /bin/sh -c '{ nosuch; } 2>/dev/null'
- $ bash -c 'nosuch 2>/dev/null'
- FreeBSD 6.2 sh may mix the trace output lines from the statements in
- a shell pipeline.
- It is worth noting that Zsh (but not Ash nor Bash) makes it possible
- in assignments though: `foo=`cd /zorglub` 2>/dev/null'.
- Some shells, like `ash', don't recognize bi-directional redirection
- (`<>'). And even on shells that recognize it, it is not portable to
- use on fifos: Posix does not require read-write support for named
- pipes, and Cygwin does not support it:
- $ mkfifo fifo
- $ exec 5<>fifo
- $ echo hi >&5
- bash: echo: write error: Communication error on send
- Furthermore, versions of `dash' before 0.5.6 mistakenly truncate
- regular files when using `<>':
- $ echo a > file
- $ bash -c ': 1<>file'; cat file
- a
- $ dash -c ': 1<>file'; cat file
- $ rm a
- When catering to old systems, don't redirect the same file descriptor
- several times, as you are doomed to failure under Ultrix.
- ULTRIX V4.4 (Rev. 69) System #31: Thu Aug 10 19:42:23 GMT 1995
- UWS V4.4 (Rev. 11)
- $ eval 'echo matter >fullness' >void
- illegal io
- $ eval '(echo matter >fullness)' >void
- illegal io
- $ (eval '(echo matter >fullness)') >void
- Ambiguous output redirect.
- In each case the expected result is of course `fullness' containing
- `matter' and `void' being empty. However, this bug is probably not of
- practical concern to modern platforms.
- Solaris 10 `sh' will try to optimize away a `:' command (even if it
- is redirected) in a loop after the first iteration, or in a shell
- function after the first call:
- $ for i in 1 2 3 ; do : >x$i; done
- $ ls x*
- x1
- $ f () { : >$1; }; f y1; f y2; f y3;
- $ ls y*
- y1
- As a workaround, `echo' or `eval' can be used.
- Don't rely on file descriptors 0, 1, and 2 remaining closed in a
- subsidiary program. If any of these descriptors is closed, the
- operating system may open an unspecified file for the descriptor in the
- new process image. Posix 2008 says this may be done only if the
- subsidiary program is set-user-ID or set-group-ID, but HP-UX 11.23 does
- it even for ordinary programs, and the next version of Posix will allow
- HP-UX behavior.
- If you want a file descriptor above 2 to be inherited into a child
- process, then you must use redirections specific to that command or a
- containing subshell or command group, rather than relying on `exec' in
- the shell. In `ksh' as well as HP-UX `sh', file descriptors above 2
- which are opened using `exec N>file' are closed by a subsequent `exec'
- (such as that involved in the fork-and-exec which runs a program or
- script):
- $ echo 'echo hello >&5' >k
- $ /bin/sh -c 'exec 5>t; ksh ./k; exec 5>&-; cat t
- hello
- $ bash -c 'exec 5>t; ksh ./k; exec 5>&-; cat t
- hello
- $ ksh -c 'exec 5>t; ksh ./k; exec 5>&-; cat t
- ./k[1]: 5: cannot open [Bad file number]
- $ ksh -c '(ksh ./k) 5>t; cat t'
- hello
- $ ksh -c '{ ksh ./k; } 5>t; cat t'
- hello
- $ ksh -c '5>t ksh ./k; cat t
- hello
- Don't rely on duplicating a closed file descriptor to cause an
- error. With Solaris `/bin/sh', failed duplication is silently ignored,
- which can cause unintended leaks to the original file descriptor. In
- this example, observe the leak to standard output:
- $ bash -c 'echo hi >&3' 3>&-; echo $?
- bash: 3: Bad file descriptor
- 1
- $ /bin/sh -c 'echo hi >&3' 3>&-; echo $?
- hi
- 0
- Fortunately, an attempt to close an already closed file descriptor
- will portably succeed. Likewise, it is safe to use either style of
- `N<&-' or `N>&-' for closing a file descriptor, even if it doesn't
- match the read/write mode that the file descriptor was opened with.
- DOS variants cannot rename or remove open files, such as in `mv foo
- bar >foo' or `rm foo >foo', even though this is perfectly portable
- among Posix hosts.
- A few ancient systems reserved some file descriptors. By convention,
- file descriptor 3 was opened to `/dev/tty' when you logged into Eighth
- Edition (1985) through Tenth Edition Unix (1989). File descriptor 4
- had a special use on the Stardent/Kubota Titan (circa 1990), though we
- don't now remember what it was. Both these systems are obsolete, so
- it's now safe to treat file descriptors 3 and 4 like any other file
- descriptors.
- On the other hand, you can't portably use multi-digit file
- descriptors. Solaris `ksh' doesn't understand any file descriptor
- larger than `9':
- $ bash -c 'exec 10>&-'; echo $?
- 0
- $ ksh -c 'exec 9>&-'; echo $?
- 0
- $ ksh -c 'exec 10>&-'; echo $?
- ksh[1]: exec: 10: not found
- 127
- File: autoconf.info, Node: Signal Handling, Next: File System Conventions, Prev: File Descriptors, Up: Portable Shell
- 11.5 Signal Handling
- ====================
- Portable handling of signals within the shell is another major source of
- headaches. This is worsened by the fact that various different,
- mutually incompatible approaches are possible in this area, each with
- its distinctive merits and demerits. A detailed description of these
- possible approaches, as well as of their pros and cons, can be found in
- this article (http://www.cons.org/cracauer/sigint.html).
- Solaris 10 `/bin/sh' automatically traps most signals by default;
- the shell still exits with error upon termination by one of those
- signals, but in such a case the exit status might be somewhat
- unexpected (even if allowed by POSIX, strictly speaking):
- $ bash -c 'kill -1 $$'; echo $? # Will exit 128 + (signal number).
- Hangup
- 129
- $ /bin/ksh -c 'kill -15 $$'; echo $? # Likewise.
- Terminated
- 143
- $ for sig in 1 2 3 15; do
- > echo $sig:
- > /bin/sh -c "kill -$s \$\$"; echo $?
- > done
- signal 1:
- Hangup
- 129
- signal 2:
- 208
- signal 3:
- 208
- signal 15:
- 208
- This gets even worse if one is using the POSIX `wait' interface to
- get details about the shell process terminations: it will result in the
- shell having exited normally, rather than by receiving a signal.
- $ cat > foo.c <<'END'
- #include <stdio.h> /* for printf */
- #include <stdlib.h> /* for system */
- #include <sys/wait.h> /* for WIF* macros */
- int main(void)
- {
- int status = system ("kill -15 $$");
- printf ("Terminated by signal: %s\n",
- WIFSIGNALED (status) ? "yes" : "no");
- printf ("Exited normally: %s\n",
- WIFEXITED (status) ? "yes" : "no");
- return 0;
- }
- END
- $ cc -o foo foo.c
- $ ./a.out # On GNU/Linux
- Terminated by signal: no
- Exited normally: yes
- $ ./a.out # On Solaris 10
- Terminated by signal: yes
- Exited normally: no
- Various shells seem to handle `SIGQUIT' specially: they ignore it
- even if it is not blocked, and even if the shell is not running
- interactively (in fact, even if the shell has no attached tty); among
- these shells are at least Bash (from version 2 onwards), Zsh 4.3.12,
- Solaris 10 `/bin/ksh' and `/usr/xpg4/bin/sh', and AT&T `ksh93' (2011).
- Still, `SIGQUIT' seems to be trappable quite portably within all these
- shells. OTOH, some other shells doesn't special-case the handling of
- `SIGQUIT'; among these shells are at least `pdksh' 5.2.14, Solaris 10
- and NetBSD 5.1 `/bin/sh', and the Almquist Shell 0.5.5.1.
- Some shells (especially Korn shells and derivatives) might try to
- propagate to themselves a signal that has killed a child process; this
- is not a bug, but a conscious design choice (although its overall value
- might be debatable). The exact details of how this is attained vary
- from shell to shell. For example, upon running `perl -e 'kill 2, $$'',
- after the perl process has been interrupted AT&T `ksh93' (2011) will
- proceed to send itself a `SIGINT', while Solaris 10 `/bin/ksh' and
- `/usr/xpg4/bin/sh' will proceed to exit with status 130 (i.e., 128 +
- 2). In any case, if there is an active trap associated with `SIGINT',
- those shells will correctly execute it.
- Some Korn shells, when a child process die due receiving a signal
- with signal number N, can leave in `$?' an exit status of 256+N instead
- of the more common 128+N. Observe the difference between AT&T `ksh93'
- (2011) and `bash' 4.1.5 on Debian:
- $ /bin/ksh -c 'sh -c "kill -1 \$\$"; echo $?'
- /bin/ksh: line 1: 7837: Hangup
- 257
- $ /bin/bash -c 'sh -c "kill -1 \$\$"; echo $?'
- /bin/bash: line 1: 7861 Hangup (sh -c "kill -1 \$\$")
- 129
- This `ksh' behavior is allowed by POSIX, if implemented with due care;
- see this Austin Group discussion
- (http://www.austingroupbugs.net/view.php?id=51) for more background.
- However, if it is not implemented with proper care, such a behavior
- might cause problems in some corner cases. To see why, assume we have
- a "wrapper" script like this:
- #!/bin/sh
- # Ignore some signals in the shell only, not in its child processes.
- trap : 1 2 13 15
- wrapped_command "$@"
- ret=$?
- other_command
- exit $ret
- If `wrapped_command' is interrupted by a `SIGHUP' (which has signal
- number 1), `ret' will be set to 257. Unless the `exit' shell builtin
- is smart enough to understand that such a value can only have
- originated from a signal, and adjust the final wait status of the shell
- appropriately, the value 257 will just get truncated to 1 by the
- closing `exit' call, so that a caller of the script will have no way to
- determine that termination by a signal was involved. Observe the
- different behavior of AT&T `ksh93' (2011) and `bash' 4.1.5 on Debian:
- $ cat foo.sh
- #!/bin/sh
- sh -c 'kill -1 $$'
- ret=$?
- echo $ret
- exit $ret
- $ /bin/ksh foo.sh; echo $?
- foo.sh: line 2: 12479: Hangup
- 257
- 1
- $ /bin/bash foo.sh; echo $?
- foo.sh: line 2: 12487 Hangup (sh -c 'kill -1 $$')
- 129
- 129
- File: autoconf.info, Node: File System Conventions, Next: Shell Pattern Matching, Prev: Signal Handling, Up: Portable Shell
- 11.6 File System Conventions
- ============================
- Autoconf uses shell-script processing extensively, so the file names
- that it processes should not contain characters that are special to the
- shell. Special characters include space, tab, newline, NUL, and the
- following:
- " # $ & ' ( ) * ; < = > ? [ \ ` |
- Also, file names should not begin with `~' or `-', and should
- contain neither `-' immediately after `/' nor `~' immediately after
- `:'. On Posix-like platforms, directory names should not contain `:',
- as this runs afoul of `:' used as the path separator.
- These restrictions apply not only to the files that you distribute,
- but also to the absolute file names of your source, build, and
- destination directories.
- On some Posix-like platforms, `!' and `^' are special too, so they
- should be avoided.
- Posix lets implementations treat leading `//' specially, but
- requires leading `///' and beyond to be equivalent to `/'. Most Unix
- variants treat `//' like `/'. However, some treat `//' as a
- "super-root" that can provide access to files that are not otherwise
- reachable from `/'. The super-root tradition began with Apollo
- Domain/OS, which died out long ago, but unfortunately Cygwin has
- revived it.
- While `autoconf' and friends are usually run on some Posix variety,
- they can be used on other systems, most notably DOS variants. This
- impacts several assumptions regarding file names.
- For example, the following code:
- case $foo_dir in
- /*) # Absolute
- ;;
- *)
- foo_dir=$dots$foo_dir ;;
- esac
- fails to properly detect absolute file names on those systems, because
- they can use a drivespec, and usually use a backslash as directory
- separator. If you want to be portable to DOS variants (at the price of
- rejecting valid but oddball Posix file names like `a:\b'), you can
- check for absolute file names like this:
- case $foo_dir in
- [\\/]* | ?:[\\/]* ) # Absolute
- ;;
- *)
- foo_dir=$dots$foo_dir ;;
- esac
- Make sure you quote the brackets if appropriate and keep the backslash
- as first character (*note Limitations of Shell Builtins: case.).
- Also, because the colon is used as part of a drivespec, these
- systems don't use it as path separator. When creating or accessing
- paths, you can use the `PATH_SEPARATOR' output variable instead.
- `configure' sets this to the appropriate value for the build system
- (`:' or `;') when it starts up.
- File names need extra care as well. While DOS variants that are
- Posixy enough to run `autoconf' (such as DJGPP) are usually able to
- handle long file names properly, there are still limitations that can
- seriously break packages. Several of these issues can be easily
- detected by the doschk
- (ftp://ftp.gnu.org/gnu/non-gnu/doschk/doschk-1.1.tar.gz) package.
- A short overview follows; problems are marked with SFN/LFN to
- indicate where they apply: SFN means the issues are only relevant to
- plain DOS, not to DOS under Microsoft Windows variants, while LFN
- identifies problems that exist even under Microsoft Windows variants.
- No multiple dots (SFN)
- DOS cannot handle multiple dots in file names. This is an
- especially important thing to remember when building a portable
- configure script, as `autoconf' uses a .in suffix for template
- files.
- This is perfectly OK on Posix variants:
- AC_CONFIG_HEADERS([config.h])
- AC_CONFIG_FILES([source.c foo.bar])
- AC_OUTPUT
- but it causes problems on DOS, as it requires `config.h.in',
- `source.c.in' and `foo.bar.in'. To make your package more portable
- to DOS-based environments, you should use this instead:
- AC_CONFIG_HEADERS([config.h:config.hin])
- AC_CONFIG_FILES([source.c:source.cin foo.bar:foobar.in])
- AC_OUTPUT
- No leading dot (SFN)
- DOS cannot handle file names that start with a dot. This is
- usually not important for `autoconf'.
- Case insensitivity (LFN)
- DOS is case insensitive, so you cannot, for example, have both a
- file called `INSTALL' and a directory called `install'. This also
- affects `make'; if there's a file called `INSTALL' in the
- directory, `make install' does nothing (unless the `install'
- target is marked as PHONY).
- The 8+3 limit (SFN)
- Because the DOS file system only stores the first 8 characters of
- the file name and the first 3 of the extension, those must be
- unique. That means that `foobar-part1.c', `foobar-part2.c' and
- `foobar-prettybird.c' all resolve to the same file name
- (`FOOBAR-P.C'). The same goes for `foo.bar' and `foo.bartender'.
- The 8+3 limit is not usually a problem under Microsoft Windows, as
- it uses numeric tails in the short version of file names to make
- them unique. However, a registry setting can turn this behavior
- off. While this makes it possible to share file trees containing
- long file names between SFN and LFN environments, it also means
- the above problem applies there as well.
- Invalid characters (LFN)
- Some characters are invalid in DOS file names, and should therefore
- be avoided. In a LFN environment, these are `/', `\', `?', `*',
- `:', `<', `>', `|' and `"'. In a SFN environment, other
- characters are also invalid. These include `+', `,', `[' and `]'.
- Invalid names (LFN)
- Some DOS file names are reserved, and cause problems if you try to
- use files with those names. These names include `CON', `AUX',
- `COM1', `COM2', `COM3', `COM4', `LPT1', `LPT2', `LPT3', `NUL', and
- `PRN'. File names are case insensitive, so even names like
- `aux/config.guess' are disallowed.
- File: autoconf.info, Node: Shell Pattern Matching, Next: Shell Substitutions, Prev: File System Conventions, Up: Portable Shell
- 11.7 Shell Pattern Matching
- ===========================
- Nowadays portable patterns can use negated character classes like
- `[!-aeiou]'. The older syntax `[^-aeiou]' is supported by some shells
- but not others; hence portable scripts should never use `^' as the
- first character of a bracket pattern.
- Outside the C locale, patterns like `[a-z]' are problematic since
- they may match characters that are not lower-case letters.
- File: autoconf.info, Node: Shell Substitutions, Next: Assignments, Prev: Shell Pattern Matching, Up: Portable Shell
- 11.8 Shell Substitutions
- ========================
- Contrary to a persistent urban legend, the Bourne shell does not
- systematically split variables and back-quoted expressions, in
- particular on the right-hand side of assignments and in the argument of
- `case'. For instance, the following code:
- case "$given_srcdir" in
- .) top_srcdir="`echo "$dots" | sed 's|/$||'`" ;;
- *) top_srcdir="$dots$given_srcdir" ;;
- esac
- is more readable when written as:
- case $given_srcdir in
- .) top_srcdir=`echo "$dots" | sed 's|/$||'` ;;
- *) top_srcdir=$dots$given_srcdir ;;
- esac
- and in fact it is even _more_ portable: in the first case of the first
- attempt, the computation of `top_srcdir' is not portable, since not all
- shells properly understand `"`..."..."...`"', for example Solaris 10
- ksh:
- $ foo="`echo " bar" | sed 's, ,,'`"
- ksh: : cannot execute
- ksh: bar | sed 's, ,,': cannot execute
- Posix does not specify behavior for this sequence. On the other hand,
- behavior for `"`...\"...\"...`"' is specified by Posix, but in
- practice, not all shells understand it the same way: pdksh 5.2.14
- prints spurious quotes when in Posix mode:
- $ echo "`echo \"hello\"`"
- hello
- $ set -o posix
- $ echo "`echo \"hello\"`"
- "hello"
- There is just no portable way to use double-quoted strings inside
- double-quoted back-quoted expressions (pfew!).
- Bash 4.1 has a bug where quoted empty strings adjacent to unquoted
- parameter expansions are elided during word splitting. Meanwhile, zsh
- does not perform word splitting except when in Bourne compatibility
- mode. In the example below, the correct behavior is to have five
- arguments to the function, and exactly two spaces on either side of the
- middle `-', since word splitting collapses multiple spaces in `$f' but
- leaves empty arguments intact.
- $ bash -c 'n() { echo "$#$@"; }; f=" - "; n - ""$f"" -'
- 3- - -
- $ ksh -c 'n() { echo "$#$@"; }; f=" - "; n - ""$f"" -'
- 5- - -
- $ zsh -c 'n() { echo "$#$@"; }; f=" - "; n - ""$f"" -'
- 3- - -
- $ zsh -c 'emulate sh;
- > n() { echo "$#$@"; }; f=" - "; n - ""$f"" -'
- 5- - -
- You can work around this by doing manual word splitting, such as using
- `"$str" $list' rather than `"$str"$list'.
- There are also portability pitfalls with particular expansions:
- `$@'
- One of the most famous shell-portability issues is related to
- `"$@"'. When there are no positional arguments, Posix says that
- `"$@"' is supposed to be equivalent to nothing, but the original
- Unix version 7 Bourne shell treated it as equivalent to `""'
- instead, and this behavior survives in later implementations like
- Digital Unix 5.0.
- The traditional way to work around this portability problem is to
- use `${1+"$@"}'. Unfortunately this method does not work with Zsh
- (3.x and 4.x), which is used on Mac OS X. When emulating the
- Bourne shell, Zsh performs word splitting on `${1+"$@"}':
- zsh $ emulate sh
- zsh $ for i in "$@"; do echo $i; done
- Hello World
- !
- zsh $ for i in ${1+"$@"}; do echo $i; done
- Hello
- World
- !
- Zsh handles plain `"$@"' properly, but we can't use plain `"$@"'
- because of the portability problems mentioned above. One
- workaround relies on Zsh's "global aliases" to convert `${1+"$@"}'
- into `"$@"' by itself:
- test "${ZSH_VERSION+set}" = set && alias -g '${1+"$@"}'='"$@"'
- Zsh only recognizes this alias when a shell word matches it
- exactly; `"foo"${1+"$@"}' remains subject to word splitting.
- Since this case always yields at least one shell word, use plain
- `"$@"'.
- A more conservative workaround is to avoid `"$@"' if it is
- possible that there may be no positional arguments. For example,
- instead of:
- cat conftest.c "$@"
- you can use this instead:
- case $# in
- 0) cat conftest.c;;
- *) cat conftest.c "$@";;
- esac
- Autoconf macros often use the `set' command to update `$@', so if
- you are writing shell code intended for `configure' you should not
- assume that the value of `$@' persists for any length of time.
- `${10}'
- The 10th, 11th, ... positional parameters can be accessed only
- after a `shift'. The 7th Edition shell reported an error if given
- `${10}', and Solaris 10 `/bin/sh' still acts that way:
- $ set 1 2 3 4 5 6 7 8 9 10
- $ echo ${10}
- bad substitution
- Conversely, not all shells obey the Posix rule that when braces are
- omitted, multiple digits beyond a `$' imply the single-digit
- positional parameter expansion concatenated with the remaining
- literal digits. To work around the issue, you must use braces.
- $ bash -c 'set a b c d e f g h i j; echo $10 ${1}0'
- a0 a0
- $ dash -c 'set a b c d e f g h i j; echo $10 ${1}0'
- j a0
- `${VAR:-VALUE}'
- Old BSD shells, including the Ultrix `sh', don't accept the colon
- for any shell substitution, and complain and die. Similarly for
- ${VAR:=VALUE}, ${VAR:?VALUE}, etc. However, all shells that
- support functions allow the use of colon in shell substitution,
- and since m4sh requires functions, you can portably use null
- variable substitution patterns in configure scripts.
- `${VAR+VALUE}'
- When using `${VAR-VALUE}' or `${VAR-VALUE}' for providing
- alternate substitutions, VALUE must either be a single shell word,
- quoted, or in the context of an unquoted here-document. Solaris
- `/bin/sh' complains otherwise.
- $ /bin/sh -c 'echo ${a-b c}'
- /bin/sh: bad substitution
- $ /bin/sh -c 'echo ${a-'\''b c'\''}'
- b c
- $ /bin/sh -c 'echo "${a-b c}"'
- b c
- $ /bin/sh -c 'cat <<EOF
- ${a-b c}
- EOF
- b c
- According to Posix, if an expansion occurs inside double quotes,
- then the use of unquoted double quotes within VALUE is
- unspecified, and any single quotes become literal characters; in
- that case, escaping must be done with backslash. Likewise, the
- use of unquoted here-documents is a case where double quotes have
- unspecified results:
- $ /bin/sh -c 'echo "${a-"b c"}"'
- /bin/sh: bad substitution
- $ ksh -c 'echo "${a-"b c"}"'
- b c
- $ bash -c 'echo "${a-"b c"}"'
- b c
- $ /bin/sh -c 'a=; echo ${a+'\''b c'\''}'
- b c
- $ /bin/sh -c 'a=; echo "${a+'\''b c'\''}"'
- 'b c'
- $ /bin/sh -c 'a=; echo "${a+\"b c\"}"'
- "b c"
- $ /bin/sh -c 'a=; echo "${a+b c}"'
- b c
- $ /bin/sh -c 'cat <<EOF
- ${a-"b c"}
- EOF'
- "b c"
- $ /bin/sh -c 'cat <<EOF
- ${a-'b c'}
- EOF'
- 'b c'
- $ bash -c 'cat <<EOF
- ${a-"b c"}
- EOF'
- b c
- $ bash -c 'cat <<EOF
- ${a-'b c'}
- EOF'
- 'b c'
- Perhaps the easiest way to work around quoting issues in a manner
- portable to all shells is to place the results in a temporary
- variable, then use `$t' as the VALUE, rather than trying to inline
- the expression needing quoting.
- $ /bin/sh -c 't="b c\"'\''}\\"; echo "${a-$t}"'
- b c"'}\
- $ ksh -c 't="b c\"'\''}\\"; echo "${a-$t}"'
- b c"'}\
- $ bash -c 't="b c\"'\''}\\"; echo "${a-$t}"'
- b c"'}\
- `${VAR=VALUE}'
- When using `${VAR=VALUE}' to assign a default value to VAR,
- remember that even though the assignment to VAR does not undergo
- file name expansion, the result of the variable expansion does
- unless the expansion occurred within double quotes. In particular,
- when using `:' followed by unquoted variable expansion for the
- side effect of setting a default value, if the final value of
- `$var' contains any globbing characters (either from VALUE or from
- prior contents), the shell has to spend time performing file name
- expansion and field splitting even though those results will not be
- used. Therefore, it is a good idea to consider double quotes when
- performing default initialization; while remembering how this
- impacts any quoting characters appearing in VALUE.
- $ time bash -c ': "${a=/usr/bin/*}"; echo "$a"'
- /usr/bin/*
- real 0m0.005s
- user 0m0.002s
- sys 0m0.003s
- $ time bash -c ': ${a=/usr/bin/*}; echo "$a"'
- /usr/bin/*
- real 0m0.039s
- user 0m0.026s
- sys 0m0.009s
- $ time bash -c 'a=/usr/bin/*; : ${a=noglob}; echo "$a"'
- /usr/bin/*
- real 0m0.031s
- user 0m0.020s
- sys 0m0.010s
- $ time bash -c 'a=/usr/bin/*; : "${a=noglob}"; echo "$a"'
- /usr/bin/*
- real 0m0.006s
- user 0m0.002s
- sys 0m0.003s
- As with `+' and `-', you must use quotes when using `=' if the
- VALUE contains more than one shell word; either single quotes for
- just the VALUE, or double quotes around the entire expansion:
- $ : ${var1='Some words'}
- $ : "${var2=like this}"
- $ echo $var1 $var2
- Some words like this
- otherwise some shells, such as Solaris `/bin/sh' or on Digital
- Unix V 5.0, die because of a "bad substitution". Meanwhile, Posix
- requires that with `=', quote removal happens prior to the
- assignment, and the expansion be the final contents of VAR without
- quoting (and thus subject to field splitting), in contrast to the
- behavior with `-' passing the quoting through to the final
- expansion. However, `bash' 4.1 does not obey this rule.
- $ ksh -c 'echo ${var-a\ \ b}'
- a b
- $ ksh -c 'echo ${var=a\ \ b}'
- a b
- $ bash -c 'echo ${var=a\ \ b}'
- a b
- Finally, Posix states that when mixing `${a=b}' with regular
- commands, it is unspecified whether the assignments affect the
- parent shell environment. It is best to perform assignments
- independently from commands, to avoid the problems demonstrated in
- this example:
- $ bash -c 'x= y=${x:=b} sh -c "echo +\$x+\$y+";echo -$x-'
- +b+b+
- -b-
- $ /bin/sh -c 'x= y=${x:=b} sh -c "echo +\$x+\$y+";echo -$x-'
- ++b+
- --
- $ ksh -c 'x= y=${x:=b} sh -c "echo +\$x+\$y+";echo -$x-'
- +b+b+
- --
- `${VAR=VALUE}'
- Solaris `/bin/sh' has a frightening bug in its handling of literal
- assignments. Imagine you need set a variable to a string
- containing `}'. This `}' character confuses Solaris `/bin/sh'
- when the affected variable was already set. This bug can be
- exercised by running:
- $ unset foo
- $ foo=${foo='}'}
- $ echo $foo
- }
- $ foo=${foo='}' # no error; this hints to what the bug is
- $ echo $foo
- }
- $ foo=${foo='}'}
- $ echo $foo
- }}
- ^ ugh!
- It seems that `}' is interpreted as matching `${', even though it
- is enclosed in single quotes. The problem doesn't happen using
- double quotes, or when using a temporary variable holding the
- problematic string.
- `${VAR=EXPANDED-VALUE}'
- On Ultrix, running
- default="yu,yaa"
- : ${var="$default"}
- sets VAR to `M-yM-uM-,M-yM-aM-a', i.e., the 8th bit of each char
- is set. You don't observe the phenomenon using a simple `echo
- $var' since apparently the shell resets the 8th bit when it
- expands $var. Here are two means to make this shell confess its
- sins:
- $ cat -v <<EOF
- $var
- EOF
- and
- $ set | grep '^var=' | cat -v
- One classic incarnation of this bug is:
- default="a b c"
- : ${list="$default"}
- for c in $list; do
- echo $c
- done
- You'll get `a b c' on a single line. Why? Because there are no
- spaces in `$list': there are `M- ', i.e., spaces with the 8th bit
- set, hence no IFS splitting is performed!!!
- One piece of good news is that Ultrix works fine with `:
- ${list=$default}'; i.e., if you _don't_ quote. The bad news is
- then that QNX 4.25 then sets LIST to the _last_ item of DEFAULT!
- The portable way out consists in using a double assignment, to
- switch the 8th bit twice on Ultrix:
- list=${list="$default"}
- ...but beware of the `}' bug from Solaris (see above). For safety,
- use:
- test "${var+set}" = set || var={VALUE}
- `${#VAR}'
- `${VAR%WORD}'
- `${VAR%%WORD}'
- `${VAR#WORD}'
- `${VAR##WORD}'
- Posix requires support for these usages, but they do not work with
- many traditional shells, e.g., Solaris 10 `/bin/sh'.
- Also, `pdksh' 5.2.14 mishandles some WORD forms. For example if
- `$1' is `a/b' and `$2' is `a', then `${1#$2}' should yield `/b',
- but with `pdksh' it yields the empty string.
- ``COMMANDS`'
- Posix requires shells to trim all trailing newlines from command
- output before substituting it, so assignments like `dir=`echo
- "$file" | tr a A`' do not work as expected if `$file' ends in a
- newline.
- While in general it makes no sense, do not substitute a single
- builtin with side effects, because Ash 0.2, trying to optimize,
- does not fork a subshell to perform the command.
- For instance, if you wanted to check that `cd' is silent, do not
- use `test -z "`cd /`"' because the following can happen:
- $ pwd
- /tmp
- $ test -z "`cd /`" && pwd
- /
- The result of `foo=`exit 1`' is left as an exercise to the reader.
- The MSYS shell leaves a stray byte in the expansion of a
- double-quoted command substitution of a native program, if the end
- of the substitution is not aligned with the end of the double
- quote. This may be worked around by inserting another pair of
- quotes:
- $ echo "`printf 'foo\r\n'` bar" > broken
- $ echo "`printf 'foo\r\n'`"" bar" | cmp - broken
- - broken differ: char 4, line 1
- Upon interrupt or SIGTERM, some shells may abort a command
- substitution, replace it with a null string, and wrongly evaluate
- the enclosing command before entering the trap or ending the
- script. This can lead to spurious errors:
- $ sh -c 'if test `sleep 5; echo hi` = hi; then echo yes; fi'
- $ ^C
- sh: test: hi: unexpected operator/operand
- You can avoid this by assigning the command substitution to a
- temporary variable:
- $ sh -c 'res=`sleep 5; echo hi`
- if test "x$res" = xhi; then echo yes; fi'
- $ ^C
- `$(COMMANDS)'
- This construct is meant to replace ``COMMANDS`', and it has most
- of the problems listed under ``COMMANDS`'.
- This construct can be nested while this is impossible to do
- portably with back quotes. Unfortunately it is not yet
- universally supported. Most notably, even recent releases of
- Solaris don't support it:
- $ showrev -c /bin/sh | grep version
- Command version: SunOS 5.10 Generic 121005-03 Oct 2006
- $ echo $(echo blah)
- syntax error: `(' unexpected
- nor does IRIX 6.5's Bourne shell:
- $ uname -a
- IRIX firebird-image 6.5 07151432 IP22
- $ echo $(echo blah)
- $(echo blah)
- If you do use `$(COMMANDS)', make sure that the commands do not
- start with a parenthesis, as that would cause confusion with a
- different notation `$((EXPRESSION))' that in modern shells is an
- arithmetic expression not a command. To avoid the confusion,
- insert a space between the two opening parentheses.
- Avoid COMMANDS that contain unbalanced parentheses in
- here-documents, comments, or case statement patterns, as many
- shells mishandle them. For example, Bash 3.1, `ksh88', `pdksh'
- 5.2.14, and Zsh 4.2.6 all mishandle the following valid command:
- echo $(case x in x) echo hello;; esac)
- `$((EXPRESSION))'
- Arithmetic expansion is not portable as some shells (most notably
- Solaris 10 `/bin/sh') don't support it.
- Among shells that do support `$(( ))', not all of them obey the
- Posix rule that octal and hexadecimal constants must be recognized:
- $ bash -c 'echo $(( 010 + 0x10 ))'
- 24
- $ zsh -c 'echo $(( 010 + 0x10 ))'
- 26
- $ zsh -c 'emulate sh; echo $(( 010 + 0x10 ))'
- 24
- $ pdksh -c 'echo $(( 010 + 0x10 ))'
- pdksh: 010 + 0x10 : bad number `0x10'
- $ pdksh -c 'echo $(( 010 ))'
- 10
- When it is available, using arithmetic expansion provides a
- noticeable speedup in script execution; but testing for support
- requires `eval' to avoid syntax errors. The following construct
- is used by `AS_VAR_ARITH' to provide arithmetic computation when
- all arguments are provided in decimal and without a leading zero,
- and all operators are properly quoted and appear as distinct
- arguments:
- if ( eval 'test $(( 1 + 1 )) = 2' ) 2>/dev/null; then
- eval 'func_arith ()
- {
- func_arith_result=$(( $* ))
- }'
- else
- func_arith ()
- {
- func_arith_result=`expr "$@"`
- }
- fi
- func_arith 1 + 1
- foo=$func_arith_result
- `^'
- Always quote `^', otherwise traditional shells such as `/bin/sh'
- on Solaris 10 treat this like `|'.
- File: autoconf.info, Node: Assignments, Next: Parentheses, Prev: Shell Substitutions, Up: Portable Shell
- 11.9 Assignments
- ================
- When setting several variables in a row, be aware that the order of the
- evaluation is undefined. For instance `foo=1 foo=2; echo $foo' gives
- `1' with Solaris `/bin/sh', but `2' with Bash. You must use `;' to
- enforce the order: `foo=1; foo=2; echo $foo'.
- Don't rely on the following to find `subdir/program':
- PATH=subdir$PATH_SEPARATOR$PATH program
- as this does not work with Zsh 3.0.6. Use something like this instead:
- (PATH=subdir$PATH_SEPARATOR$PATH; export PATH; exec program)
- Don't rely on the exit status of an assignment: Ash 0.2 does not
- change the status and propagates that of the last statement:
- $ false || foo=bar; echo $?
- 1
- $ false || foo=`:`; echo $?
- 0
- and to make things even worse, QNX 4.25 just sets the exit status to 0
- in any case:
- $ foo=`exit 1`; echo $?
- 0
- To assign default values, follow this algorithm:
- 1. If the default value is a literal and does not contain any closing
- brace, use:
- : "${var='my literal'}"
- 2. If the default value contains no closing brace, has to be
- expanded, and the variable being initialized is not intended to be
- IFS-split (i.e., it's not a list), then use:
- : ${var="$default"}
- 3. If the default value contains no closing brace, has to be
- expanded, and the variable being initialized is intended to be
- IFS-split (i.e., it's a list), then use:
- var=${var="$default"}
- 4. If the default value contains a closing brace, then use:
- test "${var+set}" = set || var="has a '}'"
- In most cases `var=${var="$default"}' is fine, but in case of doubt,
- just use the last form. *Note Shell Substitutions::, items
- `${VAR:-VALUE}' and `${VAR=VALUE}' for the rationale.
- File: autoconf.info, Node: Parentheses, Next: Slashes, Prev: Assignments, Up: Portable Shell
- 11.10 Parentheses in Shell Scripts
- ==================================
- Beware of two opening parentheses in a row, as many shell
- implementations treat them specially, and Posix says that a portable
- script cannot use `((' outside the `$((' form used for shell
- arithmetic. In traditional shells, `((cat))' behaves like `(cat)'; but
- many shells, including Bash and the Korn shell, treat `((cat))' as an
- arithmetic expression equivalent to `let "cat"', and may or may not
- report an error when they detect that `cat' is not a number. As another
- example, `pdksh' 5.2.14 does not treat the following code as a
- traditional shell would:
- if ((true) || false); then
- echo ok
- fi
- To work around this problem, insert a space between the two opening
- parentheses. There is a similar problem and workaround with `$(('; see
- *note Shell Substitutions::.
- File: autoconf.info, Node: Slashes, Next: Special Shell Variables, Prev: Parentheses, Up: Portable Shell
- 11.11 Slashes in Shell Scripts
- ==============================
- Unpatched Tru64 5.1 `sh' omits the last slash of command-line arguments
- that contain two trailing slashes:
- $ echo / // /// //// .// //.
- / / // /// ./ //.
- $ x=//
- $ eval "echo \$x"
- /
- $ set -x
- $ echo abc | tr -t ab //
- + echo abc
- + tr -t ab /
- /bc
- Unpatched Tru64 4.0 `sh' adds a slash after `"$var"' if the variable
- is empty and the second double-quote is followed by a word that begins
- and ends with slash:
- $ sh -xc 'p=; echo "$p"/ouch/'
- p=
- + echo //ouch/
- //ouch/
- However, our understanding is that patches are available, so perhaps
- it's not worth worrying about working around these horrendous bugs.
- File: autoconf.info, Node: Special Shell Variables, Next: Shell Functions, Prev: Slashes, Up: Portable Shell
- 11.12 Special Shell Variables
- =============================
- Some shell variables should not be used, since they can have a deep
- influence on the behavior of the shell. In order to recover a sane
- behavior from the shell, some variables should be unset; M4sh takes
- care of this and provides fallback values, whenever needed, to cater
- for a very old `/bin/sh' that does not support `unset'. (*note
- Portable Shell Programming: Portable Shell.).
- As a general rule, shell variable names containing a lower-case
- letter are safe; you can define and use these variables without
- worrying about their effect on the underlying system, and without
- worrying about whether the shell changes them unexpectedly. (The
- exception is the shell variable `status', as described below.)
- Here is a list of names that are known to cause trouble. This list
- is not exhaustive, but you should be safe if you avoid the name
- `status' and names containing only upper-case letters and underscores.
- `?'
- Not all shells correctly reset `$?' after conditionals (*note
- Limitations of Shell Builtins: if.). Not all shells manage `$?'
- correctly in shell functions (*note Shell Functions::) or in traps
- (*note Limitations of Shell Builtins: trap.). Not all shells reset
- `$?' to zero after an empty command.
- $ bash -c 'false; $empty; echo $?'
- 0
- $ zsh -c 'false; $empty; echo $?'
- 1
- `_'
- Many shells reserve `$_' for various purposes, e.g., the name of
- the last command executed.
- `BIN_SH'
- In Tru64, if `BIN_SH' is set to `xpg4', subsidiary invocations of
- the standard shell conform to Posix.
- `CDPATH'
- When this variable is set it specifies a list of directories to
- search when invoking `cd' with a relative file name that did not
- start with `./' or `../'. Posix 1003.1-2001 says that if a
- nonempty directory name from `CDPATH' is used successfully, `cd'
- prints the resulting absolute file name. Unfortunately this
- output can break idioms like `abs=`cd src && pwd`' because `abs'
- receives the name twice. Also, many shells do not conform to this
- part of Posix; for example, `zsh' prints the result only if a
- directory name other than `.' was chosen from `CDPATH'.
- In practice the shells that have this problem also support
- `unset', so you can work around the problem as follows:
- (unset CDPATH) >/dev/null 2>&1 && unset CDPATH
- You can also avoid output by ensuring that your directory name is
- absolute or anchored at `./', as in `abs=`cd ./src && pwd`'.
- Configure scripts use M4sh, which automatically unsets `CDPATH' if
- possible, so you need not worry about this problem in those
- scripts.
- `CLICOLOR_FORCE'
- When this variable is set, some implementations of tools like `ls'
- attempt to add color to their output via terminal escape
- sequences, even when the output is not directed to a terminal, and
- can thus cause spurious failures in scripts. Configure scripts
- use M4sh, which automatically unsets this variable.
- `DUALCASE'
- In the MKS shell, case statements and file name generation are
- case-insensitive unless `DUALCASE' is nonzero. Autoconf-generated
- scripts export this variable when they start up.
- `ENV'
- `MAIL'
- `MAILPATH'
- `PS1'
- `PS2'
- `PS4'
- These variables should not matter for shell scripts, since they are
- supposed to affect only interactive shells. However, at least one
- shell (the pre-3.0 UWIN Korn shell) gets confused about whether it
- is interactive, which means that (for example) a `PS1' with a side
- effect can unexpectedly modify `$?'. To work around this bug,
- M4sh scripts (including `configure' scripts) do something like
- this:
- (unset ENV) >/dev/null 2>&1 && unset ENV MAIL MAILPATH
- PS1='$ '
- PS2='> '
- PS4='+ '
- (actually, there is some complication due to bugs in `unset';
- *note Limitations of Shell Builtins: unset.).
- `FPATH'
- The Korn shell uses `FPATH' to find shell functions, so avoid
- `FPATH' in portable scripts. `FPATH' is consulted after `PATH',
- but you still need to be wary of tests that use `PATH' to find
- whether a command exists, since they might report the wrong result
- if `FPATH' is also set.
- `GREP_OPTIONS'
- When this variable is set, some implementations of `grep' honor
- these options, even if the options include direction to enable
- colored output via terminal escape sequences, and the result can
- cause spurious failures when the output is not directed to a
- terminal. Configure scripts use M4sh, which automatically unsets
- this variable.
- `IFS'
- Long ago, shell scripts inherited `IFS' from the environment, but
- this caused many problems so modern shells ignore any environment
- settings for `IFS'.
- Don't set the first character of `IFS' to backslash. Indeed,
- Bourne shells use the first character (backslash) when joining the
- components in `"$@"' and some shells then reinterpret (!) the
- backslash escapes, so you can end up with backspace and other
- strange characters.
- The proper value for `IFS' (in regular code, not when performing
- splits) is `<SPC><TAB><RET>'. The first character is especially
- important, as it is used to join the arguments in `$*'; however,
- note that traditional shells, but also bash-2.04, fail to adhere
- to this and join with a space anyway.
- M4sh guarantees that `IFS' will have the default value at the
- beginning of a script, and many macros within autoconf rely on this
- setting. It is okay to use blocks of shell code that temporarily
- change the value of `IFS' in order to split on another character,
- but remember to restore it before expanding further macros.
- Unsetting `IFS' instead of resetting it to the default sequence is
- not suggested, since code that tries to save and restore the
- variable's value will incorrectly reset it to an empty value, thus
- disabling field splitting:
- unset IFS
- # default separators used for field splitting
- save_IFS=$IFS
- IFS=:
- # ...
- IFS=$save_IFS
- # no field splitting performed
- `LANG'
- `LC_ALL'
- `LC_COLLATE'
- `LC_CTYPE'
- `LC_MESSAGES'
- `LC_MONETARY'
- `LC_NUMERIC'
- `LC_TIME'
- You should set all these variables to `C' because so much
- configuration code assumes the C locale and Posix requires that
- locale environment variables be set to `C' if the C locale is
- desired; `configure' scripts and M4sh do that for you. Export
- these variables after setting them.
- `LANGUAGE'
- `LANGUAGE' is not specified by Posix, but it is a GNU extension
- that overrides `LC_ALL' in some cases, so you (or M4sh) should set
- it too.
- `LC_ADDRESS'
- `LC_IDENTIFICATION'
- `LC_MEASUREMENT'
- `LC_NAME'
- `LC_PAPER'
- `LC_TELEPHONE'
- These locale environment variables are GNU extensions. They are
- treated like their Posix brethren (`LC_COLLATE', etc.) as
- described above.
- `LINENO'
- Most modern shells provide the current line number in `LINENO'.
- Its value is the line number of the beginning of the current
- command. M4sh, and hence Autoconf, attempts to execute
- `configure' with a shell that supports `LINENO'. If no such shell
- is available, it attempts to implement `LINENO' with a Sed prepass
- that replaces each instance of the string `$LINENO' (not followed
- by an alphanumeric character) with the line's number. In M4sh
- scripts you should execute `AS_LINENO_PREPARE' so that these
- workarounds are included in your script; configure scripts do this
- automatically in `AC_INIT'.
- You should not rely on `LINENO' within `eval' or shell functions,
- as the behavior differs in practice. The presence of a quoted
- newline within simple commands can alter which line number is used
- as the starting point for `$LINENO' substitutions within that
- command. Also, the possibility of the Sed prepass means that you
- should not rely on `$LINENO' when quoted, when in here-documents,
- or when line continuations are used. Subshells should be OK,
- though. In the following example, lines 1, 9, and 14 are
- portable, but the other instances of `$LINENO' do not have
- deterministic values:
- $ cat lineno
- echo 1. $LINENO
- echo "2. $LINENO
- 3. $LINENO"
- cat <<EOF
- 5. $LINENO
- 6. $LINENO
- 7. \$LINENO
- EOF
- ( echo 9. $LINENO )
- eval 'echo 10. $LINENO'
- eval 'echo 11. $LINENO
- echo 12. $LINENO'
- echo 13. '$LINENO'
- echo 14. $LINENO '
- 15.' $LINENO
- f () { echo $1 $LINENO;
- echo $1 $LINENO }
- f 18.
- echo 19. \
- $LINENO
- $ bash-3.2 ./lineno
- 1. 1
- 2. 3
- 3. 3
- 5. 4
- 6. 4
- 7. $LINENO
- 9. 9
- 10. 10
- 11. 12
- 12. 13
- 13. $LINENO
- 14. 14
- 15. 14
- 18. 16
- 18. 17
- 19. 19
- $ zsh-4.3.4 ./lineno
- 1. 1
- 2. 2
- 3. 2
- 5. 4
- 6. 4
- 7. $LINENO
- 9. 9
- 10. 1
- 11. 1
- 12. 2
- 13. $LINENO
- 14. 14
- 15. 14
- 18. 0
- 18. 1
- 19. 19
- $ pdksh-5.2.14 ./lineno
- 1. 1
- 2. 2
- 3. 2
- 5. 4
- 6. 4
- 7. $LINENO
- 9. 9
- 10. 0
- 11. 0
- 12. 0
- 13. $LINENO
- 14. 14
- 15. 14
- 18. 16
- 18. 17
- 19. 19
- $ sed '=' <lineno |
- > sed '
- > N
- > s,$,-,
- > t loop
- > :loop
- > s,^\([0-9]*\)\(.*\)[$]LINENO\([^a-zA-Z0-9_]\),\1\2\1\3,
- > t loop
- > s,-$,,
- > s,^[0-9]*\n,,
- > ' |
- > sh
- 1. 1
- 2. 2
- 3. 3
- 5. 5
- 6. 6
- 7. \7
- 9. 9
- 10. 10
- 11. 11
- 12. 12
- 13. 13
- 14. 14
- 15. 15
- 18. 16
- 18. 17
- 19. 20
- In particular, note that `config.status' (and any other subsidiary
- script created by `AS_INIT_GENERATED') might report line numbers
- relative to the parent script as a result of the potential Sed
- pass.
- `NULLCMD'
- When executing the command `>foo', `zsh' executes `$NULLCMD >foo'
- unless it is operating in Bourne shell compatibility mode and the
- `zsh' version is newer than 3.1.6-dev-18. If you are using an
- older `zsh' and forget to set `NULLCMD', your script might be
- suspended waiting for data on its standard input.
- `options'
- For `zsh' 4.3.10, `options' is treated as an associative array
- even after `emulate sh', so it should not be used.
- `PATH_SEPARATOR'
- On DJGPP systems, the `PATH_SEPARATOR' environment variable can be
- set to either `:' or `;' to control the path separator Bash uses
- to set up certain environment variables (such as `PATH'). You can
- set this variable to `;' if you want `configure' to use `;' as a
- separator; this might be useful if you plan to use non-Posix
- shells to execute files. *Note File System Conventions::, for
- more information about `PATH_SEPARATOR'.
- `POSIXLY_CORRECT'
- In the GNU environment, exporting `POSIXLY_CORRECT' with any value
- (even empty) causes programs to try harder to conform to Posix.
- Autoconf does not directly manipulate this variable, but `bash'
- ties the shell variable `POSIXLY_CORRECT' to whether the script is
- running in Posix mode. Therefore, take care when exporting or
- unsetting this variable, so as not to change whether `bash' is in
- Posix mode.
- $ bash --posix -c 'set -o | grep posix
- > unset POSIXLY_CORRECT
- > set -o | grep posix'
- posix on
- posix off
- `PWD'
- Posix 1003.1-2001 requires that `cd' and `pwd' must update the
- `PWD' environment variable to point to the logical name of the
- current directory, but traditional shells do not support this.
- This can cause confusion if one shell instance maintains `PWD' but
- a subsidiary and different shell does not know about `PWD' and
- executes `cd'; in this case `PWD' points to the wrong directory.
- Use ``pwd`' rather than `$PWD'.
- `RANDOM'
- Many shells provide `RANDOM', a variable that returns a different
- integer each time it is used. Most of the time, its value does not
- change when it is not used, but on IRIX 6.5 the value changes all
- the time. This can be observed by using `set'. It is common
- practice to use `$RANDOM' as part of a file name, but code
- shouldn't rely on `$RANDOM' expanding to a nonempty string.
- `status'
- This variable is an alias to `$?' for `zsh' (at least 3.1.6),
- hence read-only. Do not use it.
- File: autoconf.info, Node: Shell Functions, Next: Limitations of Builtins, Prev: Special Shell Variables, Up: Portable Shell
- 11.13 Shell Functions
- =====================
- Nowadays, it is difficult to find a shell that does not support shell
- functions at all. However, some differences should be expected.
- When declaring a shell function, you must include whitespace between
- the `)' after the function name and the start of the compound
- expression, to avoid upsetting `ksh'. While it is possible to use any
- compound command, most scripts use `{...}'.
- $ /bin/sh -c 'a(){ echo hi;}; a'
- hi
- $ ksh -c 'a(){ echo hi;}; a'
- ksh: syntax error at line 1: `}' unexpected
- $ ksh -c 'a() { echo hi;}; a'
- hi
- Inside a shell function, you should not rely on the error status of a
- subshell if the last command of that subshell was `exit' or `trap', as
- this triggers bugs in zsh 4.x; while Autoconf tries to find a shell
- that does not exhibit the bug, zsh might be the only shell present on
- the user's machine.
- Likewise, the state of `$?' is not reliable when entering a shell
- function. This has the effect that using a function as the first
- command in a `trap' handler can cause problems.
- $ bash -c 'foo() { echo $?; }; trap foo 0; (exit 2); exit 2'; echo $?
- 2
- 2
- $ ash -c 'foo() { echo $?; }; trap foo 0; (exit 2); exit 2'; echo $?
- 0
- 2
- DJGPP bash 2.04 has a bug in that `return' from a shell function
- which also used a command substitution causes a segmentation fault. To
- work around the issue, you can use `return' from a subshell, or
- `AS_SET_STATUS' as last command in the execution flow of the function
- (*note Common Shell Constructs::).
- Not all shells treat shell functions as simple commands impacted by
- `set -e', for example with Solaris 10 `/bin/sh':
- $ bash -c 'f() { return 1; }; set -e; f; echo oops'
- $ /bin/sh -c 'f() { return 1; }; set -e; f; echo oops'
- oops
- Shell variables and functions may share the same namespace, for
- example with Solaris 10 `/bin/sh':
- $ f () { :; }; f=; f
- f: not found
- For this reason, Autoconf (actually M4sh, *note Programming in M4sh::)
- uses the prefix `as_fn_' for its functions.
- Handling of positional parameters and shell options varies among
- shells. For example, Korn shells reset and restore trace output (`set
- -x') and other options upon function entry and exit. Inside a function,
- IRIX sh sets `$0' to the function name.
- It is not portable to pass temporary environment variables to shell
- functions. Solaris `/bin/sh' does not see the variable. Meanwhile,
- not all shells follow the Posix rule that the assignment must affect
- the current environment in the same manner as special built-ins.
- $ /bin/sh -c 'func() { echo $a;}; a=1 func; echo $a'
- =>
- =>
- $ ash -c 'func() { echo $a;}; a=1 func; echo $a'
- =>1
- =>
- $ bash -c 'set -o posix; func() { echo $a;}; a=1 func; echo $a'
- =>1
- =>1
- Some ancient Bourne shell variants with function support did not
- reset `$I, I >= 0', upon function exit, so effectively the arguments of
- the script were lost after the first function invocation. It is
- probably not worth worrying about these shells any more.
- With AIX sh, a `trap' on 0 installed in a shell function triggers at
- function exit rather than at script exit. *Note Limitations of Shell
- Builtins: trap.
- File: autoconf.info, Node: Limitations of Builtins, Next: Limitations of Usual Tools, Prev: Shell Functions, Up: Portable Shell
- 11.14 Limitations of Shell Builtins
- ===================================
- No, no, we are serious: some shells do have limitations! :)
- You should always keep in mind that any builtin or command may
- support options, and therefore differ in behavior with arguments
- starting with a dash. For instance, even the innocent `echo "$word"'
- can give unexpected results when `word' starts with a dash. It is
- often possible to avoid this problem using `echo "x$word"', taking the
- `x' into account later in the pipe. Many of these limitations can be
- worked around using M4sh (*note Programming in M4sh::).
- `.'
- Use `.' only with regular files (use `test -f'). Bash 2.03, for
- instance, chokes on `. /dev/null'. Remember that `.' uses `PATH'
- if its argument contains no slashes. Also, some shells, including
- bash 3.2, implicitly append the current directory to this `PATH'
- search, even though Posix forbids it. So if you want to use `.'
- on a file `foo' in the current directory, you must use `. ./foo'.
- Not all shells gracefully handle syntax errors within a sourced
- file. On one extreme, some non-interactive shells abort the
- entire script. On the other, `zsh' 4.3.10 has a bug where it
- fails to react to the syntax error.
- $ echo 'fi' > syntax
- $ bash -c '. ./syntax; echo $?'
- ./syntax: line 1: syntax error near unexpected token `fi'
- ./syntax: line 1: `fi'
- 1
- $ ash -c '. ./syntax; echo $?'
- ./syntax: 1: Syntax error: "fi" unexpected
- $ zsh -c '. ./syntax; echo $?'
- ./syntax:1: parse error near `fi'
- 0
- `!'
- The Unix version 7 shell did not support negating the exit status
- of commands with `!', and this feature is still absent from some
- shells (e.g., Solaris `/bin/sh'). Other shells, such as FreeBSD
- `/bin/sh' or `ash', have bugs when using `!':
- $ sh -c '! : | :'; echo $?
- 1
- $ ash -c '! : | :'; echo $?
- 0
- $ sh -c '! { :; }'; echo $?
- 1
- $ ash -c '! { :; }'; echo $?
- {: not found
- Syntax error: "}" unexpected
- 2
- Shell code like this:
- if ! cmp file1 file2 >/dev/null 2>&1; then
- echo files differ or trouble
- fi
- is therefore not portable in practice. Typically it is easy to
- rewrite such code, e.g.:
- cmp file1 file2 >/dev/null 2>&1 ||
- echo files differ or trouble
- More generally, one can always rewrite `! COMMAND' as:
- if COMMAND; then (exit 1); else :; fi
- `{...}'
- Bash 3.2 (and earlier versions) sometimes does not properly set
- `$?' when failing to write redirected output of a compound command.
- This problem is most commonly observed with `{...}'; it does not
- occur with `(...)'. For example:
- $ bash -c '{ echo foo; } >/bad; echo $?'
- bash: line 1: /bad: Permission denied
- 0
- $ bash -c 'while :; do echo; done >/bad; echo $?'
- bash: line 1: /bad: Permission denied
- 0
- To work around the bug, prepend `:;':
- $ bash -c ':;{ echo foo; } >/bad; echo $?'
- bash: line 1: /bad: Permission denied
- 1
- Posix requires a syntax error if a brace list has no contents.
- However, not all shells obey this rule; and on shells where empty
- lists are permitted, the effect on `$?' is inconsistent. To avoid
- problems, ensure that a brace list is never empty.
- $ bash -c 'false; { }; echo $?' || echo $?
- bash: line 1: syntax error near unexpected token `}'
- bash: line 1: `false; { }; echo $?'
- 2
- $ zsh -c 'false; { }; echo $?' || echo $?
- 1
- $ pdksh -c 'false; { }; echo $?' || echo $?
- 0
- `break'
- The use of `break 2' etc. is safe.
- `case'
- You don't need to quote the argument; no splitting is performed.
- You don't need the final `;;', but you should use it.
- Posix requires support for `case' patterns with opening
- parentheses like this:
- case $file_name in
- (*.c) echo "C source code";;
- esac
- but the `(' in this example is not portable to many Bourne shell
- implementations, which is a pity for those of us using tools that
- rely on balanced parentheses. For instance, with Solaris
- `/bin/sh':
- $ case foo in (foo) echo foo;; esac
- error-->syntax error: `(' unexpected
- The leading `(' can be omitted safely. Unfortunately, there are
- contexts where unbalanced parentheses cause other problems, such
- as when using a syntax-highlighting editor that searches for the
- balancing counterpart, or more importantly, when using a case
- statement as an underquoted argument to an Autoconf macro. *Note
- Balancing Parentheses::, for tradeoffs involved in various styles
- of dealing with unbalanced `)'.
- Zsh handles pattern fragments derived from parameter expansions or
- command substitutions as though quoted:
- $ pat=\?; case aa in ?$pat) echo match;; esac
- $ pat=\?; case a? in ?$pat) echo match;; esac
- match
- Because of a bug in its `fnmatch', Bash fails to properly handle
- backslashes in character classes:
- bash-2.02$ case /tmp in [/\\]*) echo OK;; esac
- bash-2.02$
- This is extremely unfortunate, since you are likely to use this
- code to handle Posix or MS-DOS absolute file names. To work
- around this bug, always put the backslash first:
- bash-2.02$ case '\TMP' in [\\/]*) echo OK;; esac
- OK
- bash-2.02$ case /tmp in [\\/]*) echo OK;; esac
- OK
- Many Bourne shells cannot handle closing brackets in character
- classes correctly.
- Some shells also have problems with backslash escaping in case you
- do not want to match the backslash: both a backslash and the
- escaped character match this pattern. To work around this,
- specify the character class in a variable, so that quote removal
- does not apply afterwards, and the special characters don't have
- to be backslash-escaped:
- $ case '\' in [\<]) echo OK;; esac
- OK
- $ scanset='[<]'; case '\' in $scanset) echo OK;; esac
- $
- Even with this, Solaris `ksh' matches a backslash if the set
- contains any of the characters `|', `&', `(', or `)'.
- Conversely, Tru64 `ksh' (circa 2003) erroneously always matches a
- closing parenthesis if not specified in a character class:
- $ case foo in *\)*) echo fail ;; esac
- fail
- $ case foo in *')'*) echo fail ;; esac
- fail
- Some shells, such as Ash 0.3.8, are confused by an empty
- `case'/`esac':
- ash-0.3.8 $ case foo in esac;
- error-->Syntax error: ";" unexpected (expecting ")")
- Posix requires `case' to give an exit status of 0 if no cases
- match. However, `/bin/sh' in Solaris 10 does not obey this rule.
- Meanwhile, it is unclear whether a case that matches, but contains
- no statements, must also change the exit status to 0. The M4sh
- macro `AS_CASE' works around these inconsistencies.
- $ bash -c 'case `false` in ?) ;; esac; echo $?'
- 0
- $ /bin/sh -c 'case `false` in ?) ;; esac; echo $?'
- 255
- `cd'
- Posix 1003.1-2001 requires that `cd' must support the `-L'
- ("logical") and `-P' ("physical") options, with `-L' being the
- default. However, traditional shells do not support these
- options, and their `cd' command has the `-P' behavior.
- Portable scripts should assume neither option is supported, and
- should assume neither behavior is the default. This can be a bit
- tricky, since the Posix default behavior means that, for example,
- `ls ..' and `cd ..' may refer to different directories if the
- current logical directory is a symbolic link. It is safe to use
- `cd DIR' if DIR contains no `..' components. Also,
- Autoconf-generated scripts check for this problem when computing
- variables like `ac_top_srcdir' (*note Configuration Actions::), so
- it is safe to `cd' to these variables.
- Posix states that behavior is undefined if `cd' is given an
- explicit empty argument. Some shells do nothing, some change to
- the first entry in `CDPATH', some change to `HOME', and some exit
- the shell rather than returning an error. Unfortunately, this
- means that if `$var' is empty, then `cd "$var"' is less predictable
- than `cd $var' (at least the latter is well-behaved in all shells
- at changing to `HOME', although this is probably not what you
- wanted in a script). You should check that a directory name was
- supplied before trying to change locations.
- *Note Special Shell Variables::, for portability problems involving
- `cd' and the `CDPATH' environment variable. Also please see the
- discussion of the `pwd' command.
- `echo'
- The simple `echo' is probably the most surprising source of
- portability troubles. It is not possible to use `echo' portably
- unless both options and escape sequences are omitted. Don't
- expect any option.
- Do not use backslashes in the arguments, as there is no consensus
- on their handling. For `echo '\n' | wc -l', the `sh' of Solaris
- outputs 2, but Bash and Zsh (in `sh' emulation mode) output 1.
- The problem is truly `echo': all the shells understand `'\n'' as
- the string composed of a backslash and an `n'. Within a command
- substitution, `echo 'string\c'' will mess up the internal state of
- ksh88 on AIX 6.1 so that it will print the first character `s'
- only, followed by a newline, and then entirely drop the output of
- the next echo in a command substitution.
- Because of these problems, do not pass a string containing
- arbitrary characters to `echo'. For example, `echo "$foo"' is safe
- only if you know that FOO's value cannot contain backslashes and
- cannot start with `-'.
- If this may not be true, `printf' is in general safer and easier
- to use than `echo' and `echo -n'. Thus, scripts where portability
- is not a major concern should use `printf '%s\n'' whenever `echo'
- could fail, and similarly use `printf %s' instead of `echo -n'.
- For portable shell scripts, instead, it is suggested to use a
- here-document like this:
- cat <<EOF
- $foo
- EOF
- Alternatively, M4sh provides `AS_ECHO' and `AS_ECHO_N' macros
- which choose between various portable implementations: `echo' or
- `print' where they work, `printf' if it is available, or else
- other creative tricks in order to work around the above problems.
- `eval'
- The `eval' command is useful in limited circumstances, e.g., using
- commands like `eval table_$key=\$value' and `eval
- value=table_$key' to simulate a hash table when the key is known
- to be alphanumeric.
- You should also be wary of common bugs in `eval' implementations.
- In some shell implementations (e.g., older `ash', OpenBSD 3.8
- `sh', `pdksh' v5.2.14 99/07/13.2, and `zsh' 4.2.5), the arguments
- of `eval' are evaluated in a context where `$?' is 0, so they
- exhibit behavior like this:
- $ false; eval 'echo $?'
- 0
- The correct behavior here is to output a nonzero value, but
- portable scripts should not rely on this.
- You should not rely on `LINENO' within `eval'. *Note Special
- Shell Variables::.
- Note that, even though these bugs are easily avoided, `eval' is
- tricky to use on arbitrary arguments. It is obviously unwise to
- use `eval $cmd' if the string value of `cmd' was derived from an
- untrustworthy source. But even if the string value is valid,
- `eval $cmd' might not work as intended, since it causes field
- splitting and file name expansion to occur twice, once for the
- `eval' and once for the command itself. It is therefore safer to
- use `eval "$cmd"'. For example, if CMD has the value `cat
- test?.c', `eval $cmd' might expand to the equivalent of `cat
- test;.c' if there happens to be a file named `test;.c' in the
- current directory; and this in turn mistakenly attempts to invoke
- `cat' on the file `test' and then execute the command `.c'. To
- avoid this problem, use `eval "$cmd"' rather than `eval $cmd'.
- However, suppose that you want to output the text of the evaluated
- command just before executing it. Assuming the previous example,
- `echo "Executing: $cmd"' outputs `Executing: cat test?.c', but
- this output doesn't show the user that `test;.c' is the actual name
- of the copied file. Conversely, `eval "echo Executing: $cmd"'
- works on this example, but it fails with `cmd='cat foo >bar'',
- since it mistakenly replaces the contents of `bar' by the string
- `cat foo'. No simple, general, and portable solution to this
- problem is known.
- `exec'
- Posix describes several categories of shell built-ins. Special
- built-ins (such as `exit') must impact the environment of the
- current shell, and need not be available through `exec'. All
- other built-ins are regular, and must not propagate variable
- assignments to the environment of the current shell. However, the
- group of regular built-ins is further distinguished by commands
- that do not require a `PATH' search (such as `cd'), in contrast to
- built-ins that are offered as a more efficient version of
- something that must still be found in a `PATH' search (such as
- `echo'). Posix is not clear on whether `exec' must work with the
- list of 17 utilities that are invoked without a `PATH' search, and
- many platforms lack an executable for some of those built-ins:
- $ sh -c 'exec cd /tmp'
- sh: line 0: exec: cd: not found
- All other built-ins that provide utilities specified by Posix must
- have a counterpart executable that exists on `PATH', although Posix
- allows `exec' to use the built-in instead of the executable. For
- example, contrast `bash' 3.2 and `pdksh' 5.2.14:
- $ bash -c 'pwd --version' | head -n1
- bash: line 0: pwd: --: invalid option
- pwd: usage: pwd [-LP]
- $ bash -c 'exec pwd --version' | head -n1
- pwd (GNU coreutils) 6.10
- $ pdksh -c 'exec pwd --version' | head -n1
- pdksh: pwd: --: unknown option
- When it is desired to avoid a regular shell built-in, the
- workaround is to use some other forwarding command, such as `env'
- or `nice', that will ensure a path search:
- $ pdksh -c 'exec true --version' | head -n1
- $ pdksh -c 'nice true --version' | head -n1
- true (GNU coreutils) 6.10
- $ pdksh -c 'env true --version' | head -n1
- true (GNU coreutils) 6.10
- `exit'
- The default value of `exit' is supposed to be `$?'; unfortunately,
- some shells, such as the DJGPP port of Bash 2.04, just perform
- `exit 0'.
- bash-2.04$ foo=`exit 1` || echo fail
- fail
- bash-2.04$ foo=`(exit 1)` || echo fail
- fail
- bash-2.04$ foo=`(exit 1); exit` || echo fail
- bash-2.04$
- Using `exit $?' restores the expected behavior.
- Some shell scripts, such as those generated by `autoconf', use a
- trap to clean up before exiting. If the last shell command exited
- with nonzero status, the trap also exits with nonzero status so
- that the invoker can tell that an error occurred.
- Unfortunately, in some shells, such as Solaris `/bin/sh', an exit
- trap ignores the `exit' command's argument. In these shells, a
- trap cannot determine whether it was invoked by plain `exit' or by
- `exit 1'. Instead of calling `exit' directly, use the
- `AC_MSG_ERROR' macro that has a workaround for this problem.
- `export'
- The builtin `export' dubs a shell variable "environment variable".
- Each update of exported variables corresponds to an update of the
- environment variables. Conversely, each environment variable
- received by the shell when it is launched should be imported as a
- shell variable marked as exported.
- Alas, many shells, such as Solaris `/bin/sh', IRIX 6.3, IRIX 5.2,
- AIX 4.1.5, and Digital Unix 4.0, forget to `export' the
- environment variables they receive. As a result, two variables
- coexist: the environment variable and the shell variable. The
- following code demonstrates this failure:
- #!/bin/sh
- echo $FOO
- FOO=bar
- echo $FOO
- exec /bin/sh $0
- when run with `FOO=foo' in the environment, these shells print
- alternately `foo' and `bar', although they should print only `foo'
- and then a sequence of `bar's.
- Therefore you should `export' again each environment variable that
- you update; the export can occur before or after the assignment.
- Posix is not clear on whether the `export' of an undefined
- variable causes the variable to be defined with the value of an
- empty string, or merely marks any future definition of a variable
- by that name for export. Various shells behave differently in
- this regard:
- $ sh -c 'export foo; env | grep foo'
- $ ash -c 'export foo; env | grep foo'
- foo=
- Posix requires `export' to honor assignments made as arguments,
- but older shells do not support this, including `/bin/sh' in
- Solaris 10. Portable scripts should separate assignments and
- exports into different statements.
- $ bash -c 'export foo=bar; echo $foo'
- bar
- $ /bin/sh -c 'export foo=bar; echo $foo'
- /bin/sh: foo=bar: is not an identifier
- $ /bin/sh -c 'export foo; foo=bar; echo $foo'
- bar
- `false'
- Don't expect `false' to exit with status 1: in native Solaris
- `/bin/false' exits with status 255.
- `for'
- To loop over positional arguments, use:
- for arg
- do
- echo "$arg"
- done
- You may _not_ leave the `do' on the same line as `for', since some
- shells improperly grok:
- for arg; do
- echo "$arg"
- done
- If you want to explicitly refer to the positional arguments, given
- the `$@' bug (*note Shell Substitutions::), use:
- for arg in ${1+"$@"}; do
- echo "$arg"
- done
- But keep in mind that Zsh, even in Bourne shell emulation mode,
- performs word splitting on `${1+"$@"}'; see *note Shell
- Substitutions::, item `$@', for more.
- In Solaris `/bin/sh', when the list of arguments of a `for' loop
- starts with _unquoted_ tokens looking like variable assignments,
- the loop is not executed on those tokens:
- $ /bin/sh -c 'for v in a=b c=d x e=f; do echo $v; done'
- x
- e=f
- Thankfully, quoting the assignment-like tokens, or starting the
- list with other tokens (including unquoted variable expansion that
- results in an assignment-like result), avoids the problem, so it
- is easy to work around:
- $ /bin/sh -c 'for v in "a=b"; do echo $v; done'
- a=b
- $ /bin/sh -c 'x=a=b; for v in $x c=d; do echo $v; done'
- a=b
- c=d
- `if'
- Using `!' is not portable. Instead of:
- if ! cmp -s file file.new; then
- mv file.new file
- fi
- use:
- if cmp -s file file.new; then :; else
- mv file.new file
- fi
- Or, especially if the "else" branch is short, you can use `||'.
- In M4sh, the `AS_IF' macro provides an easy way to write these
- kinds of conditionals:
- AS_IF([cmp -s file file.new], [], [mv file.new file])
- This is especially useful in other M4 macros, where the "then" and
- "else" branches might be macro arguments.
- Some very old shells did not reset the exit status from an `if'
- with no `else':
- $ if (exit 42); then true; fi; echo $?
- 42
- whereas a proper shell should have printed `0'. But this is no
- longer a portability problem; any shell that supports functions
- gets it correct. However, it explains why some makefiles have
- lengthy constructs:
- if test -f "$file"; then
- install "$file" "$dest"
- else
- :
- fi
- `printf'
- A format string starting with a `-' can cause problems. Bash
- interprets it as an option and gives an error. And `--' to mark
- the end of options is not good in the NetBSD Almquist shell (e.g.,
- 0.4.6) which takes that literally as the format string. Putting
- the `-' in a `%c' or `%s' is probably easiest:
- printf %s -foo
- Bash 2.03 mishandles an escape sequence that happens to evaluate
- to `%':
- $ printf '\045'
- bash: printf: `%': missing format character
- Large outputs may cause trouble. On Solaris 2.5.1 through 10, for
- example, `/usr/bin/printf' is buggy, so when using `/bin/sh' the
- command `printf %010000x 123' normally dumps core.
- Since `printf' is not always a shell builtin, there is a potential
- speed penalty for using `printf '%s\n'' as a replacement for an
- `echo' that does not interpret `\' or leading `-'. With Solaris
- `ksh', it is possible to use `print -r --' for this role instead.
- *Note Limitations of Shell Builtins: echo for a discussion of
- portable alternatives to both `printf' and `echo'.
- `pwd'
- With modern shells, plain `pwd' outputs a "logical" directory
- name, some of whose components may be symbolic links. These
- directory names are in contrast to "physical" directory names,
- whose components are all directories.
- Posix 1003.1-2001 requires that `pwd' must support the `-L'
- ("logical") and `-P' ("physical") options, with `-L' being the
- default. However, traditional shells do not support these
- options, and their `pwd' command has the `-P' behavior.
- Portable scripts should assume neither option is supported, and
- should assume neither behavior is the default. Also, on many hosts
- `/bin/pwd' is equivalent to `pwd -P', but Posix does not require
- this behavior and portable scripts should not rely on it.
- Typically it's best to use plain `pwd'. On modern hosts this
- outputs logical directory names, which have the following
- advantages:
- * Logical names are what the user specified.
- * Physical names may not be portable from one installation host
- to another due to network file system gymnastics.
- * On modern hosts `pwd -P' may fail due to lack of permissions
- to some parent directory, but plain `pwd' cannot fail for this
- reason.
- Also please see the discussion of the `cd' command.
- `read'
- No options are portable, not even support `-r' (Solaris `/bin/sh'
- for example). Tru64/OSF 5.1 `sh' treats `read' as a special
- built-in, so it may exit if input is redirected from a
- non-existent or unreadable file.
- `set'
- With the FreeBSD 6.0 shell, the `set' command (without any
- options) does not sort its output.
- The `set' builtin faces the usual problem with arguments starting
- with a dash. Modern shells such as Bash or Zsh understand `--' to
- specify the end of the options (any argument after `--' is a
- parameter, even `-x' for instance), but many traditional shells
- (e.g., Solaris 10 `/bin/sh') simply stop option processing as soon
- as a non-option argument is found. Therefore, use `dummy' or
- simply `x' to end the option processing, and use `shift' to pop it
- out:
- set x $my_list; shift
- Avoid `set -', e.g., `set - $my_list'. Posix no longer requires
- support for this command, and in traditional shells `set -
- $my_list' resets the `-v' and `-x' options, which makes scripts
- harder to debug.
- Some nonstandard shells do not recognize more than one option
- (e.g., `set -e -x' assigns `-x' to the command line). It is
- better to combine them:
- set -ex
- The option `-e' has historically been underspecified, with enough
- ambiguities to cause numerous differences across various shell
- implementations; see for example this overview
- (http://www.in-ulm.de/~mascheck/various/set-e/), or this link
- (http://www.austingroupbugs.net/view.php?id=52), documenting a
- change to Posix 2008 to match `ksh88' behavior. Note that mixing
- `set -e' and shell functions is asking for surprises:
- set -e
- doit()
- {
- rm file
- echo one
- }
- doit || echo two
- According to the recommendation, `one' should always be output
- regardless of whether the `rm' failed, because it occurs within
- the body of the shell function `doit' invoked on the left side of
- `||', where the effects of `set -e' are not enforced. Likewise,
- `two' should never be printed, since the failure of `rm' does not
- abort the function, such that the status of `doit' is 0.
- The BSD shell has had several problems with the `-e' option.
- Older versions of the BSD shell (circa 1990) mishandled `&&',
- `||', `if', and `case' when `-e' was in effect, causing the shell
- to exit unexpectedly in some cases. This was particularly a
- problem with makefiles, and led to circumlocutions like `sh -c
- 'test -f file || touch file'', where the seemingly-unnecessary `sh
- -c '...'' wrapper works around the bug (*note Failure in Make
- Rules::).
- Even relatively-recent versions of the BSD shell (e.g., OpenBSD
- 3.4) wrongly exit with `-e' if the last command within a compound
- statement fails and is guarded by an `&&' only. For example:
- #! /bin/sh
- set -e
- foo=''
- test -n "$foo" && exit 1
- echo one
- if :; then
- test -n "$foo" && exit 1
- echo two
- test -n "$foo" && exit 1
- fi
- echo three
- does not print `three'. One workaround is to change the last
- instance of `test -n "$foo" && exit 1' to be `if test -n "$foo";
- then exit 1; fi' instead. Another possibility is to warn BSD
- users not to use `sh -e'.
- When `set -e' is in effect, a failed command substitution in
- Solaris `/bin/sh' cannot be ignored, even with `||'.
- $ /bin/sh -c 'set -e; foo=`false` || echo foo; echo bar'
- $ bash -c 'set -e; foo=`false` || echo foo; echo bar'
- foo
- bar
- Moreover, a command substitution, successful or not, causes this
- shell to exit from a failing outer command even in presence of an
- `&&' list:
- $ bash -c 'set -e; false `true` && echo notreached; echo ok'
- ok
- $ sh -c 'set -e; false `true` && echo notreached; echo ok'
- $
- Portable scripts should not use `set -e' if `trap' is used to
- install an exit handler. This is because Tru64/OSF 5.1 `sh'
- sometimes enters the trap handler with the exit status of the
- command prior to the one that triggered the errexit handler:
- $ sh -ec 'trap '\''echo $?'\'' 0; false'
- 0
- $ sh -c 'set -e; trap '\''echo $?'\'' 0; false'
- 1
- Thus, when writing a script in M4sh, rather than trying to rely on
- `set -e', it is better to append `|| AS_EXIT' to any statement
- where it is desirable to abort on failure.
- Job control is not provided by all shells, so the use of `set -m'
- or `set -b' must be done with care. When using `zsh' in native
- mode, asynchronous notification (`set -b') is enabled by default,
- and using `emulate sh' to switch to Posix mode does not clear this
- setting (although asynchronous notification has no impact unless
- job monitoring is also enabled). Also, `zsh' 4.3.10 and earlier
- have a bug where job control can be manipulated in interactive
- shells, but not in subshells or scripts. Furthermore, some
- shells, like `pdksh', fail to treat subshells as interactive, even
- though the parent shell was.
- $ echo $ZSH_VERSION
- 4.3.10
- $ set -m; echo $?
- 0
- $ zsh -c 'set -m; echo $?'
- set: can't change option: -m
- $ (set -m); echo $?
- set: can't change option: -m
- 1
- $ pdksh -ci 'echo $-; (echo $-)'
- cim
- c
- Use of `set -n' (typically via `sh -n script') to validate a
- script is not foolproof. Modern `ksh93' tries to be helpful by
- informing you about better syntax, but switching the script to use
- the suggested syntax in order to silence the warnings would render
- the script no longer portable to older shells:
- $ ksh -nc '``'
- ksh: warning: line 1: `...` obsolete, use $(...)
- 0
- Furthermore, on ancient hosts, such as SunOS 4, `sh -n' could go
- into an infinite loop; even with that bug fixed, Solaris 8
- `/bin/sh' takes extremely long to parse large scripts. Autoconf
- itself uses `sh -n' within its testsuite to check that correct
- scripts were generated, but only after first probing for other
- shell features (such as `test -n "${BASH_VERSION+set}"') that
- indicate a reasonably fast and working implementation.
- `shift'
- Not only is `shift'ing a bad idea when there is nothing left to
- shift, but in addition it is not portable: the shell of MIPS
- RISC/OS 4.52 refuses to do it.
- Don't use `shift 2' etc.; while it in the SVR1 shell (1983), it is
- also absent in many pre-Posix shells.
- `source'
- This command is not portable, as Posix does not require it; use
- `.' instead.
- `test'
- The `test' program is the way to perform many file and string
- tests. It is often invoked by the alternate name `[', but using
- that name in Autoconf code is asking for trouble since it is an M4
- quote character.
- The `-a', `-o', `(', and `)' operands are not present in all
- implementations, and have been marked obsolete by Posix 2008.
- This is because there are inherent ambiguities in using them. For
- example, `test "$1" -a "$2"' looks like a binary operator to check
- whether two strings are both non-empty, but if `$1' is the literal
- `!', then some implementations of `test' treat it as a negation of
- the unary operator `-a'.
- Thus, portable uses of `test' should never have more than four
- arguments, and scripts should use shell constructs like `&&' and
- `||' instead. If you combine `&&' and `||' in the same statement,
- keep in mind that they have equal precedence, so it is often
- better to parenthesize even when this is redundant. For example:
- # Not portable:
- test "X$a" = "X$b" -a \
- '(' "X$c" != "X$d" -o "X$e" = "X$f" ')'
- # Portable:
- test "X$a" = "X$b" &&
- { test "X$c" != "X$d" || test "X$e" = "X$f"; }
- `test' does not process options like most other commands do; for
- example, it does not recognize the `--' argument as marking the
- end of options.
- It is safe to use `!' as a `test' operator. For example, `if test
- ! -d foo; ...' is portable even though `if ! test -d foo; ...' is
- not.
- `test' (files)
- To enable `configure' scripts to support cross-compilation, they
- shouldn't do anything that tests features of the build system
- instead of the host system. But occasionally you may find it
- necessary to check whether some arbitrary file exists. To do so,
- use `test -f', `test -r', or `test -x'. Do not use `test -e',
- because Solaris 10 `/bin/sh' lacks it. To test for symbolic links
- on systems that have them, use `test -h' rather than `test -L';
- either form conforms to Posix 1003.1-2001, but older shells like
- Solaris 8 `/bin/sh' support only `-h'.
- For historical reasons, Posix reluctantly allows implementations of
- `test -x' that will succeed for the root user, even if no execute
- permissions are present. Furthermore, shells do not all agree on
- whether Access Control Lists should affect `test -r', `test -w',
- and `test -x'; some shells base test results strictly on the
- current user id compared to file owner and mode, as if by
- `stat(2)'; while other shells base test results on whether the
- current user has the given right, even if that right is only
- granted by an ACL, as if by `faccessat(2)'. Furthermore, there is
- a classic time of check to time of use race between any use of
- `test' followed by operating on the just-checked file. Therefore,
- it is a good idea to write scripts that actually attempt an
- operation, and are prepared for the resulting failure if
- permission is denied, rather than trying to avoid an operation
- based solely on whether `test' guessed that it might not be
- permitted.
- `test' (strings)
- Posix says that `test "STRING"' succeeds if STRING is not null,
- but this usage is not portable to traditional platforms like
- Solaris 10 `/bin/sh', which mishandle strings like `!' and `-n'.
- Posix also says that `test ! "STRING"', `test -n "STRING"' and
- `test -z "STRING"' work with any string, but many shells (such as
- Solaris, AIX 3.2, UNICOS 10.0.0.6, Digital Unix 4, etc.) get
- confused if STRING looks like an operator:
- $ test -n =
- test: argument expected
- $ test ! -n
- test: argument expected
- $ test -z ")"; echo $?
- 0
- Similarly, Posix says that both `test "STRING1" = "STRING2"' and
- `test "STRING1" != "STRING2"' work for any pairs of strings, but
- in practice this is not true for troublesome strings that look
- like operators or parentheses, or that begin with `-'.
- It is best to protect such strings with a leading `X', e.g., `test
- "XSTRING" != X' rather than `test -n "STRING"' or `test !
- "STRING"'.
- It is common to find variations of the following idiom:
- test -n "`echo $ac_feature | sed 's/[-a-zA-Z0-9_]//g'`" &&
- ACTION
- to take an action when a token matches a given pattern. Such
- constructs should be avoided by using:
- case $ac_feature in
- *[!-a-zA-Z0-9_]*) ACTION;;
- esac
- If the pattern is a complicated regular expression that cannot be
- expressed as a shell pattern, use something like this instead:
- expr "X$ac_feature" : 'X.*[^-a-zA-Z0-9_]' >/dev/null &&
- ACTION
- `expr "XFOO" : "XBAR"' is more robust than `echo "XFOO" | grep
- "^XBAR"', because it avoids problems when `FOO' contains
- backslashes.
- `trap'
- It is safe to trap at least the signals 1, 2, 13, and 15. You can
- also trap 0, i.e., have the `trap' run when the script ends
- (either via an explicit `exit', or the end of the script). The
- trap for 0 should be installed outside of a shell function, or AIX
- 5.3 `/bin/sh' will invoke the trap at the end of this function.
- Posix says that `trap - 1 2 13 15' resets the traps for the
- specified signals to their default values, but many common shells
- (e.g., Solaris `/bin/sh') misinterpret this and attempt to execute
- a "command" named `-' when the specified conditions arise. Posix
- 2008 also added a requirement to support `trap 1 2 13 15' to reset
- traps, as this is supported by a larger set of shells, but there
- are still shells like `dash' that mistakenly try to execute `1'
- instead of resetting the traps. Therefore, there is no portable
- workaround, except for `trap - 0', for which `trap '' 0' is a
- portable substitute.
- Although Posix is not absolutely clear on this point, it is widely
- admitted that when entering the trap `$?' should be set to the exit
- status of the last command run before the trap. The ambiguity can
- be summarized as: "when the trap is launched by an `exit', what is
- the _last_ command run: that before `exit', or `exit' itself?"
- Bash considers `exit' to be the last command, while Zsh and
- Solaris `/bin/sh' consider that when the trap is run it is _still_
- in the `exit', hence it is the previous exit status that the trap
- receives:
- $ cat trap.sh
- trap 'echo $?' 0
- (exit 42); exit 0
- $ zsh trap.sh
- 42
- $ bash trap.sh
- 0
- The portable solution is then simple: when you want to `exit 42',
- run `(exit 42); exit 42', the first `exit' being used to set the
- exit status to 42 for Zsh, and the second to trigger the trap and
- pass 42 as exit status for Bash. In M4sh, this is covered by using
- `AS_EXIT'.
- The shell in FreeBSD 4.0 has the following bug: `$?' is reset to 0
- by empty lines if the code is inside `trap'.
- $ trap 'false
- echo $?' 0
- $ exit
- 0
- Fortunately, this bug only affects `trap'.
- Several shells fail to execute an exit trap that is defined inside
- a subshell, when the last command of that subshell is not a
- builtin. A workaround is to use `exit $?' as the shell builtin.
- $ bash -c '(trap "echo hi" 0; /bin/true)'
- hi
- $ /bin/sh -c '(trap "echo hi" 0; /bin/true)'
- $ /bin/sh -c '(trap "echo hi" 0; /bin/true; exit $?)'
- hi
- Likewise, older implementations of `bash' failed to preserve `$?'
- across an exit trap consisting of a single cleanup command.
- $ bash -c 'trap "/bin/true" 0; exit 2'; echo $?
- 2
- $ bash-2.05b -c 'trap "/bin/true" 0; exit 2'; echo $?
- 0
- $ bash-2.05b -c 'trap ":; /bin/true" 0; exit 2'; echo $?
- 2
- `true'
- Don't worry: as far as we know `true' is portable. Nevertheless,
- it's not always a builtin (e.g., Bash 1.x), and the portable shell
- community tends to prefer using `:'. This has a funny side
- effect: when asked whether `false' is more portable than `true'
- Alexandre Oliva answered:
- In a sense, yes, because if it doesn't exist, the shell will
- produce an exit status of failure, which is correct for
- `false', but not for `true'.
- Remember that even though `:' ignores its arguments, it still takes
- time to compute those arguments. It is a good idea to use double
- quotes around any arguments to `:' to avoid time spent in field
- splitting and file name expansion.
- `unset'
- In some nonconforming shells (e.g., Solaris 10 `/bin/ksh' and
- `/usr/xpg4/bin/sh', NetBSD 5.99.43 sh, or Bash 2.05a), `unset FOO'
- fails when `FOO' is not set. This can interfere with `set -e'
- operation. You can use
- FOO=; unset FOO
- if you are not sure that `FOO' is set.
- A few ancient shells lack `unset' entirely. For some variables
- such as `PS1', you can use a neutralizing value instead:
- PS1='$ '
- Usually, shells that do not support `unset' need less effort to
- make the environment sane, so for example is not a problem if you
- cannot unset `CDPATH' on those shells. However, Bash 2.01
- mishandles `unset MAIL' and `unset MAILPATH' in some cases and
- dumps core. So, you should do something like
- ( (unset MAIL) || exit 1) >/dev/null 2>&1 && unset MAIL || :
- *Note Special Shell Variables::, for some neutralizing values.
- Also, see *note Limitations of Builtins: export, for the case of
- environment variables.
- `wait'
- The exit status of `wait' is not always reliable.
- File: autoconf.info, Node: Limitations of Usual Tools, Prev: Limitations of Builtins, Up: Portable Shell
- 11.15 Limitations of Usual Tools
- ================================
- The small set of tools you can expect to find on any machine can still
- include some limitations you should be aware of.
- `awk'
- Don't leave white space before the opening parenthesis in a user
- function call. Posix does not allow this and GNU Awk rejects it:
- $ gawk 'function die () { print "Aaaaarg!" }
- BEGIN { die () }'
- gawk: cmd. line:2: BEGIN { die () }
- gawk: cmd. line:2: ^ parse error
- $ gawk 'function die () { print "Aaaaarg!" }
- BEGIN { die() }'
- Aaaaarg!
- Posix says that if a program contains only `BEGIN' actions, and
- contains no instances of `getline', then the program merely
- executes the actions without reading input. However, traditional
- Awk implementations (such as Solaris 10 `awk') read and discard
- input in this case. Portable scripts can redirect input from
- `/dev/null' to work around the problem. For example:
- awk 'BEGIN {print "hello world"}' </dev/null
- Posix says that in an `END' action, `$NF' (and presumably, `$1')
- retain their value from the last record read, if no intervening
- `getline' occurred. However, some implementations (such as
- Solaris 10 `/usr/bin/awk', `nawk', or Darwin `awk') reset these
- variables. A workaround is to use an intermediate variable prior
- to the `END' block. For example:
- $ cat end.awk
- { tmp = $1 }
- END { print "a", $1, $NF, "b", tmp }
- $ echo 1 | awk -f end.awk
- a b 1
- $ echo 1 | gawk -f end.awk
- a 1 1 b 1
- If you want your program to be deterministic, don't depend on `for'
- on arrays:
- $ cat for.awk
- END {
- arr["foo"] = 1
- arr["bar"] = 1
- for (i in arr)
- print i
- }
- $ gawk -f for.awk </dev/null
- foo
- bar
- $ nawk -f for.awk </dev/null
- bar
- foo
- Some Awk implementations, such as HP-UX 11.0's native one,
- mishandle anchors:
- $ echo xfoo | $AWK '/foo|^bar/ { print }'
- $ echo bar | $AWK '/foo|^bar/ { print }'
- bar
- $ echo xfoo | $AWK '/^bar|foo/ { print }'
- xfoo
- $ echo bar | $AWK '/^bar|foo/ { print }'
- bar
- Either do not depend on such patterns (i.e., use `/^(.*foo|bar)/',
- or use a simple test to reject such implementations.
- On `ia64-hp-hpux11.23', Awk mishandles `printf' conversions after
- `%u':
- $ awk 'BEGIN { printf "%u %d\n", 0, -1 }'
- 0 0
- AIX version 5.2 has an arbitrary limit of 399 on the length of
- regular expressions and literal strings in an Awk program.
- Traditional Awk implementations derived from Unix version 7, such
- as Solaris `/bin/awk', have many limitations and do not conform to
- Posix. Nowadays `AC_PROG_AWK' (*note Particular Programs::) finds
- you an Awk that doesn't have these problems, but if for some
- reason you prefer not to use `AC_PROG_AWK' you may need to address
- them. For more detailed descriptions, see *note `awk' language
- history: (gawk)Language History.
- Traditional Awk does not support multidimensional arrays or
- user-defined functions.
- Traditional Awk does not support the `-v' option. You can use
- assignments after the program instead, e.g., `$AWK '{print v $1}'
- v=x'; however, don't forget that such assignments are not
- evaluated until they are encountered (e.g., after any `BEGIN'
- action).
- Traditional Awk does not support the keywords `delete' or `do'.
- Traditional Awk does not support the expressions `A?B:C', `!A',
- `A^B', or `A^=B'.
- Traditional Awk does not support the predefined `CONVFMT' or
- `ENVIRON' variables.
- Traditional Awk supports only the predefined functions `exp',
- `index', `int', `length', `log', `split', `sprintf', `sqrt', and
- `substr'.
- Traditional Awk `getline' is not at all compatible with Posix;
- avoid it.
- Traditional Awk has `for (i in a) ...' but no other uses of the
- `in' keyword. For example, it lacks `if (i in a) ...'.
- In code portable to both traditional and modern Awk, `FS' must be a
- string containing just one ordinary character, and similarly for
- the field-separator argument to `split'.
- Traditional Awk has a limit of 99 fields in a record. Since some
- Awk implementations, like Tru64's, split the input even if you
- don't refer to any field in the script, to circumvent this
- problem, set `FS' to an unusual character and use `split'.
- Traditional Awk has a limit of at most 99 bytes in a number
- formatted by `OFMT'; for example, `OFMT="%.300e"; print 0.1;'
- typically dumps core.
- The original version of Awk had a limit of at most 99 bytes per
- `split' field, 99 bytes per `substr' substring, and 99 bytes per
- run of non-special characters in a `printf' format, but these bugs
- have been fixed on all practical hosts that we know of.
- HP-UX 11.00 and IRIX 6.5 Awk require that input files have a line
- length of at most 3070 bytes.
- `basename'
- Not all hosts have a working `basename'. You can use `expr'
- instead.
- `cat'
- Don't rely on any option.
- `cc'
- The command `cc -c foo.c' traditionally produces an object file
- named `foo.o'. Most compilers allow `-c' to be combined with `-o'
- to specify a different object file name, but Posix does not
- require this combination and a few compilers lack support for it.
- *Note C Compiler::, for how GNU Make tests for this feature with
- `AC_PROG_CC_C_O'.
- When a compilation such as `cc -o foo foo.c' fails, some compilers
- (such as CDS on Reliant Unix) leave a `foo.o'.
- HP-UX `cc' doesn't accept `.S' files to preprocess and assemble.
- `cc -c foo.S' appears to succeed, but in fact does nothing.
- The default executable, produced by `cc foo.c', can be
- * `a.out' -- usual Posix convention.
- * `b.out' -- i960 compilers (including `gcc').
- * `a.exe' -- DJGPP port of `gcc'.
- * `a_out.exe' -- GNV `cc' wrapper for DEC C on OpenVMS.
- * `foo.exe' -- various MS-DOS compilers.
- The C compiler's traditional name is `cc', but other names like
- `gcc' are common. Posix 1003.1-2001 specifies the name `c99', but
- older Posix editions specified `c89' and anyway these standard
- names are rarely used in practice. Typically the C compiler is
- invoked from makefiles that use `$(CC)', so the value of the `CC'
- make variable selects the compiler name.
- `chgrp'
- `chown'
- It is not portable to change a file's group to a group that the
- owner does not belong to.
- `chmod'
- Avoid usages like `chmod -w file'; use `chmod a-w file' instead,
- for two reasons. First, plain `-w' does not necessarily make the
- file unwritable, since it does not affect mode bits that
- correspond to bits in the file mode creation mask. Second, Posix
- says that the `-w' might be interpreted as an
- implementation-specific option, not as a mode; Posix suggests
- using `chmod -- -w file' to avoid this confusion, but unfortunately
- `--' does not work on some older hosts.
- `cmp'
- `cmp' performs a raw data comparison of two files, while `diff'
- compares two text files. Therefore, if you might compare DOS
- files, even if only checking whether two files are different, use
- `diff' to avoid spurious differences due to differences of newline
- encoding.
- `cp'
- Avoid the `-r' option, since Posix 1003.1-2004 marks it as
- obsolescent and its behavior on special files is
- implementation-defined. Use `-R' instead. On GNU hosts the two
- options are equivalent, but on Solaris hosts (for example) `cp -r'
- reads from pipes instead of replicating them. AIX 5.3 `cp -R' may
- corrupt its own memory with some directory hierarchies and error
- out or dump core:
- mkdir -p 12345678/12345678/12345678/12345678
- touch 12345678/12345678/x
- cp -R 12345678 t
- cp: 0653-440 12345678/12345678/: name too long.
- Some `cp' implementations (e.g., BSD/OS 4.2) do not allow trailing
- slashes at the end of nonexistent destination directories. To
- avoid this problem, omit the trailing slashes. For example, use
- `cp -R source /tmp/newdir' rather than `cp -R source /tmp/newdir/'
- if `/tmp/newdir' does not exist.
- The ancient SunOS 4 `cp' does not support `-f', although its `mv'
- does.
- Traditionally, file timestamps had 1-second resolution, and `cp
- -p' copied the timestamps exactly. However, many modern file
- systems have timestamps with 1-nanosecond resolution.
- Unfortunately, some older `cp -p' implementations truncate
- timestamps when copying files, which can cause the destination
- file to appear to be older than the source. The exact amount of
- truncation depends on the resolution of the system calls that `cp'
- uses. Traditionally this was `utime', which has 1-second
- resolution. Less-ancient `cp' implementations such as GNU Core
- Utilities 5.0.91 (2003) use `utimes', which has 1-microsecond
- resolution. Modern implementations such as GNU Core Utilities
- 6.12 (2008) can set timestamps to the full nanosecond resolution,
- using the modern system calls `futimens' and `utimensat' when they
- are available. As of 2011, though, many platforms do not yet
- fully support these new system calls.
- Bob Proulx notes that `cp -p' always _tries_ to copy ownerships.
- But whether it actually does copy ownerships or not is a system
- dependent policy decision implemented by the kernel. If the
- kernel allows it then it happens. If the kernel does not allow it
- then it does not happen. It is not something `cp' itself has
- control over.
- In Unix System V any user can chown files to any other user, and
- System V also has a non-sticky `/tmp'. That probably derives from
- the heritage of System V in a business environment without hostile
- users. BSD changed this to be a more secure model where only root
- can `chown' files and a sticky `/tmp' is used. That undoubtedly
- derives from the heritage of BSD in a campus environment.
- GNU/Linux and Solaris by default follow BSD, but can be configured
- to allow a System V style `chown'. On the other hand, HP-UX
- follows System V, but can be configured to use the modern security
- model and disallow `chown'. Since it is an
- administrator-configurable parameter you can't use the name of the
- kernel as an indicator of the behavior.
- `date'
- Some versions of `date' do not recognize special `%' directives,
- and unfortunately, instead of complaining, they just pass them
- through, and exit with success:
- $ uname -a
- OSF1 medusa.sis.pasteur.fr V5.1 732 alpha
- $ date "+%s"
- %s
- `diff'
- Option `-u' is nonportable.
- Some implementations, such as Tru64's, fail when comparing to
- `/dev/null'. Use an empty file instead.
- `dirname'
- Not all hosts have a working `dirname', and you should instead use
- `AS_DIRNAME' (*note Programming in M4sh::). For example:
- dir=`dirname "$file"` # This is not portable.
- dir=`AS_DIRNAME(["$file"])` # This is more portable.
- `egrep'
- Posix 1003.1-2001 no longer requires `egrep', but many hosts do
- not yet support the Posix replacement `grep -E'. Also, some
- traditional implementations do not work on long input lines. To
- work around these problems, invoke `AC_PROG_EGREP' and then use
- `$EGREP'.
- Portable extended regular expressions should use `\' only to escape
- characters in the string `$()*+.?[\^{|'. For example, `\}' is not
- portable, even though it typically matches `}'.
- The empty alternative is not portable. Use `?' instead. For
- instance with Digital Unix v5.0:
- > printf "foo\n|foo\n" | $EGREP '^(|foo|bar)$'
- |foo
- > printf "bar\nbar|\n" | $EGREP '^(foo|bar|)$'
- bar|
- > printf "foo\nfoo|\n|bar\nbar\n" | $EGREP '^(foo||bar)$'
- foo
- |bar
- `$EGREP' also suffers the limitations of `grep' (*note Limitations
- of Usual Tools: grep.).
- `expr'
- Not all implementations obey the Posix rule that `--' separates
- options from arguments; likewise, not all implementations provide
- the extension to Posix that the first argument can be treated as
- part of a valid expression rather than an invalid option if it
- begins with `-'. When performing arithmetic, use `expr 0 + $var'
- if `$var' might be a negative number, to keep `expr' from
- interpreting it as an option.
- No `expr' keyword starts with `X', so use `expr X"WORD" :
- 'XREGEX'' to keep `expr' from misinterpreting WORD.
- Don't use `length', `substr', `match' and `index'.
- `expr' (`|')
- You can use `|'. Although Posix does require that `expr '''
- return the empty string, it does not specify the result when you
- `|' together the empty string (or zero) with the empty string. For
- example:
- expr '' \| ''
- Posix 1003.2-1992 returns the empty string for this case, but
- traditional Unix returns `0' (Solaris is one such example). In
- Posix 1003.1-2001, the specification was changed to match
- traditional Unix's behavior (which is bizarre, but it's too late
- to fix this). Please note that the same problem does arise when
- the empty string results from a computation, as in:
- expr bar : foo \| foo : bar
- Avoid this portability problem by avoiding the empty string.
- `expr' (`:')
- Portable `expr' regular expressions should use `\' to escape only
- characters in the string `$()*.0123456789[\^n{}'. For example,
- alternation, `\|', is common but Posix does not require its
- support, so it should be avoided in portable scripts. Similarly,
- `\+' and `\?' should be avoided.
- Portable `expr' regular expressions should not begin with `^'.
- Patterns are automatically anchored so leading `^' is not needed
- anyway.
- On the other hand, the behavior of the `$' anchor is not portable
- on multi-line strings. Posix is ambiguous whether the anchor
- applies to each line, as was done in older versions of the GNU
- Core Utilities, or whether it applies only to the end of the
- overall string, as in Coreutils 6.0 and most other implementations.
- $ baz='foo
- > bar'
- $ expr "X$baz" : 'X\(foo\)$'
- $ expr-5.97 "X$baz" : 'X\(foo\)$'
- foo
- The Posix standard is ambiguous as to whether `expr 'a' : '\(b\)''
- outputs `0' or the empty string. In practice, it outputs the
- empty string on most platforms, but portable scripts should not
- assume this. For instance, the QNX 4.25 native `expr' returns `0'.
- One might think that a way to get a uniform behavior would be to
- use the empty string as a default value:
- expr a : '\(b\)' \| ''
- Unfortunately this behaves exactly as the original expression; see
- the `expr' (`|') entry for more information.
- Some ancient `expr' implementations (e.g., SunOS 4 `expr' and
- Solaris 8 `/usr/ucb/expr') have a silly length limit that causes
- `expr' to fail if the matched substring is longer than 120 bytes.
- In this case, you might want to fall back on `echo|sed' if `expr'
- fails. Nowadays this is of practical importance only for the rare
- installer who mistakenly puts `/usr/ucb' before `/usr/bin' in
- `PATH'.
- On Mac OS X 10.4, `expr' mishandles the pattern `[^-]' in some
- cases. For example, the command
- expr Xpowerpc-apple-darwin8.1.0 : 'X[^-]*-[^-]*-\(.*\)'
- outputs `apple-darwin8.1.0' rather than the correct `darwin8.1.0'.
- This particular case can be worked around by substituting `[^--]'
- for `[^-]'.
- Don't leave, there is some more!
- The QNX 4.25 `expr', in addition of preferring `0' to the empty
- string, has a funny behavior in its exit status: it's always 1
- when parentheses are used!
- $ val=`expr 'a' : 'a'`; echo "$?: $val"
- 0: 1
- $ val=`expr 'a' : 'b'`; echo "$?: $val"
- 1: 0
- $ val=`expr 'a' : '\(a\)'`; echo "?: $val"
- 1: a
- $ val=`expr 'a' : '\(b\)'`; echo "?: $val"
- 1: 0
- In practice this can be a big problem if you are ready to catch
- failures of `expr' programs with some other method (such as using
- `sed'), since you may get twice the result. For instance
- $ expr 'a' : '\(a\)' || echo 'a' | sed 's/^\(a\)$/\1/'
- outputs `a' on most hosts, but `aa' on QNX 4.25. A simple
- workaround consists of testing `expr' and using a variable set to
- `expr' or to `false' according to the result.
- Tru64 `expr' incorrectly treats the result as a number, if it can
- be interpreted that way:
- $ expr 00001 : '.*\(...\)'
- 1
- On HP-UX 11, `expr' only supports a single sub-expression.
- $ expr 'Xfoo' : 'X\(f\(oo\)*\)$'
- expr: More than one '\(' was used.
- `fgrep'
- Posix 1003.1-2001 no longer requires `fgrep', but many hosts do
- not yet support the Posix replacement `grep -F'. Also, some
- traditional implementations do not work on long input lines. To
- work around these problems, invoke `AC_PROG_FGREP' and then use
- `$FGREP'.
- Tru64/OSF 5.1 `fgrep' does not match an empty pattern.
- `find'
- The option `-maxdepth' seems to be GNU specific. Tru64 v5.1,
- NetBSD 1.5 and Solaris `find' commands do not understand it.
- The replacement of `{}' is guaranteed only if the argument is
- exactly _{}_, not if it's only a part of an argument. For
- instance on DU, and HP-UX 10.20 and HP-UX 11:
- $ touch foo
- $ find . -name foo -exec echo "{}-{}" \;
- {}-{}
- while GNU `find' reports `./foo-./foo'.
- `grep'
- Portable scripts can rely on the `grep' options `-c', `-l', `-n',
- and `-v', but should avoid other options. For example, don't use
- `-w', as Posix does not require it and Irix 6.5.16m's `grep' does
- not support it. Also, portable scripts should not combine `-c'
- with `-l', as Posix does not allow this.
- Some of the options required by Posix are not portable in practice.
- Don't use `grep -q' to suppress output, because many `grep'
- implementations (e.g., Solaris) do not support `-q'. Don't use
- `grep -s' to suppress output either, because Posix says `-s' does
- not suppress output, only some error messages; also, the `-s'
- option of traditional `grep' behaved like `-q' does in most modern
- implementations. Instead, redirect the standard output and
- standard error (in case the file doesn't exist) of `grep' to
- `/dev/null'. Check the exit status of `grep' to determine whether
- it found a match.
- The QNX4 implementation fails to count lines with `grep -c '$'',
- but works with `grep -c '^''. Other alternatives for counting
- lines are to use `sed -n '$='' or `wc -l'.
- Some traditional `grep' implementations do not work on long input
- lines. On AIX the default `grep' silently truncates long lines on
- the input before matching.
- Also, many implementations do not support multiple regexps with
- `-e': they either reject `-e' entirely (e.g., Solaris) or honor
- only the last pattern (e.g., IRIX 6.5 and NeXT). To work around
- these problems, invoke `AC_PROG_GREP' and then use `$GREP'.
- Another possible workaround for the multiple `-e' problem is to
- separate the patterns by newlines, for example:
- grep 'foo
- bar' in.txt
- except that this fails with traditional `grep' implementations and
- with OpenBSD 3.8 `grep'.
- Traditional `grep' implementations (e.g., Solaris) do not support
- the `-E' or `-F' options. To work around these problems, invoke
- `AC_PROG_EGREP' and then use `$EGREP', and similarly for
- `AC_PROG_FGREP' and `$FGREP'. Even if you are willing to require
- support for Posix `grep', your script should not use both `-E' and
- `-F', since Posix does not allow this combination.
- Portable `grep' regular expressions should use `\' only to escape
- characters in the string `$()*.0123456789[\^{}'. For example,
- alternation, `\|', is common but Posix does not require its
- support in basic regular expressions, so it should be avoided in
- portable scripts. Solaris and HP-UX `grep' do not support it.
- Similarly, the following escape sequences should also be avoided:
- `\<', `\>', `\+', `\?', `\`', `\'', `\B', `\b', `\S', `\s', `\W',
- and `\w'.
- Posix does not specify the behavior of `grep' on binary files. An
- example where this matters is using BSD `grep' to search text that
- includes embedded ANSI escape sequences for colored output to
- terminals (`\033[m' is the sequence to restore normal output); the
- behavior depends on whether input is seekable:
- $ printf 'esc\033[mape\n' > sample
- $ grep . sample
- Binary file sample matches
- $ cat sample | grep .
- escape
- `join'
- Solaris 8 `join' has bugs when the second operand is standard
- input, and when standard input is a pipe. For example, the
- following shell script causes Solaris 8 `join' to loop forever:
- cat >file <<'EOF'
- 1 x
- 2 y
- EOF
- cat file | join file -
- Use `join - file' instead.
- On NetBSD, `join -a 1 file1 file2' mistakenly behaves like `join
- -a 1 -a 2 1 file1 file2', resulting in a usage warning; the
- workaround is to use `join -a1 file1 file2' instead.
- `ln'
- Don't rely on `ln' having a `-f' option. Symbolic links are not
- available on old systems; use `$(LN_S)' as a portable substitute.
- For versions of the DJGPP before 2.04, `ln' emulates symbolic links
- to executables by generating a stub that in turn calls the real
- program. This feature also works with nonexistent files like in
- the Posix spec. So `ln -s file link' generates `link.exe', which
- attempts to call `file.exe' if run. But this feature only works
- for executables, so `cp -p' is used instead for these systems.
- DJGPP versions 2.04 and later have full support for symbolic links.
- `ls'
- The portable options are `-acdilrtu'. Current practice is for
- `-l' to output both owner and group, even though ancient versions
- of `ls' omitted the group.
- On ancient hosts, `ls foo' sent the diagnostic `foo not found' to
- standard output if `foo' did not exist. Hence a shell command
- like `sources=`ls *.c 2>/dev/null`' did not always work, since it
- was equivalent to `sources='*.c not found'' in the absence of `.c'
- files. This is no longer a practical problem, since current `ls'
- implementations send diagnostics to standard error.
- The behavior of `ls' on a directory that is being concurrently
- modified is not always predictable, because of a data race where
- cached information returned by `readdir' does not match the current
- directory state. In fact, MacOS 10.5 has an intermittent bug where
- `readdir', and thus `ls', sometimes lists a file more than once if
- other files were added or removed from the directory immediately
- prior to the `ls' call. Since `ls' already sorts its output, the
- duplicate entries can be avoided by piping the results through
- `uniq'.
- `mkdir'
- No `mkdir' option is portable to older systems. Instead of `mkdir
- -p FILE-NAME', you should use `AS_MKDIR_P(FILE-NAME)' (*note
- Programming in M4sh::) or `AC_PROG_MKDIR_P' (*note Particular
- Programs::).
- Combining the `-m' and `-p' options, as in `mkdir -m go-w -p DIR',
- often leads to trouble. FreeBSD `mkdir' incorrectly attempts to
- change the permissions of DIR even if it already exists. HP-UX
- 11.23 and IRIX 6.5 `mkdir' often assign the wrong permissions to
- any newly-created parents of DIR.
- Posix does not clearly specify whether `mkdir -p foo' should
- succeed when `foo' is a symbolic link to an already-existing
- directory. The GNU Core Utilities 5.1.0 `mkdir' succeeds, but
- Solaris `mkdir' fails.
- Traditional `mkdir -p' implementations suffer from race conditions.
- For example, if you invoke `mkdir -p a/b' and `mkdir -p a/c' at
- the same time, both processes might detect that `a' is missing,
- one might create `a', then the other might try to create `a' and
- fail with a `File exists' diagnostic. The GNU Core Utilities
- (`fileutils' version 4.1), FreeBSD 5.0, NetBSD 2.0.2, and OpenBSD
- 2.4 are known to be race-free when two processes invoke `mkdir -p'
- simultaneously, but earlier versions are vulnerable. Solaris
- `mkdir' is still vulnerable as of Solaris 10, and other
- traditional Unix systems are probably vulnerable too. This
- possible race is harmful in parallel builds when several Make
- rules call `mkdir -p' to construct directories. You may use
- `install-sh -d' as a safe replacement, provided this script is
- recent enough; the copy shipped with Autoconf 2.60 and Automake
- 1.10 is OK, but copies from older versions are vulnerable.
- `mkfifo'
- `mknod'
- The GNU Coding Standards state that `mknod' is safe to use on
- platforms where it has been tested to exist; but it is generally
- portable only for creating named FIFOs, since device numbers are
- platform-specific. Autotest uses `mkfifo' to implement parallel
- testsuites. Posix states that behavior is unspecified when
- opening a named FIFO for both reading and writing; on at least
- Cygwin, this results in failure on any attempt to read or write to
- that file descriptor.
- `mktemp'
- Shell scripts can use temporary files safely with `mktemp', but it
- does not exist on all systems. A portable way to create a safe
- temporary file name is to create a temporary directory with mode
- 700 and use a file inside this directory. Both methods prevent
- attackers from gaining control, though `mktemp' is far less likely
- to fail gratuitously under attack.
- Here is sample code to create a new temporary directory `$dir'
- safely:
- # Create a temporary directory $dir in $TMPDIR (default /tmp).
- # Use mktemp if possible; otherwise fall back on mkdir,
- # with $RANDOM to make collisions less likely.
- : "${TMPDIR:=/tmp}"
- {
- dir=`
- (umask 077 && mktemp -d "$TMPDIR/fooXXXXXX") 2>/dev/null
- ` &&
- test -d "$dir"
- } || {
- dir=$TMPDIR/foo$$-$RANDOM
- (umask 077 && mkdir "$dir")
- } || exit $?
- `mv'
- The only portable options are `-f' and `-i'.
- Moving individual files between file systems is portable (it was
- in Unix version 6), but it is not always atomic: when doing `mv
- new existing', there's a critical section where neither the old
- nor the new version of `existing' actually exists.
- On some systems moving files from `/tmp' can sometimes cause
- undesirable (but perfectly valid) warnings, even if you created
- these files. This is because `/tmp' belongs to a group that
- ordinary users are not members of, and files created in `/tmp'
- inherit the group of `/tmp'. When the file is copied, `mv' issues
- a diagnostic without failing:
- $ touch /tmp/foo
- $ mv /tmp/foo .
- error-->mv: ./foo: set owner/group (was: 100/0): Operation not permitted
- $ echo $?
- 0
- $ ls foo
- foo
- This annoying behavior conforms to Posix, unfortunately.
- Moving directories across mount points is not portable, use `cp'
- and `rm'.
- DOS variants cannot rename or remove open files, and do not
- support commands like `mv foo bar >foo', even though this is
- perfectly portable among Posix hosts.
- `od'
- In Mac OS X 10.3, `od' does not support the standard Posix options
- `-A', `-j', `-N', or `-t', or the XSI option `-s'. The only
- supported Posix option is `-v', and the only supported XSI options
- are those in `-bcdox'. The BSD `hexdump' program can be used
- instead.
- This problem no longer exists in Mac OS X 10.4.3.
- `rm'
- The `-f' and `-r' options are portable.
- It is not portable to invoke `rm' without options or operands. On
- the other hand, Posix now requires `rm -f' to silently succeed
- when there are no operands (useful for constructs like `rm -rf
- $filelist' without first checking if `$filelist' was empty). But
- this was not always portable; at least NetBSD `rm' built before
- 2008 would fail with a diagnostic.
- A file might not be removed even if its parent directory is
- writable and searchable. Many Posix hosts cannot remove a mount
- point, a named stream, a working directory, or a last link to a
- file that is being executed.
- DOS variants cannot rename or remove open files, and do not
- support commands like `rm foo >foo', even though this is perfectly
- portable among Posix hosts.
- `rmdir'
- Just as with `rm', some platforms refuse to remove a working
- directory.
- `sed'
- Patterns should not include the separator (unless escaped), even
- as part of a character class. In conformance with Posix, the Cray
- `sed' rejects `s/[^/]*$//': use `s%[^/]*$%%'. Even when escaped,
- patterns should not include separators that are also used as `sed'
- metacharacters. For example, GNU sed 4.0.9 rejects
- `s,x\{1\,\},,', while sed 4.1 strips the backslash before the comma
- before evaluating the basic regular expression.
- Avoid empty patterns within parentheses (i.e., `\(\)'). Posix does
- not require support for empty patterns, and Unicos 9 `sed' rejects
- them.
- Unicos 9 `sed' loops endlessly on patterns like `.*\n.*'.
- Sed scripts should not use branch labels longer than 7 characters
- and should not contain comments; AIX 5.3 `sed' rejects indented
- comments. HP-UX sed has a limit of 99 commands (not counting `:'
- commands) and 48 labels, which cannot be circumvented by using
- more than one script file. It can execute up to 19 reads with the
- `r' command per cycle. Solaris `/usr/ucb/sed' rejects usages that
- exceed a limit of about 6000 bytes for the internal representation
- of commands.
- Avoid redundant `;', as some `sed' implementations, such as NetBSD
- 1.4.2's, incorrectly try to interpret the second `;' as a command:
- $ echo a | sed 's/x/x/;;s/x/x/'
- sed: 1: "s/x/x/;;s/x/x/": invalid command code ;
- Some `sed' implementations have a buffer limited to 4000 bytes,
- and this limits the size of input lines, output lines, and internal
- buffers that can be processed portably. Likewise, not all `sed'
- implementations can handle embedded `NUL' or a missing trailing
- newline.
- Remember that ranges within a bracket expression of a regular
- expression are only well-defined in the `C' (or `POSIX') locale.
- Meanwhile, support for character classes like `[[:upper:]]' is not
- yet universal, so if you cannot guarantee the setting of `LC_ALL',
- it is better to spell out a range `[ABCDEFGHIJKLMNOPQRSTUVWXYZ]'
- than to rely on `[A-Z]'.
- Additionally, Posix states that regular expressions are only
- well-defined on characters. Unfortunately, there exist platforms
- such as MacOS X 10.5 where not all 8-bit byte values are valid
- characters, even though that platform has a single-byte `C'
- locale. And Posix allows the existence of a multi-byte `C'
- locale, although that does not yet appear to be a common
- implementation. At any rate, it means that not all bytes will be
- matched by the regular expression `.':
- $ printf '\200\n' | LC_ALL=C sed -n /./p | wc -l
- 0
- $ printf '\200\n' | LC_ALL=en_US.ISO8859-1 sed -n /./p | wc -l
- 1
- Portable `sed' regular expressions should use `\' only to escape
- characters in the string `$()*.0123456789[\^n{}'. For example,
- alternation, `\|', is common but Posix does not require its
- support, so it should be avoided in portable scripts. Solaris
- `sed' does not support alternation; e.g., `sed '/a\|b/d'' deletes
- only lines that contain the literal string `a|b'. Similarly, `\+'
- and `\?' should be avoided.
- Anchors (`^' and `$') inside groups are not portable.
- Nested parentheses in patterns (e.g., `\(\(a*\)b*)\)') are quite
- portable to current hosts, but was not supported by some ancient
- `sed' implementations like SVR3.
- Some `sed' implementations, e.g., Solaris, restrict the special
- role of the asterisk `*' to one-character regular expressions and
- back-references, and the special role of interval expressions
- `\{M\}', `\{M,\}', or `\{M,N\}' to one-character regular
- expressions. This may lead to unexpected behavior:
- $ echo '1*23*4' | /usr/bin/sed 's/\(.\)*/x/g'
- x2x4
- $ echo '1*23*4' | /usr/xpg4/bin/sed 's/\(.\)*/x/g'
- x
- The `-e' option is mostly portable. However, its argument cannot
- start with `a', `c', or `i', as this runs afoul of a Tru64 5.1 bug.
- Also, its argument cannot be empty, as this fails on AIX 5.3.
- Some people prefer to use `-e':
- sed -e 'COMMAND-1' \
- -e 'COMMAND-2'
- as opposed to the equivalent:
- sed '
- COMMAND-1
- COMMAND-2
- '
- The following usage is sometimes equivalent:
- sed 'COMMAND-1;COMMAND-2'
- but Posix says that this use of a semicolon has undefined effect if
- COMMAND-1's verb is `{', `a', `b', `c', `i', `r', `t', `w', `:',
- or `#', so you should use semicolon only with simple scripts that
- do not use these verbs.
- Posix up to the 2008 revision requires the argument of the `-e'
- option to be a syntactically complete script. GNU `sed' allows to
- pass multiple script fragments, each as argument of a separate
- `-e' option, that are then combined, with newlines between the
- fragments, and a future Posix revision may allow this as well.
- This approach is not portable with script fragments ending in
- backslash; for example, the `sed' programs on Solaris 10, HP-UX
- 11, and AIX don't allow splitting in this case:
- $ echo a | sed -n -e 'i\
- 0'
- 0
- $ echo a | sed -n -e 'i\' -e 0
- Unrecognized command: 0
- In practice, however, this technique of joining fragments through
- `-e' works for multiple `sed' functions within `{' and `}', even
- if that is not specified by Posix:
- $ echo a | sed -n -e '/a/{' -e s/a/b/ -e p -e '}'
- b
- Commands inside { } brackets are further restricted. Posix 2008
- says that they cannot be preceded by addresses, `!', or `;', and
- that each command must be followed immediately by a newline,
- without any intervening blanks or semicolons. The closing bracket
- must be alone on a line, other than white space preceding or
- following it. However, a future version of Posix may standardize
- the use of addresses within brackets.
- Contrary to yet another urban legend, you may portably use `&' in
- the replacement part of the `s' command to mean "what was
- matched". All descendants of Unix version 7 `sed' (at least; we
- don't have first hand experience with older `sed' implementations)
- have supported it.
- Posix requires that you must not have any white space between `!'
- and the following command. It is OK to have blanks between the
- address and the `!'. For instance, on Solaris:
- $ echo "foo" | sed -n '/bar/ ! p'
- error-->Unrecognized command: /bar/ ! p
- $ echo "foo" | sed -n '/bar/! p'
- error-->Unrecognized command: /bar/! p
- $ echo "foo" | sed -n '/bar/ !p'
- foo
- Posix also says that you should not combine `!' and `;'. If you
- use `!', it is best to put it on a command that is delimited by
- newlines rather than `;'.
- Also note that Posix requires that the `b', `t', `r', and `w'
- commands be followed by exactly one space before their argument.
- On the other hand, no white space is allowed between `:' and the
- subsequent label name.
- If a sed script is specified on the command line and ends in an
- `a', `c', or `i' command, the last line of inserted text should be
- followed by a newline. Otherwise some `sed' implementations
- (e.g., OpenBSD 3.9) do not append a newline to the inserted text.
- Many `sed' implementations (e.g., MacOS X 10.4, OpenBSD 3.9,
- Solaris 10 `/usr/ucb/sed') strip leading white space from the text
- of `a', `c', and `i' commands. Prepend a backslash to work around
- this incompatibility with Posix:
- $ echo flushleft | sed 'a\
- > indented
- > '
- flushleft
- indented
- $ echo foo | sed 'a\
- > \ indented
- > '
- flushleft
- indented
- Posix requires that with an empty regular expression, the last
- non-empty regular expression from either an address specification
- or substitution command is applied. However, busybox 1.6.1
- complains when using a substitution command with a replacement
- containing a back-reference to an empty regular expression; the
- workaround is repeating the regular expression.
- $ echo abc | busybox sed '/a\(b\)c/ s//\1/'
- sed: No previous regexp.
- $ echo abc | busybox sed '/a\(b\)c/ s/a\(b\)c/\1/'
- b
- `sed' (`t')
- Some old systems have `sed' that "forget" to reset their `t' flag
- when starting a new cycle. For instance on MIPS RISC/OS, and on
- IRIX 5.3, if you run the following `sed' script (the line numbers
- are not actual part of the texts):
- s/keep me/kept/g # a
- t end # b
- s/.*/deleted/g # c
- :end # d
- on
- delete me # 1
- delete me # 2
- keep me # 3
- delete me # 4
- you get
- deleted
- delete me
- kept
- deleted
- instead of
- deleted
- deleted
- kept
- deleted
- Why? When processing line 1, (c) matches, therefore sets the `t'
- flag, and the output is produced. When processing line 2, the `t'
- flag is still set (this is the bug). Command (a) fails to match,
- but `sed' is not supposed to clear the `t' flag when a
- substitution fails. Command (b) sees that the flag is set,
- therefore it clears it, and jumps to (d), hence you get `delete me'
- instead of `deleted'. When processing line (3), `t' is clear, (a)
- matches, so the flag is set, hence (b) clears the flags and jumps.
- Finally, since the flag is clear, line 4 is processed properly.
- There are two things one should remember about `t' in `sed'.
- Firstly, always remember that `t' jumps if _some_ substitution
- succeeded, not only the immediately preceding substitution.
- Therefore, always use a fake `t clear' followed by a `:clear' on
- the next line, to reset the `t' flag where needed.
- Secondly, you cannot rely on `sed' to clear the flag at each new
- cycle.
- One portable implementation of the script above is:
- t clear
- :clear
- s/keep me/kept/g
- t end
- s/.*/deleted/g
- :end
- `sleep'
- Using `sleep' is generally portable. However, remember that
- adding a `sleep' to work around timestamp issues, with a minimum
- granularity of one second, doesn't scale well for parallel builds
- on modern machines with sub-second process completion.
- `sort'
- Remember that sort order is influenced by the current locale.
- Inside `configure', the C locale is in effect, but in Makefile
- snippets, you may need to specify `LC_ALL=C sort'.
- `tar'
- There are multiple file formats for `tar'; if you use Automake,
- the macro `AM_INIT_AUTOMAKE' has some options controlling which
- level of portability to use.
- `touch'
- If you specify the desired timestamp (e.g., with the `-r' option),
- older `touch' implementations use the `utime' or `utimes' system
- call, which can result in the same kind of timestamp truncation
- problems that `cp -p' has.
- On ancient BSD systems, `touch' or any command that results in an
- empty file does not update the timestamps, so use a command like
- `echo' as a workaround. Also, GNU `touch' 3.16r (and presumably
- all before that) fails to work on SunOS 4.1.3 when the empty file
- is on an NFS-mounted 4.2 volume. However, these problems are no
- longer of practical concern.
- `tr'
- Not all versions of `tr' handle all backslash character escapes.
- For example, Solaris 10 `/usr/ucb/tr' falls over, even though
- Solaris contains more modern `tr' in other locations. Using octal
- escapes is more portable for carriage returns, since `\015' is the
- same for both ASCII and EBCDIC, and since use of literal carriage
- returns in scripts causes a number of other problems. But for
- other characters, like newline, using octal escapes ties the
- operation to ASCII, so it is better to use literal characters.
- $ { echo moon; echo light; } | /usr/ucb/tr -d '\n' ; echo
- moo
- light
- $ { echo moon; echo light; } | /usr/bin/tr -d '\n' ; echo
- moonlight
- $ { echo moon; echo light; } | /usr/ucb/tr -d '\012' ; echo
- moonlight
- $ nl='
- '; { echo moon; echo light; } | /usr/ucb/tr -d "$nl" ; echo
- moonlight
- Not all versions of `tr' recognize direct ranges of characters: at
- least Solaris `/usr/bin/tr' still fails to do so. But you can use
- `/usr/xpg4/bin/tr' instead, or add brackets (which in Posix
- transliterate to themselves).
- $ echo "Hazy Fantazy" | LC_ALL=C /usr/bin/tr a-z A-Z
- HAZy FAntAZy
- $ echo "Hazy Fantazy" | LC_ALL=C /usr/bin/tr '[a-z]' '[A-Z]'
- HAZY FANTAZY
- $ echo "Hazy Fantazy" | LC_ALL=C /usr/xpg4/bin/tr a-z A-Z
- HAZY FANTAZY
- When providing two arguments, be sure the second string is at
- least as long as the first.
- $ echo abc | /usr/xpg4/bin/tr bc d
- adc
- $ echo abc | coreutils/tr bc d
- add
- Posix requires `tr' to operate on binary files. But at least
- Solaris `/usr/ucb/tr' and `/usr/bin/tr' silently discard `NUL' in
- the input prior to doing any translation. When using `tr' to
- process a binary file that may contain `NUL' bytes, it is
- necessary to use `/usr/xpg4/bin/tr' instead, or `/usr/xpg6/bin/tr'
- if that is available.
- $ printf 'a\0b' | /usr/ucb/tr x x | od -An -tx1
- 61 62
- $ printf 'a\0b' | /usr/bin/tr x x | od -An -tx1
- 61 62
- $ printf 'a\0b' | /usr/xpg4/bin/tr x x | od -An -tx1
- 61 00 62
- Solaris `/usr/ucb/tr' additionally fails to handle `\0' as the
- octal escape for `NUL'.
- $ printf 'abc' | /usr/ucb/tr 'bc' '\0d' | od -An -tx1
- 61 62 63
- $ printf 'abc' | /usr/bin/tr 'bc' '\0d' | od -An -tx1
- 61 00 64
- $ printf 'abc' | /usr/xpg4/bin/tr 'bc' '\0d' | od -An -tx1
- 61 00 64
- File: autoconf.info, Node: Portable Make, Next: Portable C and C++, Prev: Portable Shell, Up: Top
- 12 Portable Make Programming
- ****************************
- Writing portable makefiles is an art. Since a makefile's commands are
- executed by the shell, you must consider the shell portability issues
- already mentioned. However, other issues are specific to `make' itself.
- * Menu:
- * $< in Ordinary Make Rules:: $< in ordinary rules
- * Failure in Make Rules:: Failing portably in rules
- * Special Chars in Names:: Special Characters in Macro Names
- * Backslash-Newline-Empty:: Empty lines after backslash-newline
- * Backslash-Newline Comments:: Spanning comments across line boundaries
- * Long Lines in Makefiles:: Line length limitations
- * Macros and Submakes:: `make macro=value' and submakes
- * The Make Macro MAKEFLAGS:: `$(MAKEFLAGS)' portability issues
- * The Make Macro SHELL:: `$(SHELL)' portability issues
- * Parallel Make:: Parallel `make' quirks
- * Comments in Make Rules:: Other problems with Make comments
- * Newlines in Make Rules:: Using literal newlines in rules
- * Comments in Make Macros:: Other problems with Make comments in macros
- * Trailing whitespace in Make Macros:: Macro substitution problems
- * Command-line Macros and whitespace:: Whitespace trimming of values
- * obj/ and Make:: Don't name a subdirectory `obj'
- * make -k Status:: Exit status of `make -k'
- * VPATH and Make:: `VPATH' woes
- * Single Suffix Rules:: Single suffix rules and separated dependencies
- * Timestamps and Make:: Subsecond timestamp resolution
- File: autoconf.info, Node: $< in Ordinary Make Rules, Next: Failure in Make Rules, Up: Portable Make
- 12.1 `$<' in Ordinary Make Rules
- ================================
- Posix says that the `$<' construct in makefiles can be used only in
- inference rules and in the `.DEFAULT' rule; its meaning in ordinary
- rules is unspecified. Solaris `make' for instance replaces it with the
- empty string. OpenBSD (3.0 and later) `make' diagnoses these uses and
- errors out.
- File: autoconf.info, Node: Failure in Make Rules, Next: Special Chars in Names, Prev: $< in Ordinary Make Rules, Up: Portable Make
- 12.2 Failure in Make Rules
- ==========================
- Posix 2008 requires that `make' must invoke each command with the
- equivalent of a `sh -e -c' subshell, which causes the subshell to exit
- immediately if a subsidiary simple-command fails, although not all
- `make' implementations have historically followed this rule. For
- example, the command `touch T; rm -f U' may attempt to remove `U' even
- if the `touch' fails, although this is not permitted with Posix make.
- One way to work around failures in simple commands is to reword them so
- that they always succeed, e.g., `touch T || :; rm -f U'. However, even
- this approach can run into common bugs in BSD implementations of the
- `-e' option of `sh' and `set' (*note Limitations of Shell Builtins:
- set.), so if you are worried about porting to buggy BSD shells it may
- be simpler to migrate complicated `make' actions into separate scripts.
- File: autoconf.info, Node: Special Chars in Names, Next: Backslash-Newline-Empty, Prev: Failure in Make Rules, Up: Portable Make
- 12.3 Special Characters in Make Macro Names
- ===========================================
- Posix limits macro names to nonempty strings containing only ASCII
- letters and digits, `.', and `_'. Many `make' implementations allow a
- wider variety of characters, but portable makefiles should avoid them.
- It is portable to start a name with a special character, e.g.,
- `$(.FOO)'.
- Some ancient `make' implementations don't support leading
- underscores in macro names. An example is NEWS-OS 4.2R.
- $ cat Makefile
- _am_include = #
- _am_quote =
- all:; @echo this is test
- $ make
- Make: Must be a separator on rules line 2. Stop.
- $ cat Makefile2
- am_include = #
- am_quote =
- all:; @echo this is test
- $ make -f Makefile2
- this is test
- However, this problem is no longer of practical concern.
- File: autoconf.info, Node: Backslash-Newline-Empty, Next: Backslash-Newline Comments, Prev: Special Chars in Names, Up: Portable Make
- 12.4 Backslash-Newline Before Empty Lines
- =========================================
- A bug in Bash 2.03 can cause problems if a Make rule contains a
- backslash-newline followed by line that expands to nothing. For
- example, on Solaris 8:
- SHELL = /bin/bash
- EMPTY =
- foo:
- touch foo \
- $(EMPTY)
- executes
- /bin/bash -c 'touch foo \
- '
- which fails with a syntax error, due to the Bash bug. To avoid this
- problem, avoid nullable macros in the last line of a multiline command.
- On some versions of HP-UX, `make' reads multiple newlines following
- a backslash, continuing to the next non-empty line. For example,
- FOO = one \
- BAR = two
- test:
- : FOO is "$(FOO)"
- : BAR is "$(BAR)"
- shows `FOO' equal to `one BAR = two'. Other implementations sensibly
- let a backslash continue only to the immediately following line.
- File: autoconf.info, Node: Backslash-Newline Comments, Next: Long Lines in Makefiles, Prev: Backslash-Newline-Empty, Up: Portable Make
- 12.5 Backslash-Newline in Make Comments
- =======================================
- According to Posix, Make comments start with `#' and continue until an
- unescaped newline is reached.
- $ cat Makefile
- # A = foo \
- bar \
- baz
- all:
- @echo ok
- $ make # GNU make
- ok
- However this is not always the case. Some implementations discard
- everything from `#' through the end of the line, ignoring any trailing
- backslash.
- $ pmake # BSD make
- "Makefile", line 3: Need an operator
- Fatal errors encountered -- cannot continue
- Therefore, if you want to comment out a multi-line definition, prefix
- each line with `#', not only the first.
- # A = foo \
- # bar \
- # baz
- File: autoconf.info, Node: Long Lines in Makefiles, Next: Macros and Submakes, Prev: Backslash-Newline Comments, Up: Portable Make
- 12.6 Long Lines in Makefiles
- ============================
- Tru64 5.1's `make' has been reported to crash when given a makefile
- with lines longer than around 20 kB. Earlier versions are reported to
- exit with `Line too long' diagnostics.
- File: autoconf.info, Node: Macros and Submakes, Next: The Make Macro MAKEFLAGS, Prev: Long Lines in Makefiles, Up: Portable Make
- 12.7 `make macro=value' and Submakes
- ====================================
- A command-line variable definition such as `foo=bar' overrides any
- definition of `foo' in a makefile. Some `make' implementations (such
- as GNU `make') propagate this override to subsidiary invocations of
- `make'. Some other implementations do not pass the substitution along
- to submakes.
- $ cat Makefile
- foo = foo
- one:
- @echo $(foo)
- $(MAKE) two
- two:
- @echo $(foo)
- $ make foo=bar # GNU make 3.79.1
- bar
- make two
- make[1]: Entering directory `/home/adl'
- bar
- make[1]: Leaving directory `/home/adl'
- $ pmake foo=bar # BSD make
- bar
- pmake two
- foo
- You have a few possibilities if you do want the `foo=bar' override
- to propagate to submakes. One is to use the `-e' option, which causes
- all environment variables to have precedence over the makefile macro
- definitions, and declare foo as an environment variable:
- $ env foo=bar make -e
- The `-e' option is propagated to submakes automatically, and since
- the environment is inherited between `make' invocations, the `foo'
- macro is overridden in submakes as expected.
- This syntax (`foo=bar make -e') is portable only when used outside
- of a makefile, for instance from a script or from the command line.
- When run inside a `make' rule, GNU `make' 3.80 and prior versions
- forget to propagate the `-e' option to submakes.
- Moreover, using `-e' could have unexpected side effects if your
- environment contains some other macros usually defined by the makefile.
- (See also the note about `make -e' and `SHELL' below.)
- If you can foresee all macros that a user might want to override,
- then you can propagate them to submakes manually, from your makefile:
- foo = foo
- one:
- @echo $(foo)
- $(MAKE) foo=$(foo) two
- two:
- @echo $(foo)
- Another way to propagate a variable to submakes in a portable way is
- to expand an extra variable in every invocation of `$(MAKE)' within
- your makefile:
- foo = foo
- one:
- @echo $(foo)
- $(MAKE) $(SUBMAKEFLAGS) two
- two:
- @echo $(foo)
- Users must be aware that this technique is in use to take advantage
- of it, e.g. with `make foo=bar SUBMAKEFLAGS='foo=bar'', but it allows
- any macro to be overridden. Makefiles generated by `automake' use this
- technique, expanding `$(AM_MAKEFLAGS)' on the command lines of submakes
- (*note Automake: (automake)Subdirectories.).
- File: autoconf.info, Node: The Make Macro MAKEFLAGS, Next: The Make Macro SHELL, Prev: Macros and Submakes, Up: Portable Make
- 12.8 The Make Macro MAKEFLAGS
- =============================
- Posix requires `make' to use `MAKEFLAGS' to affect the current and
- recursive invocations of make, but allows implementations several
- formats for the variable. It is tricky to parse `$MAKEFLAGS' to
- determine whether `-s' for silent execution or `-k' for continued
- execution are in effect. For example, you cannot assume that the first
- space-separated word in `$MAKEFLAGS' contains single-letter options,
- since in the Cygwin version of GNU `make' it is either `--unix' or
- `--win32' with the second word containing single-letter options.
- $ cat Makefile
- all:
- @echo MAKEFLAGS = $(MAKEFLAGS)
- $ make
- MAKEFLAGS = --unix
- $ make -k
- MAKEFLAGS = --unix -k
- File: autoconf.info, Node: The Make Macro SHELL, Next: Parallel Make, Prev: The Make Macro MAKEFLAGS, Up: Portable Make
- 12.9 The Make Macro `SHELL'
- ===========================
- Posix-compliant `make' internally uses the `$(SHELL)' macro to spawn
- shell processes and execute Make rules. This is a builtin macro
- supplied by `make', but it can be modified by a makefile or by a
- command-line argument.
- Not all `make' implementations define this `SHELL' macro. Tru64
- `make' is an example; this implementation always uses `/bin/sh'. So
- it's a good idea to always define `SHELL' in your makefiles. If you
- use Autoconf, do
- SHELL = @SHELL@
- If you use Automake, this is done for you.
- Do not force `SHELL = /bin/sh' because that is not correct
- everywhere. Remember, `/bin/sh' is not Posix compliant on many
- systems, such as FreeBSD 4, NetBSD 3, AIX 3, Solaris 10, or Tru64.
- Additionally, DJGPP lacks `/bin/sh', and when its GNU `make' port sees
- such a setting it enters a special emulation mode where features like
- pipes and redirections are emulated on top of DOS's `command.com'.
- Unfortunately this emulation is incomplete; for instance it does not
- handle command substitutions. Using `@SHELL@' means that your makefile
- will benefit from the same improved shell, such as `bash' or `ksh',
- that was discovered during `configure', so that you aren't fighting two
- different sets of shell bugs between the two contexts.
- Posix-compliant `make' should never acquire the value of $(SHELL)
- from the environment, even when `make -e' is used (otherwise, think
- about what would happen to your rules if `SHELL=/bin/tcsh').
- However not all `make' implementations have this exception. For
- instance it's not surprising that Tru64 `make' doesn't protect `SHELL',
- since it doesn't use it.
- $ cat Makefile
- SHELL = /bin/sh
- FOO = foo
- all:
- @echo $(SHELL)
- @echo $(FOO)
- $ env SHELL=/bin/tcsh FOO=bar make -e # Tru64 Make
- /bin/tcsh
- bar
- $ env SHELL=/bin/tcsh FOO=bar gmake -e # GNU make
- /bin/sh
- bar
- Conversely, `make' is not supposed to export any changes to the
- macro `SHELL' to child processes. Again, many implementations break
- this rule:
- $ cat Makefile
- all:
- @echo $(SHELL)
- @printenv SHELL
- $ env SHELL=sh make -e SHELL=/bin/ksh # BSD Make, GNU make 3.80
- /bin/ksh
- /bin/ksh
- $ env SHELL=sh gmake -e SHELL=/bin/ksh # GNU make 3.81
- /bin/ksh
- sh
- File: autoconf.info, Node: Parallel Make, Next: Comments in Make Rules, Prev: The Make Macro SHELL, Up: Portable Make
- 12.10 Parallel Make
- ===================
- Support for parallel execution in `make' implementation varies.
- Generally, using GNU make is your best bet.
- When NetBSD or FreeBSD `make' are run in parallel mode, they will
- reuse the same shell for multiple commands within one recipe. This can
- have various unexpected consequences. For example, changes of
- directories or variables persist between recipes, so that:
- all:
- @var=value; cd /; pwd; echo $$var; echo $$$$
- @pwd; echo $$var; echo $$$$
- may output the following with `make -j1', at least on NetBSD up to 5.1
- and FreeBSD up to 8.2:
- /
- value
- 32235
- /
- value
- 32235
- while without `-j1', or with `-B', the output looks less surprising:
- /
- value
- 32238
- /tmp
- 32239
- Another consequence is that, if one command in a recipe uses `exit 0'
- to indicate a successful exit, the shell will be gone and the remaining
- commands of this recipe will not be executed.
- The BSD `make' implementations, when run in parallel mode, will also
- pass the `Makefile' recipes to the shell through its standard input,
- thus making it unusable from the recipes:
- $ cat Makefile
- read:
- @read line; echo LINE: $$line
- $ echo foo | make read
- LINE: foo
- $ echo foo | make -j1 read # NetBSD 5.1 and FreeBSD 8.2
- LINE:
- Moreover, when FreeBSD `make' (up at least to 8.2) is run in parallel
- mode, it implements the `@' and `-' "recipe modifiers" by dynamically
- modifying the active shell flags. This behavior has the effects of
- potentially clobbering the exit status of recipes silenced with the `@'
- modifier if they also unset the `errexit' shell flag, and of mangling
- the output in unexpected ways:
- $ cat Makefile
- a:
- @echo $$-; set +e; false
- b:
- -echo $$-; false; echo set -
- $ make a; echo status: $?
- ehBc
- *** Error code 1
- status: 1
- $ make -j1 a; echo status: $?
- ehB
- status: 0
- $ make b
- echo $-; echo set -
- hBc
- set -
- $ make -j1 b
- echo $-; echo hvB
- You can avoid all these issues by using the `-B' option to enable
- compatibility semantics. However, that will effectively also disable
- all parallelism as that will cause prerequisites to be updated in the
- order they are listed in a rule.
- Some make implementations (among them, FreeBSD `make', NetBSD
- `make', and Solaris `dmake'), when invoked with a `-jN' option, connect
- the standard output and standard error of all their child processes to
- pipes or temporary regular files. This can lead to subtly different
- semantics in the behavior of the spawned processes. For example, even
- if the `make' standard output is connected to a tty, the recipe command
- will not be:
- $ cat Makefile
- all:
- @test -t 1 && echo "Is a tty" || echo "Is not a tty"
- $ make -j 2 # FreeBSD 8.2 make
- Is not a tty
- $ make -j 2 # NetBSD 5.1 make
- --- all ---
- Is not a tty
- $ dmake -j 2 # Solaris 10 dmake
- HOSTNAME --> 1 job
- HOSTNAME --> Job output
- Is not a tty
- On the other hand:
- $ make -j 2 # GNU make, Heirloom make
- Is a tty
- The above examples also show additional status output produced in
- parallel mode for targets being updated by Solaris `dmake' and NetBSD
- `make' (but _not_ by FreeBSD `make').
- Furthermore, parallel runs of those `make' implementations will
- route standard error from commands that they spawn into their own
- standard output, and may remove leading whitespace from output lines.
- File: autoconf.info, Node: Comments in Make Rules, Next: Newlines in Make Rules, Prev: Parallel Make, Up: Portable Make
- 12.11 Comments in Make Rules
- ============================
- Never put comments in a rule.
- Some `make' treat anything starting with a tab as a command for the
- current rule, even if the tab is immediately followed by a `#'. The
- `make' from Tru64 Unix V5.1 is one of them. The following makefile
- runs `# foo' through the shell.
- all:
- # foo
- As a workaround, you can use the `:' no-op command with a string
- argument that gets ignored:
- all:
- : "foo"
- Conversely, if you want to use the `#' character in some command,
- you can only do so by expanding it inside a rule (*note Comments in
- Make Macros::). So for example, if `COMMENT_CHAR' is substituted by
- `config.status' as `#', then the following substitutes `@COMMENT_CHAR@'
- in a generated header:
- foo.h: foo.h.in
- sed -e 's|@''COMMENT_CHAR''@|@COMMENT_CHAR@|g' \
- $(srcdir)/foo.h.in > $@
- The funny shell quoting avoids a substitution at `config.status' run
- time of the left-hand side of the `sed' `s' command.
- File: autoconf.info, Node: Newlines in Make Rules, Next: Comments in Make Macros, Prev: Comments in Make Rules, Up: Portable Make
- 12.12 Newlines in Make Rules
- ============================
- In shell scripts, newlines can be used inside string literals. But in
- the shell statements of `Makefile' rules, this is not possible: A
- newline not preceded by a backslash is a separator between shell
- statements. Whereas a newline that is preceded by a backslash becomes
- part of the shell statement according to POSIX, but gets replaced,
- together with the backslash that precedes it, by a space in GNU `make'
- 3.80 and older. So, how can a newline be used in a string literal?
- The trick is to set up a shell variable that contains a newline:
- nlinit=`echo 'nl="'; echo '"'`; eval "$$nlinit"
- For example, in order to create a multiline `sed' expression that
- inserts a blank line after every line of a file, this code can be used:
- nlinit=`echo 'nl="'; echo '"'`; eval "$$nlinit"; \
- sed -e "s/\$$/\\$${nl}/" < input > output
- File: autoconf.info, Node: Comments in Make Macros, Next: Trailing whitespace in Make Macros, Prev: Newlines in Make Rules, Up: Portable Make
- 12.13 Comments in Make Macros
- =============================
- Avoid putting comments in macro values as far as possible. Posix
- specifies that the text starting from the `#' sign until the end of the
- line is to be ignored, which has the unfortunate effect of disallowing
- them even within quotes. Thus, the following might lead to a syntax
- error at compile time:
- CPPFLAGS = "-DCOMMENT_CHAR='#'"
- as `CPPFLAGS' may be expanded to `"-DCOMMENT_CHAR=''.
- Most `make' implementations disregard this and treat single and
- double quotes specially here. Also, GNU `make' lets you put `#' into a
- macro value by escaping it with a backslash, i.e., `\#'. However,
- neither of these usages are portable. *Note Comments in Make Rules::,
- for a portable alternative.
- Even without quoting involved, comments can have surprising effects,
- because the whitespace before them is part of the variable value:
- foo = bar # trailing comment
- print: ; @echo "$(foo)."
- prints `bar .', which is usually not intended, and can expose `make'
- bugs as described below.
- File: autoconf.info, Node: Trailing whitespace in Make Macros, Next: Command-line Macros and whitespace, Prev: Comments in Make Macros, Up: Portable Make
- 12.14 Trailing whitespace in Make Macros
- ========================================
- GNU `make' 3.80 mistreats trailing whitespace in macro substitutions
- and appends another spurious suffix:
- empty =
- foo = bar $(empty)
- print: ; @echo $(foo:=.test)
- prints `bar.test .test'.
- BSD and Solaris `make' implementations do not honor trailing
- whitespace in macro definitions as Posix requires:
- foo = bar # Note the space after "bar".
- print: ; @echo $(foo)t
- prints `bart' instead of `bar t'. To work around this, you can use a
- helper macro as in the previous example.
- File: autoconf.info, Node: Command-line Macros and whitespace, Next: obj/ and Make, Prev: Trailing whitespace in Make Macros, Up: Portable Make
- 12.15 Command-line Macros and whitespace
- ========================================
- Some `make' implementations may strip trailing whitespace off of macros
- set on the command line in addition to leading whitespace. Further,
- some may strip leading whitespace off of macros set from environment
- variables:
- $ echo 'print: ; @echo "x$(foo)x$(bar)x"' |
- foo=' f f ' make -f - bar=' b b '
- x f f xb b x # AIX, BSD, GNU make
- xf f xb b x # HP-UX, IRIX, Tru64/OSF make
- x f f xb bx # Solaris make
- File: autoconf.info, Node: obj/ and Make, Next: make -k Status, Prev: Command-line Macros and whitespace, Up: Portable Make
- 12.16 The `obj/' Subdirectory and Make
- ======================================
- Never name one of your subdirectories `obj/' if you don't like
- surprises.
- If an `obj/' directory exists, BSD `make' enters it before reading
- the makefile. Hence the makefile in the current directory is not read.
- $ cat Makefile
- all:
- echo Hello
- $ cat obj/Makefile
- all:
- echo World
- $ make # GNU make
- echo Hello
- Hello
- $ pmake # BSD make
- echo World
- World
- File: autoconf.info, Node: make -k Status, Next: VPATH and Make, Prev: obj/ and Make, Up: Portable Make
- 12.17 Exit Status of `make -k'
- ==============================
- Do not rely on the exit status of `make -k'. Some implementations
- reflect whether they encountered an error in their exit status; other
- implementations always succeed.
- $ cat Makefile
- all:
- false
- $ make -k; echo exit status: $? # GNU make
- false
- make: *** [all] Error 1
- exit status: 2
- $ pmake -k; echo exit status: $? # BSD make
- false
- *** Error code 1 (continuing)
- exit status: 0
- File: autoconf.info, Node: VPATH and Make, Next: Single Suffix Rules, Prev: make -k Status, Up: Portable Make
- 12.18 `VPATH' and Make
- ======================
- Posix does not specify the semantics of `VPATH'. Typically, `make'
- supports `VPATH', but its implementation is not consistent.
- Autoconf and Automake support makefiles whose usages of `VPATH' are
- portable to recent-enough popular implementations of `make', but to
- keep the resulting makefiles portable, a package's makefile prototypes
- must take the following issues into account. These issues are
- complicated and are often poorly understood, and installers who use
- `VPATH' should expect to find many bugs in this area. If you use
- `VPATH', the simplest way to avoid these portability bugs is to stick
- with GNU `make', since it is the most commonly-used `make' among
- Autoconf users.
- Here are some known issues with some `VPATH' implementations.
- * Menu:
- * Variables listed in VPATH:: `VPATH' must be literal on ancient hosts
- * VPATH and Double-colon:: Problems with `::' on ancient hosts
- * $< in Explicit Rules:: `$<' does not work in ordinary rules
- * Automatic Rule Rewriting:: `VPATH' goes wild on Solaris
- * Tru64 Directory Magic:: `mkdir' goes wild on Tru64
- * Make Target Lookup:: More details about `VPATH' lookup
- File: autoconf.info, Node: Variables listed in VPATH, Next: VPATH and Double-colon, Up: VPATH and Make
- 12.18.1 Variables listed in `VPATH'
- -----------------------------------
- Do not set `VPATH' to the value of another variable, for example `VPATH
- = $(srcdir)', because some ancient versions of `make' do not do
- variable substitutions on the value of `VPATH'. For example, use this
- srcdir = @srcdir@
- VPATH = @srcdir@
- rather than `VPATH = $(srcdir)'. Note that with GNU Automake, there is
- no need to set this yourself.
- File: autoconf.info, Node: VPATH and Double-colon, Next: $< in Explicit Rules, Prev: Variables listed in VPATH, Up: VPATH and Make
- 12.18.2 `VPATH' and Double-colon Rules
- --------------------------------------
- With ancient versions of Sun `make', any assignment to `VPATH' causes
- `make' to execute only the first set of double-colon rules. However,
- this problem is no longer of practical concern.
- File: autoconf.info, Node: $< in Explicit Rules, Next: Automatic Rule Rewriting, Prev: VPATH and Double-colon, Up: VPATH and Make
- 12.18.3 `$<' Not Supported in Explicit Rules
- --------------------------------------------
- Using `$<' in explicit rules is not portable. The prerequisite file
- must be named explicitly in the rule. If you want to find the
- prerequisite via a `VPATH' search, you have to code the whole thing
- manually. *Note Build Directories::.
- File: autoconf.info, Node: Automatic Rule Rewriting, Next: Tru64 Directory Magic, Prev: $< in Explicit Rules, Up: VPATH and Make
- 12.18.4 Automatic Rule Rewriting
- --------------------------------
- Some `make' implementations, such as Solaris and Tru64, search for
- prerequisites in `VPATH' and then rewrite each occurrence as a plain
- word in the rule. For instance:
- # This isn't portable to GNU make.
- VPATH = ../pkg/src
- f.c: if.c
- cp if.c f.c
- executes `cp ../pkg/src/if.c f.c' if `if.c' is found in `../pkg/src'.
- However, this rule leads to real problems in practice. For example,
- if the source directory contains an ordinary file named `test' that is
- used in a dependency, Solaris `make' rewrites commands like `if test -r
- foo; ...' to `if ../pkg/src/test -r foo; ...', which is typically
- undesirable. In fact, `make' is completely unaware of shell syntax
- used in the rules, so the VPATH rewrite can potentially apply to _any_
- whitespace-separated word in a rule, including shell variables,
- functions, and keywords.
- $ mkdir build
- $ cd build
- $ cat > Makefile <<'END'
- VPATH = ..
- all: arg func for echo
- func () { for arg in "$$@"; do echo $$arg; done; }; \
- func "hello world"
- END
- $ touch ../arg ../func ../for ../echo
- $ make
- ../func () { ../for ../arg in "$@"; do ../echo $arg; done; }; \
- ../func "hello world"
- sh: syntax error at line 1: `do' unexpected
- *** Error code 2
- To avoid this problem, portable makefiles should never mention a source
- file or dependency whose name is that of a shell keyword like `for' or
- `until', a shell command like `cat' or `gcc' or `test', or a shell
- function or variable used in the corresponding `Makefile' recipe.
- Because of these problems GNU `make' and many other `make'
- implementations do not rewrite commands, so portable makefiles should
- search `VPATH' manually. It is tempting to write this:
- # This isn't portable to Solaris make.
- VPATH = ../pkg/src
- f.c: if.c
- cp `test -f if.c || echo $(VPATH)/`if.c f.c
- However, the "prerequisite rewriting" still applies here. So if `if.c'
- is in `../pkg/src', Solaris and Tru64 `make' execute
- cp `test -f ../pkg/src/if.c || echo ../pkg/src/`if.c f.c
- which reduces to
- cp if.c f.c
- and thus fails. Oops.
- A simple workaround, and good practice anyway, is to use `$?' and
- `$@' when possible:
- VPATH = ../pkg/src
- f.c: if.c
- cp $? $@
- but this does not generalize well to commands with multiple
- prerequisites. A more general workaround is to rewrite the rule so that
- the prerequisite `if.c' never appears as a plain word. For example,
- these three rules would be safe, assuming `if.c' is in `../pkg/src' and
- the other files are in the working directory:
- VPATH = ../pkg/src
- f.c: if.c f1.c
- cat `test -f ./if.c || echo $(VPATH)/`if.c f1.c >$@
- g.c: if.c g1.c
- cat `test -f 'if.c' || echo $(VPATH)/`if.c g1.c >$@
- h.c: if.c h1.c
- cat `test -f "if.c" || echo $(VPATH)/`if.c h1.c >$@
- Things get worse when your prerequisites are in a macro.
- VPATH = ../pkg/src
- HEADERS = f.h g.h h.h
- install-HEADERS: $(HEADERS)
- for i in $(HEADERS); do \
- $(INSTALL) -m 644 \
- `test -f $$i || echo $(VPATH)/`$$i \
- $(DESTDIR)$(includedir)/$$i; \
- done
- The above `install-HEADERS' rule is not Solaris-proof because `for i
- in $(HEADERS);' is expanded to `for i in f.h g.h h.h;' where `f.h' and
- `g.h' are plain words and are hence subject to `VPATH' adjustments.
- If the three files are in `../pkg/src', the rule is run as:
- for i in ../pkg/src/f.h ../pkg/src/g.h h.h; do \
- install -m 644 \
- `test -f $i || echo ../pkg/src/`$i \
- /usr/local/include/$i; \
- done
- where the two first `install' calls fail. For instance, consider
- the `f.h' installation:
- install -m 644 \
- `test -f ../pkg/src/f.h || \
- echo ../pkg/src/ \
- `../pkg/src/f.h \
- /usr/local/include/../pkg/src/f.h;
- It reduces to:
- install -m 644 \
- ../pkg/src/f.h \
- /usr/local/include/../pkg/src/f.h;
- Note that the manual `VPATH' search did not cause any problems here;
- however this command installs `f.h' in an incorrect directory.
- Trying to quote `$(HEADERS)' in some way, as we did for `foo.c' a
- few makefiles ago, does not help:
- install-HEADERS: $(HEADERS)
- headers='$(HEADERS)'; \
- for i in $$headers; do \
- $(INSTALL) -m 644 \
- `test -f $$i || echo $(VPATH)/`$$i \
- $(DESTDIR)$(includedir)/$$i; \
- done
- Now, `headers='$(HEADERS)'' macro-expands to:
- headers='f.h g.h h.h'
- but `g.h' is still a plain word. (As an aside, the idiom
- `headers='$(HEADERS)'; for i in $$headers;' is a good idea if
- `$(HEADERS)' can be empty, because some shells diagnose a syntax error
- on `for i in;'.)
- One workaround is to strip this unwanted `../pkg/src/' prefix
- manually:
- VPATH = ../pkg/src
- HEADERS = f.h g.h h.h
- install-HEADERS: $(HEADERS)
- headers='$(HEADERS)'; \
- for i in $$headers; do \
- i=`expr "$$i" : '$(VPATH)/\(.*\)'`;
- $(INSTALL) -m 644 \
- `test -f $$i || echo $(VPATH)/`$$i \
- $(DESTDIR)$(includedir)/$$i; \
- done
- Automake does something similar. However the above hack works only
- if the files listed in `HEADERS' are in the current directory or a
- subdirectory; they should not be in an enclosing directory. If we had
- `HEADERS = ../f.h', the above fragment would fail in a VPATH build with
- Tru64 `make'. The reason is that not only does Tru64 `make' rewrite
- dependencies, but it also simplifies them. Hence `../f.h' becomes
- `../pkg/f.h' instead of `../pkg/src/../f.h'. This obviously defeats
- any attempt to strip a leading `../pkg/src/' component.
- The following example makes the behavior of Tru64 `make' more
- apparent.
- $ cat Makefile
- VPATH = sub
- all: ../foo
- echo ../foo
- $ ls
- Makefile foo
- $ make
- echo foo
- foo
- Dependency `../foo' was found in `sub/../foo', but Tru64 `make'
- simplified it as `foo'. (Note that the `sub/' directory does not even
- exist, this just means that the simplification occurred before the file
- was checked for.)
- For the record here is how SunOS 4 `make' behaves on this example.
- $ make
- make: Fatal error: Don't know how to make target `../foo'
- $ mkdir sub
- $ make
- echo sub/../foo
- sub/../foo
- File: autoconf.info, Node: Tru64 Directory Magic, Next: Make Target Lookup, Prev: Automatic Rule Rewriting, Up: VPATH and Make
- 12.18.5 Tru64 `make' Creates Prerequisite Directories Magically
- ---------------------------------------------------------------
- When a prerequisite is a subdirectory of `VPATH', Tru64 `make' creates
- it in the current directory.
- $ mkdir -p foo/bar build
- $ cd build
- $ cat >Makefile <<END
- VPATH = ..
- all: foo/bar
- END
- $ make
- mkdir foo
- mkdir foo/bar
- This can yield unexpected results if a rule uses a manual `VPATH'
- search as presented before.
- VPATH = ..
- all : foo/bar
- command `test -d foo/bar || echo ../`foo/bar
- The above `command' is run on the empty `foo/bar' directory that was
- created in the current directory.
- File: autoconf.info, Node: Make Target Lookup, Prev: Tru64 Directory Magic, Up: VPATH and Make
- 12.18.6 Make Target Lookup
- --------------------------
- GNU `make' uses a complex algorithm to decide when it should use files
- found via a `VPATH' search. *Note How Directory Searches are
- Performed: (make)Search Algorithm.
- If a target needs to be rebuilt, GNU `make' discards the file name
- found during the `VPATH' search for this target, and builds the file
- locally using the file name given in the makefile. If a target does
- not need to be rebuilt, GNU `make' uses the file name found during the
- `VPATH' search.
- Other `make' implementations, like NetBSD `make', are easier to
- describe: the file name found during the `VPATH' search is used whether
- the target needs to be rebuilt or not. Therefore new files are created
- locally, but existing files are updated at their `VPATH' location.
- OpenBSD and FreeBSD `make', however, never perform a `VPATH' search
- for a dependency that has an explicit rule. This is extremely annoying.
- When attempting a `VPATH' build for an autoconfiscated package
- (e.g., `mkdir build && cd build && ../configure'), this means GNU
- `make' builds everything locally in the `build' directory, while BSD
- `make' builds new files locally and updates existing files in the
- source directory.
- $ cat Makefile
- VPATH = ..
- all: foo.x bar.x
- foo.x bar.x: newer.x
- @echo Building $@
- $ touch ../bar.x
- $ touch ../newer.x
- $ make # GNU make
- Building foo.x
- Building bar.x
- $ pmake # NetBSD make
- Building foo.x
- Building ../bar.x
- $ fmake # FreeBSD make, OpenBSD make
- Building foo.x
- Building bar.x
- $ tmake # Tru64 make
- Building foo.x
- Building bar.x
- $ touch ../bar.x
- $ make # GNU make
- Building foo.x
- $ pmake # NetBSD make
- Building foo.x
- $ fmake # FreeBSD make, OpenBSD make
- Building foo.x
- Building bar.x
- $ tmake # Tru64 make
- Building foo.x
- Building bar.x
- Note how NetBSD `make' updates `../bar.x' in its VPATH location, and
- how FreeBSD, OpenBSD, and Tru64 `make' always update `bar.x', even when
- `../bar.x' is up to date.
- Another point worth mentioning is that once GNU `make' has decided
- to ignore a `VPATH' file name (e.g., it ignored `../bar.x' in the above
- example) it continues to ignore it when the target occurs as a
- prerequisite of another rule.
- The following example shows that GNU `make' does not look up `bar.x'
- in `VPATH' before performing the `.x.y' rule, because it ignored the
- `VPATH' result of `bar.x' while running the `bar.x: newer.x' rule.
- $ cat Makefile
- VPATH = ..
- all: bar.y
- bar.x: newer.x
- @echo Building $@
- .SUFFIXES: .x .y
- .x.y:
- cp $< $@
- $ touch ../bar.x
- $ touch ../newer.x
- $ make # GNU make
- Building bar.x
- cp bar.x bar.y
- cp: cannot stat `bar.x': No such file or directory
- make: *** [bar.y] Error 1
- $ pmake # NetBSD make
- Building ../bar.x
- cp ../bar.x bar.y
- $ rm bar.y
- $ fmake # FreeBSD make, OpenBSD make
- echo Building bar.x
- cp bar.x bar.y
- cp: cannot stat `bar.x': No such file or directory
- *** Error code 1
- $ tmake # Tru64 make
- Building bar.x
- cp: bar.x: No such file or directory
- *** Exit 1
- Note that if you drop away the command from the `bar.x: newer.x'
- rule, GNU `make' magically starts to work: it knows that `bar.x' hasn't
- been updated, therefore it doesn't discard the result from `VPATH'
- (`../bar.x') in succeeding uses. Tru64 also works, but FreeBSD and
- OpenBSD still don't.
- $ cat Makefile
- VPATH = ..
- all: bar.y
- bar.x: newer.x
- .SUFFIXES: .x .y
- .x.y:
- cp $< $@
- $ touch ../bar.x
- $ touch ../newer.x
- $ make # GNU make
- cp ../bar.x bar.y
- $ rm bar.y
- $ pmake # NetBSD make
- cp ../bar.x bar.y
- $ rm bar.y
- $ fmake # FreeBSD make, OpenBSD make
- cp bar.x bar.y
- cp: cannot stat `bar.x': No such file or directory
- *** Error code 1
- $ tmake # Tru64 make
- cp ../bar.x bar.y
- It seems the sole solution that would please every `make'
- implementation is to never rely on `VPATH' searches for targets. In
- other words, `VPATH' should be reserved to unbuilt sources.
- File: autoconf.info, Node: Single Suffix Rules, Next: Timestamps and Make, Prev: VPATH and Make, Up: Portable Make
- 12.19 Single Suffix Rules and Separated Dependencies
- ====================================================
- A "Single Suffix Rule" is basically a usual suffix (inference) rule
- (`.from.to:'), but which _destination_ suffix is empty (`.from:').
- "Separated dependencies" simply refers to listing the prerequisite
- of a target, without defining a rule. Usually one can list on the one
- hand side, the rules, and on the other hand side, the dependencies.
- Solaris `make' does not support separated dependencies for targets
- defined by single suffix rules:
- $ cat Makefile
- .SUFFIXES: .in
- foo: foo.in
- .in:
- cp $< $@
- $ touch foo.in
- $ make
- $ ls
- Makefile foo.in
- while GNU Make does:
- $ gmake
- cp foo.in foo
- $ ls
- Makefile foo foo.in
- Note it works without the `foo: foo.in' dependency.
- $ cat Makefile
- .SUFFIXES: .in
- .in:
- cp $< $@
- $ make foo
- cp foo.in foo
- and it works with double suffix inference rules:
- $ cat Makefile
- foo.out: foo.in
- .SUFFIXES: .in .out
- .in.out:
- cp $< $@
- $ make
- cp foo.in foo.out
- As a result, in such a case, you have to write target rules.
- File: autoconf.info, Node: Timestamps and Make, Prev: Single Suffix Rules, Up: Portable Make
- 12.20 Timestamp Resolution and Make
- ===================================
- Traditionally, file timestamps had 1-second resolution, and `make' used
- those timestamps to determine whether one file was newer than the
- other. However, many modern file systems have timestamps with
- 1-nanosecond resolution. Some `make' implementations look at the
- entire timestamp; others ignore the fractional part, which can lead to
- incorrect results. Normally this is not a problem, but in some extreme
- cases you may need to use tricks like `sleep 1' to work around
- timestamp truncation bugs.
- Commands like `cp -p' and `touch -r' typically do not copy file
- timestamps to their full resolutions (*note Limitations of Usual Tools:
- touch.). Hence you should be wary of rules like this:
- dest: src
- cp -p src dest
- as `dest' often appears to be older than `src' after the timestamp
- is truncated, and this can cause `make' to do needless rework the next
- time it is invoked. To work around this problem, you can use a
- timestamp file, e.g.:
- dest-stamp: src
- cp -p src dest
- date >dest-stamp
- Apart from timestamp resolution, there are also differences in
- handling equal timestamps. HP-UX `make' updates targets if it has the
- same time stamp as one of its prerequisites, in violation of Posix
- rules.
- This can cause spurious rebuilds for repeated runs of `make'. This
- in turn can cause `make' to fail if it tries to rebuild generated files
- in a possibly read-only source tree with tools not present on the
- end-user machine. Use GNU `make' instead.
- File: autoconf.info, Node: Portable C and C++, Next: Manual Configuration, Prev: Portable Make, Up: Top
- 13 Portable C and C++ Programming
- *********************************
- C and C++ programs often use low-level features of the underlying
- system, and therefore are often more difficult to make portable to other
- platforms.
- Several standards have been developed to help make your programs more
- portable. If you write programs with these standards in mind, you can
- have greater confidence that your programs work on a wide variety of
- systems. *Note Language Standards Supported by GCC: (gcc)Standards,
- for a list of C-related standards. Many programs also assume the Posix
- standard (http://www.opengroup.org/susv3).
- Some old code is written to be portable to K&R C, which predates any
- C standard. K&R C compilers are no longer of practical interest,
- though, and the rest of section assumes at least C89, the first C
- standard.
- Program portability is a huge topic, and this section can only
- briefly introduce common pitfalls. *Note Portability between System
- Types: (standards)System Portability, for more information.
- * Menu:
- * Varieties of Unportability:: How to make your programs unportable
- * Integer Overflow:: When integers get too large
- * Preprocessor Arithmetic:: `#if' expression problems
- * Null Pointers:: Properties of null pointers
- * Buffer Overruns:: Subscript errors and the like
- * Volatile Objects:: `volatile' and signals
- * Floating Point Portability:: Portable floating-point arithmetic
- * Exiting Portably:: Exiting and the exit status
- File: autoconf.info, Node: Varieties of Unportability, Next: Integer Overflow, Up: Portable C and C++
- 13.1 Varieties of Unportability
- ===============================
- Autoconf tests and ordinary programs often need to test what is allowed
- on a system, and therefore they may need to deliberately exceed the
- boundaries of what the standards allow, if only to see whether an
- optional feature is present. When you write such a program, you should
- keep in mind the difference between constraints, unspecified behavior,
- and undefined behavior.
- In C, a "constraint" is a rule that the compiler must enforce. An
- example constraint is that C programs must not declare a bit-field with
- negative width. Tests can therefore reliably assume that programs with
- negative-width bit-fields are rejected by a compiler that conforms to
- the standard.
- "Unspecified behavior" is valid behavior, where the standard allows
- multiple possibilities. For example, the order of evaluation of
- function arguments is unspecified. Some unspecified behavior is
- "implementation-defined", i.e., documented by the implementation, but
- since Autoconf tests cannot read the documentation they cannot
- distinguish between implementation-defined and other unspecified
- behavior. It is common for Autoconf tests to probe implementations to
- determine otherwise-unspecified behavior.
- "Undefined behavior" is invalid behavior, where the standard allows
- the implementation to do anything it pleases. For example,
- dereferencing a null pointer leads to undefined behavior. If possible,
- test programs should avoid undefined behavior, since a program with
- undefined behavior might succeed on a test that should fail.
- The above rules apply to programs that are intended to conform to the
- standard. However, strictly-conforming programs are quite rare, since
- the standards are so limiting. A major goal of Autoconf is to support
- programs that use implementation features not described by the standard,
- and it is fairly common for test programs to violate the above rules, if
- the programs work well enough in practice.
- File: autoconf.info, Node: Integer Overflow, Next: Preprocessor Arithmetic, Prev: Varieties of Unportability, Up: Portable C and C++
- 13.2 Integer Overflow
- =====================
- In practice many portable C programs assume that signed integer
- overflow wraps around reliably using two's complement arithmetic. Yet
- the C standard says that program behavior is undefined on overflow, and
- in a few cases C programs do not work on some modern implementations
- because their overflows do not wrap around as their authors expected.
- Conversely, in signed integer remainder, the C standard requires
- overflow behavior that is commonly not implemented.
- * Menu:
- * Integer Overflow Basics:: Why integer overflow is a problem
- * Signed Overflow Examples:: Examples of code assuming wraparound
- * Optimization and Wraparound:: Optimizations that break uses of wraparound
- * Signed Overflow Advice:: Practical advice for signed overflow issues
- * Signed Integer Division:: `INT_MIN / -1' and `INT_MIN % -1'
- File: autoconf.info, Node: Integer Overflow Basics, Next: Signed Overflow Examples, Up: Integer Overflow
- 13.2.1 Basics of Integer Overflow
- ---------------------------------
- In languages like C, unsigned integer overflow reliably wraps around;
- e.g., `UINT_MAX + 1' yields zero. This is guaranteed by the C standard
- and is portable in practice, unless you specify aggressive, nonstandard
- optimization options suitable only for special applications.
- In contrast, the C standard says that signed integer overflow leads
- to undefined behavior where a program can do anything, including dumping
- core or overrunning a buffer. The misbehavior can even precede the
- overflow. Such an overflow can occur during addition, subtraction,
- multiplication, division, and left shift.
- Despite this requirement of the standard, many C programs and
- Autoconf tests assume that signed integer overflow silently wraps
- around modulo a power of two, using two's complement arithmetic, so
- long as you cast the resulting value to a signed integer type or store
- it into a signed integer variable. If you use conservative
- optimization flags, such programs are generally portable to the vast
- majority of modern platforms, with a few exceptions discussed later.
- For historical reasons the C standard also allows implementations
- with ones' complement or signed magnitude arithmetic, but it is safe to
- assume two's complement nowadays.
- Also, overflow can occur when converting an out-of-range value to a
- signed integer type. Here a standard implementation must define what
- happens, but this might include raising an exception. In practice all
- known implementations support silent wraparound in this case, so you
- need not worry about other possibilities.
- File: autoconf.info, Node: Signed Overflow Examples, Next: Optimization and Wraparound, Prev: Integer Overflow Basics, Up: Integer Overflow
- 13.2.2 Examples of Code Assuming Wraparound Overflow
- ----------------------------------------------------
- There has long been a tension between what the C standard requires for
- signed integer overflow, and what C programs commonly assume. The
- standard allows aggressive optimizations based on assumptions that
- overflow never occurs, but many practical C programs rely on overflow
- wrapping around. These programs do not conform to the standard, but
- they commonly work in practice because compiler writers are
- understandably reluctant to implement optimizations that would break
- many programs, unless perhaps a user specifies aggressive optimization.
- The C Standard says that if a program has signed integer overflow its
- behavior is undefined, and the undefined behavior can even precede the
- overflow. To take an extreme example:
- if (password == expected_password)
- allow_superuser_privileges ();
- else if (counter++ == INT_MAX)
- abort ();
- else
- printf ("%d password mismatches\n", counter);
- If the `int' variable `counter' equals `INT_MAX', `counter++' must
- overflow and the behavior is undefined, so the C standard allows the
- compiler to optimize away the test against `INT_MAX' and the `abort'
- call. Worse, if an earlier bug in the program lets the compiler deduce
- that `counter == INT_MAX' or that `counter' previously overflowed, the
- C standard allows the compiler to optimize away the password test and
- generate code that allows superuser privileges unconditionally.
- Despite this requirement by the standard, it has long been common
- for C code to assume wraparound arithmetic after signed overflow, and
- all known practical C implementations support some C idioms that assume
- wraparound signed arithmetic, even if the idioms do not conform
- strictly to the standard. If your code looks like the following
- examples it will almost surely work with real-world compilers.
- Here is an example derived from the 7th Edition Unix implementation
- of `atoi' (1979-01-10):
- char *p;
- int f, n;
- ...
- while (*p >= '0' && *p <= '9')
- n = n * 10 + *p++ - '0';
- return (f ? -n : n);
- Even if the input string is in range, on most modern machines this has
- signed overflow when computing the most negative integer (the `-n'
- overflows) or a value near an extreme integer (the first `+' overflows).
- Here is another example, derived from the 7th Edition implementation
- of `rand' (1979-01-10). Here the programmer expects both
- multiplication and addition to wrap on overflow:
- static long int randx = 1;
- ...
- randx = randx * 1103515245 + 12345;
- return (randx >> 16) & 077777;
- In the following example, derived from the GNU C Library 2.5
- implementation of `mktime' (2006-09-09), the code assumes wraparound
- arithmetic in `+' to detect signed overflow:
- time_t t, t1, t2;
- int sec_requested, sec_adjustment;
- ...
- t1 = t + sec_requested;
- t2 = t1 + sec_adjustment;
- if (((t1 < t) != (sec_requested < 0))
- | ((t2 < t1) != (sec_adjustment < 0)))
- return -1;
- If your code looks like these examples, it is probably safe even
- though it does not strictly conform to the C standard. This might lead
- one to believe that one can generally assume wraparound on overflow,
- but that is not always true, as can be seen in the next section.
- File: autoconf.info, Node: Optimization and Wraparound, Next: Signed Overflow Advice, Prev: Signed Overflow Examples, Up: Integer Overflow
- 13.2.3 Optimizations That Break Wraparound Arithmetic
- -----------------------------------------------------
- Compilers sometimes generate code that is incompatible with wraparound
- integer arithmetic. A simple example is an algebraic simplification: a
- compiler might translate `(i * 2000) / 1000' to `i * 2' because it
- assumes that `i * 2000' does not overflow. The translation is not
- equivalent to the original when overflow occurs: e.g., in the typical
- case of 32-bit signed two's complement wraparound `int', if `i' has
- type `int' and value `1073742', the original expression returns
- -2147483 but the optimized version returns the mathematically correct
- value 2147484.
- More subtly, loop induction optimizations often exploit the undefined
- behavior of signed overflow. Consider the following contrived function
- `sumc':
- int
- sumc (int lo, int hi)
- {
- int sum = 0;
- int i;
- for (i = lo; i <= hi; i++)
- sum ^= i * 53;
- return sum;
- }
- To avoid multiplying by 53 each time through the loop, an optimizing
- compiler might internally transform `sumc' to the equivalent of the
- following:
- int
- transformed_sumc (int lo, int hi)
- {
- int sum = 0;
- int hic = hi * 53;
- int ic;
- for (ic = lo * 53; ic <= hic; ic += 53)
- sum ^= ic;
- return sum;
- }
- This transformation is allowed by the C standard, but it is invalid for
- wraparound arithmetic when `INT_MAX / 53 < hi', because then the
- overflow in computing expressions like `hi * 53' can cause the
- expression `i <= hi' to yield a different value from the transformed
- expression `ic <= hic'.
- For this reason, compilers that use loop induction and similar
- techniques often do not support reliable wraparound arithmetic when a
- loop induction variable like `ic' is involved. Since loop induction
- variables are generated by the compiler, and are not visible in the
- source code, it is not always trivial to say whether the problem
- affects your code.
- Hardly any code actually depends on wraparound arithmetic in cases
- like these, so in practice these loop induction optimizations are almost
- always useful. However, edge cases in this area can cause problems.
- For example:
- int j;
- for (j = 1; 0 < j; j *= 2)
- test (j);
- Here, the loop attempts to iterate through all powers of 2 that `int'
- can represent, but the C standard allows a compiler to optimize away
- the comparison and generate an infinite loop, under the argument that
- behavior is undefined on overflow. As of this writing this
- optimization is not done by any production version of GCC with `-O2',
- but it might be performed by other compilers, or by more aggressive GCC
- optimization options, and the GCC developers have not decided whether
- it will continue to work with GCC and `-O2'.
- File: autoconf.info, Node: Signed Overflow Advice, Next: Signed Integer Division, Prev: Optimization and Wraparound, Up: Integer Overflow
- 13.2.4 Practical Advice for Signed Overflow Issues
- --------------------------------------------------
- Ideally the safest approach is to avoid signed integer overflow
- entirely. For example, instead of multiplying two signed integers, you
- can convert them to unsigned integers, multiply the unsigned values,
- then test whether the result is in signed range.
- Rewriting code in this way will be inconvenient, though,
- particularly if the signed values might be negative. Also, it may hurt
- performance. Using unsigned arithmetic to check for overflow is
- particularly painful to do portably and efficiently when dealing with an
- integer type like `uid_t' whose width and signedness vary from platform
- to platform.
- Furthermore, many C applications pervasively assume wraparound
- behavior and typically it is not easy to find and remove all these
- assumptions. Hence it is often useful to maintain nonstandard code
- that assumes wraparound on overflow, instead of rewriting the code.
- The rest of this section attempts to give practical advice for this
- situation.
- If your code wants to detect signed integer overflow in `sum = a +
- b', it is generally safe to use an expression like `(sum < a) != (b <
- 0)'.
- If your code uses a signed loop index, make sure that the index
- cannot overflow, along with all signed expressions derived from the
- index. Here is a contrived example of problematic code with two
- instances of overflow.
- for (i = INT_MAX - 10; i <= INT_MAX; i++)
- if (i + 1 < 0)
- {
- report_overflow ();
- break;
- }
- Because of the two overflows, a compiler might optimize away or
- transform the two comparisons in a way that is incompatible with the
- wraparound assumption.
- If your code uses an expression like `(i * 2000) / 1000' and you
- actually want the multiplication to wrap around on overflow, use
- unsigned arithmetic to do it, e.g., `((int) (i * 2000u)) / 1000'.
- If your code assumes wraparound behavior and you want to insulate it
- against any GCC optimizations that would fail to support that behavior,
- you should use GCC's `-fwrapv' option, which causes signed overflow to
- wrap around reliably (except for division and remainder, as discussed
- in the next section).
- If you need to port to platforms where signed integer overflow does
- not reliably wrap around (e.g., due to hardware overflow checking, or to
- highly aggressive optimizations), you should consider debugging with
- GCC's `-ftrapv' option, which causes signed overflow to raise an
- exception.
- File: autoconf.info, Node: Signed Integer Division, Prev: Signed Overflow Advice, Up: Integer Overflow
- 13.2.5 Signed Integer Division and Integer Overflow
- ---------------------------------------------------
- Overflow in signed integer division is not always harmless: for
- example, on CPUs of the i386 family, dividing `INT_MIN' by `-1' yields
- a SIGFPE signal which by default terminates the program. Worse, taking
- the remainder of these two values typically yields the same signal on
- these CPUs, even though the C standard requires `INT_MIN % -1' to yield
- zero because the expression does not overflow.
- File: autoconf.info, Node: Preprocessor Arithmetic, Next: Null Pointers, Prev: Integer Overflow, Up: Portable C and C++
- 13.3 Preprocessor Arithmetic
- ============================
- In C99, preprocessor arithmetic, used for `#if' expressions, must be
- evaluated as if all signed values are of type `intmax_t' and all
- unsigned values of type `uintmax_t'. Many compilers are buggy in this
- area, though. For example, as of 2007, Sun C mishandles `#if LLONG_MIN
- < 0' on a platform with 32-bit `long int' and 64-bit `long long int'.
- Also, some older preprocessors mishandle constants ending in `LL'. To
- work around these problems, you can compute the value of expressions
- like `LONG_MAX < LLONG_MAX' at `configure'-time rather than at
- `#if'-time.
- File: autoconf.info, Node: Null Pointers, Next: Buffer Overruns, Prev: Preprocessor Arithmetic, Up: Portable C and C++
- 13.4 Properties of Null Pointers
- ================================
- Most modern hosts reliably fail when you attempt to dereference a null
- pointer.
- On almost all modern hosts, null pointers use an all-bits-zero
- internal representation, so you can reliably use `memset' with 0 to set
- all the pointers in an array to null values.
- If `p' is a null pointer to an object type, the C expression `p + 0'
- always evaluates to `p' on modern hosts, even though the standard says
- that it has undefined behavior.
- File: autoconf.info, Node: Buffer Overruns, Next: Volatile Objects, Prev: Null Pointers, Up: Portable C and C++
- 13.5 Buffer Overruns and Subscript Errors
- =========================================
- Buffer overruns and subscript errors are the most common dangerous
- errors in C programs. They result in undefined behavior because storing
- outside an array typically modifies storage that is used by some other
- object, and most modern systems lack runtime checks to catch these
- errors. Programs should not rely on buffer overruns being caught.
- There is one exception to the usual rule that a portable program
- cannot address outside an array. In C, it is valid to compute the
- address just past an object, e.g., `&a[N]' where `a' has `N' elements,
- so long as you do not dereference the resulting pointer. But it is not
- valid to compute the address just before an object, e.g., `&a[-1]'; nor
- is it valid to compute two past the end, e.g., `&a[N+1]'. On most
- platforms `&a[-1] < &a[0] && &a[N] < &a[N+1]', but this is not reliable
- in general, and it is usually easy enough to avoid the potential
- portability problem, e.g., by allocating an extra unused array element
- at the start or end.
- Valgrind (http://valgrind.org/) can catch many overruns. GCC users
- might also consider using the `-fmudflap' option to catch overruns.
- Buffer overruns are usually caused by off-by-one errors, but there
- are more subtle ways to get them.
- Using `int' values to index into an array or compute array sizes
- causes problems on typical 64-bit hosts where an array index might be
- 2^31 or larger. Index values of type `size_t' avoid this problem, but
- cannot be negative. Index values of type `ptrdiff_t' are signed, and
- are wide enough in practice.
- If you add or multiply two numbers to calculate an array size, e.g.,
- `malloc (x * sizeof y + z)', havoc ensues if the addition or
- multiplication overflows.
- Many implementations of the `alloca' function silently misbehave and
- can generate buffer overflows if given sizes that are too large. The
- size limits are implementation dependent, but are at least 4000 bytes
- on all platforms that we know about.
- The standard functions `asctime', `asctime_r', `ctime', `ctime_r',
- and `gets' are prone to buffer overflows, and portable code should not
- use them unless the inputs are known to be within certain limits. The
- time-related functions can overflow their buffers if given timestamps
- out of range (e.g., a year less than -999 or greater than 9999).
- Time-related buffer overflows cannot happen with recent-enough versions
- of the GNU C library, but are possible with other implementations. The
- `gets' function is the worst, since it almost invariably overflows its
- buffer when presented with an input line larger than the buffer.
- File: autoconf.info, Node: Volatile Objects, Next: Floating Point Portability, Prev: Buffer Overruns, Up: Portable C and C++
- 13.6 Volatile Objects
- =====================
- The keyword `volatile' is often misunderstood in portable code. Its
- use inhibits some memory-access optimizations, but programmers often
- wish that it had a different meaning than it actually does.
- `volatile' was designed for code that accesses special objects like
- memory-mapped device registers whose contents spontaneously change.
- Such code is inherently low-level, and it is difficult to specify
- portably what `volatile' means in these cases. The C standard says,
- "What constitutes an access to an object that has volatile-qualified
- type is implementation-defined," so in theory each implementation is
- supposed to fill in the gap by documenting what `volatile' means for
- that implementation. In practice, though, this documentation is
- usually absent or incomplete.
- One area of confusion is the distinction between objects defined with
- volatile types, and volatile lvalues. From the C standard's point of
- view, an object defined with a volatile type has externally visible
- behavior. You can think of such objects as having little oscilloscope
- probes attached to them, so that the user can observe some properties of
- accesses to them, just as the user can observe data written to output
- files. However, the standard does not make it clear whether users can
- observe accesses by volatile lvalues to ordinary objects. For example:
- /* Declare and access a volatile object.
- Accesses to X are "visible" to users. */
- static int volatile x;
- x = 1;
- /* Access two ordinary objects via a volatile lvalue.
- It's not clear whether accesses to *P are "visible". */
- int y;
- int *z = malloc (sizeof (int));
- int volatile *p;
- p = &y;
- *p = 1;
- p = z;
- *p = 1;
- Programmers often wish that `volatile' meant "Perform the memory
- access here and now, without merging several memory accesses, without
- changing the memory word size, and without reordering." But the C
- standard does not require this. For objects defined with a volatile
- type, accesses must be done before the next sequence point; but
- otherwise merging, reordering, and word-size change is allowed. Worse,
- it is not clear from the standard whether volatile lvalues provide more
- guarantees in general than nonvolatile lvalues, if the underlying
- objects are ordinary.
- Even when accessing objects defined with a volatile type, the C
- standard allows only extremely limited signal handlers: the behavior is
- undefined if a signal handler reads any nonlocal object, or writes to
- any nonlocal object whose type is not `sig_atomic_t volatile', or calls
- any standard library function other than `abort', `signal', and (if C99)
- `_Exit'. Hence C compilers need not worry about a signal handler
- disturbing ordinary computation, unless the computation accesses a
- `sig_atomic_t volatile' lvalue that is not a local variable. (There is
- an obscure exception for accesses via a pointer to a volatile
- character, since it may point into part of a `sig_atomic_t volatile'
- object.) Posix adds to the list of library functions callable from a
- portable signal handler, but otherwise is like the C standard in this
- area.
- Some C implementations allow memory-access optimizations within each
- translation unit, such that actual behavior agrees with the behavior
- required by the standard only when calling a function in some other
- translation unit, and a signal handler acts like it was called from a
- different translation unit. The C standard hints that in these
- implementations, objects referred to by signal handlers "would require
- explicit specification of `volatile' storage, as well as other
- implementation-defined restrictions." But unfortunately even for this
- special case these other restrictions are often not documented well.
- *Note When is a Volatile Object Accessed?: (gcc)Volatiles, for some
- restrictions imposed by GCC. *Note Defining Signal Handlers:
- (libc)Defining Handlers, for some restrictions imposed by the GNU C
- library. Restrictions differ on other platforms.
- If possible, it is best to use a signal handler that fits within the
- limits imposed by the C and Posix standards.
- If this is not practical, you can try the following rules of thumb.
- A signal handler should access only volatile lvalues, preferably lvalues
- that refer to objects defined with a volatile type, and should not
- assume that the accessed objects have an internally consistent state if
- they are larger than a machine word. Furthermore, installers should
- employ compilers and compiler options that are commonly used for
- building operating system kernels, because kernels often need more from
- `volatile' than the C Standard requires, and installers who compile an
- application in a similar environment can sometimes benefit from the
- extra constraints imposed by kernels on compilers. Admittedly we are
- handwaving somewhat here, as there are few guarantees in this area; the
- rules of thumb may help to fix some bugs but there is a good chance
- that they will not fix them all.
- For `volatile', C++ has the same problems that C does.
- Multithreaded applications have even more problems with `volatile', but
- they are beyond the scope of this section.
- The bottom line is that using `volatile' typically hurts performance
- but should not hurt correctness. In some cases its use does help
- correctness, but these cases are often so poorly understood that all
- too often adding `volatile' to a data structure merely alleviates some
- symptoms of a bug while not fixing the bug in general.
- File: autoconf.info, Node: Floating Point Portability, Next: Exiting Portably, Prev: Volatile Objects, Up: Portable C and C++
- 13.7 Floating Point Portability
- ===============================
- Almost all modern systems use IEEE-754 floating point, and it is safe to
- assume IEEE-754 in most portable code these days. For more information,
- please see David Goldberg's classic paper What Every Computer Scientist
- Should Know About Floating-Point Arithmetic
- (http://www.validlab.com/goldberg/paper.pdf).
- File: autoconf.info, Node: Exiting Portably, Prev: Floating Point Portability, Up: Portable C and C++
- 13.8 Exiting Portably
- =====================
- A C or C++ program can exit with status N by returning N from the
- `main' function. Portable programs are supposed to exit either with
- status 0 or `EXIT_SUCCESS' to succeed, or with status `EXIT_FAILURE' to
- fail, but in practice it is portable to fail by exiting with status 1,
- and test programs that assume Posix can fail by exiting with status
- values from 1 through 255. Programs on SunOS 2.0 (1985) through 3.5.2
- (1988) incorrectly exited with zero status when `main' returned
- nonzero, but ancient systems like these are no longer of practical
- concern.
- A program can also exit with status N by passing N to the `exit'
- function, and a program can fail by calling the `abort' function. If a
- program is specialized to just some platforms, it can fail by calling
- functions specific to those platforms, e.g., `_exit' (Posix) and
- `_Exit' (C99). However, like other functions, an exit function should
- be declared, typically by including a header. For example, if a C
- program calls `exit', it should include `stdlib.h' either directly or
- via the default includes (*note Default Includes::).
- A program can fail due to undefined behavior such as dereferencing a
- null pointer, but this is not recommended as undefined behavior allows
- an implementation to do whatever it pleases and this includes exiting
- successfully.
- File: autoconf.info, Node: Manual Configuration, Next: Site Configuration, Prev: Portable C and C++, Up: Top
- 14 Manual Configuration
- ***********************
- A few kinds of features can't be guessed automatically by running test
- programs. For example, the details of the object-file format, or
- special options that need to be passed to the compiler or linker. You
- can check for such features using ad-hoc means, such as having
- `configure' check the output of the `uname' program, or looking for
- libraries that are unique to particular systems. However, Autoconf
- provides a uniform method for handling unguessable features.
- * Menu:
- * Specifying Target Triplets:: Specifying target triplets
- * Canonicalizing:: Getting the canonical system type
- * Using System Type:: What to do with the system type
- File: autoconf.info, Node: Specifying Target Triplets, Next: Canonicalizing, Up: Manual Configuration
- 14.1 Specifying target triplets
- ===============================
- Autoconf-generated `configure' scripts can make decisions based on a
- canonical name for the system type, or "target triplet", which has the
- form: `CPU-VENDOR-OS', where OS can be `SYSTEM' or `KERNEL-SYSTEM'
- `configure' can usually guess the canonical name for the type of
- system it's running on. To do so it runs a script called
- `config.guess', which infers the name using the `uname' command or
- symbols predefined by the C preprocessor.
- Alternately, the user can specify the system type with command line
- arguments to `configure' (*note System Type::. Doing so is necessary
- when cross-compiling. In the most complex case of cross-compiling,
- three system types are involved. The options to specify them are:
- `--build=BUILD-TYPE'
- the type of system on which the package is being configured and
- compiled. It defaults to the result of running `config.guess'.
- Specifying a BUILD-TYPE that differs from HOST-TYPE enables
- cross-compilation mode.
- `--host=HOST-TYPE'
- the type of system on which the package runs. By default it is the
- same as the build machine. Specifying a HOST-TYPE that differs
- from BUILD-TYPE, when BUILD-TYPE was also explicitly specified,
- enables cross-compilation mode.
- `--target=TARGET-TYPE'
- the type of system for which any compiler tools in the package
- produce code (rarely needed). By default, it is the same as host.
- If you mean to override the result of `config.guess', use `--build',
- not `--host', since the latter enables cross-compilation. For
- historical reasons, whenever you specify `--host', be sure to specify
- `--build' too; this will be fixed in the future. So, to enter
- cross-compilation mode, use a command like this
- ./configure --build=i686-pc-linux-gnu --host=m68k-coff
- Note that if you do not specify `--host', `configure' fails if it can't
- run the code generated by the specified compiler. For example,
- configuring as follows fails:
- ./configure CC=m68k-coff-gcc
- When cross-compiling, `configure' will warn about any tools
- (compilers, linkers, assemblers) whose name is not prefixed with the
- host type. This is an aid to users performing cross-compilation.
- Continuing the example above, if a cross-compiler named `cc' is used
- with a native `pkg-config', then libraries found by `pkg-config' will
- likely cause subtle build failures; but using the names `m68k-coff-cc'
- and `m68k-coff-pkg-config' avoids any confusion. Avoiding the warning
- is as simple as creating the correct symlinks naming the cross tools.
- `configure' recognizes short aliases for many system types; for
- example, `decstation' can be used instead of `mips-dec-ultrix4.2'.
- `configure' runs a script called `config.sub' to canonicalize system
- type aliases.
- This section deliberately omits the description of the obsolete
- interface; see *note Hosts and Cross-Compilation::.
- File: autoconf.info, Node: Canonicalizing, Next: Using System Type, Prev: Specifying Target Triplets, Up: Manual Configuration
- 14.2 Getting the Canonical System Type
- ======================================
- The following macros make the system type available to `configure'
- scripts.
- The variables `build_alias', `host_alias', and `target_alias' are
- always exactly the arguments of `--build', `--host', and `--target'; in
- particular, they are left empty if the user did not use them, even if
- the corresponding `AC_CANONICAL' macro was run. Any configure script
- may use these variables anywhere. These are the variables that should
- be used when in interaction with the user.
- If you need to recognize some special environments based on their
- system type, run the following macros to get canonical system names.
- These variables are not set before the macro call.
- If you use these macros, you must distribute `config.guess' and
- `config.sub' along with your source code. *Note Output::, for
- information about the `AC_CONFIG_AUX_DIR' macro which you can use to
- control in which directory `configure' looks for those scripts.
- -- Macro: AC_CANONICAL_BUILD
- Compute the canonical build-system type variable, `build', and its
- three individual parts `build_cpu', `build_vendor', and `build_os'.
- If `--build' was specified, then `build' is the canonicalization
- of `build_alias' by `config.sub', otherwise it is determined by
- the shell script `config.guess'.
- -- Macro: AC_CANONICAL_HOST
- Compute the canonical host-system type variable, `host', and its
- three individual parts `host_cpu', `host_vendor', and `host_os'.
- If `--host' was specified, then `host' is the canonicalization of
- `host_alias' by `config.sub', otherwise it defaults to `build'.
- -- Macro: AC_CANONICAL_TARGET
- Compute the canonical target-system type variable, `target', and
- its three individual parts `target_cpu', `target_vendor', and
- `target_os'.
- If `--target' was specified, then `target' is the canonicalization
- of `target_alias' by `config.sub', otherwise it defaults to `host'.
- Note that there can be artifacts due to the backward compatibility
- code. *Note Hosts and Cross-Compilation::, for more.
- File: autoconf.info, Node: Using System Type, Prev: Canonicalizing, Up: Manual Configuration
- 14.3 Using the System Type
- ==========================
- In `configure.ac' the system type is generally used by one or more
- `case' statements to select system-specifics. Shell wildcards can be
- used to match a group of system types.
- For example, an extra assembler code object file could be chosen,
- giving access to a CPU cycle counter register. `$(CYCLE_OBJ)' in the
- following would be used in a makefile to add the object to a program or
- library.
- AS_CASE([$host],
- [alpha*-*-*], [CYCLE_OBJ=rpcc.o],
- [i?86-*-*], [CYCLE_OBJ=rdtsc.o],
- [CYCLE_OBJ=""]
- )
- AC_SUBST([CYCLE_OBJ])
- `AC_CONFIG_LINKS' (*note Configuration Links::) is another good way
- to select variant source files, for example optimized code for some
- CPUs. The configured CPU type doesn't always indicate exact CPU types,
- so some runtime capability checks may be necessary too.
- case $host in
- alpha*-*-*) AC_CONFIG_LINKS([dither.c:alpha/dither.c]) ;;
- powerpc*-*-*) AC_CONFIG_LINKS([dither.c:powerpc/dither.c]) ;;
- *-*-*) AC_CONFIG_LINKS([dither.c:generic/dither.c]) ;;
- esac
- The host system type can also be used to find cross-compilation tools
- with `AC_CHECK_TOOL' (*note Generic Programs::).
- The above examples all show `$host', since this is where the code is
- going to run. Only rarely is it necessary to test `$build' (which is
- where the build is being done).
- Whenever you're tempted to use `$host' it's worth considering
- whether some sort of probe would be better. New system types come along
- periodically or previously missing features are added. Well-written
- probes can adapt themselves to such things, but hard-coded lists of
- names can't. Here are some guidelines,
- * Availability of libraries and library functions should always be
- checked by probing.
- * Variant behavior of system calls is best identified with runtime
- tests if possible, but bug workarounds or obscure difficulties
- might have to be driven from `$host'.
- * Assembler code is inevitably highly CPU-specific and is best
- selected according to `$host_cpu'.
- * Assembler variations like underscore prefix on globals or ELF
- versus COFF type directives are however best determined by
- probing, perhaps even examining the compiler output.
- `$target' is for use by a package creating a compiler or similar.
- For ordinary packages it's meaningless and should not be used. It
- indicates what the created compiler should generate code for, if it can
- cross-compile. `$target' generally selects various hard-coded CPU and
- system conventions, since usually the compiler or tools under
- construction themselves determine how the target works.
- File: autoconf.info, Node: Site Configuration, Next: Running configure Scripts, Prev: Manual Configuration, Up: Top
- 15 Site Configuration
- *********************
- `configure' scripts support several kinds of local configuration
- decisions. There are ways for users to specify where external software
- packages are, include or exclude optional features, install programs
- under modified names, and set default values for `configure' options.
- * Menu:
- * Help Formatting:: Customizing `configure --help'
- * External Software:: Working with other optional software
- * Package Options:: Selecting optional features
- * Pretty Help Strings:: Formatting help string
- * Option Checking:: Controlling checking of `configure' options
- * Site Details:: Configuring site details
- * Transforming Names:: Changing program names when installing
- * Site Defaults:: Giving `configure' local defaults
- File: autoconf.info, Node: Help Formatting, Next: External Software, Up: Site Configuration
- 15.1 Controlling Help Output
- ============================
- Users consult `configure --help' to learn of configuration decisions
- specific to your package. By default, `configure' breaks this output
- into sections for each type of option; within each section, help
- strings appear in the order `configure.ac' defines them:
- Optional Features:
- ...
- --enable-bar include bar
- Optional Packages:
- ...
- --with-foo use foo
- -- Macro: AC_PRESERVE_HELP_ORDER
- Request an alternate `--help' format, in which options of all
- types appear together, in the order defined. Call this macro
- before any `AC_ARG_ENABLE' or `AC_ARG_WITH'.
- Optional Features and Packages:
- ...
- --enable-bar include bar
- --with-foo use foo
- File: autoconf.info, Node: External Software, Next: Package Options, Prev: Help Formatting, Up: Site Configuration
- 15.2 Working With External Software
- ===================================
- Some packages require, or can optionally use, other software packages
- that are already installed. The user can give `configure' command line
- options to specify which such external software to use. The options
- have one of these forms:
- --with-PACKAGE[=ARG]
- --without-PACKAGE
- For example, `--with-gnu-ld' means work with the GNU linker instead
- of some other linker. `--with-x' means work with The X Window System.
- The user can give an argument by following the package name with `='
- and the argument. Giving an argument of `no' is for packages that are
- used by default; it says to _not_ use the package. An argument that is
- neither `yes' nor `no' could include a name or number of a version of
- the other package, to specify more precisely which other package this
- program is supposed to work with. If no argument is given, it defaults
- to `yes'. `--without-PACKAGE' is equivalent to `--with-PACKAGE=no'.
- Normally `configure' scripts complain about `--with-PACKAGE' options
- that they do not support. *Note Option Checking::, for details, and
- for how to override the defaults.
- For each external software package that may be used, `configure.ac'
- should call `AC_ARG_WITH' to detect whether the `configure' user asked
- to use it. Whether each package is used or not by default, and which
- arguments are valid, is up to you.
- -- Macro: AC_ARG_WITH (PACKAGE, HELP-STRING, [ACTION-IF-GIVEN],
- [ACTION-IF-NOT-GIVEN])
- If the user gave `configure' the option `--with-PACKAGE' or
- `--without-PACKAGE', run shell commands ACTION-IF-GIVEN. If
- neither option was given, run shell commands ACTION-IF-NOT-GIVEN.
- The name PACKAGE indicates another software package that this
- program should work with. It should consist only of alphanumeric
- characters, dashes, plus signs, and dots.
- The option's argument is available to the shell commands
- ACTION-IF-GIVEN in the shell variable `withval', which is actually
- just the value of the shell variable named `with_PACKAGE', with
- any non-alphanumeric characters in PACKAGE changed into `_'. You
- may use that variable instead, if you wish.
- The argument HELP-STRING is a description of the option that looks
- like this:
- --with-readline support fancy command line editing
- HELP-STRING may be more than one line long, if more detail is
- needed. Just make sure the columns line up in `configure --help'.
- Avoid tabs in the help string. The easiest way to provide the
- proper leading whitespace is to format your HELP-STRING with the
- macro `AS_HELP_STRING' (*note Pretty Help Strings::).
- The following example shows how to use the `AC_ARG_WITH' macro in
- a common situation. You want to let the user decide whether to
- enable support for an external library (e.g., the readline
- library); if the user specified neither `--with-readline' nor
- `--without-readline', you want to enable support for readline only
- if the library is available on the system.
- AC_ARG_WITH([readline],
- [AS_HELP_STRING([--with-readline],
- [support fancy command line editing @<:@default=check@:>@])],
- [],
- [with_readline=check])
- LIBREADLINE=
- AS_IF([test "x$with_readline" != xno],
- [AC_CHECK_LIB([readline], [main],
- [AC_SUBST([LIBREADLINE], ["-lreadline -lncurses"])
- AC_DEFINE([HAVE_LIBREADLINE], [1],
- [Define if you have libreadline])
- ],
- [if test "x$with_readline" != xcheck; then
- AC_MSG_FAILURE(
- [--with-readline was given, but test for readline failed])
- fi
- ], -lncurses)])
- The next example shows how to use `AC_ARG_WITH' to give the user
- the possibility to enable support for the readline library, in
- case it is still experimental and not well tested, and is
- therefore disabled by default.
- AC_ARG_WITH([readline],
- [AS_HELP_STRING([--with-readline],
- [enable experimental support for readline])],
- [],
- [with_readline=no])
- LIBREADLINE=
- AS_IF([test "x$with_readline" != xno],
- [AC_CHECK_LIB([readline], [main],
- [AC_SUBST([LIBREADLINE], ["-lreadline -lncurses"])
- AC_DEFINE([HAVE_LIBREADLINE], [1],
- [Define if you have libreadline])
- ],
- [AC_MSG_FAILURE(
- [--with-readline was given, but test for readline failed])],
- [-lncurses])])
- The last example shows how to use `AC_ARG_WITH' to give the user
- the possibility to disable support for the readline library, given
- that it is an important feature and that it should be enabled by
- default.
- AC_ARG_WITH([readline],
- [AS_HELP_STRING([--without-readline],
- [disable support for readline])],
- [],
- [with_readline=yes])
- LIBREADLINE=
- AS_IF([test "x$with_readline" != xno],
- [AC_CHECK_LIB([readline], [main],
- [AC_SUBST([LIBREADLINE], ["-lreadline -lncurses"])
- AC_DEFINE([HAVE_LIBREADLINE], [1],
- [Define if you have libreadline])
- ],
- [AC_MSG_FAILURE(
- [readline test failed (--without-readline to disable)])],
- [-lncurses])])
- These three examples can be easily adapted to the case where
- `AC_ARG_ENABLE' should be preferred to `AC_ARG_WITH' (see *note
- Package Options::).
- File: autoconf.info, Node: Package Options, Next: Pretty Help Strings, Prev: External Software, Up: Site Configuration
- 15.3 Choosing Package Options
- =============================
- If a software package has optional compile-time features, the user can
- give `configure' command line options to specify whether to compile
- them. The options have one of these forms:
- --enable-FEATURE[=ARG]
- --disable-FEATURE
- These options allow users to choose which optional features to build
- and install. `--enable-FEATURE' options should never make a feature
- behave differently or cause one feature to replace another. They
- should only cause parts of the program to be built rather than left out.
- The user can give an argument by following the feature name with `='
- and the argument. Giving an argument of `no' requests that the feature
- _not_ be made available. A feature with an argument looks like
- `--enable-debug=stabs'. If no argument is given, it defaults to `yes'.
- `--disable-FEATURE' is equivalent to `--enable-FEATURE=no'.
- Normally `configure' scripts complain about `--enable-PACKAGE'
- options that they do not support. *Note Option Checking::, for
- details, and for how to override the defaults.
- For each optional feature, `configure.ac' should call
- `AC_ARG_ENABLE' to detect whether the `configure' user asked to include
- it. Whether each feature is included or not by default, and which
- arguments are valid, is up to you.
- -- Macro: AC_ARG_ENABLE (FEATURE, HELP-STRING, [ACTION-IF-GIVEN],
- [ACTION-IF-NOT-GIVEN])
- If the user gave `configure' the option `--enable-FEATURE' or
- `--disable-FEATURE', run shell commands ACTION-IF-GIVEN. If
- neither option was given, run shell commands ACTION-IF-NOT-GIVEN.
- The name FEATURE indicates an optional user-level facility. It
- should consist only of alphanumeric characters, dashes, plus
- signs, and dots.
- The option's argument is available to the shell commands
- ACTION-IF-GIVEN in the shell variable `enableval', which is
- actually just the value of the shell variable named
- `enable_FEATURE', with any non-alphanumeric characters in FEATURE
- changed into `_'. You may use that variable instead, if you wish.
- The HELP-STRING argument is like that of `AC_ARG_WITH' (*note
- External Software::).
- You should format your HELP-STRING with the macro `AS_HELP_STRING'
- (*note Pretty Help Strings::).
- See the examples suggested with the definition of `AC_ARG_WITH'
- (*note External Software::) to get an idea of possible
- applications of `AC_ARG_ENABLE'.
- File: autoconf.info, Node: Pretty Help Strings, Next: Option Checking, Prev: Package Options, Up: Site Configuration
- 15.4 Making Your Help Strings Look Pretty
- =========================================
- Properly formatting the `help strings' which are used in `AC_ARG_WITH'
- (*note External Software::) and `AC_ARG_ENABLE' (*note Package
- Options::) can be challenging. Specifically, you want your own `help
- strings' to line up in the appropriate columns of `configure --help'
- just like the standard Autoconf `help strings' do. This is the purpose
- of the `AS_HELP_STRING' macro.
- -- Macro: AS_HELP_STRING (LEFT-HAND-SIDE, RIGHT-HAND-SIDE
- [INDENT-COLUMN = `26'], [WRAP-COLUMN = `79'])
- Expands into a help string that looks pretty when the user executes
- `configure --help'. It is typically used in `AC_ARG_WITH' (*note
- External Software::) or `AC_ARG_ENABLE' (*note Package Options::).
- The following example makes this clearer.
- AC_ARG_WITH([foo],
- [AS_HELP_STRING([--with-foo],
- [use foo (default is no)])],
- [use_foo=$withval],
- [use_foo=no])
- Then the last few lines of `configure --help' appear like this:
- --enable and --with options recognized:
- --with-foo use foo (default is no)
- Macro expansion is performed on the first argument. However, the
- second argument of `AS_HELP_STRING' is treated as a whitespace
- separated list of text to be reformatted, and is not subject to
- macro expansion. Since it is not expanded, it should not be
- double quoted. *Note Autoconf Language::, for a more detailed
- explanation.
- The `AS_HELP_STRING' macro is particularly helpful when the
- LEFT-HAND-SIDE and/or RIGHT-HAND-SIDE are composed of macro
- arguments, as shown in the following example. Be aware that
- LEFT-HAND-SIDE may not expand to unbalanced quotes, although
- quadrigraphs can be used.
- AC_DEFUN([MY_ARG_WITH],
- [AC_ARG_WITH(m4_translit([[$1]], [_], [-]),
- [AS_HELP_STRING([--with-m4_translit([$1], [_], [-])],
- [use $1 (default is $2)])],
- [use_[]$1=$withval],
- [use_[]$1=$2])])
- MY_ARG_WITH([a_b], [no])
- Here, the last few lines of `configure --help' will include:
- --enable and --with options recognized:
- --with-a-b use a_b (default is no)
- The parameters INDENT-COLUMN and WRAP-COLUMN were introduced in
- Autoconf 2.62. Generally, they should not be specified; they exist
- for fine-tuning of the wrapping.
- AS_HELP_STRING([--option], [description of option])
- => --option description of option
- AS_HELP_STRING([--option], [description of option], [15], [30])
- => --option description of
- => option
- File: autoconf.info, Node: Option Checking, Next: Site Details, Prev: Pretty Help Strings, Up: Site Configuration
- 15.5 Controlling Checking of `configure' Options
- ================================================
- The `configure' script checks its command-line options against a list
- of known options, like `--help' or `--config-cache'. An unknown option
- ordinarily indicates a mistake by the user and `configure' halts with
- an error. However, by default unknown `--with-PACKAGE' and
- `--enable-FEATURE' options elicit only a warning, to support
- configuring entire source trees.
- Source trees often contain multiple packages with a top-level
- `configure' script that uses the `AC_CONFIG_SUBDIRS' macro (*note
- Subdirectories::). Because the packages generally support different
- `--with-PACKAGE' and `--enable-FEATURE' options, the GNU Coding
- Standards say they must accept unrecognized options without halting.
- Even a warning message is undesirable here, so `AC_CONFIG_SUBDIRS'
- automatically disables the warnings.
- This default behavior may be modified in two ways. First, the
- installer can invoke `configure --disable-option-checking' to disable
- these warnings, or invoke `configure --enable-option-checking=fatal'
- options to turn them into fatal errors, respectively. Second, the
- maintainer can use `AC_DISABLE_OPTION_CHECKING'.
- -- Macro: AC_DISABLE_OPTION_CHECKING
- By default, disable warnings related to any unrecognized
- `--with-PACKAGE' or `--enable-FEATURE' options. This is implied
- by `AC_CONFIG_SUBDIRS'.
- The installer can override this behavior by passing
- `--enable-option-checking' (enable warnings) or
- `--enable-option-checking=fatal' (enable errors) to `configure'.
- File: autoconf.info, Node: Site Details, Next: Transforming Names, Prev: Option Checking, Up: Site Configuration
- 15.6 Configuring Site Details
- =============================
- Some software packages require complex site-specific information. Some
- examples are host names to use for certain services, company names, and
- email addresses to contact. Since some configuration scripts generated
- by Metaconfig ask for such information interactively, people sometimes
- wonder how to get that information in Autoconf-generated configuration
- scripts, which aren't interactive.
- Such site configuration information should be put in a file that is
- edited _only by users_, not by programs. The location of the file can
- either be based on the `prefix' variable, or be a standard location
- such as the user's home directory. It could even be specified by an
- environment variable. The programs should examine that file at
- runtime, rather than at compile time. Runtime configuration is more
- convenient for users and makes the configuration process simpler than
- getting the information while configuring. *Note Variables for
- Installation Directories: (standards)Directory Variables, for more
- information on where to put data files.
- File: autoconf.info, Node: Transforming Names, Next: Site Defaults, Prev: Site Details, Up: Site Configuration
- 15.7 Transforming Program Names When Installing
- ===============================================
- Autoconf supports changing the names of programs when installing them.
- In order to use these transformations, `configure.ac' must call the
- macro `AC_ARG_PROGRAM'.
- -- Macro: AC_ARG_PROGRAM
- Place in output variable `program_transform_name' a sequence of
- `sed' commands for changing the names of installed programs.
- If any of the options described below are given to `configure',
- program names are transformed accordingly. Otherwise, if
- `AC_CANONICAL_TARGET' has been called and a `--target' value is
- given, the target type followed by a dash is used as a prefix.
- Otherwise, no program name transformation is done.
- * Menu:
- * Transformation Options:: `configure' options to transform names
- * Transformation Examples:: Sample uses of transforming names
- * Transformation Rules:: Makefile uses of transforming names
- File: autoconf.info, Node: Transformation Options, Next: Transformation Examples, Up: Transforming Names
- 15.7.1 Transformation Options
- -----------------------------
- You can specify name transformations by giving `configure' these
- command line options:
- `--program-prefix=PREFIX'
- prepend PREFIX to the names;
- `--program-suffix=SUFFIX'
- append SUFFIX to the names;
- `--program-transform-name=EXPRESSION'
- perform `sed' substitution EXPRESSION on the names.
- File: autoconf.info, Node: Transformation Examples, Next: Transformation Rules, Prev: Transformation Options, Up: Transforming Names
- 15.7.2 Transformation Examples
- ------------------------------
- These transformations are useful with programs that can be part of a
- cross-compilation development environment. For example, a
- cross-assembler running on a Sun 4 configured with
- `--target=i960-vxworks' is normally installed as `i960-vxworks-as',
- rather than `as', which could be confused with a native Sun 4 assembler.
- You can force a program name to begin with `g', if you don't want
- GNU programs installed on your system to shadow other programs with the
- same name. For example, if you configure GNU `diff' with
- `--program-prefix=g', then when you run `make install' it is installed
- as `/usr/local/bin/gdiff'.
- As a more sophisticated example, you could use
- --program-transform-name='s/^/g/; s/^gg/g/; s/^gless/less/'
- to prepend `g' to most of the program names in a source tree,
- excepting those like `gdb' that already have one and those like `less'
- and `lesskey' that aren't GNU programs. (That is assuming that you
- have a source tree containing those programs that is set up to use this
- feature.)
- One way to install multiple versions of some programs simultaneously
- is to append a version number to the name of one or both. For example,
- if you want to keep Autoconf version 1 around for awhile, you can
- configure Autoconf version 2 using `--program-suffix=2' to install the
- programs as `/usr/local/bin/autoconf2', `/usr/local/bin/autoheader2',
- etc. Nevertheless, pay attention that only the binaries are renamed,
- therefore you'd have problems with the library files which might
- overlap.
- File: autoconf.info, Node: Transformation Rules, Prev: Transformation Examples, Up: Transforming Names
- 15.7.3 Transformation Rules
- ---------------------------
- Here is how to use the variable `program_transform_name' in a
- `Makefile.in':
- PROGRAMS = cp ls rm
- transform = @program_transform_name@
- install:
- for p in $(PROGRAMS); do \
- $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p | \
- sed '$(transform)'`; \
- done
- uninstall:
- for p in $(PROGRAMS); do \
- rm -f $(DESTDIR)$(bindir)/`echo $$p | sed '$(transform)'`; \
- done
- It is guaranteed that `program_transform_name' is never empty, and
- that there are no useless separators. Therefore you may safely embed
- `program_transform_name' within a sed program using `;':
- transform = @program_transform_name@
- transform_exe = s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/
- Whether to do the transformations on documentation files (Texinfo or
- `man') is a tricky question; there seems to be no perfect answer, due
- to the several reasons for name transforming. Documentation is not
- usually particular to a specific architecture, and Texinfo files do not
- conflict with system documentation. But they might conflict with
- earlier versions of the same files, and `man' pages sometimes do
- conflict with system documentation. As a compromise, it is probably
- best to do name transformations on `man' pages but not on Texinfo
- manuals.
- File: autoconf.info, Node: Site Defaults, Prev: Transforming Names, Up: Site Configuration
- 15.8 Setting Site Defaults
- ==========================
- Autoconf-generated `configure' scripts allow your site to provide
- default values for some configuration values. You do this by creating
- site- and system-wide initialization files.
- If the environment variable `CONFIG_SITE' is set, `configure' uses
- its value as the name of a shell script to read; it is recommended that
- this be an absolute file name. Otherwise, it reads the shell script
- `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site'
- if it exists. Thus, settings in machine-specific files override those
- in machine-independent ones in case of conflict.
- Site files can be arbitrary shell scripts, but only certain kinds of
- code are really appropriate to be in them. Because `configure' reads
- any cache file after it has read any site files, a site file can define
- a default cache file to be shared between all Autoconf-generated
- `configure' scripts run on that system (*note Cache Files::). If you
- set a default cache file in a site file, it is a good idea to also set
- the output variable `CC' in that site file, because the cache file is
- only valid for a particular compiler, but many systems have several
- available.
- You can examine or override the value set by a command line option to
- `configure' in a site file; options set shell variables that have the
- same names as the options, with any dashes turned into underscores.
- The exceptions are that `--without-' and `--disable-' options are like
- giving the corresponding `--with-' or `--enable-' option and the value
- `no'. Thus, `--cache-file=localcache' sets the variable `cache_file'
- to the value `localcache'; `--enable-warnings=no' or
- `--disable-warnings' sets the variable `enable_warnings' to the value
- `no'; `--prefix=/usr' sets the variable `prefix' to the value `/usr';
- etc.
- Site files are also good places to set default values for other
- output variables, such as `CFLAGS', if you need to give them non-default
- values: anything you would normally do, repetitively, on the command
- line. If you use non-default values for PREFIX or EXEC_PREFIX
- (wherever you locate the site file), you can set them in the site file
- if you specify it with the `CONFIG_SITE' environment variable.
- You can set some cache values in the site file itself. Doing this is
- useful if you are cross-compiling, where it is impossible to check
- features that require running a test program. You could "prime the
- cache" by setting those values correctly for that system in
- `PREFIX/etc/config.site'. To find out the names of the cache variables
- you need to set, see the documentation of the respective Autoconf
- macro. If the variables or their semantics are undocumented, you may
- need to look for shell variables with `_cv_' in their names in the
- affected `configure' scripts, or in the Autoconf M4 source code for
- those macros; but in that case, their name or semantics may change in a
- future Autoconf version.
- The cache file is careful to not override any variables set in the
- site files. Similarly, you should not override command-line options in
- the site files. Your code should check that variables such as `prefix'
- and `cache_file' have their default values (as set near the top of
- `configure') before changing them.
- Here is a sample file `/usr/share/local/gnu/share/config.site'. The
- command `configure --prefix=/usr/share/local/gnu' would read this file
- (if `CONFIG_SITE' is not set to a different file).
- # /usr/share/local/gnu/share/config.site for configure
- #
- # Change some defaults.
- test "$prefix" = NONE && prefix=/usr/share/local/gnu
- test "$exec_prefix" = NONE && exec_prefix=/usr/local/gnu
- test "$sharedstatedir" = '${prefix}/com' && sharedstatedir=/var
- test "$localstatedir" = '${prefix}/var' && localstatedir=/var
- # Give Autoconf 2.x generated configure scripts a shared default
- # cache file for feature test results, architecture-specific.
- if test "$cache_file" = /dev/null; then
- cache_file="$prefix/var/config.cache"
- # A cache file is only valid for one C compiler.
- CC=gcc
- fi
- Another use of `config.site' is for priming the directory variables
- in a manner consistent with the Filesystem Hierarchy Standard (FHS).
- Once the following file is installed at `/usr/share/config.site', a
- user can execute simply `./configure --prefix=/usr' to get all the
- directories chosen in the locations recommended by FHS.
- # /usr/share/config.site for FHS defaults when installing below /usr,
- # and the respective settings were not changed on the command line.
- if test "$prefix" = /usr; then
- test "$sysconfdir" = '${prefix}/etc' && sysconfdir=/etc
- test "$sharedstatedir" = '${prefix}/com' && sharedstatedir=/var
- test "$localstatedir" = '${prefix}/var' && localstatedir=/var
- fi
- Likewise, on platforms where 64-bit libraries are built by default,
- then installed in `/usr/local/lib64' instead of `/usr/local/lib', it is
- appropriate to install `/usr/local/share/config.site':
- # /usr/local/share/config.site for platforms that prefer
- # the directory /usr/local/lib64 over /usr/local/lib.
- test "$libdir" = '${exec_prefix}/lib' && libdir='${exec_prefix}/lib64'
- File: autoconf.info, Node: Running configure Scripts, Next: config.status Invocation, Prev: Site Configuration, Up: Top
- 16 Running `configure' Scripts
- ******************************
- Below are instructions on how to configure a package that uses a
- `configure' script, suitable for inclusion as an `INSTALL' file in the
- package. A plain-text version of `INSTALL' which you may use comes
- with Autoconf.
- * Menu:
- * Basic Installation:: Instructions for typical cases
- * Compilers and Options:: Selecting compilers and optimization
- * Multiple Architectures:: Compiling for multiple architectures at once
- * Installation Names:: Installing in different directories
- * Optional Features:: Selecting optional features
- * Particular Systems:: Particular systems
- * System Type:: Specifying the system type
- * Sharing Defaults:: Setting site-wide defaults for `configure'
- * Defining Variables:: Specifying the compiler etc.
- * configure Invocation:: Changing how `configure' runs
- File: autoconf.info, Node: Basic Installation, Next: Compilers and Options, Up: Running configure Scripts
- 16.1 Basic Installation
- =======================
- Briefly, the shell commands `./configure; make; make install' should
- configure, build, and install this package. The following
- more-detailed instructions are generic; see the `README' file for
- instructions specific to this package. More recommendations for GNU
- packages can be found in *note Makefile Conventions:
- (standards)Makefile Conventions.
- The `configure' shell script attempts to guess correct values for
- various system-dependent variables used during compilation. It uses
- those values to create a `Makefile' in each directory of the package.
- It may also create one or more `.h' files containing system-dependent
- definitions. Finally, it creates a shell script `config.status' that
- you can run in the future to recreate the current configuration, and a
- file `config.log' containing compiler output (useful mainly for
- debugging `configure').
- It can also use an optional file (typically called `config.cache'
- and enabled with `--cache-file=config.cache' or simply `-C') that saves
- the results of its tests to speed up reconfiguring. Caching is
- disabled by default to prevent problems with accidental use of stale
- cache files.
- If you need to do unusual things to compile the package, please try
- to figure out how `configure' could check whether to do them, and mail
- diffs or instructions to the address given in the `README' so they can
- be considered for the next release. If you are using the cache, and at
- some point `config.cache' contains results you don't want to keep, you
- may remove or edit it.
- The file `configure.ac' (or `configure.in') is used to create
- `configure' by a program called `autoconf'. You need `configure.ac' if
- you want to change it or regenerate `configure' using a newer version
- of `autoconf'.
- The simplest way to compile this package is:
- 1. `cd' to the directory containing the package's source code and type
- `./configure' to configure the package for your system.
- Running `configure' might take a while. While running, it prints
- some messages telling which features it is checking for.
- 2. Type `make' to compile the package.
- 3. Optionally, type `make check' to run any self-tests that come with
- the package, generally using the just-built uninstalled binaries.
- 4. Type `make install' to install the programs and any data files and
- documentation. When installing into a prefix owned by root, it is
- recommended that the package be configured and built as a regular
- user, and only the `make install' phase executed with root
- privileges.
- 5. Optionally, type `make installcheck' to repeat any self-tests, but
- this time using the binaries in their final installed location.
- This target does not install anything. Running this target as a
- regular user, particularly if the prior `make install' required
- root privileges, verifies that the installation completed
- correctly.
- 6. You can remove the program binaries and object files from the
- source code directory by typing `make clean'. To also remove the
- files that `configure' created (so you can compile the package for
- a different kind of computer), type `make distclean'. There is
- also a `make maintainer-clean' target, but that is intended mainly
- for the package's developers. If you use it, you may have to get
- all sorts of other programs in order to regenerate files that came
- with the distribution.
- 7. Often, you can also type `make uninstall' to remove the installed
- files again. In practice, not all packages have tested that
- uninstallation works correctly, even though it is required by the
- GNU Coding Standards.
- 8. Some packages, particularly those that use Automake, provide `make
- distcheck', which can by used by developers to test that all other
- targets like `make install' and `make uninstall' work correctly.
- This target is generally not run by end users.
- File: autoconf.info, Node: Compilers and Options, Next: Multiple Architectures, Prev: Basic Installation, Up: Running configure Scripts
- 16.2 Compilers and Options
- ==========================
- Some systems require unusual options for compilation or linking that the
- `configure' script does not know about. Run `./configure --help' for
- details on some of the pertinent environment variables.
- You can give `configure' initial values for configuration parameters
- by setting variables in the command line or in the environment. Here
- is an example:
- ./configure CC=c99 CFLAGS=-g LIBS=-lposix
- *Note Defining Variables::, for more details.
- File: autoconf.info, Node: Multiple Architectures, Next: Installation Names, Prev: Compilers and Options, Up: Running configure Scripts
- 16.3 Compiling For Multiple Architectures
- =========================================
- You can compile the package for more than one kind of computer at the
- same time, by placing the object files for each architecture in their
- own directory. To do this, you can use GNU `make'. `cd' to the
- directory where you want the object files and executables to go and run
- the `configure' script. `configure' automatically checks for the
- source code in the directory that `configure' is in and in `..'. This
- is known as a "VPATH" build.
- With a non-GNU `make', it is safer to compile the package for one
- architecture at a time in the source code directory. After you have
- installed the package for one architecture, use `make distclean' before
- reconfiguring for another architecture.
- On MacOS X 10.5 and later systems, you can create libraries and
- executables that work on multiple system types--known as "fat" or
- "universal" binaries--by specifying multiple `-arch' options to the
- compiler but only a single `-arch' option to the preprocessor. Like
- this:
- ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
- CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
- CPP="gcc -E" CXXCPP="g++ -E"
- This is not guaranteed to produce working output in all cases, you
- may have to build one architecture at a time and combine the results
- using the `lipo' tool if you have problems.
- File: autoconf.info, Node: Installation Names, Next: Optional Features, Prev: Multiple Architectures, Up: Running configure Scripts
- 16.4 Installation Names
- =======================
- By default, `make install' installs the package's commands under
- `/usr/local/bin', include files under `/usr/local/include', etc. You
- can specify an installation prefix other than `/usr/local' by giving
- `configure' the option `--prefix=PREFIX', where PREFIX must be an
- absolute file name.
- You can specify separate installation prefixes for
- architecture-specific files and architecture-independent files. If you
- pass the option `--exec-prefix=PREFIX' to `configure', the package uses
- PREFIX as the prefix for installing programs and libraries.
- Documentation and other data files still use the regular prefix.
- In addition, if you use an unusual directory layout you can give
- options like `--bindir=DIR' to specify different values for particular
- kinds of files. Run `configure --help' for a list of the directories
- you can set and what kinds of files go in them. In general, the
- default for these options is expressed in terms of `${prefix}', so that
- specifying just `--prefix' will affect all of the other directory
- specifications that were not explicitly provided.
- The most portable way to affect installation locations is to pass the
- correct locations to `configure'; however, many packages provide one or
- both of the following shortcuts of passing variable assignments to the
- `make install' command line to change installation locations without
- having to reconfigure or recompile.
- The first method involves providing an override variable for each
- affected directory. For example, `make install
- prefix=/alternate/directory' will choose an alternate location for all
- directory configuration variables that were expressed in terms of
- `${prefix}'. Any directories that were specified during `configure',
- but not in terms of `${prefix}', must each be overridden at install
- time for the entire installation to be relocated. The approach of
- makefile variable overrides for each directory variable is required by
- the GNU Coding Standards, and ideally causes no recompilation.
- However, some platforms have known limitations with the semantics of
- shared libraries that end up requiring recompilation when using this
- method, particularly noticeable in packages that use GNU Libtool.
- The second method involves providing the `DESTDIR' variable. For
- example, `make install DESTDIR=/alternate/directory' will prepend
- `/alternate/directory' before all installation names. The approach of
- `DESTDIR' overrides is not required by the GNU Coding Standards, and
- does not work on platforms that have drive letters. On the other hand,
- it does better at avoiding recompilation issues, and works well even
- when some directory options were not specified in terms of `${prefix}'
- at `configure' time.
- File: autoconf.info, Node: Optional Features, Next: Particular Systems, Prev: Installation Names, Up: Running configure Scripts
- 16.5 Optional Features
- ======================
- If the package supports it, you can cause programs to be installed with
- an extra prefix or suffix on their names by giving `configure' the
- option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
- Some packages pay attention to `--enable-FEATURE' options to
- `configure', where FEATURE indicates an optional part of the package.
- They may also pay attention to `--with-PACKAGE' options, where PACKAGE
- is something like `gnu-as' or `x' (for the X Window System). The
- `README' should mention any `--enable-' and `--with-' options that the
- package recognizes.
- For packages that use the X Window System, `configure' can usually
- find the X include and library files automatically, but if it doesn't,
- you can use the `configure' options `--x-includes=DIR' and
- `--x-libraries=DIR' to specify their locations.
- Some packages offer the ability to configure how verbose the
- execution of `make' will be. For these packages, running `./configure
- --enable-silent-rules' sets the default to minimal output, which can be
- overridden with `make V=1'; while running `./configure
- --disable-silent-rules' sets the default to verbose, which can be
- overridden with `make V=0'.
- File: autoconf.info, Node: Particular Systems, Next: System Type, Prev: Optional Features, Up: Running configure Scripts
- 16.6 Particular systems
- =======================
- On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is
- not installed, it is recommended to use the following options in order
- to use an ANSI C compiler:
- ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
- and if that doesn't work, install pre-built binaries of GCC for HP-UX.
- HP-UX `make' updates targets which have the same time stamps as
- their prerequisites, which makes it generally unusable when shipped
- generated files such as `configure' are involved. Use GNU `make'
- instead.
- On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
- parse its `<wchar.h>' header file. The option `-nodtk' can be used as
- a workaround. If GNU CC is not installed, it is therefore recommended
- to try
- ./configure CC="cc"
- and if that doesn't work, try
- ./configure CC="cc -nodtk"
- On Solaris, don't put `/usr/ucb' early in your `PATH'. This
- directory contains several dysfunctional programs; working variants of
- these programs are available in `/usr/bin'. So, if you need `/usr/ucb'
- in your `PATH', put it _after_ `/usr/bin'.
- On Haiku, software installed for all users goes in `/boot/common',
- not `/usr/local'. It is recommended to use the following options:
- ./configure --prefix=/boot/common
- File: autoconf.info, Node: System Type, Next: Sharing Defaults, Prev: Particular Systems, Up: Running configure Scripts
- 16.7 Specifying the System Type
- ===============================
- There may be some features `configure' cannot figure out automatically,
- but needs to determine by the type of machine the package will run on.
- Usually, assuming the package is built to be run on the _same_
- architectures, `configure' can figure that out, but if it prints a
- message saying it cannot guess the machine type, give it the
- `--build=TYPE' option. TYPE can either be a short name for the system
- type, such as `sun4', or a canonical name which has the form:
- CPU-COMPANY-SYSTEM
- where SYSTEM can have one of these forms:
- OS
- KERNEL-OS
- See the file `config.sub' for the possible values of each field. If
- `config.sub' isn't included in this package, then this package doesn't
- need to know the machine type.
- If you are _building_ compiler tools for cross-compiling, you should
- use the option `--target=TYPE' to select the type of system they will
- produce code for.
- If you want to _use_ a cross compiler, that generates code for a
- platform different from the build platform, you should specify the
- "host" platform (i.e., that on which the generated programs will
- eventually be run) with `--host=TYPE'.
- File: autoconf.info, Node: Sharing Defaults, Next: Defining Variables, Prev: System Type, Up: Running configure Scripts
- 16.8 Sharing Defaults
- =====================
- If you want to set default values for `configure' scripts to share, you
- can create a site shell script called `config.site' that gives default
- values for variables like `CC', `cache_file', and `prefix'.
- `configure' looks for `PREFIX/share/config.site' if it exists, then
- `PREFIX/etc/config.site' if it exists. Or, you can set the
- `CONFIG_SITE' environment variable to the location of the site script.
- A warning: not all `configure' scripts look for a site script.
- File: autoconf.info, Node: Defining Variables, Next: configure Invocation, Prev: Sharing Defaults, Up: Running configure Scripts
- 16.9 Defining Variables
- =======================
- Variables not defined in a site shell script can be set in the
- environment passed to `configure'. However, some packages may run
- configure again during the build, and the customized values of these
- variables may be lost. In order to avoid this problem, you should set
- them in the `configure' command line, using `VAR=value'. For example:
- ./configure CC=/usr/local2/bin/gcc
- causes the specified `gcc' to be used as the C compiler (unless it is
- overridden in the site shell script).
- Unfortunately, this technique does not work for `CONFIG_SHELL' due to
- an Autoconf limitation. Until the limitation is lifted, you can use
- this workaround:
- CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash
- File: autoconf.info, Node: configure Invocation, Prev: Defining Variables, Up: Running configure Scripts
- 16.10 `configure' Invocation
- ============================
- `configure' recognizes the following options to control how it operates.
- `--help'
- `-h'
- Print a summary of all of the options to `configure', and exit.
- `--help=short'
- `--help=recursive'
- Print a summary of the options unique to this package's
- `configure', and exit. The `short' variant lists options used
- only in the top level, while the `recursive' variant lists options
- also present in any nested packages.
- `--version'
- `-V'
- Print the version of Autoconf used to generate the `configure'
- script, and exit.
- `--cache-file=FILE'
- Enable the cache: use and save the results of the tests in FILE,
- traditionally `config.cache'. FILE defaults to `/dev/null' to
- disable caching.
- `--config-cache'
- `-C'
- Alias for `--cache-file=config.cache'.
- `--quiet'
- `--silent'
- `-q'
- Do not print messages saying which checks are being made. To
- suppress all normal output, redirect it to `/dev/null' (any error
- messages will still be shown).
- `--srcdir=DIR'
- Look for the package's source code in directory DIR. Usually
- `configure' can determine that directory automatically.
- `--prefix=DIR'
- Use DIR as the installation prefix. *note Installation Names::
- for more details, including other options available for fine-tuning
- the installation locations.
- `--no-create'
- `-n'
- Run the configure checks, but stop before creating any output
- files.
- `configure' also accepts some other, not widely useful, options. Run
- `configure --help' for more details.
- File: autoconf.info, Node: config.status Invocation, Next: Obsolete Constructs, Prev: Running configure Scripts, Up: Top
- 17 config.status Invocation
- ***************************
- The `configure' script creates a file named `config.status', which
- actually configures, "instantiates", the template files. It also
- records the configuration options that were specified when the package
- was last configured in case reconfiguring is needed.
- Synopsis:
- ./config.status [OPTION]... [TAG]...
- It configures each TAG; if none are specified, all the templates are
- instantiated. A TAG refers to a file or other tag associated with a
- configuration action, as specified by an `AC_CONFIG_ITEMS' macro (*note
- Configuration Actions::). The files must be specified without their
- dependencies, as in
- ./config.status foobar
- not
- ./config.status foobar:foo.in:bar.in
- The supported options are:
- `--help'
- `-h'
- Print a summary of the command line options, the list of the
- template files, and exit.
- `--version'
- `-V'
- Print the version number of Autoconf and the configuration
- settings, and exit.
- `--config'
- Print the configuration settings in reusable way, quoted for the
- shell, and exit. For example, for a debugging build that
- otherwise reuses the configuration from a different build
- directory BUILD-DIR of a package in SRC-DIR, you could use the
- following:
- args=`BUILD-DIR/config.status --config`
- eval SRC-DIR/configure "$args" CFLAGS=-g --srcdir=SRC-DIR
- Note that it may be necessary to override a `--srcdir' setting
- that was saved in the configuration, if the arguments are used in a
- different build directory.
- `--silent'
- `--quiet'
- `-q'
- Do not print progress messages.
- `--debug'
- `-d'
- Don't remove the temporary files.
- `--file=FILE[:TEMPLATE]'
- Require that FILE be instantiated as if
- `AC_CONFIG_FILES(FILE:TEMPLATE)' was used. Both FILE and TEMPLATE
- may be `-' in which case the standard output and/or standard
- input, respectively, is used. If a TEMPLATE file name is
- relative, it is first looked for in the build tree, and then in
- the source tree. *Note Configuration Actions::, for more details.
- This option and the following ones provide one way for separately
- distributed packages to share the values computed by `configure'.
- Doing so can be useful if some of the packages need a superset of
- the features that one of them, perhaps a common library, does.
- These options allow a `config.status' file to create files other
- than the ones that its `configure.ac' specifies, so it can be used
- for a different package, or for extracting a subset of values.
- For example,
- echo '@CC@' | ./config.status --file=-
- provides the value of `@CC@' on standard output.
- `--header=FILE[:TEMPLATE]'
- Same as `--file' above, but with `AC_CONFIG_HEADERS'.
- `--recheck'
- Ask `config.status' to update itself and exit (no instantiation).
- This option is useful if you change `configure', so that the
- results of some tests might be different from the previous run.
- The `--recheck' option reruns `configure' with the same arguments
- you used before, plus the `--no-create' option, which prevents
- `configure' from running `config.status' and creating `Makefile'
- and other files, and the `--no-recursion' option, which prevents
- `configure' from running other `configure' scripts in
- subdirectories. (This is so other Make rules can run
- `config.status' when it changes; *note Automatic Remaking::, for
- an example).
- `config.status' checks several optional environment variables that
- can alter its behavior:
- -- Variable: CONFIG_SHELL
- The shell with which to run `configure'. It must be
- Bourne-compatible, and the absolute name of the shell should be
- passed. The default is a shell that supports `LINENO' if
- available, and `/bin/sh' otherwise.
- -- Variable: CONFIG_STATUS
- The file name to use for the shell script that records the
- configuration. The default is `./config.status'. This variable is
- useful when one package uses parts of another and the `configure'
- scripts shouldn't be merged because they are maintained separately.
- You can use `./config.status' in your makefiles. For example, in
- the dependencies given above (*note Automatic Remaking::),
- `config.status' is run twice when `configure.ac' has changed. If that
- bothers you, you can make each run only regenerate the files for that
- rule:
- config.h: stamp-h
- stamp-h: config.h.in config.status
- ./config.status config.h
- echo > stamp-h
- Makefile: Makefile.in config.status
- ./config.status Makefile
- The calling convention of `config.status' has changed; see *note
- Obsolete config.status Use::, for details.
- File: autoconf.info, Node: Obsolete Constructs, Next: Using Autotest, Prev: config.status Invocation, Up: Top
- 18 Obsolete Constructs
- **********************
- Autoconf changes, and throughout the years some constructs have been
- obsoleted. Most of the changes involve the macros, but in some cases
- the tools themselves, or even some concepts, are now considered
- obsolete.
- You may completely skip this chapter if you are new to Autoconf. Its
- intention is mainly to help maintainers updating their packages by
- understanding how to move to more modern constructs.
- * Menu:
- * Obsolete config.status Use:: Obsolete convention for `config.status'
- * acconfig Header:: Additional entries in `config.h.in'
- * autoupdate Invocation:: Automatic update of `configure.ac'
- * Obsolete Macros:: Backward compatibility macros
- * Autoconf 1:: Tips for upgrading your files
- * Autoconf 2.13:: Some fresher tips
- File: autoconf.info, Node: Obsolete config.status Use, Next: acconfig Header, Up: Obsolete Constructs
- 18.1 Obsolete `config.status' Invocation
- ========================================
- `config.status' now supports arguments to specify the files to
- instantiate; see *note config.status Invocation::, for more details.
- Before, environment variables had to be used.
- -- Variable: CONFIG_COMMANDS
- The tags of the commands to execute. The default is the arguments
- given to `AC_OUTPUT' and `AC_CONFIG_COMMANDS' in `configure.ac'.
- -- Variable: CONFIG_FILES
- The files in which to perform `@VARIABLE@' substitutions. The
- default is the arguments given to `AC_OUTPUT' and
- `AC_CONFIG_FILES' in `configure.ac'.
- -- Variable: CONFIG_HEADERS
- The files in which to substitute C `#define' statements. The
- default is the arguments given to `AC_CONFIG_HEADERS'; if that
- macro was not called, `config.status' ignores this variable.
- -- Variable: CONFIG_LINKS
- The symbolic links to establish. The default is the arguments
- given to `AC_CONFIG_LINKS'; if that macro was not called,
- `config.status' ignores this variable.
- In *note config.status Invocation::, using this old interface, the
- example would be:
- config.h: stamp-h
- stamp-h: config.h.in config.status
- CONFIG_COMMANDS= CONFIG_LINKS= CONFIG_FILES= \
- CONFIG_HEADERS=config.h ./config.status
- echo > stamp-h
- Makefile: Makefile.in config.status
- CONFIG_COMMANDS= CONFIG_LINKS= CONFIG_HEADERS= \
- CONFIG_FILES=Makefile ./config.status
- (If `configure.ac' does not call `AC_CONFIG_HEADERS', there is no need
- to set `CONFIG_HEADERS' in the `make' rules. Equally for
- `CONFIG_COMMANDS', etc.)
- File: autoconf.info, Node: acconfig Header, Next: autoupdate Invocation, Prev: Obsolete config.status Use, Up: Obsolete Constructs
- 18.2 `acconfig.h'
- =================
- In order to produce `config.h.in', `autoheader' needs to build or to
- find templates for each symbol. Modern releases of Autoconf use
- `AH_VERBATIM' and `AH_TEMPLATE' (*note Autoheader Macros::), but in
- older releases a file, `acconfig.h', contained the list of needed
- templates. `autoheader' copied comments and `#define' and `#undef'
- statements from `acconfig.h' in the current directory, if present.
- This file used to be mandatory if you `AC_DEFINE' any additional
- symbols.
- Modern releases of Autoconf also provide `AH_TOP' and `AH_BOTTOM' if
- you need to prepend/append some information to `config.h.in'. Ancient
- versions of Autoconf had a similar feature: if `./acconfig.h' contains
- the string `@TOP@', `autoheader' copies the lines before the line
- containing `@TOP@' into the top of the file that it generates.
- Similarly, if `./acconfig.h' contains the string `@BOTTOM@',
- `autoheader' copies the lines after that line to the end of the file it
- generates. Either or both of those strings may be omitted. An even
- older alternate way to produce the same effect in ancient versions of
- Autoconf is to create the files `FILE.top' (typically `config.h.top')
- and/or `FILE.bot' in the current directory. If they exist,
- `autoheader' copies them to the beginning and end, respectively, of its
- output.
- In former versions of Autoconf, the files used in preparing a
- software package for distribution were:
- configure.ac --. .------> autoconf* -----> configure
- +---+
- [aclocal.m4] --+ `---.
- [acsite.m4] ---' |
- +--> [autoheader*] -> [config.h.in]
- [acconfig.h] ----. |
- +-----'
- [config.h.top] --+
- [config.h.bot] --'
- Using only the `AH_' macros, `configure.ac' should be
- self-contained, and should not depend upon `acconfig.h' etc.
- File: autoconf.info, Node: autoupdate Invocation, Next: Obsolete Macros, Prev: acconfig Header, Up: Obsolete Constructs
- 18.3 Using `autoupdate' to Modernize `configure.ac'
- ===================================================
- The `autoupdate' program updates a `configure.ac' file that calls
- Autoconf macros by their old names to use the current macro names. In
- version 2 of Autoconf, most of the macros were renamed to use a more
- uniform and descriptive naming scheme. *Note Macro Names::, for a
- description of the new scheme. Although the old names still work
- (*note Obsolete Macros::, for a list of the old macros and the
- corresponding new names), you can make your `configure.ac' files more
- readable and make it easier to use the current Autoconf documentation
- if you update them to use the new macro names.
- If given no arguments, `autoupdate' updates `configure.ac', backing
- up the original version with the suffix `~' (or the value of the
- environment variable `SIMPLE_BACKUP_SUFFIX', if that is set). If you
- give `autoupdate' an argument, it reads that file instead of
- `configure.ac' and writes the updated file to the standard output.
- `autoupdate' accepts the following options:
- `--help'
- `-h'
- Print a summary of the command line options and exit.
- `--version'
- `-V'
- Print the version number of Autoconf and exit.
- `--verbose'
- `-v'
- Report processing steps.
- `--debug'
- `-d'
- Don't remove the temporary files.
- `--force'
- `-f'
- Force the update even if the file has not changed. Disregard the
- cache.
- `--include=DIR'
- `-I DIR'
- Also look for input files in DIR. Multiple invocations accumulate.
- Directories are browsed from last to first.
- `--prepend-include=DIR'
- `-B DIR'
- Prepend directory DIR to the search path. This is used to include
- the language-specific files before any third-party macros.
- File: autoconf.info, Node: Obsolete Macros, Next: Autoconf 1, Prev: autoupdate Invocation, Up: Obsolete Constructs
- 18.4 Obsolete Macros
- ====================
- Several macros are obsoleted in Autoconf, for various reasons (typically
- they failed to quote properly, couldn't be extended for more recent
- issues, etc.). They are still supported, but deprecated: their use
- should be avoided.
- During the jump from Autoconf version 1 to version 2, most of the
- macros were renamed to use a more uniform and descriptive naming scheme,
- but their signature did not change. *Note Macro Names::, for a
- description of the new naming scheme. Below, if there is just the
- mapping from old names to new names for these macros, the reader is
- invited to refer to the definition of the new macro for the signature
- and the description.
- -- Macro: AC_AIX
- This macro is a platform-specific subset of
- `AC_USE_SYSTEM_EXTENSIONS' (*note AC_USE_SYSTEM_EXTENSIONS::).
- -- Macro: AC_ALLOCA
- Replaced by `AC_FUNC_ALLOCA' (*note AC_FUNC_ALLOCA::).
- -- Macro: AC_ARG_ARRAY
- Removed because of limited usefulness.
- -- Macro: AC_C_CROSS
- This macro is obsolete; it does nothing.
- -- Macro: AC_C_LONG_DOUBLE
- If the C compiler supports a working `long double' type with more
- range or precision than the `double' type, define
- `HAVE_LONG_DOUBLE'.
- You should use `AC_TYPE_LONG_DOUBLE' or
- `AC_TYPE_LONG_DOUBLE_WIDER' instead. *Note Particular Types::.
- -- Macro: AC_CANONICAL_SYSTEM
- Determine the system type and set output variables to the names of
- the canonical system types. *Note Canonicalizing::, for details
- about the variables this macro sets.
- The user is encouraged to use either `AC_CANONICAL_BUILD', or
- `AC_CANONICAL_HOST', or `AC_CANONICAL_TARGET', depending on the
- needs. Using `AC_CANONICAL_TARGET' is enough to run the two other
- macros (*note Canonicalizing::).
- -- Macro: AC_CHAR_UNSIGNED
- Replaced by `AC_C_CHAR_UNSIGNED' (*note AC_C_CHAR_UNSIGNED::).
- -- Macro: AC_CHECK_TYPE (TYPE, DEFAULT)
- Autoconf, up to 2.13, used to provide this version of
- `AC_CHECK_TYPE', deprecated because of its flaws. First, although
- it is a member of the `CHECK' clan, it does more than just
- checking. Secondly, missing types are defined using `#define',
- not `typedef', and this can lead to problems in the case of
- pointer types.
- This use of `AC_CHECK_TYPE' is obsolete and discouraged; see *note
- Generic Types::, for the description of the current macro.
- If the type TYPE is not defined, define it to be the C (or C++)
- builtin type DEFAULT, e.g., `short int' or `unsigned int'.
- This macro is equivalent to:
- AC_CHECK_TYPE([TYPE], [],
- [AC_DEFINE_UNQUOTED([TYPE], [DEFAULT],
- [Define to `DEFAULT'
- if <sys/types.h> does not define.])])
- In order to keep backward compatibility, the two versions of
- `AC_CHECK_TYPE' are implemented, selected using these heuristics:
- 1. If there are three or four arguments, the modern version is
- used.
- 2. If the second argument appears to be a C or C++ type, then the
- obsolete version is used. This happens if the argument is a
- C or C++ _builtin_ type or a C identifier ending in `_t',
- optionally followed by one of `[(* ' and then by a string of
- zero or more characters taken from the set `[]()* _a-zA-Z0-9'.
- 3. If the second argument is spelled with the alphabet of valid
- C and C++ types, the user is warned and the modern version is
- used.
- 4. Otherwise, the modern version is used.
- You are encouraged either to use a valid builtin type, or to use
- the equivalent modern code (see above), or better yet, to use
- `AC_CHECK_TYPES' together with
- #ifndef HAVE_LOFF_T
- typedef loff_t off_t;
- #endif
- -- Macro: AC_CHECKING (FEATURE-DESCRIPTION)
- Same as
- AC_MSG_NOTICE([checking FEATURE-DESCRIPTION...]
- *Note AC_MSG_NOTICE::.
- -- Macro: AC_COMPILE_CHECK (ECHO-TEXT, INCLUDES, FUNCTION-BODY,
- ACTION-IF-TRUE, [ACTION-IF-FALSE])
- This is an obsolete version of `AC_TRY_COMPILE' itself replaced by
- `AC_COMPILE_IFELSE' (*note Running the Compiler::), with the
- addition that it prints `checking for ECHO-TEXT' to the standard
- output first, if ECHO-TEXT is non-empty. Use `AC_MSG_CHECKING'
- and `AC_MSG_RESULT' instead to print messages (*note Printing
- Messages::).
- -- Macro: AC_CONST
- Replaced by `AC_C_CONST' (*note AC_C_CONST::).
- -- Macro: AC_CROSS_CHECK
- Same as `AC_C_CROSS', which is obsolete too, and does nothing
- `:-)'.
- -- Macro: AC_CYGWIN
- Check for the Cygwin environment in which case the shell variable
- `CYGWIN' is set to `yes'. Don't use this macro, the dignified
- means to check the nature of the host is using `AC_CANONICAL_HOST'
- (*note Canonicalizing::). As a matter of fact this macro is
- defined as:
- AC_REQUIRE([AC_CANONICAL_HOST])[]dnl
- case $host_os in
- *cygwin* ) CYGWIN=yes;;
- * ) CYGWIN=no;;
- esac
- Beware that the variable `CYGWIN' has a special meaning when
- running Cygwin, and should not be changed. That's yet another
- reason not to use this macro.
- -- Macro: AC_DECL_SYS_SIGLIST
- Same as:
- AC_CHECK_DECLS([sys_siglist], [], [],
- [#include <signal.h>
- /* NetBSD declares sys_siglist in unistd.h. */
- #ifdef HAVE_UNISTD_H
- # include <unistd.h>
- #endif
- ])
- *Note AC_CHECK_DECLS::.
- -- Macro: AC_DECL_YYTEXT
- Does nothing, now integrated in `AC_PROG_LEX' (*note
- AC_PROG_LEX::).
- -- Macro: AC_DIR_HEADER
- Like calling `AC_FUNC_CLOSEDIR_VOID' (*note
- AC_FUNC_CLOSEDIR_VOID::) and `AC_HEADER_DIRENT' (*note
- AC_HEADER_DIRENT::), but defines a different set of C preprocessor
- macros to indicate which header file is found:
- Header Old Symbol New Symbol
- `dirent.h' `DIRENT' `HAVE_DIRENT_H'
- `sys/ndir.h' `SYSNDIR' `HAVE_SYS_NDIR_H'
- `sys/dir.h' `SYSDIR' `HAVE_SYS_DIR_H'
- `ndir.h' `NDIR' `HAVE_NDIR_H'
- -- Macro: AC_DYNIX_SEQ
- If on DYNIX/ptx, add `-lseq' to output variable `LIBS'. This
- macro used to be defined as
- AC_CHECK_LIB([seq], [getmntent], [LIBS="-lseq $LIBS"])
- now it is just `AC_FUNC_GETMNTENT' (*note AC_FUNC_GETMNTENT::).
- -- Macro: AC_EXEEXT
- Defined the output variable `EXEEXT' based on the output of the
- compiler, which is now done automatically. Typically set to empty
- string if Posix and `.exe' if a DOS variant.
- -- Macro: AC_EMXOS2
- Similar to `AC_CYGWIN' but checks for the EMX environment on OS/2
- and sets `EMXOS2'. Don't use this macro, the dignified means to
- check the nature of the host is using `AC_CANONICAL_HOST' (*note
- Canonicalizing::).
- -- Macro: AC_ENABLE (FEATURE, ACTION-IF-GIVEN, [ACTION-IF-NOT-GIVEN])
- This is an obsolete version of `AC_ARG_ENABLE' that does not
- support providing a help string (*note AC_ARG_ENABLE::).
- -- Macro: AC_ERROR
- Replaced by `AC_MSG_ERROR' (*note AC_MSG_ERROR::).
- -- Macro: AC_FIND_X
- Replaced by `AC_PATH_X' (*note AC_PATH_X::).
- -- Macro: AC_FIND_XTRA
- Replaced by `AC_PATH_XTRA' (*note AC_PATH_XTRA::).
- -- Macro: AC_FOREACH
- Replaced by `m4_foreach_w' (*note m4_foreach_w::).
- -- Macro: AC_FUNC_CHECK
- Replaced by `AC_CHECK_FUNC' (*note AC_CHECK_FUNC::).
- -- Macro: AC_FUNC_SETVBUF_REVERSED
- Do nothing. Formerly, this macro checked whether `setvbuf' takes
- the buffering type as its second argument and the buffer pointer
- as the third, instead of the other way around, and defined
- `SETVBUF_REVERSED'. However, the last systems to have the problem
- were those based on SVR2, which became obsolete in 1987, and the
- macro is no longer needed.
- -- Macro: AC_FUNC_WAIT3
- If `wait3' is found and fills in the contents of its third argument
- (a `struct rusage *'), which HP-UX does not do, define
- `HAVE_WAIT3'.
- These days portable programs should use `waitpid', not `wait3', as
- `wait3' has been removed from Posix.
- -- Macro: AC_GCC_TRADITIONAL
- Replaced by `AC_PROG_GCC_TRADITIONAL' (*note
- AC_PROG_GCC_TRADITIONAL::).
- -- Macro: AC_GETGROUPS_T
- Replaced by `AC_TYPE_GETGROUPS' (*note AC_TYPE_GETGROUPS::).
- -- Macro: AC_GETLOADAVG
- Replaced by `AC_FUNC_GETLOADAVG' (*note AC_FUNC_GETLOADAVG::).
- -- Macro: AC_GNU_SOURCE
- This macro is a platform-specific subset of
- `AC_USE_SYSTEM_EXTENSIONS' (*note AC_USE_SYSTEM_EXTENSIONS::).
- -- Macro: AC_HAVE_FUNCS
- Replaced by `AC_CHECK_FUNCS' (*note AC_CHECK_FUNCS::).
- -- Macro: AC_HAVE_HEADERS
- Replaced by `AC_CHECK_HEADERS' (*note AC_CHECK_HEADERS::).
- -- Macro: AC_HAVE_LIBRARY (LIBRARY, [ACTION-IF-FOUND],
- [ACTION-IF-NOT-FOUND], [OTHER-LIBRARIES])
- This macro is equivalent to calling `AC_CHECK_LIB' with a FUNCTION
- argument of `main'. In addition, LIBRARY can be written as any of
- `foo', `-lfoo', or `libfoo.a'. In all of those cases, the
- compiler is passed `-lfoo'. However, LIBRARY cannot be a shell
- variable; it must be a literal name. *Note AC_CHECK_LIB::.
- -- Macro: AC_HAVE_POUNDBANG
- Replaced by `AC_SYS_INTERPRETER' (*note AC_SYS_INTERPRETER::).
- -- Macro: AC_HEADER_CHECK
- Replaced by `AC_CHECK_HEADER' (*note AC_CHECK_HEADER::).
- -- Macro: AC_HEADER_EGREP
- Replaced by `AC_EGREP_HEADER' (*note AC_EGREP_HEADER::).
- -- Macro: AC_HELP_STRING
- Replaced by `AS_HELP_STRING' (*note AS_HELP_STRING::).
- -- Macro: AC_INIT (UNIQUE-FILE-IN-SOURCE-DIR)
- Formerly `AC_INIT' used to have a single argument, and was
- equivalent to:
- AC_INIT
- AC_CONFIG_SRCDIR(UNIQUE-FILE-IN-SOURCE-DIR)
- See *note AC_INIT:: and *note AC_CONFIG_SRCDIR::.
- -- Macro: AC_INLINE
- Replaced by `AC_C_INLINE' (*note AC_C_INLINE::).
- -- Macro: AC_INT_16_BITS
- If the C type `int' is 16 bits wide, define `INT_16_BITS'. Use
- `AC_CHECK_SIZEOF(int)' instead (*note AC_CHECK_SIZEOF::).
- -- Macro: AC_IRIX_SUN
- If on IRIX (Silicon Graphics Unix), add `-lsun' to output `LIBS'.
- If you were using it to get `getmntent', use `AC_FUNC_GETMNTENT'
- instead. If you used it for the NIS versions of the password and
- group functions, use `AC_CHECK_LIB(sun, getpwnam)'. Up to
- Autoconf 2.13, it used to be
- AC_CHECK_LIB([sun], [getmntent], [LIBS="-lsun $LIBS"])
- now it is defined as
- AC_FUNC_GETMNTENT
- AC_CHECK_LIB([sun], [getpwnam])
- See *note AC_FUNC_GETMNTENT:: and *note AC_CHECK_LIB::.
- -- Macro: AC_ISC_POSIX
- This macro adds `-lcposix' to output variable `LIBS' if necessary
- for Posix facilities. Sun dropped support for the obsolete
- INTERACTIVE Systems Corporation Unix on 2006-07-23. New programs
- need not use this macro. It is implemented as
- `AC_SEARCH_LIBS([strerror], [cposix])' (*note AC_SEARCH_LIBS::).
- -- Macro: AC_LANG_C
- Same as `AC_LANG([C])' (*note AC_LANG::).
- -- Macro: AC_LANG_CPLUSPLUS
- Same as `AC_LANG([C++])' (*note AC_LANG::).
- -- Macro: AC_LANG_FORTRAN77
- Same as `AC_LANG([Fortran 77])' (*note AC_LANG::).
- -- Macro: AC_LANG_RESTORE
- Select the LANGUAGE that is saved on the top of the stack, as set
- by `AC_LANG_SAVE', remove it from the stack, and call
- `AC_LANG(LANGUAGE)'. *Note Language Choice::, for the preferred
- way to change languages.
- -- Macro: AC_LANG_SAVE
- Remember the current language (as set by `AC_LANG') on a stack.
- The current language does not change. `AC_LANG_PUSH' is preferred
- (*note AC_LANG_PUSH::).
- -- Macro: AC_LINK_FILES (SOURCE..., DEST...)
- This is an obsolete version of `AC_CONFIG_LINKS' (*note
- AC_CONFIG_LINKS::. An updated version of:
- AC_LINK_FILES(config/$machine.h config/$obj_format.h,
- host.h object.h)
- is:
- AC_CONFIG_LINKS([host.h:config/$machine.h
- object.h:config/$obj_format.h])
- -- Macro: AC_LN_S
- Replaced by `AC_PROG_LN_S' (*note AC_PROG_LN_S::).
- -- Macro: AC_LONG_64_BITS
- Define `LONG_64_BITS' if the C type `long int' is 64 bits wide.
- Use the generic macro `AC_CHECK_SIZEOF([long int])' instead (*note
- AC_CHECK_SIZEOF::).
- -- Macro: AC_LONG_DOUBLE
- If the C compiler supports a working `long double' type with more
- range or precision than the `double' type, define
- `HAVE_LONG_DOUBLE'.
- You should use `AC_TYPE_LONG_DOUBLE' or
- `AC_TYPE_LONG_DOUBLE_WIDER' instead. *Note Particular Types::.
- -- Macro: AC_LONG_FILE_NAMES
- Replaced by
- AC_SYS_LONG_FILE_NAMES
- *Note AC_SYS_LONG_FILE_NAMES::.
- -- Macro: AC_MAJOR_HEADER
- Replaced by `AC_HEADER_MAJOR' (*note AC_HEADER_MAJOR::).
- -- Macro: AC_MEMORY_H
- Used to define `NEED_MEMORY_H' if the `mem' functions were defined
- in `memory.h'. Today it is equivalent to
- `AC_CHECK_HEADERS([memory.h])' (*note AC_CHECK_HEADERS::). Adjust
- your code to depend upon `HAVE_MEMORY_H', not `NEED_MEMORY_H'; see
- *note Standard Symbols::.
- -- Macro: AC_MINGW32
- Similar to `AC_CYGWIN' but checks for the MinGW compiler
- environment and sets `MINGW32'. Don't use this macro, the
- dignified means to check the nature of the host is using
- `AC_CANONICAL_HOST' (*note Canonicalizing::).
- -- Macro: AC_MINIX
- This macro is a platform-specific subset of
- `AC_USE_SYSTEM_EXTENSIONS' (*note AC_USE_SYSTEM_EXTENSIONS::).
- -- Macro: AC_MINUS_C_MINUS_O
- Replaced by `AC_PROG_CC_C_O' (*note AC_PROG_CC_C_O::).
- -- Macro: AC_MMAP
- Replaced by `AC_FUNC_MMAP' (*note AC_FUNC_MMAP::).
- -- Macro: AC_MODE_T
- Replaced by `AC_TYPE_MODE_T' (*note AC_TYPE_MODE_T::).
- -- Macro: AC_OBJEXT
- Defined the output variable `OBJEXT' based on the output of the
- compiler, after .c files have been excluded. Typically set to `o'
- if Posix, `obj' if a DOS variant. Now the compiler checking
- macros handle this automatically.
- -- Macro: AC_OBSOLETE (THIS-MACRO-NAME, [SUGGESTION])
- Make M4 print a message to the standard error output warning that
- THIS-MACRO-NAME is obsolete, and giving the file and line number
- where it was called. THIS-MACRO-NAME should be the name of the
- macro that is calling `AC_OBSOLETE'. If SUGGESTION is given, it
- is printed at the end of the warning message; for example, it can
- be a suggestion for what to use instead of THIS-MACRO-NAME.
- For instance
- AC_OBSOLETE([$0], [; use AC_CHECK_HEADERS(unistd.h) instead])dnl
- You are encouraged to use `AU_DEFUN' instead, since it gives better
- services to the user (*note AU_DEFUN::).
- -- Macro: AC_OFF_T
- Replaced by `AC_TYPE_OFF_T' (*note AC_TYPE_OFF_T::).
- -- Macro: AC_OUTPUT ([FILE]..., [EXTRA-CMDS], [INIT-CMDS])
- The use of `AC_OUTPUT' with arguments is deprecated. This
- obsoleted interface is equivalent to:
- AC_CONFIG_FILES(FILE...)
- AC_CONFIG_COMMANDS([default],
- EXTRA-CMDS, INIT-CMDS)
- AC_OUTPUT
- See *note AC_CONFIG_FILES::, *note AC_CONFIG_COMMANDS::, and *note
- AC_OUTPUT::.
- -- Macro: AC_OUTPUT_COMMANDS (EXTRA-CMDS, [INIT-CMDS])
- Specify additional shell commands to run at the end of
- `config.status', and shell commands to initialize any variables
- from `configure'. This macro may be called multiple times. It is
- obsolete, replaced by `AC_CONFIG_COMMANDS' (*note
- AC_CONFIG_COMMANDS::).
- Here is an unrealistic example:
- fubar=27
- AC_OUTPUT_COMMANDS([echo this is extra $fubar, and so on.],
- [fubar=$fubar])
- AC_OUTPUT_COMMANDS([echo this is another, extra, bit],
- [echo init bit])
- Aside from the fact that `AC_CONFIG_COMMANDS' requires an
- additional key, an important difference is that
- `AC_OUTPUT_COMMANDS' is quoting its arguments twice, unlike
- `AC_CONFIG_COMMANDS'. This means that `AC_CONFIG_COMMANDS' can
- safely be given macro calls as arguments:
- AC_CONFIG_COMMANDS(foo, [my_FOO()])
- Conversely, where one level of quoting was enough for literal
- strings with `AC_OUTPUT_COMMANDS', you need two with
- `AC_CONFIG_COMMANDS'. The following lines are equivalent:
- AC_OUTPUT_COMMANDS([echo "Square brackets: []"])
- AC_CONFIG_COMMANDS([default], [[echo "Square brackets: []"]])
- -- Macro: AC_PID_T
- Replaced by `AC_TYPE_PID_T' (*note AC_TYPE_PID_T::).
- -- Macro: AC_PREFIX
- Replaced by `AC_PREFIX_PROGRAM' (*note AC_PREFIX_PROGRAM::).
- -- Macro: AC_PROGRAMS_CHECK
- Replaced by `AC_CHECK_PROGS' (*note AC_CHECK_PROGS::).
- -- Macro: AC_PROGRAMS_PATH
- Replaced by `AC_PATH_PROGS' (*note AC_PATH_PROGS::).
- -- Macro: AC_PROGRAM_CHECK
- Replaced by `AC_CHECK_PROG' (*note AC_CHECK_PROG::).
- -- Macro: AC_PROGRAM_EGREP
- Replaced by `AC_EGREP_CPP' (*note AC_EGREP_CPP::).
- -- Macro: AC_PROGRAM_PATH
- Replaced by `AC_PATH_PROG' (*note AC_PATH_PROG::).
- -- Macro: AC_REMOTE_TAPE
- Removed because of limited usefulness.
- -- Macro: AC_RESTARTABLE_SYSCALLS
- This macro was renamed `AC_SYS_RESTARTABLE_SYSCALLS'. However,
- these days portable programs should use `sigaction' with
- `SA_RESTART' if they want restartable system calls. They should
- not rely on `HAVE_RESTARTABLE_SYSCALLS', since nowadays whether a
- system call is restartable is a dynamic issue, not a
- configuration-time issue.
- -- Macro: AC_RETSIGTYPE
- Replaced by `AC_TYPE_SIGNAL' (*note AC_TYPE_SIGNAL::), which itself
- is obsolete when assuming C89 or better.
- -- Macro: AC_RSH
- Removed because of limited usefulness.
- -- Macro: AC_SCO_INTL
- If on SCO Unix, add `-lintl' to output variable `LIBS'. This
- macro used to do this:
- AC_CHECK_LIB([intl], [strftime], [LIBS="-lintl $LIBS"])
- Now it just calls `AC_FUNC_STRFTIME' instead (*note
- AC_FUNC_STRFTIME::).
- -- Macro: AC_SETVBUF_REVERSED
- Replaced by
- AC_FUNC_SETVBUF_REVERSED
- *Note AC_FUNC_SETVBUF_REVERSED::.
- -- Macro: AC_SET_MAKE
- Replaced by `AC_PROG_MAKE_SET' (*note AC_PROG_MAKE_SET::).
- -- Macro: AC_SIZEOF_TYPE
- Replaced by `AC_CHECK_SIZEOF' (*note AC_CHECK_SIZEOF::).
- -- Macro: AC_SIZE_T
- Replaced by `AC_TYPE_SIZE_T' (*note AC_TYPE_SIZE_T::).
- -- Macro: AC_STAT_MACROS_BROKEN
- Replaced by `AC_HEADER_STAT' (*note AC_HEADER_STAT::).
- -- Macro: AC_STDC_HEADERS
- Replaced by `AC_HEADER_STDC' (*note AC_HEADER_STDC::).
- -- Macro: AC_STRCOLL
- Replaced by `AC_FUNC_STRCOLL' (*note AC_FUNC_STRCOLL::).
- -- Macro: AC_STRUCT_ST_BLKSIZE
- If `struct stat' contains an `st_blksize' member, define
- `HAVE_STRUCT_STAT_ST_BLKSIZE'. The former name, `HAVE_ST_BLKSIZE'
- is to be avoided, as its support will cease in the future. This
- macro is obsoleted, and should be replaced by
- AC_CHECK_MEMBERS([struct stat.st_blksize])
- *Note AC_CHECK_MEMBERS::.
- -- Macro: AC_STRUCT_ST_RDEV
- If `struct stat' contains an `st_rdev' member, define
- `HAVE_STRUCT_STAT_ST_RDEV'. The former name for this macro,
- `HAVE_ST_RDEV', is to be avoided as it will cease to be supported
- in the future. Actually, even the new macro is obsolete and
- should be replaced by:
- AC_CHECK_MEMBERS([struct stat.st_rdev])
- *Note AC_CHECK_MEMBERS::.
- -- Macro: AC_ST_BLKSIZE
- Replaced by `AC_CHECK_MEMBERS' (*note AC_CHECK_MEMBERS::).
- -- Macro: AC_ST_BLOCKS
- Replaced by `AC_STRUCT_ST_BLOCKS' (*note AC_STRUCT_ST_BLOCKS::).
- -- Macro: AC_ST_RDEV
- Replaced by `AC_CHECK_MEMBERS' (*note AC_CHECK_MEMBERS::).
- -- Macro: AC_SYS_RESTARTABLE_SYSCALLS
- If the system automatically restarts a system call that is
- interrupted by a signal, define `HAVE_RESTARTABLE_SYSCALLS'. This
- macro does not check whether system calls are restarted in
- general--it checks whether a signal handler installed with
- `signal' (but not `sigaction') causes system calls to be
- restarted. It does not check whether system calls can be
- restarted when interrupted by signals that have no handler.
- These days portable programs should use `sigaction' with
- `SA_RESTART' if they want restartable system calls. They should
- not rely on `HAVE_RESTARTABLE_SYSCALLS', since nowadays whether a
- system call is restartable is a dynamic issue, not a
- configuration-time issue.
- -- Macro: AC_SYS_SIGLIST_DECLARED
- This macro was renamed `AC_DECL_SYS_SIGLIST'. However, even that
- name is obsolete, as the same functionality is now achieved via
- `AC_CHECK_DECLS' (*note AC_CHECK_DECLS::).
- -- Macro: AC_TEST_CPP
- This macro was renamed `AC_TRY_CPP', which in turn was replaced by
- `AC_PREPROC_IFELSE' (*note AC_PREPROC_IFELSE::).
- -- Macro: AC_TEST_PROGRAM
- This macro was renamed `AC_TRY_RUN', which in turn was replaced by
- `AC_RUN_IFELSE' (*note AC_RUN_IFELSE::).
- -- Macro: AC_TIMEZONE
- Replaced by `AC_STRUCT_TIMEZONE' (*note AC_STRUCT_TIMEZONE::).
- -- Macro: AC_TIME_WITH_SYS_TIME
- Replaced by `AC_HEADER_TIME' (*note AC_HEADER_TIME::).
- -- Macro: AC_TRY_COMPILE (INCLUDES, FUNCTION-BODY, [ACTION-IF-TRUE],
- [ACTION-IF-FALSE])
- Same as:
- AC_COMPILE_IFELSE(
- [AC_LANG_PROGRAM([[INCLUDES]],
- [[FUNCTION-BODY]])],
- [ACTION-IF-TRUE],
- [ACTION-IF-FALSE])
- *Note Running the Compiler::.
- This macro double quotes both INCLUDES and FUNCTION-BODY.
- For C and C++, INCLUDES is any `#include' statements needed by the
- code in FUNCTION-BODY (INCLUDES is ignored if the currently
- selected language is Fortran or Fortran 77). The compiler and
- compilation flags are determined by the current language (*note
- Language Choice::).
- -- Macro: AC_TRY_CPP (INPUT, [ACTION-IF-TRUE], [ACTION-IF-FALSE])
- Same as:
- AC_PREPROC_IFELSE(
- [AC_LANG_SOURCE([[INPUT]])],
- [ACTION-IF-TRUE],
- [ACTION-IF-FALSE])
- *Note Running the Preprocessor::.
- This macro double quotes the INPUT.
- -- Macro: AC_TRY_LINK (INCLUDES, FUNCTION-BODY, [ACTION-IF-TRUE],
- [ACTION-IF-FALSE])
- Same as:
- AC_LINK_IFELSE(
- [AC_LANG_PROGRAM([[INCLUDES]],
- [[FUNCTION-BODY]])],
- [ACTION-IF-TRUE],
- [ACTION-IF-FALSE])
- *Note Running the Compiler::.
- This macro double quotes both INCLUDES and FUNCTION-BODY.
- Depending on the current language (*note Language Choice::),
- create a test program to see whether a function whose body
- consists of FUNCTION-BODY can be compiled and linked. If the file
- compiles and links successfully, run shell commands
- ACTION-IF-FOUND, otherwise run ACTION-IF-NOT-FOUND.
- This macro double quotes both INCLUDES and FUNCTION-BODY.
- For C and C++, INCLUDES is any `#include' statements needed by the
- code in FUNCTION-BODY (INCLUDES is ignored if the currently
- selected language is Fortran or Fortran 77). The compiler and
- compilation flags are determined by the current language (*note
- Language Choice::), and in addition `LDFLAGS' and `LIBS' are used
- for linking.
- -- Macro: AC_TRY_LINK_FUNC (FUNCTION, [ACTION-IF-FOUND],
- [ACTION-IF-NOT-FOUND])
- This macro is equivalent to
- AC_LINK_IFELSE([AC_LANG_CALL([], [FUNCTION])],
- [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
- *Note AC_LINK_IFELSE::.
- -- Macro: AC_TRY_RUN (PROGRAM, [ACTION-IF-TRUE], [ACTION-IF-FALSE],
- [ACTION-IF-CROSS-COMPILING = `AC_MSG_FAILURE'])
- Same as:
- AC_RUN_IFELSE(
- [AC_LANG_SOURCE([[PROGRAM]])],
- [ACTION-IF-TRUE],
- [ACTION-IF-FALSE],
- [ACTION-IF-CROSS-COMPILING])
- *Note Runtime::.
- -- Macro: AC_TYPE_SIGNAL
- If `signal.h' declares `signal' as returning a pointer to a
- function returning `void', define `RETSIGTYPE' to be `void';
- otherwise, define it to be `int'. These days, it is portable to
- assume C89, and that signal handlers return `void', without
- needing to use this macro or `RETSIGTYPE'.
- When targeting older K&R C, it is possible to define signal
- handlers as returning type `RETSIGTYPE', and omit a return
- statement:
- RETSIGTYPE
- hup_handler ()
- {
- ...
- }
- -- Macro: AC_UID_T
- Replaced by `AC_TYPE_UID_T' (*note AC_TYPE_UID_T::).
- -- Macro: AC_UNISTD_H
- Same as `AC_CHECK_HEADERS([unistd.h])' (*note AC_CHECK_HEADERS::).
- -- Macro: AC_USG
- Define `USG' if the BSD string functions are defined in
- `strings.h'. You should no longer depend upon `USG', but on
- `HAVE_STRING_H'; see *note Standard Symbols::.
- -- Macro: AC_UTIME_NULL
- Replaced by `AC_FUNC_UTIME_NULL' (*note AC_FUNC_UTIME_NULL::).
- -- Macro: AC_VALIDATE_CACHED_SYSTEM_TUPLE ([CMD])
- If the cache file is inconsistent with the current host, target and
- build system types, it used to execute CMD or print a default
- error message. This is now handled by default.
- -- Macro: AC_VERBOSE (RESULT-DESCRIPTION)
- Replaced by `AC_MSG_RESULT' (*note AC_MSG_RESULT::).
- -- Macro: AC_VFORK
- Replaced by `AC_FUNC_FORK' (*note AC_FUNC_FORK::).
- -- Macro: AC_VPRINTF
- Replaced by `AC_FUNC_VPRINTF' (*note AC_FUNC_VPRINTF::).
- -- Macro: AC_WAIT3
- This macro was renamed `AC_FUNC_WAIT3'. However, these days
- portable programs should use `waitpid', not `wait3', as `wait3'
- has been removed from Posix.
- -- Macro: AC_WARN
- Replaced by `AC_MSG_WARN' (*note AC_MSG_WARN::).
- -- Macro: AC_WITH (PACKAGE, ACTION-IF-GIVEN, [ACTION-IF-NOT-GIVEN])
- This is an obsolete version of `AC_ARG_WITH' that does not support
- providing a help string (*note AC_ARG_WITH::).
- -- Macro: AC_WORDS_BIGENDIAN
- Replaced by `AC_C_BIGENDIAN' (*note AC_C_BIGENDIAN::).
- -- Macro: AC_XENIX_DIR
- This macro used to add `-lx' to output variable `LIBS' if on
- Xenix. Also, if `dirent.h' is being checked for, added `-ldir' to
- `LIBS'. Now it is merely an alias of `AC_HEADER_DIRENT' instead,
- plus some code to detect whether running XENIX on which you should
- not depend:
- AC_MSG_CHECKING([for Xenix])
- AC_EGREP_CPP([yes],
- [#if defined M_XENIX && !defined M_UNIX
- yes
- #endif],
- [AC_MSG_RESULT([yes]); XENIX=yes],
- [AC_MSG_RESULT([no]); XENIX=])
- Don't use this macro, the dignified means to check the nature of
- the host is using `AC_CANONICAL_HOST' (*note Canonicalizing::).
- -- Macro: AC_YYTEXT_POINTER
- This macro was renamed `AC_DECL_YYTEXT', which in turn was
- integrated into `AC_PROG_LEX' (*note AC_PROG_LEX::).
- File: autoconf.info, Node: Autoconf 1, Next: Autoconf 2.13, Prev: Obsolete Macros, Up: Obsolete Constructs
- 18.5 Upgrading From Version 1
- =============================
- Autoconf version 2 is mostly backward compatible with version 1.
- However, it introduces better ways to do some things, and doesn't
- support some of the ugly things in version 1. So, depending on how
- sophisticated your `configure.ac' files are, you might have to do some
- manual work in order to upgrade to version 2. This chapter points out
- some problems to watch for when upgrading. Also, perhaps your
- `configure' scripts could benefit from some of the new features in
- version 2; the changes are summarized in the file `NEWS' in the
- Autoconf distribution.
- * Menu:
- * Changed File Names:: Files you might rename
- * Changed Makefiles:: New things to put in `Makefile.in'
- * Changed Macros:: Macro calls you might replace
- * Changed Results:: Changes in how to check test results
- * Changed Macro Writing:: Better ways to write your own macros
- File: autoconf.info, Node: Changed File Names, Next: Changed Makefiles, Up: Autoconf 1
- 18.5.1 Changed File Names
- -------------------------
- If you have an `aclocal.m4' installed with Autoconf (as opposed to in a
- particular package's source directory), you must rename it to
- `acsite.m4'. *Note autoconf Invocation::.
- If you distribute `install.sh' with your package, rename it to
- `install-sh' so `make' builtin rules don't inadvertently create a file
- called `install' from it. `AC_PROG_INSTALL' looks for the script under
- both names, but it is best to use the new name.
- If you were using `config.h.top', `config.h.bot', or `acconfig.h',
- you still can, but you have less clutter if you use the `AH_' macros.
- *Note Autoheader Macros::.
- File: autoconf.info, Node: Changed Makefiles, Next: Changed Macros, Prev: Changed File Names, Up: Autoconf 1
- 18.5.2 Changed Makefiles
- ------------------------
- Add `@CFLAGS@', `@CPPFLAGS@', and `@LDFLAGS@' in your `Makefile.in'
- files, so they can take advantage of the values of those variables in
- the environment when `configure' is run. Doing this isn't necessary,
- but it's a convenience for users.
- Also add `@configure_input@' in a comment to each input file for
- `AC_OUTPUT', so that the output files contain a comment saying they
- were produced by `configure'. Automatically selecting the right
- comment syntax for all the kinds of files that people call `AC_OUTPUT'
- on became too much work.
- Add `config.log' and `config.cache' to the list of files you remove
- in `distclean' targets.
- If you have the following in `Makefile.in':
- prefix = /usr/local
- exec_prefix = $(prefix)
- you must change it to:
- prefix = @prefix@
- exec_prefix = @exec_prefix@
- The old behavior of replacing those variables without `@' characters
- around them has been removed.
- File: autoconf.info, Node: Changed Macros, Next: Changed Results, Prev: Changed Makefiles, Up: Autoconf 1
- 18.5.3 Changed Macros
- ---------------------
- Many of the macros were renamed in Autoconf version 2. You can still
- use the old names, but the new ones are clearer, and it's easier to find
- the documentation for them. *Note Obsolete Macros::, for a table
- showing the new names for the old macros. Use the `autoupdate' program
- to convert your `configure.ac' to using the new macro names. *Note
- autoupdate Invocation::.
- Some macros have been superseded by similar ones that do the job
- better, but are not call-compatible. If you get warnings about calling
- obsolete macros while running `autoconf', you may safely ignore them,
- but your `configure' script generally works better if you follow the
- advice that is printed about what to replace the obsolete macros with.
- In particular, the mechanism for reporting the results of tests has
- changed. If you were using `echo' or `AC_VERBOSE' (perhaps via
- `AC_COMPILE_CHECK'), your `configure' script's output looks better if
- you switch to `AC_MSG_CHECKING' and `AC_MSG_RESULT'. *Note Printing
- Messages::. Those macros work best in conjunction with cache
- variables. *Note Caching Results::.
- File: autoconf.info, Node: Changed Results, Next: Changed Macro Writing, Prev: Changed Macros, Up: Autoconf 1
- 18.5.4 Changed Results
- ----------------------
- If you were checking the results of previous tests by examining the
- shell variable `DEFS', you need to switch to checking the values of the
- cache variables for those tests. `DEFS' no longer exists while
- `configure' is running; it is only created when generating output
- files. This difference from version 1 is because properly quoting the
- contents of that variable turned out to be too cumbersome and
- inefficient to do every time `AC_DEFINE' is called. *Note Cache
- Variable Names::.
- For example, here is a `configure.ac' fragment written for Autoconf
- version 1:
- AC_HAVE_FUNCS(syslog)
- case "$DEFS" in
- *-DHAVE_SYSLOG*) ;;
- *) # syslog is not in the default libraries. See if it's in some other.
- saved_LIBS="$LIBS"
- for lib in bsd socket inet; do
- AC_CHECKING(for syslog in -l$lib)
- LIBS="-l$lib $saved_LIBS"
- AC_HAVE_FUNCS(syslog)
- case "$DEFS" in
- *-DHAVE_SYSLOG*) break ;;
- *) ;;
- esac
- LIBS="$saved_LIBS"
- done ;;
- esac
- Here is a way to write it for version 2:
- AC_CHECK_FUNCS([syslog])
- if test "x$ac_cv_func_syslog" = xno; then
- # syslog is not in the default libraries. See if it's in some other.
- for lib in bsd socket inet; do
- AC_CHECK_LIB([$lib], [syslog], [AC_DEFINE([HAVE_SYSLOG])
- LIBS="-l$lib $LIBS"; break])
- done
- fi
- If you were working around bugs in `AC_DEFINE_UNQUOTED' by adding
- backslashes before quotes, you need to remove them. It now works
- predictably, and does not treat quotes (except back quotes) specially.
- *Note Setting Output Variables::.
- All of the Boolean shell variables set by Autoconf macros now use
- `yes' for the true value. Most of them use `no' for false, though for
- backward compatibility some use the empty string instead. If you were
- relying on a shell variable being set to something like 1 or `t' for
- true, you need to change your tests.
- File: autoconf.info, Node: Changed Macro Writing, Prev: Changed Results, Up: Autoconf 1
- 18.5.5 Changed Macro Writing
- ----------------------------
- When defining your own macros, you should now use `AC_DEFUN' instead of
- `define'. `AC_DEFUN' automatically calls `AC_PROVIDE' and ensures that
- macros called via `AC_REQUIRE' do not interrupt other macros, to
- prevent nested `checking...' messages on the screen. There's no actual
- harm in continuing to use the older way, but it's less convenient and
- attractive. *Note Macro Definitions::.
- You probably looked at the macros that came with Autoconf as a guide
- for how to do things. It would be a good idea to take a look at the new
- versions of them, as the style is somewhat improved and they take
- advantage of some new features.
- If you were doing tricky things with undocumented Autoconf internals
- (macros, variables, diversions), check whether you need to change
- anything to account for changes that have been made. Perhaps you can
- even use an officially supported technique in version 2 instead of
- kludging. Or perhaps not.
- To speed up your locally written feature tests, add caching to them.
- See whether any of your tests are of general enough usefulness to
- encapsulate them into macros that you can share.
- File: autoconf.info, Node: Autoconf 2.13, Prev: Autoconf 1, Up: Obsolete Constructs
- 18.6 Upgrading From Version 2.13
- ================================
- The introduction of the previous section (*note Autoconf 1::) perfectly
- suits this section...
- Autoconf version 2.50 is mostly backward compatible with version
- 2.13. However, it introduces better ways to do some things, and
- doesn't support some of the ugly things in version 2.13. So,
- depending on how sophisticated your `configure.ac' files are, you
- might have to do some manual work in order to upgrade to version
- 2.50. This chapter points out some problems to watch for when
- upgrading. Also, perhaps your `configure' scripts could benefit
- from some of the new features in version 2.50; the changes are
- summarized in the file `NEWS' in the Autoconf distribution.
- * Menu:
- * Changed Quotation:: Broken code which used to work
- * New Macros:: Interaction with foreign macros
- * Hosts and Cross-Compilation:: Bugward compatibility kludges
- * AC_LIBOBJ vs LIBOBJS:: LIBOBJS is a forbidden token
- * AC_ACT_IFELSE vs AC_TRY_ACT:: A more generic scheme for testing sources
- File: autoconf.info, Node: Changed Quotation, Next: New Macros, Up: Autoconf 2.13
- 18.6.1 Changed Quotation
- ------------------------
- The most important changes are invisible to you: the implementation of
- most macros have completely changed. This allowed more factorization of
- the code, better error messages, a higher uniformity of the user's
- interface etc. Unfortunately, as a side effect, some construct which
- used to (miraculously) work might break starting with Autoconf 2.50.
- The most common culprit is bad quotation.
- For instance, in the following example, the message is not properly
- quoted:
- AC_INIT
- AC_CHECK_HEADERS(foo.h, ,
- AC_MSG_ERROR(cannot find foo.h, bailing out))
- AC_OUTPUT
- Autoconf 2.13 simply ignores it:
- $ autoconf-2.13; ./configure --silent
- creating cache ./config.cache
- configure: error: cannot find foo.h
- $
- while Autoconf 2.50 produces a broken `configure':
- $ autoconf-2.50; ./configure --silent
- configure: error: cannot find foo.h
- ./configure: exit: bad non-numeric arg `bailing'
- ./configure: exit: bad non-numeric arg `bailing'
- $
- The message needs to be quoted, and the `AC_MSG_ERROR' invocation
- too!
- AC_INIT([Example], [1.0], [bug-example@example.org])
- AC_CHECK_HEADERS([foo.h], [],
- [AC_MSG_ERROR([cannot find foo.h, bailing out])])
- AC_OUTPUT
- Many many (and many more) Autoconf macros were lacking proper
- quotation, including no less than... `AC_DEFUN' itself!
- $ cat configure.in
- AC_DEFUN([AC_PROG_INSTALL],
- [# My own much better version
- ])
- AC_INIT
- AC_PROG_INSTALL
- AC_OUTPUT
- $ autoconf-2.13
- autoconf: Undefined macros:
- ***BUG in Autoconf--please report*** AC_FD_MSG
- ***BUG in Autoconf--please report*** AC_EPI
- configure.in:1:AC_DEFUN([AC_PROG_INSTALL],
- configure.in:5:AC_PROG_INSTALL
- $ autoconf-2.50
- $
- File: autoconf.info, Node: New Macros, Next: Hosts and Cross-Compilation, Prev: Changed Quotation, Up: Autoconf 2.13
- 18.6.2 New Macros
- -----------------
- While Autoconf was relatively dormant in the late 1990s, Automake
- provided Autoconf-like macros for a while. Starting with Autoconf 2.50
- in 2001, Autoconf provided versions of these macros, integrated in the
- `AC_' namespace, instead of `AM_'. But in order to ease the upgrading
- via `autoupdate', bindings to such `AM_' macros are provided.
- Unfortunately older versions of Automake (e.g., Automake 1.4) did
- not quote the names of these macros. Therefore, when `m4' finds
- something like `AC_DEFUN(AM_TYPE_PTRDIFF_T, ...)' in `aclocal.m4',
- `AM_TYPE_PTRDIFF_T' is expanded, replaced with its Autoconf definition.
- Fortunately Autoconf catches pre-`AC_INIT' expansions, and
- complains, in its own words:
- $ cat configure.ac
- AC_INIT([Example], [1.0], [bug-example@example.org])
- AM_TYPE_PTRDIFF_T
- $ aclocal-1.4
- $ autoconf
- aclocal.m4:17: error: m4_defn: undefined macro: _m4_divert_diversion
- aclocal.m4:17: the top level
- autom4te: m4 failed with exit status: 1
- $
- Modern versions of Automake no longer define most of these macros,
- and properly quote the names of the remaining macros. If you must use
- an old Automake, do not depend upon macros from Automake as it is
- simply not its job to provide macros (but the one it requires itself):
- $ cat configure.ac
- AC_INIT([Example], [1.0], [bug-example@example.org])
- AM_TYPE_PTRDIFF_T
- $ rm aclocal.m4
- $ autoupdate
- autoupdate: `configure.ac' is updated
- $ cat configure.ac
- AC_INIT([Example], [1.0], [bug-example@example.org])
- AC_CHECK_TYPES([ptrdiff_t])
- $ aclocal-1.4
- $ autoconf
- $
- File: autoconf.info, Node: Hosts and Cross-Compilation, Next: AC_LIBOBJ vs LIBOBJS, Prev: New Macros, Up: Autoconf 2.13
- 18.6.3 Hosts and Cross-Compilation
- ----------------------------------
- Based on the experience of compiler writers, and after long public
- debates, many aspects of the cross-compilation chain have changed:
- - the relationship between the build, host, and target architecture
- types,
- - the command line interface for specifying them to `configure',
- - the variables defined in `configure',
- - the enabling of cross-compilation mode.
- The relationship between build, host, and target have been cleaned
- up: the chain of default is now simply: target defaults to host, host to
- build, and build to the result of `config.guess'. Nevertheless, in
- order to ease the transition from 2.13 to 2.50, the following
- transition scheme is implemented. _Do not rely on it_, as it will be
- completely disabled in a couple of releases (we cannot keep it, as it
- proves to cause more problems than it cures).
- They all default to the result of running `config.guess', unless you
- specify either `--build' or `--host'. In this case, the default
- becomes the system type you specified. If you specify both, and
- they're different, `configure' enters cross compilation mode, so it
- doesn't run any tests that require execution.
- Hint: if you mean to override the result of `config.guess', prefer
- `--build' over `--host'.
- For backward compatibility, `configure' accepts a system type as an
- option by itself. Such an option overrides the defaults for build,
- host, and target system types. The following configure statement
- configures a cross toolchain that runs on NetBSD/alpha but generates
- code for GNU Hurd/sparc, which is also the build platform.
- ./configure --host=alpha-netbsd sparc-gnu
- In Autoconf 2.13 and before, the variables `build', `host', and
- `target' had a different semantics before and after the invocation of
- `AC_CANONICAL_BUILD' etc. Now, the argument of `--build' is strictly
- copied into `build_alias', and is left empty otherwise. After the
- `AC_CANONICAL_BUILD', `build' is set to the canonicalized build type.
- To ease the transition, before, its contents is the same as that of
- `build_alias'. Do _not_ rely on this broken feature.
- For consistency with the backward compatibility scheme exposed above,
- when `--host' is specified but `--build' isn't, the build system is
- assumed to be the same as `--host', and `build_alias' is set to that
- value. Eventually, this historically incorrect behavior will go away.
- The former scheme to enable cross-compilation proved to cause more
- harm than good, in particular, it used to be triggered too easily,
- leaving regular end users puzzled in front of cryptic error messages.
- `configure' could even enter cross-compilation mode only because the
- compiler was not functional. This is mainly because `configure' used
- to try to detect cross-compilation, instead of waiting for an explicit
- flag from the user.
- Now, `configure' enters cross-compilation mode if and only if
- `--host' is passed.
- That's the short documentation. To ease the transition between 2.13
- and its successors, a more complicated scheme is implemented. _Do not
- rely on the following_, as it will be removed in the near future.
- If you specify `--host', but not `--build', when `configure'
- performs the first compiler test it tries to run an executable produced
- by the compiler. If the execution fails, it enters cross-compilation
- mode. This is fragile. Moreover, by the time the compiler test is
- performed, it may be too late to modify the build-system type: other
- tests may have already been performed. Therefore, whenever you specify
- `--host', be sure to specify `--build' too.
- ./configure --build=i686-pc-linux-gnu --host=m68k-coff
- enters cross-compilation mode. The former interface, which consisted
- in setting the compiler to a cross-compiler without informing
- `configure' is obsolete. For instance, `configure' fails if it can't
- run the code generated by the specified compiler if you configure as
- follows:
- ./configure CC=m68k-coff-gcc
- File: autoconf.info, Node: AC_LIBOBJ vs LIBOBJS, Next: AC_ACT_IFELSE vs AC_TRY_ACT, Prev: Hosts and Cross-Compilation, Up: Autoconf 2.13
- 18.6.4 `AC_LIBOBJ' vs. `LIBOBJS'
- --------------------------------
- Up to Autoconf 2.13, the replacement of functions was triggered via the
- variable `LIBOBJS'. Since Autoconf 2.50, the macro `AC_LIBOBJ' should
- be used instead (*note Generic Functions::). Starting at Autoconf
- 2.53, the use of `LIBOBJS' is an error.
- This change is mandated by the unification of the GNU Build System
- components. In particular, the various fragile techniques used to parse
- a `configure.ac' are all replaced with the use of traces. As a
- consequence, any action must be traceable, which obsoletes critical
- variable assignments. Fortunately, `LIBOBJS' was the only problem, and
- it can even be handled gracefully (read, "without your having to change
- something").
- There were two typical uses of `LIBOBJS': asking for a replacement
- function, and adjusting `LIBOBJS' for Automake and/or Libtool.
- As for function replacement, the fix is immediate: use `AC_LIBOBJ'.
- For instance:
- LIBOBJS="$LIBOBJS fnmatch.o"
- LIBOBJS="$LIBOBJS malloc.$ac_objext"
- should be replaced with:
- AC_LIBOBJ([fnmatch])
- AC_LIBOBJ([malloc])
- When used with Automake 1.10 or newer, a suitable value for
- `LIBOBJDIR' is set so that the `LIBOBJS' and `LTLIBOBJS' can be
- referenced from any `Makefile.am'. Even without Automake, arranging
- for `LIBOBJDIR' to be set correctly enables referencing `LIBOBJS' and
- `LTLIBOBJS' in another directory. The `LIBOBJDIR' feature is
- experimental.
- File: autoconf.info, Node: AC_ACT_IFELSE vs AC_TRY_ACT, Prev: AC_LIBOBJ vs LIBOBJS, Up: Autoconf 2.13
- 18.6.5 `AC_ACT_IFELSE' vs. `AC_TRY_ACT'
- ---------------------------------------
- Since Autoconf 2.50, internal codes uses `AC_PREPROC_IFELSE',
- `AC_COMPILE_IFELSE', `AC_LINK_IFELSE', and `AC_RUN_IFELSE' on one hand
- and `AC_LANG_SOURCE', and `AC_LANG_PROGRAM' on the other hand instead
- of the deprecated `AC_TRY_CPP', `AC_TRY_COMPILE', `AC_TRY_LINK', and
- `AC_TRY_RUN'. The motivations where:
- - a more consistent interface: `AC_TRY_COMPILE' etc. were double
- quoting their arguments;
- - the combinatoric explosion is solved by decomposing on the one
- hand the generation of sources, and on the other hand executing
- the program;
- - this scheme helps supporting more languages than plain C and C++.
- In addition to the change of syntax, the philosophy has changed too:
- while emphasis was put on speed at the expense of accuracy, today's
- Autoconf promotes accuracy of the testing framework at, ahem..., the
- expense of speed.
- As a perfect example of what is _not_ to be done, here is how to
- find out whether a header file contains a particular declaration, such
- as a typedef, a structure, a structure member, or a function. Use
- `AC_EGREP_HEADER' instead of running `grep' directly on the header
- file; on some systems the symbol might be defined in another header
- file that the file you are checking includes.
- As a (bad) example, here is how you should not check for C
- preprocessor symbols, either defined by header files or predefined by
- the C preprocessor: using `AC_EGREP_CPP':
- AC_EGREP_CPP(yes,
- [#ifdef _AIX
- yes
- #endif
- ], is_aix=yes, is_aix=no)
- The above example, properly written would (i) use `AC_LANG_PROGRAM',
- and (ii) run the compiler:
- AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
- [[#ifndef _AIX
- error: This isn't AIX!
- #endif
- ]])],
- [is_aix=yes],
- [is_aix=no])
- File: autoconf.info, Node: Using Autotest, Next: FAQ, Prev: Obsolete Constructs, Up: Top
- 19 Generating Test Suites with Autotest
- ***************************************
- *N.B.: This section describes a feature which is still
- stabilizing. Although we believe that Autotest is useful as-is, this
- documentation describes an interface which might change in the future:
- do not depend upon Autotest without subscribing to the Autoconf mailing
- lists.*
- It is paradoxical that portable projects depend on nonportable tools
- to run their test suite. Autoconf by itself is the paragon of this
- problem: although it aims at perfectly portability, up to 2.13 its test
- suite was using DejaGNU, a rich and complex testing framework, but
- which is far from being standard on Posix systems. Worse yet, it was
- likely to be missing on the most fragile platforms, the very platforms
- that are most likely to torture Autoconf and exhibit deficiencies.
- To circumvent this problem, many package maintainers have developed
- their own testing framework, based on simple shell scripts whose sole
- outputs are exit status values describing whether the test succeeded.
- Most of these tests share common patterns, and this can result in lots
- of duplicated code and tedious maintenance.
- Following exactly the same reasoning that yielded to the inception of
- Autoconf, Autotest provides a test suite generation framework, based on
- M4 macros building a portable shell script. The suite itself is
- equipped with automatic logging and tracing facilities which greatly
- diminish the interaction with bug reporters, and simple timing reports.
- Autoconf itself has been using Autotest for years, and we do attest
- that it has considerably improved the strength of the test suite and the
- quality of bug reports. Other projects are known to use some generation
- of Autotest, such as Bison, Free Recode, Free Wdiff, GNU Tar, each of
- them with different needs, and this usage has validated Autotest as a
- general testing framework.
- Nonetheless, compared to DejaGNU, Autotest is inadequate for
- interactive tool testing, which is probably its main limitation.
- * Menu:
- * Using an Autotest Test Suite:: Autotest and the user
- * Writing Testsuites:: Autotest macros
- * testsuite Invocation:: Running `testsuite' scripts
- * Making testsuite Scripts:: Using autom4te to create `testsuite'
- File: autoconf.info, Node: Using an Autotest Test Suite, Next: Writing Testsuites, Up: Using Autotest
- 19.1 Using an Autotest Test Suite
- =================================
- * Menu:
- * testsuite Scripts:: The concepts of Autotest
- * Autotest Logs:: Their contents
- File: autoconf.info, Node: testsuite Scripts, Next: Autotest Logs, Up: Using an Autotest Test Suite
- 19.1.1 `testsuite' Scripts
- --------------------------
- Generating testing or validation suites using Autotest is rather easy.
- The whole validation suite is held in a file to be processed through
- `autom4te', itself using GNU M4 under the hood, to produce a
- stand-alone Bourne shell script which then gets distributed. Neither
- `autom4te' nor GNU M4 are needed at the installer's end.
- Each test of the validation suite should be part of some test group.
- A "test group" is a sequence of interwoven tests that ought to be
- executed together, usually because one test in the group creates data
- files that a later test in the same group needs to read. Complex test
- groups make later debugging more tedious. It is much better to keep
- only a few tests per test group. Ideally there is only one test per
- test group.
- For all but the simplest packages, some file such as `testsuite.at'
- does not fully hold all test sources, as these are often easier to
- maintain in separate files. Each of these separate files holds a single
- test group, or a sequence of test groups all addressing some common
- functionality in the package. In such cases, `testsuite.at' merely
- initializes the validation suite, and sometimes does elementary health
- checking, before listing include statements for all other test files.
- The special file `package.m4', containing the identification of the
- package, is automatically included if found.
- A convenient alternative consists in moving all the global issues
- (local Autotest macros, elementary health checking, and `AT_INIT'
- invocation) into the file `local.at', and making `testsuite.at' be a
- simple list of `m4_include's of sub test suites. In such case,
- generating the whole test suite or pieces of it is only a matter of
- choosing the `autom4te' command line arguments.
- The validation scripts that Autotest produces are by convention
- called `testsuite'. When run, `testsuite' executes each test group in
- turn, producing only one summary line per test to say if that
- particular test succeeded or failed. At end of all tests, summarizing
- counters get printed. One debugging directory is left for each test
- group which failed, if any: such directories are named
- `testsuite.dir/NN', where NN is the sequence number of the test group,
- and they include:
- * a debugging script named `run' which reruns the test in "debug
- mode" (*note testsuite Invocation::). The automatic generation of
- debugging scripts has the purpose of easing the chase for bugs.
- * all the files created with `AT_DATA'
- * all the Erlang source code files created with `AT_CHECK_EUNIT'
- * a log of the run, named `testsuite.log'
- In the ideal situation, none of the tests fail, and consequently no
- debugging directory is left behind for validation.
- It often happens in practice that individual tests in the validation
- suite need to get information coming out of the configuration process.
- Some of this information, common for all validation suites, is provided
- through the file `atconfig', automatically created by
- `AC_CONFIG_TESTDIR'. For configuration information which your testing
- environment specifically needs, you might prepare an optional file
- named `atlocal.in', instantiated by `AC_CONFIG_FILES'. The
- configuration process produces `atconfig' and `atlocal' out of these
- two input files, and these two produced files are automatically read by
- the `testsuite' script.
- Here is a diagram showing the relationship between files.
- Files used in preparing a software package for distribution:
- [package.m4] -->.
- \
- subfile-1.at ->. [local.at] ---->+
- ... \ \
- subfile-i.at ---->-- testsuite.at -->-- autom4te* -->testsuite
- ... /
- subfile-n.at ->'
- Files used in configuring a software package:
- .--> atconfig
- /
- [atlocal.in] --> config.status* --<
- \
- `--> [atlocal]
- Files created during test suite execution:
- atconfig -->. .--> testsuite.log
- \ /
- >-- testsuite* --<
- / \
- [atlocal] ->' `--> [testsuite.dir]
- File: autoconf.info, Node: Autotest Logs, Prev: testsuite Scripts, Up: Using an Autotest Test Suite
- 19.1.2 Autotest Logs
- --------------------
- When run, the test suite creates a log file named after itself, e.g., a
- test suite named `testsuite' creates `testsuite.log'. It contains a
- lot of information, usually more than maintainers actually need, but
- therefore most of the time it contains all that is needed:
- command line arguments
- A bad but unfortunately widespread habit consists of setting
- environment variables before the command, such as in
- `CC=my-home-grown-cc ./testsuite'. The test suite does not know
- this change, hence (i) it cannot report it to you, and (ii) it
- cannot preserve the value of `CC' for subsequent runs. Autoconf
- faced exactly the same problem, and solved it by asking users to
- pass the variable definitions as command line arguments. Autotest
- requires this rule, too, but has no means to enforce it; the log
- then contains a trace of the variables that were changed by the
- user.
- `ChangeLog' excerpts
- The topmost lines of all the `ChangeLog' files found in the source
- hierarchy. This is especially useful when bugs are reported
- against development versions of the package, since the version
- string does not provide sufficient information to know the exact
- state of the sources the user compiled. Of course, this relies on
- the use of a `ChangeLog'.
- build machine
- Running a test suite in a cross-compile environment is not an easy
- task, since it would mean having the test suite run on a machine
- BUILD, while running programs on a machine HOST. It is much
- simpler to run both the test suite and the programs on HOST, but
- then, from the point of view of the test suite, there remains a
- single environment, HOST = BUILD. The log contains relevant
- information on the state of the BUILD machine, including some
- important environment variables.
- tested programs
- The absolute file name and answers to `--version' of the tested
- programs (see *note Writing Testsuites::, `AT_TESTED').
- configuration log
- The contents of `config.log', as created by `configure', are
- appended. It contains the configuration flags and a detailed
- report on the configuration itself.
- File: autoconf.info, Node: Writing Testsuites, Next: testsuite Invocation, Prev: Using an Autotest Test Suite, Up: Using Autotest
- 19.2 Writing `testsuite.at'
- ===========================
- The `testsuite.at' is a Bourne shell script making use of special
- Autotest M4 macros. It often contains a call to `AT_INIT' near its
- beginning followed by one call to `m4_include' per source file for
- tests. Each such included file, or the remainder of `testsuite.at' if
- include files are not used, contain a sequence of test groups. Each
- test group begins with a call to `AT_SETUP', then an arbitrary number
- of shell commands or calls to `AT_CHECK', and then completes with a
- call to `AT_CLEANUP'. Multiple test groups can be categorized by a
- call to `AT_BANNER'.
- All of the public Autotest macros have all-uppercase names in the
- namespace `^AT_' to prevent them from accidentally conflicting with
- other text; Autoconf also reserves the namespace `^_AT_' for internal
- macros. All shell variables used in the testsuite for internal
- purposes have mostly-lowercase names starting with `at_'. Autotest
- also uses here-document delimiters in the namespace `^_AT[A-Z]', and
- makes use of the file system namespace `^at-'.
- Since Autoconf is built on top of M4sugar (*note Programming in
- M4sugar::) and M4sh (*note Programming in M4sh::), you must also be
- aware of those namespaces (`^_?\(m4\|AS\)_'). In general, you _should
- not use_ the namespace of a package that does not own the macro or
- shell code you are writing.
- -- Macro: AT_INIT ([NAME])
- Initialize Autotest. Giving a NAME to the test suite is
- encouraged if your package includes several test suites. Before
- this macro is called, `AT_PACKAGE_STRING' and
- `AT_PACKAGE_BUGREPORT' must be defined, which are used to display
- information about the testsuite to the user. Typically, these
- macros are provided by a file `package.m4' built by `make' (*note
- Making testsuite Scripts::), in order to inherit the package name,
- version, and bug reporting address from `configure.ac'.
- -- Macro: AT_COPYRIGHT (COPYRIGHT-NOTICE)
- State that, in addition to the Free Software Foundation's
- copyright on the Autotest macros, parts of your test suite are
- covered by COPYRIGHT-NOTICE.
- The COPYRIGHT-NOTICE shows up in both the head of `testsuite' and
- in `testsuite --version'.
- -- Macro: AT_ARG_OPTION (OPTIONS, HELP-TEXT, [ACTION-IF-GIVEN],
- [ACTION-IF-NOT-GIVEN])
- Accept options from the space-separated list OPTIONS, a list that
- has leading dashes removed from the options. Long options will be
- prefixed with `--', single-character options with `-'. The first
- word in this list is the primary OPTION, any others are assumed to
- be short-hand aliases. The variable associated with it is
- `at_arg_OPTION', with any dashes in OPTION replaced with
- underscores.
- If the user passes `--OPTION' to the `testsuite', the variable
- will be set to `:'. If the user does not pass the option, or
- passes `--no-OPTION', then the variable will be set to `false'.
- ACTION-IF-GIVEN is run each time the option is encountered; here,
- the variable `at_optarg' will be set to `:' or `false' as
- appropriate. `at_optarg' is actually just a copy of
- `at_arg_OPTION'.
- ACTION-IF-NOT-GIVEN will be run once after option parsing is
- complete and if no option from OPTIONS was used.
- HELP-TEXT is added to the end of the list of options shown in
- `testsuite --help' (*note AS_HELP_STRING::).
- It is recommended that you use a package-specific prefix to OPTIONS
- names in order to avoid clashes with future Autotest built-in
- options.
- -- Macro: AT_ARG_OPTION_ARG (OPTIONS, HELP-TEXT, [ACTION-IF-GIVEN],
- [ACTION-IF-NOT-GIVEN])
- Accept options with arguments from the space-separated list
- OPTIONS, a list that has leading dashes removed from the options.
- Long options will be prefixed with `--', single-character options
- with `-'. The first word in this list is the primary OPTION, any
- others are assumed to be short-hand aliases. The variable
- associated with it is `at_arg_OPTION', with any dashes in OPTION
- replaced with underscores.
- If the user passes `--OPTION=ARG' or `--OPTION ARG' to the
- `testsuite', the variable will be set to `ARG'.
- ACTION-IF-GIVEN is run each time the option is encountered; here,
- the variable `at_optarg' will be set to `ARG'. `at_optarg' is
- actually just a copy of `at_arg_OPTION'.
- ACTION-IF-NOT-GIVEN will be run once after option parsing is
- complete and if no option from OPTIONS was used.
- HELP-TEXT is added to the end of the list of options shown in
- `testsuite --help' (*note AS_HELP_STRING::).
- It is recommended that you use a package-specific prefix to OPTIONS
- names in order to avoid clashes with future Autotest built-in
- options.
- -- Macro: AT_COLOR_TESTS
- Enable colored test results by default when the output is
- connected to a terminal.
- -- Macro: AT_TESTED (EXECUTABLES)
- Log the file name and answer to `--version' of each program in
- space-separated list EXECUTABLES. Several invocations register
- new executables, in other words, don't fear registering one program
- several times.
- Autotest test suites rely on `PATH' to find the tested program.
- This avoids the need to generate absolute names of the various
- tools, and makes it possible to test installed programs.
- Therefore, knowing which programs are being exercised is crucial
- to understanding problems in the test suite itself, or its
- occasional misuses. It is a good idea to also subscribe foreign
- programs you depend upon, to avoid incompatible diagnostics.
- -- Macro: AT_BANNER (TEST-CATEGORY-NAME)
- This macro identifies the start of a category of related test
- groups. When the resulting `testsuite' is invoked with more than
- one test group to run, its output will include a banner containing
- TEST-CATEGORY-NAME prior to any tests run from that category. The
- banner should be no more than about 40 or 50 characters. A blank
- banner indicates uncategorized tests; an empty line will be
- inserted after tests from an earlier category, effectively ending
- that category.
- -- Macro: AT_SETUP (TEST-GROUP-NAME)
- This macro starts a group of related tests, all to be executed in
- the same subshell. It accepts a single argument, which holds a
- few words (no more than about 30 or 40 characters) quickly
- describing the purpose of the test group being started.
- TEST-GROUP-NAME must not expand to unbalanced quotes, although
- quadrigraphs can be used.
- -- Macro: AT_KEYWORDS (KEYWORDS)
- Associate the space-separated list of KEYWORDS to the enclosing
- test group. This makes it possible to run "slices" of the test
- suite. For instance, if some of your test groups exercise some
- `foo' feature, then using `AT_KEYWORDS(foo)' lets you run
- `./testsuite -k foo' to run exclusively these test groups. The
- TEST-GROUP-NAME of the test group is automatically recorded to
- `AT_KEYWORDS'.
- Several invocations within a test group accumulate new keywords.
- In other words, don't fear registering the same keyword several
- times in a test group.
- -- Macro: AT_CAPTURE_FILE (FILE)
- If the current test group fails, log the contents of FILE.
- Several identical calls within one test group have no additional
- effect.
- -- Macro: AT_FAIL_IF (SHELL-CONDITION)
- Make the test group fail and skip the rest of its execution, if
- SHELL-CONDITION is true. SHELL-CONDITION is a shell expression
- such as a `test' command. Tests before `AT_FAIL_IF' will be
- executed and may still cause the test group to be skipped. You
- can instantiate this macro many times from within the same test
- group.
- You should use this macro only for very simple failure conditions.
- If the SHELL-CONDITION could emit any kind of output you should
- instead use `AT_CHECK' like
- AT_CHECK([if SHELL-CONDITION; then exit 99; fi])
- so that such output is properly recorded in the `testsuite.log'
- file.
- -- Macro: AT_SKIP_IF (SHELL-CONDITION)
- Determine whether the test should be skipped because it requires
- features that are unsupported on the machine under test.
- SHELL-CONDITION is a shell expression such as a `test' command.
- Tests before `AT_SKIP_IF' will be executed and may still cause the
- test group to fail. You can instantiate this macro many times
- from within the same test group.
- You should use this macro only for very simple skip conditions.
- If the SHELL-CONDITION could emit any kind of output you should
- instead use `AT_CHECK' like
- AT_CHECK([if SHELL-CONDITION; then exit 77; fi])
- so that such output is properly recorded in the `testsuite.log'
- file.
- -- Macro: AT_XFAIL_IF (SHELL-CONDITION)
- Determine whether the test is expected to fail because it is a
- known bug (for unsupported features, you should skip the test).
- SHELL-CONDITION is a shell expression such as a `test' command;
- you can instantiate this macro many times from within the same
- test group, and one of the conditions is enough to turn the test
- into an expected failure.
- -- Macro: AT_CLEANUP
- End the current test group.
- -- Macro: AT_DATA (FILE, CONTENTS)
- Initialize an input data FILE with given CONTENTS. Of course, the
- CONTENTS have to be properly quoted between square brackets to
- protect against included commas or spurious M4 expansion.
- CONTENTS must be empty or end with a newline. FILE must be a
- single shell word that expands into a single file name.
- -- Macro: AT_CHECK (COMMANDS, [STATUS = `0'], [STDOUT], [STDERR],
- [RUN-IF-FAIL], [RUN-IF-PASS])
- -- Macro: AT_CHECK_UNQUOTED (COMMANDS, [STATUS = `0'], [STDOUT],
- [STDERR], [RUN-IF-FAIL], [RUN-IF-PASS])
- Execute a test by performing given shell COMMANDS in a subshell.
- COMMANDS is output as-is, so shell expansions are honored. These
- commands should normally exit with STATUS, while producing expected
- STDOUT and STDERR contents. If COMMANDS exit with unexpected
- status 77, then the rest of the test group is skipped. If
- COMMANDS exit with unexpected status 99, then the test group is
- immediately failed. Otherwise, if this test fails, run shell
- commands RUN-IF-FAIL or, if this test passes, run shell commands
- RUN-IF-PASS, both inside the current shell execution environment.
- At the beginning of RUN-IF-FAIL and RUN-IF-PASS, the status of
- COMMANDS is available in the `at_status' shell variable.
- This macro must be invoked in between `AT_SETUP' and `AT_CLEANUP'.
- If STATUS is the literal `ignore', then the corresponding exit
- status is not checked, except for the special cases of 77 (skip)
- and 99 (hard failure). The existence of hard failures allows one
- to mark a test as an expected failure with `AT_XFAIL_IF' because a
- feature has not yet been implemented, but to still distinguish
- between gracefully handling the missing feature and dumping core.
- A hard failure also inhibits post-test actions in RUN-IF-FAIL.
- If the value of the STDOUT or STDERR parameter is one of the
- literals in the following table, then the test treats the output
- according to the rules of that literal. Otherwise, the value of
- the parameter is treated as text that must exactly match the
- output given by COMMANDS on standard output and standard error
- (including an empty parameter for no output); any differences are
- captured in the testsuite log and the test is failed (unless an
- unexpected exit status of 77 skipped the test instead). The
- difference between `AT_CHECK' and `AT_CHECK_UNQUOTED' is that only
- the latter performs shell variable expansion (`$'), command
- substitution (``'), and backslash escaping (`\') on comparison
- text given in the STDOUT and STDERR arguments; if the text
- includes a trailing newline, this would be the same as if it were
- specified via an unquoted here-document. (However, there is no
- difference in the interpretation of COMMANDS).
- `ignore'
- The content of the output is ignored, but still captured in
- the test group log (if the testsuite is run with option `-v',
- the test group log is displayed as the test is run; if the
- test group later fails, the test group log is also copied
- into the overall testsuite log). This action is valid for
- both STDOUT and STDERR.
- `ignore-nolog'
- The content of the output is ignored, and nothing is captured
- in the log files. If COMMANDS are likely to produce binary
- output (including long lines) or large amounts of output,
- then logging the output can make it harder to locate details
- related to subsequent tests within the group, and could
- potentially corrupt terminal display of a user running
- `testsuite -v'.
- `stdout'
- For the STDOUT parameter, capture the content of standard
- output to both the file `stdout' and the test group log.
- Subsequent commands in the test group can then post-process
- the file. This action is often used when it is desired to
- use `grep' to look for a substring in the output, or when the
- output must be post-processed to normalize error messages
- into a common form.
- `stderr'
- Like `stdout', except that it only works for the STDERR
- parameter, and the standard error capture file will be named
- `stderr'.
- `stdout-nolog'
- `stderr-nolog'
- Like `stdout' or `stderr', except that the captured output is
- not duplicated into the test group log. This action is
- particularly useful for an intermediate check that produces
- large amounts of data, which will be followed by another
- check that filters down to the relevant data, as it makes it
- easier to locate details in the log.
- `expout'
- For the STDOUT parameter, compare standard output contents
- with the previously created file `expout', and list any
- differences in the testsuite log.
- `experr'
- Like `expout', except that it only works for the STDERR
- parameter, and the standard error contents are compared with
- `experr'.
- -- Macro: AT_CHECK_EUNIT (MODULE, TEST-SPEC, [ERLFLAGS],
- [RUN-IF-FAIL], [RUN-IF-PASS])
- Initialize and execute an Erlang module named MODULE that performs
- tests following the TEST-SPEC EUnit test specification. TEST-SPEC
- must be a valid EUnit test specification, as defined in the EUnit
- Reference Manual (http://erlang.org/doc/apps/eunit/index.html).
- ERLFLAGS are optional command-line options passed to the Erlang
- interpreter to execute the test Erlang module. Typically,
- ERLFLAGS defines at least the paths to directories containing the
- compiled Erlang modules under test, as `-pa path1 path2 ...'.
- For example, the unit tests associated with Erlang module `testme',
- which compiled code is in subdirectory `src', can be performed
- with:
- AT_CHECK_EUNIT([testme_testsuite], [{module, testme}],
- [-pa "${abs_top_builddir}/src"])
- This macro must be invoked in between `AT_SETUP' and `AT_CLEANUP'.
- Variables `ERL', `ERLC', and (optionally) `ERLCFLAGS' must be
- defined as the path of the Erlang interpreter, the path of the
- Erlang compiler, and the command-line flags to pass to the
- compiler, respectively. Those variables should be configured in
- `configure.ac' using the `AC_ERLANG_PATH_ERL' and
- `AC_ERLANG_PATH_ERLC' macros, and the configured values of those
- variables are automatically defined in the testsuite. If `ERL' or
- `ERLC' is not defined, the test group is skipped.
- If the EUnit library cannot be found, i.e. if module `eunit' cannot
- be loaded, the test group is skipped. Otherwise, if TEST-SPEC is
- an invalid EUnit test specification, the test group fails.
- Otherwise, if the EUnit test passes, shell commands RUN-IF-PASS
- are executed or, if the EUnit test fails, shell commands
- RUN-IF-FAIL are executed and the test group fails.
- Only the generated test Erlang module is automatically compiled and
- executed. If TEST-SPEC involves testing other Erlang modules,
- e.g. module `testme' in the example above, those modules must be
- already compiled.
- If the testsuite is run in verbose mode, with option `--verbose',
- EUnit is also run in verbose mode to output more details about
- individual unit tests.
- File: autoconf.info, Node: testsuite Invocation, Next: Making testsuite Scripts, Prev: Writing Testsuites, Up: Using Autotest
- 19.3 Running `testsuite' Scripts
- ================================
- Autotest test suites support the following options:
- `--help'
- `-h'
- Display the list of options and exit successfully.
- `--version'
- `-V'
- Display the version of the test suite and exit successfully.
- `--directory=DIR'
- `-C DIR'
- Change the current directory to DIR before creating any files.
- Useful for running the testsuite in a subdirectory from a top-level
- Makefile.
- `--jobs[=N]'
- `-j[N]'
- Run N tests in parallel, if possible. If N is not given, run all
- given tests in parallel. Note that there should be no space
- before the argument to `-j', as `-j NUMBER' denotes the separate
- arguments `-j' and `NUMBER', see below.
- In parallel mode, the standard input device of the testsuite
- script is not available to commands inside a test group.
- Furthermore, banner lines are not printed, and the summary line
- for each test group is output after the test group completes.
- Summary lines may appear unordered. If verbose and trace output
- are enabled (see below), they may appear intermixed from
- concurrently running tests.
- Parallel mode requires the `mkfifo' command to work, and will be
- silently disabled otherwise.
- `--clean'
- `-c'
- Remove all the files the test suite might have created and exit.
- Meant for `clean' Make targets.
- `--list'
- `-l'
- List all the tests (or only the selection), including their
- possible keywords.
- By default all tests are performed (or described with `--list')
- silently in the default environment, but the environment, set of tests,
- and verbosity level can be tuned:
- `VARIABLE=VALUE'
- Set the environment VARIABLE to VALUE. Use this rather than
- `FOO=foo ./testsuite' as debugging scripts would then run in a
- different environment.
- The variable `AUTOTEST_PATH' specifies the testing path to prepend
- to `PATH'. Relative directory names (not starting with `/') are
- considered to be relative to the top level of the package being
- built. All directories are made absolute, first starting from the
- top level _build_ tree, then from the _source_ tree. For instance
- `./testsuite AUTOTEST_PATH=tests:bin' for a `/src/foo-1.0' source
- package built in `/tmp/foo' results in
- `/tmp/foo/tests:/tmp/foo/bin' and then
- `/src/foo-1.0/tests:/src/foo-1.0/bin' being prepended to `PATH'.
- `NUMBER'
- `NUMBER-NUMBER'
- `NUMBER-'
- `-NUMBER'
- Add the corresponding test groups, with obvious semantics, to the
- selection.
- `--keywords=KEYWORDS'
- `-k KEYWORDS'
- Add to the selection the test groups with title or keywords
- (arguments to `AT_SETUP' or `AT_KEYWORDS') that match _all_
- keywords of the comma separated list KEYWORDS, case-insensitively.
- Use `!' immediately before the keyword to invert the selection for
- this keyword. By default, the keywords match whole words; enclose
- them in `.*' to also match parts of words.
- For example, running
- ./testsuite -k 'autoupdate,.*FUNC.*'
- selects all tests tagged `autoupdate' _and_ with tags containing
- `FUNC' (as in `AC_CHECK_FUNC', `AC_FUNC_ALLOCA', etc.), while
- ./testsuite -k '!autoupdate' -k '.*FUNC.*'
- selects all tests not tagged `autoupdate' _or_ with tags
- containing `FUNC'.
- `--errexit'
- `-e'
- If any test fails, immediately abort testing. This implies
- `--debug': post test group clean up, and top-level logging are
- inhibited. This option is meant for the full test suite, it is
- not really useful for generated debugging scripts. If the
- testsuite is run in parallel mode using `--jobs', then
- concurrently running tests will finish before exiting.
- `--verbose'
- `-v'
- Force more verbosity in the detailed output of what is being done.
- This is the default for debugging scripts.
- `--color'
- `--color[=never|auto|always]'
- Enable colored test results. Without an argument, or with
- `always', test results will be colored. With `never', color mode
- is turned off. Otherwise, if either the macro `AT_COLOR_TESTS' is
- used by the testsuite author, or the argument `auto' is given,
- then test results are colored if standard output is connected to a
- terminal.
- `--debug'
- `-d'
- Do not remove the files after a test group was performed--but they
- are still removed _before_, therefore using this option is sane
- when running several test groups. Create debugging scripts. Do
- not overwrite the top-level log (in order to preserve a supposedly
- existing full log file). This is the default for debugging
- scripts, but it can also be useful to debug the testsuite itself.
- `--recheck'
- Add to the selection all test groups that failed or passed
- unexpectedly during the last non-debugging test run.
- `--trace'
- `-x'
- Trigger shell tracing of the test groups.
- Besides these options accepted by every Autotest testsuite, the
- testsuite author might have added package-specific options via the
- `AT_ARG_OPTION' and `AT_ARG_OPTION_ARG' macros (*note Writing
- Testsuites::); refer to `testsuite --help' and the package
- documentation for details.
- File: autoconf.info, Node: Making testsuite Scripts, Prev: testsuite Invocation, Up: Using Autotest
- 19.4 Making `testsuite' Scripts
- ===============================
- For putting Autotest into movement, you need some configuration and
- makefile machinery. We recommend, at least if your package uses deep or
- shallow hierarchies, that you use `tests/' as the name of the directory
- holding all your tests and their makefile. Here is a check list of
- things to do.
- - Make sure to create the file `package.m4', which defines the
- identity of the package. It must define `AT_PACKAGE_STRING', the
- full signature of the package, and `AT_PACKAGE_BUGREPORT', the
- address to which bug reports should be sent. For sake of
- completeness, we suggest that you also define `AT_PACKAGE_NAME',
- `AT_PACKAGE_TARNAME', `AT_PACKAGE_VERSION', and `AT_PACKAGE_URL'.
- *Note Initializing configure::, for a description of these
- variables. Be sure to distribute `package.m4' and to put it into
- the source hierarchy: the test suite ought to be shipped! See
- below for an example `Makefile' excerpt.
- - Invoke `AC_CONFIG_TESTDIR'.
- -- Macro: AC_CONFIG_TESTDIR (DIRECTORY, [TEST-PATH = `directory'])
- An Autotest test suite is to be configured in DIRECTORY. This
- macro causes `DIRECTORY/atconfig' to be created by
- `config.status' and sets the default `AUTOTEST_PATH' to
- TEST-PATH (*note testsuite Invocation::).
- - Still within `configure.ac', as appropriate, ensure that some
- `AC_CONFIG_FILES' command includes substitution for
- `tests/atlocal'.
- - The appropriate `Makefile' should be modified so the validation in
- your package is triggered by `make check'. An example is provided
- below.
- With Automake, here is a minimal example for inclusion in
- `tests/Makefile.am', in order to link `make check' with a validation
- suite.
- # The `:;' works around a Bash 3.2 bug when the output is not writable.
- $(srcdir)/package.m4: $(top_srcdir)/configure.ac
- :;{ \
- echo '# Signature of the current package.' && \
- echo 'm4_define([AT_PACKAGE_NAME],' && \
- echo ' [$(PACKAGE_NAME)])' && \
- echo 'm4_define([AT_PACKAGE_TARNAME],' && \
- echo ' [$(PACKAGE_TARNAME)])' && \
- echo 'm4_define([AT_PACKAGE_VERSION],' && \
- echo ' [$(PACKAGE_VERSION)])' && \
- echo 'm4_define([AT_PACKAGE_STRING],' && \
- echo ' [$(PACKAGE_STRING)])' && \
- echo 'm4_define([AT_PACKAGE_BUGREPORT],' && \
- echo ' [$(PACKAGE_BUGREPORT)])'; \
- echo 'm4_define([AT_PACKAGE_URL],' && \
- echo ' [$(PACKAGE_URL)])'; \
- } >'$(srcdir)/package.m4'
- EXTRA_DIST = testsuite.at $(srcdir)/package.m4 $(TESTSUITE) atlocal.in
- TESTSUITE = $(srcdir)/testsuite
- check-local: atconfig atlocal $(TESTSUITE)
- $(SHELL) '$(TESTSUITE)' $(TESTSUITEFLAGS)
- installcheck-local: atconfig atlocal $(TESTSUITE)
- $(SHELL) '$(TESTSUITE)' AUTOTEST_PATH='$(bindir)' \
- $(TESTSUITEFLAGS)
- clean-local:
- test ! -f '$(TESTSUITE)' || \
- $(SHELL) '$(TESTSUITE)' --clean
- AUTOM4TE = $(SHELL) $(srcdir)/build-aux/missing --run autom4te
- AUTOTEST = $(AUTOM4TE) --language=autotest
- $(TESTSUITE): $(srcdir)/testsuite.at $(srcdir)/package.m4
- $(AUTOTEST) -I '$(srcdir)' -o $@.tmp $@.at
- mv $@.tmp $@
- Note that the built testsuite is distributed; this is necessary
- because users might not have Autoconf installed, and thus would not be
- able to rebuild it. Likewise, the use of `missing' provides the user
- with a nicer error message if they modify a source file to the
- testsuite, and accidentally trigger the rebuild rules.
- You might want to list explicitly the dependencies, i.e., the list of
- the files `testsuite.at' includes.
- If you don't use Automake, you should include the above example in
- `tests/Makefile.in', along with additional lines inspired from the
- following:
- subdir = tests
- PACKAGE_NAME = @PACKAGE_NAME@
- PACKAGE_TARNAME = @PACKAGE_TARNAME@
- PACKAGE_VERSION = @PACKAGE_VERSION@
- PACKAGE_STRING = @PACKAGE_STRING@
- PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
- PACKAGE_URL = @PACKAGE_URL@
- atconfig: $(top_builddir)/config.status
- cd $(top_builddir) && \
- $(SHELL) ./config.status $(subdir)/$@
- atlocal: $(srcdir)/atlocal.in $(top_builddir)/config.status
- cd $(top_builddir) && \
- $(SHELL) ./config.status $(subdir)/$@
- and manage to have `$(EXTRA_DIST)' distributed. You will also want to
- distribute the file `build-aux/missing' from the Automake project; a
- copy of this file resides in the Autoconf source tree.
- With all this in place, and if you have not initialized
- `TESTSUITEFLAGS' within your makefile, you can fine-tune test suite
- execution with this variable, for example:
- make check TESTSUITEFLAGS='-v -d -x 75 -k AC_PROG_CC CFLAGS=-g'
- File: autoconf.info, Node: FAQ, Next: History, Prev: Using Autotest, Up: Top
- 20 Frequent Autoconf Questions, with answers
- ********************************************
- Several questions about Autoconf come up occasionally. Here some of
- them are addressed.
- * Menu:
- * Distributing:: Distributing `configure' scripts
- * Why GNU M4:: Why not use the standard M4?
- * Bootstrapping:: Autoconf and GNU M4 require each other?
- * Why Not Imake:: Why GNU uses `configure' instead of Imake
- * Defining Directories:: Passing `datadir' to program
- * Autom4te Cache:: What is it? Can I remove it?
- * Present But Cannot Be Compiled:: Compiler and Preprocessor Disagree
- * Expanded Before Required:: Expanded Before Required
- * Debugging:: Debugging `configure' scripts
- File: autoconf.info, Node: Distributing, Next: Why GNU M4, Up: FAQ
- 20.1 Distributing `configure' Scripts
- =====================================
- What are the restrictions on distributing `configure'
- scripts that Autoconf generates? How does that affect my
- programs that use them?
- There are no restrictions on how the configuration scripts that
- Autoconf produces may be distributed or used. In Autoconf version 1,
- they were covered by the GNU General Public License. We still encourage
- software authors to distribute their work under terms like those of the
- GPL, but doing so is not required to use Autoconf.
- Of the other files that might be used with `configure',
- `config.h.in' is under whatever copyright you use for your
- `configure.ac'. `config.sub' and `config.guess' have an exception to
- the GPL when they are used with an Autoconf-generated `configure'
- script, which permits you to distribute them under the same terms as
- the rest of your package. `install-sh' is from the X Consortium and is
- not copyrighted.
- File: autoconf.info, Node: Why GNU M4, Next: Bootstrapping, Prev: Distributing, Up: FAQ
- 20.2 Why Require GNU M4?
- ========================
- Why does Autoconf require GNU M4?
- Many M4 implementations have hard-coded limitations on the size and
- number of macros that Autoconf exceeds. They also lack several builtin
- macros that it would be difficult to get along without in a
- sophisticated application like Autoconf, including:
- m4_builtin
- m4_indir
- m4_bpatsubst
- __file__
- __line__
- Autoconf requires version 1.4.6 or later of GNU M4.
- Since only software maintainers need to use Autoconf, and since GNU
- M4 is simple to configure and install, it seems reasonable to require
- GNU M4 to be installed also. Many maintainers of GNU and other free
- software already have most of the GNU utilities installed, since they
- prefer them.
- File: autoconf.info, Node: Bootstrapping, Next: Why Not Imake, Prev: Why GNU M4, Up: FAQ
- 20.3 How Can I Bootstrap?
- =========================
- If Autoconf requires GNU M4 and GNU M4 has an Autoconf
- `configure' script, how do I bootstrap? It seems like a chicken
- and egg problem!
- This is a misunderstanding. Although GNU M4 does come with a
- `configure' script produced by Autoconf, Autoconf is not required in
- order to run the script and install GNU M4. Autoconf is only required
- if you want to change the M4 `configure' script, which few people have
- to do (mainly its maintainer).
- File: autoconf.info, Node: Why Not Imake, Next: Defining Directories, Prev: Bootstrapping, Up: FAQ
- 20.4 Why Not Imake?
- ===================
- Why not use Imake instead of `configure' scripts?
- Several people have written addressing this question, so adaptations
- of their explanations are included here.
- The following answer is based on one written by Richard Pixley:
- Autoconf generated scripts frequently work on machines that it has
- never been set up to handle before. That is, it does a good job of
- inferring a configuration for a new system. Imake cannot do this.
- Imake uses a common database of host specific data. For X11, this
- makes sense because the distribution is made as a collection of
- tools, by one central authority who has control over the database.
- GNU tools are not released this way. Each GNU tool has a
- maintainer; these maintainers are scattered across the world.
- Using a common database would be a maintenance nightmare.
- Autoconf may appear to be this kind of database, but in fact it is
- not. Instead of listing host dependencies, it lists program
- requirements.
- If you view the GNU suite as a collection of native tools, then the
- problems are similar. But the GNU development tools can be
- configured as cross tools in almost any host+target permutation.
- All of these configurations can be installed concurrently. They
- can even be configured to share host independent files across
- hosts. Imake doesn't address these issues.
- Imake templates are a form of standardization. The GNU coding
- standards address the same issues without necessarily imposing the
- same restrictions.
- Here is some further explanation, written by Per Bothner:
- One of the advantages of Imake is that it is easy to generate large
- makefiles using the `#include' and macro mechanisms of `cpp'.
- However, `cpp' is not programmable: it has limited conditional
- facilities, and no looping. And `cpp' cannot inspect its
- environment.
- All of these problems are solved by using `sh' instead of `cpp'.
- The shell is fully programmable, has macro substitution, can
- execute (or source) other shell scripts, and can inspect its
- environment.
- Paul Eggert elaborates more:
- With Autoconf, installers need not assume that Imake itself is
- already installed and working well. This may not seem like much
- of an advantage to people who are accustomed to Imake. But on
- many hosts Imake is not installed or the default installation is
- not working well, and requiring Imake to install a package hinders
- the acceptance of that package on those hosts. For example, the
- Imake template and configuration files might not be installed
- properly on a host, or the Imake build procedure might wrongly
- assume that all source files are in one big directory tree, or the
- Imake configuration might assume one compiler whereas the package
- or the installer needs to use another, or there might be a version
- mismatch between the Imake expected by the package and the Imake
- supported by the host. These problems are much rarer with
- Autoconf, where each package comes with its own independent
- configuration processor.
- Also, Imake often suffers from unexpected interactions between
- `make' and the installer's C preprocessor. The fundamental problem
- here is that the C preprocessor was designed to preprocess C
- programs, not makefiles. This is much less of a problem with
- Autoconf, which uses the general-purpose preprocessor M4, and
- where the package's author (rather than the installer) does the
- preprocessing in a standard way.
- Finally, Mark Eichin notes:
- Imake isn't all that extensible, either. In order to add new
- features to Imake, you need to provide your own project template,
- and duplicate most of the features of the existing one. This
- means that for a sophisticated project, using the vendor-provided
- Imake templates fails to provide any leverage--since they don't
- cover anything that your own project needs (unless it is an X11
- program).
- On the other side, though:
- The one advantage that Imake has over `configure': `Imakefile'
- files tend to be much shorter (likewise, less redundant) than
- `Makefile.in' files. There is a fix to this, however--at least
- for the Kerberos V5 tree, we've modified things to call in common
- `post.in' and `pre.in' makefile fragments for the entire tree.
- This means that a lot of common things don't have to be
- duplicated, even though they normally are in `configure' setups.
- File: autoconf.info, Node: Defining Directories, Next: Autom4te Cache, Prev: Why Not Imake, Up: FAQ
- 20.5 How Do I `#define' Installation Directories?
- =================================================
- My program needs library files, installed in `datadir' and
- similar. If I use
- AC_DEFINE_UNQUOTED([DATADIR], [$datadir],
- [Define to the read-only architecture-independent
- data directory.])
- I get
- #define DATADIR "${prefix}/share"
- As already explained, this behavior is on purpose, mandated by the GNU
- Coding Standards, see *note Installation Directory Variables::. There
- are several means to achieve a similar goal:
- - Do not use `AC_DEFINE' but use your makefile to pass the actual
- value of `datadir' via compilation flags. *Note Installation
- Directory Variables::, for the details.
- - This solution can be simplified when compiling a program: you may
- either extend the `CPPFLAGS':
- CPPFLAGS = -DDATADIR='"$(datadir)"' @CPPFLAGS@
- If you are using Automake, you should use `AM_CPPFLAGS' instead:
- AM_CPPFLAGS = -DDATADIR='"$(datadir)"'
- Alternatively, create a dedicated header file:
- DISTCLEANFILES = myprog-paths.h
- myprog-paths.h: Makefile
- echo '#define DATADIR "$(datadir)"' >$@
- The gnulib module `configmake' provides such a header with all the
- standard directory variables defined, *note configmake:
- (gnulib)configmake.
- - Use `AC_DEFINE' but have `configure' compute the literal value of
- `datadir' and others. Many people have wrapped macros to automate
- this task; for an example, see the macro `AC_DEFINE_DIR' from the
- Autoconf Macro Archive
- (http://www.gnu.org/software/autoconf-archive/).
- This solution does not conform to the GNU Coding Standards.
- - Note that all the previous solutions hard wire the absolute name of
- these directories in the executables, which is not a good
- property. You may try to compute the names relative to `prefix',
- and try to find `prefix' at runtime, this way your package is
- relocatable.
- File: autoconf.info, Node: Autom4te Cache, Next: Present But Cannot Be Compiled, Prev: Defining Directories, Up: FAQ
- 20.6 What is `autom4te.cache'?
- ==============================
- What is this directory `autom4te.cache'? Can I safely remove it?
- In the GNU Build System, `configure.ac' plays a central role and is
- read by many tools: `autoconf' to create `configure', `autoheader' to
- create `config.h.in', `automake' to create `Makefile.in', `autoscan' to
- check the completeness of `configure.ac', `autoreconf' to check the GNU
- Build System components that are used. To "read `configure.ac'"
- actually means to compile it with M4, which can be a long process for
- complex `configure.ac'.
- This is why all these tools, instead of running directly M4, invoke
- `autom4te' (*note autom4te Invocation::) which, while answering to a
- specific demand, stores additional information in `autom4te.cache' for
- future runs. For instance, if you run `autoconf', behind the scenes,
- `autom4te' also stores information for the other tools, so that when
- you invoke `autoheader' or `automake' etc., reprocessing `configure.ac'
- is not needed. The speed up is frequently 30%, and is increasing with
- the size of `configure.ac'.
- But it is and remains being simply a cache: you can safely remove it.
- Can I permanently get rid of it?
- The creation of this cache can be disabled from `~/.autom4te.cfg',
- see *note Customizing autom4te::, for more details. You should be
- aware that disabling the cache slows down the Autoconf test suite by
- 40%. The more GNU Build System components are used, the more the cache
- is useful; for instance running `autoreconf -f' on the Core Utilities
- is twice slower without the cache _although `--force' implies that the
- cache is not fully exploited_, and eight times slower than without
- `--force'.
- File: autoconf.info, Node: Present But Cannot Be Compiled, Next: Expanded Before Required, Prev: Autom4te Cache, Up: FAQ
- 20.7 Header Present But Cannot Be Compiled
- ==========================================
- The most important guideline to bear in mind when checking for features
- is to mimic as much as possible the intended use. Unfortunately, old
- versions of `AC_CHECK_HEADER' and `AC_CHECK_HEADERS' failed to follow
- this idea, and called the preprocessor, instead of the compiler, to
- check for headers. As a result, incompatibilities between headers went
- unnoticed during configuration, and maintainers finally had to deal
- with this issue elsewhere.
- The transition began with Autoconf 2.56. As of Autoconf 2.64 both
- checks are performed, and `configure' complains loudly if the compiler
- and the preprocessor do not agree. However, only the compiler result
- is considered.
- Consider the following example:
- $ cat number.h
- typedef int number;
- $ cat pi.h
- const number pi = 3;
- $ cat configure.ac
- AC_INIT([Example], [1.0], [bug-example@example.org])
- AC_CHECK_HEADERS([pi.h])
- $ autoconf -Wall
- $ ./configure
- checking for gcc... gcc
- checking for C compiler default output file name... a.out
- checking whether the C compiler works... yes
- checking whether we are cross compiling... no
- checking for suffix of executables...
- checking for suffix of object files... o
- checking whether we are using the GNU C compiler... yes
- checking whether gcc accepts -g... yes
- checking for gcc option to accept ISO C89... none needed
- checking how to run the C preprocessor... gcc -E
- checking for grep that handles long lines and -e... grep
- checking for egrep... grep -E
- checking for ANSI C header files... yes
- checking for sys/types.h... yes
- checking for sys/stat.h... yes
- checking for stdlib.h... yes
- checking for string.h... yes
- checking for memory.h... yes
- checking for strings.h... yes
- checking for inttypes.h... yes
- checking for stdint.h... yes
- checking for unistd.h... yes
- checking pi.h usability... no
- checking pi.h presence... yes
- configure: WARNING: pi.h: present but cannot be compiled
- configure: WARNING: pi.h: check for missing prerequisite headers?
- configure: WARNING: pi.h: see the Autoconf documentation
- configure: WARNING: pi.h: section "Present But Cannot Be Compiled"
- configure: WARNING: pi.h: proceeding with the compiler's result
- configure: WARNING: ## -------------------------------------- ##
- configure: WARNING: ## Report this to bug-example@example.org ##
- configure: WARNING: ## -------------------------------------- ##
- checking for pi.h... yes
- The proper way the handle this case is using the fourth argument (*note
- Generic Headers::):
- $ cat configure.ac
- AC_INIT([Example], [1.0], [bug-example@example.org])
- AC_CHECK_HEADERS([number.h pi.h], [], [],
- [[#ifdef HAVE_NUMBER_H
- # include <number.h>
- #endif
- ]])
- $ autoconf -Wall
- $ ./configure
- checking for gcc... gcc
- checking for C compiler default output... a.out
- checking whether the C compiler works... yes
- checking whether we are cross compiling... no
- checking for suffix of executables...
- checking for suffix of object files... o
- checking whether we are using the GNU C compiler... yes
- checking whether gcc accepts -g... yes
- checking for gcc option to accept ANSI C... none needed
- checking for number.h... yes
- checking for pi.h... yes
- See *note Particular Headers::, for a list of headers with their
- prerequisites.
- File: autoconf.info, Node: Expanded Before Required, Next: Debugging, Prev: Present But Cannot Be Compiled, Up: FAQ
- 20.8 Expanded Before Required
- =============================
- Older versions of Autoconf silently built files with incorrect ordering
- between dependent macros if an outer macro first expanded, then later
- indirectly required, an inner macro. Starting with Autoconf 2.64, this
- situation no longer generates out-of-order code, but results in
- duplicate output and a syntax warning:
- $ cat configure.ac
- =>AC_DEFUN([TESTA], [[echo in A
- =>if test -n "$SEEN_A" ; then echo duplicate ; fi
- =>SEEN_A=:]])
- =>AC_DEFUN([TESTB], [AC_REQUIRE([TESTA])[echo in B
- =>if test -z "$SEEN_A" ; then echo bug ; fi]])
- =>AC_DEFUN([TESTC], [AC_REQUIRE([TESTB])[echo in C]])
- =>AC_DEFUN([OUTER], [[echo in OUTER]
- =>TESTA
- =>TESTC])
- =>AC_INIT
- =>OUTER
- =>AC_OUTPUT
- $ autoconf
- =>configure.ac:11: warning: AC_REQUIRE:
- => `TESTA' was expanded before it was required
- =>configure.ac:4: TESTB is expanded from...
- =>configure.ac:6: TESTC is expanded from...
- =>configure.ac:7: OUTER is expanded from...
- =>configure.ac:11: the top level
- To avoid this warning, decide what purpose the macro in question serves.
- If it only needs to be expanded once (for example, if it provides
- initialization text used by later macros), then the simplest fix is to
- change the macro to be declared with `AC_DEFUN_ONCE' (*note One-Shot
- Macros::), although this only works in Autoconf 2.64 and newer. A more
- portable fix is to change all instances of direct calls to instead go
- through `AC_REQUIRE' (*note Prerequisite Macros::). If, instead, the
- macro is parameterized by arguments or by the current definition of
- other macros in the m4 environment, then the macro should always be
- directly expanded instead of required.
- For another case study, consider this example trimmed down from an
- actual package. Originally, the package contained shell code and
- multiple macro invocations at the top level of `configure.ac':
- AC_DEFUN([FOO], [AC_COMPILE_IFELSE([...])])
- foobar=
- AC_PROG_CC
- FOO
- but that was getting complex, so the author wanted to offload some of
- the text into a new macro in another file included via `aclocal.m4'.
- The nai"ve approach merely wraps the text in a new macro:
- AC_DEFUN([FOO], [AC_COMPILE_IFELSE([...])])
- AC_DEFUN([BAR], [
- foobar=
- AC_PROG_CC
- FOO
- ])
- BAR
- With older versions of Autoconf, the setting of `foobar=' occurs before
- the single compiler check, as the author intended. But with Autoconf
- 2.64, this issues the "expanded before it was required" warning for
- `AC_PROG_CC', and outputs two copies of the compiler check, one before
- `foobar=', and one after. To understand why this is happening,
- remember that the use of `AC_COMPILE_IFELSE' includes a call to
- `AC_REQUIRE([AC_PROG_CC])' under the hood. According to the documented
- semantics of `AC_REQUIRE', this means that `AC_PROG_CC' _must_ occur
- before the body of the outermost `AC_DEFUN', which in this case is
- `BAR', thus preceding the use of `foobar='. The older versions of
- Autoconf were broken with regards to the rules of `AC_REQUIRE', which
- explains why the code changed from one over to two copies of
- `AC_PROG_CC' when upgrading autoconf. In other words, the author was
- unknowingly relying on a bug exploit to get the desired results, and
- that exploit broke once the bug was fixed.
- So, what recourse does the author have, to restore their intended
- semantics of setting `foobar=' prior to a single compiler check,
- regardless of whether Autoconf 2.63 or 2.64 is used? One idea is to
- remember that only `AC_DEFUN' is impacted by `AC_REQUIRE'; there is
- always the possibility of using the lower-level `m4_define':
- AC_DEFUN([FOO], [AC_COMPILE_IFELSE([...])])
- m4_define([BAR], [
- foobar=
- AC_PROG_CC
- FOO
- ])
- BAR
- This works great if everything is in the same file. However, it does
- not help in the case where the author wants to have `aclocal' find the
- definition of `BAR' from its own file, since `aclocal' requires the use
- of `AC_DEFUN'. In this case, a better fix is to recognize that if
- `BAR' also uses `AC_REQUIRE', then there will no longer be direct
- expansion prior to a subsequent require. Then, by creating yet another
- helper macro, the author can once again guarantee a single invocation of
- `AC_PROG_CC', which will still occur after `foobar='. The author can
- also use `AC_BEFORE' to make sure no other macro appearing before `BAR'
- has triggered an unwanted expansion of `AC_PROG_CC'.
- AC_DEFUN([FOO], [AC_COMPILE_IFELSE([...])])
- AC_DEFUN([BEFORE_CC], [
- foobar=
- ])
- AC_DEFUN([BAR], [
- AC_BEFORE([$0], [AC_PROG_CC])dnl
- AC_REQUIRE([BEFORE_CC])dnl
- AC_REQUIRE([AC_PROG_CC])dnl
- FOO
- ])
- BAR
- File: autoconf.info, Node: Debugging, Prev: Expanded Before Required, Up: FAQ
- 20.9 Debugging `configure' scripts
- ==================================
- While in general, `configure' scripts generated by Autoconf strive to
- be fairly portable to various systems, compilers, shells, and other
- tools, it may still be necessary to debug a failing test, broken script
- or makefile, or fix or override an incomplete, faulty, or erroneous
- test, especially during macro development. Failures can occur at all
- levels, in M4 syntax or semantics, shell script issues, or due to bugs
- in the test or the tools invoked by `configure'. Together with the
- rather arcane error message that `m4' and `make' may produce when their
- input contains syntax errors, this can make debugging rather painful.
- Nevertheless, here is a list of hints and strategies that may help:
- * When `autoconf' fails, common causes for error include:
- * mismatched or unbalanced parentheses or braces (*note
- Balancing Parentheses::),
- * under- or overquoted macro arguments (*note Autoconf
- Language::, *note Quoting and Parameters::, *note Quotation
- and Nested Macros::),
- * spaces between macro name and opening parenthesis (*note
- Autoconf Language::).
- Typically, it helps to go back to the last working version of the
- input and compare the differences for each of these errors.
- Another possibility is to sprinkle pairs of `m4_traceon' and
- `m4_traceoff' judiciously in the code, either without a parameter
- or listing some macro names and watch `m4' expand its input
- verbosely (*note Debugging via autom4te::).
- * Sometimes `autoconf' succeeds but the generated `configure' script
- has invalid shell syntax. You can detect this case by running
- `bash -n configure' or `sh -n configure'. If this command fails,
- the same tips apply, as if `autoconf' had failed.
- * Debugging `configure' script execution may be done by sprinkling
- pairs of `set -x' and `set +x' into the shell script before and
- after the region that contains a bug. Running the whole script
- with `SHELL -vx ./configure 2>&1 | tee LOG-FILE' with a decent
- SHELL may work, but produces lots of output. Here, it can help to
- search for markers like `checking for' a particular test in the
- LOG-FILE.
- * Alternatively, you might use a shell with debugging capabilities
- like bashdb (http://bashdb.sourceforge.net/).
- * When `configure' tests produce invalid results for your system, it
- may be necessary to override them:
- * For programs, tools or libraries variables, preprocessor,
- compiler, or linker flags, it is often sufficient to override
- them at `make' run time with some care (*note Macros and
- Submakes::). Since this normally won't cause `configure' to
- be run again with these changed settings, it may fail if the
- changed variable would have caused different test results
- from `configure', so this may work only for simple
- differences.
- * Most tests which produce their result in a substituted
- variable allow to override the test by setting the variable
- on the `configure' command line (*note Compilers and
- Options::, *note Defining Variables::, *note Particular
- Systems::).
- * Many tests store their result in a cache variable (*note
- Caching Results::). This lets you override them either on the
- `configure' command line as above, or through a primed cache
- or site file (*note Cache Files::, *note Site Defaults::).
- The name of a cache variable is documented with a test macro
- or may be inferred from *note Cache Variable Names::; the
- precise semantics of undocumented variables are often
- internal details, subject to change.
- * Alternatively, `configure' may produce invalid results because of
- uncaught programming errors, in your package or in an upstream
- library package. For example, when `AC_CHECK_LIB' fails to find a
- library with a specified function, always check `config.log'. This
- will reveal the exact error that produced the failing result: the
- library linked by `AC_CHECK_LIB' probably has a fatal bug.
- Conversely, as macro author, you can make it easier for users of your
- macro:
- * by minimizing dependencies between tests and between test results
- as far as possible,
- * by using `make' variables to factorize and allow override of
- settings at `make' run time,
- * by honoring the GNU Coding Standards and not overriding flags
- reserved for the user except temporarily during `configure' tests,
- * by not requiring users of your macro to use the cache variables.
- Instead, expose the result of the test via RUN-IF-TRUE and
- RUN-IF-FALSE parameters. If the result is not a boolean, then
- provide it through documented shell variables.
- File: autoconf.info, Node: History, Next: GNU Free Documentation License, Prev: FAQ, Up: Top
- 21 History of Autoconf
- **********************
- _This chapter was written by the original author, David MacKenzie._
- You may be wondering, Why was Autoconf originally written? How did
- it get into its present form? (Why does it look like gorilla spit?) If
- you're not wondering, then this chapter contains no information useful
- to you, and you might as well skip it. If you _are_ wondering, then
- let there be light...
- * Menu:
- * Genesis:: Prehistory and naming of `configure'
- * Exodus:: The plagues of M4 and Perl
- * Leviticus:: The priestly code of portability arrives
- * Numbers:: Growth and contributors
- * Deuteronomy:: Approaching the promises of easy configuration
- File: autoconf.info, Node: Genesis, Next: Exodus, Up: History
- 21.1 Genesis
- ============
- In June 1991 I was maintaining many of the GNU utilities for the Free
- Software Foundation. As they were ported to more platforms and more
- programs were added, the number of `-D' options that users had to
- select in the makefile (around 20) became burdensome. Especially for
- me--I had to test each new release on a bunch of different systems. So
- I wrote a little shell script to guess some of the correct settings for
- the fileutils package, and released it as part of fileutils 2.0. That
- `configure' script worked well enough that the next month I adapted it
- (by hand) to create similar `configure' scripts for several other GNU
- utilities packages. Brian Berliner also adapted one of my scripts for
- his CVS revision control system.
- Later that summer, I learned that Richard Stallman and Richard Pixley
- were developing similar scripts to use in the GNU compiler tools; so I
- adapted my `configure' scripts to support their evolving interface:
- using the file name `Makefile.in' as the templates; adding `+srcdir',
- the first option (of many); and creating `config.status' files.
- File: autoconf.info, Node: Exodus, Next: Leviticus, Prev: Genesis, Up: History
- 21.2 Exodus
- ===========
- As I got feedback from users, I incorporated many improvements, using
- Emacs to search and replace, cut and paste, similar changes in each of
- the scripts. As I adapted more GNU utilities packages to use
- `configure' scripts, updating them all by hand became impractical.
- Rich Murphey, the maintainer of the GNU graphics utilities, sent me
- mail saying that the `configure' scripts were great, and asking if I
- had a tool for generating them that I could send him. No, I thought,
- but I should! So I started to work out how to generate them. And the
- journey from the slavery of hand-written `configure' scripts to the
- abundance and ease of Autoconf began.
- Cygnus `configure', which was being developed at around that time,
- is table driven; it is meant to deal mainly with a discrete number of
- system types with a small number of mainly unguessable features (such as
- details of the object file format). The automatic configuration system
- that Brian Fox had developed for Bash takes a similar approach. For
- general use, it seems to me a hopeless cause to try to maintain an
- up-to-date database of which features each variant of each operating
- system has. It's easier and more reliable to check for most features on
- the fly--especially on hybrid systems that people have hacked on
- locally or that have patches from vendors installed.
- I considered using an architecture similar to that of Cygnus
- `configure', where there is a single `configure' script that reads
- pieces of `configure.in' when run. But I didn't want to have to
- distribute all of the feature tests with every package, so I settled on
- having a different `configure' made from each `configure.in' by a
- preprocessor. That approach also offered more control and flexibility.
- I looked briefly into using the Metaconfig package, by Larry Wall,
- Harlan Stenn, and Raphael Manfredi, but I decided not to for several
- reasons. The `Configure' scripts it produces are interactive, which I
- find quite inconvenient; I didn't like the ways it checked for some
- features (such as library functions); I didn't know that it was still
- being maintained, and the `Configure' scripts I had seen didn't work on
- many modern systems (such as System V R4 and NeXT); it wasn't flexible
- in what it could do in response to a feature's presence or absence; I
- found it confusing to learn; and it was too big and complex for my
- needs (I didn't realize then how much Autoconf would eventually have to
- grow).
- I considered using Perl to generate my style of `configure' scripts,
- but decided that M4 was better suited to the job of simple textual
- substitutions: it gets in the way less, because output is implicit.
- Plus, everyone already has it. (Initially I didn't rely on the GNU
- extensions to M4.) Also, some of my friends at the University of
- Maryland had recently been putting M4 front ends on several programs,
- including `tvtwm', and I was interested in trying out a new language.
- File: autoconf.info, Node: Leviticus, Next: Numbers, Prev: Exodus, Up: History
- 21.3 Leviticus
- ==============
- Since my `configure' scripts determine the system's capabilities
- automatically, with no interactive user intervention, I decided to call
- the program that generates them Autoconfig. But with a version number
- tacked on, that name would be too long for old Unix file systems, so I
- shortened it to Autoconf.
- In the fall of 1991 I called together a group of fellow questers
- after the Holy Grail of portability (er, that is, alpha testers) to
- give me feedback as I encapsulated pieces of my handwritten scripts in
- M4 macros and continued to add features and improve the techniques used
- in the checks. Prominent among the testers were Franc,ois Pinard, who
- came up with the idea of making an Autoconf shell script to run M4 and
- check for unresolved macro calls; Richard Pixley, who suggested running
- the compiler instead of searching the file system to find include files
- and symbols, for more accurate results; Karl Berry, who got Autoconf to
- configure TeX and added the macro index to the documentation; and Ian
- Lance Taylor, who added support for creating a C header file as an
- alternative to putting `-D' options in a makefile, so he could use
- Autoconf for his UUCP package. The alpha testers cheerfully adjusted
- their files again and again as the names and calling conventions of the
- Autoconf macros changed from release to release. They all contributed
- many specific checks, great ideas, and bug fixes.
- File: autoconf.info, Node: Numbers, Next: Deuteronomy, Prev: Leviticus, Up: History
- 21.4 Numbers
- ============
- In July 1992, after months of alpha testing, I released Autoconf 1.0,
- and converted many GNU packages to use it. I was surprised by how
- positive the reaction to it was. More people started using it than I
- could keep track of, including people working on software that wasn't
- part of the GNU Project (such as TCL, FSP, and Kerberos V5). Autoconf
- continued to improve rapidly, as many people using the `configure'
- scripts reported problems they encountered.
- Autoconf turned out to be a good torture test for M4 implementations.
- Unix M4 started to dump core because of the length of the macros that
- Autoconf defined, and several bugs showed up in GNU M4 as well.
- Eventually, we realized that we needed to use some features that only
- GNU M4 has. 4.3BSD M4, in particular, has an impoverished set of
- builtin macros; the System V version is better, but still doesn't
- provide everything we need.
- More development occurred as people put Autoconf under more stresses
- (and to uses I hadn't anticipated). Karl Berry added checks for X11.
- david zuhn contributed C++ support. Franc,ois Pinard made it diagnose
- invalid arguments. Jim Blandy bravely coerced it into configuring GNU
- Emacs, laying the groundwork for several later improvements. Roland
- McGrath got it to configure the GNU C Library, wrote the `autoheader'
- script to automate the creation of C header file templates, and added a
- `--verbose' option to `configure'. Noah Friedman added the
- `--autoconf-dir' option and `AC_MACRODIR' environment variable. (He
- also coined the term "autoconfiscate" to mean "adapt a software package
- to use Autoconf".) Roland and Noah improved the quoting protection in
- `AC_DEFINE' and fixed many bugs, especially when I got sick of dealing
- with portability problems from February through June, 1993.
- File: autoconf.info, Node: Deuteronomy, Prev: Numbers, Up: History
- 21.5 Deuteronomy
- ================
- A long wish list for major features had accumulated, and the effect of
- several years of patching by various people had left some residual
- cruft. In April 1994, while working for Cygnus Support, I began a major
- revision of Autoconf. I added most of the features of the Cygnus
- `configure' that Autoconf had lacked, largely by adapting the relevant
- parts of Cygnus `configure' with the help of david zuhn and Ken
- Raeburn. These features include support for using `config.sub',
- `config.guess', `--host', and `--target'; making links to files; and
- running `configure' scripts in subdirectories. Adding these features
- enabled Ken to convert GNU `as', and Rob Savoye to convert DejaGNU, to
- using Autoconf.
- I added more features in response to other peoples' requests. Many
- people had asked for `configure' scripts to share the results of the
- checks between runs, because (particularly when configuring a large
- source tree, like Cygnus does) they were frustratingly slow. Mike
- Haertel suggested adding site-specific initialization scripts. People
- distributing software that had to unpack on MS-DOS asked for a way to
- override the `.in' extension on the file names, which produced file
- names like `config.h.in' containing two dots. Jim Avera did an
- extensive examination of the problems with quoting in `AC_DEFINE' and
- `AC_SUBST'; his insights led to significant improvements. Richard
- Stallman asked that compiler output be sent to `config.log' instead of
- `/dev/null', to help people debug the Emacs `configure' script.
- I made some other changes because of my dissatisfaction with the
- quality of the program. I made the messages showing results of the
- checks less ambiguous, always printing a result. I regularized the
- names of the macros and cleaned up coding style inconsistencies. I
- added some auxiliary utilities that I had developed to help convert
- source code packages to use Autoconf. With the help of Franc,ois
- Pinard, I made the macros not interrupt each others' messages. (That
- feature revealed some performance bottlenecks in GNU M4, which he
- hastily corrected!) I reorganized the documentation around problems
- people want to solve. And I began a test suite, because experience had
- shown that Autoconf has a pronounced tendency to regress when we change
- it.
- Again, several alpha testers gave invaluable feedback, especially
- Franc,ois Pinard, Jim Meyering, Karl Berry, Rob Savoye, Ken Raeburn,
- and Mark Eichin.
- Finally, version 2.0 was ready. And there was much rejoicing. (And
- I have free time again. I think. Yeah, right.)
- File: autoconf.info, Node: GNU Free Documentation License, Next: Indices, Prev: History, Up: Top
- Appendix A GNU Free Documentation License
- *****************************************
- Version 1.3, 3 November 2008
- Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
- `http://fsf.org/'
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
- 0. PREAMBLE
- The purpose of this License is to make a manual, textbook, or other
- functional and useful document "free" in the sense of freedom: to
- assure everyone the effective freedom to copy and redistribute it,
- with or without modifying it, either commercially or
- noncommercially. Secondarily, this License preserves for the
- author and publisher a way to get credit for their work, while not
- being considered responsible for modifications made by others.
- This License is a kind of "copyleft", which means that derivative
- works of the document must themselves be free in the same sense.
- It complements the GNU General Public License, which is a copyleft
- license designed for free software.
- We have designed this License in order to use it for manuals for
- free software, because free software needs free documentation: a
- free program should come with manuals providing the same freedoms
- that the software does. But this License is not limited to
- software manuals; it can be used for any textual work, regardless
- of subject matter or whether it is published as a printed book.
- We recommend this License principally for works whose purpose is
- instruction or reference.
- 1. APPLICABILITY AND DEFINITIONS
- This License applies to any manual or other work, in any medium,
- that contains a notice placed by the copyright holder saying it
- can be distributed under the terms of this License. Such a notice
- grants a world-wide, royalty-free license, unlimited in duration,
- to use that work under the conditions stated herein. The
- "Document", below, refers to any such manual or work. Any member
- of the public is a licensee, and is addressed as "you". You
- accept the license if you copy, modify or distribute the work in a
- way requiring permission under copyright law.
- A "Modified Version" of the Document means any work containing the
- Document or a portion of it, either copied verbatim, or with
- modifications and/or translated into another language.
- A "Secondary Section" is a named appendix or a front-matter section
- of the Document that deals exclusively with the relationship of the
- publishers or authors of the Document to the Document's overall
- subject (or to related matters) and contains nothing that could
- fall directly within that overall subject. (Thus, if the Document
- is in part a textbook of mathematics, a Secondary Section may not
- explain any mathematics.) The relationship could be a matter of
- historical connection with the subject or with related matters, or
- of legal, commercial, philosophical, ethical or political position
- regarding them.
- The "Invariant Sections" are certain Secondary Sections whose
- titles are designated, as being those of Invariant Sections, in
- the notice that says that the Document is released under this
- License. If a section does not fit the above definition of
- Secondary then it is not allowed to be designated as Invariant.
- The Document may contain zero Invariant Sections. If the Document
- does not identify any Invariant Sections then there are none.
- The "Cover Texts" are certain short passages of text that are
- listed, as Front-Cover Texts or Back-Cover Texts, in the notice
- that says that the Document is released under this License. A
- Front-Cover Text may be at most 5 words, and a Back-Cover Text may
- be at most 25 words.
- A "Transparent" copy of the Document means a machine-readable copy,
- represented in a format whose specification is available to the
- general public, that is suitable for revising the document
- straightforwardly with generic text editors or (for images
- composed of pixels) generic paint programs or (for drawings) some
- widely available drawing editor, and that is suitable for input to
- text formatters or for automatic translation to a variety of
- formats suitable for input to text formatters. A copy made in an
- otherwise Transparent file format whose markup, or absence of
- markup, has been arranged to thwart or discourage subsequent
- modification by readers is not Transparent. An image format is
- not Transparent if used for any substantial amount of text. A
- copy that is not "Transparent" is called "Opaque".
- Examples of suitable formats for Transparent copies include plain
- ASCII without markup, Texinfo input format, LaTeX input format,
- SGML or XML using a publicly available DTD, and
- standard-conforming simple HTML, PostScript or PDF designed for
- human modification. Examples of transparent image formats include
- PNG, XCF and JPG. Opaque formats include proprietary formats that
- can be read and edited only by proprietary word processors, SGML or
- XML for which the DTD and/or processing tools are not generally
- available, and the machine-generated HTML, PostScript or PDF
- produced by some word processors for output purposes only.
- The "Title Page" means, for a printed book, the title page itself,
- plus such following pages as are needed to hold, legibly, the
- material this License requires to appear in the title page. For
- works in formats which do not have any title page as such, "Title
- Page" means the text near the most prominent appearance of the
- work's title, preceding the beginning of the body of the text.
- The "publisher" means any person or entity that distributes copies
- of the Document to the public.
- A section "Entitled XYZ" means a named subunit of the Document
- whose title either is precisely XYZ or contains XYZ in parentheses
- following text that translates XYZ in another language. (Here XYZ
- stands for a specific section name mentioned below, such as
- "Acknowledgements", "Dedications", "Endorsements", or "History".)
- To "Preserve the Title" of such a section when you modify the
- Document means that it remains a section "Entitled XYZ" according
- to this definition.
- The Document may include Warranty Disclaimers next to the notice
- which states that this License applies to the Document. These
- Warranty Disclaimers are considered to be included by reference in
- this License, but only as regards disclaiming warranties: any other
- implication that these Warranty Disclaimers may have is void and
- has no effect on the meaning of this License.
- 2. VERBATIM COPYING
- You may copy and distribute the Document in any medium, either
- commercially or noncommercially, provided that this License, the
- copyright notices, and the license notice saying this License
- applies to the Document are reproduced in all copies, and that you
- add no other conditions whatsoever to those of this License. You
- may not use technical measures to obstruct or control the reading
- or further copying of the copies you make or distribute. However,
- you may accept compensation in exchange for copies. If you
- distribute a large enough number of copies you must also follow
- the conditions in section 3.
- You may also lend copies, under the same conditions stated above,
- and you may publicly display copies.
- 3. COPYING IN QUANTITY
- If you publish printed copies (or copies in media that commonly
- have printed covers) of the Document, numbering more than 100, and
- the Document's license notice requires Cover Texts, you must
- enclose the copies in covers that carry, clearly and legibly, all
- these Cover Texts: Front-Cover Texts on the front cover, and
- Back-Cover Texts on the back cover. Both covers must also clearly
- and legibly identify you as the publisher of these copies. The
- front cover must present the full title with all words of the
- title equally prominent and visible. You may add other material
- on the covers in addition. Copying with changes limited to the
- covers, as long as they preserve the title of the Document and
- satisfy these conditions, can be treated as verbatim copying in
- other respects.
- If the required texts for either cover are too voluminous to fit
- legibly, you should put the first ones listed (as many as fit
- reasonably) on the actual cover, and continue the rest onto
- adjacent pages.
- If you publish or distribute Opaque copies of the Document
- numbering more than 100, you must either include a
- machine-readable Transparent copy along with each Opaque copy, or
- state in or with each Opaque copy a computer-network location from
- which the general network-using public has access to download
- using public-standard network protocols a complete Transparent
- copy of the Document, free of added material. If you use the
- latter option, you must take reasonably prudent steps, when you
- begin distribution of Opaque copies in quantity, to ensure that
- this Transparent copy will remain thus accessible at the stated
- location until at least one year after the last time you
- distribute an Opaque copy (directly or through your agents or
- retailers) of that edition to the public.
- It is requested, but not required, that you contact the authors of
- the Document well before redistributing any large number of
- copies, to give them a chance to provide you with an updated
- version of the Document.
- 4. MODIFICATIONS
- You may copy and distribute a Modified Version of the Document
- under the conditions of sections 2 and 3 above, provided that you
- release the Modified Version under precisely this License, with
- the Modified Version filling the role of the Document, thus
- licensing distribution and modification of the Modified Version to
- whoever possesses a copy of it. In addition, you must do these
- things in the Modified Version:
- A. Use in the Title Page (and on the covers, if any) a title
- distinct from that of the Document, and from those of
- previous versions (which should, if there were any, be listed
- in the History section of the Document). You may use the
- same title as a previous version if the original publisher of
- that version gives permission.
- B. List on the Title Page, as authors, one or more persons or
- entities responsible for authorship of the modifications in
- the Modified Version, together with at least five of the
- principal authors of the Document (all of its principal
- authors, if it has fewer than five), unless they release you
- from this requirement.
- C. State on the Title page the name of the publisher of the
- Modified Version, as the publisher.
- D. Preserve all the copyright notices of the Document.
- E. Add an appropriate copyright notice for your modifications
- adjacent to the other copyright notices.
- F. Include, immediately after the copyright notices, a license
- notice giving the public permission to use the Modified
- Version under the terms of this License, in the form shown in
- the Addendum below.
- G. Preserve in that license notice the full lists of Invariant
- Sections and required Cover Texts given in the Document's
- license notice.
- H. Include an unaltered copy of this License.
- I. Preserve the section Entitled "History", Preserve its Title,
- and add to it an item stating at least the title, year, new
- authors, and publisher of the Modified Version as given on
- the Title Page. If there is no section Entitled "History" in
- the Document, create one stating the title, year, authors,
- and publisher of the Document as given on its Title Page,
- then add an item describing the Modified Version as stated in
- the previous sentence.
- J. Preserve the network location, if any, given in the Document
- for public access to a Transparent copy of the Document, and
- likewise the network locations given in the Document for
- previous versions it was based on. These may be placed in
- the "History" section. You may omit a network location for a
- work that was published at least four years before the
- Document itself, or if the original publisher of the version
- it refers to gives permission.
- K. For any section Entitled "Acknowledgements" or "Dedications",
- Preserve the Title of the section, and preserve in the
- section all the substance and tone of each of the contributor
- acknowledgements and/or dedications given therein.
- L. Preserve all the Invariant Sections of the Document,
- unaltered in their text and in their titles. Section numbers
- or the equivalent are not considered part of the section
- titles.
- M. Delete any section Entitled "Endorsements". Such a section
- may not be included in the Modified Version.
- N. Do not retitle any existing section to be Entitled
- "Endorsements" or to conflict in title with any Invariant
- Section.
- O. Preserve any Warranty Disclaimers.
- If the Modified Version includes new front-matter sections or
- appendices that qualify as Secondary Sections and contain no
- material copied from the Document, you may at your option
- designate some or all of these sections as invariant. To do this,
- add their titles to the list of Invariant Sections in the Modified
- Version's license notice. These titles must be distinct from any
- other section titles.
- You may add a section Entitled "Endorsements", provided it contains
- nothing but endorsements of your Modified Version by various
- parties--for example, statements of peer review or that the text
- has been approved by an organization as the authoritative
- definition of a standard.
- You may add a passage of up to five words as a Front-Cover Text,
- and a passage of up to 25 words as a Back-Cover Text, to the end
- of the list of Cover Texts in the Modified Version. Only one
- passage of Front-Cover Text and one of Back-Cover Text may be
- added by (or through arrangements made by) any one entity. If the
- Document already includes a cover text for the same cover,
- previously added by you or by arrangement made by the same entity
- you are acting on behalf of, you may not add another; but you may
- replace the old one, on explicit permission from the previous
- publisher that added the old one.
- The author(s) and publisher(s) of the Document do not by this
- License give permission to use their names for publicity for or to
- assert or imply endorsement of any Modified Version.
- 5. COMBINING DOCUMENTS
- You may combine the Document with other documents released under
- this License, under the terms defined in section 4 above for
- modified versions, provided that you include in the combination
- all of the Invariant Sections of all of the original documents,
- unmodified, and list them all as Invariant Sections of your
- combined work in its license notice, and that you preserve all
- their Warranty Disclaimers.
- The combined work need only contain one copy of this License, and
- multiple identical Invariant Sections may be replaced with a single
- copy. If there are multiple Invariant Sections with the same name
- but different contents, make the title of each such section unique
- by adding at the end of it, in parentheses, the name of the
- original author or publisher of that section if known, or else a
- unique number. Make the same adjustment to the section titles in
- the list of Invariant Sections in the license notice of the
- combined work.
- In the combination, you must combine any sections Entitled
- "History" in the various original documents, forming one section
- Entitled "History"; likewise combine any sections Entitled
- "Acknowledgements", and any sections Entitled "Dedications". You
- must delete all sections Entitled "Endorsements."
- 6. COLLECTIONS OF DOCUMENTS
- You may make a collection consisting of the Document and other
- documents released under this License, and replace the individual
- copies of this License in the various documents with a single copy
- that is included in the collection, provided that you follow the
- rules of this License for verbatim copying of each of the
- documents in all other respects.
- You may extract a single document from such a collection, and
- distribute it individually under this License, provided you insert
- a copy of this License into the extracted document, and follow
- this License in all other respects regarding verbatim copying of
- that document.
- 7. AGGREGATION WITH INDEPENDENT WORKS
- A compilation of the Document or its derivatives with other
- separate and independent documents or works, in or on a volume of
- a storage or distribution medium, is called an "aggregate" if the
- copyright resulting from the compilation is not used to limit the
- legal rights of the compilation's users beyond what the individual
- works permit. When the Document is included in an aggregate, this
- License does not apply to the other works in the aggregate which
- are not themselves derivative works of the Document.
- If the Cover Text requirement of section 3 is applicable to these
- copies of the Document, then if the Document is less than one half
- of the entire aggregate, the Document's Cover Texts may be placed
- on covers that bracket the Document within the aggregate, or the
- electronic equivalent of covers if the Document is in electronic
- form. Otherwise they must appear on printed covers that bracket
- the whole aggregate.
- 8. TRANSLATION
- Translation is considered a kind of modification, so you may
- distribute translations of the Document under the terms of section
- 4. Replacing Invariant Sections with translations requires special
- permission from their copyright holders, but you may include
- translations of some or all Invariant Sections in addition to the
- original versions of these Invariant Sections. You may include a
- translation of this License, and all the license notices in the
- Document, and any Warranty Disclaimers, provided that you also
- include the original English version of this License and the
- original versions of those notices and disclaimers. In case of a
- disagreement between the translation and the original version of
- this License or a notice or disclaimer, the original version will
- prevail.
- If a section in the Document is Entitled "Acknowledgements",
- "Dedications", or "History", the requirement (section 4) to
- Preserve its Title (section 1) will typically require changing the
- actual title.
- 9. TERMINATION
- You may not copy, modify, sublicense, or distribute the Document
- except as expressly provided under this License. Any attempt
- otherwise to copy, modify, sublicense, or distribute it is void,
- and will automatically terminate your rights under this License.
- However, if you cease all violation of this License, then your
- license from a particular copyright holder is reinstated (a)
- provisionally, unless and until the copyright holder explicitly
- and finally terminates your license, and (b) permanently, if the
- copyright holder fails to notify you of the violation by some
- reasonable means prior to 60 days after the cessation.
- Moreover, your license from a particular copyright holder is
- reinstated permanently if the copyright holder notifies you of the
- violation by some reasonable means, this is the first time you have
- received notice of violation of this License (for any work) from
- that copyright holder, and you cure the violation prior to 30 days
- after your receipt of the notice.
- Termination of your rights under this section does not terminate
- the licenses of parties who have received copies or rights from
- you under this License. If your rights have been terminated and
- not permanently reinstated, receipt of a copy of some or all of
- the same material does not give you any rights to use it.
- 10. FUTURE REVISIONS OF THIS LICENSE
- The Free Software Foundation may publish new, revised versions of
- the GNU Free Documentation License from time to time. Such new
- versions will be similar in spirit to the present version, but may
- differ in detail to address new problems or concerns. See
- `http://www.gnu.org/copyleft/'.
- Each version of the License is given a distinguishing version
- number. If the Document specifies that a particular numbered
- version of this License "or any later version" applies to it, you
- have the option of following the terms and conditions either of
- that specified version or of any later version that has been
- published (not as a draft) by the Free Software Foundation. If
- the Document does not specify a version number of this License,
- you may choose any version ever published (not as a draft) by the
- Free Software Foundation. If the Document specifies that a proxy
- can decide which future versions of this License can be used, that
- proxy's public statement of acceptance of a version permanently
- authorizes you to choose that version for the Document.
- 11. RELICENSING
- "Massive Multiauthor Collaboration Site" (or "MMC Site") means any
- World Wide Web server that publishes copyrightable works and also
- provides prominent facilities for anybody to edit those works. A
- public wiki that anybody can edit is an example of such a server.
- A "Massive Multiauthor Collaboration" (or "MMC") contained in the
- site means any set of copyrightable works thus published on the MMC
- site.
- "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
- license published by Creative Commons Corporation, a not-for-profit
- corporation with a principal place of business in San Francisco,
- California, as well as future copyleft versions of that license
- published by that same organization.
- "Incorporate" means to publish or republish a Document, in whole or
- in part, as part of another Document.
- An MMC is "eligible for relicensing" if it is licensed under this
- License, and if all works that were first published under this
- License somewhere other than this MMC, and subsequently
- incorporated in whole or in part into the MMC, (1) had no cover
- texts or invariant sections, and (2) were thus incorporated prior
- to November 1, 2008.
- The operator of an MMC Site may republish an MMC contained in the
- site under CC-BY-SA on the same site at any time before August 1,
- 2009, provided the MMC is eligible for relicensing.
- ADDENDUM: How to use this License for your documents
- ====================================================
- To use this License in a document you have written, include a copy of
- the License in the document and put the following copyright and license
- notices just after the title page:
- Copyright (C) YEAR YOUR NAME.
- Permission is granted to copy, distribute and/or modify this document
- under the terms of the GNU Free Documentation License, Version 1.3
- or any later version published by the Free Software Foundation;
- with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
- Texts. A copy of the license is included in the section entitled ``GNU
- Free Documentation License''.
- If you have Invariant Sections, Front-Cover Texts and Back-Cover
- Texts, replace the "with...Texts." line with this:
- with the Invariant Sections being LIST THEIR TITLES, with
- the Front-Cover Texts being LIST, and with the Back-Cover Texts
- being LIST.
- If you have Invariant Sections without Cover Texts, or some other
- combination of the three, merge those two alternatives to suit the
- situation.
- If your document contains nontrivial examples of program code, we
- recommend releasing these examples in parallel under your choice of
- free software license, such as the GNU General Public License, to
- permit their use in free software.
- File: autoconf.info, Node: Indices, Prev: GNU Free Documentation License, Up: Top
- Appendix B Indices
- ******************
- * Menu:
- * Environment Variable Index:: Index of environment variables used
- * Output Variable Index:: Index of variables set in output files
- * Preprocessor Symbol Index:: Index of C preprocessor symbols defined
- * Cache Variable Index:: Index of documented cache variables
- * Autoconf Macro Index:: Index of Autoconf macros
- * M4 Macro Index:: Index of M4, M4sugar, and M4sh macros
- * Autotest Macro Index:: Index of Autotest macros
- * Program & Function Index:: Index of those with portability problems
- * Concept Index:: General index
- File: autoconf.info, Node: Environment Variable Index, Next: Output Variable Index, Up: Indices
- B.1 Environment Variable Index
- ==============================
- This is an alphabetical list of the environment variables that might
- influence Autoconf checks.
- �[index�]
- * Menu:
- * _: Special Shell Variables.
- (line 36)
- * BIN_SH: Special Shell Variables.
- (line 40)
- * CC: C Compiler. (line 61)
- * CDPATH: Special Shell Variables.
- (line 44)
- * CFLAGS <1>: C Compiler. (line 61)
- * CFLAGS: Preset Output Variables.
- (line 23)
- * CLICOLOR_FORCE: Special Shell Variables.
- (line 67)
- * CONFIG_COMMANDS: Obsolete config.status Use.
- (line 11)
- * CONFIG_FILES: Obsolete config.status Use.
- (line 15)
- * CONFIG_HEADERS: Obsolete config.status Use.
- (line 20)
- * CONFIG_LINKS: Obsolete config.status Use.
- (line 25)
- * CONFIG_SHELL: config.status Invocation.
- (line 102)
- * CONFIG_SITE: Site Defaults. (line 10)
- * CONFIG_STATUS: config.status Invocation.
- (line 108)
- * CPP: C Compiler. (line 113)
- * CPPFLAGS: Preset Output Variables.
- (line 72)
- * CXX: C++ Compiler. (line 7)
- * CXXCPP: C++ Compiler. (line 35)
- * CXXFLAGS <1>: C++ Compiler. (line 7)
- * CXXFLAGS: Preset Output Variables.
- (line 94)
- * CYGWIN: Obsolete Macros. (line 124)
- * DUALCASE: Special Shell Variables.
- (line 74)
- * ENV: Special Shell Variables.
- (line 84)
- * ERL: Erlang Compiler and Interpreter.
- (line 29)
- * ERLC: Erlang Compiler and Interpreter.
- (line 10)
- * ERLCFLAGS <1>: Erlang Compiler and Interpreter.
- (line 10)
- * ERLCFLAGS: Preset Output Variables.
- (line 120)
- * F77: Fortran Compiler. (line 19)
- * FC: Fortran Compiler. (line 44)
- * FCFLAGS <1>: Fortran Compiler. (line 44)
- * FCFLAGS: Preset Output Variables.
- (line 126)
- * FFLAGS <1>: Fortran Compiler. (line 19)
- * FFLAGS: Preset Output Variables.
- (line 133)
- * FPATH: Special Shell Variables.
- (line 101)
- * GOFLAGS: Preset Output Variables.
- (line 170)
- * GREP_OPTIONS: Special Shell Variables.
- (line 108)
- * IFS: Special Shell Variables.
- (line 116)
- * LANG: Special Shell Variables.
- (line 160)
- * LANGUAGE: Special Shell Variables.
- (line 167)
- * LC_ADDRESS: Special Shell Variables.
- (line 177)
- * LC_ALL <1>: Special Shell Variables.
- (line 160)
- * LC_ALL: Initialization Macros.
- (line 14)
- * LC_COLLATE: Special Shell Variables.
- (line 160)
- * LC_CTYPE: Special Shell Variables.
- (line 160)
- * LC_IDENTIFICATION: Special Shell Variables.
- (line 177)
- * LC_MEASUREMENT: Special Shell Variables.
- (line 177)
- * LC_MESSAGES: Special Shell Variables.
- (line 160)
- * LC_MONETARY: Special Shell Variables.
- (line 160)
- * LC_NAME: Special Shell Variables.
- (line 177)
- * LC_NUMERIC: Special Shell Variables.
- (line 160)
- * LC_PAPER: Special Shell Variables.
- (line 177)
- * LC_TELEPHONE: Special Shell Variables.
- (line 177)
- * LC_TIME: Special Shell Variables.
- (line 160)
- * LDFLAGS: Preset Output Variables.
- (line 140)
- * LIBS: Preset Output Variables.
- (line 154)
- * LINENO <1>: Special Shell Variables.
- (line 182)
- * LINENO: Initialization Macros.
- (line 67)
- * M4: autom4te Invocation. (line 10)
- * MAIL: Special Shell Variables.
- (line 84)
- * MAILPATH: Special Shell Variables.
- (line 84)
- * NULLCMD: Special Shell Variables.
- (line 311)
- * OBJC: Objective C Compiler.
- (line 7)
- * OBJCFLAGS <1>: Objective C Compiler.
- (line 7)
- * OBJCFLAGS: Preset Output Variables.
- (line 162)
- * OBJCPP: Objective C Compiler.
- (line 26)
- * OBJCXX: Objective C++ Compiler.
- (line 7)
- * OBJCXXCPP: Objective C++ Compiler.
- (line 27)
- * OBJCXXFLAGS <1>: Objective C++ Compiler.
- (line 7)
- * OBJCXXFLAGS: Preset Output Variables.
- (line 166)
- * options: Special Shell Variables.
- (line 318)
- * PATH_SEPARATOR: Special Shell Variables.
- (line 322)
- * POSIXLY_CORRECT: Special Shell Variables.
- (line 331)
- * PS1: Special Shell Variables.
- (line 84)
- * PS2: Special Shell Variables.
- (line 84)
- * PS4: Special Shell Variables.
- (line 84)
- * PWD: Special Shell Variables.
- (line 346)
- * RANDOM: Special Shell Variables.
- (line 355)
- * SHELL: Initialization Macros.
- (line 14)
- * SIMPLE_BACKUP_SUFFIX: autoupdate Invocation.
- (line 16)
- * status: Special Shell Variables.
- (line 363)
- * TMPDIR: Initialization Macros.
- (line 77)
- * WARNINGS <1>: autom4te Invocation. (line 58)
- * WARNINGS <2>: autoheader Invocation.
- (line 83)
- * WARNINGS <3>: autoreconf Invocation.
- (line 97)
- * WARNINGS: autoconf Invocation. (line 62)
- * XMKMF: System Services. (line 10)
- * YACC: Particular Programs. (line 200)
- * YFLAGS: Particular Programs. (line 200)
- File: autoconf.info, Node: Output Variable Index, Next: Preprocessor Symbol Index, Prev: Environment Variable Index, Up: Indices
- B.2 Output Variable Index
- =========================
- This is an alphabetical list of the variables that Autoconf can
- substitute into files that it creates, typically one or more makefiles.
- *Note Setting Output Variables::, for more information on how this is
- done.
- �[index�]
- * Menu:
- * abs_builddir: Preset Output Variables.
- (line 177)
- * abs_srcdir: Preset Output Variables.
- (line 199)
- * abs_top_builddir: Preset Output Variables.
- (line 192)
- * abs_top_srcdir: Preset Output Variables.
- (line 206)
- * ac_empty: Fortran Compiler. (line 465)
- * ALLOCA: Particular Functions.
- (line 10)
- * AWK: Particular Programs. (line 10)
- * bindir: Installation Directory Variables.
- (line 15)
- * build: Canonicalizing. (line 26)
- * build_alias: Canonicalizing. (line 9)
- * build_cpu: Canonicalizing. (line 26)
- * build_os: Canonicalizing. (line 26)
- * build_vendor: Canonicalizing. (line 26)
- * builddir: Preset Output Variables.
- (line 174)
- * CC <1>: System Services. (line 49)
- * CC: C Compiler. (line 61)
- * CFLAGS <1>: C Compiler. (line 61)
- * CFLAGS: Preset Output Variables.
- (line 23)
- * configure_input: Preset Output Variables.
- (line 58)
- * CPP: C Compiler. (line 113)
- * CPPFLAGS: Preset Output Variables.
- (line 72)
- * cross_compiling: Runtime. (line 71)
- * CXX: C++ Compiler. (line 7)
- * CXXCPP: C++ Compiler. (line 35)
- * CXXFLAGS <1>: C++ Compiler. (line 7)
- * CXXFLAGS: Preset Output Variables.
- (line 94)
- * datadir: Installation Directory Variables.
- (line 18)
- * datarootdir: Installation Directory Variables.
- (line 22)
- * DEFS: Preset Output Variables.
- (line 98)
- * docdir: Installation Directory Variables.
- (line 26)
- * dvidir: Installation Directory Variables.
- (line 30)
- * ECHO_C: Preset Output Variables.
- (line 108)
- * ECHO_N: Preset Output Variables.
- (line 108)
- * ECHO_T: Preset Output Variables.
- (line 108)
- * EGREP: Particular Programs. (line 29)
- * ERL <1>: Running the Compiler.
- (line 30)
- * ERL <2>: Language Choice. (line 40)
- * ERL: Erlang Compiler and Interpreter.
- (line 29)
- * ERLANG_ERTS_VER: Erlang Libraries. (line 12)
- * ERLANG_INSTALL_LIB_DIR <1>: Erlang Libraries. (line 86)
- * ERLANG_INSTALL_LIB_DIR: Installation Directory Variables.
- (line 201)
- * ERLANG_INSTALL_LIB_DIR_LIBRARY <1>: Erlang Libraries. (line 93)
- * ERLANG_INSTALL_LIB_DIR_LIBRARY: Installation Directory Variables.
- (line 206)
- * ERLANG_LIB_DIR: Erlang Libraries. (line 28)
- * ERLANG_LIB_DIR_LIBRARY: Erlang Libraries. (line 36)
- * ERLANG_LIB_VER_LIBRARY: Erlang Libraries. (line 36)
- * ERLANG_ROOT_DIR: Erlang Libraries. (line 22)
- * ERLC <1>: Language Choice. (line 40)
- * ERLC: Erlang Compiler and Interpreter.
- (line 10)
- * ERLCFLAGS <1>: Language Choice. (line 40)
- * ERLCFLAGS <2>: Erlang Compiler and Interpreter.
- (line 10)
- * ERLCFLAGS: Preset Output Variables.
- (line 120)
- * exec_prefix: Installation Directory Variables.
- (line 33)
- * EXEEXT <1>: Obsolete Macros. (line 178)
- * EXEEXT: Compilers and Preprocessors.
- (line 6)
- * F77: Fortran Compiler. (line 19)
- * FC: Fortran Compiler. (line 44)
- * FC_MODEXT: Fortran Compiler. (line 438)
- * FC_MODINC: Fortran Compiler. (line 465)
- * FC_MODOUT: Fortran Compiler. (line 501)
- * FCFLAGS <1>: Fortran Compiler. (line 44)
- * FCFLAGS: Preset Output Variables.
- (line 126)
- * FCLIBS: Fortran Compiler. (line 92)
- * FFLAGS <1>: Fortran Compiler. (line 19)
- * FFLAGS: Preset Output Variables.
- (line 133)
- * FGREP: Particular Programs. (line 36)
- * FLIBS: Fortran Compiler. (line 92)
- * GETGROUPS_LIBS: Particular Functions.
- (line 155)
- * GETLOADAVG_LIBS: Particular Functions.
- (line 161)
- * GOFLAGS: Preset Output Variables.
- (line 170)
- * GREP: Particular Programs. (line 20)
- * host: Canonicalizing. (line 34)
- * host_alias: Canonicalizing. (line 9)
- * host_cpu: Canonicalizing. (line 34)
- * host_os: Canonicalizing. (line 34)
- * host_vendor: Canonicalizing. (line 34)
- * htmldir: Installation Directory Variables.
- (line 40)
- * includedir: Installation Directory Variables.
- (line 43)
- * infodir: Installation Directory Variables.
- (line 46)
- * INSTALL: Particular Programs. (line 43)
- * INSTALL_DATA: Particular Programs. (line 43)
- * INSTALL_PROGRAM: Particular Programs. (line 43)
- * INSTALL_SCRIPT: Particular Programs. (line 43)
- * KMEM_GROUP: Particular Functions.
- (line 161)
- * LDFLAGS: Preset Output Variables.
- (line 140)
- * LEX: Particular Programs. (line 114)
- * LEX_OUTPUT_ROOT: Particular Programs. (line 114)
- * LEXLIB: Particular Programs. (line 114)
- * libdir: Installation Directory Variables.
- (line 49)
- * libexecdir: Installation Directory Variables.
- (line 52)
- * LIBOBJDIR: AC_LIBOBJ vs LIBOBJS.
- (line 35)
- * LIBOBJS <1>: Particular Structures.
- (line 26)
- * LIBOBJS <2>: Generic Functions. (line 56)
- * LIBOBJS: Particular Functions.
- (line 161)
- * LIBS <1>: Obsolete Macros. (line 295)
- * LIBS: Preset Output Variables.
- (line 154)
- * LN_S: Particular Programs. (line 168)
- * localedir: Installation Directory Variables.
- (line 55)
- * localstatedir: Installation Directory Variables.
- (line 60)
- * mandir: Installation Directory Variables.
- (line 63)
- * MKDIR_P: Particular Programs. (line 80)
- * NEED_SETGID: Particular Functions.
- (line 161)
- * OBJC: Objective C Compiler.
- (line 7)
- * OBJCFLAGS <1>: Objective C Compiler.
- (line 7)
- * OBJCFLAGS: Preset Output Variables.
- (line 162)
- * OBJCPP: Objective C Compiler.
- (line 26)
- * OBJCXX: Objective C++ Compiler.
- (line 7)
- * OBJCXXCPP: Objective C++ Compiler.
- (line 27)
- * OBJCXXFLAGS <1>: Objective C++ Compiler.
- (line 7)
- * OBJCXXFLAGS: Preset Output Variables.
- (line 166)
- * OBJEXT <1>: Obsolete Macros. (line 384)
- * OBJEXT: Compilers and Preprocessors.
- (line 11)
- * oldincludedir: Installation Directory Variables.
- (line 66)
- * OPENMP_CFLAGS: Generic Compiler Characteristics.
- (line 64)
- * OPENMP_CXXFLAGS: Generic Compiler Characteristics.
- (line 64)
- * OPENMP_FCFLAGS: Generic Compiler Characteristics.
- (line 64)
- * OPENMP_FFLAGS: Generic Compiler Characteristics.
- (line 64)
- * PACKAGE_BUGREPORT: Initializing configure.
- (line 57)
- * PACKAGE_NAME: Initializing configure.
- (line 45)
- * PACKAGE_STRING: Initializing configure.
- (line 54)
- * PACKAGE_TARNAME: Initializing configure.
- (line 48)
- * PACKAGE_URL: Initializing configure.
- (line 61)
- * PACKAGE_VERSION: Initializing configure.
- (line 51)
- * pdfdir: Installation Directory Variables.
- (line 69)
- * POW_LIB: Particular Functions.
- (line 408)
- * prefix: Installation Directory Variables.
- (line 72)
- * program_transform_name: Transforming Names. (line 11)
- * psdir: Installation Directory Variables.
- (line 77)
- * RANLIB: Particular Programs. (line 187)
- * sbindir: Installation Directory Variables.
- (line 80)
- * SED: Particular Programs. (line 191)
- * SET_MAKE: Output. (line 45)
- * sharedstatedir: Installation Directory Variables.
- (line 84)
- * srcdir: Preset Output Variables.
- (line 195)
- * subdirs: Subdirectories. (line 12)
- * sysconfdir: Installation Directory Variables.
- (line 88)
- * target: Canonicalizing. (line 41)
- * target_alias: Canonicalizing. (line 9)
- * target_cpu: Canonicalizing. (line 41)
- * target_os: Canonicalizing. (line 41)
- * target_vendor: Canonicalizing. (line 41)
- * tmp: Initialization Macros.
- (line 77)
- * top_build_prefix: Preset Output Variables.
- (line 184)
- * top_builddir: Preset Output Variables.
- (line 180)
- * top_srcdir: Preset Output Variables.
- (line 202)
- * X_CFLAGS: System Services. (line 30)
- * X_EXTRA_LIBS: System Services. (line 30)
- * X_LIBS: System Services. (line 30)
- * X_PRE_LIBS: System Services. (line 30)
- * YACC: Particular Programs. (line 200)
- File: autoconf.info, Node: Preprocessor Symbol Index, Next: Cache Variable Index, Prev: Output Variable Index, Up: Indices
- B.3 Preprocessor Symbol Index
- =============================
- This is an alphabetical list of the C preprocessor symbols that the
- Autoconf macros define. To work with Autoconf, C source code needs to
- use these names in `#if' or `#ifdef' directives.
- �[index�]
- * Menu:
- * __CHAR_UNSIGNED__: C Compiler. (line 291)
- * __EXTENSIONS__: Posix Variants. (line 10)
- * __PROTOTYPES: C Compiler. (line 351)
- * _ALL_SOURCE <1>: Obsolete Macros. (line 20)
- * _ALL_SOURCE: Posix Variants. (line 10)
- * _FILE_OFFSET_BITS: System Services. (line 49)
- * _GNU_SOURCE <1>: Obsolete Macros. (line 234)
- * _GNU_SOURCE: Posix Variants. (line 10)
- * _LARGE_FILES: System Services. (line 49)
- * _LARGEFILE_SOURCE: Particular Functions.
- (line 147)
- * _MINIX <1>: Obsolete Macros. (line 371)
- * _MINIX: Posix Variants. (line 10)
- * _OPENMP: Generic Compiler Characteristics.
- (line 64)
- * _POSIX_1_SOURCE <1>: Obsolete Macros. (line 371)
- * _POSIX_1_SOURCE: Posix Variants. (line 10)
- * _POSIX_PTHREAD_SEMANTICS: Posix Variants. (line 10)
- * _POSIX_SOURCE <1>: Obsolete Macros. (line 371)
- * _POSIX_SOURCE: Posix Variants. (line 10)
- * _POSIX_VERSION: Particular Headers. (line 228)
- * _TANDEM_SOURCE: Posix Variants. (line 10)
- * ALIGNOF_TYPE: Generic Compiler Characteristics.
- (line 30)
- * C_ALLOCA: Particular Functions.
- (line 10)
- * C_GETLOADAVG: Particular Functions.
- (line 161)
- * CLOSEDIR_VOID: Particular Functions.
- (line 69)
- * const: C Compiler. (line 217)
- * CXX_NO_MINUS_C_MINUS_O: C++ Compiler. (line 48)
- * DGUX: Particular Functions.
- (line 161)
- * DIRENT: Obsolete Macros. (line 158)
- * F77_DUMMY_MAIN: Fortran Compiler. (line 130)
- * F77_FUNC: Fortran Compiler. (line 202)
- * F77_FUNC_: Fortran Compiler. (line 202)
- * F77_MAIN: Fortran Compiler. (line 176)
- * F77_NO_MINUS_C_MINUS_O: Fortran Compiler. (line 76)
- * FC_DUMMY_MAIN: Fortran Compiler. (line 130)
- * FC_FUNC: Fortran Compiler. (line 202)
- * FC_FUNC_: Fortran Compiler. (line 202)
- * FC_MAIN: Fortran Compiler. (line 176)
- * FC_NO_MINUS_C_MINUS_O: Fortran Compiler. (line 76)
- * FLEXIBLE_ARRAY_MEMBER: C Compiler. (line 315)
- * GETGROUPS_T: Particular Types. (line 14)
- * GETLOADAVG_PRIVILEGED: Particular Functions.
- (line 161)
- * GETPGRP_VOID: Particular Functions.
- (line 205)
- * gid_t: Particular Types. (line 126)
- * GWINSZ_IN_SYS_IOCTL: Particular Headers. (line 270)
- * HAVE__BOOL: Particular Headers. (line 10)
- * HAVE_AGGREGATE_MEMBER: Generic Structures. (line 29)
- * HAVE_ALLOCA_H: Particular Functions.
- (line 10)
- * HAVE_C_BACKSLASH_A: C Compiler. (line 176)
- * HAVE_C_VARARRAYS: C Compiler. (line 339)
- * HAVE_CHOWN: Particular Functions.
- (line 63)
- * HAVE_CONFIG_H: Configuration Headers.
- (line 33)
- * HAVE_DECL_STRERROR_R: Particular Functions.
- (line 388)
- * HAVE_DECL_SYMBOL: Generic Declarations.
- (line 34)
- * HAVE_DECL_TZNAME: Particular Structures.
- (line 43)
- * HAVE_DIRENT_H: Particular Headers. (line 25)
- * HAVE_DOPRNT: Particular Functions.
- (line 443)
- * HAVE_FSEEKO: Particular Functions.
- (line 147)
- * HAVE_FUNCTION: Generic Functions. (line 27)
- * HAVE_GETGROUPS: Particular Functions.
- (line 155)
- * HAVE_GETMNTENT: Particular Functions.
- (line 195)
- * HAVE_HEADER: Generic Headers. (line 46)
- * HAVE_INT16_T: Particular Types. (line 40)
- * HAVE_INT32_T: Particular Types. (line 43)
- * HAVE_INT64_T: Particular Types. (line 46)
- * HAVE_INT8_T: Particular Types. (line 21)
- * HAVE_INTMAX_T: Particular Types. (line 49)
- * HAVE_INTPTR_T: Particular Types. (line 54)
- * HAVE_LONG_DOUBLE <1>: Obsolete Macros. (line 33)
- * HAVE_LONG_DOUBLE: Particular Types. (line 59)
- * HAVE_LONG_DOUBLE_WIDER: Particular Types. (line 70)
- * HAVE_LONG_FILE_NAMES: System Services. (line 71)
- * HAVE_LONG_LONG_INT: Particular Types. (line 78)
- * HAVE_LSTAT_EMPTY_STRING_BUG: Particular Functions.
- (line 363)
- * HAVE_MALLOC: Particular Functions.
- (line 247)
- * HAVE_MBRTOWC: Particular Functions.
- (line 279)
- * HAVE_MMAP: Particular Functions.
- (line 311)
- * HAVE_NDIR_H: Particular Headers. (line 25)
- * HAVE_NLIST_H: Particular Functions.
- (line 161)
- * HAVE_OBSTACK: Particular Functions.
- (line 319)
- * HAVE_REALLOC: Particular Functions.
- (line 326)
- * HAVE_RESOLV_H: Particular Headers. (line 73)
- * HAVE_RESTARTABLE_SYSCALLS: Obsolete Macros. (line 548)
- * HAVE_ST_BLKSIZE: Obsolete Macros. (line 521)
- * HAVE_ST_BLOCKS: Particular Structures.
- (line 26)
- * HAVE_ST_RDEV: Obsolete Macros. (line 530)
- * HAVE_STAT_EMPTY_STRING_BUG: Particular Functions.
- (line 363)
- * HAVE_STDBOOL_H: Particular Headers. (line 101)
- * HAVE_STRCOLL: Particular Functions.
- (line 379)
- * HAVE_STRERROR_R: Particular Functions.
- (line 388)
- * HAVE_STRFTIME: Particular Functions.
- (line 401)
- * HAVE_STRINGIZE: C Compiler. (line 305)
- * HAVE_STRNLEN: Particular Functions.
- (line 426)
- * HAVE_STRTOLD: Particular Functions.
- (line 420)
- * HAVE_STRUCT_DIRENT_D_INO: Particular Structures.
- (line 9)
- * HAVE_STRUCT_DIRENT_D_TYPE: Particular Structures.
- (line 21)
- * HAVE_STRUCT_STAT_ST_BLKSIZE: Obsolete Macros. (line 521)
- * HAVE_STRUCT_STAT_ST_BLOCKS: Particular Structures.
- (line 26)
- * HAVE_STRUCT_STAT_ST_RDEV: Obsolete Macros. (line 530)
- * HAVE_STRUCT_TM_TM_ZONE: Particular Structures.
- (line 43)
- * HAVE_SYS_DIR_H: Particular Headers. (line 25)
- * HAVE_SYS_NDIR_H: Particular Headers. (line 25)
- * HAVE_SYS_WAIT_H: Particular Headers. (line 204)
- * HAVE_TM_ZONE: Particular Structures.
- (line 43)
- * HAVE_TYPE: Generic Types. (line 28)
- * HAVE_TYPEOF: C Compiler. (line 345)
- * HAVE_TZNAME: Particular Structures.
- (line 43)
- * HAVE_UINT16_T: Particular Types. (line 138)
- * HAVE_UINT32_T: Particular Types. (line 141)
- * HAVE_UINT64_T: Particular Types. (line 144)
- * HAVE_UINT8_T: Particular Types. (line 132)
- * HAVE_UINTMAX_T: Particular Types. (line 147)
- * HAVE_UINTPTR_T: Particular Types. (line 152)
- * HAVE_UNSIGNED_LONG_LONG_INT: Particular Types. (line 157)
- * HAVE_UTIME_NULL: Particular Functions.
- (line 433)
- * HAVE_VFORK_H: Particular Functions.
- (line 120)
- * HAVE_VPRINTF: Particular Functions.
- (line 443)
- * HAVE_WAIT3: Obsolete Macros. (line 216)
- * HAVE_WORKING_FORK: Particular Functions.
- (line 120)
- * HAVE_WORKING_VFORK: Particular Functions.
- (line 120)
- * inline: C Compiler. (line 286)
- * int16_t: Particular Types. (line 40)
- * int32_t: Particular Types. (line 43)
- * int64_t: Particular Types. (line 46)
- * int8_t: Particular Types. (line 21)
- * INT_16_BITS: Obsolete Macros. (line 275)
- * intmax_t: Particular Types. (line 49)
- * intptr_t: Particular Types. (line 54)
- * LONG_64_BITS: Obsolete Macros. (line 337)
- * LSTAT_FOLLOWS_SLASHED_SYMLINK: Particular Functions.
- (line 228)
- * MAJOR_IN_MKDEV: Particular Headers. (line 68)
- * MAJOR_IN_SYSMACROS: Particular Headers. (line 68)
- * malloc: Particular Functions.
- (line 247)
- * mbstate_t: Particular Types. (line 88)
- * mode_t: Particular Types. (line 96)
- * NDEBUG: Particular Headers. (line 20)
- * NDIR: Obsolete Macros. (line 158)
- * NEED_MEMORY_H: Obsolete Macros. (line 358)
- * NEED_SETGID: Particular Functions.
- (line 161)
- * NLIST_NAME_UNION: Particular Functions.
- (line 161)
- * NO_MINUS_C_MINUS_O: C Compiler. (line 102)
- * off_t: Particular Types. (line 102)
- * PACKAGE_BUGREPORT: Initializing configure.
- (line 57)
- * PACKAGE_NAME: Initializing configure.
- (line 45)
- * PACKAGE_STRING: Initializing configure.
- (line 54)
- * PACKAGE_TARNAME: Initializing configure.
- (line 48)
- * PACKAGE_URL: Initializing configure.
- (line 61)
- * PACKAGE_VERSION: Initializing configure.
- (line 51)
- * PARAMS: C Compiler. (line 351)
- * pid_t: Particular Types. (line 108)
- * PROTOTYPES: C Compiler. (line 351)
- * realloc: Particular Functions.
- (line 326)
- * restrict: C Compiler. (line 247)
- * RETSIGTYPE: Obsolete Macros. (line 662)
- * SELECT_TYPE_ARG1: Particular Functions.
- (line 337)
- * SELECT_TYPE_ARG234: Particular Functions.
- (line 337)
- * SELECT_TYPE_ARG5: Particular Functions.
- (line 337)
- * SETPGRP_VOID: Particular Functions.
- (line 348)
- * SETVBUF_REVERSED: Obsolete Macros. (line 208)
- * size_t: Particular Types. (line 114)
- * SIZEOF_TYPE-OR-EXPR: Generic Compiler Characteristics.
- (line 8)
- * ssize_t: Particular Types. (line 120)
- * STAT_MACROS_BROKEN: Particular Headers. (line 92)
- * STDC_HEADERS: Particular Headers. (line 135)
- * STRERROR_R_CHAR_P: Particular Functions.
- (line 388)
- * SVR4: Particular Functions.
- (line 161)
- * SYS_SIGLIST_DECLARED: Obsolete Macros. (line 141)
- * SYSDIR: Obsolete Macros. (line 158)
- * SYSNDIR: Obsolete Macros. (line 158)
- * TIME_WITH_SYS_TIME: Particular Headers. (line 244)
- * TM_IN_SYS_TIME: Particular Structures.
- (line 35)
- * typeof: C Compiler. (line 345)
- * uid_t: Particular Types. (line 126)
- * uint16_t: Particular Types. (line 138)
- * uint32_t: Particular Types. (line 141)
- * uint64_t: Particular Types. (line 144)
- * uint8_t: Particular Types. (line 132)
- * uintmax_t: Particular Types. (line 147)
- * uintptr_t: Particular Types. (line 152)
- * UMAX: Particular Functions.
- (line 161)
- * UMAX4_3: Particular Functions.
- (line 161)
- * USG: Obsolete Macros. (line 685)
- * VARIABLE: Defining Symbols. (line 32)
- * vfork: Particular Functions.
- (line 120)
- * volatile: C Compiler. (line 265)
- * WORDS_BIGENDIAN: C Compiler. (line 184)
- * X_DISPLAY_MISSING: System Services. (line 30)
- * YYTEXT_POINTER: Particular Programs. (line 114)
- File: autoconf.info, Node: Cache Variable Index, Next: Autoconf Macro Index, Prev: Preprocessor Symbol Index, Up: Indices
- B.4 Cache Variable Index
- ========================
- This is an alphabetical list of documented cache variables used by
- macros defined in Autoconf. Autoconf macros may use additional cache
- variables internally.
- �[index�]
- * Menu:
- * ac_cv_alignof_TYPE-OR-EXPR: Generic Compiler Characteristics.
- (line 30)
- * ac_cv_c_const: C Compiler. (line 217)
- * ac_cv_c_int16_t: Particular Types. (line 40)
- * ac_cv_c_int32_t: Particular Types. (line 43)
- * ac_cv_c_int64_t: Particular Types. (line 46)
- * ac_cv_c_int8_t: Particular Types. (line 21)
- * ac_cv_c_restrict: C Compiler. (line 247)
- * ac_cv_c_uint16_t: Particular Types. (line 138)
- * ac_cv_c_uint32_t: Particular Types. (line 141)
- * ac_cv_c_uint64_t: Particular Types. (line 144)
- * ac_cv_c_uint8_t: Particular Types. (line 132)
- * ac_cv_f77_compiler_gnu: Fortran Compiler. (line 19)
- * ac_cv_f77_dummy_main: Fortran Compiler. (line 130)
- * ac_cv_f77_implicit_none: Fortran Compiler. (line 427)
- * ac_cv_f77_libs: Fortran Compiler. (line 92)
- * ac_cv_f77_main: Fortran Compiler. (line 176)
- * ac_cv_f77_mangling: Fortran Compiler. (line 202)
- * ac_cv_fc_check_bounds: Fortran Compiler. (line 413)
- * ac_cv_fc_compiler_gnu: Fortran Compiler. (line 44)
- * ac_cv_fc_dummy_main: Fortran Compiler. (line 130)
- * ac_cv_fc_fixedform: Fortran Compiler. (line 375)
- * ac_cv_fc_freeform: Fortran Compiler. (line 351)
- * ac_cv_fc_implicit_none: Fortran Compiler. (line 427)
- * ac_cv_fc_libs: Fortran Compiler. (line 92)
- * ac_cv_fc_line_length: Fortran Compiler. (line 396)
- * ac_cv_fc_main: Fortran Compiler. (line 176)
- * ac_cv_fc_mangling: Fortran Compiler. (line 202)
- * ac_cv_fc_module_ext: Fortran Compiler. (line 438)
- * ac_cv_fc_module_flag: Fortran Compiler. (line 465)
- * ac_cv_fc_module_output_flag: Fortran Compiler. (line 501)
- * ac_cv_fc_pp_define: Fortran Compiler. (line 336)
- * ac_cv_fc_pp_srcext_EXT: Fortran Compiler. (line 279)
- * ac_cv_fc_srcext_EXT: Fortran Compiler. (line 279)
- * ac_cv_file_FILE: Files. (line 13)
- * ac_cv_func_chown_works: Particular Functions.
- (line 63)
- * ac_cv_func_closedir_void: Particular Functions.
- (line 69)
- * ac_cv_func_fnmatch_gnu: Particular Functions.
- (line 109)
- * ac_cv_func_fnmatch_works: Particular Functions.
- (line 94)
- * ac_cv_func_FUNCTION: Generic Functions. (line 15)
- * ac_cv_func_getgroups_works: Particular Functions.
- (line 155)
- * ac_cv_func_getpgrp_void: Particular Functions.
- (line 205)
- * ac_cv_func_lstat_dereferences_slashed_symlink: Particular Functions.
- (line 228)
- * ac_cv_func_lstat_empty_string_bug: Particular Functions.
- (line 363)
- * ac_cv_func_malloc_0_nonnull: Particular Functions.
- (line 247)
- * ac_cv_func_mbrtowc: Particular Functions.
- (line 279)
- * ac_cv_func_memcmp_working: Particular Functions.
- (line 286)
- * ac_cv_func_mmap_fixed_mapped: Particular Functions.
- (line 311)
- * ac_cv_func_obstack: Particular Functions.
- (line 319)
- * ac_cv_func_pow: Particular Functions.
- (line 408)
- * ac_cv_func_realloc_0_nonnull: Particular Functions.
- (line 326)
- * ac_cv_func_setpgrp_void: Particular Functions.
- (line 348)
- * ac_cv_func_stat_empty_string_bug: Particular Functions.
- (line 363)
- * ac_cv_func_strcoll_works: Particular Functions.
- (line 379)
- * ac_cv_func_strerror_r_char_p: Particular Functions.
- (line 388)
- * ac_cv_func_strnlen_working: Particular Functions.
- (line 426)
- * ac_cv_func_strtod: Particular Functions.
- (line 408)
- * ac_cv_func_strtold: Particular Functions.
- (line 420)
- * ac_cv_func_utime_null: Particular Functions.
- (line 433)
- * ac_cv_func_working_mktime: Particular Functions.
- (line 299)
- * ac_cv_have_decl_SYMBOL: Generic Declarations.
- (line 11)
- * ac_cv_header_HEADER-FILE: Generic Headers. (line 13)
- * ac_cv_header_stdbool_h: Particular Headers. (line 10)
- * ac_cv_header_stdc: Particular Headers. (line 135)
- * ac_cv_header_sys_wait_h: Particular Headers. (line 204)
- * ac_cv_header_time: Particular Headers. (line 244)
- * ac_cv_lib_error_at_line: Particular Functions.
- (line 84)
- * ac_cv_lib_LIBRARY_FUNCTION: Libraries. (line 11)
- * ac_cv_member_AGGREGATE_MEMBER: Generic Structures. (line 11)
- * ac_cv_member_struct_stat_st_blocks: Particular Structures.
- (line 26)
- * ac_cv_path_install: Particular Programs. (line 43)
- * ac_cv_path_mkdir: Particular Programs. (line 80)
- * ac_cv_path_SED: Particular Programs. (line 191)
- * ac_cv_path_VARIABLE: Generic Programs. (line 108)
- * ac_cv_prog_AWK: Particular Programs. (line 10)
- * ac_cv_prog_c_openmp: Generic Compiler Characteristics.
- (line 64)
- * ac_cv_prog_cc_c89: C Compiler. (line 61)
- * ac_cv_prog_cc_c99: C Compiler. (line 161)
- * ac_cv_prog_cc_COMPILER_c_o: C Compiler. (line 102)
- * ac_cv_prog_cc_stdc: C Compiler. (line 137)
- * ac_cv_prog_cxx_openmp: Generic Compiler Characteristics.
- (line 64)
- * ac_cv_prog_EGREP: Particular Programs. (line 29)
- * ac_cv_prog_f77_c_o: Fortran Compiler. (line 76)
- * ac_cv_prog_f77_g: Fortran Compiler. (line 19)
- * ac_cv_prog_f77_openmp: Generic Compiler Characteristics.
- (line 64)
- * ac_cv_prog_f77_v: Fortran Compiler. (line 92)
- * ac_cv_prog_fc_c_o: Fortran Compiler. (line 76)
- * ac_cv_prog_fc_g: Fortran Compiler. (line 44)
- * ac_cv_prog_fc_openmp: Generic Compiler Characteristics.
- (line 64)
- * ac_cv_prog_fc_v: Fortran Compiler. (line 92)
- * ac_cv_prog_FGREP: Particular Programs. (line 36)
- * ac_cv_prog_GREP: Particular Programs. (line 20)
- * ac_cv_prog_LEX: Particular Programs. (line 114)
- * ac_cv_prog_VARIABLE: Generic Programs. (line 24)
- * ac_cv_prog_YACC: Particular Programs. (line 200)
- * ac_cv_search_FUNCTION: Libraries. (line 52)
- * ac_cv_search_getmntent: Particular Functions.
- (line 195)
- * ac_cv_sizeof_TYPE-OR-EXPR: Generic Compiler Characteristics.
- (line 8)
- * ac_cv_sys_posix_termios: System Services. (line 75)
- * ac_cv_type_getgroups: Particular Types. (line 14)
- * ac_cv_type_long_double: Particular Types. (line 59)
- * ac_cv_type_long_double_wider: Particular Types. (line 70)
- * ac_cv_type_long_long_int: Particular Types. (line 78)
- * ac_cv_type_mbstate_t: Particular Types. (line 88)
- * ac_cv_type_mode_t: Particular Types. (line 96)
- * ac_cv_type_off_t: Particular Types. (line 102)
- * ac_cv_type_pid_t: Particular Types. (line 108)
- * ac_cv_type_size_t: Particular Types. (line 114)
- * ac_cv_type_ssize_t: Particular Types. (line 120)
- * ac_cv_type_TYPE: Generic Types. (line 11)
- * ac_cv_type_uid_t: Particular Types. (line 126)
- * ac_cv_type_unsigned_long_long_int: Particular Types. (line 157)
- File: autoconf.info, Node: Autoconf Macro Index, Next: M4 Macro Index, Prev: Cache Variable Index, Up: Indices
- B.5 Autoconf Macro Index
- ========================
- This is an alphabetical list of the Autoconf macros.
- �[index�]
- * Menu:
- * AC_ACT_IFELSE: AC_ACT_IFELSE vs AC_TRY_ACT.
- (line 6)
- * AC_AIX: Obsolete Macros. (line 20)
- * AC_ALLOCA: Obsolete Macros. (line 24)
- * AC_ARG_ARRAY: Obsolete Macros. (line 27)
- * AC_ARG_ENABLE: Package Options. (line 35)
- * AC_ARG_PROGRAM: Transforming Names. (line 11)
- * AC_ARG_VAR: Setting Output Variables.
- (line 79)
- * AC_ARG_WITH: External Software. (line 36)
- * AC_AUTOCONF_VERSION: Versioning. (line 21)
- * AC_BEFORE: Suggested Ordering. (line 28)
- * AC_C_BACKSLASH_A: C Compiler. (line 176)
- * AC_C_BIGENDIAN: C Compiler. (line 184)
- * AC_C_CHAR_UNSIGNED: C Compiler. (line 291)
- * AC_C_CONST: C Compiler. (line 217)
- * AC_C_CROSS: Obsolete Macros. (line 30)
- * AC_C_FLEXIBLE_ARRAY_MEMBER: C Compiler. (line 315)
- * AC_C_INLINE: C Compiler. (line 286)
- * AC_C_LONG_DOUBLE: Obsolete Macros. (line 33)
- * AC_C_PROTOTYPES: C Compiler. (line 351)
- * AC_C_RESTRICT: C Compiler. (line 247)
- * AC_C_STRINGIZE: C Compiler. (line 305)
- * AC_C_TYPEOF: C Compiler. (line 345)
- * AC_C_VARARRAYS: C Compiler. (line 339)
- * AC_C_VOLATILE: C Compiler. (line 265)
- * AC_CACHE_CHECK: Caching Results. (line 30)
- * AC_CACHE_LOAD: Cache Checkpointing. (line 13)
- * AC_CACHE_SAVE: Cache Checkpointing. (line 17)
- * AC_CACHE_VAL: Caching Results. (line 16)
- * AC_CANONICAL_BUILD: Canonicalizing. (line 26)
- * AC_CANONICAL_HOST: Canonicalizing. (line 34)
- * AC_CANONICAL_SYSTEM: Obsolete Macros. (line 41)
- * AC_CANONICAL_TARGET: Canonicalizing. (line 41)
- * AC_CHAR_UNSIGNED: Obsolete Macros. (line 51)
- * AC_CHECK_ALIGNOF: Generic Compiler Characteristics.
- (line 30)
- * AC_CHECK_DECL: Generic Declarations.
- (line 11)
- * AC_CHECK_DECLS: Generic Declarations.
- (line 34)
- * AC_CHECK_DECLS_ONCE: Generic Declarations.
- (line 79)
- * AC_CHECK_FILE: Files. (line 13)
- * AC_CHECK_FILES: Files. (line 21)
- * AC_CHECK_FUNC: Generic Functions. (line 15)
- * AC_CHECK_FUNCS: Generic Functions. (line 27)
- * AC_CHECK_FUNCS_ONCE: Generic Functions. (line 38)
- * AC_CHECK_HEADER: Generic Headers. (line 13)
- * AC_CHECK_HEADER_STDBOOL: Particular Headers. (line 10)
- * AC_CHECK_HEADERS: Generic Headers. (line 46)
- * AC_CHECK_HEADERS_ONCE: Generic Headers. (line 87)
- * AC_CHECK_LIB: Libraries. (line 11)
- * AC_CHECK_MEMBER: Generic Structures. (line 11)
- * AC_CHECK_MEMBERS: Generic Structures. (line 29)
- * AC_CHECK_PROG: Generic Programs. (line 24)
- * AC_CHECK_PROGS: Generic Programs. (line 36)
- * AC_CHECK_SIZEOF: Generic Compiler Characteristics.
- (line 8)
- * AC_CHECK_TARGET_TOOL: Generic Programs. (line 48)
- * AC_CHECK_TARGET_TOOLS: Generic Programs. (line 79)
- * AC_CHECK_TOOL: Generic Programs. (line 64)
- * AC_CHECK_TOOLS: Generic Programs. (line 92)
- * AC_CHECK_TYPE <1>: Obsolete Macros. (line 54)
- * AC_CHECK_TYPE: Generic Types. (line 11)
- * AC_CHECK_TYPES: Generic Types. (line 28)
- * AC_CHECKING: Obsolete Macros. (line 101)
- * AC_COMPILE_CHECK: Obsolete Macros. (line 109)
- * AC_COMPILE_IFELSE: Running the Compiler.
- (line 13)
- * AC_COMPUTE_INT: Generic Compiler Characteristics.
- (line 42)
- * AC_CONFIG_AUX_DIR: Input. (line 20)
- * AC_CONFIG_COMMANDS: Configuration Commands.
- (line 13)
- * AC_CONFIG_COMMANDS_POST: Configuration Commands.
- (line 41)
- * AC_CONFIG_COMMANDS_PRE: Configuration Commands.
- (line 35)
- * AC_CONFIG_FILES: Configuration Files. (line 9)
- * AC_CONFIG_HEADERS: Configuration Headers.
- (line 33)
- * AC_CONFIG_ITEMS: Configuration Actions.
- (line 12)
- * AC_CONFIG_LIBOBJ_DIR: Generic Functions. (line 97)
- * AC_CONFIG_LINKS: Configuration Links. (line 12)
- * AC_CONFIG_MACRO_DIR: Input. (line 48)
- * AC_CONFIG_SRCDIR: Input. (line 7)
- * AC_CONFIG_SUBDIRS: Subdirectories. (line 12)
- * AC_CONFIG_TESTDIR: Making testsuite Scripts.
- (line 26)
- * AC_CONST: Obsolete Macros. (line 117)
- * AC_COPYRIGHT: Notices. (line 10)
- * AC_CROSS_CHECK: Obsolete Macros. (line 120)
- * AC_CYGWIN: Obsolete Macros. (line 124)
- * AC_DATAROOTDIR_CHECKED: Changed Directory Variables.
- (line 58)
- * AC_DECL_SYS_SIGLIST: Obsolete Macros. (line 141)
- * AC_DECL_YYTEXT: Obsolete Macros. (line 154)
- * AC_DEFINE: Defining Symbols. (line 32)
- * AC_DEFINE_UNQUOTED: Defining Symbols. (line 74)
- * AC_DEFUN: Macro Definitions. (line 7)
- * AC_DEFUN_ONCE: One-Shot Macros. (line 14)
- * AC_DIAGNOSE: Reporting Messages. (line 18)
- * AC_DIR_HEADER: Obsolete Macros. (line 158)
- * AC_DISABLE_OPTION_CHECKING: Option Checking. (line 28)
- * AC_DYNIX_SEQ: Obsolete Macros. (line 170)
- * AC_EGREP_CPP: Running the Preprocessor.
- (line 74)
- * AC_EGREP_HEADER: Running the Preprocessor.
- (line 67)
- * AC_EMXOS2: Obsolete Macros. (line 183)
- * AC_ENABLE: Obsolete Macros. (line 189)
- * AC_ERLANG_CHECK_LIB: Erlang Libraries. (line 36)
- * AC_ERLANG_NEED_ERL: Erlang Compiler and Interpreter.
- (line 41)
- * AC_ERLANG_NEED_ERLC: Erlang Compiler and Interpreter.
- (line 24)
- * AC_ERLANG_PATH_ERL: Erlang Compiler and Interpreter.
- (line 29)
- * AC_ERLANG_PATH_ERLC: Erlang Compiler and Interpreter.
- (line 10)
- * AC_ERLANG_SUBST_ERTS_VER: Erlang Libraries. (line 12)
- * AC_ERLANG_SUBST_INSTALL_LIB_DIR <1>: Erlang Libraries. (line 86)
- * AC_ERLANG_SUBST_INSTALL_LIB_DIR: Installation Directory Variables.
- (line 201)
- * AC_ERLANG_SUBST_INSTALL_LIB_SUBDIR <1>: Erlang Libraries. (line 93)
- * AC_ERLANG_SUBST_INSTALL_LIB_SUBDIR: Installation Directory Variables.
- (line 206)
- * AC_ERLANG_SUBST_LIB_DIR: Erlang Libraries. (line 28)
- * AC_ERLANG_SUBST_ROOT_DIR: Erlang Libraries. (line 22)
- * AC_ERROR: Obsolete Macros. (line 193)
- * AC_EXEEXT: Obsolete Macros. (line 178)
- * AC_F77_DUMMY_MAIN: Fortran Compiler. (line 130)
- * AC_F77_FUNC: Fortran Compiler. (line 266)
- * AC_F77_IMPLICIT_NONE: Fortran Compiler. (line 427)
- * AC_F77_LIBRARY_LDFLAGS: Fortran Compiler. (line 92)
- * AC_F77_MAIN: Fortran Compiler. (line 176)
- * AC_F77_WRAPPERS: Fortran Compiler. (line 202)
- * AC_FATAL: Reporting Messages. (line 34)
- * AC_FC_CHECK_BOUNDS: Fortran Compiler. (line 413)
- * AC_FC_DUMMY_MAIN: Fortran Compiler. (line 130)
- * AC_FC_FIXEDFORM: Fortran Compiler. (line 375)
- * AC_FC_FREEFORM: Fortran Compiler. (line 351)
- * AC_FC_FUNC: Fortran Compiler. (line 266)
- * AC_FC_IMPLICIT_NONE: Fortran Compiler. (line 427)
- * AC_FC_LIBRARY_LDFLAGS: Fortran Compiler. (line 92)
- * AC_FC_LINE_LENGTH: Fortran Compiler. (line 396)
- * AC_FC_MAIN: Fortran Compiler. (line 176)
- * AC_FC_MODULE_EXTENSION: Fortran Compiler. (line 438)
- * AC_FC_MODULE_FLAG: Fortran Compiler. (line 465)
- * AC_FC_MODULE_OUTPUT_FLAG: Fortran Compiler. (line 501)
- * AC_FC_PP_DEFINE: Fortran Compiler. (line 336)
- * AC_FC_PP_SRCEXT: Fortran Compiler. (line 279)
- * AC_FC_SRCEXT: Fortran Compiler. (line 279)
- * AC_FC_WRAPPERS: Fortran Compiler. (line 202)
- * AC_FIND_X: Obsolete Macros. (line 196)
- * AC_FIND_XTRA: Obsolete Macros. (line 199)
- * AC_FOREACH: Obsolete Macros. (line 202)
- * AC_FUNC_ALLOCA: Particular Functions.
- (line 10)
- * AC_FUNC_CHECK: Obsolete Macros. (line 205)
- * AC_FUNC_CHOWN: Particular Functions.
- (line 63)
- * AC_FUNC_CLOSEDIR_VOID: Particular Functions.
- (line 69)
- * AC_FUNC_ERROR_AT_LINE: Particular Functions.
- (line 84)
- * AC_FUNC_FNMATCH: Particular Functions.
- (line 94)
- * AC_FUNC_FNMATCH_GNU: Particular Functions.
- (line 109)
- * AC_FUNC_FORK: Particular Functions.
- (line 120)
- * AC_FUNC_FSEEKO: Particular Functions.
- (line 147)
- * AC_FUNC_GETGROUPS: Particular Functions.
- (line 155)
- * AC_FUNC_GETLOADAVG: Particular Functions.
- (line 161)
- * AC_FUNC_GETMNTENT: Particular Functions.
- (line 195)
- * AC_FUNC_GETPGRP: Particular Functions.
- (line 205)
- * AC_FUNC_LSTAT: Particular Functions.
- (line 363)
- * AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK: Particular Functions.
- (line 228)
- * AC_FUNC_MALLOC: Particular Functions.
- (line 247)
- * AC_FUNC_MBRTOWC: Particular Functions.
- (line 279)
- * AC_FUNC_MEMCMP: Particular Functions.
- (line 286)
- * AC_FUNC_MKTIME: Particular Functions.
- (line 299)
- * AC_FUNC_MMAP: Particular Functions.
- (line 311)
- * AC_FUNC_OBSTACK: Particular Functions.
- (line 319)
- * AC_FUNC_REALLOC: Particular Functions.
- (line 326)
- * AC_FUNC_SELECT_ARGTYPES: Particular Functions.
- (line 337)
- * AC_FUNC_SETPGRP: Particular Functions.
- (line 348)
- * AC_FUNC_SETVBUF_REVERSED: Obsolete Macros. (line 208)
- * AC_FUNC_STAT: Particular Functions.
- (line 363)
- * AC_FUNC_STRCOLL: Particular Functions.
- (line 379)
- * AC_FUNC_STRERROR_R: Particular Functions.
- (line 388)
- * AC_FUNC_STRFTIME: Particular Functions.
- (line 401)
- * AC_FUNC_STRNLEN: Particular Functions.
- (line 426)
- * AC_FUNC_STRTOD: Particular Functions.
- (line 408)
- * AC_FUNC_STRTOLD: Particular Functions.
- (line 420)
- * AC_FUNC_UTIME_NULL: Particular Functions.
- (line 433)
- * AC_FUNC_VPRINTF: Particular Functions.
- (line 443)
- * AC_FUNC_WAIT3: Obsolete Macros. (line 216)
- * AC_GCC_TRADITIONAL: Obsolete Macros. (line 224)
- * AC_GETGROUPS_T: Obsolete Macros. (line 228)
- * AC_GETLOADAVG: Obsolete Macros. (line 231)
- * AC_GNU_SOURCE: Obsolete Macros. (line 234)
- * AC_HAVE_FUNCS: Obsolete Macros. (line 238)
- * AC_HAVE_HEADERS: Obsolete Macros. (line 241)
- * AC_HAVE_LIBRARY: Obsolete Macros. (line 245)
- * AC_HAVE_POUNDBANG: Obsolete Macros. (line 252)
- * AC_HEADER_ASSERT: Particular Headers. (line 20)
- * AC_HEADER_CHECK: Obsolete Macros. (line 255)
- * AC_HEADER_DIRENT: Particular Headers. (line 25)
- * AC_HEADER_EGREP: Obsolete Macros. (line 258)
- * AC_HEADER_MAJOR: Particular Headers. (line 68)
- * AC_HEADER_RESOLV: Particular Headers. (line 73)
- * AC_HEADER_STAT: Particular Headers. (line 92)
- * AC_HEADER_STDBOOL: Particular Headers. (line 101)
- * AC_HEADER_STDC: Particular Headers. (line 135)
- * AC_HEADER_SYS_WAIT: Particular Headers. (line 204)
- * AC_HEADER_TIME: Particular Headers. (line 244)
- * AC_HEADER_TIOCGWINSZ: Particular Headers. (line 270)
- * AC_HELP_STRING: Obsolete Macros. (line 261)
- * AC_INCLUDES_DEFAULT: Default Includes. (line 29)
- * AC_INIT <1>: Obsolete Macros. (line 264)
- * AC_INIT: Initializing configure.
- (line 14)
- * AC_INLINE: Obsolete Macros. (line 272)
- * AC_INT_16_BITS: Obsolete Macros. (line 275)
- * AC_IRIX_SUN: Obsolete Macros. (line 279)
- * AC_ISC_POSIX: Obsolete Macros. (line 295)
- * AC_LANG: Language Choice. (line 14)
- * AC_LANG_ASSERT: Language Choice. (line 79)
- * AC_LANG_C: Obsolete Macros. (line 302)
- * AC_LANG_CALL: Generating Sources. (line 142)
- * AC_LANG_CONFTEST: Generating Sources. (line 12)
- * AC_LANG_CPLUSPLUS: Obsolete Macros. (line 305)
- * AC_LANG_DEFINES_PROVIDED: Generating Sources. (line 31)
- * AC_LANG_FORTRAN77: Obsolete Macros. (line 308)
- * AC_LANG_FUNC_LINK_TRY: Generating Sources. (line 154)
- * AC_LANG_POP: Language Choice. (line 66)
- * AC_LANG_PROGRAM: Generating Sources. (line 78)
- * AC_LANG_PUSH: Language Choice. (line 61)
- * AC_LANG_RESTORE: Obsolete Macros. (line 311)
- * AC_LANG_SAVE: Obsolete Macros. (line 317)
- * AC_LANG_SOURCE: Generating Sources. (line 40)
- * AC_LANG_WERROR: Generic Compiler Characteristics.
- (line 54)
- * AC_LIBOBJ: Generic Functions. (line 56)
- * AC_LIBSOURCE: Generic Functions. (line 65)
- * AC_LIBSOURCES: Generic Functions. (line 89)
- * AC_LINK_FILES: Obsolete Macros. (line 322)
- * AC_LINK_IFELSE: Running the Linker. (line 24)
- * AC_LN_S: Obsolete Macros. (line 334)
- * AC_LONG_64_BITS: Obsolete Macros. (line 337)
- * AC_LONG_DOUBLE: Obsolete Macros. (line 342)
- * AC_LONG_FILE_NAMES: Obsolete Macros. (line 350)
- * AC_MAJOR_HEADER: Obsolete Macros. (line 355)
- * AC_MEMORY_H: Obsolete Macros. (line 358)
- * AC_MINGW32: Obsolete Macros. (line 365)
- * AC_MINIX: Obsolete Macros. (line 371)
- * AC_MINUS_C_MINUS_O: Obsolete Macros. (line 375)
- * AC_MMAP: Obsolete Macros. (line 378)
- * AC_MODE_T: Obsolete Macros. (line 381)
- * AC_MSG_CHECKING: Printing Messages. (line 24)
- * AC_MSG_ERROR: Printing Messages. (line 56)
- * AC_MSG_FAILURE: Printing Messages. (line 66)
- * AC_MSG_NOTICE: Printing Messages. (line 46)
- * AC_MSG_RESULT: Printing Messages. (line 35)
- * AC_MSG_WARN: Printing Messages. (line 72)
- * AC_OBJEXT: Obsolete Macros. (line 384)
- * AC_OBSOLETE: Obsolete Macros. (line 390)
- * AC_OFF_T: Obsolete Macros. (line 405)
- * AC_OPENMP: Generic Compiler Characteristics.
- (line 64)
- * AC_OUTPUT <1>: Obsolete Macros. (line 408)
- * AC_OUTPUT: Output. (line 13)
- * AC_OUTPUT_COMMANDS: Obsolete Macros. (line 420)
- * AC_PACKAGE_BUGREPORT: Initializing configure.
- (line 57)
- * AC_PACKAGE_NAME: Initializing configure.
- (line 45)
- * AC_PACKAGE_STRING: Initializing configure.
- (line 54)
- * AC_PACKAGE_TARNAME: Initializing configure.
- (line 48)
- * AC_PACKAGE_URL: Initializing configure.
- (line 61)
- * AC_PACKAGE_VERSION: Initializing configure.
- (line 51)
- * AC_PATH_PROG: Generic Programs. (line 108)
- * AC_PATH_PROGS: Generic Programs. (line 115)
- * AC_PATH_PROGS_FEATURE_CHECK: Generic Programs. (line 123)
- * AC_PATH_TARGET_TOOL: Generic Programs. (line 159)
- * AC_PATH_TOOL: Generic Programs. (line 164)
- * AC_PATH_X: System Services. (line 10)
- * AC_PATH_XTRA: System Services. (line 30)
- * AC_PID_T: Obsolete Macros. (line 450)
- * AC_PREFIX: Obsolete Macros. (line 453)
- * AC_PREFIX_DEFAULT: Default Prefix. (line 16)
- * AC_PREFIX_PROGRAM: Default Prefix. (line 25)
- * AC_PREPROC_IFELSE: Running the Preprocessor.
- (line 20)
- * AC_PREREQ: Versioning. (line 11)
- * AC_PRESERVE_HELP_ORDER: Help Formatting. (line 20)
- * AC_PROG_AWK: Particular Programs. (line 10)
- * AC_PROG_CC: C Compiler. (line 61)
- * AC_PROG_CC_C89: C Compiler. (line 147)
- * AC_PROG_CC_C99: C Compiler. (line 161)
- * AC_PROG_CC_C_O: C Compiler. (line 102)
- * AC_PROG_CC_STDC: C Compiler. (line 137)
- * AC_PROG_CPP: C Compiler. (line 113)
- * AC_PROG_CPP_WERROR: C Compiler. (line 126)
- * AC_PROG_CXX: C++ Compiler. (line 7)
- * AC_PROG_CXX_C_O: C++ Compiler. (line 48)
- * AC_PROG_CXXCPP: C++ Compiler. (line 35)
- * AC_PROG_EGREP: Particular Programs. (line 29)
- * AC_PROG_F77: Fortran Compiler. (line 19)
- * AC_PROG_F77_C_O: Fortran Compiler. (line 76)
- * AC_PROG_FC: Fortran Compiler. (line 44)
- * AC_PROG_FC_C_O: Fortran Compiler. (line 76)
- * AC_PROG_FGREP: Particular Programs. (line 36)
- * AC_PROG_GCC_TRADITIONAL: C Compiler. (line 361)
- * AC_PROG_GREP: Particular Programs. (line 20)
- * AC_PROG_INSTALL: Particular Programs. (line 43)
- * AC_PROG_LEX: Particular Programs. (line 114)
- * AC_PROG_LN_S: Particular Programs. (line 168)
- * AC_PROG_MAKE_SET: Output. (line 45)
- * AC_PROG_MKDIR_P: Particular Programs. (line 80)
- * AC_PROG_OBJC: Objective C Compiler.
- (line 7)
- * AC_PROG_OBJCPP: Objective C Compiler.
- (line 26)
- * AC_PROG_OBJCXX: Objective C++ Compiler.
- (line 7)
- * AC_PROG_OBJCXXCPP: Objective C++ Compiler.
- (line 27)
- * AC_PROG_RANLIB: Particular Programs. (line 187)
- * AC_PROG_SED: Particular Programs. (line 191)
- * AC_PROG_YACC: Particular Programs. (line 200)
- * AC_PROGRAM_CHECK: Obsolete Macros. (line 462)
- * AC_PROGRAM_EGREP: Obsolete Macros. (line 465)
- * AC_PROGRAM_PATH: Obsolete Macros. (line 468)
- * AC_PROGRAMS_CHECK: Obsolete Macros. (line 456)
- * AC_PROGRAMS_PATH: Obsolete Macros. (line 459)
- * AC_REMOTE_TAPE: Obsolete Macros. (line 471)
- * AC_REPLACE_FNMATCH: Particular Functions.
- (line 452)
- * AC_REPLACE_FUNCS: Generic Functions. (line 117)
- * AC_REQUIRE: Prerequisite Macros. (line 17)
- * AC_REQUIRE_AUX_FILE: Input. (line 37)
- * AC_REQUIRE_CPP: Language Choice. (line 94)
- * AC_RESTARTABLE_SYSCALLS: Obsolete Macros. (line 474)
- * AC_RETSIGTYPE: Obsolete Macros. (line 482)
- * AC_REVISION: Notices. (line 18)
- * AC_RSH: Obsolete Macros. (line 486)
- * AC_RUN_IFELSE: Runtime. (line 20)
- * AC_SCO_INTL: Obsolete Macros. (line 489)
- * AC_SEARCH_LIBS: Libraries. (line 52)
- * AC_SET_MAKE: Obsolete Macros. (line 503)
- * AC_SETVBUF_REVERSED: Obsolete Macros. (line 498)
- * AC_SIZE_T: Obsolete Macros. (line 509)
- * AC_SIZEOF_TYPE: Obsolete Macros. (line 506)
- * AC_ST_BLKSIZE: Obsolete Macros. (line 539)
- * AC_ST_BLOCKS: Obsolete Macros. (line 542)
- * AC_ST_RDEV: Obsolete Macros. (line 545)
- * AC_STAT_MACROS_BROKEN: Obsolete Macros. (line 512)
- * AC_STDC_HEADERS: Obsolete Macros. (line 515)
- * AC_STRCOLL: Obsolete Macros. (line 518)
- * AC_STRUCT_DIRENT_D_INO: Particular Structures.
- (line 9)
- * AC_STRUCT_DIRENT_D_TYPE: Particular Structures.
- (line 21)
- * AC_STRUCT_ST_BLKSIZE: Obsolete Macros. (line 521)
- * AC_STRUCT_ST_BLOCKS: Particular Structures.
- (line 26)
- * AC_STRUCT_ST_RDEV: Obsolete Macros. (line 530)
- * AC_STRUCT_TIMEZONE: Particular Structures.
- (line 43)
- * AC_STRUCT_TM: Particular Structures.
- (line 35)
- * AC_SUBST: Setting Output Variables.
- (line 13)
- * AC_SUBST_FILE: Setting Output Variables.
- (line 38)
- * AC_SYS_INTERPRETER: System Services. (line 42)
- * AC_SYS_LARGEFILE: System Services. (line 49)
- * AC_SYS_LONG_FILE_NAMES: System Services. (line 71)
- * AC_SYS_POSIX_TERMIOS: System Services. (line 75)
- * AC_SYS_RESTARTABLE_SYSCALLS: Obsolete Macros. (line 548)
- * AC_SYS_SIGLIST_DECLARED: Obsolete Macros. (line 563)
- * AC_TEST_CPP: Obsolete Macros. (line 568)
- * AC_TEST_PROGRAM: Obsolete Macros. (line 572)
- * AC_TIME_WITH_SYS_TIME: Obsolete Macros. (line 579)
- * AC_TIMEZONE: Obsolete Macros. (line 576)
- * AC_TRY_ACT: AC_ACT_IFELSE vs AC_TRY_ACT.
- (line 6)
- * AC_TRY_COMPILE: Obsolete Macros. (line 583)
- * AC_TRY_CPP: Obsolete Macros. (line 602)
- * AC_TRY_LINK: Obsolete Macros. (line 615)
- * AC_TRY_LINK_FUNC: Obsolete Macros. (line 644)
- * AC_TRY_RUN: Obsolete Macros. (line 651)
- * AC_TYPE_GETGROUPS: Particular Types. (line 14)
- * AC_TYPE_INT16_T: Particular Types. (line 40)
- * AC_TYPE_INT32_T: Particular Types. (line 43)
- * AC_TYPE_INT64_T: Particular Types. (line 46)
- * AC_TYPE_INT8_T: Particular Types. (line 21)
- * AC_TYPE_INTMAX_T: Particular Types. (line 49)
- * AC_TYPE_INTPTR_T: Particular Types. (line 54)
- * AC_TYPE_LONG_DOUBLE: Particular Types. (line 59)
- * AC_TYPE_LONG_DOUBLE_WIDER: Particular Types. (line 70)
- * AC_TYPE_LONG_LONG_INT: Particular Types. (line 78)
- * AC_TYPE_MBSTATE_T: Particular Types. (line 88)
- * AC_TYPE_MODE_T: Particular Types. (line 96)
- * AC_TYPE_OFF_T: Particular Types. (line 102)
- * AC_TYPE_PID_T: Particular Types. (line 108)
- * AC_TYPE_SIGNAL: Obsolete Macros. (line 662)
- * AC_TYPE_SIZE_T: Particular Types. (line 114)
- * AC_TYPE_SSIZE_T: Particular Types. (line 120)
- * AC_TYPE_UID_T: Particular Types. (line 126)
- * AC_TYPE_UINT16_T: Particular Types. (line 138)
- * AC_TYPE_UINT32_T: Particular Types. (line 141)
- * AC_TYPE_UINT64_T: Particular Types. (line 144)
- * AC_TYPE_UINT8_T: Particular Types. (line 132)
- * AC_TYPE_UINTMAX_T: Particular Types. (line 147)
- * AC_TYPE_UINTPTR_T: Particular Types. (line 152)
- * AC_TYPE_UNSIGNED_LONG_LONG_INT: Particular Types. (line 157)
- * AC_UID_T: Obsolete Macros. (line 679)
- * AC_UNISTD_H: Obsolete Macros. (line 682)
- * AC_USE_SYSTEM_EXTENSIONS: Posix Variants. (line 10)
- * AC_USG: Obsolete Macros. (line 685)
- * AC_UTIME_NULL: Obsolete Macros. (line 690)
- * AC_VALIDATE_CACHED_SYSTEM_TUPLE: Obsolete Macros. (line 693)
- * AC_VERBOSE: Obsolete Macros. (line 698)
- * AC_VFORK: Obsolete Macros. (line 701)
- * AC_VPRINTF: Obsolete Macros. (line 704)
- * AC_WAIT3: Obsolete Macros. (line 707)
- * AC_WARN: Obsolete Macros. (line 712)
- * AC_WARNING: Reporting Messages. (line 26)
- * AC_WITH: Obsolete Macros. (line 715)
- * AC_WORDS_BIGENDIAN: Obsolete Macros. (line 719)
- * AC_XENIX_DIR: Obsolete Macros. (line 722)
- * AC_YYTEXT_POINTER: Obsolete Macros. (line 739)
- * AH_BOTTOM: Autoheader Macros. (line 50)
- * AH_HEADER: Configuration Headers.
- (line 54)
- * AH_TEMPLATE: Autoheader Macros. (line 19)
- * AH_TOP: Autoheader Macros. (line 47)
- * AH_VERBATIM: Autoheader Macros. (line 40)
- * AU_ALIAS: Obsoleting Macros. (line 34)
- * AU_DEFUN: Obsoleting Macros. (line 18)
- File: autoconf.info, Node: M4 Macro Index, Next: Autotest Macro Index, Prev: Autoconf Macro Index, Up: Indices
- B.6 M4 Macro Index
- ==================
- This is an alphabetical list of the M4, M4sugar, and M4sh macros.
- �[index�]
- * Menu:
- * __file__: Redefined M4 Macros. (line 65)
- * __line__: Redefined M4 Macros. (line 65)
- * __oline__: Redefined M4 Macros. (line 69)
- * AS_BOURNE_COMPATIBLE: Initialization Macros.
- (line 7)
- * AS_BOX: Common Shell Constructs.
- (line 10)
- * AS_CASE: Common Shell Constructs.
- (line 19)
- * AS_DIRNAME: Common Shell Constructs.
- (line 26)
- * AS_ECHO: Common Shell Constructs.
- (line 34)
- * AS_ECHO_N: Common Shell Constructs.
- (line 42)
- * AS_ESCAPE: Common Shell Constructs.
- (line 50)
- * AS_EXECUTABLE_P: Common Shell Constructs.
- (line 90)
- * AS_EXIT: Common Shell Constructs.
- (line 95)
- * AS_HELP_STRING: Pretty Help Strings. (line 15)
- * AS_IF: Common Shell Constructs.
- (line 101)
- * AS_INIT: Initialization Macros.
- (line 14)
- * AS_INIT_GENERATED: Initialization Macros.
- (line 26)
- * AS_LINENO_PREPARE: Initialization Macros.
- (line 67)
- * AS_LITERAL_IF: Polymorphic Variables.
- (line 21)
- * AS_LITERAL_WORD_IF: Polymorphic Variables.
- (line 21)
- * AS_ME_PREPARE: Initialization Macros.
- (line 72)
- * AS_MESSAGE_FD: File Descriptor Macros.
- (line 17)
- * AS_MESSAGE_LOG_FD: File Descriptor Macros.
- (line 29)
- * AS_MKDIR_P: Common Shell Constructs.
- (line 115)
- * AS_ORIGINAL_STDIN_FD: File Descriptor Macros.
- (line 39)
- * AS_SET_CATFILE: Common Shell Constructs.
- (line 155)
- * AS_SET_STATUS: Common Shell Constructs.
- (line 127)
- * AS_SHELL_SANITIZE: Initialization Macros.
- (line 101)
- * AS_TMPDIR: Initialization Macros.
- (line 77)
- * AS_TR_CPP: Common Shell Constructs.
- (line 135)
- * AS_TR_SH: Common Shell Constructs.
- (line 144)
- * AS_UNSET: Common Shell Constructs.
- (line 159)
- * AS_VAR_APPEND: Polymorphic Variables.
- (line 63)
- * AS_VAR_ARITH: Polymorphic Variables.
- (line 85)
- * AS_VAR_COPY: Polymorphic Variables.
- (line 103)
- * AS_VAR_IF: Polymorphic Variables.
- (line 122)
- * AS_VAR_POPDEF: Polymorphic Variables.
- (line 131)
- * AS_VAR_PUSHDEF: Polymorphic Variables.
- (line 131)
- * AS_VAR_SET: Polymorphic Variables.
- (line 173)
- * AS_VAR_SET_IF: Polymorphic Variables.
- (line 183)
- * AS_VAR_TEST_SET: Polymorphic Variables.
- (line 188)
- * AS_VERSION_COMPARE: Common Shell Constructs.
- (line 165)
- * dnl: Redefined M4 Macros. (line 76)
- * m4_append: Text processing Macros.
- (line 16)
- * m4_append_uniq: Text processing Macros.
- (line 16)
- * m4_append_uniq_w: Text processing Macros.
- (line 69)
- * m4_apply: Evaluation Macros. (line 10)
- * m4_argn: Looping constructs. (line 29)
- * m4_assert: Diagnostic Macros. (line 11)
- * m4_bmatch: Conditional constructs.
- (line 11)
- * m4_bpatsubst: Redefined M4 Macros. (line 79)
- * m4_bpatsubsts: Conditional constructs.
- (line 18)
- * m4_bregexp: Redefined M4 Macros. (line 84)
- * m4_builtin: Redefined M4 Macros. (line 6)
- * m4_car: Looping constructs. (line 35)
- * m4_case: Conditional constructs.
- (line 33)
- * m4_cdr: Looping constructs. (line 41)
- * m4_changecom: Redefined M4 Macros. (line 6)
- * m4_changequote: Redefined M4 Macros. (line 6)
- * m4_chomp: Text processing Macros.
- (line 80)
- * m4_chomp_all: Text processing Macros.
- (line 80)
- * m4_cleardivert: Diversion support. (line 125)
- * m4_cmp: Number processing Macros.
- (line 11)
- * m4_combine: Text processing Macros.
- (line 88)
- * m4_cond: Conditional constructs.
- (line 42)
- * m4_copy: Redefined M4 Macros. (line 92)
- * m4_copy_force: Redefined M4 Macros. (line 92)
- * m4_count: Evaluation Macros. (line 26)
- * m4_curry: Evaluation Macros. (line 30)
- * m4_debugfile: Redefined M4 Macros. (line 6)
- * m4_debugmode: Redefined M4 Macros. (line 6)
- * m4_decr: Redefined M4 Macros. (line 6)
- * m4_default: Conditional constructs.
- (line 73)
- * m4_default_nblank: Conditional constructs.
- (line 73)
- * m4_default_nblank_quoted: Conditional constructs.
- (line 73)
- * m4_default_quoted: Conditional constructs.
- (line 73)
- * m4_define: Redefined M4 Macros. (line 6)
- * m4_define_default: Conditional constructs.
- (line 122)
- * m4_defn: Redefined M4 Macros. (line 111)
- * m4_divert: Redefined M4 Macros. (line 119)
- * m4_divert_once: Diversion support. (line 128)
- * m4_divert_pop: Diversion support. (line 133)
- * m4_divert_push: Diversion support. (line 139)
- * m4_divert_text: Diversion support. (line 145)
- * m4_divnum: Redefined M4 Macros. (line 6)
- * m4_do: Evaluation Macros. (line 45)
- * m4_dquote: Evaluation Macros. (line 65)
- * m4_dquote_elt: Evaluation Macros. (line 70)
- * m4_dumpdef: Redefined M4 Macros. (line 131)
- * m4_dumpdefs: Redefined M4 Macros. (line 131)
- * m4_echo: Evaluation Macros. (line 75)
- * m4_errprint: Redefined M4 Macros. (line 6)
- * m4_errprintn: Diagnostic Macros. (line 16)
- * m4_escape: Text processing Macros.
- (line 108)
- * m4_esyscmd: Redefined M4 Macros. (line 6)
- * m4_esyscmd_s: Redefined M4 Macros. (line 148)
- * m4_eval: Redefined M4 Macros. (line 6)
- * m4_exit: Redefined M4 Macros. (line 154)
- * m4_expand: Evaluation Macros. (line 79)
- * m4_fatal: Diagnostic Macros. (line 20)
- * m4_flatten: Text processing Macros.
- (line 113)
- * m4_for: Looping constructs. (line 59)
- * m4_foreach: Looping constructs. (line 69)
- * m4_foreach_w: Looping constructs. (line 83)
- * m4_format: Redefined M4 Macros. (line 6)
- * m4_if: Redefined M4 Macros. (line 160)
- * m4_ifblank: Conditional constructs.
- (line 127)
- * m4_ifdef: Redefined M4 Macros. (line 6)
- * m4_ifnblank: Conditional constructs.
- (line 127)
- * m4_ifndef: Conditional constructs.
- (line 135)
- * m4_ifset: Conditional constructs.
- (line 139)
- * m4_ifval: Conditional constructs.
- (line 145)
- * m4_ifvaln: Conditional constructs.
- (line 150)
- * m4_ignore: Evaluation Macros. (line 129)
- * m4_include: Redefined M4 Macros. (line 167)
- * m4_incr: Redefined M4 Macros. (line 6)
- * m4_index: Redefined M4 Macros. (line 6)
- * m4_indir: Redefined M4 Macros. (line 6)
- * m4_init: Diversion support. (line 171)
- * m4_join: Text processing Macros.
- (line 119)
- * m4_joinall: Text processing Macros.
- (line 119)
- * m4_len: Redefined M4 Macros. (line 6)
- * m4_list_cmp: Number processing Macros.
- (line 16)
- * m4_location: Diagnostic Macros. (line 24)
- * m4_make_list: Evaluation Macros. (line 142)
- * m4_maketemp: Redefined M4 Macros. (line 171)
- * m4_map: Looping constructs. (line 93)
- * m4_map_args: Looping constructs. (line 130)
- * m4_map_args_pair: Looping constructs. (line 166)
- * m4_map_args_sep: Looping constructs. (line 178)
- * m4_map_args_w: Looping constructs. (line 189)
- * m4_map_sep: Looping constructs. (line 93)
- * m4_mapall: Looping constructs. (line 93)
- * m4_mapall_sep: Looping constructs. (line 93)
- * m4_max: Number processing Macros.
- (line 38)
- * m4_min: Number processing Macros.
- (line 42)
- * m4_mkstemp: Redefined M4 Macros. (line 171)
- * m4_n: Conditional constructs.
- (line 154)
- * m4_newline: Text processing Macros.
- (line 134)
- * m4_normalize: Text processing Macros.
- (line 140)
- * m4_pattern_allow: Forbidden Patterns. (line 30)
- * m4_pattern_forbid: Forbidden Patterns. (line 17)
- * m4_popdef: Redefined M4 Macros. (line 182)
- * m4_pushdef: Redefined M4 Macros. (line 6)
- * m4_quote: Evaluation Macros. (line 161)
- * m4_re_escape: Text processing Macros.
- (line 148)
- * m4_rename: Redefined M4 Macros. (line 92)
- * m4_rename_force: Redefined M4 Macros. (line 92)
- * m4_reverse: Evaluation Macros. (line 167)
- * m4_set_add: Set manipulation Macros.
- (line 19)
- * m4_set_add_all: Set manipulation Macros.
- (line 25)
- * m4_set_contains: Set manipulation Macros.
- (line 29)
- * m4_set_contents: Set manipulation Macros.
- (line 49)
- * m4_set_delete: Set manipulation Macros.
- (line 79)
- * m4_set_difference: Set manipulation Macros.
- (line 86)
- * m4_set_dump: Set manipulation Macros.
- (line 49)
- * m4_set_empty: Set manipulation Macros.
- (line 109)
- * m4_set_foreach: Set manipulation Macros.
- (line 115)
- * m4_set_intersection: Set manipulation Macros.
- (line 86)
- * m4_set_list: Set manipulation Macros.
- (line 136)
- * m4_set_listc: Set manipulation Macros.
- (line 136)
- * m4_set_map: Set manipulation Macros.
- (line 171)
- * m4_set_map_sep: Set manipulation Macros.
- (line 184)
- * m4_set_remove: Set manipulation Macros.
- (line 195)
- * m4_set_size: Set manipulation Macros.
- (line 206)
- * m4_set_union: Set manipulation Macros.
- (line 86)
- * m4_shift: Redefined M4 Macros. (line 6)
- * m4_shift2: Looping constructs. (line 199)
- * m4_shift3: Looping constructs. (line 199)
- * m4_shiftn: Looping constructs. (line 199)
- * m4_sign: Number processing Macros.
- (line 46)
- * m4_sinclude: Redefined M4 Macros. (line 167)
- * m4_split: Text processing Macros.
- (line 152)
- * m4_stack_foreach: Looping constructs. (line 208)
- * m4_stack_foreach_lifo: Looping constructs. (line 208)
- * m4_stack_foreach_sep: Looping constructs. (line 230)
- * m4_stack_foreach_sep_lifo: Looping constructs. (line 230)
- * m4_strip: Text processing Macros.
- (line 158)
- * m4_substr: Redefined M4 Macros. (line 6)
- * m4_syscmd: Redefined M4 Macros. (line 6)
- * m4_sysval: Redefined M4 Macros. (line 6)
- * m4_text_box: Text processing Macros.
- (line 167)
- * m4_text_wrap: Text processing Macros.
- (line 182)
- * m4_tolower: Text processing Macros.
- (line 213)
- * m4_toupper: Text processing Macros.
- (line 213)
- * m4_traceoff: Redefined M4 Macros. (line 6)
- * m4_traceon: Redefined M4 Macros. (line 6)
- * m4_translit: Redefined M4 Macros. (line 6)
- * m4_undefine: Redefined M4 Macros. (line 186)
- * m4_undivert: Redefined M4 Macros. (line 194)
- * m4_unquote: Evaluation Macros. (line 176)
- * m4_version_compare: Number processing Macros.
- (line 50)
- * m4_version_prereq: Number processing Macros.
- (line 90)
- * m4_warn: Diagnostic Macros. (line 28)
- * m4_wrap: Redefined M4 Macros. (line 204)
- * m4_wrap_lifo: Redefined M4 Macros. (line 204)
- File: autoconf.info, Node: Autotest Macro Index, Next: Program & Function Index, Prev: M4 Macro Index, Up: Indices
- B.7 Autotest Macro Index
- ========================
- This is an alphabetical list of the Autotest macros.
- �[index�]
- * Menu:
- * AT_ARG_OPTION: Writing Testsuites. (line 50)
- * AT_ARG_OPTION_ARG: Writing Testsuites. (line 79)
- * AT_BANNER: Writing Testsuites. (line 124)
- * AT_CAPTURE_FILE: Writing Testsuites. (line 155)
- * AT_CHECK: Writing Testsuites. (line 212)
- * AT_CHECK_EUNIT: Writing Testsuites. (line 302)
- * AT_CHECK_UNQUOTED: Writing Testsuites. (line 212)
- * AT_CLEANUP: Writing Testsuites. (line 198)
- * AT_COLOR_TESTS: Writing Testsuites. (line 105)
- * AT_COPYRIGHT: Writing Testsuites. (line 41)
- * AT_DATA: Writing Testsuites. (line 202)
- * AT_FAIL_IF: Writing Testsuites. (line 160)
- * AT_INIT: Writing Testsuites. (line 31)
- * AT_KEYWORDS: Writing Testsuites. (line 142)
- * AT_PACKAGE_BUGREPORT: Making testsuite Scripts.
- (line 12)
- * AT_PACKAGE_NAME: Making testsuite Scripts.
- (line 12)
- * AT_PACKAGE_STRING: Making testsuite Scripts.
- (line 12)
- * AT_PACKAGE_TARNAME: Making testsuite Scripts.
- (line 12)
- * AT_PACKAGE_URL: Making testsuite Scripts.
- (line 12)
- * AT_PACKAGE_VERSION: Making testsuite Scripts.
- (line 12)
- * AT_SETUP: Writing Testsuites. (line 134)
- * AT_SKIP_IF: Writing Testsuites. (line 175)
- * AT_TESTED: Writing Testsuites. (line 109)
- * AT_XFAIL_IF: Writing Testsuites. (line 190)
- File: autoconf.info, Node: Program & Function Index, Next: Concept Index, Prev: Autotest Macro Index, Up: Indices
- B.8 Program and Function Index
- ==============================
- This is an alphabetical list of the programs and functions whose
- portability is discussed in this document.
- �[index�]
- * Menu:
- * !: Limitations of Builtins.
- (line 41)
- * .: Limitations of Builtins.
- (line 17)
- * /usr/bin/ksh on Solaris: Shellology. (line 63)
- * /usr/dt/bin/dtksh on Solaris: Shellology. (line 66)
- * /usr/xpg4/bin/sh on Solaris: Shellology. (line 64)
- * alloca: Particular Functions.
- (line 10)
- * alloca.h: Particular Functions.
- (line 10)
- * assert.h: Particular Headers. (line 20)
- * awk: Limitations of Usual Tools.
- (line 10)
- * basename: Limitations of Usual Tools.
- (line 142)
- * break: Limitations of Builtins.
- (line 107)
- * case: Limitations of Builtins.
- (line 110)
- * cat: Limitations of Usual Tools.
- (line 146)
- * cc: Limitations of Usual Tools.
- (line 149)
- * cd: Limitations of Builtins.
- (line 203)
- * chgrp: Limitations of Usual Tools.
- (line 183)
- * chmod: Limitations of Usual Tools.
- (line 187)
- * chown <1>: Limitations of Usual Tools.
- (line 183)
- * chown: Particular Functions.
- (line 63)
- * closedir: Particular Functions.
- (line 69)
- * cmp: Limitations of Usual Tools.
- (line 197)
- * cp: Limitations of Usual Tools.
- (line 204)
- * ctype.h: Particular Headers. (line 135)
- * date: Limitations of Usual Tools.
- (line 264)
- * diff: Limitations of Usual Tools.
- (line 274)
- * dirent.h: Particular Headers. (line 25)
- * dirname: Limitations of Usual Tools.
- (line 280)
- * echo: Limitations of Builtins.
- (line 233)
- * egrep: Limitations of Usual Tools.
- (line 287)
- * error_at_line: Particular Functions.
- (line 84)
- * eval: Limitations of Builtins.
- (line 270)
- * exec: Limitations of Builtins.
- (line 315)
- * exit <1>: Limitations of Builtins.
- (line 355)
- * exit: Function Portability.
- (line 17)
- * export: Limitations of Builtins.
- (line 380)
- * expr: Limitations of Usual Tools.
- (line 312)
- * expr (|): Limitations of Usual Tools.
- (line 326)
- * false: Limitations of Builtins.
- (line 428)
- * fgrep: Limitations of Usual Tools.
- (line 435)
- * find: Limitations of Usual Tools.
- (line 444)
- * float.h: Particular Headers. (line 135)
- * fnmatch: Particular Functions.
- (line 94)
- * fnmatch.h: Particular Functions.
- (line 452)
- * for: Limitations of Builtins.
- (line 432)
- * fork: Particular Functions.
- (line 120)
- * free: Function Portability.
- (line 27)
- * fseeko: Particular Functions.
- (line 147)
- * ftello: Particular Functions.
- (line 147)
- * getgroups: Particular Functions.
- (line 155)
- * getloadavg: Particular Functions.
- (line 161)
- * getmntent: Particular Functions.
- (line 195)
- * getpgid: Particular Functions.
- (line 205)
- * getpgrp: Particular Functions.
- (line 205)
- * grep: Limitations of Usual Tools.
- (line 458)
- * if: Limitations of Builtins.
- (line 477)
- * inttypes.h <1>: Particular Types. (line 6)
- * inttypes.h: Header Portability. (line 20)
- * isinf: Function Portability.
- (line 32)
- * isnan: Function Portability.
- (line 32)
- * join: Limitations of Usual Tools.
- (line 526)
- * ksh: Shellology. (line 57)
- * ksh88: Shellology. (line 57)
- * ksh93: Shellology. (line 57)
- * linux/irda.h: Header Portability. (line 27)
- * linux/random.h: Header Portability. (line 30)
- * ln: Limitations of Usual Tools.
- (line 543)
- * ls: Limitations of Usual Tools.
- (line 555)
- * lstat: Particular Functions.
- (line 228)
- * make: Portable Make. (line 6)
- * malloc <1>: Particular Functions.
- (line 247)
- * malloc: Function Portability.
- (line 82)
- * mbrtowc: Particular Functions.
- (line 279)
- * memcmp: Particular Functions.
- (line 286)
- * mkdir: Limitations of Usual Tools.
- (line 577)
- * mkfifo: Limitations of Usual Tools.
- (line 611)
- * mknod: Limitations of Usual Tools.
- (line 611)
- * mktemp: Limitations of Usual Tools.
- (line 621)
- * mktime: Particular Functions.
- (line 299)
- * mmap: Particular Functions.
- (line 311)
- * mv: Limitations of Usual Tools.
- (line 646)
- * ndir.h: Particular Headers. (line 25)
- * net/if.h: Header Portability. (line 33)
- * netinet/if_ether.h: Header Portability. (line 53)
- * nlist.h: Particular Functions.
- (line 178)
- * od: Limitations of Usual Tools.
- (line 678)
- * pdksh: Shellology. (line 77)
- * printf: Limitations of Builtins.
- (line 516)
- * putenv: Function Portability.
- (line 89)
- * pwd: Limitations of Builtins.
- (line 543)
- * read: Limitations of Builtins.
- (line 574)
- * realloc <1>: Particular Functions.
- (line 326)
- * realloc: Function Portability.
- (line 105)
- * resolv.h: Particular Headers. (line 73)
- * rm: Limitations of Usual Tools.
- (line 687)
- * rmdir: Limitations of Usual Tools.
- (line 706)
- * sed: Limitations of Usual Tools.
- (line 710)
- * sed (t): Limitations of Usual Tools.
- (line 905)
- * select: Particular Functions.
- (line 337)
- * set: Limitations of Builtins.
- (line 580)
- * setpgrp: Particular Functions.
- (line 348)
- * setvbuf: Obsolete Macros. (line 208)
- * shift: Limitations of Builtins.
- (line 732)
- * sigaction: Function Portability.
- (line 110)
- * signal: Function Portability.
- (line 110)
- * signal.h: Obsolete Macros. (line 662)
- * sleep: Limitations of Usual Tools.
- (line 965)
- * snprintf: Function Portability.
- (line 124)
- * sort: Limitations of Usual Tools.
- (line 971)
- * source: Limitations of Builtins.
- (line 740)
- * sprintf: Function Portability.
- (line 135)
- * sscanf: Function Portability.
- (line 141)
- * stat: Particular Functions.
- (line 363)
- * stdarg.h: Particular Headers. (line 135)
- * stdbool.h: Particular Headers. (line 10)
- * stdint.h <1>: Particular Types. (line 6)
- * stdint.h: Header Portability. (line 20)
- * stdlib.h <1>: Particular Types. (line 6)
- * stdlib.h <2>: Particular Headers. (line 135)
- * stdlib.h: Header Portability. (line 76)
- * strcoll: Particular Functions.
- (line 379)
- * strerror_r <1>: Particular Functions.
- (line 388)
- * strerror_r: Function Portability.
- (line 149)
- * strftime: Particular Functions.
- (line 401)
- * string.h: Particular Headers. (line 135)
- * strings.h: Particular Headers. (line 154)
- * strnlen <1>: Particular Functions.
- (line 426)
- * strnlen: Function Portability.
- (line 155)
- * strtod: Particular Functions.
- (line 408)
- * strtold: Particular Functions.
- (line 420)
- * sys/dir.h: Particular Headers. (line 25)
- * sys/ioctl.h: Particular Headers. (line 270)
- * sys/mkdev.h: Particular Headers. (line 68)
- * sys/mount.h: Header Portability. (line 79)
- * sys/ndir.h: Particular Headers. (line 25)
- * sys/ptem.h: Header Portability. (line 83)
- * sys/socket.h: Header Portability. (line 86)
- * sys/stat.h: Particular Headers. (line 92)
- * sys/sysmacros.h: Particular Headers. (line 68)
- * sys/time.h <1>: Particular Structures.
- (line 35)
- * sys/time.h: Particular Headers. (line 244)
- * sys/types.h: Particular Types. (line 6)
- * sys/ucred.h: Header Portability. (line 89)
- * sys/wait.h: Particular Headers. (line 204)
- * sysconf: Function Portability.
- (line 170)
- * tar: Limitations of Usual Tools.
- (line 976)
- * termios.h: Particular Headers. (line 270)
- * test: Limitations of Builtins.
- (line 744)
- * time.h <1>: Particular Structures.
- (line 35)
- * time.h: Particular Headers. (line 244)
- * touch: Limitations of Usual Tools.
- (line 981)
- * tr: Limitations of Usual Tools.
- (line 994)
- * trap: Limitations of Builtins.
- (line 856)
- * true: Limitations of Builtins.
- (line 930)
- * unistd.h: Particular Headers. (line 228)
- * unlink: Function Portability.
- (line 174)
- * unset: Limitations of Builtins.
- (line 946)
- * unsetenv: Function Portability.
- (line 180)
- * utime: Particular Functions.
- (line 433)
- * va_copy: Function Portability.
- (line 185)
- * va_list: Function Portability.
- (line 192)
- * vfork: Particular Functions.
- (line 120)
- * vfork.h: Particular Functions.
- (line 120)
- * vprintf: Particular Functions.
- (line 443)
- * vsnprintf: Function Portability.
- (line 124)
- * vsprintf <1>: Particular Functions.
- (line 443)
- * vsprintf: Function Portability.
- (line 135)
- * wait: Limitations of Builtins.
- (line 973)
- * wait3: Obsolete Macros. (line 216)
- * wchar.h: Particular Types. (line 88)
- * X11/extensions/scrnsaver.h: Header Portability. (line 92)
- * {...}: Limitations of Builtins.
- (line 74)
- File: autoconf.info, Node: Concept Index, Prev: Program & Function Index, Up: Indices
- B.9 Concept Index
- =================
- This is an alphabetical list of the files, tools, and concepts
- introduced in this document.
- �[index�]
- * Menu:
- * "$@": Shell Substitutions. (line 70)
- * $((EXPRESSION)): Shell Substitutions. (line 456)
- * $(COMMANDS): Shell Substitutions. (line 423)
- * $<, explicit rules, and VPATH: $< in Explicit Rules.
- (line 6)
- * ${#VAR}: Shell Substitutions. (line 369)
- * ${VAR##WORD}: Shell Substitutions. (line 369)
- * ${VAR#WORD}: Shell Substitutions. (line 369)
- * ${VAR%%WORD}: Shell Substitutions. (line 369)
- * ${VAR%WORD}: Shell Substitutions. (line 369)
- * ${VAR+VALUE}: Shell Substitutions. (line 148)
- * ${VAR-VALUE}: Shell Substitutions. (line 140)
- * ${VAR=EXPANDED-VALUE}: Shell Substitutions. (line 319)
- * ${VAR=LITERAL}: Shell Substitutions. (line 295)
- * ${VAR=VALUE}: Shell Substitutions. (line 215)
- * 64-bit libraries: Site Defaults. (line 97)
- * @&t@: Quadrigraphs. (line 6)
- * @S|@: Quadrigraphs. (line 6)
- * ^ quoting: Shell Substitutions. (line 496)
- * _m4_divert_diversion: New Macros. (line 6)
- * `COMMANDS`: Shell Substitutions. (line 377)
- * abs_builddir: Preset Output Variables.
- (line 177)
- * abs_srcdir: Preset Output Variables.
- (line 199)
- * abs_top_builddir: Preset Output Variables.
- (line 192)
- * abs_top_srcdir: Preset Output Variables.
- (line 206)
- * absolute file names, detect: File System Conventions.
- (line 52)
- * ac_objext: Generic Functions. (line 59)
- * ac_path_VARIABLE: Generic Programs. (line 123)
- * ac_path_VARIABLE_found: Generic Programs. (line 123)
- * ac_srcdir: Configuration Actions.
- (line 85)
- * ac_top_build_prefix: Configuration Actions.
- (line 80)
- * ac_top_srcdir: Configuration Actions.
- (line 76)
- * acconfig.h: acconfig Header. (line 6)
- * aclocal.m4: Making configure Scripts.
- (line 6)
- * Ash: Shellology. (line 16)
- * at_arg_OPTION: Writing Testsuites. (line 50)
- * at_optarg: Writing Testsuites. (line 62)
- * at_optarg_OPTION: Writing Testsuites. (line 62)
- * at_status: Writing Testsuites. (line 212)
- * autoconf: autoconf Invocation. (line 6)
- * Autoconf upgrading <1>: Autoconf 2.13. (line 6)
- * Autoconf upgrading: Autoconf 1. (line 6)
- * Autoconf version: Versioning. (line 6)
- * autoheader: autoheader Invocation.
- (line 6)
- * Autoheader macros: Autoheader Macros. (line 6)
- * autom4te debugging tips: Debugging via autom4te.
- (line 6)
- * Autom4te Library: autom4te Invocation. (line 225)
- * autom4te.cache: autom4te Invocation. (line 130)
- * autom4te.cfg: autom4te Invocation. (line 258)
- * Automake: Automake. (line 19)
- * Automatic remaking: Automatic Remaking. (line 6)
- * automatic rule rewriting and VPATH: Automatic Rule Rewriting.
- (line 6)
- * autopoint: autoreconf Invocation.
- (line 30)
- * autoreconf: autoreconf Invocation.
- (line 6)
- * autoscan: autoscan Invocation. (line 6)
- * Autotest: Using Autotest. (line 6)
- * AUTOTEST_PATH: testsuite Invocation.
- (line 60)
- * autoupdate: autoupdate Invocation.
- (line 6)
- * Back trace <1>: autom4te Invocation. (line 86)
- * Back trace: autoconf Invocation. (line 86)
- * balancing parentheses: Balancing Parentheses.
- (line 6)
- * Bash: Shellology. (line 43)
- * Bash 2.05 and later: Shellology. (line 49)
- * bindir: Installation Directory Variables.
- (line 15)
- * Bootstrap: Bootstrapping. (line 6)
- * BSD make and obj/: obj/ and Make. (line 6)
- * buffer overruns: Buffer Overruns. (line 6)
- * Build directories: Build Directories. (line 6)
- * builddir: Preset Output Variables.
- (line 174)
- * C function portability: Function Portability.
- (line 6)
- * C types: Types. (line 6)
- * Cache: Caching Results. (line 6)
- * Cache variable: Cache Variable Names.
- (line 6)
- * Cache, enabling: configure Invocation.
- (line 25)
- * Canonical system type: Canonicalizing. (line 6)
- * carriage return, deleting: Limitations of Usual Tools.
- (line 994)
- * CFLAGS: Preset Output Variables.
- (line 23)
- * changequote: Changequote is Evil. (line 6)
- * Coding style: Coding Style. (line 6)
- * Command Substitution: Shell Substitutions. (line 377)
- * command-line, macros set on: Command-line Macros and whitespace.
- (line 6)
- * Commands for configuration: Configuration Commands.
- (line 6)
- * Comments in Makefile macros: Comments in Make Macros.
- (line 6)
- * Comments in Makefile rules: Comments in Make Rules.
- (line 6)
- * Common autoconf behavior: Common Behavior. (line 6)
- * Compilers: Compilers and Preprocessors.
- (line 6)
- * composing variable names: Polymorphic Variables.
- (line 131)
- * config.h: Configuration Headers.
- (line 6)
- * config.h.bot: acconfig Header. (line 6)
- * config.h.in: Header Templates. (line 6)
- * config.h.top: acconfig Header. (line 6)
- * config.site: Site Defaults. (line 6)
- * config.status: config.status Invocation.
- (line 6)
- * config.sub: Specifying Target Triplets.
- (line 59)
- * CONFIG_COMMANDS: Obsolete config.status Use.
- (line 11)
- * CONFIG_FILES: Obsolete config.status Use.
- (line 15)
- * CONFIG_HEADERS: Obsolete config.status Use.
- (line 20)
- * CONFIG_LINKS: Obsolete config.status Use.
- (line 25)
- * CONFIG_SHELL: config.status Invocation.
- (line 102)
- * CONFIG_STATUS: config.status Invocation.
- (line 108)
- * Configuration actions: Configuration Actions.
- (line 6)
- * Configuration commands: Configuration Commands.
- (line 6)
- * Configuration file creation: Configuration Files. (line 6)
- * Configuration Header: Configuration Headers.
- (line 6)
- * Configuration Header Template: Header Templates. (line 6)
- * Configuration links: Configuration Links. (line 6)
- * configure <1>: Running configure Scripts.
- (line 6)
- * configure: Making configure Scripts.
- (line 6)
- * Configure subdirectories: Subdirectories. (line 6)
- * configure.ac: Making configure Scripts.
- (line 27)
- * configure.in: Making configure Scripts.
- (line 27)
- * configure_input: Preset Output Variables.
- (line 58)
- * Copyright Notice <1>: Writing Testsuites. (line 41)
- * Copyright Notice: Notices. (line 10)
- * CPPFLAGS: Preset Output Variables.
- (line 72)
- * Creating configuration files: Configuration Files. (line 6)
- * Creating temporary files: Limitations of Usual Tools.
- (line 621)
- * Cross compilation: Hosts and Cross-Compilation.
- (line 6)
- * CXXFLAGS: Preset Output Variables.
- (line 94)
- * Darwin: Systemology. (line 23)
- * Data structure, set: Set manipulation Macros.
- (line 6)
- * datadir: Installation Directory Variables.
- (line 18)
- * datarootdir <1>: Changed Directory Variables.
- (line 6)
- * datarootdir: Installation Directory Variables.
- (line 22)
- * debugging tips: Debugging via autom4te.
- (line 6)
- * Declaration, checking: Declarations. (line 6)
- * Default includes: Default Includes. (line 6)
- * DEFS: Preset Output Variables.
- (line 98)
- * deleting carriage return: Limitations of Usual Tools.
- (line 994)
- * Dependencies between macros: Dependencies Between Macros.
- (line 6)
- * Descriptors: File Descriptors. (line 6)
- * descriptors: File Descriptor Macros.
- (line 6)
- * Directories, build: Build Directories. (line 6)
- * Directories, installation: Installation Directory Variables.
- (line 6)
- * division, integer: Signed Integer Division.
- (line 6)
- * dnl <1>: Coding Style. (line 42)
- * dnl: Macro Definitions. (line 51)
- * docdir: Installation Directory Variables.
- (line 26)
- * double-colon rules and VPATH: VPATH and Double-colon.
- (line 6)
- * dvidir: Installation Directory Variables.
- (line 30)
- * ECHO_C: Preset Output Variables.
- (line 106)
- * ECHO_N: Preset Output Variables.
- (line 107)
- * ECHO_T: Preset Output Variables.
- (line 108)
- * Endianness: C Compiler. (line 184)
- * environment, macros set from: Command-line Macros and whitespace.
- (line 6)
- * Erlang: Erlang Compiler and Interpreter.
- (line 6)
- * Erlang, Library, checking: Erlang Libraries. (line 6)
- * ERLANG_INSTALL_LIB_DIR: Installation Directory Variables.
- (line 201)
- * ERLANG_INSTALL_LIB_DIR_: Installation Directory Variables.
- (line 206)
- * ERLCFLAGS: Preset Output Variables.
- (line 120)
- * exec_prefix: Installation Directory Variables.
- (line 33)
- * exiting portably: Exiting Portably. (line 6)
- * expanded before required: Expanded Before Required.
- (line 6)
- * explicit rules, $<, and VPATH: $< in Explicit Rules.
- (line 6)
- * External software: External Software. (line 6)
- * F77: Fortran Compiler. (line 6)
- * FCFLAGS: Preset Output Variables.
- (line 126)
- * FFLAGS: Preset Output Variables.
- (line 133)
- * FHS: Site Defaults. (line 83)
- * File descriptors: File Descriptors. (line 6)
- * file descriptors: File Descriptor Macros.
- (line 6)
- * File system conventions: File System Conventions.
- (line 6)
- * File, checking: Files. (line 6)
- * Filesystem Hierarchy Standard: Site Defaults. (line 83)
- * floating point: Floating Point Portability.
- (line 6)
- * Forbidden patterns: Forbidden Patterns. (line 6)
- * Fortran: Fortran Compiler. (line 6)
- * Function, checking: Particular Functions.
- (line 6)
- * Gettext: autoreconf Invocation.
- (line 30)
- * GNU build system: The GNU Build System.
- (line 6)
- * Gnulib: Gnulib. (line 11)
- * Go: Go Compiler. (line 6)
- * GOFLAGS: Preset Output Variables.
- (line 170)
- * Header portability: Header Portability. (line 6)
- * Header templates: Header Templates. (line 6)
- * Header, checking: Header Files. (line 6)
- * Help strings: Pretty Help Strings. (line 6)
- * Here-documents: Here-Documents. (line 6)
- * History of autoconf: History. (line 6)
- * htmldir: Installation Directory Variables.
- (line 40)
- * ifnames: ifnames Invocation. (line 6)
- * Imake: Why Not Imake. (line 6)
- * includedir: Installation Directory Variables.
- (line 43)
- * Includes, default: Default Includes. (line 6)
- * indirection, variable name: Polymorphic Variables.
- (line 6)
- * infodir: Installation Directory Variables.
- (line 46)
- * input: File Descriptor Macros.
- (line 6)
- * Install prefix: Default Prefix. (line 6)
- * Installation directories: Installation Directory Variables.
- (line 6)
- * Instantiation: Output. (line 13)
- * integer overflow <1>: Signed Overflow Advice.
- (line 6)
- * integer overflow <2>: Signed Overflow Examples.
- (line 6)
- * integer overflow <3>: Integer Overflow Basics.
- (line 6)
- * integer overflow: Integer Overflow. (line 6)
- * Introduction: Introduction. (line 6)
- * invoking the shell: Invoking the Shell. (line 6)
- * Korn shell: Shellology. (line 57)
- * Ksh: Shellology. (line 57)
- * Language: Language Choice. (line 6)
- * Large file support: System Services. (line 49)
- * LDFLAGS: Preset Output Variables.
- (line 140)
- * LFS: System Services. (line 49)
- * lib64: Site Defaults. (line 97)
- * libdir: Installation Directory Variables.
- (line 49)
- * libexecdir: Installation Directory Variables.
- (line 52)
- * Library, checking: Libraries. (line 6)
- * LIBS: Preset Output Variables.
- (line 154)
- * Libtool: Libtool. (line 14)
- * License: Distributing. (line 6)
- * Limitations of make: Portable Make. (line 6)
- * Limitations of shell builtins: Limitations of Builtins.
- (line 6)
- * Limitations of usual tools: Limitations of Usual Tools.
- (line 6)
- * Links: Configuration Links. (line 12)
- * Links for configuration: Configuration Links. (line 6)
- * Listing directories: Limitations of Usual Tools.
- (line 555)
- * localedir: Installation Directory Variables.
- (line 55)
- * localstatedir: Installation Directory Variables.
- (line 60)
- * loop induction: Optimization and Wraparound.
- (line 6)
- * low-level output: File Descriptor Macros.
- (line 6)
- * M4: Programming in M4. (line 6)
- * M4 quotation: M4 Quotation. (line 6)
- * M4sugar: Programming in M4sugar.
- (line 6)
- * m4sugar debugging tips: Debugging via autom4te.
- (line 6)
- * Macro invocation stack <1>: autom4te Invocation. (line 86)
- * Macro invocation stack: autoconf Invocation. (line 86)
- * Macros, called once: One-Shot Macros. (line 6)
- * Macros, obsoleting: Obsoleting Macros. (line 6)
- * Macros, ordering: Suggested Ordering. (line 6)
- * Macros, prerequisites: Prerequisite Macros. (line 6)
- * make -k: make -k Status. (line 6)
- * make and MAKEFLAGS: The Make Macro MAKEFLAGS.
- (line 6)
- * make and SHELL: The Make Macro SHELL.
- (line 6)
- * Makefile macros and comments: Comments in Make Macros.
- (line 6)
- * Makefile macros and whitespace: Trailing whitespace in Make Macros.
- (line 6)
- * Makefile rules and comments: Comments in Make Rules.
- (line 6)
- * Makefile rules and newlines: Newlines in Make Rules.
- (line 6)
- * Makefile substitutions: Makefile Substitutions.
- (line 6)
- * MAKEFLAGS and make: The Make Macro MAKEFLAGS.
- (line 6)
- * Making directories: Limitations of Usual Tools.
- (line 577)
- * mandir: Installation Directory Variables.
- (line 63)
- * Messages, from autoconf: Reporting Messages. (line 6)
- * Messages, from configure: Printing Messages. (line 6)
- * Messages, from M4sugar: Diagnostic Macros. (line 6)
- * Moving open files: Limitations of Usual Tools.
- (line 646)
- * newline, deleting: Limitations of Usual Tools.
- (line 994)
- * Newlines in Makefile rules: Newlines in Make Rules.
- (line 6)
- * Notices in configure: Notices. (line 6)
- * null pointers: Null Pointers. (line 6)
- * obj/, subdirectory: obj/ and Make. (line 6)
- * OBJCFLAGS: Preset Output Variables.
- (line 162)
- * OBJCXXFLAGS: Preset Output Variables.
- (line 166)
- * Obsolete constructs: Obsolete Constructs. (line 6)
- * Obsoleting macros: Obsoleting Macros. (line 6)
- * obstack: Particular Functions.
- (line 319)
- * oldincludedir: Installation Directory Variables.
- (line 66)
- * One-shot macros: One-Shot Macros. (line 6)
- * Options, Package: Option Checking. (line 6)
- * Options, package: Package Options. (line 6)
- * Ordering macros: Suggested Ordering. (line 6)
- * Output variables <1>: Setting Output Variables.
- (line 6)
- * Output variables: Preset Output Variables.
- (line 6)
- * Output variables, special characters in: Special Chars in Variables.
- (line 6)
- * output, low-level: File Descriptor Macros.
- (line 6)
- * Outputting files: Output. (line 6)
- * overflow, signed integer <1>: Signed Overflow Advice.
- (line 6)
- * overflow, signed integer <2>: Signed Overflow Examples.
- (line 6)
- * overflow, signed integer <3>: Integer Overflow Basics.
- (line 6)
- * overflow, signed integer: Integer Overflow. (line 6)
- * Package options: Package Options. (line 6)
- * package.m4: Making testsuite Scripts.
- (line 12)
- * Parallel make: Parallel Make. (line 6)
- * parentheses, balancing: Balancing Parentheses.
- (line 6)
- * Patterns, forbidden: Forbidden Patterns. (line 6)
- * pdfdir: Installation Directory Variables.
- (line 69)
- * polymorphic variable name: Polymorphic Variables.
- (line 6)
- * portability: Varieties of Unportability.
- (line 6)
- * Portability of C functions: Function Portability.
- (line 6)
- * Portability of headers: Header Portability. (line 6)
- * Portable C and C++ programming: Portable C and C++. (line 6)
- * Portable shell programming: Portable Shell. (line 6)
- * positional parameters: Shell Substitutions. (line 121)
- * Posix termios headers: System Services. (line 75)
- * Precious Variable: Setting Output Variables.
- (line 65)
- * prefix: Installation Directory Variables.
- (line 72)
- * Prefix for install: Default Prefix. (line 6)
- * preprocessor arithmetic: Preprocessor Arithmetic.
- (line 6)
- * Preprocessors: Compilers and Preprocessors.
- (line 6)
- * prerequisite directories and VPATH: Tru64 Directory Magic.
- (line 6)
- * Prerequisite macros: Prerequisite Macros. (line 6)
- * Program names, transforming: Transforming Names. (line 6)
- * Programs, checking: Alternative Programs.
- (line 6)
- * psdir: Installation Directory Variables.
- (line 77)
- * QNX 4.25: Systemology. (line 37)
- * quadrigraphs: Quadrigraphs. (line 6)
- * quotation <1>: M4 Quotation. (line 6)
- * quotation: Autoconf Language. (line 6)
- * Remaking automatically: Automatic Remaking. (line 6)
- * Revision: Notices. (line 18)
- * Rule, Single Suffix Inference: Single Suffix Rules. (line 6)
- * sbindir: Installation Directory Variables.
- (line 80)
- * Separated Dependencies: Single Suffix Rules. (line 9)
- * set -b: Limitations of Builtins.
- (line 689)
- * set -e: Limitations of Builtins.
- (line 605)
- * set -m: Limitations of Builtins.
- (line 689)
- * set -n: Limitations of Builtins.
- (line 713)
- * Set manipulation: Set manipulation Macros.
- (line 6)
- * sharedstatedir: Installation Directory Variables.
- (line 84)
- * SHELL and make: The Make Macro SHELL.
- (line 6)
- * Shell assignments: Assignments. (line 6)
- * Shell builtins: Limitations of Builtins.
- (line 6)
- * Shell file descriptors: File Descriptors. (line 6)
- * Shell Functions: Shell Functions. (line 6)
- * Shell here-documents: Here-Documents. (line 6)
- * shell invocation: Invoking the Shell. (line 6)
- * Shell parentheses: Parentheses. (line 6)
- * Shell pattern matching: Shell Pattern Matching.
- (line 6)
- * Shell slashes: Slashes. (line 6)
- * Shell substitutions: Shell Substitutions. (line 6)
- * Shell variables: Special Shell Variables.
- (line 6)
- * Shellology: Shellology. (line 6)
- * Signal handling in the shell: Signal Handling. (line 6)
- * Signals, shells and: Signal Handling. (line 6)
- * signed integer overflow <1>: Signed Overflow Advice.
- (line 6)
- * signed integer overflow <2>: Signed Overflow Examples.
- (line 6)
- * signed integer overflow <3>: Integer Overflow Basics.
- (line 6)
- * signed integer overflow: Integer Overflow. (line 6)
- * Single Suffix Inference Rule: Single Suffix Rules. (line 6)
- * Site defaults: Site Defaults. (line 6)
- * Site details: Site Details. (line 6)
- * Special shell variables: Special Shell Variables.
- (line 6)
- * srcdir <1>: Preset Output Variables.
- (line 195)
- * srcdir: Configuration Actions.
- (line 71)
- * standard input: File Descriptor Macros.
- (line 6)
- * Standard symbols: Standard Symbols. (line 6)
- * Structure, checking: Structures. (line 6)
- * Subdirectory configure: Subdirectories. (line 6)
- * Substitutions in makefiles: Makefile Substitutions.
- (line 6)
- * Symbolic links: Limitations of Usual Tools.
- (line 543)
- * sysconfdir: Installation Directory Variables.
- (line 88)
- * System type <1>: Canonicalizing. (line 6)
- * System type: Specifying Target Triplets.
- (line 6)
- * Systemology: Systemology. (line 6)
- * Target triplet: Specifying Target Triplets.
- (line 6)
- * termios Posix headers: System Services. (line 75)
- * test group: testsuite Scripts. (line 12)
- * testsuite <1>: testsuite Invocation.
- (line 6)
- * testsuite: testsuite Scripts. (line 6)
- * timestamp resolution <1>: Timestamps and Make. (line 6)
- * timestamp resolution: Limitations of Usual Tools.
- (line 226)
- * tmp: Configuration Actions.
- (line 89)
- * top_build_prefix: Preset Output Variables.
- (line 184)
- * top_builddir: Preset Output Variables.
- (line 180)
- * top_srcdir: Preset Output Variables.
- (line 202)
- * Transforming program names: Transforming Names. (line 6)
- * Tru64: Systemology. (line 44)
- * Types: Types. (line 6)
- * unbalanced parentheses, managing: Balancing Parentheses.
- (line 6)
- * undefined macro: New Macros. (line 6)
- * Unix version 7: Systemology. (line 49)
- * Unordered set manipulation: Set manipulation Macros.
- (line 6)
- * Upgrading autoconf <1>: Autoconf 2.13. (line 6)
- * Upgrading autoconf: Autoconf 1. (line 6)
- * V7: Systemology. (line 49)
- * variable name indirection: Polymorphic Variables.
- (line 6)
- * variable names, composing: Polymorphic Variables.
- (line 131)
- * Variable, Precious: Setting Output Variables.
- (line 65)
- * variables and VPATH: Variables listed in VPATH.
- (line 6)
- * Version: Versioning. (line 11)
- * version, Autoconf: Versioning. (line 6)
- * volatile objects: Volatile Objects. (line 6)
- * VPATH: VPATH and Make. (line 6)
- * VPATH and automatic rule rewriting: Automatic Rule Rewriting.
- (line 6)
- * VPATH and double-colon rules: VPATH and Double-colon.
- (line 6)
- * VPATH and prerequisite directories: Tru64 Directory Magic.
- (line 6)
- * VPATH and variables: Variables listed in VPATH.
- (line 6)
- * VPATH, explicit rules, and $<: $< in Explicit Rules.
- (line 6)
- * VPATH, resolving target pathnames: Make Target Lookup. (line 6)
- * whitespace in command-line macros: Command-line Macros and whitespace.
- (line 6)
- * whitespace in Makefile macros: Trailing whitespace in Make Macros.
- (line 6)
- * wraparound arithmetic <1>: Signed Overflow Advice.
- (line 6)
- * wraparound arithmetic <2>: Signed Overflow Examples.
- (line 6)
- * wraparound arithmetic <3>: Integer Overflow Basics.
- (line 6)
- * wraparound arithmetic: Integer Overflow. (line 6)
- * X Window System: System Services. (line 10)
- * Zsh: Shellology. (line 87)
- Tag Table:
- Node: Top1954
- Node: Introduction21371
- Node: The GNU Build System27935
- Node: Automake28914
- Node: Gnulib30863
- Node: Libtool32172
- Node: Pointers33594
- Ref: Pointers-Footnote-134895
- Node: Making configure Scripts35055
- Node: Writing Autoconf Input38404
- Node: Shell Script Compiler39867
- Node: Autoconf Language42228
- Node: Autoconf Input Layout49397
- Node: autoscan Invocation50805
- Node: ifnames Invocation53361
- Node: autoconf Invocation54561
- Node: autoreconf Invocation59846
- Node: Setup64607
- Node: Initializing configure65929
- Ref: AC_INIT66434
- Node: Versioning69318
- Node: Notices71179
- Node: Input72354
- Ref: AC_CONFIG_SRCDIR72495
- Node: Output75442
- Ref: AC_OUTPUT75877
- Ref: AC_PROG_MAKE_SET77495
- Node: Configuration Actions77920
- Node: Configuration Files83208
- Ref: AC_CONFIG_FILES83469
- Node: Makefile Substitutions84688
- Node: Preset Output Variables86431
- Node: Installation Directory Variables95945
- Node: Changed Directory Variables103793
- Node: Build Directories106387
- Node: Automatic Remaking108242
- Node: Configuration Headers110410
- Node: Header Templates113712
- Node: autoheader Invocation116447
- Node: Autoheader Macros120089
- Node: Configuration Commands122354
- Ref: AC_CONFIG_COMMANDS122866
- Node: Configuration Links124151
- Ref: AC_CONFIG_LINKS124602
- Node: Subdirectories125575
- Node: Default Prefix128055
- Ref: AC_PREFIX_PROGRAM128946
- Node: Existing Tests129477
- Node: Common Behavior131279
- Node: Standard Symbols131918
- Node: Default Includes132499
- Node: Alternative Programs134753
- Node: Particular Programs135439
- Ref: AC_PROG_LEX141187
- Ref: AC_PROG_LN_S143798
- Node: Generic Programs145416
- Ref: AC_CHECK_PROG146388
- Ref: AC_CHECK_PROGS147114
- Ref: AC_PATH_PROG151114
- Ref: AC_PATH_PROGS151488
- Node: Files154567
- Node: Libraries155767
- Ref: AC_CHECK_LIB156008
- Ref: AC_SEARCH_LIBS158267
- Node: Library Functions159451
- Node: Function Portability160074
- Node: Particular Functions169586
- Ref: AC_FUNC_ALLOCA169917
- Ref: AC_FUNC_CLOSEDIR_VOID172306
- Ref: AC_FUNC_FORK174296
- Ref: AC_FUNC_GETLOADAVG176338
- Ref: AC_FUNC_GETMNTENT177903
- Ref: AC_FUNC_MMAP182145
- Ref: AC_FUNC_STRCOLL185000
- Ref: AC_FUNC_STRFTIME185975
- Ref: AC_FUNC_UTIME_NULL187257
- Ref: AC_FUNC_VPRINTF187605
- Node: Generic Functions188821
- Ref: AC_CHECK_FUNC189347
- Ref: AC_CHECK_FUNCS189976
- Node: Header Files194602
- Node: Header Portability195235
- Node: Particular Headers198330
- Ref: AC_HEADER_DIRENT199369
- Ref: AC_HEADER_MAJOR200899
- Ref: AC_HEADER_STAT201683
- Ref: AC_HEADER_STDC203189
- Ref: AC_HEADER_TIME207928
- Node: Generic Headers209315
- Ref: AC_CHECK_HEADER209715
- Ref: AC_CHECK_HEADERS211588
- Node: Declarations214153
- Node: Particular Declarations214749
- Node: Generic Declarations214973
- Ref: AC_CHECK_DECLS216358
- Node: Structures218884
- Node: Particular Structures219499
- Ref: AC_STRUCT_ST_BLOCKS220568
- Ref: AC_STRUCT_TIMEZONE221264
- Node: Generic Structures221593
- Ref: AC_CHECK_MEMBERS222584
- Node: Types223417
- Node: Particular Types223937
- Ref: AC_TYPE_GETGROUPS224380
- Ref: AC_TYPE_MODE_T227416
- Ref: AC_TYPE_OFF_T227599
- Ref: AC_TYPE_PID_T227779
- Ref: AC_TYPE_SIZE_T227959
- Ref: AC_TYPE_UID_T228328
- Node: Generic Types229973
- Node: Compilers and Preprocessors232128
- Node: Specific Compiler Characteristics233402
- Node: Generic Compiler Characteristics234507
- Ref: AC_CHECK_SIZEOF234747
- Node: C Compiler239537
- Ref: AC_PROG_CC_C_O243988
- Ref: AC_C_BIGENDIAN247796
- Ref: AC_C_CONST249637
- Ref: AC_C_INLINE252955
- Ref: AC_C_CHAR_UNSIGNED253178
- Ref: AC_PROG_GCC_TRADITIONAL255800
- Node: C++ Compiler256212
- Node: Objective C Compiler258609
- Node: Objective C++ Compiler259983
- Node: Erlang Compiler and Interpreter261433
- Node: Fortran Compiler263478
- Node: Go Compiler288878
- Node: System Services289923
- Ref: AC_PATH_X290168
- Ref: AC_PATH_XTRA291161
- Ref: AC_SYS_INTERPRETER291738
- Ref: AC_SYS_LONG_FILE_NAMES293150
- Node: Posix Variants293527
- Ref: AC_USE_SYSTEM_EXTENSIONS293827
- Node: Erlang Libraries294903
- Node: Writing Tests299841
- Node: Language Choice301865
- Ref: AC_LANG302362
- Ref: AC_LANG_PUSH304161
- Ref: Language Choice-Footnote-1306034
- Node: Writing Test Programs306190
- Node: Guidelines306768
- Node: Test Functions309028
- Node: Generating Sources310426
- Node: Running the Preprocessor316510
- Ref: AC_PREPROC_IFELSE317242
- Ref: AC_EGREP_HEADER319172
- Ref: AC_EGREP_CPP319501
- Node: Running the Compiler319926
- Node: Running the Linker321681
- Ref: AC_LINK_IFELSE322821
- Node: Runtime323697
- Ref: AC_RUN_IFELSE324472
- Node: Systemology329322
- Node: Multiple Cases331671
- Node: Results333372
- Node: Defining Symbols334191
- Node: Setting Output Variables339082
- Node: Special Chars in Variables344973
- Node: Caching Results346233
- Node: Cache Variable Names349951
- Node: Cache Files351602
- Node: Cache Checkpointing353927
- Node: Printing Messages355301
- Ref: AC_MSG_RESULT356815
- Ref: AC_MSG_NOTICE357322
- Ref: AC_MSG_ERROR357686
- Ref: AC_MSG_WARN358519
- Node: Programming in M4358942
- Node: M4 Quotation359747
- Node: Active Characters360716
- Ref: Active Characters-Footnote-1362106
- Ref: Active Characters-Footnote-2362220
- Node: One Macro Call362242
- Node: Quoting and Parameters363798
- Node: Quotation and Nested Macros366134
- Node: Changequote is Evil369144
- Node: Quadrigraphs371674
- Node: Balancing Parentheses374356
- Node: Quotation Rule Of Thumb378450
- Node: Using autom4te381348
- Ref: Using autom4te-Footnote-1381999
- Node: autom4te Invocation382048
- Node: Customizing autom4te390550
- Node: Programming in M4sugar391831
- Node: Redefined M4 Macros393012
- Node: Diagnostic Macros401342
- Ref: m4_fatal402095
- Ref: m4_warn402334
- Node: Diversion support403102
- Node: Conditional constructs410888
- Node: Looping constructs417742
- Ref: m4_foreach_w421354
- Node: Evaluation Macros428706
- Node: Text processing Macros437395
- Node: Number processing Macros447105
- Ref: m4_version_compare449057
- Node: Set manipulation Macros451364
- Node: Forbidden Patterns460480
- Node: Debugging via autom4te461971
- Node: Programming in M4sh463790
- Node: Common Shell Constructs465163
- Node: Polymorphic Variables473136
- Node: Initialization Macros482725
- Node: File Descriptor Macros488314
- Ref: AS_MESSAGE_LOG_FD489466
- Node: Writing Autoconf Macros490968
- Node: Macro Definitions491773
- Node: Macro Names495452
- Node: Reporting Messages499213
- Node: Dependencies Between Macros501057
- Node: Prerequisite Macros501752
- Node: Suggested Ordering507827
- Node: One-Shot Macros509370
- Node: Obsoleting Macros510723
- Ref: AU_DEFUN511477
- Node: Coding Style512506
- Node: Portable Shell520313
- Node: Shellology524621
- Node: Invoking the Shell528792
- Node: Here-Documents529974
- Node: File Descriptors533594
- Node: Signal Handling540032
- Node: File System Conventions545240
- Node: Shell Pattern Matching551052
- Node: Shell Substitutions551616
- Node: Assignments569492
- Node: Parentheses571383
- Node: Slashes572340
- Node: Special Shell Variables573194
- Node: Shell Functions586526
- Node: Limitations of Builtins589933
- Ref: case593955
- Ref: echo599113
- Ref: export606087
- Ref: if609507
- Ref: set613318
- Ref: trap625040
- Ref: unset628851
- Node: Limitations of Usual Tools629946
- Ref: awk630245
- Ref: grep648349
- Ref: mkdir653981
- Ref: sed659801
- Ref: touch670932
- Node: Portable Make674207
- Node: $< in Ordinary Make Rules675869
- Node: Failure in Make Rules676335
- Node: Special Chars in Names677363
- Node: Backslash-Newline-Empty678335
- Node: Backslash-Newline Comments679367
- Node: Long Lines in Makefiles680256
- Node: Macros and Submakes680632
- Node: The Make Macro MAKEFLAGS683319
- Node: The Make Macro SHELL684204
- Node: Parallel Make686703
- Node: Comments in Make Rules690387
- Node: Newlines in Make Rules691557
- Node: Comments in Make Macros692602
- Node: Trailing whitespace in Make Macros693812
- Node: Command-line Macros and whitespace694563
- Node: obj/ and Make695233
- Node: make -k Status695884
- Node: VPATH and Make696506
- Node: Variables listed in VPATH697830
- Node: VPATH and Double-colon698369
- Node: $< in Explicit Rules698775
- Node: Automatic Rule Rewriting699242
- Node: Tru64 Directory Magic705924
- Node: Make Target Lookup706750
- Node: Single Suffix Rules711192
- Node: Timestamps and Make712538
- Node: Portable C and C++714223
- Node: Varieties of Unportability715864
- Node: Integer Overflow717961
- Node: Integer Overflow Basics718974
- Node: Signed Overflow Examples720722
- Node: Optimization and Wraparound724224
- Node: Signed Overflow Advice727186
- Node: Signed Integer Division729860
- Node: Preprocessor Arithmetic730471
- Node: Null Pointers731220
- Node: Buffer Overruns731854
- Node: Volatile Objects734643
- Node: Floating Point Portability740321
- Node: Exiting Portably740828
- Node: Manual Configuration742304
- Node: Specifying Target Triplets743137
- Ref: Specifying Names743310
- Node: Canonicalizing746185
- Node: Using System Type748448
- Node: Site Configuration751252
- Node: Help Formatting752224
- Node: External Software753168
- Ref: AC_ARG_WITH754714
- Node: Package Options759039
- Ref: AC_ARG_ENABLE760494
- Node: Pretty Help Strings761655
- Ref: AS_HELP_STRING762241
- Node: Option Checking764582
- Node: Site Details766310
- Node: Transforming Names767539
- Node: Transformation Options768621
- Node: Transformation Examples769098
- Node: Transformation Rules770819
- Node: Site Defaults772365
- Node: Running configure Scripts777706
- Node: Basic Installation778771
- Node: Compilers and Options782868
- Node: Multiple Architectures783522
- Node: Installation Names785102
- Node: Optional Features787997
- Node: Particular Systems789351
- Node: System Type790775
- Node: Sharing Defaults792103
- Node: Defining Variables792741
- Node: configure Invocation793639
- Node: config.status Invocation795345
- Ref: CONFIG_SHELL799092
- Node: Obsolete Constructs800258
- Node: Obsolete config.status Use801221
- Node: acconfig Header802999
- Node: autoupdate Invocation805021
- Node: Obsolete Macros806887
- Ref: AC_FUNC_SETVBUF_REVERSED814529
- Ref: AC_TYPE_SIGNAL831075
- Node: Autoconf 1834053
- Node: Changed File Names835119
- Node: Changed Makefiles835869
- Node: Changed Macros836957
- Node: Changed Results838211
- Node: Changed Macro Writing840335
- Node: Autoconf 2.13841615
- Node: Changed Quotation842823
- Node: New Macros844741
- Node: Hosts and Cross-Compilation846536
- Node: AC_LIBOBJ vs LIBOBJS850691
- Node: AC_ACT_IFELSE vs AC_TRY_ACT852306
- Ref: AC_FOO_IFELSE vs AC_TRY_FOO852495
- Node: Using Autotest854308
- Node: Using an Autotest Test Suite856712
- Node: testsuite Scripts857003
- Node: Autotest Logs861485
- Node: Writing Testsuites863826
- Node: testsuite Invocation880858
- Node: Making testsuite Scripts886205
- Node: FAQ891343
- Node: Distributing892203
- Node: Why GNU M4893252
- Node: Bootstrapping894121
- Node: Why Not Imake894731
- Node: Defining Directories899482
- Node: Autom4te Cache901640
- Node: Present But Cannot Be Compiled903478
- Node: Expanded Before Required907195
- Node: Debugging912093
- Node: History917116
- Node: Genesis917985
- Node: Exodus919163
- Node: Leviticus922208
- Node: Numbers923736
- Node: Deuteronomy925651
- Node: GNU Free Documentation License928322
- Node: Indices953487
- Node: Environment Variable Index954206
- Node: Output Variable Index965546
- Node: Preprocessor Symbol Index982426
- Node: Cache Variable Index1000695
- Node: Autoconf Macro Index1011383
- Node: M4 Macro Index1045712
- Node: Autotest Macro Index1066462
- Node: Program & Function Index1068865
- Node: Concept Index1089579
- End Tag Table
|