123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215 |
- \input texinfo @c -*-texinfo-*-
- @c %**start of header
- @setfilename automake.info
- @settitle automake
- @documentencoding UTF-8
- @documentlanguage en
- @setchapternewpage off
- @c %**end of header
- @include version.texi
- @c @ovar(ARG, DEFAULT)
- @c -------------------
- @c The ARG is an optional argument. To be used for macro arguments in
- @c their documentation (@defmac).
- @macro ovar{varname}
- @r{[}@var{\varname\}@r{]}
- @end macro
- @set PACKAGE_BUGREPORT bug-automake@@gnu.org
- @copying
- This manual is for GNU Automake (version @value{VERSION},
- @value{UPDATED}), a program that creates GNU standards-compliant
- Makefiles from template files.
- Copyright @copyright{} 1995-2017 Free Software Foundation, Inc.
- @quotation
- 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, with no Front-Cover texts,
- and with no Back-Cover Texts. A copy of the license is included in the
- section entitled ``GNU Free Documentation License.''
- @end quotation
- @end copying
- @dircategory Software development
- @direntry
- * Automake: (automake). Making GNU standards-compliant Makefiles.
- @end direntry
- @dircategory Individual utilities
- @direntry
- * aclocal-invocation: (automake)aclocal Invocation. Generating aclocal.m4.
- * automake-invocation: (automake)automake Invocation. Generating Makefile.in.
- @end direntry
- @titlepage
- @title GNU Automake
- @subtitle For version @value{VERSION}, @value{UPDATED}
- @author David MacKenzie
- @author Tom Tromey
- @author Alexandre Duret-Lutz
- @author Ralf Wildenhues
- @author Stefano Lattarini
- @page
- @vskip 0pt plus 1filll
- @insertcopying
- @end titlepage
- @contents
- @c We use the following macros to define indices:
- @c @cindex concepts, and anything that does not fit elsewhere
- @c @vindex Makefile variables
- @c @trindex targets
- @c @acindex Autoconf/Automake/Libtool/M4/... macros
- @c @opindex tool options
- @c Define an index of configure macros.
- @defcodeindex ac
- @c Define an index of options.
- @defcodeindex op
- @c Define an index of targets.
- @defcodeindex tr
- @c Define an index of commands.
- @defcodeindex cm
- @c Put the macros in the function index.
- @syncodeindex ac fn
- @c Put everything else into one index (arbitrarily chosen to be the
- @c concept index).
- @syncodeindex op cp
- @syncodeindex tr cp
- @syncodeindex cm cp
- @ifnottex
- @node Top
- @comment node-name, next, previous, up
- @top GNU Automake
- @insertcopying
- @menu
- * Introduction:: Automake's purpose
- * Autotools Introduction:: An Introduction to the Autotools
- * Generalities:: General ideas
- * Examples:: Some example packages
- * automake Invocation:: Creating a Makefile.in
- * configure:: Scanning configure.ac, using aclocal
- * Directories:: Declaring subdirectories
- * Programs:: Building programs and libraries
- * Other Objects:: Other derived objects
- * Other GNU Tools:: Other GNU Tools
- * Documentation:: Building documentation
- * Install:: What gets installed
- * Clean:: What gets cleaned
- * Dist:: What goes in a distribution
- * Tests:: Support for test suites
- * Rebuilding:: Automatic rebuilding of Makefile
- * Options:: Changing Automake's behavior
- * Miscellaneous:: Miscellaneous rules
- * Include:: Including extra files in an Automake template
- * Conditionals:: Conditionals
- * Silencing Make:: Obtain less verbose output from @command{make}
- * Gnits:: The effect of @option{--gnu} and @option{--gnits}
- * Not Enough:: When Automake is not Enough
- * Distributing:: Distributing the Makefile.in
- * API Versioning:: About compatibility between Automake versions
- * Upgrading:: Upgrading to a Newer Automake Version
- * FAQ:: Frequently Asked Questions
- * Copying This Manual:: How to make copies of this manual
- * Indices:: Indices of variables, macros, and concepts
- @detailmenu
- --- The Detailed Node Listing ---
- An Introduction to the Autotools
- * GNU Build System:: Introducing the GNU Build System
- * Use Cases:: Use Cases for the GNU Build System
- * Why Autotools:: How Autotools Help
- * Hello World:: A Small Hello World Package
- Use Cases for the GNU Build System
- * Basic Installation:: Common installation procedure
- * Standard Targets:: A list of standard Makefile targets
- * Standard Directory Variables:: A list of standard directory variables
- * Standard Configuration Variables:: Using configuration variables
- * config.site:: Using a config.site file
- * VPATH Builds:: Parallel build trees
- * Two-Part Install:: Installing data and programs separately
- * Cross-Compilation:: Building for other architectures
- * Renaming:: Renaming programs at install time
- * DESTDIR:: Building binary packages with DESTDIR
- * Preparing Distributions:: Rolling out tarballs
- * Dependency Tracking:: Automatic dependency tracking
- * Nested Packages:: The GNU Build Systems can be nested
- A Small Hello World
- * Creating amhello:: Create @file{amhello-1.0.tar.gz} from scratch
- * amhello's configure.ac Setup Explained::
- * amhello's Makefile.am Setup Explained::
- General ideas
- * General Operation:: General operation of Automake
- * Strictness:: Standards conformance checking
- * Uniform:: The Uniform Naming Scheme
- * Length Limitations:: Staying below the command line length limit
- * Canonicalization:: How derived variables are named
- * User Variables:: Variables reserved for the user
- * Auxiliary Programs:: Programs automake might require
- Some example packages
- * Complete:: A simple example, start to finish
- * true:: Building true and false
- Scanning @file{configure.ac}, using @command{aclocal}
- * Requirements:: Configuration requirements
- * Optional:: Other things Automake recognizes
- * aclocal Invocation:: Auto-generating aclocal.m4
- * Macros:: Autoconf macros supplied with Automake
- Auto-generating aclocal.m4
- * aclocal Options:: Options supported by aclocal
- * Macro Search Path:: How aclocal finds .m4 files
- * Extending aclocal:: Writing your own aclocal macros
- * Local Macros:: Organizing local macros
- * Serials:: Serial lines in Autoconf macros
- * Future of aclocal:: aclocal's scheduled death
- Autoconf macros supplied with Automake
- * Public Macros:: Macros that you can use.
- * Private Macros:: Macros that you should not use.
- Directories
- * Subdirectories:: Building subdirectories recursively
- * Conditional Subdirectories:: Conditionally not building directories
- * Alternative:: Subdirectories without recursion
- * Subpackages:: Nesting packages
- Conditional Subdirectories
- * SUBDIRS vs DIST_SUBDIRS:: Two sets of directories
- * Subdirectories with AM_CONDITIONAL:: Specifying conditional subdirectories
- * Subdirectories with AC_SUBST:: Another way for conditional recursion
- * Unconfigured Subdirectories:: Not even creating a @samp{Makefile}
- Building Programs and Libraries
- * A Program:: Building a program
- * A Library:: Building a library
- * A Shared Library:: Building a Libtool library
- * Program and Library Variables:: Variables controlling program and
- library builds
- * Default _SOURCES:: Default source files
- * LIBOBJS:: Special handling for LIBOBJS and ALLOCA
- * Program Variables:: Variables used when building a program
- * Yacc and Lex:: Yacc and Lex support
- * C++ Support:: Compiling C++ sources
- * Objective C Support:: Compiling Objective C sources
- * Objective C++ Support:: Compiling Objective C++ sources
- * Unified Parallel C Support:: Compiling Unified Parallel C sources
- * Assembly Support:: Compiling assembly sources
- * Fortran 77 Support:: Compiling Fortran 77 sources
- * Fortran 9x Support:: Compiling Fortran 9x sources
- * Java Support with gcj:: Compiling Java sources using gcj
- * Vala Support:: Compiling Vala sources
- * Support for Other Languages:: Compiling other languages
- * Dependencies:: Automatic dependency tracking
- * EXEEXT:: Support for executable extensions
- Building a program
- * Program Sources:: Defining program sources
- * Linking:: Linking with libraries or extra objects
- * Conditional Sources:: Handling conditional sources
- * Conditional Programs:: Building a program conditionally
- Building a Shared Library
- * Libtool Concept:: Introducing Libtool
- * Libtool Libraries:: Declaring Libtool Libraries
- * Conditional Libtool Libraries:: Building Libtool Libraries Conditionally
- * Conditional Libtool Sources:: Choosing Library Sources Conditionally
- * Libtool Convenience Libraries:: Building Convenience Libtool Libraries
- * Libtool Modules:: Building Libtool Modules
- * Libtool Flags:: Using _LIBADD, _LDFLAGS, and _LIBTOOLFLAGS
- * LTLIBOBJS:: Using $(LTLIBOBJS) and $(LTALLOCA)
- * Libtool Issues:: Common Issues Related to Libtool's Use
- Common Issues Related to Libtool's Use
- * Error required file ltmain.sh not found:: The need to run libtoolize
- * Objects created both with libtool and without:: Avoid a specific build race
- Fortran 77 Support
- * Preprocessing Fortran 77:: Preprocessing Fortran 77 sources
- * Compiling Fortran 77 Files:: Compiling Fortran 77 sources
- * Mixing Fortran 77 With C and C++:: Mixing Fortran 77 With C and C++
- Mixing Fortran 77 With C and C++
- * How the Linker is Chosen:: Automatic linker selection
- Fortran 9x Support
- * Compiling Fortran 9x Files:: Compiling Fortran 9x sources
- Other Derived Objects
- * Scripts:: Executable scripts
- * Headers:: Header files
- * Data:: Architecture-independent data files
- * Sources:: Derived sources
- Built Sources
- * Built Sources Example:: Several ways to handle built sources.
- Other GNU Tools
- * Emacs Lisp:: Emacs Lisp
- * gettext:: Gettext
- * Libtool:: Libtool
- * Java:: Java bytecode compilation (deprecated)
- * Python:: Python
- Building documentation
- * Texinfo:: Texinfo
- * Man Pages:: Man pages
- What Gets Installed
- * Basics of Installation:: What gets installed where
- * The Two Parts of Install:: Installing data and programs separately
- * Extending Installation:: Adding your own rules for installation
- * Staged Installs:: Installation in a temporary location
- * Install Rules for the User:: Useful additional rules
- What Goes in a Distribution
- * Basics of Distribution:: Files distributed by default
- * Fine-grained Distribution Control:: @code{dist_} and @code{nodist_} prefixes
- * The dist Hook:: A target for last-minute distribution changes
- * Checking the Distribution:: @samp{make distcheck} explained
- * The Types of Distributions:: A variety of formats and compression methods
- Support for test suites
- * Generalities about Testing:: Generic concepts and terminology about testing
- * Simple Tests:: Listing test scripts in @code{TESTS}
- * Custom Test Drivers:: Writing and using custom test drivers
- * Using the TAP test protocol:: Integrating test scripts that use the TAP protocol
- * DejaGnu Tests:: Interfacing with the @command{dejagnu} testing framework
- * Install Tests:: Running tests on installed packages
- Simple Tests
- * Scripts-based Testsuites:: Automake-specific concepts and terminology
- * Serial Test Harness:: Older (and discouraged) serial test harness
- * Parallel Test Harness:: Generic concurrent test harness
- Using the TAP test protocol
- * Introduction to TAP::
- * Use TAP with the Automake test harness::
- * Incompatibilities with other TAP parsers and drivers::
- * Links and external resources on TAP::
- Custom Test Drivers
- * Overview of Custom Test Drivers Support::
- * Declaring Custom Test Drivers::
- * API for Custom Test Drivers::
- API for Custom Test Drivers
- * Command-line arguments for test drivers::
- * Log files generation and test results recording::
- * Testsuite progress output::
- Changing Automake's Behavior
- * Options generalities:: Semantics of Automake option
- * List of Automake options:: A comprehensive list of Automake options
- Miscellaneous Rules
- * Tags:: Interfacing to cscope, etags and mkid
- * Suffixes:: Handling new file extensions
- Conditionals
- * Usage of Conditionals:: Declaring conditional content
- * Limits of Conditionals:: Enclosing complete statements
- Silencing Make
- * Make verbosity:: Make is verbose by default
- * Tricks For Silencing Make:: Standard and generic ways to silence make
- * Automake Silent Rules:: How Automake can help in silencing make
- When Automake Isn't Enough
- * Extending:: Adding new rules or overriding existing ones.
- * Third-Party Makefiles:: Integrating Non-Automake @file{Makefile}s.
- Frequently Asked Questions about Automake
- * CVS:: CVS and generated files
- * maintainer-mode:: missing and AM_MAINTAINER_MODE
- * Wildcards:: Why doesn't Automake support wildcards?
- * Limitations on File Names:: Limitations on source and installed file names
- * Errors with distclean:: Files left in build directory after distclean
- * Flag Variables Ordering:: CFLAGS vs.@: AM_CFLAGS vs.@: mumble_CFLAGS
- * Renamed Objects:: Why are object files sometimes renamed?
- * Per-Object Flags:: How to simulate per-object flags?
- * Multiple Outputs:: Writing rules for tools with many output files
- * Hard-Coded Install Paths:: Installing to hard-coded locations
- * Debugging Make Rules:: Strategies when things don't work as expected
- * Reporting Bugs:: Feedback on bugs and feature requests
- Copying This Manual
- * GNU Free Documentation License:: License for copying this manual
- Indices
- * Macro Index:: Index of Autoconf macros
- * Variable Index:: Index of Makefile variables
- * General Index:: General index
- @end detailmenu
- @end menu
- @end ifnottex
- @node Introduction
- @chapter Introduction
- Automake is a tool for automatically generating @file{Makefile.in}s
- from files called @file{Makefile.am}. Each @file{Makefile.am} is
- basically a series of @command{make} variable
- definitions@footnote{These variables are also called @dfn{make macros}
- in Make terminology, however in this manual we reserve the term
- @dfn{macro} for Autoconf's macros.}, with rules being thrown in
- occasionally. The generated @file{Makefile.in}s are compliant with
- the GNU Makefile standards.
- @cindex GNU Makefile standards
- The GNU Makefile Standards Document
- (@pxref{Makefile Conventions, , , standards, The GNU Coding Standards})
- is long, complicated, and subject to change. The goal of Automake is to
- remove the burden of Makefile maintenance from the back of the
- individual GNU maintainer (and put it on the back of the Automake
- maintainers).
- The typical Automake input file is simply a series of variable definitions.
- Each such file is processed to create a @file{Makefile.in}.
- @cindex Constraints of Automake
- @cindex Automake constraints
- Automake does constrain a project in certain ways; for instance, it
- assumes that the project uses Autoconf (@pxref{Top, , Introduction,
- autoconf, The Autoconf Manual}), and enforces certain restrictions on
- the @file{configure.ac} contents.
- @cindex Automake requirements
- @cindex Requirements, Automake
- Automake requires @command{perl} in order to generate the
- @file{Makefile.in}s. However, the distributions created by Automake are
- fully GNU standards-compliant, and do not require @command{perl} in order
- to be built.
- @cindex Bugs, reporting
- @cindex Reporting bugs
- @cindex E-mail, bug reports
- For more information on bug reports, @xref{Reporting Bugs}.
- @node Autotools Introduction
- @chapter An Introduction to the Autotools
- If you are new to Automake, maybe you know that it is part of a set of
- tools called @emph{The Autotools}. Maybe you've already delved into a
- package full of files named @file{configure}, @file{configure.ac},
- @file{Makefile.in}, @file{Makefile.am}, @file{aclocal.m4}, @dots{},
- some of them claiming to be @emph{generated by} Autoconf or Automake.
- But the exact purpose of these files and their relations is probably
- fuzzy. The goal of this chapter is to introduce you to this machinery,
- to show you how it works and how powerful it is. If you've never
- installed or seen such a package, do not worry: this chapter will walk
- you through it.
- If you need some teaching material, more illustrations, or a less
- @command{automake}-centered continuation, some slides for this
- introduction are available in Alexandre Duret-Lutz's
- @uref{http://www.lrde.epita.fr/@/~adl/@/autotools.html,
- Autotools Tutorial}.
- This chapter is the written version of the first part of his tutorial.
- @menu
- * GNU Build System:: Introducing the GNU Build System
- * Use Cases:: Use Cases for the GNU Build System
- * Why Autotools:: How Autotools Help
- * Hello World:: A Small Hello World Package
- @end menu
- @node GNU Build System
- @section Introducing the GNU Build System
- @cindex GNU Build System, introduction
- It is a truth universally acknowledged, that as a developer in
- possession of a new package, you must be in want of a build system.
- In the Unix world, such a build system is traditionally achieved using
- the command @command{make} (@pxref{Top, , Overview, make, The GNU Make
- Manual}). You express the recipe to build your package in a
- @file{Makefile}. This file is a set of rules to build the files in
- the package. For instance the program @file{prog} may be built by
- running the linker on the files @file{main.o}, @file{foo.o}, and
- @file{bar.o}; the file @file{main.o} may be built by running the
- compiler on @file{main.c}; etc. Each time @command{make} is run, it
- reads @file{Makefile}, checks the existence and modification time of
- the files mentioned, decides what files need to be built (or rebuilt),
- and runs the associated commands.
- When a package needs to be built on a different platform than the one
- it was developed on, its @file{Makefile} usually needs to be adjusted.
- For instance the compiler may have another name or require more
- options. In 1991, David J. MacKenzie got tired of customizing
- @file{Makefile} for the 20 platforms he had to deal with. Instead, he
- handcrafted a little shell script called @file{configure} to
- automatically adjust the @file{Makefile} (@pxref{Genesis, , Genesis,
- autoconf, The Autoconf Manual}). Compiling his package was now
- as simple as running @code{./configure && make}.
- @cindex GNU Coding Standards
- Today this process has been standardized in the GNU project. The GNU
- Coding Standards (@pxref{Managing Releases, The Release Process, ,
- standards, The GNU Coding Standards}) explains how each package of the
- GNU project should have a @file{configure} script, and the minimal
- interface it should have. The @file{Makefile} too should follow some
- established conventions. The result? A unified build system that
- makes all packages almost indistinguishable by the installer. In its
- simplest scenario, all the installer has to do is to unpack the
- package, run @code{./configure && make && make install}, and repeat
- with the next package to install.
- We call this build system the @dfn{GNU Build System}, since it was
- grown out of the GNU project. However it is used by a vast number of
- other packages: following any existing convention has its advantages.
- @cindex Autotools, introduction
- The Autotools are tools that will create a GNU Build System for your
- package. Autoconf mostly focuses on @file{configure} and Automake on
- @file{Makefile}s. It is entirely possible to create a GNU Build
- System without the help of these tools. However it is rather
- burdensome and error-prone. We will discuss this again after some
- illustration of the GNU Build System in action.
- @node Use Cases
- @section Use Cases for the GNU Build System
- @cindex GNU Build System, use cases
- @cindex GNU Build System, features
- @cindex Features of the GNU Build System
- @cindex Use Cases for the GNU Build System
- @cindex @file{amhello-1.0.tar.gz}, location
- @cindex @file{amhello-1.0.tar.gz}, use cases
- In this section we explore several use cases for the GNU Build System.
- You can replay all of these examples on the @file{amhello-1.0.tar.gz}
- package distributed with Automake. If Automake is installed on your
- system, you should find a copy of this file in
- @file{@var{prefix}/share/doc/automake/amhello-1.0.tar.gz}, where
- @var{prefix} is the installation prefix specified during configuration
- (@var{prefix} defaults to @file{/usr/local}, however if Automake was
- installed by some GNU/Linux distribution it most likely has been set
- to @file{/usr}). If you do not have a copy of Automake installed,
- you can find a copy of this file inside the @file{doc/} directory of
- the Automake package.
- Some of the following use cases present features that are in fact
- extensions to the GNU Build System. Read: they are not specified by
- the GNU Coding Standards, but they are nonetheless part of the build
- system created by the Autotools. To keep things simple, we do not
- point out the difference. Our objective is to show you many of the
- features that the build system created by the Autotools will offer to
- you.
- @menu
- * Basic Installation:: Common installation procedure
- * Standard Targets:: A list of standard Makefile targets
- * Standard Directory Variables:: A list of standard directory variables
- * Standard Configuration Variables:: Using configuration variables
- * config.site:: Using a config.site file
- * VPATH Builds:: Parallel build trees
- * Two-Part Install:: Installing data and programs separately
- * Cross-Compilation:: Building for other architectures
- * Renaming:: Renaming programs at install time
- * DESTDIR:: Building binary packages with DESTDIR
- * Preparing Distributions:: Rolling out tarballs
- * Dependency Tracking:: Automatic dependency tracking
- * Nested Packages:: The GNU Build Systems can be nested
- @end menu
- @node Basic Installation
- @subsection Basic Installation
- @cindex Configuration, basics
- @cindex Installation, basics
- @cindex GNU Build System, basics
- The most common installation procedure looks as follows.
- @example
- ~ % @kbd{tar zxf amhello-1.0.tar.gz}
- ~ % @kbd{cd amhello-1.0}
- ~/amhello-1.0 % @kbd{./configure}
- @dots{}
- config.status: creating Makefile
- config.status: creating src/Makefile
- @dots{}
- ~/amhello-1.0 % @kbd{make}
- @dots{}
- ~/amhello-1.0 % @kbd{make check}
- @dots{}
- ~/amhello-1.0 % @kbd{su}
- Password:
- /home/adl/amhello-1.0 # @kbd{make install}
- @dots{}
- /home/adl/amhello-1.0 # @kbd{exit}
- ~/amhello-1.0 % @kbd{make installcheck}
- @dots{}
- @end example
- @cindex Unpacking
- The user first unpacks the package. Here, and in the following
- examples, we will use the non-portable @code{tar zxf} command for
- simplicity. On a system without GNU @command{tar} installed, this
- command should read @code{gunzip -c amhello-1.0.tar.gz | tar xf -}.
- The user then enters the newly created directory to run the
- @file{configure} script. This script probes the system for various
- features, and finally creates the @file{Makefile}s. In this toy
- example there are only two @file{Makefile}s, but in real-world projects,
- there may be many more, usually one @file{Makefile} per directory.
- It is now possible to run @code{make}. This will construct all the
- programs, libraries, and scripts that need to be constructed for the
- package. In our example, this compiles the @file{hello} program.
- All files are constructed in place, in the source tree; we will see
- later how this can be changed.
- @code{make check} causes the package's tests to be run. This step is
- not mandatory, but it is often good to make sure the programs that
- have been built behave as they should, before you decide to install
- them. Our example does not contain any tests, so running @code{make
- check} is a no-op.
- @cindex su, before @code{make install}
- After everything has been built, and maybe tested, it is time to
- install it on the system. That means copying the programs,
- libraries, header files, scripts, and other data files from the
- source directory to their final destination on the system. The
- command @code{make install} will do that. However, by default
- everything will be installed in subdirectories of @file{/usr/local}:
- binaries will go into @file{/usr/local/bin}, libraries will end up in
- @file{/usr/local/lib}, etc. This destination is usually not writable
- by any user, so we assume that we have to become root before we can
- run @code{make install}. In our example, running @code{make install}
- will copy the program @file{hello} into @file{/usr/local/bin}
- and @file{README} into @file{/usr/local/share/doc/amhello}.
- A last and optional step is to run @code{make installcheck}. This
- command may run tests on the installed files. @code{make check} tests
- the files in the source tree, while @code{make installcheck} tests
- their installed copies. The tests run by the latter can be different
- from those run by the former. For instance, there are tests that
- cannot be run in the source tree. Conversely, some packages are set
- up so that @code{make installcheck} will run the very same tests as
- @code{make check}, only on different files (non-installed
- vs.@: installed). It can make a difference, for instance when the
- source tree's layout is different from that of the installation.
- Furthermore it may help to diagnose an incomplete installation.
- Presently most packages do not have any @code{installcheck} tests
- because the existence of @code{installcheck} is little known, and its
- usefulness is neglected. Our little toy package is no better: @code{make
- installcheck} does nothing.
- @node Standard Targets
- @subsection Standard @file{Makefile} Targets
- So far we have come across four ways to run @command{make} in the GNU
- Build System: @code{make}, @code{make check}, @code{make install}, and
- @code{make installcheck}. The words @code{check}, @code{install}, and
- @code{installcheck}, passed as arguments to @command{make}, are called
- @dfn{targets}. @code{make} is a shorthand for @code{make all},
- @code{all} being the default target in the GNU Build System.
- Here is a list of the most useful targets that the GNU Coding Standards
- specify.
- @table @code
- @item make all
- @trindex all
- Build programs, libraries, documentation, etc.@: (same as @code{make}).
- @item make install
- @trindex install
- Install what needs to be installed, copying the files from the
- package's tree to system-wide directories.
- @item make install-strip
- @trindex install-strip
- Same as @code{make install}, then strip debugging symbols. Some
- users like to trade space for useful bug reports@enddots{}
- @item make uninstall
- @trindex uninstall
- The opposite of @code{make install}: erase the installed files.
- (This needs to be run from the same build tree that was installed.)
- @item make clean
- @trindex clean
- Erase from the build tree the files built by @code{make all}.
- @item make distclean
- @trindex distclean
- Additionally erase anything @code{./configure} created.
- @item make check
- @trindex check
- Run the test suite, if any.
- @item make installcheck
- @trindex installcheck
- Check the installed programs or libraries, if supported.
- @item make dist
- @trindex dist
- Recreate @file{@var{package}-@var{version}.tar.gz} from all the source
- files.
- @end table
- @node Standard Directory Variables
- @subsection Standard Directory Variables
- @cindex directory variables
- The GNU Coding Standards also specify a hierarchy of variables to
- denote installation directories. Some of these are:
- @multitable {Directory variable} {@code{$@{datarootdir@}/doc/$@{PACKAGE@}}}
- @headitem Directory variable @tab Default value
- @item @code{prefix} @tab @code{/usr/local}
- @item @w{@ @ @code{exec_prefix}} @tab @code{$@{prefix@}}
- @item @w{@ @ @ @ @code{bindir}} @tab @code{$@{exec_prefix@}/bin}
- @item @w{@ @ @ @ @code{libdir}} @tab @code{$@{exec_prefix@}/lib}
- @item @w{@ @ @ @ @dots{}}
- @item @w{@ @ @code{includedir}} @tab @code{$@{prefix@}/include}
- @item @w{@ @ @code{datarootdir}} @tab @code{$@{prefix@}/share}
- @item @w{@ @ @ @ @code{datadir}} @tab @code{$@{datarootdir@}}
- @item @w{@ @ @ @ @code{mandir}} @tab @code{$@{datarootdir@}/man}
- @item @w{@ @ @ @ @code{infodir}} @tab @code{$@{datarootdir@}/info}
- @item @w{@ @ @ @ @code{docdir}} @tab @code{$@{datarootdir@}/doc/$@{PACKAGE@}}
- @item @w{@ @ @dots{}}
- @end multitable
- @c We should provide a complete table somewhere, but not here. The
- @c complete list of directory variables it too confusing as-is. It
- @c requires some explanations that are too complicated for this
- @c introduction. Besides listing directories like localstatedir
- @c would make the explanations in ``Two-Part Install'' harder.
- Each of these directories has a role which is often obvious from its
- name. In a package, any installable file will be installed in one of
- these directories. For instance in @code{amhello-1.0}, the program
- @file{hello} is to be installed in @var{bindir}, the directory for
- binaries. The default value for this directory is
- @file{/usr/local/bin}, but the user can supply a different value when
- calling @command{configure}. Also the file @file{README} will be
- installed into @var{docdir}, which defaults to
- @file{/usr/local/share/doc/amhello}.
- @opindex --prefix
- As a user, if you wish to install a package on your own account, you
- could proceed as follows:
- @example
- ~/amhello-1.0 % @kbd{./configure --prefix ~/usr}
- @dots{}
- ~/amhello-1.0 % @kbd{make}
- @dots{}
- ~/amhello-1.0 % @kbd{make install}
- @dots{}
- @end example
- This would install @file{~/usr/bin/hello} and
- @file{~/usr/share/doc/amhello/README}.
- The list of all such directory options is shown by
- @code{./configure --help}.
- @node Standard Configuration Variables
- @subsection Standard Configuration Variables
- @cindex configuration variables, overriding
- The GNU Coding Standards also define a set of standard configuration
- variables used during the build. Here are some:
- @table @asis
- @item @code{CC}
- C compiler command
- @item @code{CFLAGS}
- C compiler flags
- @item @code{CXX}
- C++ compiler command
- @item @code{CXXFLAGS}
- C++ compiler flags
- @item @code{LDFLAGS}
- linker flags
- @item @code{CPPFLAGS}
- C/C++ preprocessor flags
- @item @dots{}
- @end table
- @command{configure} usually does a good job at setting appropriate
- values for these variables, but there are cases where you may want to
- override them. For instance you may have several versions of a
- compiler installed and would like to use another one, you may have
- header files installed outside the default search path of the
- compiler, or even libraries out of the way of the linker.
- Here is how one would call @command{configure} to force it to use
- @command{gcc-3} as C compiler, use header files from
- @file{~/usr/include} when compiling, and libraries from
- @file{~/usr/lib} when linking.
- @example
- ~/amhello-1.0 % @kbd{./configure --prefix ~/usr CC=gcc-3 \
- CPPFLAGS=-I$HOME/usr/include LDFLAGS=-L$HOME/usr/lib}
- @end example
- Again, a full list of these variables appears in the output of
- @code{./configure --help}.
- @node config.site
- @subsection Overriding Default Configuration Setting with @file{config.site}
- @cindex @file{config.site} example
- When installing several packages using the same setup, it can be
- convenient to create a file to capture common settings.
- If a file named @file{@var{prefix}/share/config.site} exists,
- @command{configure} will source it at the beginning of its execution.
- Recall the command from the previous section:
- @example
- ~/amhello-1.0 % @kbd{./configure --prefix ~/usr CC=gcc-3 \
- CPPFLAGS=-I$HOME/usr/include LDFLAGS=-L$HOME/usr/lib}
- @end example
- Assuming we are installing many package in @file{~/usr}, and will
- always want to use these definitions of @code{CC}, @code{CPPFLAGS}, and
- @code{LDFLAGS}, we can automate this by creating the following
- @file{~/usr/share/config.site} file:
- @example
- test -z "$CC" && CC=gcc-3
- test -z "$CPPFLAGS" && CPPFLAGS=-I$HOME/usr/include
- test -z "$LDFLAGS" && LDFLAGS=-L$HOME/usr/lib
- @end example
- Now, any time a @file{configure} script is using the @file{~/usr}
- prefix, it will execute the above @file{config.site} and define
- these three variables.
- @example
- ~/amhello-1.0 % @kbd{./configure --prefix ~/usr}
- configure: loading site script /home/adl/usr/share/config.site
- @dots{}
- @end example
- @xref{Site Defaults, , Setting Site Defaults, autoconf, The Autoconf
- Manual}, for more information about this feature.
- @node VPATH Builds
- @subsection Parallel Build Trees (a.k.a.@: VPATH Builds)
- @cindex Parallel build trees
- @cindex VPATH builds
- @cindex source tree and build tree
- @cindex build tree and source tree
- @cindex trees, source vs.@: build
- The GNU Build System distinguishes two trees: the source tree, and
- the build tree.
- The source tree is rooted in the directory containing
- @file{configure}. It contains all the sources files (those that are
- distributed), and may be arranged using several subdirectories.
- The build tree is rooted in the directory in which @file{configure}
- was run, and is populated with all object files, programs, libraries,
- and other derived files built from the sources (and hence not
- distributed). The build tree usually has the same subdirectory layout
- as the source tree; its subdirectories are created automatically by
- the build system.
- If @file{configure} is executed in its own directory, the source and
- build trees are combined: derived files are constructed in the same
- directories as their sources. This was the case in our first
- installation example (@pxref{Basic Installation}).
- A common request from users is that they want to confine all derived
- files to a single directory, to keep their source directories
- uncluttered. Here is how we could run @file{configure} to build
- everything in a subdirectory called @file{build/}.
- @example
- ~ % @kbd{tar zxf ~/amhello-1.0.tar.gz}
- ~ % @kbd{cd amhello-1.0}
- ~/amhello-1.0 % @kbd{mkdir build && cd build}
- ~/amhello-1.0/build % @kbd{../configure}
- @dots{}
- ~/amhello-1.0/build % @kbd{make}
- @dots{}
- @end example
- These setups, where source and build trees are different, are often
- called @dfn{parallel builds} or @dfn{VPATH builds}. The expression
- @emph{parallel build} is misleading: the word @emph{parallel} is a
- reference to the way the build tree shadows the source tree, it is not
- about some concurrency in the way build commands are run. For this
- reason we refer to such setups using the name @emph{VPATH builds} in
- the following. @emph{VPATH} is the name of the @command{make} feature
- used by the @file{Makefile}s to allow these builds (@pxref{General
- Search, , @code{VPATH} Search Path for All Prerequisites, make, The
- GNU Make Manual}).
- @cindex multiple configurations, example
- @cindex debug build, example
- @cindex optimized build, example
- VPATH builds have other interesting uses. One is to build the same
- sources with multiple configurations. For instance:
- @c Keep in sync with amhello-cflags.sh
- @example
- ~ % @kbd{tar zxf ~/amhello-1.0.tar.gz}
- ~ % @kbd{cd amhello-1.0}
- ~/amhello-1.0 % @kbd{mkdir debug optim && cd debug}
- ~/amhello-1.0/debug % @kbd{../configure CFLAGS='-g -O0'}
- @dots{}
- ~/amhello-1.0/debug % @kbd{make}
- @dots{}
- ~/amhello-1.0/debug % cd ../optim
- ~/amhello-1.0/optim % @kbd{../configure CFLAGS='-O3 -fomit-frame-pointer'}
- @dots{}
- ~/amhello-1.0/optim % @kbd{make}
- @dots{}
- @end example
- With network file systems, a similar approach can be used to build the
- same sources on different machines. For instance, suppose that the
- sources are installed on a directory shared by two hosts: @code{HOST1}
- and @code{HOST2}, which may be different platforms.
- @example
- ~ % @kbd{cd /nfs/src}
- /nfs/src % @kbd{tar zxf ~/amhello-1.0.tar.gz}
- @end example
- On the first host, you could create a local build directory:
- @example
- [HOST1] ~ % @kbd{mkdir /tmp/amh && cd /tmp/amh}
- [HOST1] /tmp/amh % @kbd{/nfs/src/amhello-1.0/configure}
- ...
- [HOST1] /tmp/amh % @kbd{make && sudo make install}
- ...
- @end example
- @noindent
- (Here we assume that the installer has configured @command{sudo} so it
- can execute @code{make install} with root privileges; it is more convenient
- than using @command{su} like in @ref{Basic Installation}).
- On the second host, you would do exactly the same, possibly at
- the same time:
- @example
- [HOST2] ~ % @kbd{mkdir /tmp/amh && cd /tmp/amh}
- [HOST2] /tmp/amh % @kbd{/nfs/src/amhello-1.0/configure}
- ...
- [HOST2] /tmp/amh % @kbd{make && sudo make install}
- ...
- @end example
- @cindex read-only source tree
- @cindex source tree, read-only
- In this scenario, nothing forbids the @file{/nfs/src/amhello-1.0}
- directory from being read-only. In fact VPATH builds are also a means
- of building packages from a read-only medium such as a CD-ROM. (The
- FSF used to sell CD-ROM with unpacked source code, before the GNU
- project grew so big.)
- @node Two-Part Install
- @subsection Two-Part Installation
- In our last example (@pxref{VPATH Builds}), a source tree was shared
- by two hosts, but compilation and installation were done separately on
- each host.
- The GNU Build System also supports networked setups where part of the
- installed files should be shared amongst multiple hosts. It does so
- by distinguishing architecture-dependent files from
- architecture-independent files, and providing two @file{Makefile}
- targets to install each of these classes of files.
- @trindex install-exec
- @trindex install-data
- These targets are @code{install-exec} for architecture-dependent files
- and @code{install-data} for architecture-independent files.
- The command we used up to now, @code{make install}, can be thought of
- as a shorthand for @code{make install-exec install-data}.
- From the GNU Build System point of view, the distinction between
- architecture-dependent files and architecture-independent files is
- based exclusively on the directory variable used to specify their
- installation destination. In the list of directory variables we
- provided earlier (@pxref{Standard Directory Variables}), all the
- variables based on @var{exec-prefix} designate architecture-dependent
- directories whose files will be installed by @code{make install-exec}.
- The others designate architecture-independent directories and will
- serve files installed by @code{make install-data}. @xref{The Two Parts
- of Install}, for more details.
- Here is how we could revisit our two-host installation example,
- assuming that (1) we want to install the package directly in
- @file{/usr}, and (2) the directory @file{/usr/share} is shared by the
- two hosts.
- On the first host we would run
- @example
- [HOST1] ~ % @kbd{mkdir /tmp/amh && cd /tmp/amh}
- [HOST1] /tmp/amh % @kbd{/nfs/src/amhello-1.0/configure --prefix /usr}
- ...
- [HOST1] /tmp/amh % @kbd{make && sudo make install}
- ...
- @end example
- On the second host, however, we need only install the
- architecture-specific files.
- @example
- [HOST2] ~ % @kbd{mkdir /tmp/amh && cd /tmp/amh}
- [HOST2] /tmp/amh % @kbd{/nfs/src/amhello-1.0/configure --prefix /usr}
- ...
- [HOST2] /tmp/amh % @kbd{make && sudo make install-exec}
- ...
- @end example
- In packages that have installation checks, it would make sense to run
- @code{make installcheck} (@pxref{Basic Installation}) to verify that
- the package works correctly despite the apparent partial installation.
- @node Cross-Compilation
- @subsection Cross-Compilation
- @cindex cross-compilation
- To @dfn{cross-compile} is to build on one platform a binary that will
- run on another platform. When speaking of cross-compilation, it is
- important to distinguish between the @dfn{build platform} on which
- the compilation is performed, and the @dfn{host platform} on which the
- resulting executable is expected to run. The following
- @command{configure} options are used to specify each of them:
- @table @option
- @item --build=@var{build}
- @opindex --build=@var{build}
- The system on which the package is built.
- @item --host=@var{host}
- @opindex --host=@var{host}
- The system where built programs and libraries will run.
- @end table
- When the @option{--host} is used, @command{configure} will search for
- the cross-compiling suite for this platform. Cross-compilation tools
- commonly have their target architecture as prefix of their name. For
- instance my cross-compiler for MinGW32 has its binaries called
- @code{i586-mingw32msvc-gcc}, @code{i586-mingw32msvc-ld},
- @code{i586-mingw32msvc-as}, etc.
- @cindex MinGW cross-compilation example
- @cindex cross-compilation example
- Here is how we could build @code{amhello-1.0} for
- @code{i586-mingw32msvc} on a GNU/Linux PC.
- @c Keep in sync with amhello-cross-compile.sh
- @smallexample
- ~/amhello-1.0 % @kbd{./configure --build i686-pc-linux-gnu --host i586-mingw32msvc}
- checking for a BSD-compatible install... /usr/bin/install -c
- checking whether build environment is sane... yes
- checking for gawk... gawk
- checking whether make sets $(MAKE)... yes
- checking for i586-mingw32msvc-strip... i586-mingw32msvc-strip
- checking for i586-mingw32msvc-gcc... i586-mingw32msvc-gcc
- checking for C compiler default output file name... a.exe
- checking whether the C compiler works... yes
- checking whether we are cross compiling... yes
- checking for suffix of executables... .exe
- checking for suffix of object files... o
- checking whether we are using the GNU C compiler... yes
- checking whether i586-mingw32msvc-gcc accepts -g... yes
- checking for i586-mingw32msvc-gcc option to accept ANSI C...
- @dots{}
- ~/amhello-1.0 % @kbd{make}
- @dots{}
- ~/amhello-1.0 % @kbd{cd src; file hello.exe}
- hello.exe: MS Windows PE 32-bit Intel 80386 console executable not relocatable
- @end smallexample
- The @option{--host} and @option{--build} options are usually all we
- need for cross-compiling. The only exception is if the package being
- built is itself a cross-compiler: we need a third option to specify
- its target architecture.
- @table @option
- @item --target=@var{target}
- @opindex --target=@var{target}
- When building compiler tools: the system for which the tools will
- create output.
- @end table
- For instance when installing GCC, the GNU Compiler Collection, we can
- use @option{--target=@/@var{target}} to specify that we want to build
- GCC as a cross-compiler for @var{target}. Mixing @option{--build} and
- @option{--target}, we can actually cross-compile a cross-compiler;
- such a three-way cross-compilation is known as a @dfn{Canadian cross}.
- @xref{Specifying Names, , Specifying the System Type, autoconf, The
- Autoconf Manual}, for more information about these @command{configure}
- options.
- @node Renaming
- @subsection Renaming Programs at Install Time
- @cindex Renaming programs
- @cindex Transforming program names
- @cindex Programs, renaming during installation
- The GNU Build System provides means to automatically rename
- executables and manpages before they are installed (@pxref{Man Pages}).
- This is especially convenient
- when installing a GNU package on a system that already has a
- proprietary implementation you do not want to overwrite. For instance,
- you may want to install GNU @command{tar} as @command{gtar} so you can
- distinguish it from your vendor's @command{tar}.
- This can be done using one of these three @command{configure} options.
- @table @option
- @item --program-prefix=@var{prefix}
- @opindex --program-prefix=@var{prefix}
- Prepend @var{prefix} to installed program names.
- @item --program-suffix=@var{suffix}
- @opindex --program-suffix=@var{suffix}
- Append @var{suffix} to installed program names.
- @item --program-transform-name=@var{program}
- @opindex --program-transform-name=@var{program}
- Run @code{sed @var{program}} on installed program names.
- @end table
- The following commands would install @file{hello}
- as @file{/usr/local/bin/test-hello}, for instance.
- @example
- ~/amhello-1.0 % @kbd{./configure --program-prefix test-}
- @dots{}
- ~/amhello-1.0 % @kbd{make}
- @dots{}
- ~/amhello-1.0 % @kbd{sudo make install}
- @dots{}
- @end example
- @node DESTDIR
- @subsection Building Binary Packages Using DESTDIR
- @vindex DESTDIR
- The GNU Build System's @code{make install} and @code{make uninstall}
- interface does not exactly fit the needs of a system administrator
- who has to deploy and upgrade packages on lots of hosts. In other
- words, the GNU Build System does not replace a package manager.
- Such package managers usually need to know which files have been
- installed by a package, so a mere @code{make install} is
- inappropriate.
- @cindex Staged installation
- The @code{DESTDIR} variable can be used to perform a staged
- installation. The package should be configured as if it was going to
- be installed in its final location (e.g., @code{--prefix /usr}), but
- when running @code{make install}, the @code{DESTDIR} should be set to
- the absolute name of a directory into which the installation will be
- diverted. From this directory it is easy to review which files are
- being installed where, and finally copy them to their final location
- by some means.
- @cindex Binary package
- For instance here is how we could create a binary package containing a
- snapshot of all the files to be installed.
- @c Keep in sync with amhello-binpkg.sh
- @example
- ~/amhello-1.0 % @kbd{./configure --prefix /usr}
- @dots{}
- ~/amhello-1.0 % @kbd{make}
- @dots{}
- ~/amhello-1.0 % @kbd{make DESTDIR=$HOME/inst install}
- @dots{}
- ~/amhello-1.0 % @kbd{cd ~/inst}
- ~/inst % @kbd{find . -type f -print > ../files.lst}
- ~/inst % @kbd{tar zcvf ~/amhello-1.0-i686.tar.gz `cat ../files.lst`}
- ./usr/bin/hello
- ./usr/share/doc/amhello/README
- @end example
- After this example, @code{amhello-1.0-i686.tar.gz} is ready to be
- uncompressed in @file{/} on many hosts. (Using @code{`cat ../files.lst`}
- instead of @samp{.} as argument for @command{tar} avoids entries for
- each subdirectory in the archive: we would not like @command{tar} to
- restore the modification time of @file{/}, @file{/usr/}, etc.)
- Note that when building packages for several architectures, it might
- be convenient to use @code{make install-data} and @code{make
- install-exec} (@pxref{Two-Part Install}) to gather
- architecture-independent files in a single package.
- @xref{Install}, for more information.
- @c We should document PRE_INSTALL/POST_INSTALL/NORMAL_INSTALL and their
- @c UNINSTALL counterparts.
- @node Preparing Distributions
- @subsection Preparing Distributions
- @cindex Preparing distributions
- @cindex Packages, preparation
- @cindex Distributions, preparation
- We have already mentioned @code{make dist}. This target collects all
- your source files and the necessary parts of the build system to
- create a tarball named @file{@var{package}-@var{version}.tar.gz}.
- @cindex @code{distcheck} better than @code{dist}
- Another, more useful command is @code{make distcheck}. The
- @code{distcheck} target constructs
- @file{@var{package}-@var{version}.tar.gz} just as well as @code{dist},
- but it additionally ensures most of the use cases presented so far
- work:
- @itemize @bullet
- @item
- It attempts a full compilation of the package (@pxref{Basic
- Installation}), unpacking the newly constructed tarball, running
- @code{make}, @code{make check}, @code{make install}, as well as
- @code{make installcheck}, and even @code{make dist},
- @item
- it tests VPATH builds with read-only source tree (@pxref{VPATH Builds}),
- @item
- it makes sure @code{make clean}, @code{make distclean}, and @code{make
- uninstall} do not omit any file (@pxref{Standard Targets}),
- @item
- and it checks that @code{DESTDIR} installations work (@pxref{DESTDIR}).
- @end itemize
- All of these actions are performed in a temporary directory, so that no
- root privileges are required. Please note that the exact location and the
- exact structure of such a subdirectory (where the extracted sources are
- placed, how the temporary build and install directories are named and how
- deeply they are nested, etc.) is to be considered an implementation detail,
- which can change at any time; so do not rely on it.
- Releasing a package that fails @code{make distcheck} means that one of
- the scenarios we presented will not work and some users will be
- disappointed. Therefore it is a good practice to release a package
- only after a successful @code{make distcheck}. This of course does
- not imply that the package will be flawless, but at least it will
- prevent some of the embarrassing errors you may find in packages
- released by people who have never heard about @code{distcheck} (like
- @code{DESTDIR} not working because of a typo, or a distributed file
- being erased by @code{make clean}, or even @code{VPATH} builds not
- working).
- @xref{Creating amhello}, to recreate @file{amhello-1.0.tar.gz} using
- @code{make distcheck}. @xref{Checking the Distribution}, for more
- information about @code{distcheck}.
- @node Dependency Tracking
- @subsection Automatic Dependency Tracking
- @cindex Dependency tracking
- Dependency tracking is performed as a side-effect of compilation.
- Each time the build system compiles a source file, it computes its
- list of dependencies (in C these are the header files included by the
- source being compiled). Later, any time @command{make} is run and a
- dependency appears to have changed, the dependent files will be
- rebuilt.
- Automake generates code for automatic dependency tracking by default,
- unless the developer chooses to override it; for more information,
- @pxref{Dependencies}.
- When @command{configure} is executed, you can see it probing each
- compiler for the dependency mechanism it supports (several mechanisms
- can be used):
- @example
- ~/amhello-1.0 % @kbd{./configure --prefix /usr}
- @dots{}
- checking dependency style of gcc... gcc3
- @dots{}
- @end example
- Because dependencies are only computed as a side-effect of the
- compilation, no dependency information exists the first time a package
- is built. This is OK because all the files need to be built anyway:
- @code{make} does not have to decide which files need to be rebuilt.
- In fact, dependency tracking is completely useless for one-time builds
- and there is a @command{configure} option to disable this:
- @table @option
- @item --disable-dependency-tracking
- @opindex --disable-dependency-tracking
- Speed up one-time builds.
- @end table
- Some compilers do not offer any practical way to derive the list of
- dependencies as a side-effect of the compilation, requiring a separate
- run (maybe of another tool) to compute these dependencies. The
- performance penalty implied by these methods is important enough to
- disable them by default. The option @option{--enable-dependency-tracking}
- must be passed to @command{configure} to activate them.
- @table @option
- @item --enable-dependency-tracking
- @opindex --enable-dependency-tracking
- Do not reject slow dependency extractors.
- @end table
- @xref{Dependency Tracking Evolution, , Dependency Tracking Evolution,
- automake-history, Brief History of Automake}, for some discussion about
- the different dependency tracking schemes used by Automake over the years.
- @node Nested Packages
- @subsection Nested Packages
- @cindex Nested packages
- @cindex Packages, nested
- @cindex Subpackages
- Although nesting packages isn't something we would recommend to
- someone who is discovering the Autotools, it is a nice feature worthy
- of mention in this small advertising tour.
- Autoconfiscated packages (that means packages whose build system have
- been created by Autoconf and friends) can be nested to arbitrary
- depth.
- A typical setup is that package A will distribute one of the libraries
- it needs in a subdirectory. This library B is a complete package with
- its own GNU Build System. The @command{configure} script of A will
- run the @command{configure} script of B as part of its execution,
- building and installing A will also build and install B. Generating a
- distribution for A will also include B.
- It is possible to gather several packages like this. GCC is a heavy
- user of this feature. This gives installers a single package to
- configure, build and install, while it allows developers to work on
- subpackages independently.
- When configuring nested packages, the @command{configure} options
- given to the top-level @command{configure} are passed recursively to
- nested @command{configure}s. A package that does not understand an
- option will ignore it, assuming it is meaningful to some other
- package.
- @opindex --help=recursive
- The command @code{configure --help=recursive} can be used to display
- the options supported by all the included packages.
- @xref{Subpackages}, for an example setup.
- @node Why Autotools
- @section How Autotools Help
- @cindex Autotools, purpose
- There are several reasons why you may not want to implement the GNU
- Build System yourself (read: write a @file{configure} script and
- @file{Makefile}s yourself).
- @itemize @bullet
- @item
- As we have seen, the GNU Build System has a lot of
- features (@pxref{Use Cases}).
- Some users may expect features you have not implemented because
- you did not need them.
- @item
- Implementing these features portably is difficult and exhausting.
- Think of writing portable shell scripts, and portable
- @file{Makefile}s, for systems you may not have handy. @xref{Portable
- Shell, , Portable Shell Programming, autoconf, The Autoconf Manual}, to
- convince yourself.
- @item
- You will have to upgrade your setup to follow changes to the GNU
- Coding Standards.
- @end itemize
- The GNU Autotools take all this burden off your back and provide:
- @itemize @bullet
- @item
- Tools to create a portable, complete, and self-contained GNU Build
- System, from simple instructions.
- @emph{Self-contained} meaning the resulting build system does not
- require the GNU Autotools.
- @item
- A central place where fixes and improvements are made:
- a bug-fix for a portability issue will benefit every package.
- @end itemize
- Yet there also exist reasons why you may want NOT to use the
- Autotools@enddots{} For instance you may be already using (or used to)
- another incompatible build system. Autotools will only be useful if
- you do accept the concepts of the GNU Build System. People who have their
- own idea of how a build system should work will feel frustrated by the
- Autotools.
- @node Hello World
- @section A Small Hello World
- @cindex Example Hello World
- @cindex Hello World example
- @cindex @file{amhello-1.0.tar.gz}, creation
- In this section we recreate the @file{amhello-1.0} package from
- scratch. The first subsection shows how to call the Autotools to
- instantiate the GNU Build System, while the second explains the
- meaning of the @file{configure.ac} and @file{Makefile.am} files read
- by the Autotools.
- @anchor{amhello Explained}
- @menu
- * Creating amhello:: Create @file{amhello-1.0.tar.gz} from scratch
- * amhello's configure.ac Setup Explained::
- * amhello's Makefile.am Setup Explained::
- @end menu
- @node Creating amhello
- @subsection Creating @file{amhello-1.0.tar.gz}
- Here is how we can recreate @file{amhello-1.0.tar.gz} from scratch.
- The package is simple enough so that we will only need to write 5
- files. (You may copy them from the final @file{amhello-1.0.tar.gz}
- that is distributed with Automake if you do not want to write them.)
- Create the following files in an empty directory.
- @itemize @bullet
- @item
- @file{src/main.c} is the source file for the @file{hello} program. We
- store it in the @file{src/} subdirectory, because later, when the package
- evolves, it will ease the addition of a @file{man/} directory for man
- pages, a @file{data/} directory for data files, etc.
- @example
- ~/amhello % @kbd{cat src/main.c}
- #include <config.h>
- #include <stdio.h>
- int
- main (void)
- @{
- puts ("Hello World!");
- puts ("This is " PACKAGE_STRING ".");
- return 0;
- @}
- @end example
- @item
- @file{README} contains some very limited documentation for our little
- package.
- @example
- ~/amhello % @kbd{cat README}
- This is a demonstration package for GNU Automake.
- Type 'info Automake' to read the Automake manual.
- @end example
- @item
- @file{Makefile.am} and @file{src/Makefile.am} contain Automake
- instructions for these two directories.
- @example
- ~/amhello % @kbd{cat src/Makefile.am}
- bin_PROGRAMS = hello
- hello_SOURCES = main.c
- ~/amhello % @kbd{cat Makefile.am}
- SUBDIRS = src
- dist_doc_DATA = README
- @end example
- @item
- Finally, @file{configure.ac} contains Autoconf instructions to
- create the @command{configure} script.
- @example
- ~/amhello % @kbd{cat configure.ac}
- AC_INIT([amhello], [1.0], [@value{PACKAGE_BUGREPORT}])
- AM_INIT_AUTOMAKE([-Wall -Werror foreign])
- AC_PROG_CC
- AC_CONFIG_HEADERS([config.h])
- AC_CONFIG_FILES([
- Makefile
- src/Makefile
- ])
- AC_OUTPUT
- @end example
- @end itemize
- @cindex @command{autoreconf}, example
- Once you have these five files, it is time to run the Autotools to
- instantiate the build system. Do this using the @command{autoreconf}
- command as follows:
- @example
- ~/amhello % @kbd{autoreconf --install}
- configure.ac: installing './install-sh'
- configure.ac: installing './missing'
- configure.ac: installing './compile'
- src/Makefile.am: installing './depcomp'
- @end example
- At this point the build system is complete.
- In addition to the three scripts mentioned in its output, you can see
- that @command{autoreconf} created four other files: @file{configure},
- @file{config.h.in}, @file{Makefile.in}, and @file{src/Makefile.in}.
- The latter three files are templates that will be adapted to the
- system by @command{configure} under the names @file{config.h},
- @file{Makefile}, and @file{src/Makefile}. Let's do this:
- @example
- ~/amhello % @kbd{./configure}
- checking for a BSD-compatible install... /usr/bin/install -c
- checking whether build environment is sane... yes
- checking for gawk... no
- checking for mawk... mawk
- checking whether make sets $(MAKE)... yes
- 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 for style of include used by make... GNU
- checking dependency style of gcc... gcc3
- configure: creating ./config.status
- config.status: creating Makefile
- config.status: creating src/Makefile
- config.status: creating config.h
- config.status: executing depfiles commands
- @end example
- @trindex distcheck
- @cindex @code{distcheck} example
- You can see @file{Makefile}, @file{src/Makefile}, and @file{config.h}
- being created at the end after @command{configure} has probed the
- system. It is now possible to run all the targets we wish
- (@pxref{Standard Targets}). For instance:
- @example
- ~/amhello % @kbd{make}
- @dots{}
- ~/amhello % @kbd{src/hello}
- Hello World!
- This is amhello 1.0.
- ~/amhello % @kbd{make distcheck}
- @dots{}
- =============================================
- amhello-1.0 archives ready for distribution:
- amhello-1.0.tar.gz
- =============================================
- @end example
- Note that running @command{autoreconf} is only needed initially when
- the GNU Build System does not exist. When you later change some
- instructions in a @file{Makefile.am} or @file{configure.ac}, the
- relevant part of the build system will be regenerated automatically
- when you execute @command{make}.
- @command{autoreconf} is a script that calls @command{autoconf},
- @command{automake}, and a bunch of other commands in the right order.
- If you are beginning with these tools, it is not important to figure
- out in which order all of these tools should be invoked and why. However,
- because Autoconf and Automake have separate manuals, the important
- point to understand is that @command{autoconf} is in charge of
- creating @file{configure} from @file{configure.ac}, while
- @command{automake} is in charge of creating @file{Makefile.in}s from
- @file{Makefile.am}s and @file{configure.ac}. This should at least
- direct you to the right manual when seeking answers.
- @node amhello's configure.ac Setup Explained
- @subsection @code{amhello}'s @file{configure.ac} Setup Explained
- @cindex @file{configure.ac}, Hello World
- Let us begin with the contents of @file{configure.ac}.
- @example
- AC_INIT([amhello], [1.0], [@value{PACKAGE_BUGREPORT}])
- AM_INIT_AUTOMAKE([-Wall -Werror foreign])
- AC_PROG_CC
- AC_CONFIG_HEADERS([config.h])
- AC_CONFIG_FILES([
- Makefile
- src/Makefile
- ])
- AC_OUTPUT
- @end example
- This file is read by both @command{autoconf} (to create
- @file{configure}) and @command{automake} (to create the various
- @file{Makefile.in}s). It contains a series of M4 macros that will be
- expanded as shell code to finally form the @file{configure} script.
- We will not elaborate on the syntax of this file, because the Autoconf
- manual has a whole section about it (@pxref{Writing Autoconf Input, ,
- Writing @file{configure.ac}, autoconf, The Autoconf Manual}).
- The macros prefixed with @code{AC_} are Autoconf macros, documented
- in the Autoconf manual (@pxref{Autoconf Macro Index, , Autoconf Macro
- Index, autoconf, The Autoconf Manual}). The macros that start with
- @code{AM_} are Automake macros, documented later in this manual
- (@pxref{Macro Index}).
- The first two lines of @file{configure.ac} initialize Autoconf and
- Automake. @code{AC_INIT} takes in as parameters the name of the package,
- its version number, and a contact address for bug-reports about the
- package (this address is output at the end of @code{./configure
- --help}, for instance). When adapting this setup to your own package,
- by all means please do not blindly copy Automake's address: use the
- mailing list of your package, or your own mail address.
- @opindex -Wall
- @opindex -Werror
- @opindex foreign
- The argument to @code{AM_INIT_AUTOMAKE} is a list of options for
- @command{automake} (@pxref{Options}). @option{-Wall} and
- @option{-Werror} ask @command{automake} to turn on all warnings and
- report them as errors. We are speaking of @strong{Automake} warnings
- here, such as dubious instructions in @file{Makefile.am}. This has
- absolutely nothing to do with how the compiler will be called, even
- though it may support options with similar names. Using @option{-Wall
- -Werror} is a safe setting when starting to work on a package: you do
- not want to miss any issues. Later you may decide to relax things a
- bit. The @option{foreign} option tells Automake that this package
- will not follow the GNU Standards. GNU packages should always
- distribute additional files such as @file{ChangeLog}, @file{AUTHORS},
- etc. We do not want @command{automake} to complain about these
- missing files in our small example.
- The @code{AC_PROG_CC} line causes the @command{configure} script to
- search for a C compiler and define the variable @code{CC} with its
- name. The @file{src/Makefile.in} file generated by Automake uses the
- variable @code{CC} to build @file{hello}, so when @command{configure}
- creates @file{src/Makefile} from @file{src/Makefile.in}, it will define
- @code{CC} with the value it has found. If Automake is asked to create
- a @file{Makefile.in} that uses @code{CC} but @file{configure.ac} does
- not define it, it will suggest you add a call to @code{AC_PROG_CC}.
- The @code{AC_CONFIG_HEADERS([config.h])} invocation causes the
- @command{configure} script to create a @file{config.h} file gathering
- @samp{#define}s defined by other macros in @file{configure.ac}. In our
- case, the @code{AC_INIT} macro already defined a few of them. Here
- is an excerpt of @file{config.h} after @command{configure} has run:
- @smallexample
- @dots{}
- /* Define to the address where bug reports for this package should be sent. */
- #define PACKAGE_BUGREPORT "@value{PACKAGE_BUGREPORT}"
- /* Define to the full name and version of this package. */
- #define PACKAGE_STRING "amhello 1.0"
- @dots{}
- @end smallexample
- As you probably noticed, @file{src/main.c} includes @file{config.h} so
- it can use @code{PACKAGE_STRING}. In a real-world project,
- @file{config.h} can grow really big, with one @samp{#define} per
- feature probed on the system.
- The @code{AC_CONFIG_FILES} macro declares the list of files that
- @command{configure} should create from their @file{*.in} templates.
- Automake also scans this list to find the @file{Makefile.am} files it must
- process. (This is important to remember: when adding a new directory
- to your project, you should add its @file{Makefile} to this list,
- otherwise Automake will never process the new @file{Makefile.am} you
- wrote in that directory.)
- Finally, the @code{AC_OUTPUT} line is a closing command that actually
- produces the part of the script in charge of creating the files
- registered with @code{AC_CONFIG_HEADERS} and @code{AC_CONFIG_FILES}.
- @cindex @command{autoscan}
- When starting a new project, we suggest you start with such a simple
- @file{configure.ac}, and gradually add the other tests it requires.
- The command @command{autoscan} can also suggest a few of the tests
- your package may need (@pxref{autoscan Invocation, , Using
- @command{autoscan} to Create @file{configure.ac}, autoconf, The
- Autoconf Manual}).
- @node amhello's Makefile.am Setup Explained
- @subsection @code{amhello}'s @file{Makefile.am} Setup Explained
- @cindex @file{Makefile.am}, Hello World
- We now turn to @file{src/Makefile.am}. This file contains
- Automake instructions to build and install @file{hello}.
- @example
- bin_PROGRAMS = hello
- hello_SOURCES = main.c
- @end example
- A @file{Makefile.am} has the same syntax as an ordinary
- @file{Makefile}. When @command{automake} processes a
- @file{Makefile.am} it copies the entire file into the output
- @file{Makefile.in} (that will be later turned into @file{Makefile} by
- @command{configure}) but will react to certain variable definitions
- by generating some build rules and other variables.
- Often @file{Makefile.am}s contain only a list of variable definitions as
- above, but they can also contain other variable and rule definitions that
- @command{automake} will pass along without interpretation.
- Variables that end with @code{_PROGRAMS} are special variables
- that list programs that the resulting @file{Makefile} should build.
- In Automake speak, this @code{_PROGRAMS} suffix is called a
- @dfn{primary}; Automake recognizes other primaries such as
- @code{_SCRIPTS}, @code{_DATA}, @code{_LIBRARIES}, etc.@: corresponding
- to different types of files.
- The @samp{bin} part of the @code{bin_PROGRAMS} tells
- @command{automake} that the resulting programs should be installed in
- @var{bindir}. Recall that the GNU Build System uses a set of variables
- to denote destination directories and allow users to customize these
- locations (@pxref{Standard Directory Variables}). Any such directory
- variable can be put in front of a primary (omitting the @code{dir}
- suffix) to tell @command{automake} where to install the listed files.
- Programs need to be built from source files, so for each program
- @code{@var{prog}} listed in a @code{@w{_PROGRAMS}} variable,
- @command{automake} will look for another variable named
- @code{@var{prog}_SOURCES} listing its source files. There may be more
- than one source file: they will all be compiled and linked together.
- Automake also knows that source files need to be distributed when
- creating a tarball (unlike built programs). So a side-effect of this
- @code{hello_SOURCES} declaration is that @file{main.c} will be
- part of the tarball created by @code{make dist}.
- Finally here are some explanations regarding the top-level
- @file{Makefile.am}.
- @example
- SUBDIRS = src
- dist_doc_DATA = README
- @end example
- @code{SUBDIRS} is a special variable listing all directories that
- @command{make} should recurse into before processing the current
- directory. So this line is responsible for @command{make} building
- @file{src/hello} even though we run it from the top-level. This line
- also causes @code{make install} to install @file{src/hello} before
- installing @file{README} (not that this order matters).
- The line @code{dist_doc_DATA = README} causes @file{README} to be
- distributed and installed in @var{docdir}. Files listed with the
- @code{_DATA} primary are not automatically part of the tarball built
- with @code{make dist}, so we add the @code{dist_} prefix so they get
- distributed. However, for @file{README} it would not have been
- necessary: @command{automake} automatically distributes any
- @file{README} file it encounters (the list of other files
- automatically distributed is presented by @code{automake --help}).
- The only important effect of this second line is therefore to install
- @file{README} during @code{make install}.
- One thing not covered in this example is accessing the installation
- directory values (@pxref{Standard Directory Variables}) from your
- program code, that is, converting them into defined macros. For this,
- @pxref{Defining Directories,,, autoconf, The Autoconf Manual}.
- @node Generalities
- @chapter General ideas
- The following sections cover a few basic ideas that will help you
- understand how Automake works.
- @menu
- * General Operation:: General operation of Automake
- * Strictness:: Standards conformance checking
- * Uniform:: The Uniform Naming Scheme
- * Length Limitations:: Staying below the command line length limit
- * Canonicalization:: How derived variables are named
- * User Variables:: Variables reserved for the user
- * Auxiliary Programs:: Programs automake might require
- @end menu
- @node General Operation
- @section General Operation
- Automake works by reading a @file{Makefile.am} and generating a
- @file{Makefile.in}. Certain variables and rules defined in the
- @file{Makefile.am} instruct Automake to generate more specialized code;
- for instance, a @code{bin_PROGRAMS} variable definition will cause rules
- for compiling and linking programs to be generated.
- @cindex Non-standard targets
- @cindex @code{git-dist}, non-standard example
- @trindex git-dist
- The variable definitions and rules in the @file{Makefile.am} are
- copied mostly verbatim into the generated file, with all variable
- definitions preceding all rules. This allows you to add almost
- arbitrary code into the generated @file{Makefile.in}. For instance,
- the Automake distribution includes a non-standard rule for the
- @code{git-dist} target, which the Automake maintainer uses to make
- distributions from the source control system.
- @cindex GNU make extensions
- Note that most GNU make extensions are not recognized by Automake. Using
- such extensions in a @file{Makefile.am} will lead to errors or confusing
- behavior.
- @cindex Append operator
- @cmindex +=
- A special exception is that the GNU make append operator, @samp{+=}, is
- supported. This operator appends its right hand argument to the variable
- specified on the left. Automake will translate the operator into
- an ordinary @samp{=} operator; @samp{+=} will thus work with any make program.
- Automake tries to keep comments grouped with any adjoining rules or
- variable definitions.
- @cindex Limitations of automake parser
- @cindex Automake parser, limitations of
- @cindex indentation in Makefile.am
- Generally, Automake is not particularly smart in the parsing of unusual
- Makefile constructs, so you're advised to avoid fancy constructs or
- ``creative'' use of whitespace.
- @c Keep this in sync with doc-parsing-buglets-tabs.sh
- For example, @key{TAB} characters cannot be used between a target name
- and the following ``@code{:}'' character, and variable assignments
- shouldn't be indented with @key{TAB} characters.
- @c Keep this in sync with doc-parsing-buglets-colneq-subst.sh
- Also, using more complex macro in target names can cause trouble:
- @example
- % @kbd{cat Makefile.am}
- $(FOO:=x): bar
- % @kbd{automake}
- Makefile.am:1: bad characters in variable name '$(FOO'
- Makefile.am:1: ':='-style assignments are not portable
- @end example
- @cindex Make targets, overriding
- @cindex Make rules, overriding
- @cindex Overriding make rules
- @cindex Overriding make targets
- A rule defined in @file{Makefile.am} generally overrides any such
- rule of a similar name that would be automatically generated by
- @command{automake}. Although this is a supported feature, it is generally
- best to avoid making use of it, as sometimes the generated rules are
- very particular.
- @cindex Variables, overriding
- @cindex Overriding make variables
- Similarly, a variable defined in @file{Makefile.am} or
- @code{AC_SUBST}ed from @file{configure.ac} will override any
- definition of the variable that @command{automake} would ordinarily
- create. This feature is more often useful than the ability to
- override a rule. Be warned that many of the variables generated by
- @command{automake} are considered to be for internal use only, and their
- names might change in future releases.
- @cindex Recursive operation of Automake
- @cindex Automake, recursive operation
- @cindex Example of recursive operation
- When examining a variable definition, Automake will recursively examine
- variables referenced in the definition. For example, if Automake is
- looking at the content of @code{foo_SOURCES} in this snippet
- @c Keep in sync with interp.sh
- @example
- xs = a.c b.c
- foo_SOURCES = c.c $(xs)
- @end example
- it would use the files @file{a.c}, @file{b.c}, and @file{c.c} as the
- contents of @code{foo_SOURCES}.
- @cindex @code{##} (special Automake comment)
- @cindex Special Automake comment
- @cindex Comment, special to Automake
- Automake also allows a form of comment that is @emph{not} copied into
- the output; all lines beginning with @samp{##} (leading spaces allowed)
- are completely ignored by Automake.
- It is customary to make the first line of @file{Makefile.am} read:
- @cindex Makefile.am, first line
- @cindex First line of Makefile.am
- @example
- ## Process this file with automake to produce Makefile.in
- @end example
- @c FIXME document customary ordering of Makefile.am here!
- @node Strictness
- @section Strictness
- @cindex Non-GNU packages
- While Automake is intended to be used by maintainers of GNU packages, it
- does make some effort to accommodate those who wish to use it, but do
- not want to use all the GNU conventions.
- @cindex Strictness, defined
- @cindex Strictness, @option{foreign}
- @cindex @option{foreign} strictness
- @cindex Strictness, @option{gnu}
- @cindex @option{gnu} strictness
- @cindex Strictness, @option{gnits}
- @cindex @option{gnits} strictness
- To this end, Automake supports three levels of @dfn{strictness}---the
- strictness indicating how stringently Automake should check standards
- conformance.
- The valid strictness levels are:
- @table @option
- @item foreign
- Automake will check for only those things that are absolutely
- required for proper operations. For instance, whereas GNU standards
- dictate the existence of a @file{NEWS} file, it will not be required in
- this mode. This strictness will also turn off some warnings by default
- (among them, portability warnings).
- The name comes from the fact that Automake is intended to be
- used for GNU programs; these relaxed rules are not the standard mode of
- operation.
- @item gnu
- Automake will check---as much as possible---for compliance to the GNU
- standards for packages. This is the default.
- @item gnits
- Automake will check for compliance to the as-yet-unwritten @dfn{Gnits
- standards}. These are based on the GNU standards, but are even more
- detailed. Unless you are a Gnits standards contributor, it is
- recommended that you avoid this option until such time as the Gnits
- standard is actually published (which may never happen).
- @end table
- @xref{Gnits}, for more information on the precise implications of the
- strictness level.
- @node Uniform
- @section The Uniform Naming Scheme
- @cindex Uniform naming scheme
- Automake variables generally follow a @dfn{uniform naming scheme} that
- makes it easy to decide how programs (and other derived objects) are
- built, and how they are installed. This scheme also supports
- @command{configure} time determination of what should be built.
- @cindex @code{_PROGRAMS} primary variable
- @cindex @code{PROGRAMS} primary variable
- @cindex Primary variable, @code{PROGRAMS}
- @cindex Primary variable, defined
- @vindex _PROGRAMS
- At @command{make} time, certain variables are used to determine which
- objects are to be built. The variable names are made of several pieces
- that are concatenated together.
- The piece that tells @command{automake} what is being built is commonly called
- the @dfn{primary}. For instance, the primary @code{PROGRAMS} holds a
- list of programs that are to be compiled and linked.
- @vindex PROGRAMS
- @cindex @code{pkgdatadir}, defined
- @cindex @code{pkgincludedir}, defined
- @cindex @code{pkglibdir}, defined
- @cindex @code{pkglibexecdir}, defined
- @vindex pkgdatadir
- @vindex pkgincludedir
- @vindex pkglibdir
- @vindex pkglibexecdir
- @cindex @code{PACKAGE}, directory
- A different set of names is used to decide where the built objects
- should be installed. These names are prefixes to the primary, and they
- indicate which standard directory should be used as the installation
- directory. The standard directory names are given in the GNU standards
- (@pxref{Directory Variables, , , standards, The GNU Coding Standards}).
- Automake extends this list with @code{pkgdatadir}, @code{pkgincludedir},
- @code{pkglibdir}, and @code{pkglibexecdir}; these are the same as the
- non-@samp{pkg} versions, but with @samp{$(PACKAGE)} appended. For instance,
- @code{pkglibdir} is defined as @samp{$(libdir)/$(PACKAGE)}.
- @cindex @code{EXTRA_}, prepending
- For each primary, there is one additional variable named by prepending
- @samp{EXTRA_} to the primary name. This variable is used to list
- objects that may or may not be built, depending on what
- @command{configure} decides. This variable is required because Automake
- must statically know the entire list of objects that may be built in
- order to generate a @file{Makefile.in} that will work in all cases.
- @cindex @code{EXTRA_PROGRAMS}, defined
- @cindex Example, @code{EXTRA_PROGRAMS}
- @cindex @command{cpio} example
- For instance, @command{cpio} decides at configure time which programs
- should be built. Some of the programs are installed in @code{bindir},
- and some are installed in @code{sbindir}:
- @example
- EXTRA_PROGRAMS = mt rmt
- bin_PROGRAMS = cpio pax
- sbin_PROGRAMS = $(MORE_PROGRAMS)
- @end example
- Defining a primary without a prefix as a variable, e.g.,
- @samp{PROGRAMS}, is an error.
- Note that the common @samp{dir} suffix is left off when constructing the
- variable names; thus one writes @samp{bin_PROGRAMS} and not
- @samp{bindir_PROGRAMS}.
- Not every sort of object can be installed in every directory. Automake
- will flag those attempts it finds in error (but see below how to override
- the check if you really need to).
- Automake will also diagnose obvious misspellings in directory names.
- @cindex Extending list of installation directories
- @cindex Installation directories, extending list
- Sometimes the standard directories---even as augmented by
- Automake---are not enough. In particular it is sometimes useful, for
- clarity, to install objects in a subdirectory of some predefined
- directory. To this end, Automake allows you to extend the list of
- possible installation directories. A given prefix (e.g., @samp{zar})
- is valid if a variable of the same name with @samp{dir} appended is
- defined (e.g., @samp{zardir}).
- For instance, the following snippet will install @file{file.xml} into
- @samp{$(datadir)/xml}.
- @c Keep in sync with primary-prefix-couples-documented-valid.sh
- @example
- xmldir = $(datadir)/xml
- xml_DATA = file.xml
- @end example
- This feature can also be used to override the sanity checks Automake
- performs to diagnose suspicious directory/primary couples (in the
- unlikely case these checks are undesirable, and you really know what
- you're doing). For example, Automake would error out on this input:
- @c Should be tested in primary-prefix-invalid-couples.sh
- @example
- # Forbidden directory combinations, automake will error out on this.
- pkglib_PROGRAMS = foo
- doc_LIBRARIES = libquux.a
- @end example
- @noindent
- but it will succeed with this:
- @c Keep in sync with primary-prefix-couples-documented-valid.sh
- @example
- # Work around forbidden directory combinations. Do not use this
- # without a very good reason!
- my_execbindir = $(pkglibdir)
- my_doclibdir = $(docdir)
- my_execbin_PROGRAMS = foo
- my_doclib_LIBRARIES = libquux.a
- @end example
- The @samp{exec} substring of the @samp{my_execbindir} variable lets
- the files be installed at the right time (@pxref{The Two Parts of
- Install}).
- @cindex @samp{noinst_} primary prefix, definition
- @vindex noinst_
- The special prefix @samp{noinst_} indicates that the objects in question
- should be built but not installed at all. This is usually used for
- objects required to build the rest of your package, for instance static
- libraries (@pxref{A Library}), or helper scripts.
- @cindex @samp{check_} primary prefix, definition
- @vindex check_
- The special prefix @samp{check_} indicates that the objects in question
- should not be built until the @samp{make check} command is run. Those
- objects are not installed either.
- The current primary names are @samp{PROGRAMS}, @samp{LIBRARIES},
- @samp{LTLIBRARIES}, @samp{LISP}, @samp{PYTHON}, @samp{JAVA},
- @samp{SCRIPTS}, @samp{DATA}, @samp{HEADERS}, @samp{MANS}, and
- @samp{TEXINFOS}.
- @vindex PROGRAMS
- @vindex LIBRARIES
- @vindex LTLIBRARIES
- @vindex LISP
- @vindex PYTHON
- @vindex JAVA
- @vindex SCRIPTS
- @vindex DATA
- @vindex HEADERS
- @vindex MANS
- @vindex TEXINFOS
- Some primaries also allow additional prefixes that control other
- aspects of @command{automake}'s behavior. The currently defined prefixes
- are @samp{dist_}, @samp{nodist_}, @samp{nobase_}, and @samp{notrans_}.
- These prefixes are explained later (@pxref{Program and Library Variables})
- (@pxref{Man Pages}).
- @node Length Limitations
- @section Staying below the command line length limit
- @cindex command line length limit
- @cindex ARG_MAX
- Traditionally, most unix-like systems have a length limitation for the
- command line arguments and environment contents when creating new
- processes (see for example
- @uref{http://www.in-ulm.de/@/~mascheck/@/various/@/argmax/} for an
- overview on this issue),
- which of course also applies to commands spawned by @command{make}.
- POSIX requires this limit to be at least 4096 bytes, and most modern
- systems have quite high limits (or are unlimited).
- In order to create portable Makefiles that do not trip over these
- limits, it is necessary to keep the length of file lists bounded.
- Unfortunately, it is not possible to do so fully transparently within
- Automake, so your help may be needed. Typically, you can split long
- file lists manually and use different installation directory names for
- each list. For example,
- @example
- data_DATA = file1 @dots{} file@var{N} file@var{N+1} @dots{} file@var{2N}
- @end example
- @noindent
- may also be written as
- @c Keep in sync with primary-prefix-couples-documented-valid.sh
- @example
- data_DATA = file1 @dots{} file@var{N}
- data2dir = $(datadir)
- data2_DATA = file@var{N+1} @dots{} file@var{2N}
- @end example
- @noindent
- and will cause Automake to treat the two lists separately during
- @code{make install}. See @ref{The Two Parts of Install} for choosing
- directory names that will keep the ordering of the two parts of
- installation Note that @code{make dist} may still only work on a host
- with a higher length limit in this example.
- Automake itself employs a couple of strategies to avoid long command
- lines. For example, when @samp{$@{srcdir@}/} is prepended to file
- names, as can happen with above @code{$(data_DATA)} lists, it limits
- the amount of arguments passed to external commands.
- Unfortunately, some system's @command{make} commands may prepend
- @code{VPATH} prefixes like @samp{$@{srcdir@}/} to file names from the
- source tree automatically (@pxref{Automatic Rule Rewriting, , Automatic
- Rule Rewriting, autoconf, The Autoconf Manual}). In this case, the user
- may have to switch to use GNU Make, or refrain from using VPATH builds,
- in order to stay below the length limit.
- For libraries and programs built from many sources, convenience archives
- may be used as intermediates in order to limit the object list length
- (@pxref{Libtool Convenience Libraries}).
- @node Canonicalization
- @section How derived variables are named
- @cindex canonicalizing Automake variables
- Sometimes a Makefile variable name is derived from some text the
- maintainer supplies. For instance, a program name listed in
- @samp{_PROGRAMS} is rewritten into the name of a @samp{_SOURCES}
- variable. In cases like this, Automake canonicalizes the text, so that
- program names and the like do not have to follow Makefile variable naming
- rules. All characters in the name except for letters, numbers, the
- strudel (@@), and the underscore are turned into underscores when making
- variable references.
- For example, if your program is named @file{sniff-glue}, the derived
- variable name would be @samp{sniff_glue_SOURCES}, not
- @samp{sniff-glue_SOURCES}. Similarly the sources for a library named
- @file{libmumble++.a} should be listed in the
- @samp{libmumble___a_SOURCES} variable.
- The strudel is an addition, to make the use of Autoconf substitutions in
- variable names less obfuscating.
- @node User Variables
- @section Variables reserved for the user
- @cindex variables, reserved for the user
- @cindex user variables
- Some @file{Makefile} variables are reserved by the GNU Coding Standards
- for the use of the ``user''---the person building the package. For
- instance, @code{CFLAGS} is one such variable.
- Sometimes package developers are tempted to set user variables such as
- @code{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.
- To get around this problem, Automake introduces an automake-specific
- shadow variable for each user flag variable. (Shadow variables are
- not introduced for variables like @code{CC}, where they would make no
- sense.) The shadow variable is named by prepending @samp{AM_} to the
- user variable's name. For instance, the shadow variable for
- @code{YFLAGS} is @code{AM_YFLAGS}. The package maintainer---that is,
- the author(s) of the @file{Makefile.am} and @file{configure.ac}
- files---may adjust these shadow variables however necessary.
- @xref{Flag Variables Ordering}, for more discussion about these
- variables and how they interact with per-target variables.
- @node Auxiliary Programs
- @section Programs automake might require
- @cindex Programs, auxiliary
- @cindex Auxiliary programs
- Automake sometimes requires helper programs so that the generated
- @file{Makefile} can do its work properly. There are a fairly large
- number of them, and we list them here.
- Although all of these files are distributed and installed with
- Automake, a couple of them are maintained separately. The Automake
- copies are updated before each release, but we mention the original
- source in case you need more recent versions.
- @table @code
- @item ar-lib
- This is a wrapper primarily for the Microsoft lib archiver, to make
- it more POSIX-like.
- @item compile
- This is a wrapper for compilers that do not accept options @option{-c}
- and @option{-o} at the same time. It is only used when absolutely
- required. Such compilers are rare, with the Microsoft C/C++ Compiler
- as the most notable exception. This wrapper also makes the following
- common options available for that compiler, while performing file name
- translation where needed: @option{-I}, @option{-L}, @option{-l},
- @option{-Wl,} and @option{-Xlinker}.
- @item config.guess
- @itemx config.sub
- These two programs compute the canonical triplets for the given build,
- host, or target architecture. These programs are updated regularly to
- support new architectures and fix probes broken by changes in new
- kernel versions. Each new release of Automake comes with up-to-date
- copies of these programs. If your copy of Automake is getting old,
- you are encouraged to fetch the latest versions of these files from
- @url{http://savannah.gnu.org/git/?group=config} before making a
- release.
- @item depcomp
- This program understands how to run a compiler so that it will
- generate not only the desired output but also dependency information
- that is then used by the automatic dependency tracking feature
- (@pxref{Dependencies}).
- @item install-sh
- This is a replacement for the @command{install} program that works on
- platforms where @command{install} is unavailable or unusable.
- @item mdate-sh
- This script is used to generate a @file{version.texi} file. It examines
- a file and prints some date information about it.
- @item missing
- This wraps a number of programs that are typically only required by
- maintainers. If the program in question doesn't exist, or seems to old,
- @command{missing} will print an informative warning before failing out,
- to provide the user with more context and information.
- @item mkinstalldirs
- This script used to be a wrapper around @samp{mkdir -p}, which is not
- portable. Now we prefer to use @samp{install-sh -d} when @command{configure}
- finds that @samp{mkdir -p} does not work, this makes one less script to
- distribute.
- For backward compatibility @file{mkinstalldirs} is still used and
- distributed when @command{automake} finds it in a package. But it is no
- longer installed automatically, and it should be safe to remove it.
- @item py-compile
- This is used to byte-compile Python scripts.
- @item test-driver
- This implements the default test driver offered by the parallel
- testsuite harness.
- @item texinfo.tex
- Not a program, this file is required for @samp{make dvi}, @samp{make
- ps} and @samp{make pdf} to work when Texinfo sources are in the
- package. The latest version can be downloaded from
- @url{http://www.gnu.org/software/texinfo/}.
- @item ylwrap
- This program wraps @command{lex} and @command{yacc} to rename their
- output files. It also ensures that, for instance, multiple
- @command{yacc} instances can be invoked in a single directory in
- parallel.
- @end table
- @node Examples
- @chapter Some example packages
- This section contains two small examples.
- The first example (@pxref{Complete}) assumes you have an existing
- project already using Autoconf, with handcrafted @file{Makefile}s, and
- that you want to convert it to using Automake. If you are discovering
- both tools, it is probably better that you look at the Hello World
- example presented earlier (@pxref{Hello World}).
- The second example (@pxref{true}) shows how two programs can be built
- from the same file, using different compilation parameters. It
- contains some technical digressions that are probably best skipped on
- first read.
- @menu
- * Complete:: A simple example, start to finish
- * true:: Building true and false
- @end menu
- @node Complete
- @section A simple example, start to finish
- @cindex Complete example
- Let's suppose you just finished writing @code{zardoz}, a program to make
- your head float from vortex to vortex. You've been using Autoconf to
- provide a portability framework, but your @file{Makefile.in}s have been
- ad-hoc. You want to make them bulletproof, so you turn to Automake.
- @cindex @code{AM_INIT_AUTOMAKE}, example use
- The first step is to update your @file{configure.ac} to include the
- commands that @command{automake} needs. The way to do this is to add an
- @code{AM_INIT_AUTOMAKE} call just after @code{AC_INIT}:
- @example
- AC_INIT([zardoz], [1.0])
- AM_INIT_AUTOMAKE
- @dots{}
- @end example
- Since your program doesn't have any complicating factors (e.g., it
- doesn't use @code{gettext}, it doesn't want to build a shared library),
- you're done with this part. That was easy!
- @cindex @command{aclocal} program, introduction
- @cindex @file{aclocal.m4}, preexisting
- @cindex @file{acinclude.m4}, defined
- Now you must regenerate @file{configure}. But to do that, you'll need
- to tell @command{autoconf} how to find the new macro you've used. The
- easiest way to do this is to use the @command{aclocal} program to
- generate your @file{aclocal.m4} for you. But wait@dots{} maybe you
- already have an @file{aclocal.m4}, because you had to write some hairy
- macros for your program. The @command{aclocal} program lets you put
- your own macros into @file{acinclude.m4}, so simply rename and then
- run:
- @example
- mv aclocal.m4 acinclude.m4
- aclocal
- autoconf
- @end example
- @cindex @command{zardoz} example
- Now it is time to write your @file{Makefile.am} for @code{zardoz}.
- Since @code{zardoz} is a user program, you want to install it where the
- rest of the user programs go: @code{bindir}. Additionally,
- @code{zardoz} has some Texinfo documentation. Your @file{configure.ac}
- script uses @code{AC_REPLACE_FUNCS}, so you need to link against
- @samp{$(LIBOBJS)}. So here's what you'd write:
- @example
- bin_PROGRAMS = zardoz
- zardoz_SOURCES = main.c head.c float.c vortex9.c gun.c
- zardoz_LDADD = $(LIBOBJS)
- info_TEXINFOS = zardoz.texi
- @end example
- Now you can run @samp{automake --add-missing} to generate your
- @file{Makefile.in} and grab any auxiliary files you might need, and
- you're done!
- @node true
- @section Building true and false
- @cindex Example, @command{false} and @command{true}
- @cindex @command{false} Example
- @cindex @command{true} Example
- Here is another, trickier example. It shows how to generate two
- programs (@code{true} and @code{false}) from the same source file
- (@file{true.c}). The difficult part is that each compilation of
- @file{true.c} requires different @code{cpp} flags.
- @example
- bin_PROGRAMS = true false
- false_SOURCES =
- false_LDADD = false.o
- true.o: true.c
- $(COMPILE) -DEXIT_CODE=0 -c true.c
- false.o: true.c
- $(COMPILE) -DEXIT_CODE=1 -o false.o -c true.c
- @end example
- Note that there is no @code{true_SOURCES} definition. Automake will
- implicitly assume that there is a source file named @file{true.c}
- (@pxref{Default _SOURCES}), and
- define rules to compile @file{true.o} and link @file{true}. The
- @samp{true.o: true.c} rule supplied by the above @file{Makefile.am},
- will override the Automake generated rule to build @file{true.o}.
- @code{false_SOURCES} is defined to be empty---that way no implicit value
- is substituted. Because we have not listed the source of
- @file{false}, we have to tell Automake how to link the program. This is
- the purpose of the @code{false_LDADD} line. A @code{false_DEPENDENCIES}
- variable, holding the dependencies of the @file{false} target will be
- automatically generated by Automake from the content of
- @code{false_LDADD}.
- The above rules won't work if your compiler doesn't accept both
- @option{-c} and @option{-o}. The simplest fix for this is to introduce a
- bogus dependency (to avoid problems with a parallel @command{make}):
- @example
- true.o: true.c false.o
- $(COMPILE) -DEXIT_CODE=0 -c true.c
- false.o: true.c
- $(COMPILE) -DEXIT_CODE=1 -c true.c && mv true.o false.o
- @end example
- As it turns out, there is also a much easier way to do this same task.
- Some of the above technique is useful enough that we've kept the
- example in the manual. However if you were to build @code{true} and
- @code{false} in real life, you would probably use per-program
- compilation flags, like so:
- @c Keep in sync with specflg7.sh and specflg8.sh
- @example
- bin_PROGRAMS = false true
- false_SOURCES = true.c
- false_CPPFLAGS = -DEXIT_CODE=1
- true_SOURCES = true.c
- true_CPPFLAGS = -DEXIT_CODE=0
- @end example
- In this case Automake will cause @file{true.c} to be compiled twice,
- with different flags. In this instance, the names of the object files
- would be chosen by automake; they would be @file{false-true.o} and
- @file{true-true.o}. (The name of the object files rarely matters.)
- @node automake Invocation
- @chapter Creating a @file{Makefile.in}
- @c This node used to be named "Invoking automake". This @anchor
- @c allows old links to still work.
- @anchor{Invoking automake}
- @cindex Multiple @file{configure.ac} files
- @cindex Invoking @command{automake}
- @cindex @command{automake}, invoking
- @cindex Invocation of @command{automake}
- @cindex @command{automake}, invocation
- To create all the @file{Makefile.in}s for a package, run the
- @command{automake} program in the top level directory, with no
- arguments. @command{automake} will automatically find each
- appropriate @file{Makefile.am} (by scanning @file{configure.ac};
- @pxref{configure}) and generate the corresponding @file{Makefile.in}.
- Note that @command{automake} has a rather simplistic view of what
- constitutes a package; it assumes that a package has only one
- @file{configure.ac}, at the top. If your package has multiple
- @file{configure.ac}s, then you must run @command{automake} in each
- directory holding a @file{configure.ac}. (Alternatively, you may rely
- on Autoconf's @command{autoreconf}, which is able to recurse your
- package tree and run @command{automake} where appropriate.)
- You can optionally give @command{automake} an argument; @file{.am} is
- appended to the argument and the result is used as the name of the
- input file. This feature is generally only used to automatically
- rebuild an out-of-date @file{Makefile.in}. Note that
- @command{automake} must always be run from the topmost directory of a
- project, even if being used to regenerate the @file{Makefile.in} in
- some subdirectory. This is necessary because @command{automake} must
- scan @file{configure.ac}, and because @command{automake} uses the
- knowledge that a @file{Makefile.in} is in a subdirectory to change its
- behavior in some cases.
- @vindex AUTOCONF
- Automake will run @command{autoconf} to scan @file{configure.ac} and
- its dependencies (i.e., @file{aclocal.m4} and any included file),
- therefore @command{autoconf} must be in your @env{PATH}. If there is
- an @env{AUTOCONF} variable in your environment it will be used
- instead of @command{autoconf}, this allows you to select a particular
- version of Autoconf. By the way, don't misunderstand this paragraph:
- @command{automake} runs @command{autoconf} to @strong{scan} your
- @file{configure.ac}, this won't build @file{configure} and you still
- have to run @command{autoconf} yourself for this purpose.
- @cindex @command{automake} options
- @cindex Options, @command{automake}
- @cindex Strictness, command line
- @command{automake} accepts the following options:
- @cindex Extra files distributed with Automake
- @cindex Files distributed with Automake
- @cindex @file{config.guess}
- @table @code
- @item -a
- @itemx --add-missing
- @opindex -a
- @opindex --add-missing
- Automake requires certain common files to exist in certain situations;
- for instance, @file{config.guess} is required if @file{configure.ac} invokes
- @code{AC_CANONICAL_HOST}. Automake is distributed with several of these
- files (@pxref{Auxiliary Programs}); this option will cause the missing
- ones to be automatically added to the package, whenever possible. In
- general if Automake tells you a file is missing, try using this option.
- By default Automake tries to make a symbolic link pointing to its own
- copy of the missing file; this can be changed with @option{--copy}.
- Many of the potentially-missing files are common scripts whose
- location may be specified via the @code{AC_CONFIG_AUX_DIR} macro.
- Therefore, @code{AC_CONFIG_AUX_DIR}'s setting affects whether a
- file is considered missing, and where the missing file is added
- (@pxref{Optional}).
- In some strictness modes, additional files are installed, see @ref{Gnits}
- for more information.
- @item --libdir=@var{dir}
- @opindex --libdir
- Look for Automake data files in directory @var{dir} instead of in the
- installation directory. This is typically used for debugging.
- @item --print-libdir
- @opindex --print-libdir
- Print the path of the installation directory containing Automake-provided
- scripts and data files (like e.g., @file{texinfo.texi} and
- @file{install-sh}).
- @item -c
- @opindex -c
- @itemx --copy
- @opindex --copy
- When used with @option{--add-missing}, causes installed files to be
- copied. The default is to make a symbolic link.
- @item -f
- @opindex -f
- @itemx --force-missing
- @opindex --force-missing
- When used with @option{--add-missing}, causes standard files to be reinstalled
- even if they already exist in the source tree. This involves removing
- the file from the source tree before creating the new symlink (or, with
- @option{--copy}, copying the new file).
- @item --foreign
- @opindex --foreign
- Set the global strictness to @option{foreign}. For more information, see
- @ref{Strictness}.
- @item --gnits
- @opindex --gnits
- Set the global strictness to @option{gnits}. For more information, see
- @ref{Gnits}.
- @item --gnu
- @opindex --gnu
- Set the global strictness to @option{gnu}. For more information, see
- @ref{Gnits}. This is the default strictness.
- @item --help
- @opindex --help
- Print a summary of the command line options and exit.
- @item -i
- @itemx --ignore-deps
- @opindex -i
- This disables the dependency tracking feature in generated
- @file{Makefile}s; see @ref{Dependencies}.
- @item --include-deps
- @opindex --include-deps
- This enables the dependency tracking feature. This feature is enabled
- by default. This option is provided for historical reasons only and
- probably should not be used.
- @item --no-force
- @opindex --no-force
- Ordinarily @command{automake} creates all @file{Makefile.in}s mentioned in
- @file{configure.ac}. This option causes it to only update those
- @file{Makefile.in}s that are out of date with respect to one of their
- dependents.
- @item -o @var{dir}
- @itemx --output-dir=@var{dir}
- @opindex -o
- @opindex --output-dir
- Put the generated @file{Makefile.in} in the directory @var{dir}.
- Ordinarily each @file{Makefile.in} is created in the directory of the
- corresponding @file{Makefile.am}. This option is deprecated and will be
- removed in a future release.
- @item -v
- @itemx --verbose
- @opindex -v
- @opindex --verbose
- Cause Automake to print information about which files are being read or
- created.
- @item --version
- @opindex --version
- Print the version number of Automake and exit.
- @item -W CATEGORY
- @itemx --warnings=@var{category}
- @opindex -W
- @opindex --warnings
- Output warnings falling in @var{category}. @var{category} can be
- one of:
- @table @code
- @item gnu
- warnings related to the GNU Coding Standards
- (@pxref{Top, , , standards, The GNU Coding Standards}).
- @item obsolete
- obsolete features or constructions
- @item override
- user redefinitions of Automake rules or variables
- @item portability
- portability issues (e.g., use of @command{make} features that are
- known to be not portable)
- @item extra-portability
- extra portability issues related to obscure tools. One example of such
- a tool is the Microsoft @command{lib} archiver.
- @item syntax
- weird syntax, unused variables, typos
- @item unsupported
- unsupported or incomplete features
- @item all
- all the warnings
- @item none
- turn off all the warnings
- @item error
- treat warnings as errors
- @end table
- A category can be turned off by prefixing its name with @samp{no-}. For
- instance, @option{-Wno-syntax} will hide the warnings about unused
- variables.
- The categories output by default are @samp{obsolete}, @samp{syntax} and
- @samp{unsupported}. Additionally, @samp{gnu} and @samp{portability}
- are enabled in @option{--gnu} and @option{--gnits} strictness.
- @c Checked by extra-portability.sh
- Turning off @samp{portability} will also turn off @samp{extra-portability},
- and similarly turning on @samp{extra-portability} will also turn on
- @samp{portability}. However, turning on @samp{portability} or turning
- off @samp{extra-portability} will not affect the other category.
- @vindex WARNINGS
- The environment variable @env{WARNINGS} can contain a comma separated
- list of categories to enable. It will be taken into account before the
- command-line switches, this way @option{-Wnone} will also ignore any
- warning category enabled by @env{WARNINGS}. This variable is also used
- by other tools like @command{autoconf}; unknown categories are ignored
- for this reason.
- @end table
- @vindex AUTOMAKE_JOBS
- If the environment variable @env{AUTOMAKE_JOBS} contains a positive
- number, it is taken as the maximum number of Perl threads to use in
- @command{automake} for generating multiple @file{Makefile.in} files
- concurrently. This is an experimental feature.
- @node configure
- @chapter Scanning @file{configure.ac}, using @command{aclocal}
- @cindex @file{configure.ac}, scanning
- @cindex Scanning @file{configure.ac}
- @cindex Using @command{aclocal}
- @cindex @command{aclocal}, using
- Automake scans the package's @file{configure.ac} to determine certain
- information about the package. Some @command{autoconf} macros are required
- and some variables must be defined in @file{configure.ac}. Automake
- will also use information from @file{configure.ac} to further tailor its
- output.
- Automake also supplies some Autoconf macros to make the maintenance
- easier. These macros can automatically be put into your
- @file{aclocal.m4} using the @command{aclocal} program.
- @menu
- * Requirements:: Configuration requirements
- * Optional:: Other things Automake recognizes
- * aclocal Invocation:: Auto-generating aclocal.m4
- * Macros:: Autoconf macros supplied with Automake
- @end menu
- @node Requirements
- @section Configuration requirements
- @cindex Automake requirements
- @cindex Requirements of Automake
- @acindex AM_INIT_AUTOMAKE
- The one real requirement of Automake is that your @file{configure.ac}
- call @code{AM_INIT_AUTOMAKE}. This macro does several things that are
- required for proper Automake operation (@pxref{Macros}).
- Here are the other macros that Automake requires but which are not run
- by @code{AM_INIT_AUTOMAKE}:
- @table @code
- @item AC_CONFIG_FILES
- @itemx AC_OUTPUT
- @acindex AC_CONFIG_FILES
- @acindex AC_OUTPUT
- These two macros are usually invoked as follows near the end of
- @file{configure.ac}.
- @example
- @dots{}
- AC_CONFIG_FILES([
- Makefile
- doc/Makefile
- src/Makefile
- src/lib/Makefile
- @dots{}
- ])
- AC_OUTPUT
- @end example
- Automake uses these to determine which files to create (@pxref{Output, ,
- Creating Output Files, autoconf, The Autoconf Manual}). A listed file
- is considered to be an Automake generated @file{Makefile} if there
- exists a file with the same name and the @file{.am} extension appended.
- Typically, @samp{AC_CONFIG_FILES([foo/Makefile])} will cause Automake to
- generate @file{foo/Makefile.in} if @file{foo/Makefile.am} exists.
- When using @code{AC_CONFIG_FILES} with multiple input files, as in
- @example
- AC_CONFIG_FILES([Makefile:top.in:Makefile.in:bot.in])
- @end example
- @noindent
- @command{automake} will generate the first @file{.in} input file for
- which a @file{.am} file exists. If no such file exists the output
- file is not considered to be generated by Automake.
- Files created by @code{AC_CONFIG_FILES}, be they Automake
- @file{Makefile}s or not, are all removed by @samp{make distclean}.
- Their inputs are automatically distributed, unless they
- are the output of prior @code{AC_CONFIG_FILES} commands.
- Finally, rebuild rules are generated in the Automake @file{Makefile}
- existing in the subdirectory of the output file, if there is one, or
- in the top-level @file{Makefile} otherwise.
- The above machinery (cleaning, distributing, and rebuilding) works
- fine if the @code{AC_CONFIG_FILES} specifications contain only
- literals. If part of the specification uses shell variables,
- @command{automake} will not be able to fulfill this setup, and you will
- have to complete the missing bits by hand. For instance, on
- @c Keep in sync with output11.sh
- @example
- file=input
- @dots{}
- AC_CONFIG_FILES([output:$file],, [file=$file])
- @end example
- @noindent
- @command{automake} will output rules to clean @file{output}, and
- rebuild it. However the rebuild rule will not depend on @file{input},
- and this file will not be distributed either. (You must add
- @samp{EXTRA_DIST = input} to your @file{Makefile.am} if @file{input} is a
- source file.)
- Similarly
- @c Keep in sync with output11.sh
- @example
- file=output
- file2=out:in
- @dots{}
- AC_CONFIG_FILES([$file:input],, [file=$file])
- AC_CONFIG_FILES([$file2],, [file2=$file2])
- @end example
- @noindent
- will only cause @file{input} to be distributed. No file will be
- cleaned automatically (add @samp{DISTCLEANFILES = output out}
- yourself), and no rebuild rule will be output.
- Obviously @command{automake} cannot guess what value @samp{$file} is
- going to hold later when @file{configure} is run, and it cannot use
- the shell variable @samp{$file} in a @file{Makefile}. However, if you
- make reference to @samp{$file} as @samp{$@{file@}} (i.e., in a way
- that is compatible with @command{make}'s syntax) and furthermore use
- @code{AC_SUBST} to ensure that @samp{$@{file@}} is meaningful in a
- @file{Makefile}, then @command{automake} will be able to use
- @samp{$@{file@}} to generate all of these rules. For instance, here is
- how the Automake package itself generates versioned scripts for its
- test suite:
- @example
- AC_SUBST([APIVERSION], @dots{})
- @dots{}
- AC_CONFIG_FILES(
- [tests/aclocal-$@{APIVERSION@}:tests/aclocal.in],
- [chmod +x tests/aclocal-$@{APIVERSION@}],
- [APIVERSION=$APIVERSION])
- AC_CONFIG_FILES(
- [tests/automake-$@{APIVERSION@}:tests/automake.in],
- [chmod +x tests/automake-$@{APIVERSION@}])
- @end example
- @noindent
- Here cleaning, distributing, and rebuilding are done automatically,
- because @samp{$@{APIVERSION@}} is known at @command{make}-time.
- Note that you should not use shell variables to declare
- @file{Makefile} files for which @command{automake} must create
- @file{Makefile.in}. Even @code{AC_SUBST} does not help here, because
- @command{automake} needs to know the file name when it runs in order
- to check whether @file{Makefile.am} exists. (In the very hairy case
- that your setup requires such use of variables, you will have to tell
- Automake which @file{Makefile.in}s to generate on the command-line.)
- It is possible to let @command{automake} emit conditional rules for
- @code{AC_CONFIG_FILES} with the help of @code{AM_COND_IF}
- (@pxref{Optional}).
- To summarize:
- @itemize @bullet
- @item
- Use literals for @file{Makefile}s, and for other files whenever possible.
- @item
- Use @samp{$file} (or @samp{$@{file@}} without @samp{AC_SUBST([file])})
- for files that @command{automake} should ignore.
- @item
- Use @samp{$@{file@}} and @samp{AC_SUBST([file])} for files
- that @command{automake} should not ignore.
- @end itemize
- @end table
- @node Optional
- @section Other things Automake recognizes
- @cindex Macros Automake recognizes
- @cindex Recognized macros by Automake
- Every time Automake is run it calls Autoconf to trace
- @file{configure.ac}. This way it can recognize the use of certain
- macros and tailor the generated @file{Makefile.in} appropriately.
- Currently recognized macros and their effects are:
- @ftable @code
- @item AC_CANONICAL_BUILD
- @itemx AC_CANONICAL_HOST
- @itemx AC_CANONICAL_TARGET
- @vindex build_triplet
- @vindex host_triplet
- @vindex target_triplet
- Automake will ensure that @file{config.guess} and @file{config.sub}
- exist. Also, the @file{Makefile} variables @code{build_triplet},
- @code{host_triplet} and @code{target_triplet} are introduced. See
- @ref{Canonicalizing, , Getting the Canonical System Type, autoconf,
- The Autoconf Manual}.
- @item AC_CONFIG_AUX_DIR
- Automake will look for various helper scripts, such as
- @file{install-sh}, in the directory named in this macro invocation.
- @c This list is accurate relative to version 1.11
- (The full list of scripts is:
- @file{ar-lib},
- @file{config.guess},
- @file{config.sub},
- @file{depcomp},
- @file{compile},
- @file{install-sh},
- @file{ltmain.sh},
- @file{mdate-sh},
- @file{missing},
- @file{mkinstalldirs},
- @file{py-compile},
- @file{test-driver},
- @file{texinfo.tex},
- @file{ylwrap}.)
- Not all scripts are always searched for; some scripts
- will only be sought if the generated @file{Makefile.in} requires them.
- If @code{AC_CONFIG_AUX_DIR} is not given, the scripts are looked for in
- their standard locations. For @file{mdate-sh},
- @file{texinfo.tex}, and @file{ylwrap}, the standard location is the
- source directory corresponding to the current @file{Makefile.am}. For
- the rest, the standard location is the first one of @file{.}, @file{..},
- or @file{../..} (relative to the top source directory) that provides any
- one of the helper scripts. @xref{Input, , Finding `configure' Input,
- autoconf, The Autoconf Manual}.
- Required files from @code{AC_CONFIG_AUX_DIR} are automatically
- distributed, even if there is no @file{Makefile.am} in this directory.
- @item AC_CONFIG_LIBOBJ_DIR
- Automake will require the sources file declared with
- @code{AC_LIBSOURCE} (see below) in the directory specified by this
- macro.
- @item AC_CONFIG_HEADERS
- Automake will generate rules to rebuild these headers from the
- corresponding templates (usually, the template for a @file{foo.h}
- header being @file{foo.h.in}). Older versions of Automake
- required the use of @code{AM_CONFIG_HEADER}; this is no longer
- the case, and that macro has indeed been removed.
- As with @code{AC_CONFIG_FILES} (@pxref{Requirements}), parts of the
- specification using shell variables will be ignored as far as
- cleaning, distributing, and rebuilding is concerned.
- @item AC_CONFIG_LINKS
- Automake will generate rules to remove @file{configure} generated
- links on @samp{make distclean} and to distribute named source files as
- part of @samp{make dist}.
- As for @code{AC_CONFIG_FILES} (@pxref{Requirements}), parts of the
- specification using shell variables will be ignored as far as cleaning
- and distributing is concerned. (There are no rebuild rules for links.)
- @item AC_LIBOBJ
- @itemx AC_LIBSOURCE
- @itemx AC_LIBSOURCES
- @vindex LIBOBJS
- Automake will automatically distribute any file listed in
- @code{AC_LIBSOURCE} or @code{AC_LIBSOURCES}.
- Note that the @code{AC_LIBOBJ} macro calls @code{AC_LIBSOURCE}. So if
- an Autoconf macro is documented to call @samp{AC_LIBOBJ([file])}, then
- @file{file.c} will be distributed automatically by Automake. This
- encompasses many macros like @code{AC_FUNC_ALLOCA},
- @code{AC_FUNC_MEMCMP}, @code{AC_REPLACE_FUNCS}, and others.
- By the way, direct assignments to @code{LIBOBJS} are no longer
- supported. You should always use @code{AC_LIBOBJ} for this purpose.
- @xref{AC_LIBOBJ vs LIBOBJS, , @code{AC_LIBOBJ} vs.@: @code{LIBOBJS},
- autoconf, The Autoconf Manual}.
- @item AC_PROG_RANLIB
- This is required if any libraries are built in the package.
- @xref{Particular Programs, , Particular Program Checks, autoconf, The
- Autoconf Manual}.
- @item AC_PROG_CXX
- This is required if any C++ source is included. @xref{Particular
- Programs, , Particular Program Checks, autoconf, The Autoconf Manual}.
- @item AC_PROG_OBJC
- This is required if any Objective C source is included. @xref{Particular
- Programs, , Particular Program Checks, autoconf, The Autoconf Manual}.
- @item AC_PROG_OBJCXX
- This is required if any Objective C++ source is included. @xref{Particular
- Programs, , Particular Program Checks, autoconf, The Autoconf Manual}.
- @item AC_PROG_F77
- This is required if any Fortran 77 source is included. @xref{Particular
- Programs, , Particular Program Checks, autoconf, The Autoconf Manual}.
- @item AC_F77_LIBRARY_LDFLAGS
- This is required for programs and shared libraries that are a mixture of
- languages that include Fortran 77 (@pxref{Mixing Fortran 77 With C and
- C++}). @xref{Macros, , Autoconf macros supplied with Automake}.
- @item AC_FC_SRCEXT
- Automake will add the flags computed by @code{AC_FC_SRCEXT} to compilation
- of files with the respective source extension (@pxref{Fortran Compiler, ,
- Fortran Compiler Characteristics, autoconf, The Autoconf Manual}).
- @item AC_PROG_FC
- This is required if any Fortran 90/95 source is included. This macro is
- distributed with Autoconf version 2.58 and later. @xref{Particular
- Programs, , Particular Program Checks, autoconf, The Autoconf Manual}.
- @item AC_PROG_LIBTOOL
- Automake will turn on processing for @command{libtool} (@pxref{Top, ,
- Introduction, libtool, The Libtool Manual}).
- @item AC_PROG_YACC
- @vindex YACC
- If a Yacc source file is seen, then you must either use this macro or
- define the variable @code{YACC} in @file{configure.ac}. The former is
- preferred (@pxref{Particular Programs, , Particular Program Checks,
- autoconf, The Autoconf Manual}).
- @item AC_PROG_LEX
- If a Lex source file is seen, then this macro must be used.
- @xref{Particular Programs, , Particular Program Checks, autoconf, The
- Autoconf Manual}.
- @item AC_REQUIRE_AUX_FILE
- For each @code{AC_REQUIRE_AUX_FILE([@var{file}])},
- @command{automake} will ensure that @file{@var{file}} exists in the
- aux directory, and will complain otherwise. It
- will also automatically distribute the file. This macro should be
- used by third-party Autoconf macros that require some supporting
- files in the aux directory specified with @code{AC_CONFIG_AUX_DIR}
- above. @xref{Input, , Finding @command{configure} Input, autoconf,
- The Autoconf Manual}.
- @item AC_SUBST
- The first argument is automatically defined as a variable in each
- generated @file{Makefile.in}, unless @code{AM_SUBST_NOTMAKE} is also
- used for this variable. @xref{Setting Output Variables, , Setting
- Output Variables, autoconf, The Autoconf Manual}.
- For every substituted variable @var{var}, @command{automake} will add
- a line @code{@var{var} = @var{value}} to each @file{Makefile.in} file.
- Many Autoconf macros invoke @code{AC_SUBST} to set output variables
- this way, e.g., @code{AC_PATH_XTRA} defines @code{X_CFLAGS} and
- @code{X_LIBS}. Thus, you can access these variables as
- @code{$(X_CFLAGS)} and @code{$(X_LIBS)} in any @file{Makefile.am}
- if @code{AC_PATH_XTRA} is called.
- @item AM_CONDITIONAL
- This introduces an Automake conditional (@pxref{Conditionals}).
- @item AM_COND_IF
- This macro allows @code{automake} to detect subsequent access within
- @file{configure.ac} to a conditional previously introduced with
- @code{AM_CONDITIONAL}, thus enabling conditional @code{AC_CONFIG_FILES}
- (@pxref{Usage of Conditionals}).
- @item AM_GNU_GETTEXT
- This macro is required for packages that use GNU gettext
- (@pxref{gettext}). It is distributed with gettext. If Automake sees
- this macro it ensures that the package meets some of gettext's
- requirements.
- @item AM_GNU_GETTEXT_INTL_SUBDIR
- This macro specifies that the @file{intl/} subdirectory is to be built,
- even if the @code{AM_GNU_GETTEXT} macro was invoked with a first argument
- of @samp{external}.
- @item AM_MAINTAINER_MODE(@ovar{default-mode})
- @opindex --enable-maintainer-mode
- @opindex --disable-maintainer-mode
- This macro adds an @option{--enable-maintainer-mode} option to
- @command{configure}. If this is used, @command{automake} will cause
- ``maintainer-only'' rules to be turned off by default in the
- generated @file{Makefile.in}s, unless @var{default-mode} is
- @samp{enable}. This macro defines the @code{MAINTAINER_MODE}
- conditional, which you can use in your own @file{Makefile.am}.
- @xref{maintainer-mode}.
- @item AM_SUBST_NOTMAKE(@var{var})
- Prevent Automake from defining a variable @var{var}, even if it is
- substituted by @command{config.status}. Normally, Automake defines a
- @command{make} variable for each @command{configure} substitution,
- i.e., for each @code{AC_SUBST([@var{var}])}. This macro prevents that
- definition from Automake. If @code{AC_SUBST} has not been called
- for this variable, then @code{AM_SUBST_NOTMAKE} has no effects.
- Preventing variable definitions may be useful for substitution of
- multi-line values, where @code{@var{var} = @@@var{value}@@} might yield
- unintended results.
- @item m4_include
- Files included by @file{configure.ac} using this macro will be
- detected by Automake and automatically distributed. They will also
- appear as dependencies in @file{Makefile} rules.
- @code{m4_include} is seldom used by @file{configure.ac} authors, but
- can appear in @file{aclocal.m4} when @command{aclocal} detects that
- some required macros come from files local to your package (as opposed to
- macros installed in a system-wide directory, @pxref{aclocal Invocation}).
- @end ftable
- @node aclocal Invocation
- @section Auto-generating aclocal.m4
- @c This node used to be named "Invoking automake". This @anchor
- @c allows old links to still work.
- @anchor{Invoking aclocal}
- @cindex Invocation of @command{aclocal}
- @cindex @command{aclocal}, Invocation
- @cindex Invoking @command{aclocal}
- @cindex @command{aclocal}, Invoking
- Automake includes a number of Autoconf macros that can be used in
- your package (@pxref{Macros}); some of them are actually required by
- Automake in certain situations. These macros must be defined in your
- @file{aclocal.m4}; otherwise they will not be seen by
- @command{autoconf}.
- The @command{aclocal} program will automatically generate
- @file{aclocal.m4} files based on the contents of @file{configure.ac}.
- This provides a convenient way to get Automake-provided macros,
- without having to search around. The @command{aclocal} mechanism
- allows other packages to supply their own macros (@pxref{Extending
- aclocal}). You can also use it to maintain your own set of custom
- macros (@pxref{Local Macros}).
- At startup, @command{aclocal} scans all the @file{.m4} files it can
- find, looking for macro definitions (@pxref{Macro Search Path}). Then
- it scans @file{configure.ac}. Any mention of one of the macros found
- in the first step causes that macro, and any macros it in turn
- requires, to be put into @file{aclocal.m4}.
- @emph{Putting} the file that contains the macro definition into
- @file{aclocal.m4} is usually done by copying the entire text of this
- file, including unused macro definitions as well as both @samp{#} and
- @samp{dnl} comments. If you want to make a comment that will be
- completely ignored by @command{aclocal}, use @samp{##} as the comment
- leader.
- When a file selected by @command{aclocal} is located in a subdirectory
- specified as a relative search path with @command{aclocal}'s @option{-I}
- argument, @command{aclocal} assumes the file belongs to the package
- and uses @code{m4_include} instead of copying it into
- @file{aclocal.m4}. This makes the package smaller, eases dependency
- tracking, and cause the file to be distributed automatically.
- (@xref{Local Macros}, for an example.) Any macro that is found in a
- system-wide directory, or via an absolute search path will be copied.
- So use @samp{-I `pwd`/reldir} instead of @samp{-I reldir} whenever
- some relative directory should be considered outside the package.
- The contents of @file{acinclude.m4}, if this file exists, are also
- automatically included in @file{aclocal.m4}. We recommend against
- using @file{acinclude.m4} in new packages (@pxref{Local Macros}).
- @vindex AUTOM4TE
- @cindex autom4te
- While computing @file{aclocal.m4}, @command{aclocal} runs
- @command{autom4te} (@pxref{Using autom4te, , Using @command{Autom4te},
- autoconf, The Autoconf Manual}) in order to trace the macros that are
- really used, and omit from @file{aclocal.m4} all macros that are
- mentioned but otherwise unexpanded (this can happen when a macro is
- called conditionally). @command{autom4te} is expected to be in the
- @env{PATH}, just as @command{autoconf}. Its location can be
- overridden using the @env{AUTOM4TE} environment variable.
- @menu
- * aclocal Options:: Options supported by aclocal
- * Macro Search Path:: How aclocal finds .m4 files
- * Extending aclocal:: Writing your own aclocal macros
- * Local Macros:: Organizing local macros
- * Serials:: Serial lines in Autoconf macros
- * Future of aclocal:: aclocal's scheduled death
- @end menu
- @node aclocal Options
- @subsection aclocal Options
- @cindex @command{aclocal}, Options
- @cindex Options, @command{aclocal}
- @command{aclocal} accepts the following options:
- @table @code
- @item --automake-acdir=@var{dir}
- @opindex --automake-acdir
- Look for the automake-provided macro files in @var{dir} instead of
- in the installation directory. This is typically used for debugging.
- @item --system-acdir=@var{dir}
- @opindex --system-acdir
- Look for the system-wide third-party macro files (and the special
- @file{dirlist} file) in @var{dir} instead of in the installation
- directory. This is typically used for debugging.
- @item --diff[=@var{command}]
- @opindex --diff
- Run @var{command} on M4 file that would be installed or overwritten
- by @option{--install}. The default @var{command} is @samp{diff -u}.
- This option implies @option{--install} and @option{--dry-run}.
- @item --dry-run
- @opindex --dry-run
- Do not actually overwrite (or create) @file{aclocal.m4} and M4
- files installed by @option{--install}.
- @item --help
- @opindex --help
- Print a summary of the command line options and exit.
- @item -I @var{dir}
- @opindex -I
- Add the directory @var{dir} to the list of directories searched for
- @file{.m4} files.
- @item --install
- @opindex --install
- Install system-wide third-party macros into the first directory
- specified with @samp{-I @var{dir}} instead of copying them in the
- output file.
- @c Keep in sync with aclocal-install-absdir.sh
- Note that this will happen also if @var{dir} is an absolute path.
- @cindex serial number and @option{--install}
- When this option is used, and only when this option is used,
- @command{aclocal} will also honor @samp{#serial @var{number}} lines
- that appear in macros: an M4 file is ignored if there exists another
- M4 file with the same basename and a greater serial number in the
- search path (@pxref{Serials}).
- @item --force
- @opindex --force
- Always overwrite the output file. The default is to overwrite the output
- file only when really needed, i.e., when its contents changes or if one
- of its dependencies is younger.
- This option forces the update of @file{aclocal.m4} (or the file
- specified with @file{--output} below) and only this file, it has
- absolutely no influence on files that may need to be installed by
- @option{--install}.
- @item --output=@var{file}
- @opindex --output
- Cause the output to be put into @var{file} instead of @file{aclocal.m4}.
- @item --print-ac-dir
- @opindex --print-ac-dir
- Prints the name of the directory that @command{aclocal} will search to
- find third-party @file{.m4} files. When this option is given, normal
- processing is suppressed. This option was used @emph{in the past} by
- third-party packages to determine where to install @file{.m4} macro
- files, but @emph{this usage is today discouraged}, since it causes
- @samp{$(prefix)} not to be thoroughly honored (which violates the
- GNU Coding Standards), and a similar semantics can be better obtained
- with the @env{ACLOCAL_PATH} environment variable; @pxref{Extending aclocal}.
- @item --verbose
- @opindex --verbose
- Print the names of the files it examines.
- @item --version
- @opindex --version
- Print the version number of Automake and exit.
- @item -W CATEGORY
- @item --warnings=@var{category}
- @opindex -W
- @opindex --warnings
- Output warnings falling in @var{category}. @var{category} can be
- one of:
- @table @code
- @item syntax
- dubious syntactic constructs, underquoted macros, unused macros, etc.
- @item unsupported
- unknown macros
- @item all
- all the warnings, this is the default
- @item none
- turn off all the warnings
- @item error
- treat warnings as errors
- @end table
- All warnings are output by default.
- @vindex WARNINGS
- The environment variable @env{WARNINGS} is honored in the same
- way as it is for @command{automake} (@pxref{automake Invocation}).
- @end table
- @node Macro Search Path
- @subsection Macro Search Path
- @cindex Macro search path
- @cindex @command{aclocal} search path
- By default, @command{aclocal} searches for @file{.m4} files in the following
- directories, in this order:
- @table @code
- @item @var{acdir-APIVERSION}
- This is where the @file{.m4} macros distributed with Automake itself
- are stored. @var{APIVERSION} depends on the Automake release used;
- for example, for Automake 1.11.x, @var{APIVERSION} = @code{1.11}.
- @item @var{acdir}
- This directory is intended for third party @file{.m4} files, and is
- configured when @command{automake} itself is built. This is
- @file{@@datadir@@/aclocal/}, which typically
- expands to @file{$@{prefix@}/share/aclocal/}. To find the compiled-in
- value of @var{acdir}, use the @option{--print-ac-dir} option
- (@pxref{aclocal Options}).
- @end table
- As an example, suppose that @command{automake-1.11.2} was configured with
- @option{--prefix=@-/usr/local}. Then, the search path would be:
- @enumerate
- @item @file{/usr/local/share/aclocal-1.11.2/}
- @item @file{/usr/local/share/aclocal/}
- @end enumerate
- The paths for the @var{acdir} and @var{acdir-APIVERSION} directories can
- be changed respectively through aclocal options @option{--system-acdir}
- and @option{--automake-acdir} (@pxref{aclocal Options}). Note however
- that these options are only intended for use by the internal Automake
- test suite, or for debugging under highly unusual situations; they are
- not ordinarily needed by end-users.
- As explained in (@pxref{aclocal Options}), there are several options that
- can be used to change or extend this search path.
- @subsubheading Modifying the Macro Search Path: @samp{-I @var{dir}}
- Any extra directories specified using @option{-I} options
- (@pxref{aclocal Options}) are @emph{prepended} to this search list. Thus,
- @samp{aclocal -I /foo -I /bar} results in the following search path:
- @enumerate
- @item @file{/foo}
- @item @file{/bar}
- @item @var{acdir}-@var{APIVERSION}
- @item @var{acdir}
- @end enumerate
- @subsubheading Modifying the Macro Search Path: @file{dirlist}
- @cindex @file{dirlist}
- There is a third mechanism for customizing the search path. If a
- @file{dirlist} file exists in @var{acdir}, then that file is assumed to
- contain a list of directory patterns, one per line. @command{aclocal}
- expands these patterns to directory names, and adds them to the search
- list @emph{after} all other directories. @file{dirlist} entries may
- use shell wildcards such as @samp{*}, @samp{?}, or @code{[...]}.
- For example, suppose
- @file{@var{acdir}/dirlist} contains the following:
- @example
- /test1
- /test2
- /test3*
- @end example
- @noindent
- and that @command{aclocal} was called with the @samp{-I /foo -I /bar} options.
- Then, the search path would be
- @c @code looks better than @file here
- @enumerate
- @item @code{/foo}
- @item @code{/bar}
- @item @var{acdir}-@var{APIVERSION}
- @item @var{acdir}
- @item @code{/test1}
- @item @code{/test2}
- @end enumerate
- @noindent
- and all directories with path names starting with @code{/test3}.
- If the @option{--system-acdir=@var{dir}} option is used, then
- @command{aclocal} will search for the @file{dirlist} file in
- @var{dir}; but remember the warnings above against the use of
- @option{--system-acdir}.
- @file{dirlist} is useful in the following situation: suppose that
- @command{automake} version @code{1.11.2} is installed with
- @samp{--prefix=/usr} by the system vendor. Thus, the default search
- directories are
- @c @code looks better than @file here
- @enumerate
- @item @code{/usr/share/aclocal-1.11/}
- @item @code{/usr/share/aclocal/}
- @end enumerate
- However, suppose further that many packages have been manually
- installed on the system, with $prefix=/usr/local, as is typical. In
- that case, many of these ``extra'' @file{.m4} files are in
- @file{/usr/local/share/aclocal}. The only way to force
- @file{/usr/bin/aclocal} to find these ``extra'' @file{.m4} files is to
- always call @samp{aclocal -I /usr/local/share/aclocal}. This is
- inconvenient. With @file{dirlist}, one may create a file
- @file{/usr/share/aclocal/dirlist} containing only the single line
- @example
- /usr/local/share/aclocal
- @end example
- Now, the ``default'' search path on the affected system is
- @c @code looks better than @file here
- @enumerate
- @item @code{/usr/share/aclocal-1.11/}
- @item @code{/usr/share/aclocal/}
- @item @code{/usr/local/share/aclocal/}
- @end enumerate
- without the need for @option{-I} options; @option{-I} options can be reserved
- for project-specific needs (@file{my-source-dir/m4/}), rather than
- using it to work around local system-dependent tool installation
- directories.
- Similarly, @file{dirlist} can be handy if you have installed a local
- copy of Automake in your account and want @command{aclocal} to look for
- macros installed at other places on the system.
- @anchor{ACLOCAL_PATH}
- @subsubheading Modifying the Macro Search Path: @file{ACLOCAL_PATH}
- @cindex @env{ACLOCAL_PATH}
- The fourth and last mechanism to customize the macro search path is
- also the simplest. Any directory included in the colon-separated
- environment variable @env{ACLOCAL_PATH} is added to the search path
- @c Keep in sync with aclocal-path-precedence.sh
- and takes precedence over system directories (including those found via
- @file{dirlist}), with the exception of the versioned directory
- @var{acdir-APIVERSION} (@pxref{Macro Search Path}). However, directories
- passed via @option{-I} will take precedence over directories in
- @env{ACLOCAL_PATH}.
- @c Keep in sync with aclocal-path-installed.sh
- Also note that, if the @option{--install} option is used, any @file{.m4}
- file containing a required macro that is found in a directory listed in
- @env{ACLOCAL_PATH} will be installed locally.
- @c Keep in sync with aclocal-path-installed-serial.sh
- In this case, serial numbers in @file{.m4} are honored too,
- @pxref{Serials}.
- Conversely to @file{dirlist}, @env{ACLOCAL_PATH} is useful if you are
- using a global copy of Automake and want @command{aclocal} to look for
- macros somewhere under your home directory.
- @subsubheading Planned future incompatibilities
- The order in which the directories in the macro search path are currently
- looked up is confusing and/or suboptimal in various aspects, and is
- probably going to be changed in the future Automake release. In
- particular, directories in @env{ACLOCAL_PATH} and @file{@var{acdir}}
- might end up taking precedence over @file{@var{acdir-APIVERSION}}, and
- directories in @file{@var{acdir}/dirlist} might end up taking precedence
- over @file{@var{acdir}}. @emph{This is a possible future incompatibility!}
- @node Extending aclocal
- @subsection Writing your own aclocal macros
- @cindex @command{aclocal}, extending
- @cindex Extending @command{aclocal}
- The @command{aclocal} program doesn't have any built-in knowledge of any
- macros, so it is easy to extend it with your own macros.
- This can be used by libraries that want to supply their own Autoconf
- macros for use by other programs. For instance, the @command{gettext}
- library supplies a macro @code{AM_GNU_GETTEXT} that should be used by
- any package using @command{gettext}. When the library is installed, it
- installs this macro so that @command{aclocal} will find it.
- A macro file's name should end in @file{.m4}. Such files should be
- installed in @file{$(datadir)/aclocal}. This is as simple as writing:
- @c Keep in sync with primary-prefix-couples-documented-valid.sh
- @example
- aclocaldir = $(datadir)/aclocal
- aclocal_DATA = mymacro.m4 myothermacro.m4
- @end example
- @noindent
- Please do use @file{$(datadir)/aclocal}, and not something based on
- the result of @samp{aclocal --print-ac-dir} (@pxref{Hard-Coded Install
- Paths}, for arguments). It might also be helpful to suggest to
- the user to add the @file{$(datadir)/aclocal} directory to his
- @env{ACLOCAL_PATH} variable (@pxref{ACLOCAL_PATH}) so that
- @command{aclocal} will find the @file{.m4} files installed by your
- package automatically.
- A file of macros should be a series of properly quoted
- @code{AC_DEFUN}'s (@pxref{Macro Definitions, , , autoconf, The
- Autoconf Manual}). The @command{aclocal} programs also understands
- @code{AC_REQUIRE} (@pxref{Prerequisite Macros, , , autoconf, The
- Autoconf Manual}), so it is safe to put each macro in a separate file.
- Each file should have no side effects but macro definitions.
- Especially, any call to @code{AC_PREREQ} should be done inside the
- defined macro, not at the beginning of the file.
- @cindex underquoted @code{AC_DEFUN}
- @acindex AC_DEFUN
- @acindex AC_PREREQ
- Starting with Automake 1.8, @command{aclocal} will warn about all
- underquoted calls to @code{AC_DEFUN}. We realize this will annoy a
- lot of people, because @command{aclocal} was not so strict in the past
- and many third party macros are underquoted; and we have to apologize
- for this temporary inconvenience. The reason we have to be stricter
- is that a future implementation of @command{aclocal} (@pxref{Future of
- aclocal}) will have to temporarily include all of these third party
- @file{.m4} files, maybe several times, including even files that are
- not actually needed. Doing so should alleviate many problems of the
- current implementation, however it requires a stricter style from the
- macro authors. Hopefully it is easy to revise the existing macros.
- For instance,
- @example
- # bad style
- AC_PREREQ(2.68)
- AC_DEFUN(AX_FOOBAR,
- [AC_REQUIRE([AX_SOMETHING])dnl
- AX_FOO
- AX_BAR
- ])
- @end example
- @noindent
- should be rewritten as
- @example
- AC_DEFUN([AX_FOOBAR],
- [AC_PREREQ([2.68])dnl
- AC_REQUIRE([AX_SOMETHING])dnl
- AX_FOO
- AX_BAR
- ])
- @end example
- Wrapping the @code{AC_PREREQ} call inside the macro ensures that
- Autoconf 2.68 will not be required if @code{AX_FOOBAR} is not actually
- used. Most importantly, quoting the first argument of @code{AC_DEFUN}
- allows the macro to be redefined or included twice (otherwise this
- first argument would be expanded during the second definition). For
- consistency we like to quote even arguments such as @code{2.68} that
- do not require it.
- If you have been directed here by the @command{aclocal} diagnostic but
- are not the maintainer of the implicated macro, you will want to
- contact the maintainer of that macro. Please make sure you have the
- latest version of the macro and that the problem hasn't already been
- reported before doing so: people tend to work faster when they aren't
- flooded by mails.
- Another situation where @command{aclocal} is commonly used is to
- manage macros that are used locally by the package, @ref{Local
- Macros}.
- @node Local Macros
- @subsection Handling Local Macros
- Feature tests offered by Autoconf do not cover all needs. People
- often have to supplement existing tests with their own macros, or
- with third-party macros.
- There are two ways to organize custom macros in a package.
- The first possibility (the historical practice) is to list all your
- macros in @file{acinclude.m4}. This file will be included in
- @file{aclocal.m4} when you run @command{aclocal}, and its macro(s) will
- henceforth be visible to @command{autoconf}. However if it contains
- numerous macros, it will rapidly become difficult to maintain, and it
- will be almost impossible to share macros between packages.
- The second possibility, which we do recommend, is to write each macro
- in its own file and gather all these files in a directory. This
- directory is usually called @file{m4/}. Then it's enough to update
- @file{configure.ac} by adding a proper call to @code{AC_CONFIG_MACRO_DIRS}:
- @example
- AC_CONFIG_MACRO_DIRS([m4])
- @end example
- @command{aclocal} will then take care of automatically adding @file{m4/}
- to its search path for m4 files.
- When @samp{aclocal} is run, it will build an @file{aclocal.m4}
- that @code{m4_include}s any file from @file{m4/} that defines a
- required macro. Macros not found locally will still be searched in
- system-wide directories, as explained in @ref{Macro Search Path}.
- Custom macros should be distributed for the same reason that
- @file{configure.ac} is: so that other people have all the sources of
- your package if they want to work on it. Actually, this distribution
- happens automatically because all @code{m4_include}d files are
- distributed.
- However there is no consensus on the distribution of third-party
- macros that your package may use. Many libraries install their own
- macro in the system-wide @command{aclocal} directory (@pxref{Extending
- aclocal}). For instance, Guile ships with a file called
- @file{guile.m4} that contains the macro @code{GUILE_FLAGS} that can
- be used to define setup compiler and linker flags appropriate for
- using Guile. Using @code{GUILE_FLAGS} in @file{configure.ac} will
- cause @command{aclocal} to copy @file{guile.m4} into
- @file{aclocal.m4}, but as @file{guile.m4} is not part of the project,
- it will not be distributed. Technically, that means a user who
- needs to rebuild @file{aclocal.m4} will have to install Guile first.
- This is probably OK, if Guile already is a requirement to build the
- package. However, if Guile is only an optional feature, or if your
- package might run on architectures where Guile cannot be installed,
- this requirement will hinder development. An easy solution is to copy
- such third-party macros in your local @file{m4/} directory so they get
- distributed.
- Since Automake 1.10, @command{aclocal} offers the option @code{--install}
- to copy these system-wide third-party macros in your local macro directory,
- helping to solve the above problem.
- With this setup, system-wide macros will be copied to @file{m4/}
- the first time you run @command{aclocal}. Then the locally installed
- macros will have precedence over the system-wide installed macros
- each time @command{aclocal} is run again.
- One reason why you should keep @option{--install} in the flags even
- after the first run is that when you later edit @file{configure.ac}
- and depend on a new macro, this macro will be installed in your
- @file{m4/} automatically. Another one is that serial numbers
- (@pxref{Serials}) can be used to update the macros in your source tree
- automatically when new system-wide versions are installed. A serial
- number should be a single line of the form
- @example
- #serial @var{nnn}
- @end example
- @noindent
- where @var{nnn} contains only digits and dots. It should appear in
- the M4 file before any macro definition. It is a good practice to
- maintain a serial number for each macro you distribute, even if you do
- not use the @option{--install} option of @command{aclocal}: this allows
- other people to use it.
- @node Serials
- @subsection Serial Numbers
- @cindex serial numbers in macros
- @cindex macro serial numbers
- @cindex @code{#serial} syntax
- @cindex @command{aclocal} and serial numbers
- Because third-party macros defined in @file{*.m4} files are naturally
- shared between multiple projects, some people like to version them.
- This makes it easier to tell which of two M4 files is newer. Since at
- least 1996, the tradition is to use a @samp{#serial} line for this.
- A serial number should be a single line of the form
- @example
- # serial @var{version}
- @end example
- @noindent
- where @var{version} is a version number containing only digits and
- dots. Usually people use a single integer, and they increment it each
- time they change the macro (hence the name of ``serial''). Such a
- line should appear in the M4 file before any macro definition.
- The @samp{#} must be the first character on the line,
- and it is OK to have extra words after the version, as in
- @example
- #serial @var{version} @var{garbage}
- @end example
- Normally these serial numbers are completely ignored by
- @command{aclocal} and @command{autoconf}, like any genuine comment.
- However when using @command{aclocal}'s @option{--install} feature, these
- serial numbers will modify the way @command{aclocal} selects the
- macros to install in the package: if two files with the same basename
- exist in your search path, and if at least one of them uses a
- @samp{#serial} line, @command{aclocal} will ignore the file that has
- the older @samp{#serial} line (or the file that has none).
- Note that a serial number applies to a whole M4 file, not to any macro
- it contains. A file can contains multiple macros, but only one
- serial.
- Here is a use case that illustrates the use of @option{--install} and
- its interaction with serial numbers. Let's assume we maintain a
- package called MyPackage, the @file{configure.ac} of which requires a
- third-party macro @code{AX_THIRD_PARTY} defined in
- @file{/usr/share/aclocal/thirdparty.m4} as follows:
- @example
- # serial 1
- AC_DEFUN([AX_THIRD_PARTY], [...])
- @end example
- MyPackage uses an @file{m4/} directory to store local macros as
- explained in @ref{Local Macros}, and has
- @example
- AC_CONFIG_MACRO_DIRS([m4])
- @end example
- @noindent
- in its @file{configure.ac}.
- Initially the @file{m4/} directory is empty. The first time we run
- @command{aclocal --install}, it will notice that
- @itemize @bullet
- @item
- @file{configure.ac} uses @code{AX_THIRD_PARTY}
- @item
- No local macros define @code{AX_THIRD_PARTY}
- @item
- @file{/usr/share/aclocal/thirdparty.m4} defines @code{AX_THIRD_PARTY}
- with serial 1.
- @end itemize
- @noindent
- Because @file{/usr/share/aclocal/thirdparty.m4} is a system-wide macro
- and @command{aclocal} was given the @option{--install} option, it will
- copy this file in @file{m4/thirdparty.m4}, and output an
- @file{aclocal.m4} that contains @samp{m4_include([m4/thirdparty.m4])}.
- The next time @samp{aclocal --install} is run, something different
- happens. @command{aclocal} notices that
- @itemize @bullet
- @item
- @file{configure.ac} uses @code{AX_THIRD_PARTY}
- @item
- @file{m4/thirdparty.m4} defines @code{AX_THIRD_PARTY}
- with serial 1.
- @item
- @file{/usr/share/aclocal/thirdparty.m4} defines @code{AX_THIRD_PARTY}
- with serial 1.
- @end itemize
- @noindent
- Because both files have the same serial number, @command{aclocal} uses
- the first it found in its search path order (@pxref{Macro Search
- Path}). @command{aclocal} therefore ignores
- @file{/usr/share/aclocal/thirdparty.m4} and outputs an
- @file{aclocal.m4} that contains @samp{m4_include([m4/thirdparty.m4])}.
- Local directories specified with @option{-I} are always searched before
- system-wide directories, so a local file will always be preferred to
- the system-wide file in case of equal serial numbers.
- Now suppose the system-wide third-party macro is changed. This can
- happen if the package installing this macro is updated. Let's suppose
- the new macro has serial number 2. The next time @samp{aclocal --install}
- is run the situation is the following:
- @itemize @bullet
- @item
- @file{configure.ac} uses @code{AX_THIRD_PARTY}
- @item
- @file{m4/thirdparty.m4} defines @code{AX_THIRD_PARTY}
- with serial 1.
- @item
- @file{/usr/share/aclocal/thirdparty.m4} defines @code{AX_THIRD_PARTY}
- with serial 2.
- @end itemize
- @noindent
- When @command{aclocal} sees a greater serial number, it immediately
- forgets anything it knows from files that have the same basename and a
- smaller serial number. So after it has found
- @file{/usr/share/aclocal/thirdparty.m4} with serial 2,
- @command{aclocal} will proceed as if it had never seen
- @file{m4/thirdparty.m4}. This brings us back to a situation similar
- to that at the beginning of our example, where no local file defined
- the macro. @command{aclocal} will install the new version of the
- macro in @file{m4/thirdparty.m4}, in this case overriding the old
- version. MyPackage just had its macro updated as a side effect of
- running @command{aclocal}.
- If you are leery of letting @command{aclocal} update your local
- macro, you can run @samp{aclocal --diff} to review the changes
- @samp{aclocal --install} would perform on these macros.
- Finally, note that the @option{--force} option of @command{aclocal} has
- absolutely no effect on the files installed by @option{--install}. For
- instance, if you have modified your local macros, do not expect
- @option{--install --force} to replace the local macros by their
- system-wide versions. If you want to do so, simply erase the local
- macros you want to revert, and run @samp{aclocal --install}.
- @node Future of aclocal
- @subsection The Future of @command{aclocal}
- @cindex @command{aclocal}'s scheduled death
- @command{aclocal} is expected to disappear. This feature really
- should not be offered by Automake. Automake should focus on
- generating @file{Makefile}s; dealing with M4 macros really is
- Autoconf's job. The fact that some people install Automake just to use
- @command{aclocal}, but do not use @command{automake} otherwise is an
- indication of how that feature is misplaced.
- The new implementation will probably be done slightly differently.
- For instance, it could enforce the @file{m4/}-style layout discussed in
- @ref{Local Macros}.
- We have no idea when and how this will happen. This has been
- discussed several times in the past, but someone still has to commit
- to that non-trivial task.
- From the user point of view, @command{aclocal}'s removal might turn
- out to be painful. There is a simple precaution that you may take to
- make that switch more seamless: never call @command{aclocal} yourself.
- Keep this guy under the exclusive control of @command{autoreconf} and
- Automake's rebuild rules. Hopefully you won't need to worry about
- things breaking, when @command{aclocal} disappears, because everything
- will have been taken care of. If otherwise you used to call
- @command{aclocal} directly yourself or from some script, you will
- quickly notice the change.
- Many packages come with a script called @file{bootstrap} or
- @file{autogen.sh}, that will just call @command{aclocal},
- @command{libtoolize}, @command{gettextize} or @command{autopoint},
- @command{autoconf}, @command{autoheader}, and @command{automake} in
- the right order. Actually this is precisely what @command{autoreconf}
- can do for you. If your package has such a @file{bootstrap} or
- @file{autogen.sh} script, consider using @command{autoreconf}. That
- should simplify its logic a lot (less things to maintain, yum!), it's
- even likely you will not need the script anymore, and more to the point
- you will not call @command{aclocal} directly anymore.
- For the time being, third-party packages should continue to install
- public macros into @file{/usr/share/aclocal/}. If @command{aclocal}
- is replaced by another tool it might make sense to rename the
- directory, but supporting @file{/usr/share/aclocal/} for backward
- compatibility should be really easy provided all macros are properly
- written (@pxref{Extending aclocal}).
- @node Macros
- @section Autoconf macros supplied with Automake
- Automake ships with several Autoconf macros that you can use from your
- @file{configure.ac}. When you use one of them it will be included by
- @command{aclocal} in @file{aclocal.m4}.
- @menu
- * Public Macros:: Macros that you can use.
- * Obsolete Macros:: Macros that will soon be removed.
- * Private Macros:: Macros that you should not use.
- @end menu
- @c consider generating the following subsections automatically from m4 files.
- @node Public Macros
- @subsection Public Macros
- @table @code
- @item AM_INIT_AUTOMAKE([OPTIONS])
- @acindex AM_INIT_AUTOMAKE
- Runs many macros required for proper operation of the generated Makefiles.
- @vindex AUTOMAKE_OPTIONS
- Today, @code{AM_INIT_AUTOMAKE} is called with a single argument: a
- space-separated list of Automake options that should be applied to
- every @file{Makefile.am} in the tree. The effect is as if
- each option were listed in @code{AUTOMAKE_OPTIONS} (@pxref{Options}).
- @acindex AC_INIT
- This macro can also be called in another, @emph{deprecated} form:
- @code{AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])}. In this form,
- there are two required arguments: the package and the version number.
- This usage is mostly obsolete because the @var{package} and @var{version}
- can be obtained from Autoconf's @code{AC_INIT} macro. However,
- differently from what happens for @code{AC_INIT} invocations, this
- @code{AM_INIT_AUTOMAKE} invocation supports shell variables' expansions
- in the @code{PACKAGE} and @code{VERSION} arguments (which otherwise
- defaults, respectively, to the @code{PACKAGE_TARNAME} and
- @code{PACKAGE_VERSION} defined via the @code{AC_INIT} invocation;
- @pxref{AC_INIT, , The @code{AC_INIT} macro, autoconf, The Autoconf Manual});
- and this can be still be useful in some selected situations.
- Our hope is that future Autoconf versions will improve their support
- for package versions defined dynamically at configure runtime; when
- (and if) this happens, support for the two-args @code{AM_INIT_AUTOMAKE}
- invocation will likely be removed from Automake.
- @anchor{Modernize AM_INIT_AUTOMAKE invocation}
- If your @file{configure.ac} has:
- @example
- AC_INIT([src/foo.c])
- AM_INIT_AUTOMAKE([mumble], [1.5])
- @end example
- @noindent
- you should modernize it as follows:
- @example
- AC_INIT([mumble], [1.5])
- AC_CONFIG_SRCDIR([src/foo.c])
- AM_INIT_AUTOMAKE
- @end example
- Note that if you're upgrading your @file{configure.ac} from an earlier
- version of Automake, it is not always correct to simply move the
- package and version arguments from @code{AM_INIT_AUTOMAKE} directly to
- @code{AC_INIT}, as in the example above. The first argument to
- @code{AC_INIT} should be the name of your package (e.g., @samp{GNU
- Automake}), not the tarball name (e.g., @samp{automake}) that you used
- to pass to @code{AM_INIT_AUTOMAKE}. Autoconf tries to derive a
- tarball name from the package name, which should work for most but not
- all package names. (If it doesn't work for yours, you can use the
- four-argument form of @code{AC_INIT} to provide the tarball name
- explicitly).
- @cindex @code{PACKAGE}, prevent definition
- @cindex @code{VERSION}, prevent definition
- @opindex no-define
- By default this macro @code{AC_DEFINE}'s @code{PACKAGE} and
- @code{VERSION}. This can be avoided by passing the @option{no-define}
- option (@pxref{List of Automake options}):
- @example
- AM_INIT_AUTOMAKE([no-define ...])
- @end example
- @item AM_PATH_LISPDIR
- @acindex AM_PATH_LISPDIR
- @vindex EMACS
- @vindex lispdir
- Searches for the program @command{emacs}, and, if found, sets the
- output variable @code{lispdir} to the full path to Emacs' site-lisp
- directory.
- Note that this test assumes the @command{emacs} found to be a version
- that supports Emacs Lisp (such as GNU Emacs or XEmacs). Other
- emacsen can cause this test to hang (some, like old versions of
- MicroEmacs, start up in interactive mode, requiring @kbd{C-x C-c} to
- exit, which is hardly obvious for a non-emacs user). In most cases,
- however, you should be able to use @kbd{C-c} to kill the test. In
- order to avoid problems, you can set @env{EMACS} to ``no'' in the
- environment, or use the @option{--with-lispdir} option to
- @command{configure} to explicitly set the correct path (if you're sure
- you have an @command{emacs} that supports Emacs Lisp).
- @item AM_PROG_AR(@ovar{act-if-fail})
- @acindex AM_PROG_AR
- @vindex AR
- You must use this macro when you use the archiver in your project, if
- you want support for unusual archivers such as Microsoft @command{lib}.
- The content of the optional argument is executed if the archiver
- interface is not recognized; the default action is to abort configure
- with an error message.
- @item AM_PROG_AS
- @acindex AM_PROG_AS
- @vindex CCAS
- @vindex CCASFLAGS
- Use this macro when you have assembly code in your project. This will
- choose the assembler for you (by default the C compiler) and set
- @code{CCAS}, and will also set @code{CCASFLAGS} if required.
- @item AM_PROG_CC_C_O
- @acindex AM_PROG_CC_C_O
- This is an obsolescent macro that checks that the C compiler supports
- the @option{-c} and @option{-o} options together. Note that, since
- Automake 1.14, the @code{AC_PROG_CC} is rewritten to implement such
- checks itself, and thus the explicit use of @code{AM_PROG_CC_C_O}
- should no longer be required.
- @item AM_PROG_LEX
- @acindex AM_PROG_LEX
- @acindex AC_PROG_LEX
- @cindex HP-UX 10, @command{lex} problems
- @cindex @command{lex} problems with HP-UX 10
- Like @code{AC_PROG_LEX} (@pxref{Particular Programs, , Particular
- Program Checks, autoconf, The Autoconf Manual}), but uses the
- @command{missing} script on systems that do not have @command{lex}.
- HP-UX 10 is one such system.
- @item AM_PROG_GCJ
- @acindex AM_PROG_GCJ
- @vindex GCJ
- @vindex GCJFLAGS
- This macro finds the @command{gcj} program or causes an error. It sets
- @code{GCJ} and @code{GCJFLAGS}. @command{gcj} is the Java front-end to the
- GNU Compiler Collection.
- @item AM_PROG_UPC([@var{compiler-search-list}])
- @acindex AM_PROG_UPC
- @vindex UPC
- Find a compiler for Unified Parallel C and define the @code{UPC}
- variable. The default @var{compiler-search-list} is @samp{upcc upc}.
- This macro will abort @command{configure} if no Unified Parallel C
- compiler is found.
- @item AM_MISSING_PROG(@var{name}, @var{program})
- @acindex AM_MISSING_PROG
- @vindex MISSING
- Find a maintainer tool @var{program} and define the @var{name}
- environment variable with its location. If @var{program} is not
- detected, then @var{name} will instead invoke the @command{missing}
- script, in order to give useful advice to the user about the missing
- maintainer tool. @xref{maintainer-mode}, for more information on when
- the @command{missing} script is appropriate.
- @item AM_SILENT_RULES
- @acindex AM_SILENT_RULES
- Control the machinery for less verbose build output
- (@pxref{Automake Silent Rules}).
- @item AM_WITH_DMALLOC
- @acindex AM_WITH_DMALLOC
- @cindex @command{dmalloc}, support for
- @vindex WITH_DMALLOC
- @opindex --with-dmalloc
- Add support for the @uref{http://dmalloc.com/, Dmalloc package}. If
- the user runs @command{configure} with @option{--with-dmalloc}, then
- define @code{WITH_DMALLOC} and add @option{-ldmalloc} to @code{LIBS}.
- @end table
- @node Obsolete Macros
- @subsection Obsolete Macros
- @cindex obsolete macros
- @cindex autoupdate
- Although using some of the following macros was required in past
- releases, you should not use any of them in new code. @emph{All
- these macros will be removed in the next major Automake version};
- if you are still using them, running @command{autoupdate} should
- adjust your @file{configure.ac} automatically (@pxref{autoupdate
- Invocation, , Using @command{autoupdate} to Modernize
- @file{configure.ac}, autoconf, The Autoconf Manual}).
- @emph{Do it NOW!}
- @table @code
- @item AM_PROG_MKDIR_P
- @acindex AM_PROG_MKDIR_P
- @cindex @code{mkdir -p}, macro check
- @vindex MKDIR_P
- @vindex mkdir_p
- From Automake 1.8 to 1.9.6 this macro used to define the output
- variable @code{mkdir_p} to one of @code{mkdir -p}, @code{install-sh
- -d}, or @code{mkinstalldirs}.
- Nowadays Autoconf provides a similar functionality with
- @code{AC_PROG_MKDIR_P} (@pxref{Particular Programs, , Particular
- Program Checks, autoconf, The Autoconf Manual}), however this defines
- the output variable @code{MKDIR_P} instead. In case you are still
- using the @code{AM_PROG_MKDIR_P} macro in your @file{configure.ac},
- or its provided variable @code{$(mkdir_p)} in your @file{Makefile.am},
- you are advised to switch ASAP to the more modern Autoconf-provided
- interface instead; both the macro and the variable might be removed
- in a future major Automake release.
- @end table
- @node Private Macros
- @subsection Private Macros
- The following macros are private macros you should not call directly.
- They are called by the other public macros when appropriate. Do not
- rely on them, as they might be changed in a future version. Consider
- them as implementation details; or better, do not consider them at all:
- skip this section!
- @ftable @code
- @item _AM_DEPENDENCIES
- @itemx AM_SET_DEPDIR
- @itemx AM_DEP_TRACK
- @itemx AM_OUTPUT_DEPENDENCY_COMMANDS
- These macros are used to implement Automake's automatic dependency
- tracking scheme. They are called automatically by Automake when
- required, and there should be no need to invoke them manually.
- @item AM_MAKE_INCLUDE
- This macro is used to discover how the user's @command{make} handles
- @code{include} statements. This macro is automatically invoked when
- needed; there should be no need to invoke it manually.
- @item AM_PROG_INSTALL_STRIP
- This is used to find a version of @code{install} that can be used to
- strip a program at installation time. This macro is automatically
- included when required.
- @item AM_SANITY_CHECK
- This checks to make sure that a file created in the build directory is
- newer than a file in the source directory. This can fail on systems
- where the clock is set incorrectly. This macro is automatically run
- from @code{AM_INIT_AUTOMAKE}.
- @end ftable
- @node Directories
- @chapter Directories
- For simple projects that distribute all files in the same directory
- it is enough to have a single @file{Makefile.am} that builds
- everything in place.
- In larger projects, it is common to organize files in different
- directories, in a tree. For example, there could be a directory
- for the program's source, one for the testsuite, and one for the
- documentation; or, for very large projects, there could be one
- directory per program, per library or per module.
- The traditional approach is to build these subdirectories recursively,
- employing @emph{make recursion}: each directory contains its
- own @file{Makefile}, and when @command{make} is run from the top-level
- directory, it enters each subdirectory in turn, and invokes there a
- new @command{make} instance to build the directory's contents.
- Because this approach is very widespread, Automake offers built-in
- support for it. However, it is worth nothing that the use of make
- recursion has its own serious issues and drawbacks, and that it's
- well possible to have packages with a multi directory layout that
- make little or no use of such recursion (examples of such packages
- are GNU Bison and GNU Automake itself); see also the @ref{Alternative}
- section below.
- @menu
- * Subdirectories:: Building subdirectories recursively
- * Conditional Subdirectories:: Conditionally not building directories
- * Alternative:: Subdirectories without recursion
- * Subpackages:: Nesting packages
- @end menu
- @node Subdirectories
- @section Recursing subdirectories
- @cindex @code{SUBDIRS}, explained
- In packages using make recursion, the top level @file{Makefile.am} must
- tell Automake which subdirectories are to be built. This is done via
- the @code{SUBDIRS} variable.
- @vindex SUBDIRS
- The @code{SUBDIRS} variable holds a list of subdirectories in which
- building of various sorts can occur. The rules for many targets
- (e.g., @code{all}) in the generated @file{Makefile} will run commands
- both locally and in all specified subdirectories. Note that the
- directories listed in @code{SUBDIRS} are not required to contain
- @file{Makefile.am}s; only @file{Makefile}s (after configuration).
- This allows inclusion of libraries from packages that do not use
- Automake (such as @code{gettext}; see also @ref{Third-Party
- Makefiles}).
- In packages that use subdirectories, the top-level @file{Makefile.am} is
- often very short. For instance, here is the @file{Makefile.am} from the
- GNU Hello distribution:
- @example
- EXTRA_DIST = BUGS ChangeLog.O README-alpha
- SUBDIRS = doc intl po src tests
- @end example
- When Automake invokes @command{make} in a subdirectory, it uses the value
- of the @code{MAKE} variable. It passes the value of the variable
- @code{AM_MAKEFLAGS} to the @command{make} invocation; this can be set in
- @file{Makefile.am} if there are flags you must always pass to
- @command{make}.
- @vindex MAKE
- @vindex AM_MAKEFLAGS
- The directories mentioned in @code{SUBDIRS} are usually direct
- children of the current directory, each subdirectory containing its
- own @file{Makefile.am} with a @code{SUBDIRS} pointing to deeper
- subdirectories. Automake can be used to construct packages of
- arbitrary depth this way.
- By default, Automake generates @file{Makefiles} that work depth-first
- in postfix order: the subdirectories are built before the current
- directory. However, it is possible to change this ordering. You can
- do this by putting @samp{.} into @code{SUBDIRS}. For instance,
- putting @samp{.} first will cause a prefix ordering of
- directories.
- Using
- @example
- SUBDIRS = lib src . test
- @end example
- @noindent
- will cause @file{lib/} to be built before @file{src/}, then the
- current directory will be built, finally the @file{test/} directory
- will be built. It is customary to arrange test directories to be
- built after everything else since they are meant to test what has
- been constructed.
- In addition to the built-in recursive targets defined by Automake
- (@code{all}, @code{check}, etc.), the developer can also define his
- own recursive targets. That is done by passing the names of such
- targets as arguments to the m4 macro @code{AM_EXTRA_RECURSIVE_TARGETS}
- in @file{configure.ac}. Automake generates rules to handle the
- recursion for such targets; and the developer can define real actions
- for them by defining corresponding @code{-local} targets.
- @example
- % @kbd{cat configure.ac}
- AC_INIT([pkg-name], [1.0]
- AM_INIT_AUTOMAKE
- AM_EXTRA_RECURSIVE_TARGETS([foo])
- AC_CONFIG_FILES([Makefile sub/Makefile sub/src/Makefile])
- AC_OUTPUT
- % @kbd{cat Makefile.am}
- SUBDIRS = sub
- foo-local:
- @@echo This will be run by "make foo".
- % @kbd{cat sub/Makefile.am}
- SUBDIRS = src
- % @kbd{cat sub/src/Makefile.am}
- foo-local:
- @@echo This too will be run by a "make foo" issued either in
- @@echo the 'sub/src/' directory, the 'sub/' directory, or the
- @@echo top-level directory.
- @end example
- @node Conditional Subdirectories
- @section Conditional Subdirectories
- @cindex Subdirectories, building conditionally
- @cindex Conditional subdirectories
- @cindex @code{SUBDIRS}, conditional
- @cindex Conditional @code{SUBDIRS}
- It is possible to define the @code{SUBDIRS} variable conditionally if,
- like in the case of GNU Inetutils, you want to only build a subset of
- the entire package.
- To illustrate how this works, let's assume we have two directories
- @file{src/} and @file{opt/}. @file{src/} should always be built, but we
- want to decide in @command{configure} whether @file{opt/} will be built
- or not. (For this example we will assume that @file{opt/} should be
- built when the variable @samp{$want_opt} was set to @samp{yes}.)
- Running @command{make} should thus recurse into @file{src/} always, and
- then maybe in @file{opt/}.
- However @samp{make dist} should always recurse into both @file{src/}
- and @file{opt/}. Because @file{opt/} should be distributed even if it
- is not needed in the current configuration. This means
- @file{opt/Makefile} should be created @emph{unconditionally}.
- There are two ways to setup a project like this. You can use Automake
- conditionals (@pxref{Conditionals}) or use Autoconf @code{AC_SUBST}
- variables (@pxref{Setting Output Variables, , Setting Output
- Variables, autoconf, The Autoconf Manual}). Using Automake
- conditionals is the preferred solution. Before we illustrate these
- two possibilities, let's introduce @code{DIST_SUBDIRS}.
- @menu
- * SUBDIRS vs DIST_SUBDIRS:: Two sets of directories
- * Subdirectories with AM_CONDITIONAL:: Specifying conditional subdirectories
- * Subdirectories with AC_SUBST:: Another way for conditional recursion
- * Unconfigured Subdirectories:: Not even creating a @samp{Makefile}
- @end menu
- @node SUBDIRS vs DIST_SUBDIRS
- @subsection @code{SUBDIRS} vs.@: @code{DIST_SUBDIRS}
- @cindex @code{DIST_SUBDIRS}, explained
- Automake considers two sets of directories, defined by the variables
- @code{SUBDIRS} and @code{DIST_SUBDIRS}.
- @code{SUBDIRS} contains the subdirectories of the current directory
- that must be built (@pxref{Subdirectories}). It must be defined
- manually; Automake will never guess a directory is to be built. As we
- will see in the next two sections, it is possible to define it
- conditionally so that some directory will be omitted from the build.
- @code{DIST_SUBDIRS} is used in rules that need to recurse in all
- directories, even those that have been conditionally left out of the
- build. Recall our example where we may not want to build subdirectory
- @file{opt/}, but yet we want to distribute it? This is where
- @code{DIST_SUBDIRS} comes into play: @samp{opt} may not appear in
- @code{SUBDIRS}, but it must appear in @code{DIST_SUBDIRS}.
- Precisely, @code{DIST_SUBDIRS} is used by @samp{make
- maintainer-clean}, @samp{make distclean} and @samp{make dist}. All
- other recursive rules use @code{SUBDIRS}.
- If @code{SUBDIRS} is defined conditionally using Automake
- conditionals, Automake will define @code{DIST_SUBDIRS} automatically
- from the possible values of @code{SUBDIRS} in all conditions.
- If @code{SUBDIRS} contains @code{AC_SUBST} variables,
- @code{DIST_SUBDIRS} will not be defined correctly because Automake
- does not know the possible values of these variables. In this case
- @code{DIST_SUBDIRS} needs to be defined manually.
- @node Subdirectories with AM_CONDITIONAL
- @subsection Subdirectories with @code{AM_CONDITIONAL}
- @cindex @code{SUBDIRS} and @code{AM_CONDITIONAL}
- @cindex @code{AM_CONDITIONAL} and @code{SUBDIRS}
- @c Keep in sync with subdir-am-cond.sh
- @file{configure} should output the @file{Makefile} for each directory
- and define a condition into which @file{opt/} should be built.
- @example
- @dots{}
- AM_CONDITIONAL([COND_OPT], [test "$want_opt" = yes])
- AC_CONFIG_FILES([Makefile src/Makefile opt/Makefile])
- @dots{}
- @end example
- Then @code{SUBDIRS} can be defined in the top-level @file{Makefile.am}
- as follows.
- @example
- if COND_OPT
- MAYBE_OPT = opt
- endif
- SUBDIRS = src $(MAYBE_OPT)
- @end example
- As you can see, running @command{make} will rightly recurse into
- @file{src/} and maybe @file{opt/}.
- @vindex DIST_SUBDIRS
- As you can't see, running @samp{make dist} will recurse into both
- @file{src/} and @file{opt/} directories because @samp{make dist}, unlike
- @samp{make all}, doesn't use the @code{SUBDIRS} variable. It uses the
- @code{DIST_SUBDIRS} variable.
- In this case Automake will define @samp{DIST_SUBDIRS = src opt}
- automatically because it knows that @code{MAYBE_OPT} can contain
- @samp{opt} in some condition.
- @node Subdirectories with AC_SUBST
- @subsection Subdirectories with @code{AC_SUBST}
- @cindex @code{SUBDIRS} and @code{AC_SUBST}
- @cindex @code{AC_SUBST} and @code{SUBDIRS}
- @c Keep in sync with subdir-ac-subst.sh
- Another possibility is to define @code{MAYBE_OPT} from
- @file{./configure} using @code{AC_SUBST}:
- @example
- @dots{}
- if test "$want_opt" = yes; then
- MAYBE_OPT=opt
- else
- MAYBE_OPT=
- fi
- AC_SUBST([MAYBE_OPT])
- AC_CONFIG_FILES([Makefile src/Makefile opt/Makefile])
- @dots{}
- @end example
- In this case the top-level @file{Makefile.am} should look as follows.
- @example
- SUBDIRS = src $(MAYBE_OPT)
- DIST_SUBDIRS = src opt
- @end example
- The drawback is that since Automake cannot guess what the possible
- values of @code{MAYBE_OPT} are, it is necessary to define
- @code{DIST_SUBDIRS}.
- @node Unconfigured Subdirectories
- @subsection Unconfigured Subdirectories
- @cindex Subdirectories, configured conditionally
- The semantics of @code{DIST_SUBDIRS} are often misunderstood by some
- users that try to @emph{configure and build} subdirectories
- conditionally. Here by configuring we mean creating the
- @file{Makefile} (it might also involve running a nested
- @command{configure} script: this is a costly operation that explains
- why people want to do it conditionally, but only the @file{Makefile}
- is relevant to the discussion).
- The above examples all assume that every @file{Makefile} is created,
- even in directories that are not going to be built. The simple reason
- is that we want @samp{make dist} to distribute even the directories
- that are not being built (e.g., platform-dependent code), hence
- @file{make dist} must recurse into the subdirectory, hence this
- directory must be configured and appear in @code{DIST_SUBDIRS}.
- Building packages that do not configure every subdirectory is a tricky
- business, and we do not recommend it to the novice as it is easy to
- produce an incomplete tarball by mistake. We will not discuss this
- topic in depth here, yet for the adventurous here are a few rules to
- remember.
- @cartouche
- @itemize
- @item @code{SUBDIRS} should always be a subset of @code{DIST_SUBDIRS}.
- It makes little sense to have a directory in @code{SUBDIRS} that
- is not in @code{DIST_SUBDIRS}. Think of the former as a way to tell
- which directories listed in the latter should be built.
- @item Any directory listed in @code{DIST_SUBDIRS} and @code{SUBDIRS}
- must be configured.
- I.e., the @file{Makefile} must exists or the recursive @command{make}
- rules will not be able to process the directory.
- @item Any configured directory must be listed in @code{DIST_SUBDIRS}.
- So that the cleaning rules remove the generated @file{Makefile}s.
- It would be correct to see @code{DIST_SUBDIRS} as a variable that
- lists all the directories that have been configured.
- @end itemize
- @end cartouche
- In order to prevent recursion in some unconfigured directory you
- must therefore ensure that this directory does not appear in
- @code{DIST_SUBDIRS} (and @code{SUBDIRS}). For instance, if you define
- @code{SUBDIRS} conditionally using @code{AC_SUBST} and do not define
- @code{DIST_SUBDIRS} explicitly, it will be default to
- @samp{$(SUBDIRS)}; another possibility is to force @code{DIST_SUBDIRS
- = $(SUBDIRS)}.
- Of course, directories that are omitted from @code{DIST_SUBDIRS} will
- not be distributed unless you make other arrangements for this to
- happen (for instance, always running @samp{make dist} in a
- configuration where all directories are known to appear in
- @code{DIST_SUBDIRS}; or writing a @code{dist-hook} target to
- distribute these directories).
- @cindex Subdirectories, not distributed
- In few packages, unconfigured directories are not even expected to
- be distributed. Although these packages do not require the
- aforementioned extra arrangements, there is another pitfall. If the
- name of a directory appears in @code{SUBDIRS} or @code{DIST_SUBDIRS},
- @command{automake} will make sure the directory exists. Consequently
- @command{automake} cannot be run on such a distribution when one
- directory has been omitted. One way to avoid this check is to use the
- @code{AC_SUBST} method to declare conditional directories; since
- @command{automake} does not know the values of @code{AC_SUBST}
- variables it cannot ensure the corresponding directory exists.
- @node Alternative
- @section An Alternative Approach to Subdirectories
- If you've ever read Peter Miller's excellent paper,
- @uref{http://miller.emu.id.au/pmiller/books/rmch/,
- Recursive Make Considered Harmful}, the preceding sections on the use of
- make recursion will probably come as unwelcome advice. For those who
- haven't read the paper, Miller's main thesis is that recursive
- @command{make} invocations are both slow and error-prone.
- Automake provides sufficient cross-directory support @footnote{We
- believe. This work is new and there are probably warts.
- @xref{Introduction}, for information on reporting bugs.} to enable you
- to write a single @file{Makefile.am} for a complex multi-directory
- package.
- By default an installable file specified in a subdirectory will have its
- directory name stripped before installation. For instance, in this
- example, the header file will be installed as
- @file{$(includedir)/stdio.h}:
- @example
- include_HEADERS = inc/stdio.h
- @end example
- @vindex nobase_
- @cindex @code{nobase_} prefix
- @cindex Path stripping, avoiding
- @cindex Avoiding path stripping
- However, the @samp{nobase_} prefix can be used to circumvent this path
- stripping. In this example, the header file will be installed as
- @file{$(includedir)/sys/types.h}:
- @example
- nobase_include_HEADERS = sys/types.h
- @end example
- @cindex @code{nobase_} and @code{dist_} or @code{nodist_}
- @cindex @code{dist_} and @code{nobase_}
- @cindex @code{nodist_} and @code{nobase_}
- @vindex dist_
- @vindex nodist_
- @samp{nobase_} should be specified first when used in conjunction with
- either @samp{dist_} or @samp{nodist_} (@pxref{Fine-grained Distribution
- Control}). For instance:
- @example
- nobase_dist_pkgdata_DATA = images/vortex.pgm sounds/whirl.ogg
- @end example
- Finally, note that a variable using the @samp{nobase_} prefix can
- often be replaced by several variables, one for each destination
- directory (@pxref{Uniform}). For instance, the last example could be
- rewritten as follows:
- @c Keep in sync with primary-prefix-couples-documented-valid.sh
- @example
- imagesdir = $(pkgdatadir)/images
- soundsdir = $(pkgdatadir)/sounds
- dist_images_DATA = images/vortex.pgm
- dist_sounds_DATA = sounds/whirl.ogg
- @end example
- @noindent
- This latter syntax makes it possible to change one destination
- directory without changing the layout of the source tree.
- Currently, @samp{nobase_*_LTLIBRARIES} are the only exception to this
- rule, in that there is no particular installation order guarantee for
- an otherwise equivalent set of variables without @samp{nobase_} prefix.
- @node Subpackages
- @section Nesting Packages
- @cindex Nesting packages
- @cindex Subpackages
- @acindex AC_CONFIG_SUBDIRS
- @acindex AC_CONFIG_AUX_DIR
- In the GNU Build System, packages can be nested to arbitrary depth.
- This means that a package can embed other packages with their own
- @file{configure}, @file{Makefile}s, etc.
- These other packages should just appear as subdirectories of their
- parent package. They must be listed in @code{SUBDIRS} like other
- ordinary directories. However the subpackage's @file{Makefile}s
- should be output by its own @file{configure} script, not by the
- parent's @file{configure}. This is achieved using the
- @code{AC_CONFIG_SUBDIRS} Autoconf macro (@pxref{Subdirectories,
- AC_CONFIG_SUBDIRS, Configuring Other Packages in Subdirectories,
- autoconf, The Autoconf Manual}).
- Here is an example package for an @code{arm} program that links with
- a @code{hand} library that is a nested package in subdirectory
- @file{hand/}.
- @code{arm}'s @file{configure.ac}:
- @example
- AC_INIT([arm], [1.0])
- AC_CONFIG_AUX_DIR([.])
- AM_INIT_AUTOMAKE
- AC_PROG_CC
- AC_CONFIG_FILES([Makefile])
- # Call hand's ./configure script recursively.
- AC_CONFIG_SUBDIRS([hand])
- AC_OUTPUT
- @end example
- @code{arm}'s @file{Makefile.am}:
- @example
- # Build the library in the hand subdirectory first.
- SUBDIRS = hand
- # Include hand's header when compiling this directory.
- AM_CPPFLAGS = -I$(srcdir)/hand
- bin_PROGRAMS = arm
- arm_SOURCES = arm.c
- # link with the hand library.
- arm_LDADD = hand/libhand.a
- @end example
- Now here is @code{hand}'s @file{hand/configure.ac}:
- @example
- AC_INIT([hand], [1.2])
- AC_CONFIG_AUX_DIR([.])
- AM_INIT_AUTOMAKE
- AC_PROG_CC
- AM_PROG_AR
- AC_PROG_RANLIB
- AC_CONFIG_FILES([Makefile])
- AC_OUTPUT
- @end example
- @noindent
- and its @file{hand/Makefile.am}:
- @example
- lib_LIBRARIES = libhand.a
- libhand_a_SOURCES = hand.c
- @end example
- When @samp{make dist} is run from the top-level directory it will
- create an archive @file{arm-1.0.tar.gz} that contains the @code{arm}
- code as well as the @file{hand} subdirectory. This package can be
- built and installed like any ordinary package, with the usual
- @samp{./configure && make && make install} sequence (the @code{hand}
- subpackage will be built and installed by the process).
- When @samp{make dist} is run from the hand directory, it will create a
- self-contained @file{hand-1.2.tar.gz} archive. So although it appears
- to be embedded in another package, it can still be used separately.
- The purpose of the @samp{AC_CONFIG_AUX_DIR([.])} instruction is to
- force Automake and Autoconf to search for auxiliary scripts in the
- current directory. For instance, this means that there will be two
- copies of @file{install-sh}: one in the top-level of the @code{arm}
- package, and another one in the @file{hand/} subdirectory for the
- @code{hand} package.
- The historical default is to search for these auxiliary scripts in
- the parent directory and the grandparent directory. So if the
- @samp{AC_CONFIG_AUX_DIR([.])} line was removed from
- @file{hand/configure.ac}, that subpackage would share the auxiliary
- script of the @code{arm} package. This may looks like a gain in size
- (a few kilobytes), but it is actually a loss of modularity as the
- @code{hand} subpackage is no longer self-contained (@samp{make dist}
- in the subdirectory will not work anymore).
- Packages that do not use Automake need more work to be integrated this
- way. @xref{Third-Party Makefiles}.
- @node Programs
- @chapter Building Programs and Libraries
- A large part of Automake's functionality is dedicated to making it easy
- to build programs and libraries.
- @menu
- * A Program:: Building a program
- * A Library:: Building a library
- * A Shared Library:: Building a Libtool library
- * Program and Library Variables:: Variables controlling program and
- library builds
- * Default _SOURCES:: Default source files
- * LIBOBJS:: Special handling for LIBOBJS and ALLOCA
- * Program Variables:: Variables used when building a program
- * Yacc and Lex:: Yacc and Lex support
- * C++ Support:: Compiling C++ sources
- * Objective C Support:: Compiling Objective C sources
- * Objective C++ Support:: Compiling Objective C++ sources
- * Unified Parallel C Support:: Compiling Unified Parallel C sources
- * Assembly Support:: Compiling assembly sources
- * Fortran 77 Support:: Compiling Fortran 77 sources
- * Fortran 9x Support:: Compiling Fortran 9x sources
- * Java Support with gcj:: Compiling Java sources using gcj
- * Vala Support:: Compiling Vala sources
- * Support for Other Languages:: Compiling other languages
- * Dependencies:: Automatic dependency tracking
- * EXEEXT:: Support for executable extensions
- @end menu
- @node A Program
- @section Building a program
- In order to build a program, you need to tell Automake which sources
- are part of it, and which libraries it should be linked with.
- This section also covers conditional compilation of sources or
- programs. Most of the comments about these also apply to libraries
- (@pxref{A Library}) and libtool libraries (@pxref{A Shared Library}).
- @menu
- * Program Sources:: Defining program sources
- * Linking:: Linking with libraries or extra objects
- * Conditional Sources:: Handling conditional sources
- * Conditional Programs:: Building a program conditionally
- @end menu
- @node Program Sources
- @subsection Defining program sources
- @cindex @code{PROGRAMS}, @code{bindir}
- @vindex _PROGRAMS
- @vindex bin_PROGRAMS
- @vindex sbin_PROGRAMS
- @vindex libexec_PROGRAMS
- @vindex pkglibexec_PROGRAMS
- @vindex noinst_PROGRAMS
- @vindex check_PROGRAMS
- In a directory containing source that gets built into a program (as
- opposed to a library or a script), the @code{PROGRAMS} primary is used.
- Programs can be installed in @code{bindir}, @code{sbindir},
- @code{libexecdir}, @code{pkglibexecdir}, or not at all
- (@code{noinst_}). They can also be built only for @samp{make check}, in
- which case the prefix is @samp{check_}.
- For instance:
- @example
- bin_PROGRAMS = hello
- @end example
- In this simple case, the resulting @file{Makefile.in} will contain code
- to generate a program named @code{hello}.
- Associated with each program are several assisting variables that are
- named after the program. These variables are all optional, and have
- reasonable defaults. Each variable, its use, and default is spelled out
- below; we use the ``hello'' example throughout.
- The variable @code{hello_SOURCES} is used to specify which source files
- get built into an executable:
- @example
- hello_SOURCES = hello.c version.c getopt.c getopt1.c getopt.h system.h
- @end example
- This causes each mentioned @file{.c} file to be compiled into the
- corresponding @file{.o}. Then all are linked to produce @file{hello}.
- @cindex @code{_SOURCES} primary, defined
- @cindex @code{SOURCES} primary, defined
- @cindex Primary variable, @code{SOURCES}
- @vindex _SOURCES
- If @code{hello_SOURCES} is not specified, then it defaults to the single
- file @file{hello.c} (@pxref{Default _SOURCES}).
- @vindex _SOURCES
- @vindex SOURCES
- Multiple programs can be built in a single directory. Multiple programs
- can share a single source file, which must be listed in each
- @code{_SOURCES} definition.
- @cindex Header files in @code{_SOURCES}
- @cindex @code{_SOURCES} and header files
- Header files listed in a @code{_SOURCES} definition will be included in
- the distribution but otherwise ignored. In case it isn't obvious, you
- should not include the header file generated by @file{configure} in a
- @code{_SOURCES} variable; this file should not be distributed. Lex
- (@file{.l}) and Yacc (@file{.y}) files can also be listed; see @ref{Yacc
- and Lex}.
- @node Linking
- @subsection Linking the program
- If you need to link against libraries that are not found by
- @command{configure}, you can use @code{LDADD} to do so. This variable is
- used to specify additional objects or libraries to link with; it is
- inappropriate for specifying specific linker flags, you should use
- @code{AM_LDFLAGS} for this purpose.
- @vindex LDADD
- @vindex AM_LDFLAGS
- @cindex @code{prog_LDADD}, defined
- Sometimes, multiple programs are built in one directory but do not share
- the same link-time requirements. In this case, you can use the
- @code{@var{prog}_LDADD} variable (where @var{prog} is the name of the
- program as it appears in some @code{_PROGRAMS} variable, and usually
- written in lowercase) to override @code{LDADD}. If this variable exists
- for a given program, then that program is not linked using @code{LDADD}.
- @vindex maude_LDADD
- For instance, in GNU cpio, @code{pax}, @code{cpio} and @code{mt} are
- linked against the library @file{libcpio.a}. However, @code{rmt} is
- built in the same directory, and has no such link requirement. Also,
- @code{mt} and @code{rmt} are only built on certain architectures. Here
- is what cpio's @file{src/Makefile.am} looks like (abridged):
- @example
- bin_PROGRAMS = cpio pax $(MT)
- libexec_PROGRAMS = $(RMT)
- EXTRA_PROGRAMS = mt rmt
- LDADD = ../lib/libcpio.a $(INTLLIBS)
- rmt_LDADD =
- cpio_SOURCES = @dots{}
- pax_SOURCES = @dots{}
- mt_SOURCES = @dots{}
- rmt_SOURCES = @dots{}
- @end example
- @cindex @code{_LDFLAGS}, defined
- @vindex maude_LDFLAGS
- @code{@var{prog}_LDADD} is inappropriate for passing program-specific
- linker flags (except for @option{-l}, @option{-L}, @option{-dlopen} and
- @option{-dlpreopen}). So, use the @code{@var{prog}_LDFLAGS} variable for
- this purpose.
- @cindex @code{_DEPENDENCIES}, defined
- @vindex maude_DEPENDENCIES
- @vindex EXTRA_maude_DEPENDENCIES
- It is also occasionally useful to have a program depend on some other
- target that is not actually part of that program. This can be done
- using either the @code{@var{prog}_DEPENDENCIES} or the
- @code{EXTRA_@var{prog}_DEPENDENCIES} variable. Each program depends on
- the contents both variables, but no further interpretation is done.
- Since these dependencies are associated to the link rule used to
- create the programs they should normally list files used by the link
- command. That is @file{*.$(OBJEXT)}, @file{*.a}, or @file{*.la}
- files. In rare cases you may need to add other kinds of files such as
- linker scripts, but @emph{listing a source file in
- @code{_DEPENDENCIES} is wrong}. If some source file needs to be built
- before all the components of a program are built, consider using the
- @code{BUILT_SOURCES} variable instead (@pxref{Sources}).
- If @code{@var{prog}_DEPENDENCIES} is not supplied, it is computed by
- Automake. The automatically-assigned value is the contents of
- @code{@var{prog}_LDADD}, with most configure substitutions, @option{-l},
- @option{-L}, @option{-dlopen} and @option{-dlpreopen} options removed. The
- configure substitutions that are left in are only @samp{$(LIBOBJS)} and
- @samp{$(ALLOCA)}; these are left because it is known that they will not
- cause an invalid value for @code{@var{prog}_DEPENDENCIES} to be
- generated.
- @ref{Conditional Sources} shows a situation where @code{_DEPENDENCIES}
- may be used.
- The @code{EXTRA_@var{prog}_DEPENDENCIES} may be useful for cases where
- you merely want to augment the @command{automake}-generated
- @code{@var{prog}_DEPENDENCIES} rather than replacing it.
- @cindex @code{LDADD} and @option{-l}
- @cindex @option{-l} and @code{LDADD}
- We recommend that you avoid using @option{-l} options in @code{LDADD}
- or @code{@var{prog}_LDADD} when referring to libraries built by your
- package. Instead, write the file name of the library explicitly as in
- the above @code{cpio} example. Use @option{-l} only to list
- third-party libraries. If you follow this rule, the default value of
- @code{@var{prog}_DEPENDENCIES} will list all your local libraries and
- omit the other ones.
- @node Conditional Sources
- @subsection Conditional compilation of sources
- You can't put a configure substitution (e.g., @samp{@@FOO@@} or
- @samp{$(FOO)} where @code{FOO} is defined via @code{AC_SUBST}) into a
- @code{_SOURCES} variable. The reason for this is a bit hard to
- explain, but suffice to say that it simply won't work. Automake will
- give an error if you try to do this.
- Fortunately there are two other ways to achieve the same result. One is
- to use configure substitutions in @code{_LDADD} variables, the other is
- to use an Automake conditional.
- @subsubheading Conditional Compilation using @code{_LDADD} Substitutions
- @cindex @code{EXTRA_prog_SOURCES}, defined
- Automake must know all the source files that could possibly go into a
- program, even if not all the files are built in every circumstance. Any
- files that are only conditionally built should be listed in the
- appropriate @code{EXTRA_} variable. For instance, if
- @file{hello-linux.c} or @file{hello-generic.c} were conditionally included
- in @code{hello}, the @file{Makefile.am} would contain:
- @example
- bin_PROGRAMS = hello
- hello_SOURCES = hello-common.c
- EXTRA_hello_SOURCES = hello-linux.c hello-generic.c
- hello_LDADD = $(HELLO_SYSTEM)
- hello_DEPENDENCIES = $(HELLO_SYSTEM)
- @end example
- @noindent
- You can then setup the @samp{$(HELLO_SYSTEM)} substitution from
- @file{configure.ac}:
- @example
- @dots{}
- case $host in
- *linux*) HELLO_SYSTEM='hello-linux.$(OBJEXT)' ;;
- *) HELLO_SYSTEM='hello-generic.$(OBJEXT)' ;;
- esac
- AC_SUBST([HELLO_SYSTEM])
- @dots{}
- @end example
- In this case, the variable @code{HELLO_SYSTEM} should be replaced by
- either @file{hello-linux.o} or @file{hello-generic.o}, and added to
- both @code{hello_DEPENDENCIES} and @code{hello_LDADD} in order to be
- built and linked in.
- @subsubheading Conditional Compilation using Automake Conditionals
- An often simpler way to compile source files conditionally is to use
- Automake conditionals. For instance, you could use this
- @file{Makefile.am} construct to build the same @file{hello} example:
- @example
- bin_PROGRAMS = hello
- if LINUX
- hello_SOURCES = hello-linux.c hello-common.c
- else
- hello_SOURCES = hello-generic.c hello-common.c
- endif
- @end example
- In this case, @file{configure.ac} should setup the @code{LINUX}
- conditional using @code{AM_CONDITIONAL} (@pxref{Conditionals}).
- When using conditionals like this you don't need to use the
- @code{EXTRA_} variable, because Automake will examine the contents of
- each variable to construct the complete list of source files.
- If your program uses a lot of files, you will probably prefer a
- conditional @samp{+=}.
- @example
- bin_PROGRAMS = hello
- hello_SOURCES = hello-common.c
- if LINUX
- hello_SOURCES += hello-linux.c
- else
- hello_SOURCES += hello-generic.c
- endif
- @end example
- @node Conditional Programs
- @subsection Conditional compilation of programs
- @cindex Conditional programs
- @cindex Programs, conditional
- Sometimes it is useful to determine the programs that are to be built
- at configure time. For instance, GNU @code{cpio} only builds
- @code{mt} and @code{rmt} under special circumstances. The means to
- achieve conditional compilation of programs are the same you can use
- to compile source files conditionally: substitutions or conditionals.
- @subsubheading Conditional Programs using @command{configure} Substitutions
- @vindex EXTRA_PROGRAMS
- @cindex @code{EXTRA_PROGRAMS}, defined
- In this case, you must notify Automake of all the programs that can
- possibly be built, but at the same time cause the generated
- @file{Makefile.in} to use the programs specified by @command{configure}.
- This is done by having @command{configure} substitute values into each
- @code{_PROGRAMS} definition, while listing all optionally built programs
- in @code{EXTRA_PROGRAMS}.
- @example
- bin_PROGRAMS = cpio pax $(MT)
- libexec_PROGRAMS = $(RMT)
- EXTRA_PROGRAMS = mt rmt
- @end example
- As explained in @ref{EXEEXT}, Automake will rewrite
- @code{bin_PROGRAMS}, @code{libexec_PROGRAMS}, and
- @code{EXTRA_PROGRAMS}, appending @samp{$(EXEEXT)} to each binary.
- Obviously it cannot rewrite values obtained at run-time through
- @command{configure} substitutions, therefore you should take care of
- appending @samp{$(EXEEXT)} yourself, as in @samp{AC_SUBST([MT],
- ['mt$@{EXEEXT@}'])}.
- @subsubheading Conditional Programs using Automake Conditionals
- You can also use Automake conditionals (@pxref{Conditionals}) to
- select programs to be built. In this case you don't have to worry
- about @samp{$(EXEEXT)} or @code{EXTRA_PROGRAMS}.
- @c Keep in sync with exeext.sh
- @example
- bin_PROGRAMS = cpio pax
- if WANT_MT
- bin_PROGRAMS += mt
- endif
- if WANT_RMT
- libexec_PROGRAMS = rmt
- endif
- @end example
- @node A Library
- @section Building a library
- @cindex @code{_LIBRARIES} primary, defined
- @cindex @code{LIBRARIES} primary, defined
- @cindex Primary variable, @code{LIBRARIES}
- @vindex _LIBRARIES
- @vindex lib_LIBRARIES
- @vindex pkglib_LIBRARIES
- @vindex noinst_LIBRARIES
- Building a library is much like building a program. In this case, the
- name of the primary is @code{LIBRARIES}. Libraries can be installed in
- @code{libdir} or @code{pkglibdir}.
- @xref{A Shared Library}, for information on how to build shared
- libraries using libtool and the @code{LTLIBRARIES} primary.
- Each @code{_LIBRARIES} variable is a list of the libraries to be built.
- For instance, to create a library named @file{libcpio.a}, but not install
- it, you would write:
- @example
- noinst_LIBRARIES = libcpio.a
- libcpio_a_SOURCES = @dots{}
- @end example
- The sources that go into a library are determined exactly as they are
- for programs, via the @code{_SOURCES} variables. Note that the library
- name is canonicalized (@pxref{Canonicalization}), so the @code{_SOURCES}
- variable corresponding to @file{libcpio.a} is @samp{libcpio_a_SOURCES},
- not @samp{libcpio.a_SOURCES}.
- @vindex maude_LIBADD
- Extra objects can be added to a library using the
- @code{@var{library}_LIBADD} variable. This should be used for objects
- determined by @command{configure}. Again from @code{cpio}:
- @c Keep in sync with pr401c.sh
- @example
- libcpio_a_LIBADD = $(LIBOBJS) $(ALLOCA)
- @end example
- In addition, sources for extra objects that will not exist until
- configure-time must be added to the @code{BUILT_SOURCES} variable
- (@pxref{Sources}).
- Building a static library is done by compiling all object files, then
- by invoking @samp{$(AR) $(ARFLAGS)} followed by the name of the
- library and the list of objects, and finally by calling
- @samp{$(RANLIB)} on that library. You should call
- @code{AC_PROG_RANLIB} from your @file{configure.ac} to define
- @code{RANLIB} (Automake will complain otherwise). You should also
- call @code{AM_PROG_AR} to define @code{AR}, in order to support unusual
- archivers such as Microsoft lib. @code{ARFLAGS} will default to
- @code{cru}; you can override this variable by setting it in your
- @file{Makefile.am} or by @code{AC_SUBST}ing it from your
- @file{configure.ac}. You can override the @code{AR} variable by
- defining a per-library @code{maude_AR} variable (@pxref{Program and
- Library Variables}).
- @cindex Empty libraries
- Be careful when selecting library components conditionally. Because
- building an empty library is not portable, you should ensure that any
- library always contains at least one object.
- To use a static library when building a program, add it to
- @code{LDADD} for this program. In the following example, the program
- @file{cpio} is statically linked with the library @file{libcpio.a}.
- @example
- noinst_LIBRARIES = libcpio.a
- libcpio_a_SOURCES = @dots{}
- bin_PROGRAMS = cpio
- cpio_SOURCES = cpio.c @dots{}
- cpio_LDADD = libcpio.a
- @end example
- @node A Shared Library
- @section Building a Shared Library
- @cindex Shared libraries, support for
- Building shared libraries portably is a relatively complex matter.
- For this reason, GNU Libtool (@pxref{Top, , Introduction, libtool, The
- Libtool Manual}) was created to help build shared libraries in a
- platform-independent way.
- @menu
- * Libtool Concept:: Introducing Libtool
- * Libtool Libraries:: Declaring Libtool Libraries
- * Conditional Libtool Libraries:: Building Libtool Libraries Conditionally
- * Conditional Libtool Sources:: Choosing Library Sources Conditionally
- * Libtool Convenience Libraries:: Building Convenience Libtool Libraries
- * Libtool Modules:: Building Libtool Modules
- * Libtool Flags:: Using _LIBADD, _LDFLAGS, and _LIBTOOLFLAGS
- * LTLIBOBJS:: Using $(LTLIBOBJS) and $(LTALLOCA)
- * Libtool Issues:: Common Issues Related to Libtool's Use
- @end menu
- @node Libtool Concept
- @subsection The Libtool Concept
- @cindex @command{libtool}, introduction
- @cindex libtool library, definition
- @cindex suffix @file{.la}, defined
- @cindex @file{.la} suffix, defined
- Libtool abstracts shared and static libraries into a unified concept
- henceforth called @dfn{libtool libraries}. Libtool libraries are
- files using the @file{.la} suffix, and can designate a static library,
- a shared library, or maybe both. Their exact nature cannot be
- determined until @file{./configure} is run: not all platforms support
- all kinds of libraries, and users can explicitly select which
- libraries should be built. (However the package's maintainers can
- tune the default, @pxref{AC_PROG_LIBTOOL, , The @code{AC_PROG_LIBTOOL}
- macro, libtool, The Libtool Manual}.)
- @cindex suffix @file{.lo}, defined
- Because object files for shared and static libraries must be compiled
- differently, libtool is also used during compilation. Object files
- built by libtool are called @dfn{libtool objects}: these are files
- using the @file{.lo} suffix. Libtool libraries are built from these
- libtool objects.
- You should not assume anything about the structure of @file{.la} or
- @file{.lo} files and how libtool constructs them: this is libtool's
- concern, and the last thing one wants is to learn about libtool's
- guts. However the existence of these files matters, because they are
- used as targets and dependencies in @file{Makefile}s rules when
- building libtool libraries. There are situations where you may have
- to refer to these, for instance when expressing dependencies for
- building source files conditionally (@pxref{Conditional Libtool
- Sources}).
- @cindex @file{libltdl}, introduction
- People considering writing a plug-in system, with dynamically loaded
- modules, should look into @file{libltdl}: libtool's dlopening library
- (@pxref{Using libltdl, , Using libltdl, libtool, The Libtool Manual}).
- This offers a portable dlopening facility to load libtool libraries
- dynamically, and can also achieve static linking where unavoidable.
- Before we discuss how to use libtool with Automake in details, it
- should be noted that the libtool manual also has a section about how
- to use Automake with libtool (@pxref{Using Automake, , Using Automake
- with Libtool, libtool, The Libtool Manual}).
- @node Libtool Libraries
- @subsection Building Libtool Libraries
- @cindex @code{_LTLIBRARIES} primary, defined
- @cindex @code{LTLIBRARIES} primary, defined
- @cindex Primary variable, @code{LTLIBRARIES}
- @cindex Example of shared libraries
- @vindex lib_LTLIBRARIES
- @vindex pkglib_LTLIBRARIES
- @vindex _LTLIBRARIES
- Automake uses libtool to build libraries declared with the
- @code{LTLIBRARIES} primary. Each @code{_LTLIBRARIES} variable is a
- list of libtool libraries to build. For instance, to create a libtool
- library named @file{libgettext.la}, and install it in @code{libdir},
- write:
- @example
- lib_LTLIBRARIES = libgettext.la
- libgettext_la_SOURCES = gettext.c gettext.h @dots{}
- @end example
- Automake predefines the variable @code{pkglibdir}, so you can use
- @code{pkglib_LTLIBRARIES} to install libraries in
- @samp{$(libdir)/@@PACKAGE@@/}.
- If @file{gettext.h} is a public header file that needs to be installed
- in order for people to use the library, it should be declared using a
- @code{_HEADERS} variable, not in @code{libgettext_la_SOURCES}.
- Headers listed in the latter should be internal headers that are not
- part of the public interface.
- @example
- lib_LTLIBRARIES = libgettext.la
- libgettext_la_SOURCES = gettext.c @dots{}
- include_HEADERS = gettext.h @dots{}
- @end example
- A package can build and install such a library along with other
- programs that use it. This dependency should be specified using
- @code{LDADD}. The following example builds a program named
- @file{hello} that is linked with @file{libgettext.la}.
- @example
- lib_LTLIBRARIES = libgettext.la
- libgettext_la_SOURCES = gettext.c @dots{}
- bin_PROGRAMS = hello
- hello_SOURCES = hello.c @dots{}
- hello_LDADD = libgettext.la
- @end example
- @noindent
- Whether @file{hello} is statically or dynamically linked with
- @file{libgettext.la} is not yet known: this will depend on the
- configuration of libtool and the capabilities of the host.
- @node Conditional Libtool Libraries
- @subsection Building Libtool Libraries Conditionally
- @cindex libtool libraries, conditional
- @cindex conditional libtool libraries
- Like conditional programs (@pxref{Conditional Programs}), there are
- two main ways to build conditional libraries: using Automake
- conditionals or using Autoconf @code{AC_SUBST}itutions.
- The important implementation detail you have to be aware of is that
- the place where a library will be installed matters to libtool: it
- needs to be indicated @emph{at link-time} using the @option{-rpath}
- option.
- For libraries whose destination directory is known when Automake runs,
- Automake will automatically supply the appropriate @option{-rpath}
- option to libtool. This is the case for libraries listed explicitly in
- some installable @code{_LTLIBRARIES} variables such as
- @code{lib_LTLIBRARIES}.
- However, for libraries determined at configure time (and thus
- mentioned in @code{EXTRA_LTLIBRARIES}), Automake does not know the
- final installation directory. For such libraries you must add the
- @option{-rpath} option to the appropriate @code{_LDFLAGS} variable by
- hand.
- The examples below illustrate the differences between these two methods.
- Here is an example where @code{WANTEDLIBS} is an @code{AC_SUBST}ed
- variable set at @file{./configure}-time to either @file{libfoo.la},
- @file{libbar.la}, both, or none. Although @samp{$(WANTEDLIBS)}
- appears in the @code{lib_LTLIBRARIES}, Automake cannot guess it
- relates to @file{libfoo.la} or @file{libbar.la} at the time it creates
- the link rule for these two libraries. Therefore the @option{-rpath}
- argument must be explicitly supplied.
- @c Keep in sync with ltcond.sh
- @example
- EXTRA_LTLIBRARIES = libfoo.la libbar.la
- lib_LTLIBRARIES = $(WANTEDLIBS)
- libfoo_la_SOURCES = foo.c @dots{}
- libfoo_la_LDFLAGS = -rpath '$(libdir)'
- libbar_la_SOURCES = bar.c @dots{}
- libbar_la_LDFLAGS = -rpath '$(libdir)'
- @end example
- Here is how the same @file{Makefile.am} would look using Automake
- conditionals named @code{WANT_LIBFOO} and @code{WANT_LIBBAR}. Now
- Automake is able to compute the @option{-rpath} setting itself, because
- it's clear that both libraries will end up in @samp{$(libdir)} if they
- are installed.
- @c Keep in sync with ltcond.sh
- @example
- lib_LTLIBRARIES =
- if WANT_LIBFOO
- lib_LTLIBRARIES += libfoo.la
- endif
- if WANT_LIBBAR
- lib_LTLIBRARIES += libbar.la
- endif
- libfoo_la_SOURCES = foo.c @dots{}
- libbar_la_SOURCES = bar.c @dots{}
- @end example
- @node Conditional Libtool Sources
- @subsection Libtool Libraries with Conditional Sources
- Conditional compilation of sources in a library can be achieved in the
- same way as conditional compilation of sources in a program
- (@pxref{Conditional Sources}). The only difference is that
- @code{_LIBADD} should be used instead of @code{_LDADD} and that it
- should mention libtool objects (@file{.lo} files).
- So, to mimic the @file{hello} example from @ref{Conditional Sources},
- we could build a @file{libhello.la} library using either
- @file{hello-linux.c} or @file{hello-generic.c} with the following
- @file{Makefile.am}.
- @c Keep in sync with ltcond2.sh
- @example
- lib_LTLIBRARIES = libhello.la
- libhello_la_SOURCES = hello-common.c
- EXTRA_libhello_la_SOURCES = hello-linux.c hello-generic.c
- libhello_la_LIBADD = $(HELLO_SYSTEM)
- libhello_la_DEPENDENCIES = $(HELLO_SYSTEM)
- @end example
- @noindent
- And make sure @command{configure} defines @code{HELLO_SYSTEM} as
- either @file{hello-linux.lo} or @file{hello-@-generic.lo}.
- Or we could simply use an Automake conditional as follows.
- @c Keep in sync with ltcond2.sh
- @example
- lib_LTLIBRARIES = libhello.la
- libhello_la_SOURCES = hello-common.c
- if LINUX
- libhello_la_SOURCES += hello-linux.c
- else
- libhello_la_SOURCES += hello-generic.c
- endif
- @end example
- @node Libtool Convenience Libraries
- @subsection Libtool Convenience Libraries
- @cindex convenience libraries, libtool
- @cindex libtool convenience libraries
- @vindex noinst_LTLIBRARIES
- @vindex check_LTLIBRARIES
- Sometimes you want to build libtool libraries that should not be
- installed. These are called @dfn{libtool convenience libraries} and
- are typically used to encapsulate many sublibraries, later gathered
- into one big installed library.
- Libtool convenience libraries are declared by directory-less variables
- such as @code{noinst_LTLIBRARIES}, @code{check_LTLIBRARIES}, or even
- @code{EXTRA_LTLIBRARIES}. Unlike installed libtool libraries they do
- not need an @option{-rpath} flag at link time (actually this is the only
- difference).
- Convenience libraries listed in @code{noinst_LTLIBRARIES} are always
- built. Those listed in @code{check_LTLIBRARIES} are built only upon
- @samp{make check}. Finally, libraries listed in
- @code{EXTRA_LTLIBRARIES} are never built explicitly: Automake outputs
- rules to build them, but if the library does not appear as a Makefile
- dependency anywhere it won't be built (this is why
- @code{EXTRA_LTLIBRARIES} is used for conditional compilation).
- Here is a sample setup merging libtool convenience libraries from
- subdirectories into one main @file{libtop.la} library.
- @c Keep in sync with ltconv.sh
- @example
- # -- Top-level Makefile.am --
- SUBDIRS = sub1 sub2 @dots{}
- lib_LTLIBRARIES = libtop.la
- libtop_la_SOURCES =
- libtop_la_LIBADD = \
- sub1/libsub1.la \
- sub2/libsub2.la \
- @dots{}
- # -- sub1/Makefile.am --
- noinst_LTLIBRARIES = libsub1.la
- libsub1_la_SOURCES = @dots{}
- # -- sub2/Makefile.am --
- # showing nested convenience libraries
- SUBDIRS = sub2.1 sub2.2 @dots{}
- noinst_LTLIBRARIES = libsub2.la
- libsub2_la_SOURCES =
- libsub2_la_LIBADD = \
- sub21/libsub21.la \
- sub22/libsub22.la \
- @dots{}
- @end example
- When using such setup, beware that @command{automake} will assume
- @file{libtop.la} is to be linked with the C linker. This is because
- @code{libtop_la_SOURCES} is empty, so @command{automake} picks C as
- default language. If @code{libtop_la_SOURCES} was not empty,
- @command{automake} would select the linker as explained in @ref{How
- the Linker is Chosen}.
- If one of the sublibraries contains non-C source, it is important that
- the appropriate linker be chosen. One way to achieve this is to
- pretend that there is such a non-C file among the sources of the
- library, thus forcing @command{automake} to select the appropriate
- linker. Here is the top-level @file{Makefile} of our example updated
- to force C++ linking.
- @example
- SUBDIRS = sub1 sub2 @dots{}
- lib_LTLIBRARIES = libtop.la
- libtop_la_SOURCES =
- # Dummy C++ source to cause C++ linking.
- nodist_EXTRA_libtop_la_SOURCES = dummy.cxx
- libtop_la_LIBADD = \
- sub1/libsub1.la \
- sub2/libsub2.la \
- @dots{}
- @end example
- @samp{EXTRA_*_SOURCES} variables are used to keep track of source
- files that might be compiled (this is mostly useful when doing
- conditional compilation using @code{AC_SUBST}, @pxref{Conditional
- Libtool Sources}), and the @code{nodist_} prefix means the listed
- sources are not to be distributed (@pxref{Program and Library
- Variables}). In effect the file @file{dummy.cxx} does not need to
- exist in the source tree. Of course if you have some real source file
- to list in @code{libtop_la_SOURCES} there is no point in cheating with
- @code{nodist_EXTRA_libtop_la_SOURCES}.
- @node Libtool Modules
- @subsection Libtool Modules
- @cindex modules, libtool
- @cindex libtool modules
- @cindex @option{-module}, libtool
- These are libtool libraries meant to be dlopened. They are
- indicated to libtool by passing @option{-module} at link-time.
- @example
- pkglib_LTLIBRARIES = mymodule.la
- mymodule_la_SOURCES = doit.c
- mymodule_la_LDFLAGS = -module
- @end example
- Ordinarily, Automake requires that a library's name start with
- @code{lib}. However, when building a dynamically loadable module you
- might wish to use a "nonstandard" name. Automake will not complain
- about such nonstandard names if it knows the library being built is a
- libtool module, i.e., if @option{-module} explicitly appears in the
- library's @code{_LDFLAGS} variable (or in the common @code{AM_LDFLAGS}
- variable when no per-library @code{_LDFLAGS} variable is defined).
- As always, @code{AC_SUBST} variables are black boxes to Automake since
- their values are not yet known when @command{automake} is run.
- Therefore if @option{-module} is set via such a variable, Automake
- cannot notice it and will proceed as if the library was an ordinary
- libtool library, with strict naming.
- If @code{mymodule_la_SOURCES} is not specified, then it defaults to
- the single file @file{mymodule.c} (@pxref{Default _SOURCES}).
- @node Libtool Flags
- @subsection @code{_LIBADD}, @code{_LDFLAGS}, and @code{_LIBTOOLFLAGS}
- @cindex @code{_LIBADD}, libtool
- @cindex @code{_LDFLAGS}, libtool
- @cindex @code{_LIBTOOLFLAGS}, libtool
- @vindex AM_LIBTOOLFLAGS
- @vindex LIBTOOLFLAGS
- @vindex maude_LIBTOOLFLAGS
- As shown in previous sections, the @samp{@var{library}_LIBADD}
- variable should be used to list extra libtool objects (@file{.lo}
- files) or libtool libraries (@file{.la}) to add to @var{library}.
- The @samp{@var{library}_LDFLAGS} variable is the place to list
- additional libtool linking flags, such as @option{-version-info},
- @option{-static}, and a lot more. @xref{Link mode, , Link mode,
- libtool, The Libtool Manual}.
- The @command{libtool} command has two kinds of options: mode-specific
- options and generic options. Mode-specific options such as the
- aforementioned linking flags should be lumped with the other flags
- passed to the tool invoked by @command{libtool} (hence the use of
- @samp{@var{library}_LDFLAGS} for libtool linking flags). Generic
- options include @option{--tag=@var{tag}} and @option{--silent}
- (@pxref{Invoking libtool, , Invoking @command{libtool}, libtool, The
- Libtool Manual} for more options) should appear before the mode
- selection on the command line; in @file{Makefile.am}s they should
- be listed in the @samp{@var{library}_LIBTOOLFLAGS} variable.
- If @samp{@var{library}_LIBTOOLFLAGS} is not defined, then the variable
- @code{AM_LIBTOOLFLAGS} is used instead.
- These flags are passed to libtool after the @option{--tag=@var{tag}}
- option computed by Automake (if any), so
- @samp{@var{library}_LIBTOOLFLAGS} (or @code{AM_LIBTOOLFLAGS}) is a
- good place to override or supplement the @option{--tag=@var{tag}}
- setting.
- The libtool rules also use a @code{LIBTOOLFLAGS} variable that should
- not be set in @file{Makefile.am}: this is a user variable (@pxref{Flag
- Variables Ordering}. It allows users to run @samp{make
- LIBTOOLFLAGS=--silent}, for instance. Note that the verbosity of
- @command{libtool} can also be influenced by the Automake support
- for silent rules (@pxref{Automake Silent Rules}).
- @node LTLIBOBJS, Libtool Issues, Libtool Flags, A Shared Library
- @subsection @code{LTLIBOBJS} and @code{LTALLOCA}
- @cindex @code{LTLIBOBJS}, special handling
- @cindex @code{LIBOBJS}, and Libtool
- @cindex @code{LTALLOCA}, special handling
- @cindex @code{ALLOCA}, and Libtool
- @vindex LTLIBOBJS
- @vindex LIBOBJS
- @vindex LTALLOCA
- @vindex ALLOCA
- @acindex AC_LIBOBJ
- Where an ordinary library might include @samp{$(LIBOBJS)} or
- @samp{$(ALLOCA)} (@pxref{LIBOBJS}), a libtool library must use
- @samp{$(LTLIBOBJS)} or @samp{$(LTALLOCA)}. This is required because
- the object files that libtool operates on do not necessarily end in
- @file{.o}.
- Nowadays, the computation of @code{LTLIBOBJS} from @code{LIBOBJS} is
- performed automatically by Autoconf (@pxref{AC_LIBOBJ vs LIBOBJS, ,
- @code{AC_LIBOBJ} vs.@: @code{LIBOBJS}, autoconf, The Autoconf Manual}).
- @node Libtool Issues
- @subsection Common Issues Related to Libtool's Use
- @menu
- * Error required file ltmain.sh not found:: The need to run libtoolize
- * Objects created both with libtool and without:: Avoid a specific build race
- @end menu
- @node Error required file ltmain.sh not found
- @subsubsection Error: @samp{required file `./ltmain.sh' not found}
- @cindex @file{ltmain.sh} not found
- @cindex @command{libtoolize}, no longer run by @command{automake}
- @cindex @command{libtoolize} and @command{autoreconf}
- @cindex @command{autoreconf} and @command{libtoolize}
- @cindex @file{bootstrap} and @command{autoreconf}
- @cindex @file{autogen.sh} and @command{autoreconf}
- Libtool comes with a tool called @command{libtoolize} that will
- install libtool's supporting files into a package. Running this
- command will install @file{ltmain.sh}. You should execute it before
- @command{aclocal} and @command{automake}.
- People upgrading old packages to newer autotools are likely to face
- this issue because older Automake versions used to call
- @command{libtoolize}. Therefore old build scripts do not call
- @command{libtoolize}.
- Since Automake 1.6, it has been decided that running
- @command{libtoolize} was none of Automake's business. Instead, that
- functionality has been moved into the @command{autoreconf} command
- (@pxref{autoreconf Invocation, , Using @command{autoreconf}, autoconf,
- The Autoconf Manual}). If you do not want to remember what to run and
- when, just learn the @command{autoreconf} command. Hopefully,
- replacing existing @file{bootstrap} or @file{autogen.sh} scripts by
- a call to @command{autoreconf} should also free you from any similar
- incompatible change in the future.
- @node Objects created both with libtool and without
- @subsubsection Objects @samp{created with both libtool and without}
- Sometimes, the same source file is used both to build a libtool
- library and to build another non-libtool target (be it a program or
- another library).
- Let's consider the following @file{Makefile.am}.
- @example
- bin_PROGRAMS = prog
- prog_SOURCES = prog.c foo.c @dots{}
- lib_LTLIBRARIES = libfoo.la
- libfoo_la_SOURCES = foo.c @dots{}
- @end example
- @noindent
- (In this trivial case the issue could be avoided by linking
- @file{libfoo.la} with @file{prog} instead of listing @file{foo.c} in
- @code{prog_SOURCES}. But let's assume we really want to keep
- @file{prog} and @file{libfoo.la} separate.)
- Technically, it means that we should build @file{foo.$(OBJEXT)} for
- @file{prog}, and @file{foo.lo} for @file{libfoo.la}. The problem is
- that in the course of creating @file{foo.lo}, libtool may erase (or
- replace) @file{foo.$(OBJEXT)}, and this cannot be avoided.
- Therefore, when Automake detects this situation it will complain
- with a message such as
- @example
- object 'foo.$(OBJEXT)' created both with libtool and without
- @end example
- A workaround for this issue is to ensure that these two objects get
- different basenames. As explained in @ref{Renamed Objects}, this
- happens automatically when per-targets flags are used.
- @example
- bin_PROGRAMS = prog
- prog_SOURCES = prog.c foo.c @dots{}
- prog_CFLAGS = $(AM_CFLAGS)
- lib_LTLIBRARIES = libfoo.la
- libfoo_la_SOURCES = foo.c @dots{}
- @end example
- @noindent
- Adding @samp{prog_CFLAGS = $(AM_CFLAGS)} is almost a no-op, because
- when the @code{prog_CFLAGS} is defined, it is used instead of
- @code{AM_CFLAGS}. However as a side effect it will cause
- @file{prog.c} and @file{foo.c} to be compiled as
- @file{prog-prog.$(OBJEXT)} and @file{prog-foo.$(OBJEXT)}, which solves
- the issue.
- @node Program and Library Variables
- @section Program and Library Variables
- Associated with each program is a collection of variables that can be
- used to modify how that program is built. There is a similar list of
- such variables for each library. The canonical name of the program (or
- library) is used as a base for naming these variables.
- In the list below, we use the name ``maude'' to refer to the program or
- library. In your @file{Makefile.am} you would replace this with the
- canonical name of your program. This list also refers to ``maude'' as a
- program, but in general the same rules apply for both static and dynamic
- libraries; the documentation below notes situations where programs and
- libraries differ.
- @vtable @code
- @item maude_SOURCES
- This variable, if it exists, lists all the source files that are
- compiled to build the program. These files are added to the
- distribution by default. When building the program, Automake will cause
- each source file to be compiled to a single @file{.o} file (or
- @file{.lo} when using libtool). Normally these object files are named
- after the source file, but other factors can change this. If a file in
- the @code{_SOURCES} variable has an unrecognized extension, Automake
- will do one of two things with it. If a suffix rule exists for turning
- files with the unrecognized extension into @file{.o} files, then
- @command{automake} will treat this file as it will any other source file
- (@pxref{Support for Other Languages}). Otherwise, the file will be
- ignored as though it were a header file.
- The prefixes @code{dist_} and @code{nodist_} can be used to control
- whether files listed in a @code{_SOURCES} variable are distributed.
- @code{dist_} is redundant, as sources are distributed by default, but it
- can be specified for clarity if desired.
- It is possible to have both @code{dist_} and @code{nodist_} variants of
- a given @code{_SOURCES} variable at once; this lets you easily
- distribute some files and not others, for instance:
- @example
- nodist_maude_SOURCES = nodist.c
- dist_maude_SOURCES = dist-me.c
- @end example
- By default the output file (on Unix systems, the @file{.o} file) will
- be put into the current build directory. However, if the option
- @option{subdir-objects} is in effect in the current directory then the
- @file{.o} file will be put into the subdirectory named after the
- source file. For instance, with @option{subdir-objects} enabled,
- @file{sub/dir/file.c} will be compiled to @file{sub/dir/file.o}. Some
- people prefer this mode of operation. You can specify
- @option{subdir-objects} in @code{AUTOMAKE_OPTIONS} (@pxref{Options}).
- @cindex Subdirectory, objects in
- @cindex Objects in subdirectory
- @item EXTRA_maude_SOURCES
- Automake needs to know the list of files you intend to compile
- @emph{statically}. For one thing, this is the only way Automake has of
- knowing what sort of language support a given @file{Makefile.in}
- requires. @footnote{There are other, more obscure reasons for
- this limitation as well.} This means that, for example, you can't put a
- configure substitution like @samp{@@my_sources@@} into a @samp{_SOURCES}
- variable. If you intend to conditionally compile source files and use
- @file{configure} to substitute the appropriate object names into, e.g.,
- @code{_LDADD} (see below), then you should list the corresponding source
- files in the @code{EXTRA_} variable.
- This variable also supports @code{dist_} and @code{nodist_} prefixes.
- For instance, @code{nodist_EXTRA_maude_SOURCES} would list extra
- sources that may need to be built, but should not be distributed.
- @item maude_AR
- A static library is created by default by invoking @samp{$(AR)
- $(ARFLAGS)} followed by the name of the library and then the objects
- being put into the library. You can override this by setting the
- @code{_AR} variable. This is usually used with C++; some C++
- compilers require a special invocation in order to instantiate all the
- templates that should go into a library. For instance, the SGI C++
- compiler likes this variable set like so:
- @example
- libmaude_a_AR = $(CXX) -ar -o
- @end example
- @item maude_LIBADD
- Extra objects can be added to a @emph{library} using the @code{_LIBADD}
- variable. For instance, this should be used for objects determined by
- @command{configure} (@pxref{A Library}).
- In the case of libtool libraries, @code{maude_LIBADD} can also refer
- to other libtool libraries.
- @item maude_LDADD
- Extra objects (@file{*.$(OBJEXT)}) and libraries (@file{*.a},
- @file{*.la}) can be added to a @emph{program} by listing them in the
- @code{_LDADD} variable. For instance, this should be used for objects
- determined by @command{configure} (@pxref{Linking}).
- @code{_LDADD} and @code{_LIBADD} are inappropriate for passing
- program-specific linker flags (except for @option{-l}, @option{-L},
- @option{-dlopen} and @option{-dlpreopen}). Use the @code{_LDFLAGS} variable
- for this purpose.
- For instance, if your @file{configure.ac} uses @code{AC_PATH_XTRA}, you
- could link your program against the X libraries like so:
- @example
- maude_LDADD = $(X_PRE_LIBS) $(X_LIBS) $(X_EXTRA_LIBS)
- @end example
- We recommend that you use @option{-l} and @option{-L} only when
- referring to third-party libraries, and give the explicit file names
- of any library built by your package. Doing so will ensure that
- @code{maude_DEPENDENCIES} (see below) is correctly defined by default.
- @item maude_LDFLAGS
- This variable is used to pass extra flags to the link step of a program
- or a shared library. It overrides the @code{AM_LDFLAGS} variable.
- @item maude_LIBTOOLFLAGS
- This variable is used to pass extra options to @command{libtool}.
- It overrides the @code{AM_LIBTOOLFLAGS} variable.
- These options are output before @command{libtool}'s @option{--mode=@var{mode}}
- option, so they should not be mode-specific options (those belong to
- the compiler or linker flags). @xref{Libtool Flags}.
- @item maude_DEPENDENCIES
- @itemx EXTRA_maude_DEPENDENCIES
- It is also occasionally useful to have a target (program or library)
- depend on some other file that is not actually part of that target.
- This can be done using the @code{_DEPENDENCIES} variable. Each
- target depends on the contents of such a variable, but no further
- interpretation is done.
- Since these dependencies are associated to the link rule used to
- create the programs they should normally list files used by the link
- command. That is @file{*.$(OBJEXT)}, @file{*.a}, or @file{*.la} files
- for programs; @file{*.lo} and @file{*.la} files for Libtool libraries;
- and @file{*.$(OBJEXT)} files for static libraries. In rare cases you
- may need to add other kinds of files such as linker scripts, but
- @emph{listing a source file in @code{_DEPENDENCIES} is wrong}. If
- some source file needs to be built before all the components of a
- program are built, consider using the @code{BUILT_SOURCES} variable
- (@pxref{Sources}).
- If @code{_DEPENDENCIES} is not supplied, it is computed by Automake.
- The automatically-assigned value is the contents of @code{_LDADD} or
- @code{_LIBADD}, with most configure substitutions, @option{-l}, @option{-L},
- @option{-dlopen} and @option{-dlpreopen} options removed. The configure
- substitutions that are left in are only @samp{$(LIBOBJS)} and
- @samp{$(ALLOCA)}; these are left because it is known that they will not
- cause an invalid value for @code{_DEPENDENCIES} to be generated.
- @code{_DEPENDENCIES} is more likely used to perform conditional
- compilation using an @code{AC_SUBST} variable that contains a list of
- objects. @xref{Conditional Sources}, and @ref{Conditional Libtool
- Sources}.
- The @code{EXTRA_*_DEPENDENCIES} variable may be useful for cases where
- you merely want to augment the @command{automake}-generated
- @code{_DEPENDENCIES} variable rather than replacing it.
- @item maude_LINK
- You can override the linker on a per-program basis. By default the
- linker is chosen according to the languages used by the program. For
- instance, a program that includes C++ source code would use the C++
- compiler to link. The @code{_LINK} variable must hold the name of a
- command that can be passed all the @file{.o} file names and libraries
- to link against as arguments. Note that the name of the underlying
- program is @emph{not} passed to @code{_LINK}; typically one uses
- @samp{$@@}:
- @example
- maude_LINK = $(CCLD) -magic -o $@@
- @end example
- If a @code{_LINK} variable is not supplied, it may still be generated
- and used by Automake due to the use of per-target link flags such as
- @code{_CFLAGS}, @code{_LDFLAGS} or @code{_LIBTOOLFLAGS}, in cases where
- they apply.
- @item maude_CCASFLAGS
- @itemx maude_CFLAGS
- @itemx maude_CPPFLAGS
- @itemx maude_CXXFLAGS
- @itemx maude_FFLAGS
- @itemx maude_GCJFLAGS
- @itemx maude_LFLAGS
- @itemx maude_OBJCFLAGS
- @itemx maude_OBJCXXFLAGS
- @itemx maude_RFLAGS
- @itemx maude_UPCFLAGS
- @itemx maude_YFLAGS
- @cindex per-target compilation flags, defined
- Automake allows you to set compilation flags on a per-program (or
- per-library) basis. A single source file can be included in several
- programs, and it will potentially be compiled with different flags for
- each program. This works for any language directly supported by
- Automake. These @dfn{per-target compilation flags} are
- @samp{_CCASFLAGS},
- @samp{_CFLAGS},
- @samp{_CPPFLAGS},
- @samp{_CXXFLAGS},
- @samp{_FFLAGS},
- @samp{_GCJFLAGS},
- @samp{_LFLAGS},
- @samp{_OBJCFLAGS},
- @samp{_OBJCXXFLAGS},
- @samp{_RFLAGS},
- @samp{_UPCFLAGS}, and
- @samp{_YFLAGS}.
- When using a per-target compilation flag, Automake will choose a
- different name for the intermediate object files. Ordinarily a file
- like @file{sample.c} will be compiled to produce @file{sample.o}.
- However, if the program's @code{_CFLAGS} variable is set, then the
- object file will be named, for instance, @file{maude-sample.o}. (See
- also @ref{Renamed Objects}).
- In compilations with per-target flags, the ordinary @samp{AM_} form of
- the flags variable is @emph{not} automatically included in the
- compilation (however, the user form of the variable @emph{is} included).
- So for instance, if you want the hypothetical @file{maude} compilations
- to also use the value of @code{AM_CFLAGS}, you would need to write:
- @example
- maude_CFLAGS = @dots{} your flags @dots{} $(AM_CFLAGS)
- @end example
- @xref{Flag Variables Ordering}, for more discussion about the
- interaction between user variables, @samp{AM_} shadow variables, and
- per-target variables.
- @item maude_SHORTNAME
- On some platforms the allowable file names are very short. In order to
- support these systems and per-target compilation flags at the same
- time, Automake allows you to set a ``short name'' that will influence
- how intermediate object files are named. For instance, in the following
- example,
- @example
- bin_PROGRAMS = maude
- maude_CPPFLAGS = -DSOMEFLAG
- maude_SHORTNAME = m
- maude_SOURCES = sample.c @dots{}
- @end example
- @noindent
- the object file would be named @file{m-sample.o} rather than
- @file{maude-sample.o}.
- This facility is rarely needed in practice,
- and we recommend avoiding it until you find it is required.
- @end vtable
- @node Default _SOURCES
- @section Default @code{_SOURCES}
- @vindex _SOURCES
- @vindex SOURCES
- @cindex @code{_SOURCES}, default
- @cindex default @code{_SOURCES}
- @vindex AM_DEFAULT_SOURCE_EXT
- @code{_SOURCES} variables are used to specify source files of programs
- (@pxref{A Program}), libraries (@pxref{A Library}), and Libtool
- libraries (@pxref{A Shared Library}).
- When no such variable is specified for a target, Automake will define
- one itself. The default is to compile a single C file whose base name
- is the name of the target itself, with any extension replaced by
- @code{AM_DEFAULT_SOURCE_EXT}, which defaults to @file{.c}.
- For example if you have the following somewhere in your
- @file{Makefile.am} with no corresponding @code{libfoo_a_SOURCES}:
- @example
- lib_LIBRARIES = libfoo.a sub/libc++.a
- @end example
- @noindent
- @file{libfoo.a} will be built using a default source file named
- @file{libfoo.c}, and @file{sub/libc++.a} will be built from
- @file{sub/libc++.c}. (In older versions @file{sub/libc++.a}
- would be built from @file{sub_libc___a.c}, i.e., the default source
- was the canonized name of the target, with @file{.c} appended.
- We believe the new behavior is more sensible, but for backward
- compatibility @command{automake} will use the old name if a file or a rule
- with that name exists and @code{AM_DEFAULT_SOURCE_EXT} is not used.)
- @cindex @code{check_PROGRAMS} example
- @vindex check_PROGRAMS
- Default sources are mainly useful in test suites, when building many
- test programs each from a single source. For instance, in
- @example
- check_PROGRAMS = test1 test2 test3
- AM_DEFAULT_SOURCE_EXT = .cpp
- @end example
- @noindent
- @file{test1}, @file{test2}, and @file{test3} will be built
- from @file{test1.cpp}, @file{test2.cpp}, and @file{test3.cpp}.
- Without the last line, they will be built from @file{test1.c},
- @file{test2.c}, and @file{test3.c}.
- @cindex Libtool modules, default source example
- @cindex default source, Libtool modules example
- Another case where this is convenient is building many Libtool modules
- (@file{module@var{n}.la}), each defined in its own file
- (@file{module@var{n}.c}).
- @example
- AM_LDFLAGS = -module
- lib_LTLIBRARIES = module1.la module2.la module3.la
- @end example
- @cindex empty @code{_SOURCES}
- @cindex @code{_SOURCES}, empty
- Finally, there is one situation where this default source computation
- needs to be avoided: when a target should not be built from sources.
- We already saw such an example in @ref{true}; this happens when all
- the constituents of a target have already been compiled and just need
- to be combined using a @code{_LDADD} variable. Then it is necessary
- to define an empty @code{_SOURCES} variable, so that @command{automake}
- does not compute a default.
- @example
- bin_PROGRAMS = target
- target_SOURCES =
- target_LDADD = libmain.a libmisc.a
- @end example
- @node LIBOBJS
- @section Special handling for @code{LIBOBJS} and @code{ALLOCA}
- @cindex @code{LIBOBJS}, example
- @cindex @code{ALLOCA}, example
- @cindex @code{LIBOBJS}, special handling
- @cindex @code{ALLOCA}, special handling
- @vindex LTLIBOBJS
- @vindex LIBOBJS
- @vindex LTALLOCA
- @vindex ALLOCA
- The @samp{$(LIBOBJS)} and @samp{$(ALLOCA)} variables list object
- files that should be compiled into the project to provide an
- implementation for functions that are missing or broken on the host
- system. They are substituted by @file{configure}.
- @acindex AC_LIBOBJ
- These variables are defined by Autoconf macros such as
- @code{AC_LIBOBJ}, @code{AC_REPLACE_FUNCS} (@pxref{Generic Functions, ,
- Generic Function Checks, autoconf, The Autoconf Manual}), or
- @code{AC_FUNC_ALLOCA} (@pxref{Particular Functions, , Particular
- Function Checks, autoconf, The Autoconf Manual}). Many other Autoconf
- macros call @code{AC_LIBOBJ} or @code{AC_REPLACE_FUNCS} to
- populate @samp{$(LIBOBJS)}.
- @acindex AC_LIBSOURCE
- Using these variables is very similar to doing conditional compilation
- using @code{AC_SUBST} variables, as described in @ref{Conditional
- Sources}. That is, when building a program, @samp{$(LIBOBJS)} and
- @samp{$(ALLOCA)} should be added to the associated @samp{*_LDADD}
- variable, or to the @samp{*_LIBADD} variable when building a library.
- However there is no need to list the corresponding sources in
- @samp{EXTRA_*_SOURCES} nor to define @samp{*_DEPENDENCIES}. Automake
- automatically adds @samp{$(LIBOBJS)} and @samp{$(ALLOCA)} to the
- dependencies, and it will discover the list of corresponding source
- files automatically (by tracing the invocations of the
- @code{AC_LIBSOURCE} Autoconf macros). If you have already defined
- @samp{*_DEPENDENCIES} explicitly for an unrelated reason, then you
- either need to add these variables manually, or use
- @samp{EXTRA_*_DEPENDENCIES} instead of @samp{*_DEPENDENCIES}.
- These variables are usually used to build a portability library that
- is linked with all the programs of the project. We now review a
- sample setup. First, @file{configure.ac} contains some checks that
- affect either @code{LIBOBJS} or @code{ALLOCA}.
- @example
- # configure.ac
- @dots{}
- AC_CONFIG_LIBOBJ_DIR([lib])
- @dots{}
- AC_FUNC_MALLOC dnl May add malloc.$(OBJEXT) to LIBOBJS
- AC_FUNC_MEMCMP dnl May add memcmp.$(OBJEXT) to LIBOBJS
- AC_REPLACE_FUNCS([strdup]) dnl May add strdup.$(OBJEXT) to LIBOBJS
- AC_FUNC_ALLOCA dnl May add alloca.$(OBJEXT) to ALLOCA
- @dots{}
- AC_CONFIG_FILES([
- lib/Makefile
- src/Makefile
- ])
- AC_OUTPUT
- @end example
- @acindex AC_CONFIG_LIBOBJ_DIR
- The @code{AC_CONFIG_LIBOBJ_DIR} tells Autoconf that the source files
- of these object files are to be found in the @file{lib/} directory.
- Automake can also use this information, otherwise it expects the
- source files are to be in the directory where the @samp{$(LIBOBJS)}
- and @samp{$(ALLOCA)} variables are used.
- The @file{lib/} directory should therefore contain @file{malloc.c},
- @file{memcmp.c}, @file{strdup.c}, @file{alloca.c}. Here is its
- @file{Makefile.am}:
- @example
- # lib/Makefile.am
- noinst_LIBRARIES = libcompat.a
- libcompat_a_SOURCES =
- libcompat_a_LIBADD = $(LIBOBJS) $(ALLOCA)
- @end example
- The library can have any name, of course, and anyway it is not going
- to be installed: it just holds the replacement versions of the missing
- or broken functions so we can later link them in. Many projects
- also include extra functions, specific to the project, in that
- library: they are simply added on the @code{_SOURCES} line.
- @cindex Empty libraries and @samp{$(LIBOBJS)}
- @cindex @samp{$(LIBOBJS)} and empty libraries
- There is a small trap here, though: @samp{$(LIBOBJS)} and
- @samp{$(ALLOCA)} might be empty, and building an empty library is not
- portable. You should ensure that there is always something to put in
- @file{libcompat.a}. Most projects will also add some utility
- functions in that directory, and list them in
- @code{libcompat_a_SOURCES}, so in practice @file{libcompat.a} cannot
- be empty.
- Finally here is how this library could be used from the @file{src/}
- directory.
- @example
- # src/Makefile.am
- # Link all programs in this directory with libcompat.a
- LDADD = ../lib/libcompat.a
- bin_PROGRAMS = tool1 tool2 @dots{}
- tool1_SOURCES = @dots{}
- tool2_SOURCES = @dots{}
- @end example
- When option @option{subdir-objects} is not used, as in the above
- example, the variables @samp{$(LIBOBJS)} or @samp{$(ALLOCA)} can only
- be used in the directory where their sources lie. E.g., here it would
- be wrong to use @samp{$(LIBOBJS)} or @samp{$(ALLOCA)} in
- @file{src/Makefile.am}. However if both @option{subdir-objects} and
- @code{AC_CONFIG_LIBOBJ_DIR} are used, it is OK to use these variables
- in other directories. For instance @file{src/Makefile.am} could be
- changed as follows.
- @example
- # src/Makefile.am
- AUTOMAKE_OPTIONS = subdir-objects
- LDADD = $(LIBOBJS) $(ALLOCA)
- bin_PROGRAMS = tool1 tool2 @dots{}
- tool1_SOURCES = @dots{}
- tool2_SOURCES = @dots{}
- @end example
- Because @samp{$(LIBOBJS)} and @samp{$(ALLOCA)} contain object
- file names that end with @samp{.$(OBJEXT)}, they are not suitable for
- Libtool libraries (where the expected object extension is @file{.lo}):
- @code{LTLIBOBJS} and @code{LTALLOCA} should be used instead.
- @code{LTLIBOBJS} is defined automatically by Autoconf and should not
- be defined by hand (as in the past), however at the time of writing
- @code{LTALLOCA} still needs to be defined from @code{ALLOCA} manually.
- @xref{AC_LIBOBJ vs LIBOBJS, , @code{AC_LIBOBJ} vs.@: @code{LIBOBJS},
- autoconf, The Autoconf Manual}.
- @node Program Variables
- @section Variables used when building a program
- Occasionally it is useful to know which @file{Makefile} variables
- Automake uses for compilations, and in which order (@pxref{Flag
- Variables Ordering}); for instance, you might need to do your own
- compilation in some special cases.
- Some variables are inherited from Autoconf; these are @code{CC},
- @code{CFLAGS}, @code{CPPFLAGS}, @code{DEFS}, @code{LDFLAGS}, and
- @code{LIBS}.
- @vindex CC
- @vindex CFLAGS
- @vindex CPPFLAGS
- @vindex DEFS
- @vindex LDFLAGS
- @vindex LIBS
- There are some additional variables that Automake defines on its own:
- @vtable @code
- @item AM_CPPFLAGS
- The contents of this variable are passed to every compilation that invokes
- the C preprocessor; it is a list of arguments to the preprocessor. For
- instance, @option{-I} and @option{-D} options should be listed here.
- Automake already provides some @option{-I} options automatically, in a
- separate variable that is also passed to every compilation that invokes
- the C preprocessor. In particular it generates @samp{-I.},
- @samp{-I$(srcdir)}, and a @option{-I} pointing to the directory holding
- @file{config.h} (if you've used @code{AC_CONFIG_HEADERS}). You can
- disable the default @option{-I} options using the @option{nostdinc}
- option.
- When a file to be included is generated during the build and not part
- of a distribution tarball, its location is under @code{$(builddir)},
- not under @code{$(srcdir)}. This matters especially for packages that
- use header files placed in sub-directories and want to allow builds
- outside the source tree (@pxref{VPATH Builds}). In that case we
- recommend to use a pair of @option{-I} options, such as, e.g.,
- @samp{-Isome/subdir -I$(srcdir)/some/subdir} or
- @samp{-I$(top_builddir)/some/subdir -I$(top_srcdir)/some/subdir}.
- Note that the reference to the build tree should come before the
- reference to the source tree, so that accidentally leftover generated
- files in the source directory are ignored.
- @code{AM_CPPFLAGS} is ignored in preference to a per-executable (or
- per-library) @code{_CPPFLAGS} variable if it is defined.
- @item INCLUDES
- This does the same job as @code{AM_CPPFLAGS} (or any per-target
- @code{_CPPFLAGS} variable if it is used). It is an older name for the
- same functionality. This variable is deprecated; we suggest using
- @code{AM_CPPFLAGS} and per-target @code{_CPPFLAGS} instead.
- @item AM_CFLAGS
- This is the variable the @file{Makefile.am} author can use to pass
- in additional C compiler flags. In some situations, this is
- not used, in preference to the per-executable (or per-library)
- @code{_CFLAGS}.
- @item COMPILE
- This is the command used to actually compile a C source file. The
- file name is appended to form the complete command line.
- @item AM_LDFLAGS
- This is the variable the @file{Makefile.am} author can use to pass
- in additional linker flags. In some situations, this is not used, in
- preference to the per-executable (or per-library) @code{_LDFLAGS}.
- @item LINK
- This is the command used to actually link a C program. It already
- includes @samp{-o $@@} and the usual variable references (for instance,
- @code{CFLAGS}); it takes as ``arguments'' the names of the object files
- and libraries to link in. This variable is not used when the linker is
- overridden with a per-target @code{_LINK} variable or per-target flags
- cause Automake to define such a @code{_LINK} variable.
- @end vtable
- @node Yacc and Lex
- @section Yacc and Lex support
- Automake has somewhat idiosyncratic support for Yacc and Lex.
- Automake assumes that the @file{.c} file generated by @command{yacc}
- (or @command{lex}) should be named using the basename of the input
- file. That is, for a yacc source file @file{foo.y}, Automake will
- cause the intermediate file to be named @file{foo.c} (as opposed to
- @file{y.tab.c}, which is more traditional).
- The extension of a yacc source file is used to determine the extension
- of the resulting C or C++ source and header files. Note that header
- files are generated only when the @option{-d} Yacc option is used; see
- below for more information about this flag, and how to specify it.
- Files with the extension @file{.y} will thus be turned into @file{.c}
- sources and @file{.h} headers; likewise, @file{.yy} will become
- @file{.cc} and @file{.hh}, @file{.y++} will become @file{c++} and
- @file{h++}, @file{.yxx} will become @file{.cxx} and @file{.hxx},
- and @file{.ypp} will become @file{.cpp} and @file{.hpp}.
- Similarly, lex source files can be used to generate C or C++; the
- extensions @file{.l}, @file{.ll}, @file{.l++}, @file{.lxx}, and
- @file{.lpp} are recognized.
- You should never explicitly mention the intermediate (C or C++) file
- in any @code{SOURCES} variable; only list the source file.
- The intermediate files generated by @command{yacc} (or @command{lex})
- will be included in any distribution that is made. That way the user
- doesn't need to have @command{yacc} or @command{lex}.
- If a @command{yacc} source file is seen, then your @file{configure.ac} must
- define the variable @code{YACC}. This is most easily done by invoking
- the macro @code{AC_PROG_YACC} (@pxref{Particular Programs, , Particular
- Program Checks, autoconf, The Autoconf Manual}).
- @vindex YFLAGS
- @vindex AM_YFLAGS
- When @code{yacc} is invoked, it is passed @code{AM_YFLAGS} and
- @code{YFLAGS}. The latter is a user variable and the former is
- intended for the @file{Makefile.am} author.
- @code{AM_YFLAGS} is usually used to pass the @option{-d} option to
- @command{yacc}. Automake knows what this means and will automatically
- adjust its rules to update and distribute the header file built by
- @samp{yacc -d}@footnote{Please note that @command{automake} recognizes
- @option{-d} in @code{AM_YFLAGS} only if it is not clustered with other
- options; for example, it won't be recognized if @code{AM_YFLAGS} is
- @option{-dt}, but it will be if @code{AM_YFLAGS} is @option{-d -t} or
- @option{-t -d}.}.
- What Automake cannot guess, though, is where this
- header will be used: it is up to you to ensure the header gets built
- before it is first used. Typically this is necessary in order for
- dependency tracking to work when the header is included by another
- file. The common solution is listing the header file in
- @code{BUILT_SOURCES} (@pxref{Sources}) as follows.
- @example
- BUILT_SOURCES = parser.h
- AM_YFLAGS = -d
- bin_PROGRAMS = foo
- foo_SOURCES = @dots{} parser.y @dots{}
- @end example
- If a @command{lex} source file is seen, then your @file{configure.ac}
- must define the variable @code{LEX}. You can use @code{AC_PROG_LEX}
- to do this (@pxref{Particular Programs, , Particular Program Checks,
- autoconf, The Autoconf Manual}), but using @code{AM_PROG_LEX} macro
- (@pxref{Macros}) is recommended.
- @vindex LFLAGS
- @vindex AM_LFLAGS
- When @command{lex} is invoked, it is passed @code{AM_LFLAGS} and
- @code{LFLAGS}. The latter is a user variable and the former is
- intended for the @file{Makefile.am} author.
- When @code{AM_MAINTAINER_MODE} (@pxref{maintainer-mode}) is used, the
- rebuild rule for distributed Yacc and Lex sources are only used when
- @code{maintainer-mode} is enabled, or when the files have been erased.
- @cindex @command{ylwrap}
- @cindex @command{yacc}, multiple parsers
- @cindex Multiple @command{yacc} parsers
- @cindex Multiple @command{lex} lexers
- @cindex @command{lex}, multiple lexers
- When @command{lex} or @command{yacc} sources are used, @code{automake -a}
- automatically installs an auxiliary program called @command{ylwrap} in
- your package (@pxref{Auxiliary Programs}).
- This program is used by the build rules to rename the output of these
- tools, and makes it possible to include multiple @command{yacc} (or
- @command{lex}) source files in a single directory. (This is necessary
- because yacc's output file name is fixed, and a parallel make could
- conceivably invoke more than one instance of @command{yacc}
- simultaneously.)
- For @command{yacc}, simply managing locking is insufficient. The output of
- @command{yacc} always uses the same symbol names internally, so it isn't
- possible to link two @command{yacc} parsers into the same executable.
- We recommend using the following renaming hack used in @command{gdb}:
- @example
- #define yymaxdepth c_maxdepth
- #define yyparse c_parse
- #define yylex c_lex
- #define yyerror c_error
- #define yylval c_lval
- #define yychar c_char
- #define yydebug c_debug
- #define yypact c_pact
- #define yyr1 c_r1
- #define yyr2 c_r2
- #define yydef c_def
- #define yychk c_chk
- #define yypgo c_pgo
- #define yyact c_act
- #define yyexca c_exca
- #define yyerrflag c_errflag
- #define yynerrs c_nerrs
- #define yyps c_ps
- #define yypv c_pv
- #define yys c_s
- #define yy_yys c_yys
- #define yystate c_state
- #define yytmp c_tmp
- #define yyv c_v
- #define yy_yyv c_yyv
- #define yyval c_val
- #define yylloc c_lloc
- #define yyreds c_reds
- #define yytoks c_toks
- #define yylhs c_yylhs
- #define yylen c_yylen
- #define yydefred c_yydefred
- #define yydgoto c_yydgoto
- #define yysindex c_yysindex
- #define yyrindex c_yyrindex
- #define yygindex c_yygindex
- #define yytable c_yytable
- #define yycheck c_yycheck
- #define yyname c_yyname
- #define yyrule c_yyrule
- @end example
- For each define, replace the @samp{c_} prefix with whatever you like.
- These defines work for @command{bison}, @command{byacc}, and
- traditional @code{yacc}s. If you find a parser generator that uses a
- symbol not covered here, please report the new name so it can be added
- to the list.
- @node C++ Support
- @section C++ Support
- @cindex C++ support
- @cindex Support for C++
- Automake includes full support for C++.
- Any package including C++ code must define the output variable
- @code{CXX} in @file{configure.ac}; the simplest way to do this is to use
- the @code{AC_PROG_CXX} macro (@pxref{Particular Programs, , Particular
- Program Checks, autoconf, The Autoconf Manual}).
- A few additional variables are defined when a C++ source file is seen:
- @vtable @code
- @item CXX
- The name of the C++ compiler.
- @item CXXFLAGS
- Any flags to pass to the C++ compiler.
- @item AM_CXXFLAGS
- The maintainer's variant of @code{CXXFLAGS}.
- @item CXXCOMPILE
- The command used to actually compile a C++ source file. The file name
- is appended to form the complete command line.
- @item CXXLINK
- The command used to actually link a C++ program.
- @end vtable
- @node Objective C Support
- @section Objective C Support
- @cindex Objective C support
- @cindex Support for Objective C
- Automake includes some support for Objective C.
- Any package including Objective C code must define the output variable
- @code{OBJC} in @file{configure.ac}; the simplest way to do this is to use
- the @code{AC_PROG_OBJC} macro (@pxref{Particular Programs, , Particular
- Program Checks, autoconf, The Autoconf Manual}).
- A few additional variables are defined when an Objective C source file
- is seen:
- @vtable @code
- @item OBJC
- The name of the Objective C compiler.
- @item OBJCFLAGS
- Any flags to pass to the Objective C compiler.
- @item AM_OBJCFLAGS
- The maintainer's variant of @code{OBJCFLAGS}.
- @item OBJCCOMPILE
- The command used to actually compile an Objective C source file. The
- file name is appended to form the complete command line.
- @item OBJCLINK
- The command used to actually link an Objective C program.
- @end vtable
- @node Objective C++ Support
- @section Objective C++ Support
- @cindex Objective C++ support
- @cindex Support for Objective C++
- Automake includes some support for Objective C++.
- Any package including Objective C++ code must define the output variable
- @code{OBJCXX} in @file{configure.ac}; the simplest way to do this is to use
- the @code{AC_PROG_OBJCXX} macro (@pxref{Particular Programs, , Particular
- Program Checks, autoconf, The Autoconf Manual}).
- A few additional variables are defined when an Objective C++ source file
- is seen:
- @vtable @code
- @item OBJCXX
- The name of the Objective C++ compiler.
- @item OBJCXXFLAGS
- Any flags to pass to the Objective C++ compiler.
- @item AM_OBJCXXFLAGS
- The maintainer's variant of @code{OBJCXXFLAGS}.
- @item OBJCXXCOMPILE
- The command used to actually compile an Objective C++ source file. The
- file name is appended to form the complete command line.
- @item OBJCXXLINK
- The command used to actually link an Objective C++ program.
- @end vtable
- @node Unified Parallel C Support
- @section Unified Parallel C Support
- @cindex Unified Parallel C support
- @cindex Support for Unified Parallel C
- Automake includes some support for Unified Parallel C.
- Any package including Unified Parallel C code must define the output
- variable @code{UPC} in @file{configure.ac}; the simplest way to do
- this is to use the @code{AM_PROG_UPC} macro (@pxref{Public Macros}).
- A few additional variables are defined when a Unified Parallel C
- source file is seen:
- @vtable @code
- @item UPC
- The name of the Unified Parallel C compiler.
- @item UPCFLAGS
- Any flags to pass to the Unified Parallel C compiler.
- @item AM_UPCFLAGS
- The maintainer's variant of @code{UPCFLAGS}.
- @item UPCCOMPILE
- The command used to actually compile a Unified Parallel C source file.
- The file name is appended to form the complete command line.
- @item UPCLINK
- The command used to actually link a Unified Parallel C program.
- @end vtable
- @node Assembly Support
- @section Assembly Support
- Automake includes some support for assembly code. There are two forms
- of assembler files: normal (@file{*.s}) and preprocessed by @code{CPP}
- (@file{*.S} or @file{*.sx}).
- @vindex CCAS
- @vindex CCASFLAGS
- @vindex CPPFLAGS
- @vindex AM_CCASFLAGS
- @vindex AM_CPPFLAGS
- The variable @code{CCAS} holds the name of the compiler used to build
- assembly code. This compiler must work a bit like a C compiler; in
- particular it must accept @option{-c} and @option{-o}. The values of
- @code{CCASFLAGS} and @code{AM_CCASFLAGS} (or its per-target
- definition) is passed to the compilation. For preprocessed files,
- @code{DEFS}, @code{DEFAULT_INCLUDES}, @code{INCLUDES}, @code{CPPFLAGS}
- and @code{AM_CPPFLAGS} are also used.
- The autoconf macro @code{AM_PROG_AS} will define @code{CCAS} and
- @code{CCASFLAGS} for you (unless they are already set, it simply sets
- @code{CCAS} to the C compiler and @code{CCASFLAGS} to the C compiler
- flags), but you are free to define these variables by other means.
- Only the suffixes @file{.s}, @file{.S}, and @file{.sx} are recognized by
- @command{automake} as being files containing assembly code.
- @node Fortran 77 Support
- @comment node-name, next, previous, up
- @section Fortran 77 Support
- @cindex Fortran 77 support
- @cindex Support for Fortran 77
- Automake includes full support for Fortran 77.
- Any package including Fortran 77 code must define the output variable
- @code{F77} in @file{configure.ac}; the simplest way to do this is to use
- the @code{AC_PROG_F77} macro (@pxref{Particular Programs, , Particular
- Program Checks, autoconf, The Autoconf Manual}).
- A few additional variables are defined when a Fortran 77 source file is
- seen:
- @vtable @code
- @item F77
- The name of the Fortran 77 compiler.
- @item FFLAGS
- Any flags to pass to the Fortran 77 compiler.
- @item AM_FFLAGS
- The maintainer's variant of @code{FFLAGS}.
- @item RFLAGS
- Any flags to pass to the Ratfor compiler.
- @item AM_RFLAGS
- The maintainer's variant of @code{RFLAGS}.
- @item F77COMPILE
- The command used to actually compile a Fortran 77 source file. The file
- name is appended to form the complete command line.
- @item FLINK
- The command used to actually link a pure Fortran 77 program or shared
- library.
- @end vtable
- Automake can handle preprocessing Fortran 77 and Ratfor source files in
- addition to compiling them@footnote{Much, if not most, of the
- information in the following sections pertaining to preprocessing
- Fortran 77 programs was taken almost verbatim from @ref{Catalogue of
- Rules, , Catalogue of Rules, make, The GNU Make Manual}.}. Automake
- also contains some support for creating programs and shared libraries
- that are a mixture of Fortran 77 and other languages (@pxref{Mixing
- Fortran 77 With C and C++}).
- These issues are covered in the following sections.
- @menu
- * Preprocessing Fortran 77:: Preprocessing Fortran 77 sources
- * Compiling Fortran 77 Files:: Compiling Fortran 77 sources
- * Mixing Fortran 77 With C and C++:: Mixing Fortran 77 With C and C++
- @end menu
- @node Preprocessing Fortran 77
- @comment node-name, next, previous, up
- @subsection Preprocessing Fortran 77
- @cindex Preprocessing Fortran 77
- @cindex Fortran 77, Preprocessing
- @cindex Ratfor programs
- @file{N.f} is made automatically from @file{N.F} or @file{N.r}. This
- rule runs just the preprocessor to convert a preprocessable Fortran 77
- or Ratfor source file into a strict Fortran 77 source file. The precise
- command used is as follows:
- @table @file
- @item .F
- @code{$(F77) -F $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS)@*
- $(AM_FFLAGS) $(FFLAGS)}
- @item .r
- @code{$(F77) -F $(AM_FFLAGS) $(FFLAGS) $(AM_RFLAGS) $(RFLAGS)}
- @end table
- @node Compiling Fortran 77 Files
- @comment node-name, next, previous, up
- @subsection Compiling Fortran 77 Files
- @file{N.o} is made automatically from @file{N.f}, @file{N.F} or
- @file{N.r} by running the Fortran 77 compiler. The precise command used
- is as follows:
- @table @file
- @item .f
- @code{$(F77) -c $(AM_FFLAGS) $(FFLAGS)}
- @item .F
- @code{$(F77) -c $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS)@*
- $(AM_FFLAGS) $(FFLAGS)}
- @item .r
- @code{$(F77) -c $(AM_FFLAGS) $(FFLAGS) $(AM_RFLAGS) $(RFLAGS)}
- @end table
- @node Mixing Fortran 77 With C and C++
- @comment node-name, next, previous, up
- @subsection Mixing Fortran 77 With C and C++
- @cindex Fortran 77, mixing with C and C++
- @cindex Mixing Fortran 77 with C and C++
- @cindex Linking Fortran 77 with C and C++
- @cindex cfortran
- @cindex Mixing Fortran 77 with C and/or C++
- Automake currently provides @emph{limited} support for creating programs
- and shared libraries that are a mixture of Fortran 77 and C and/or C++.
- However, there are many other issues related to mixing Fortran 77 with
- other languages that are @emph{not} (currently) handled by Automake, but
- that are handled by other packages@footnote{For example,
- @uref{http://www-zeus.desy.de/~burow/cfortran/, the cfortran package}
- addresses all of these inter-language issues, and runs under nearly all
- Fortran 77, C and C++ compilers on nearly all platforms. However,
- @command{cfortran} is not yet Free Software, but it will be in the next
- major release.}.
- Automake can help in two ways:
- @enumerate
- @item
- Automatic selection of the linker depending on which combinations of
- source code.
- @item
- Automatic selection of the appropriate linker flags (e.g., @option{-L} and
- @option{-l}) to pass to the automatically selected linker in order to link
- in the appropriate Fortran 77 intrinsic and run-time libraries.
- @cindex @code{FLIBS}, defined
- @vindex FLIBS
- These extra Fortran 77 linker flags are supplied in the output variable
- @code{FLIBS} by the @code{AC_F77_LIBRARY_LDFLAGS} Autoconf macro.
- @xref{Fortran Compiler, , Fortran Compiler Characteristics, autoconf,
- The Autoconf Manual}.
- @end enumerate
- If Automake detects that a program or shared library (as mentioned in
- some @code{_PROGRAMS} or @code{_LTLIBRARIES} primary) contains source
- code that is a mixture of Fortran 77 and C and/or C++, then it requires
- that the macro @code{AC_F77_LIBRARY_LDFLAGS} be called in
- @file{configure.ac}, and that either @code{$(FLIBS)}
- appear in the appropriate @code{_LDADD} (for programs) or @code{_LIBADD}
- (for shared libraries) variables. It is the responsibility of the
- person writing the @file{Makefile.am} to make sure that @samp{$(FLIBS)}
- appears in the appropriate @code{_LDADD} or
- @code{_LIBADD} variable.
- @cindex Mixed language example
- @cindex Example, mixed language
- For example, consider the following @file{Makefile.am}:
- @example
- bin_PROGRAMS = foo
- foo_SOURCES = main.cc foo.f
- foo_LDADD = libfoo.la $(FLIBS)
- pkglib_LTLIBRARIES = libfoo.la
- libfoo_la_SOURCES = bar.f baz.c zardoz.cc
- libfoo_la_LIBADD = $(FLIBS)
- @end example
- In this case, Automake will insist that @code{AC_F77_LIBRARY_LDFLAGS}
- is mentioned in @file{configure.ac}. Also, if @samp{$(FLIBS)} hadn't
- been mentioned in @code{foo_LDADD} and @code{libfoo_la_LIBADD}, then
- Automake would have issued a warning.
- @menu
- * How the Linker is Chosen:: Automatic linker selection
- @end menu
- @node How the Linker is Chosen
- @comment node-name, next, previous, up
- @subsubsection How the Linker is Chosen
- @cindex Automatic linker selection
- @cindex Selecting the linker automatically
- When a program or library mixes several languages, Automake choose the
- linker according to the following priorities. (The names in
- parentheses are the variables containing the link command.)
- @enumerate
- @item
- @vindex GCJLINK
- Native Java (@code{GCJLINK})
- @item
- @vindex OBJCXXLINK
- Objective C++ (@code{OBJCXXLINK})
- @item
- @vindex CXXLINK
- C++ (@code{CXXLINK})
- @item
- @vindex F77LINK
- Fortran 77 (@code{F77LINK})
- @item
- @vindex FCLINK
- Fortran (@code{FCLINK})
- @item
- @vindex OBJCLINK
- Objective C (@code{OBJCLINK})
- @item
- @vindex UPCLINK
- Unified Parallel C (@code{UPCLINK})
- @item
- @vindex LINK
- C (@code{LINK})
- @end enumerate
- For example, if Fortran 77, C and C++ source code is compiled
- into a program, then the C++ linker will be used. In this case, if the
- C or Fortran 77 linkers required any special libraries that weren't
- included by the C++ linker, then they must be manually added to an
- @code{_LDADD} or @code{_LIBADD} variable by the user writing the
- @file{Makefile.am}.
- Automake only looks at the file names listed in @file{_SOURCES}
- variables to choose the linker, and defaults to the C linker.
- Sometimes this is inconvenient because you are linking against a
- library written in another language and would like to set the linker
- more appropriately. @xref{Libtool Convenience Libraries}, for a
- trick with @code{nodist_EXTRA_@dots{}_SOURCES}.
- A per-target @code{_LINK} variable will override the above selection.
- Per-target link flags will cause Automake to write a per-target
- @code{_LINK} variable according to the language chosen as above.
- @node Fortran 9x Support
- @comment node-name, next, previous, up
- @section Fortran 9x Support
- @cindex Fortran 9x support
- @cindex Support for Fortran 9x
- Automake includes support for Fortran 9x.
- Any package including Fortran 9x code must define the output variable
- @code{FC} in @file{configure.ac}; the simplest way to do this is to use
- the @code{AC_PROG_FC} macro (@pxref{Particular Programs, , Particular
- Program Checks, autoconf, The Autoconf Manual}).
- A few additional variables are defined when a Fortran 9x source file is
- seen:
- @vtable @code
- @item FC
- The name of the Fortran 9x compiler.
- @item FCFLAGS
- Any flags to pass to the Fortran 9x compiler.
- @item AM_FCFLAGS
- The maintainer's variant of @code{FCFLAGS}.
- @item FCCOMPILE
- The command used to actually compile a Fortran 9x source file. The file
- name is appended to form the complete command line.
- @item FCLINK
- The command used to actually link a pure Fortran 9x program or shared
- library.
- @end vtable
- @menu
- * Compiling Fortran 9x Files:: Compiling Fortran 9x sources
- @end menu
- @node Compiling Fortran 9x Files
- @comment node-name, next, previous, up
- @subsection Compiling Fortran 9x Files
- @file{@var{file}.o} is made automatically from @file{@var{file}.f90},
- @file{@var{file}.f95}, @file{@var{file}.f03}, or @file{@var{file}.f08}
- by running the Fortran 9x compiler. The precise command used
- is as follows:
- @table @file
- @item .f90
- @code{$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c $(FCFLAGS_f90) $<}
- @item .f95
- @code{$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c $(FCFLAGS_f95) $<}
- @item .f03
- @code{$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c $(FCFLAGS_f03) $<}
- @item .f08
- @code{$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c $(FCFLAGS_f08) $<}
- @end table
- @node Java Support with gcj
- @comment node-name, next, previous, up
- @section Compiling Java sources using gcj
- @cindex Java support with gcj
- @cindex Support for Java with gcj
- @cindex Java to native code, compilation
- @cindex Compilation of Java to native code
- Automake includes support for natively compiled Java, using @command{gcj},
- the Java front end to the GNU Compiler Collection (rudimentary support
- for compiling Java to bytecode using the @command{javac} compiler is
- also present, @emph{albeit deprecated}; @pxref{Java}).
- Any package including Java code to be compiled must define the output
- variable @code{GCJ} in @file{configure.ac}; the variable @code{GCJFLAGS}
- must also be defined somehow (either in @file{configure.ac} or
- @file{Makefile.am}). The simplest way to do this is to use the
- @code{AM_PROG_GCJ} macro.
- @vindex GCJFLAGS
- By default, programs including Java source files are linked with
- @command{gcj}.
- As always, the contents of @code{AM_GCJFLAGS} are passed to every
- compilation invoking @command{gcj} (in its role as an ahead-of-time
- compiler, when invoking it to create @file{.class} files,
- @code{AM_JAVACFLAGS} is used instead). If it is necessary to pass
- options to @command{gcj} from @file{Makefile.am}, this variable, and not
- the user variable @code{GCJFLAGS}, should be used.
- @vindex AM_GCJFLAGS
- @command{gcj} can be used to compile @file{.java}, @file{.class},
- @file{.zip}, or @file{.jar} files.
- When linking, @command{gcj} requires that the main class be specified
- using the @option{--main=} option. The easiest way to do this is to use
- the @code{_LDFLAGS} variable for the program.
- @node Vala Support
- @comment node-name, next, previous, up
- @section Vala Support
- @cindex Vala Support
- @cindex Support for Vala
- Automake provides initial support for Vala
- (@uref{http://www.vala-project.org/}).
- This requires valac version 0.7.0 or later, and currently requires
- the user to use GNU @command{make}.
- @example
- foo_SOURCES = foo.vala bar.vala zardoc.c
- @end example
- Any @file{.vala} file listed in a @code{_SOURCES} variable will be
- compiled into C code by the Vala compiler. The generated @file{.c} files
- are distributed. The end user does not need to have a Vala compiler installed.
- Automake ships with an Autoconf macro called @code{AM_PROG_VALAC}
- that will locate the Vala compiler and optionally check its version
- number.
- @defmac AM_PROG_VALAC (@ovar{minimum-version}, @ovar{action-if-found},
- @ovar{action-if-not-found})
- Search for a Vala compiler in @env{PATH}. If it is found, the variable
- @code{VALAC} is set to point to it (see below for more details). This
- macro takes three optional arguments. The first argument, if present,
- is the minimum version of the Vala compiler required to compile this
- package. If a compiler is found and satisfies @var{minimum-version},
- then @var{action-if-found} is run (this defaults to do nothing).
- Otherwise, @var{action-if-not-found} is run. If @var{action-if-not-found}
- is not specified, the default value is to print a warning in case no
- compiler is found, or if a too-old version of the compiler is found.
- @end defmac
- There are a few variables that are used when compiling Vala sources:
- @vtable @code
- @item VALAC
- Absolute path to the Vala compiler, or simply @samp{valac} if no
- suitable compiler Vala could be found at configure runtime.
- @item VALAFLAGS
- Additional arguments for the Vala compiler.
- @item AM_VALAFLAGS
- The maintainer's variant of @code{VALAFLAGS}.
- @example
- lib_LTLIBRARIES = libfoo.la
- libfoo_la_SOURCES = foo.vala
- @end example
- @end vtable
- Note that currently, you cannot use per-target @code{*_VALAFLAGS}
- (@pxref{Renamed Objects}) to produce different C files from one Vala
- source file.
- @node Support for Other Languages
- @comment node-name, next, previous, up
- @section Support for Other Languages
- Automake currently only includes full support for C, C++ (@pxref{C++
- Support}), Objective C (@pxref{Objective C Support}),
- Objective C++ (@pxref{Objective C++ Support}),
- Fortran 77
- (@pxref{Fortran 77 Support}), Fortran 9x (@pxref{Fortran 9x Support}),
- and Java (@pxref{Java Support with gcj}). There is only rudimentary
- support for other languages, support for which will be improved based
- on user demand.
- Some limited support for adding your own languages is available via the
- suffix rule handling (@pxref{Suffixes}).
- @node Dependencies
- @section Automatic dependency tracking
- As a developer it is often painful to continually update the
- @file{Makefile.am} whenever the include-file dependencies change in a
- project. Automake supplies a way to automatically track dependency
- changes (@pxref{Dependency Tracking}).
- @cindex Dependency tracking
- @cindex Automatic dependency tracking
- Automake always uses complete dependencies for a compilation,
- including system headers. Automake's model is that dependency
- computation should be a side effect of the build. To this end,
- dependencies are computed by running all compilations through a
- special wrapper program called @command{depcomp}. @command{depcomp}
- understands how to coax many different C and C++ compilers into
- generating dependency information in the format it requires.
- @samp{automake -a} will install @command{depcomp} into your source
- tree for you. If @command{depcomp} can't figure out how to properly
- invoke your compiler, dependency tracking will simply be disabled for
- your build.
- @cindex @command{depcomp}
- Experience with earlier versions of Automake (@pxref{Dependency Tracking
- Evolution, , Dependency Tracking Evolution, automake-history, Brief History
- of Automake}) taught us that it is not reliable to generate dependencies
- only on the maintainer's system, as configurations vary too much. So
- instead Automake implements dependency tracking at build time.
- Automatic dependency tracking can be suppressed by putting
- @option{no-dependencies} in the variable @code{AUTOMAKE_OPTIONS}, or
- passing @option{no-dependencies} as an argument to @code{AM_INIT_AUTOMAKE}
- (this should be the preferred way). Or, you can invoke @command{automake}
- with the @option{-i} option. Dependency tracking is enabled by default.
- @vindex AUTOMAKE_OPTIONS
- @opindex no-dependencies
- The person building your package also can choose to disable dependency
- tracking by configuring with @option{--disable-dependency-tracking}.
- @cindex Disabling dependency tracking
- @cindex Dependency tracking, disabling
- @node EXEEXT
- @section Support for executable extensions
- @cindex Executable extension
- @cindex Extension, executable
- @cindex Windows
- On some platforms, such as Windows, executables are expected to have an
- extension such as @file{.exe}. On these platforms, some compilers (GCC
- among them) will automatically generate @file{foo.exe} when asked to
- generate @file{foo}.
- Automake provides mostly-transparent support for this. Unfortunately
- @emph{mostly} doesn't yet mean @emph{fully}. Until the English
- dictionary is revised, you will have to assist Automake if your package
- must support those platforms.
- One thing you must be aware of is that, internally, Automake rewrites
- something like this:
- @example
- bin_PROGRAMS = liver
- @end example
- to this:
- @example
- bin_PROGRAMS = liver$(EXEEXT)
- @end example
- The targets Automake generates are likewise given the @samp{$(EXEEXT)}
- extension.
- The variables @code{TESTS} and @code{XFAIL_TESTS} (@pxref{Simple Tests})
- are also rewritten if they contain filenames that have been declared as
- programs in the same @file{Makefile}. (This is mostly useful when some
- programs from @code{check_PROGRAMS} are listed in @code{TESTS}.)
- However, Automake cannot apply this rewriting to @command{configure}
- substitutions. This means that if you are conditionally building a
- program using such a substitution, then your @file{configure.ac} must
- take care to add @samp{$(EXEEXT)} when constructing the output variable.
- Sometimes maintainers like to write an explicit link rule for their
- program. Without executable extension support, this is easy---you
- simply write a rule whose target is the name of the program. However,
- when executable extension support is enabled, you must instead add the
- @samp{$(EXEEXT)} suffix.
- This might be a nuisance for maintainers who know their package will
- never run on a platform that has
- executable extensions. For those maintainers, the @option{no-exeext}
- option (@pxref{Options}) will disable this feature. This works in a
- fairly ugly way; if @option{no-exeext} is seen, then the presence of a
- rule for a target named @code{foo} in @file{Makefile.am} will override
- an @command{automake}-generated rule for @samp{foo$(EXEEXT)}. Without
- the @option{no-exeext} option, this use will give a diagnostic.
- @node Other Objects
- @chapter Other Derived Objects
- Automake can handle derived objects that are not C programs. Sometimes
- the support for actually building such objects must be explicitly
- supplied, but Automake will still automatically handle installation and
- distribution.
- @menu
- * Scripts:: Executable scripts
- * Headers:: Header files
- * Data:: Architecture-independent data files
- * Sources:: Derived sources
- @end menu
- @node Scripts
- @section Executable Scripts
- @cindex @code{_SCRIPTS} primary, defined
- @cindex @code{SCRIPTS} primary, defined
- @cindex Primary variable, @code{SCRIPTS}
- @vindex _SCRIPTS
- @cindex Installing scripts
- It is possible to define and install programs that are scripts. Such
- programs are listed using the @code{SCRIPTS} primary name. When the
- script is distributed in its final, installable form, the
- @file{Makefile} usually looks as follows:
- @vindex SCRIPTS
- @example
- # Install my_script in $(bindir) and distribute it.
- dist_bin_SCRIPTS = my_script
- @end example
- Scripts are not distributed by default; as we have just seen, those
- that should be distributed can be specified using a @code{dist_}
- prefix as with other primaries.
- @cindex @code{SCRIPTS}, installation directories
- @vindex bin_SCRIPTS
- @vindex sbin_SCRIPTS
- @vindex libexec_SCRIPTS
- @vindex pkgdata_SCRIPTS
- @vindex pkglibexec_SCRIPTS
- @vindex noinst_SCRIPTS
- @vindex check_SCRIPTS
- Scripts can be installed in @code{bindir}, @code{sbindir},
- @code{libexecdir}, @code{pkglibexecdir}, or @code{pkgdatadir}.
- Scripts that need not be installed can be listed in
- @code{noinst_SCRIPTS}, and among them, those which are needed only by
- @samp{make check} should go in @code{check_SCRIPTS}.
- When a script needs to be built, the @file{Makefile.am} should include
- the appropriate rules. For instance the @command{automake} program
- itself is a Perl script that is generated from @file{automake.in}.
- Here is how this is handled:
- @example
- bin_SCRIPTS = automake
- CLEANFILES = $(bin_SCRIPTS)
- EXTRA_DIST = automake.in
- do_subst = sed -e 's,[@@]datadir[@@],$(datadir),g' \
- -e 's,[@@]PERL[@@],$(PERL),g' \
- -e 's,[@@]PACKAGE[@@],$(PACKAGE),g' \
- -e 's,[@@]VERSION[@@],$(VERSION),g' \
- @dots{}
- automake: automake.in Makefile
- $(do_subst) < $(srcdir)/automake.in > automake
- chmod +x automake
- @end example
- Such scripts for which a build rule has been supplied need to be
- deleted explicitly using @code{CLEANFILES} (@pxref{Clean}), and their
- sources have to be distributed, usually with @code{EXTRA_DIST}
- (@pxref{Basics of Distribution}).
- Another common way to build scripts is to process them from
- @file{configure} with @code{AC_CONFIG_FILES}. In this situation
- Automake knows which files should be cleaned and distributed, and what
- the rebuild rules should look like.
- For instance if @file{configure.ac} contains
- @example
- AC_CONFIG_FILES([src/my_script], [chmod +x src/my_script])
- @end example
- @noindent
- to build @file{src/my_script} from @file{src/my_script.in}, then a
- @file{src/Makefile.am} to install this script in @code{$(bindir)} can
- be as simple as
- @example
- bin_SCRIPTS = my_script
- CLEANFILES = $(bin_SCRIPTS)
- @end example
- @noindent
- There is no need for @code{EXTRA_DIST} or any build rule: Automake
- infers them from @code{AC_CONFIG_FILES} (@pxref{Requirements}).
- @code{CLEANFILES} is still useful, because by default Automake will
- clean targets of @code{AC_CONFIG_FILES} in @code{distclean}, not
- @code{clean}.
- Although this looks simpler, building scripts this way has one
- drawback: directory variables such as @code{$(datadir)} are not fully
- expanded and may refer to other directory variables.
- @node Headers
- @section Header files
- @cindex @code{_HEADERS} primary, defined
- @cindex @code{HEADERS} primary, defined
- @cindex Primary variable, @code{HEADERS}
- @vindex _HEADERS
- @vindex noinst_HEADERS
- @cindex @code{HEADERS}, installation directories
- @cindex Installing headers
- @vindex include_HEADERS
- @vindex oldinclude_HEADERS
- @vindex pkginclude_HEADERS
- Header files that must be installed are specified by the
- @code{HEADERS} family of variables. Headers can be installed in
- @code{includedir}, @code{oldincludedir}, @code{pkgincludedir} or any
- other directory you may have defined (@pxref{Uniform}). For instance,
- @example
- include_HEADERS = foo.h bar/bar.h
- @end example
- @noindent
- will install the two files as @file{$(includedir)/foo.h} and
- @file{$(includedir)/bar.h}.
- The @code{nobase_} prefix is also supported,
- @example
- nobase_include_HEADERS = foo.h bar/bar.h
- @end example
- @noindent
- will install the two files as @file{$(includedir)/foo.h} and
- @file{$(includedir)/bar/bar.h} (@pxref{Alternative}).
- @vindex noinst_HEADERS
- Usually, only header files that accompany installed libraries need to
- be installed. Headers used by programs or convenience libraries are
- not installed. The @code{noinst_HEADERS} variable can be used for
- such headers. However when the header actually belongs to a single
- convenience library or program, we recommend listing it in the
- program's or library's @code{_SOURCES} variable (@pxref{Program
- Sources}) instead of in @code{noinst_HEADERS}. This is clearer for
- the @file{Makefile.am} reader. @code{noinst_HEADERS} would be the
- right variable to use in a directory containing only headers and no
- associated library or program.
- All header files must be listed somewhere; in a @code{_SOURCES}
- variable or in a @code{_HEADERS} variable. Missing ones will not
- appear in the distribution.
- For header files that are built and must not be distributed, use the
- @code{nodist_} prefix as in @code{nodist_include_HEADERS} or
- @code{nodist_prog_SOURCES}. If these generated headers are needed
- during the build, you must also ensure they exist before they are
- used (@pxref{Sources}).
- @node Data
- @section Architecture-independent data files
- @cindex @code{_DATA} primary, defined
- @cindex @code{DATA} primary, defined
- @cindex Primary variable, @code{DATA}
- @vindex _DATA
- Automake supports the installation of miscellaneous data files using the
- @code{DATA} family of variables.
- @vindex DATA
- @vindex data_DATA
- @vindex sysconf_DATA
- @vindex sharedstate_DATA
- @vindex localstate_DATA
- @vindex pkgdata_DATA
- Such data can be installed in the directories @code{datadir},
- @code{sysconfdir}, @code{sharedstatedir}, @code{localstatedir}, or
- @code{pkgdatadir}.
- By default, data files are @emph{not} included in a distribution. Of
- course, you can use the @code{dist_} prefix to change this on a
- per-variable basis.
- Here is how Automake declares its auxiliary data files:
- @example
- dist_pkgdata_DATA = clean-kr.am clean.am @dots{}
- @end example
- @node Sources
- @section Built Sources
- Because Automake's automatic dependency tracking works as a side-effect
- of compilation (@pxref{Dependencies}) there is a bootstrap issue: a
- target should not be compiled before its dependencies are made, but
- these dependencies are unknown until the target is first compiled.
- Ordinarily this is not a problem, because dependencies are distributed
- sources: they preexist and do not need to be built. Suppose that
- @file{foo.c} includes @file{foo.h}. When it first compiles
- @file{foo.o}, @command{make} only knows that @file{foo.o} depends on
- @file{foo.c}. As a side-effect of this compilation @command{depcomp}
- records the @file{foo.h} dependency so that following invocations of
- @command{make} will honor it. In these conditions, it's clear there is
- no problem: either @file{foo.o} doesn't exist and has to be built
- (regardless of the dependencies), or accurate dependencies exist and
- they can be used to decide whether @file{foo.o} should be rebuilt.
- It's a different story if @file{foo.h} doesn't exist by the first
- @command{make} run. For instance, there might be a rule to build
- @file{foo.h}. This time @file{file.o}'s build will fail because the
- compiler can't find @file{foo.h}. @command{make} failed to trigger the
- rule to build @file{foo.h} first by lack of dependency information.
- @vindex BUILT_SOURCES
- @cindex @code{BUILT_SOURCES}, defined
- The @code{BUILT_SOURCES} variable is a workaround for this problem. A
- source file listed in @code{BUILT_SOURCES} is made on @samp{make all}
- or @samp{make check} (or even @samp{make install}) before other
- targets are processed. However, such a source file is not
- @emph{compiled} unless explicitly requested by mentioning it in some
- other @code{_SOURCES} variable.
- So, to conclude our introductory example, we could use
- @samp{BUILT_SOURCES = foo.h} to ensure @file{foo.h} gets built before
- any other target (including @file{foo.o}) during @samp{make all} or
- @samp{make check}.
- @code{BUILT_SOURCES} is actually a bit of a misnomer, as any file which
- must be created early in the build process can be listed in this
- variable. Moreover, all built sources do not necessarily have to be
- listed in @code{BUILT_SOURCES}. For instance, a generated @file{.c} file
- doesn't need to appear in @code{BUILT_SOURCES} (unless it is included by
- another source), because it's a known dependency of the associated
- object.
- It might be important to emphasize that @code{BUILT_SOURCES} is
- honored only by @samp{make all}, @samp{make check} and @samp{make
- install}. This means you cannot build a specific target (e.g.,
- @samp{make foo}) in a clean tree if it depends on a built source.
- However it will succeed if you have run @samp{make all} earlier,
- because accurate dependencies are already available.
- The next section illustrates and discusses the handling of built sources
- on a toy example.
- @menu
- * Built Sources Example:: Several ways to handle built sources.
- @end menu
- @node Built Sources Example
- @subsection Built Sources Example
- Suppose that @file{foo.c} includes @file{bindir.h}, which is
- installation-dependent and not distributed: it needs to be built. Here
- @file{bindir.h} defines the preprocessor macro @code{bindir} to the
- value of the @command{make} variable @code{bindir} (inherited from
- @file{configure}).
- We suggest several implementations below. It's not meant to be an
- exhaustive listing of all ways to handle built sources, but it will give
- you a few ideas if you encounter this issue.
- @subsubheading First Try
- This first implementation will illustrate the bootstrap issue mentioned
- in the previous section (@pxref{Sources}).
- Here is a tentative @file{Makefile.am}.
- @example
- # This won't work.
- bin_PROGRAMS = foo
- foo_SOURCES = foo.c
- nodist_foo_SOURCES = bindir.h
- CLEANFILES = bindir.h
- bindir.h: Makefile
- echo '#define bindir "$(bindir)"' >$@@
- @end example
- This setup doesn't work, because Automake doesn't know that @file{foo.c}
- includes @file{bindir.h}. Remember, automatic dependency tracking works
- as a side-effect of compilation, so the dependencies of @file{foo.o} will
- be known only after @file{foo.o} has been compiled (@pxref{Dependencies}).
- The symptom is as follows.
- @example
- % make
- source='foo.c' object='foo.o' libtool=no \
- depfile='.deps/foo.Po' tmpdepfile='.deps/foo.TPo' \
- depmode=gcc /bin/sh ./depcomp \
- gcc -I. -I. -g -O2 -c `test -f 'foo.c' || echo './'`foo.c
- foo.c:2: bindir.h: No such file or directory
- make: *** [foo.o] Error 1
- @end example
- In this example @file{bindir.h} is not distributed nor installed, and
- it is not even being built on-time. One may wonder if the
- @samp{nodist_foo_SOURCES = bindir.h} line has any use at all. This
- line simply states that @file{bindir.h} is a source of @code{foo}, so
- for instance, it should be inspected while generating tags
- (@pxref{Tags}). In other words, it does not help our present problem,
- and the build would fail identically without it.
- @subsubheading Using @code{BUILT_SOURCES}
- A solution is to require @file{bindir.h} to be built before anything
- else. This is what @code{BUILT_SOURCES} is meant for (@pxref{Sources}).
- @example
- bin_PROGRAMS = foo
- foo_SOURCES = foo.c
- nodist_foo_SOURCES = bindir.h
- BUILT_SOURCES = bindir.h
- CLEANFILES = bindir.h
- bindir.h: Makefile
- echo '#define bindir "$(bindir)"' >$@@
- @end example
- See how @file{bindir.h} gets built first:
- @example
- % make
- echo '#define bindir "/usr/local/bin"' >bindir.h
- make all-am
- make[1]: Entering directory `/home/adl/tmp'
- source='foo.c' object='foo.o' libtool=no \
- depfile='.deps/foo.Po' tmpdepfile='.deps/foo.TPo' \
- depmode=gcc /bin/sh ./depcomp \
- gcc -I. -I. -g -O2 -c `test -f 'foo.c' || echo './'`foo.c
- gcc -g -O2 -o foo foo.o
- make[1]: Leaving directory `/home/adl/tmp'
- @end example
- However, as said earlier, @code{BUILT_SOURCES} applies only to the
- @code{all}, @code{check}, and @code{install} targets. It still fails
- if you try to run @samp{make foo} explicitly:
- @example
- % make clean
- test -z "bindir.h" || rm -f bindir.h
- test -z "foo" || rm -f foo
- rm -f *.o
- % : > .deps/foo.Po # Suppress previously recorded dependencies
- % make foo
- source='foo.c' object='foo.o' libtool=no \
- depfile='.deps/foo.Po' tmpdepfile='.deps/foo.TPo' \
- depmode=gcc /bin/sh ./depcomp \
- gcc -I. -I. -g -O2 -c `test -f 'foo.c' || echo './'`foo.c
- foo.c:2: bindir.h: No such file or directory
- make: *** [foo.o] Error 1
- @end example
- @subsubheading Recording Dependencies manually
- Usually people are happy enough with @code{BUILT_SOURCES} because they
- never build targets such as @samp{make foo} before @samp{make all}, as
- in the previous example. However if this matters to you, you can
- avoid @code{BUILT_SOURCES} and record such dependencies explicitly in
- the @file{Makefile.am}.
- @example
- bin_PROGRAMS = foo
- foo_SOURCES = foo.c
- nodist_foo_SOURCES = bindir.h
- foo.$(OBJEXT): bindir.h
- CLEANFILES = bindir.h
- bindir.h: Makefile
- echo '#define bindir "$(bindir)"' >$@@
- @end example
- You don't have to list @emph{all} the dependencies of @file{foo.o}
- explicitly, only those that might need to be built. If a dependency
- already exists, it will not hinder the first compilation and will be
- recorded by the normal dependency tracking code. (Note that after
- this first compilation the dependency tracking code will also have
- recorded the dependency between @file{foo.o} and
- @file{bindir.h}; so our explicit dependency is really useful to
- the first build only.)
- Adding explicit dependencies like this can be a bit dangerous if you are
- not careful enough. This is due to the way Automake tries not to
- overwrite your rules (it assumes you know better than it).
- @samp{foo.$(OBJEXT): bindir.h} supersedes any rule Automake may want to
- output to build @samp{foo.$(OBJEXT)}. It happens to work in this case
- because Automake doesn't have to output any @samp{foo.$(OBJEXT):}
- target: it relies on a suffix rule instead (i.e., @samp{.c.$(OBJEXT):}).
- Always check the generated @file{Makefile.in} if you do this.
- @subsubheading Build @file{bindir.h} from @file{configure}
- It's possible to define this preprocessor macro from @file{configure},
- either in @file{config.h} (@pxref{Defining Directories, , Defining
- Directories, autoconf, The Autoconf Manual}), or by processing a
- @file{bindir.h.in} file using @code{AC_CONFIG_FILES}
- (@pxref{Configuration Actions, ,Configuration Actions, autoconf, The
- Autoconf Manual}).
- At this point it should be clear that building @file{bindir.h} from
- @file{configure} works well for this example. @file{bindir.h} will exist
- before you build any target, hence will not cause any dependency issue.
- The Makefile can be shrunk as follows. We do not even have to mention
- @file{bindir.h}.
- @example
- bin_PROGRAMS = foo
- foo_SOURCES = foo.c
- @end example
- However, it's not always possible to build sources from
- @file{configure}, especially when these sources are generated by a tool
- that needs to be built first.
- @subsubheading Build @file{bindir.c}, not @file{bindir.h}.
- Another attractive idea is to define @code{bindir} as a variable or
- function exported from @file{bindir.o}, and build @file{bindir.c}
- instead of @file{bindir.h}.
- @example
- noinst_PROGRAMS = foo
- foo_SOURCES = foo.c bindir.h
- nodist_foo_SOURCES = bindir.c
- CLEANFILES = bindir.c
- bindir.c: Makefile
- echo 'const char bindir[] = "$(bindir)";' >$@@
- @end example
- @file{bindir.h} contains just the variable's declaration and doesn't
- need to be built, so it won't cause any trouble. @file{bindir.o} is
- always dependent on @file{bindir.c}, so @file{bindir.c} will get built
- first.
- @subsubheading Which is best?
- There is no panacea, of course. Each solution has its merits and
- drawbacks.
- You cannot use @code{BUILT_SOURCES} if the ability to run @samp{make
- foo} on a clean tree is important to you.
- You won't add explicit dependencies if you are leery of overriding
- an Automake rule by mistake.
- Building files from @file{./configure} is not always possible, neither
- is converting @file{.h} files into @file{.c} files.
- @node Other GNU Tools
- @chapter Other GNU Tools
- Since Automake is primarily intended to generate @file{Makefile.in}s for
- use in GNU programs, it tries hard to interoperate with other GNU tools.
- @menu
- * Emacs Lisp:: Emacs Lisp
- * gettext:: Gettext
- * Libtool:: Libtool
- * Java:: Java bytecode compilation (deprecated)
- * Python:: Python
- @end menu
- @node Emacs Lisp
- @section Emacs Lisp
- @cindex @code{_LISP} primary, defined
- @cindex @code{LISP} primary, defined
- @cindex Primary variable, @code{LISP}
- @vindex _LISP
- @vindex lisp_LISP
- @vindex noinst_LISP
- Automake provides some support for Emacs Lisp. The @code{LISP} primary
- is used to hold a list of @file{.el} files. Possible prefixes for this
- primary are @code{lisp_} and @code{noinst_}. Note that if
- @code{lisp_LISP} is defined, then @file{configure.ac} must run
- @code{AM_PATH_LISPDIR} (@pxref{Macros}).
- @vindex dist_lisp_LISP
- @vindex dist_noinst_LISP
- Lisp sources are not distributed by default. You can prefix the
- @code{LISP} primary with @code{dist_}, as in @code{dist_lisp_LISP} or
- @code{dist_noinst_LISP}, to indicate that these files should be
- distributed.
- Automake will byte-compile all Emacs Lisp source files using the Emacs
- found by @code{AM_PATH_LISPDIR}, if any was found. When performing such
- byte-compilation, the flags specified in the (developer-reserved)
- @code{AM_ELCFLAGS} and (user-reserved) @code{ELCFLAGS} make variables
- will be passed to the Emacs invocation.
- Byte-compiled Emacs Lisp files are not portable among all versions of
- Emacs, so it makes sense to turn this off if you expect sites to have
- more than one version of Emacs installed. Furthermore, many packages
- don't actually benefit from byte-compilation. Still, we recommend
- that you byte-compile your Emacs Lisp sources. It is probably better
- for sites with strange setups to cope for themselves than to make the
- installation less nice for everybody else.
- There are two ways to avoid byte-compiling. Historically, we have
- recommended the following construct.
- @example
- lisp_LISP = file1.el file2.el
- ELCFILES =
- @end example
- @noindent
- @code{ELCFILES} is an internal Automake variable that normally lists
- all @file{.elc} files that must be byte-compiled. Automake defines
- @code{ELCFILES} automatically from @code{lisp_LISP}. Emptying this
- variable explicitly prevents byte-compilation.
- Since Automake 1.8, we now recommend using @code{lisp_DATA} instead:
- @c Keep in sync with primary-prefix-couples-documented-valid.sh
- @example
- lisp_DATA = file1.el file2.el
- @end example
- Note that these two constructs are not equivalent. @code{_LISP} will
- not install a file if Emacs is not installed, while @code{_DATA} will
- always install its files.
- @node gettext
- @section Gettext
- @cindex GNU Gettext support
- @cindex Gettext support
- @cindex Support for GNU Gettext
- If @code{AM_GNU_GETTEXT} is seen in @file{configure.ac}, then Automake
- turns on support for GNU gettext, a message catalog system for
- internationalization
- (@pxref{Top, , Introduction, gettext, GNU gettext utilities}).
- The @code{gettext} support in Automake requires the addition of one or
- two subdirectories to the package: @file{po} and possibly also @file{intl}.
- The latter is needed if @code{AM_GNU_GETTEXT} is not invoked with the
- @samp{external} argument, or if @code{AM_GNU_GETTEXT_INTL_SUBDIR} is used.
- Automake ensures that these directories exist and are mentioned in
- @code{SUBDIRS}.
- @node Libtool
- @section Libtool
- Automake provides support for GNU Libtool (@pxref{Top, , Introduction,
- libtool, The Libtool Manual}) with the @code{LTLIBRARIES} primary.
- @xref{A Shared Library}.
- @node Java
- @section Java bytecode compilation (deprecated)
- @cindex @code{_JAVA} primary, defined
- @cindex @code{JAVA} primary, defined
- @cindex Primary variable, @code{JAVA}
- @cindex Java to bytecode, compilation
- @cindex Compilation of Java to bytecode
- Automake provides some minimal support for Java bytecode compilation with
- the @code{JAVA} primary (in addition to the support for compiling Java to
- native machine code; @pxref{Java Support with gcj}). Note however that
- @emph{the interface and most features described here are deprecated}.
- Future Automake releases will strive to provide a better and cleaner
- interface, which however @emph{won't be backward-compatible}; the present
- interface will probably be removed altogether some time after the
- introduction of the new interface (if that ever materializes). In any
- case, the current @code{JAVA} primary features are frozen and will no
- longer be developed, not even to take bug fixes.
- Any @file{.java} files listed in a @code{_JAVA} variable will be
- compiled with @code{JAVAC} at build time. By default, @file{.java}
- files are not included in the distribution, you should use the
- @code{dist_} prefix to distribute them.
- Here is a typical setup for distributing @file{.java} files and
- installing the @file{.class} files resulting from their compilation.
- @c Keep in sync with primary-prefix-couples-documented-valid.sh
- @example
- javadir = $(datadir)/java
- dist_java_JAVA = a.java b.java @dots{}
- @end example
- @cindex @code{JAVA} restrictions
- @cindex Restrictions for @code{JAVA}
- Currently Automake enforces the restriction that only one @code{_JAVA}
- primary can be used in a given @file{Makefile.am}. The reason for this
- restriction is that, in general, it isn't possible to know which
- @file{.class} files were generated from which @file{.java} files, so
- it would be impossible to know which files to install where. For
- instance, a @file{.java} file can define multiple classes; the resulting
- @file{.class} file names cannot be predicted without parsing the
- @file{.java} file.
- There are a few variables that are used when compiling Java sources:
- @vtable @code
- @item JAVAC
- The name of the Java compiler. This defaults to @samp{javac}.
- @item JAVACFLAGS
- The flags to pass to the compiler. This is considered to be a user
- variable (@pxref{User Variables}).
- @item AM_JAVACFLAGS
- More flags to pass to the Java compiler. This, and not
- @code{JAVACFLAGS}, should be used when it is necessary to put Java
- compiler flags into @file{Makefile.am}.
- @item JAVAROOT
- The value of this variable is passed to the @option{-d} option to
- @code{javac}. It defaults to @samp{$(top_builddir)}.
- @item CLASSPATH_ENV
- This variable is a shell expression that is used to set the
- @env{CLASSPATH} environment variable on the @code{javac} command line.
- (In the future we will probably handle class path setting differently.)
- @end vtable
- @node Python
- @section Python
- @cindex @code{_PYTHON} primary, defined
- @cindex @code{PYTHON} primary, defined
- @cindex Primary variable, @code{PYTHON}
- @vindex _PYTHON
- Automake provides support for Python compilation with the
- @code{PYTHON} primary. A typical setup is to call
- @code{AM_PATH_PYTHON} in @file{configure.ac} and use a line like the
- following in @file{Makefile.am}:
- @example
- python_PYTHON = tree.py leave.py
- @end example
- Any files listed in a @code{_PYTHON} variable will be byte-compiled
- with @command{py-compile} at install time. @command{py-compile}
- actually creates both standard (@file{.pyc}) and optimized
- (@file{.pyo}) byte-compiled versions of the source files. Note that
- because byte-compilation occurs at install time, any files listed in
- @code{noinst_PYTHON} will not be compiled. Python source files are
- included in the distribution by default, prepend @code{nodist_} (as in
- @code{nodist_python_PYTHON}) to omit them.
- Automake ships with an Autoconf macro called @code{AM_PATH_PYTHON}
- that will determine some Python-related directory variables (see
- below). If you have called @code{AM_PATH_PYTHON} from
- @file{configure.ac}, then you may use the variables
- @c Keep in sync with primary-prefix-couples-documented-valid.sh
- @code{python_PYTHON} or @code{pkgpython_PYTHON} to list Python source
- files in your @file{Makefile.am}, depending on where you want your files
- installed (see the definitions of @code{pythondir} and
- @code{pkgpythondir} below).
- @defmac AM_PATH_PYTHON (@ovar{version}, @ovar{action-if-found},
- @ovar{action-if-not-found})
- Search for a Python interpreter on the system. This macro takes three
- optional arguments. The first argument, if present, is the minimum
- version of Python required for this package: @code{AM_PATH_PYTHON}
- will skip any Python interpreter that is older than @var{version}.
- If an interpreter is found and satisfies @var{version}, then
- @var{action-if-found} is run. Otherwise, @var{action-if-not-found} is
- run.
- If @var{action-if-not-found} is not specified, as in the following
- example, the default is to abort @command{configure}.
- @example
- AM_PATH_PYTHON([2.2])
- @end example
- @noindent
- This is fine when Python is an absolute requirement for the package.
- If Python >= 2.5 was only @emph{optional} to the package,
- @code{AM_PATH_PYTHON} could be called as follows.
- @example
- AM_PATH_PYTHON([2.5],, [:])
- @end example
- If the @env{PYTHON} variable is set when @code{AM_PATH_PYTHON} is
- called, then that will be the only Python interpreter that is tried.
- @code{AM_PATH_PYTHON} creates the following output variables based on
- the Python installation found during configuration.
- @end defmac
- @vtable @code
- @item PYTHON
- The name of the Python executable, or @samp{:} if no suitable
- interpreter could be found.
- Assuming @var{action-if-not-found} is used (otherwise @file{./configure}
- will abort if Python is absent), the value of @code{PYTHON} can be used
- to setup a conditional in order to disable the relevant part of a build
- as follows.
- @example
- AM_PATH_PYTHON(,, [:])
- AM_CONDITIONAL([HAVE_PYTHON], [test "$PYTHON" != :])
- @end example
- @item PYTHON_VERSION
- The Python version number, in the form @var{major}.@var{minor}
- (e.g., @samp{2.5}). This is currently the value of
- @samp{sys.version[:3]}.
- @item PYTHON_PREFIX
- The string @samp{$@{prefix@}}. This term may be used in future work
- that needs the contents of Python's @samp{sys.prefix}, but general
- consensus is to always use the value from @command{configure}.
- @item PYTHON_EXEC_PREFIX
- The string @samp{$@{exec_prefix@}}. This term may be used in future work
- that needs the contents of Python's @samp{sys.exec_prefix}, but general
- consensus is to always use the value from @command{configure}.
- @item PYTHON_PLATFORM
- The canonical name used by Python to describe the operating system, as
- given by @samp{sys.platform}. This value is sometimes needed when
- building Python extensions.
- @item pythondir
- The directory name for the @file{site-packages} subdirectory of the
- standard Python install tree.
- @item pkgpythondir
- This is the directory under @code{pythondir} that is named after the
- package. That is, it is @samp{$(pythondir)/$(PACKAGE)}. It is provided
- as a convenience.
- @item pyexecdir
- This is the directory where Python extension modules (shared libraries)
- should be installed. An extension module written in C could be declared
- as follows to Automake:
- @c Keep in sync with primary-prefix-couples-documented-valid.sh
- @example
- pyexec_LTLIBRARIES = quaternion.la
- quaternion_la_SOURCES = quaternion.c support.c support.h
- quaternion_la_LDFLAGS = -avoid-version -module
- @end example
- @item pkgpyexecdir
- This is a convenience variable that is defined as
- @samp{$(pyexecdir)/$(PACKAGE)}.
- @end vtable
- All of these directory variables have values that start with either
- @samp{$@{prefix@}} or @samp{$@{exec_prefix@}} unexpanded. This works
- fine in @file{Makefiles}, but it makes these variables hard to use in
- @file{configure}. This is mandated by the GNU coding standards, so
- that the user can run @samp{make prefix=/foo install}. The Autoconf
- manual has a section with more details on this topic
- (@pxref{Installation Directory Variables, , Installation Directory
- Variables, autoconf, The Autoconf Manual}). See also @ref{Hard-Coded
- Install Paths}.
- @node Documentation
- @chapter Building documentation
- Currently Automake provides support for Texinfo and man pages.
- @menu
- * Texinfo:: Texinfo
- * Man Pages:: Man pages
- @end menu
- @node Texinfo
- @section Texinfo
- @cindex @code{_TEXINFOS} primary, defined
- @cindex @code{TEXINFOS} primary, defined
- @cindex Primary variable, @code{TEXINFOS}
- @cindex HTML output using Texinfo
- @cindex PDF output using Texinfo
- @cindex PS output using Texinfo
- @cindex DVI output using Texinfo
- @vindex _TEXINFOS
- @vindex info_TEXINFOS
- If the current directory contains Texinfo source, you must declare it
- with the @code{TEXINFOS} primary. Generally Texinfo files are converted
- into info, and thus the @code{info_TEXINFOS} variable is most commonly used
- here. Any Texinfo source file should have the @file{.texi} extension.
- Automake also accepts @file{.txi} or @file{.texinfo} extensions, but their
- use is discouraged now, and will elicit runtime warnings.
- Automake generates rules to build @file{.info}, @file{.dvi},
- @file{.ps}, @file{.pdf} and @file{.html} files from your Texinfo
- sources. Following the GNU Coding Standards, only the @file{.info}
- files are built by @samp{make all} and installed by @samp{make
- install} (unless you use @option{no-installinfo}, see below).
- Furthermore, @file{.info} files are automatically distributed so that
- Texinfo is not a prerequisite for installing your package.
- It is worth noting that, contrary to what happens with the other formats,
- the generated @file{.info} files are by default placed in @code{srcdir}
- rather than in the @code{builddir}. This can be changed with the
- @option{info-in-builddir} option.
- @trindex dvi
- @trindex html
- @trindex pdf
- @trindex ps
- @trindex install-dvi
- @trindex install-html
- @trindex install-pdf
- @trindex install-ps
- Other documentation formats can be built on request by @samp{make
- dvi}, @samp{make ps}, @samp{make pdf} and @samp{make html}, and they
- can be installed with @samp{make install-dvi}, @samp{make install-ps},
- @samp{make install-pdf} and @samp{make install-html} explicitly.
- @samp{make uninstall} will remove everything: the Texinfo
- documentation installed by default as well as all the above optional
- formats.
- All of these targets can be extended using @samp{-local} rules
- (@pxref{Extending}).
- @cindex Texinfo flag, @code{VERSION}
- @cindex Texinfo flag, @code{UPDATED}
- @cindex Texinfo flag, @code{EDITION}
- @cindex Texinfo flag, @code{UPDATED-MONTH}
- @cindex @code{VERSION} Texinfo flag
- @cindex @code{UPDATED} Texinfo flag
- @cindex @code{EDITION} Texinfo flag
- @cindex @code{UPDATED-MONTH} Texinfo flag
- @cindex @file{mdate-sh}
- If the @file{.texi} file @code{@@include}s @file{version.texi}, then
- that file will be automatically generated. The file @file{version.texi}
- defines four Texinfo flags you can reference using
- @code{@@value@{EDITION@}}, @code{@@value@{VERSION@}},
- @code{@@value@{UPDATED@}}, and @code{@@value@{UPDATED-MONTH@}}.
- @table @code
- @item EDITION
- @itemx VERSION
- Both of these flags hold the version number of your program. They are
- kept separate for clarity.
- @item UPDATED
- This holds the date the primary @file{.texi} file was last modified.
- @item UPDATED-MONTH
- This holds the name of the month in which the primary @file{.texi} file
- was last modified.
- @end table
- The @file{version.texi} support requires the @command{mdate-sh}
- script; this script is supplied with Automake and automatically
- included when @command{automake} is invoked with the
- @option{--add-missing} option.
- If you have multiple Texinfo files, and you want to use the
- @file{version.texi} feature, then you have to have a separate version
- file for each Texinfo file. Automake will treat any include in a
- Texinfo file that matches @file{vers*.texi} just as an automatically
- generated version file.
- Sometimes an info file actually depends on more than one @file{.texi}
- file. For instance, in GNU Hello, @file{hello.texi} includes the file
- @file{fdl.texi}. You can tell Automake about these dependencies using
- the @code{@var{texi}_TEXINFOS} variable. Here is how GNU Hello does it:
- @vindex TEXINFOS
- @vindex _TEXINFOS
- @example
- info_TEXINFOS = hello.texi
- hello_TEXINFOS = fdl.texi
- @end example
- @cindex @file{texinfo.tex}
- By default, Automake requires the file @file{texinfo.tex} to appear in
- the same directory as the @file{Makefile.am} file that lists the
- @file{.texi} files. If you used @code{AC_CONFIG_AUX_DIR} in
- @file{configure.ac} (@pxref{Input, , Finding `configure' Input,
- autoconf, The Autoconf Manual}), then @file{texinfo.tex} is looked for
- there. In both cases, @command{automake} then supplies @file{texinfo.tex} if
- @option{--add-missing} is given, and takes care of its distribution.
- However, if you set the @code{TEXINFO_TEX} variable (see below),
- it overrides the location of the file and turns off its installation
- into the source as well as its distribution.
- The option @option{no-texinfo.tex} can be used to eliminate the
- requirement for the file @file{texinfo.tex}. Use of the variable
- @code{TEXINFO_TEX} is preferable, however, because that allows the
- @code{dvi}, @code{ps}, and @code{pdf} targets to still work.
- @cindex Option, @code{no-installinfo}
- @cindex Target, @code{install-info}
- @cindex @code{install-info} target
- @cindex @code{no-installinfo} option
- @opindex no-installinfo
- @trindex install-info
- Automake generates an @code{install-info} rule; some people apparently
- use this. By default, info pages are installed by @samp{make
- install}, so running @code{make install-info} is pointless. This can
- be prevented via the @code{no-installinfo} option. In this case,
- @file{.info} files are not installed by default, and user must
- request this explicitly using @samp{make install-info}.
- @vindex AM_UPDATE_INFO_DIR
- By default, @code{make install-info} and @code{make uninstall-info}
- will try to run the @command{install-info} program (if available) to
- update (or create/remove) the @file{@code{$@{infodir@}}/dir} index.
- If this is undesired, it can be prevented by exporting the
- @code{AM_UPDATE_INFO_DIR} variable to "@code{no}".
- The following variables are used by the Texinfo build rules.
- @vtable @code
- @item MAKEINFO
- The name of the program invoked to build @file{.info} files. This
- variable is defined by Automake. If the @command{makeinfo} program is
- found on the system then it will be used by default; otherwise
- @command{missing} will be used instead.
- @item MAKEINFOHTML
- The command invoked to build @file{.html} files. Automake
- defines this to @samp{$(MAKEINFO) --html}.
- @item MAKEINFOFLAGS
- User flags passed to each invocation of @samp{$(MAKEINFO)} and
- @samp{$(MAKEINFOHTML)}. This user variable (@pxref{User Variables}) is
- not expected to be defined in any @file{Makefile}; it can be used by
- users to pass extra flags to suit their needs.
- @item AM_MAKEINFOFLAGS
- @itemx AM_MAKEINFOHTMLFLAGS
- Maintainer flags passed to each @command{makeinfo} invocation. Unlike
- @code{MAKEINFOFLAGS}, these variables are meant to be defined by
- maintainers in @file{Makefile.am}. @samp{$(AM_MAKEINFOFLAGS)} is
- passed to @code{makeinfo} when building @file{.info} files; and
- @samp{$(AM_MAKEINFOHTMLFLAGS)} is used when building @file{.html}
- files.
- @c Keep in sync with txinfo-many-output-formats.sh
- For instance, the following setting can be used to obtain one single
- @file{.html} file per manual, without node separators.
- @example
- AM_MAKEINFOHTMLFLAGS = --no-headers --no-split
- @end example
- @code{AM_MAKEINFOHTMLFLAGS} defaults to @samp{$(AM_MAKEINFOFLAGS)}.
- This means that defining @code{AM_MAKEINFOFLAGS} without defining
- @code{AM_MAKEINFOHTMLFLAGS} will impact builds of both @file{.info}
- and @file{.html} files.
- @item TEXI2DVI
- The name of the command that converts a @file{.texi} file into a
- @file{.dvi} file. This defaults to @samp{texi2dvi}, a script that ships
- with the Texinfo package.
- @item TEXI2PDF
- The name of the command that translates a @file{.texi} file into a
- @file{.pdf} file. This defaults to @samp{$(TEXI2DVI) --pdf --batch}.
- @item DVIPS
- The name of the command that builds a @file{.ps} file out of a
- @file{.dvi} file. This defaults to @samp{dvips}.
- @item TEXINFO_TEX
- If your package has Texinfo files in many directories, you can use the
- variable @code{TEXINFO_TEX} to tell Automake where to find the canonical
- @file{texinfo.tex} for your package. The value of this variable should
- be the relative path from the current @file{Makefile.am} to
- @file{texinfo.tex}:
- @example
- TEXINFO_TEX = ../doc/texinfo.tex
- @end example
- @end vtable
- @node Man Pages
- @section Man Pages
- @cindex @code{_MANS} primary, defined
- @cindex @code{MANS} primary, defined
- @cindex Primary variable, @code{MANS}
- @vindex _MANS
- @vindex man_MANS
- A package can also include man pages (but see the GNU standards on this
- matter, @ref{Man Pages, , , standards, The GNU Coding Standards}.) Man
- pages are declared using the @code{MANS} primary. Generally the
- @code{man_MANS} variable is used. Man pages are automatically installed in
- the correct subdirectory of @code{mandir}, based on the file extension.
- File extensions such as @file{.1c} are handled by looking for the valid
- part of the extension and using that to determine the correct
- subdirectory of @code{mandir}. Valid section names are the digits
- @samp{0} through @samp{9}, and the letters @samp{l} and @samp{n}.
- Sometimes developers prefer to name a man page something like
- @file{foo.man} in the source, and then rename it to have the correct
- suffix, for example @file{foo.1}, when installing the file. Automake
- also supports this mode. For a valid section named @var{section},
- there is a corresponding directory named @samp{man@var{section}dir},
- and a corresponding @code{_MANS} variable. Files listed in such a
- variable are installed in the indicated section. If the file already
- has a valid suffix, then it is installed as-is; otherwise the file
- suffix is changed to match the section.
- For instance, consider this example:
- @example
- man1_MANS = rename.man thesame.1 alsothesame.1c
- @end example
- @noindent
- In this case, @file{rename.man} will be renamed to @file{rename.1} when
- installed, but the other files will keep their names.
- @cindex Target, @code{install-man}
- @cindex Option, @option{no-installman}
- @cindex @code{install-man} target
- @cindex @option{no-installman} option
- @opindex no-installman
- @trindex install-man
- By default, man pages are installed by @samp{make install}. However,
- since the GNU project does not require man pages, many maintainers do
- not expend effort to keep the man pages up to date. In these cases, the
- @option{no-installman} option will prevent the man pages from being
- installed by default. The user can still explicitly install them via
- @samp{make install-man}.
- For fast installation, with many files it is preferable to use
- @samp{man@var{section}_MANS} over @samp{man_MANS} as well as files that
- do not need to be renamed.
- Man pages are not currently considered to be source, because it is not
- uncommon for man pages to be automatically generated. Therefore they
- are not automatically included in the distribution. However, this can
- be changed by use of the @code{dist_} prefix. For instance here is
- how to distribute and install the two man pages of GNU @command{cpio}
- (which includes both Texinfo documentation and man pages):
- @example
- dist_man_MANS = cpio.1 mt.1
- @end example
- The @code{nobase_} prefix is meaningless for man pages and is
- disallowed.
- @vindex notrans_
- @cindex @code{notrans_} prefix
- @cindex Man page renaming, avoiding
- @cindex Avoiding man page renaming
- Executables and manpages may be renamed upon installation
- (@pxref{Renaming}). For manpages this can be avoided by use of the
- @code{notrans_} prefix. For instance, suppose an executable @samp{foo}
- allowing to access a library function @samp{foo} from the command line.
- The way to avoid renaming of the @file{foo.3} manpage is:
- @example
- man_MANS = foo.1
- notrans_man_MANS = foo.3
- @end example
- @cindex @code{notrans_} and @code{dist_} or @code{nodist_}
- @cindex @code{dist_} and @code{notrans_}
- @cindex @code{nodist_} and @code{notrans_}
- @samp{notrans_} must be specified first when used in conjunction with
- either @samp{dist_} or @samp{nodist_} (@pxref{Fine-grained Distribution
- Control}). For instance:
- @example
- notrans_dist_man3_MANS = bar.3
- @end example
- @node Install
- @chapter What Gets Installed
- @cindex Installation support
- @cindex @samp{make install} support
- Naturally, Automake handles the details of actually installing your
- program once it has been built. All files named by the various
- primaries are automatically installed in the appropriate places when the
- user runs @samp{make install}.
- @menu
- * Basics of Installation:: What gets installed where
- * The Two Parts of Install:: Installing data and programs separately
- * Extending Installation:: Adding your own rules for installation
- * Staged Installs:: Installation in a temporary location
- * Install Rules for the User:: Useful additional rules
- @end menu
- @node Basics of Installation
- @section Basics of Installation
- A file named in a primary is installed by copying the built file into
- the appropriate directory. The base name of the file is used when
- installing.
- @example
- bin_PROGRAMS = hello subdir/goodbye
- @end example
- In this example, both @samp{hello} and @samp{goodbye} will be installed
- in @samp{$(bindir)}.
- Sometimes it is useful to avoid the basename step at install time. For
- instance, you might have a number of header files in subdirectories of
- the source tree that are laid out precisely how you want to install
- them. In this situation you can use the @code{nobase_} prefix to
- suppress the base name step. For example:
- @example
- nobase_include_HEADERS = stdio.h sys/types.h
- @end example
- @noindent
- will install @file{stdio.h} in @samp{$(includedir)} and @file{types.h}
- in @samp{$(includedir)/sys}.
- For most file types, Automake will install multiple files at once, while
- avoiding command line length issues (@pxref{Length Limitations}). Since
- some @command{install} programs will not install the same file twice in
- one invocation, you may need to ensure that file lists are unique within
- one variable such as @samp{nobase_include_HEADERS} above.
- You should not rely on the order in which files listed in one variable
- are installed. Likewise, to cater for parallel make, you should not
- rely on any particular file installation order even among different
- file types (library dependencies are an exception here).
- @node The Two Parts of Install
- @section The Two Parts of Install
- Automake generates separate @code{install-data} and @code{install-exec}
- rules, in case the installer is installing on multiple machines that
- share directory structure---these targets allow the machine-independent
- parts to be installed only once. @code{install-exec} installs
- platform-dependent files, and @code{install-data} installs
- platform-independent files. The @code{install} target depends on both
- of these targets. While Automake tries to automatically segregate
- objects into the correct category, the @file{Makefile.am} author is, in
- the end, responsible for making sure this is done correctly.
- @trindex install-data
- @trindex install-exec
- @trindex install
- @cindex Install, two parts of
- Variables using the standard directory prefixes @samp{data},
- @samp{info}, @samp{man}, @samp{include}, @samp{oldinclude},
- @samp{pkgdata}, or @samp{pkginclude} are installed by
- @code{install-data}.
- Variables using the standard directory prefixes @samp{bin},
- @samp{sbin}, @samp{libexec}, @samp{sysconf}, @samp{localstate},
- @samp{lib}, or @samp{pkglib} are installed by @code{install-exec}.
- For instance, @code{data_DATA} files are installed by @code{install-data},
- while @code{bin_PROGRAMS} files are installed by @code{install-exec}.
- Any variable using a user-defined directory prefix with
- @samp{exec} in the name (e.g.,
- @c Keep in sync with primary-prefix-couples-documented-valid.sh
- @code{myexecbin_PROGRAMS}) is installed by @code{install-exec}. All
- other user-defined prefixes are installed by @code{install-data}.
- @node Extending Installation
- @section Extending Installation
- It is possible to extend this mechanism by defining an
- @code{install-exec-local} or @code{install-data-local} rule. If these
- rules exist, they will be run at @samp{make install} time. These
- rules can do almost anything; care is required.
- @trindex install-exec-local
- @trindex install-data-local
- Automake also supports two install hooks, @code{install-exec-hook} and
- @code{install-data-hook}. These hooks are run after all other install
- rules of the appropriate type, exec or data, have completed. So, for
- instance, it is possible to perform post-installation modifications
- using an install hook. @xref{Extending}, for some examples.
- @cindex Install hook
- @node Staged Installs
- @section Staged Installs
- @vindex DESTDIR
- Automake generates support for the @code{DESTDIR} variable in all
- install rules. @code{DESTDIR} is used during the @samp{make install}
- step to relocate install objects into a staging area. Each object and
- path is prefixed with the value of @code{DESTDIR} before being copied
- into the install area. Here is an example of typical DESTDIR usage:
- @example
- mkdir /tmp/staging &&
- make DESTDIR=/tmp/staging install
- @end example
- The @command{mkdir} command avoids a security problem if the attacker
- creates a symbolic link from @file{/tmp/staging} to a victim area;
- then @command{make} places install objects in a directory tree built under
- @file{/tmp/staging}. If @file{/gnu/bin/foo} and
- @file{/gnu/share/aclocal/foo.m4} are to be installed, the above command
- would install @file{/tmp/staging/gnu/bin/foo} and
- @file{/tmp/staging/gnu/share/aclocal/foo.m4}.
- This feature is commonly used to build install images and packages
- (@pxref{DESTDIR}).
- Support for @code{DESTDIR} is implemented by coding it directly into
- the install rules. If your @file{Makefile.am} uses a local install
- rule (e.g., @code{install-exec-local}) or an install hook, then you
- must write that code to respect @code{DESTDIR}.
- @xref{Makefile Conventions, , , standards, The GNU Coding Standards},
- for another usage example.
- @node Install Rules for the User
- @section Install Rules for the User
- Automake also generates rules for targets @code{uninstall},
- @code{installdirs}, and @code{install-strip}.
- @trindex uninstall
- @trindex installdirs
- @trindex install-strip
- Automake supports @code{uninstall-local} and @code{uninstall-hook}.
- There is no notion of separate uninstalls for ``exec'' and ``data'', as
- these features would not provide additional functionality.
- Note that @code{uninstall} is not meant as a replacement for a real
- packaging tool.
- @node Clean
- @chapter What Gets Cleaned
- @cindex @samp{make clean} support
- The GNU Makefile Standards specify a number of different clean rules.
- @xref{Standard Targets, , Standard Targets for Users, standards,
- The GNU Coding Standards}.
- Generally the files that can be cleaned are determined automatically by
- Automake. Of course, Automake also recognizes some variables that can
- be defined to specify additional files to clean. These variables are
- @code{MOSTLYCLEANFILES}, @code{CLEANFILES}, @code{DISTCLEANFILES}, and
- @code{MAINTAINERCLEANFILES}.
- @vindex MOSTLYCLEANFILES
- @vindex CLEANFILES
- @vindex DISTCLEANFILES
- @vindex MAINTAINERCLEANFILES
- @trindex mostlyclean-local
- @trindex clean-local
- @trindex distclean-local
- @trindex maintainer-clean-local
- When cleaning involves more than deleting some hard-coded list of
- files, it is also possible to supplement the cleaning rules with your
- own commands. Simply define a rule for any of the
- @code{mostlyclean-local}, @code{clean-local}, @code{distclean-local},
- or @code{maintainer-clean-local} targets (@pxref{Extending}). A common
- case is deleting a directory, for instance, a directory created by the
- test suite:
- @example
- clean-local:
- -rm -rf testSubDir
- @end example
- Since @command{make} allows only one set of rules for a given target,
- a more extensible way of writing this is to use a separate target
- listed as a dependency:
- @example
- clean-local: clean-local-check
- .PHONY: clean-local-check
- clean-local-check:
- -rm -rf testSubDir
- @end example
- As the GNU Standards aren't always explicit as to which files should
- be removed by which rule, we've adopted a heuristic that we believe
- was first formulated by Fran@,{c}ois Pinard:
- @itemize @bullet
- @item
- If @command{make} built it, and it is commonly something that one would
- want to rebuild (for instance, a @file{.o} file), then
- @code{mostlyclean} should delete it.
- @item
- Otherwise, if @command{make} built it, then @code{clean} should delete it.
- @item
- If @command{configure} built it, then @code{distclean} should delete it.
- @item
- If the maintainer built it (for instance, a @file{.info} file), then
- @code{maintainer-clean} should delete it. However
- @code{maintainer-clean} should not delete anything that needs to exist
- in order to run @samp{./configure && make}.
- @end itemize
- We recommend that you follow this same set of heuristics in your
- @file{Makefile.am}.
- @node Dist
- @chapter What Goes in a Distribution
- @menu
- * Basics of Distribution:: Files distributed by default
- * Fine-grained Distribution Control:: @code{dist_} and @code{nodist_} prefixes
- * The dist Hook:: A target for last-minute distribution changes
- * Checking the Distribution:: @samp{make distcheck} explained
- * The Types of Distributions:: A variety of formats and compression methods
- @end menu
- @node Basics of Distribution
- @section Basics of Distribution
- @cindex @samp{make dist}
- @vindex PACKAGE
- @vindex VERSION
- @trindex dist
- The @code{dist} rule in the generated @file{Makefile.in} can be used
- to generate a gzipped @code{tar} file and other flavors of archive for
- distribution. The file is named based on the @code{PACKAGE} and
- @code{VERSION} variables automatically defined by either the
- @code{AC_INIT} invocation or by a @emph{deprecated} two-arguments
- invocation of the @code{AM_INIT_AUTOMAKE} macro (see @ref{Public Macros}
- for how these variables get their values, from either defaults or explicit
- values -- it's slightly trickier than one would expect).
- More precisely the gzipped @code{tar} file is named
- @samp{$@{PACKAGE@}-$@{VERSION@}.tar.gz}.
- @vindex GZIP_ENV
- You can use the @command{make} variable @code{GZIP_ENV} to control how gzip
- is run. The default setting is @option{--best}.
- @cindex @code{m4_include}, distribution
- @cindex @code{include}, distribution
- @acindex m4_include
- @cmindex include
- For the most part, the files to distribute are automatically found by
- Automake: all source files are automatically included in a distribution,
- as are all @file{Makefile.am} and @file{Makefile.in} files. Automake also
- has a built-in list of commonly used files that are automatically
- included if they are found in the current directory (either physically,
- or as the target of a @file{Makefile.am} rule); this list is printed by
- @samp{automake --help}. Note that some files in this list are actually
- distributed only if other certain conditions hold (for example,
- @c Keep in sync with autodist-config-headers.sh
- the @file{config.h.top} and @file{config.h.bot} files are automatically
- distributed only if, e.g., @samp{AC_CONFIG_HEADERS([config.h])} is used
- in @file{configure.ac}). Also, files that are read by @command{configure}
- (i.e.@: the source files corresponding to the files specified in various
- Autoconf macros such as @code{AC_CONFIG_FILES} and siblings) are
- automatically distributed. Files included in a @file{Makefile.am} (using
- @code{include}) or in @file{configure.ac} (using @code{m4_include}), and
- helper scripts installed with @samp{automake --add-missing} are also
- distributed.
- @vindex EXTRA_DIST
- Still, sometimes there are files that must be distributed, but which
- are not covered in the automatic rules. These files should be listed in
- the @code{EXTRA_DIST} variable. You can mention files from
- subdirectories in @code{EXTRA_DIST}.
- You can also mention a directory in @code{EXTRA_DIST}; in this case the
- entire directory will be recursively copied into the distribution.
- Please note that this will also copy @emph{everything} in the directory,
- including, e.g., Subversion's @file{.svn} private directories or CVS/RCS
- version control files; thus we recommend against using this feature
- as-is. However, you can use the @code{dist-hook} feature to
- ameliorate the problem; @pxref{The dist Hook}.
- @vindex SUBDIRS
- @vindex DIST_SUBDIRS
- If you define @code{SUBDIRS}, Automake will recursively include the
- subdirectories in the distribution. If @code{SUBDIRS} is defined
- conditionally (@pxref{Conditionals}), Automake will normally include
- all directories that could possibly appear in @code{SUBDIRS} in the
- distribution. If you need to specify the set of directories
- conditionally, you can set the variable @code{DIST_SUBDIRS} to the
- exact list of subdirectories to include in the distribution
- (@pxref{Conditional Subdirectories}).
- @node Fine-grained Distribution Control
- @section Fine-grained Distribution Control
- @vindex dist_
- @vindex nodist_
- Sometimes you need tighter control over what does @emph{not} go into the
- distribution; for instance, you might have source files that are
- generated and that you do not want to distribute. In this case
- Automake gives fine-grained control using the @code{dist} and
- @code{nodist} prefixes. Any primary or @code{_SOURCES} variable can be
- prefixed with @code{dist_} to add the listed files to the distribution.
- Similarly, @code{nodist_} can be used to omit the files from the
- distribution.
- As an example, here is how you would cause some data to be distributed
- while leaving some source code out of the distribution:
- @example
- dist_data_DATA = distribute-this
- bin_PROGRAMS = foo
- nodist_foo_SOURCES = do-not-distribute.c
- @end example
- @node The dist Hook
- @section The dist Hook
- @trindex dist-hook
- Occasionally it is useful to be able to change the distribution before
- it is packaged up. If the @code{dist-hook} rule exists, it is run
- after the distribution directory is filled, but before the actual
- distribution archives are created. One way to use this is for
- removing unnecessary files that get recursively included by specifying
- a directory in @code{EXTRA_DIST}:
- @example
- EXTRA_DIST = doc
- dist-hook:
- rm -rf `find $(distdir)/doc -type d -name .svn`
- @end example
- @c The caveats described here should be documented in 'disthook.sh'.
- @noindent
- Note that the @code{dist-hook} recipe shouldn't assume that the regular
- files in the distribution directory are writable; this might not be the
- case if one is packaging from a read-only source tree, or when a
- @code{make distcheck} is being done. For similar reasons, the recipe
- shouldn't assume that the subdirectories put into the distribution
- directory as effect of having them listed in @code{EXTRA_DIST} are
- writable. So, if the @code{dist-hook} recipe wants to modify the
- content of an existing file (or @code{EXTRA_DIST} subdirectory) in the
- distribution directory, it should explicitly to make it writable first:
- @example
- EXTRA_DIST = README doc
- dist-hook:
- chmod u+w $(distdir)/README $(distdir)/doc
- echo "Distribution date: `date`" >> README
- rm -f $(distdir)/doc/HACKING
- @end example
- @vindex distdir
- @vindex top_distdir
- Two variables that come handy when writing @code{dist-hook} rules are
- @samp{$(distdir)} and @samp{$(top_distdir)}.
- @samp{$(distdir)} points to the directory where the @code{dist} rule
- will copy files from the current directory before creating the
- tarball. If you are at the top-level directory, then @samp{distdir =
- $(PACKAGE)-$(VERSION)}. When used from subdirectory named
- @file{foo/}, then @samp{distdir = ../$(PACKAGE)-$(VERSION)/foo}.
- @samp{$(distdir)} can be a relative or absolute path, do not assume
- any form.
- @samp{$(top_distdir)} always points to the root directory of the
- distributed tree. At the top-level it's equal to @samp{$(distdir)}.
- In the @file{foo/} subdirectory
- @samp{top_distdir = ../$(PACKAGE)-$(VERSION)}.
- @samp{$(top_distdir)} too can be a relative or absolute path.
- Note that when packages are nested using @code{AC_CONFIG_SUBDIRS}
- (@pxref{Subpackages}), then @samp{$(distdir)} and
- @samp{$(top_distdir)} are relative to the package where @samp{make
- dist} was run, not to any sub-packages involved.
- @node Checking the Distribution
- @section Checking the Distribution
- @cindex @samp{make distcheck}
- @trindex distcheck
- Automake also generates a @code{distcheck} rule that can be of help
- to ensure that a given distribution will actually work. Simplifying
- a bit, we can say this rule first makes a distribution, and then,
- @emph{operating from it}, takes the following steps:
- @itemize
- @item
- tries to do a @code{VPATH} build (@pxref{VPATH Builds}), with the
- @code{srcdir} and all its content made @emph{read-only};
- @item
- runs the test suite (with @command{make check}) on this fresh build;
- @item
- installs the package in a temporary directory (with @command{make
- install}), and tries runs the test suite on the resulting installation
- (with @command{make installcheck});
- @item
- checks that the package can be correctly uninstalled (by @command{make
- uninstall}) and cleaned (by @code{make distclean});
- @item
- finally, makes another tarball to ensure the distribution is
- self-contained.
- @end itemize
- All of these actions are performed in a temporary directory. Please
- note that the exact location and the exact structure of such a directory
- (where the read-only sources are placed, how the temporary build and
- install directories are named and how deeply they are nested, etc.) is
- to be considered an implementation detail, which can change at any time;
- so do not reply on it.
- @vindex AM_DISTCHECK_CONFIGURE_FLAGS
- @vindex DISTCHECK_CONFIGURE_FLAGS
- @subheading DISTCHECK_CONFIGURE_FLAGS
- Building the package involves running @samp{./configure}. If you need
- to supply additional flags to @command{configure}, define them in the
- @code{AM_DISTCHECK_CONFIGURE_FLAGS} variable in your top-level
- @file{Makefile.am}. The user can still extend or override the flags
- provided there by defining the @code{DISTCHECK_CONFIGURE_FLAGS} variable,
- on the command line when invoking @command{make}.
- @c See automake bug#14991 for more details about how the following holds.
- It's worth nothing that @command{make distcheck} needs complete control
- over the @command{configure} options @option{--srcdir} and
- @option{--prefix}, so those options cannot be overridden by
- @code{AM_DISTCHECK_CONFIGURE_FLAGS} nor by
- @code{DISTCHECK_CONFIGURE_FLAGS}.
- Also note that developers are encouraged to strive to make their code
- buildable without requiring any special configure option; thus, in
- general, you shouldn't define @code{AM_DISTCHECK_CONFIGURE_FLAGS}.
- However, there might be few scenarios in which the use of this variable
- is justified.
- GNU @command{m4} offers an example. GNU @command{m4} configures by
- default with its experimental and seldom used "changeword" feature
- disabled; so in its case it is useful to have @command{make distcheck}
- run configure with the @option{--with-changeword} option, to ensure that
- the code for changeword support still compiles correctly.
- GNU @command{m4} also employs the @code{AM_DISTCHECK_CONFIGURE_FLAGS}
- variable to stress-test the use of @option{--program-prefix=g}, since at
- one point the @command{m4} build system had a bug where @command{make
- installcheck} was wrongly assuming it could blindly test "@command{m4}",
- rather than the just-installed "@command{gm4}".
- @trindex distcheck-hook
- @subheading distcheck-hook
- If the @code{distcheck-hook} rule is defined in your top-level
- @file{Makefile.am}, then it will be invoked by @code{distcheck} after
- the new distribution has been unpacked, but before the unpacked copy
- is configured and built. Your @code{distcheck-hook} can do almost
- anything, though as always caution is advised. Generally this hook is
- used to check for potential distribution errors not caught by the
- standard mechanism. Note that @code{distcheck-hook} as well as
- @code{AM_DISTCHECK_CONFIGURE_FLAGS} and @code{DISTCHECK_CONFIGURE_FLAGS}
- are not honored in a subpackage @file{Makefile.am}, but the flags from
- @code{AM_DISTCHECK_CONFIGURE_FLAGS} and @code{DISTCHECK_CONFIGURE_FLAGS}
- are passed down to the @command{configure} script of the subpackage.
- @cindex @samp{make distcleancheck}
- @trindex distcleancheck
- @vindex DISTCLEANFILES
- @vindex distcleancheck_listfiles
- @subheading distcleancheck
- Speaking of potential distribution errors, @code{distcheck} also
- ensures that the @code{distclean} rule actually removes all built
- files. This is done by running @samp{make distcleancheck} at the end of
- the @code{VPATH} build. By default, @code{distcleancheck} will run
- @code{distclean} and then make sure the build tree has been emptied by
- running @samp{$(distcleancheck_listfiles)}. Usually this check will
- find generated files that you forgot to add to the @code{DISTCLEANFILES}
- variable (@pxref{Clean}).
- The @code{distcleancheck} behavior should be OK for most packages,
- otherwise you have the possibility to override the definition of
- either the @code{distcleancheck} rule, or the
- @samp{$(distcleancheck_listfiles)} variable. For instance, to disable
- @code{distcleancheck} completely, add the following rule to your
- top-level @file{Makefile.am}:
- @example
- distcleancheck:
- @@:
- @end example
- If you want @code{distcleancheck} to ignore built files that have not
- been cleaned because they are also part of the distribution, add the
- following definition instead:
- @c Keep in sync with distcleancheck.sh
- @example
- distcleancheck_listfiles = \
- find . -type f -exec sh -c 'test -f $(srcdir)/$$1 || echo $$1' \
- sh '@{@}' ';'
- @end example
- The above definition is not the default because it's usually an error if
- your Makefiles cause some distributed files to be rebuilt when the user
- build the package. (Think about the user missing the tool required to
- build the file; or if the required tool is built by your package,
- consider the cross-compilation case where it can't be run.) There is
- an entry in the FAQ about this (@pxref{Errors with distclean}), make
- sure you read it before playing with @code{distcleancheck_listfiles}.
- @cindex @samp{make distuninstallcheck}
- @trindex distuninstallcheck
- @vindex distuninstallcheck_listfiles
- @subheading distuninstallcheck
- @code{distcheck} also checks that the @code{uninstall} rule works
- properly, both for ordinary and @code{DESTDIR} builds. It does this
- by invoking @samp{make uninstall}, and then it checks the install tree
- to see if any files are left over. This check will make sure that you
- correctly coded your @code{uninstall}-related rules.
- By default, the checking is done by the @code{distuninstallcheck} rule,
- and the list of files in the install tree is generated by
- @samp{$(distuninstallcheck_listfiles)} (this is a variable whose value is
- a shell command to run that prints the list of files to stdout).
- Either of these can be overridden to modify the behavior of
- @code{distcheck}. For instance, to disable this check completely, you
- would write:
- @example
- distuninstallcheck:
- @@:
- @end example
- @node The Types of Distributions
- @section The Types of Distributions
- Automake generates rules to provide archives of the project for
- distributions in various formats. Their targets are:
- @table @asis
- @item @code{dist-gzip}
- Generate a @samp{gzip} tar archive of the distribution. This is the
- only format enabled by default.
- @trindex dist-gzip
- @vindex BZIP2
- @item @code{dist-bzip2}
- Generate a @samp{bzip2} tar archive of the distribution. bzip2 archives
- are frequently smaller than gzipped archives.
- By default, this rule makes @samp{bzip2} use a compression option of @option{-9}.
- To make it use a different one, set the @env{BZIP2} environment variable.
- For example, @samp{make dist-bzip2 BZIP2=-7}.
- @trindex dist-bzip2
- @item @code{dist-lzip}
- Generate an @samp{lzip} tar archive of the distribution. @command{lzip}
- archives are frequently smaller than @command{bzip2}-compressed archives.
- @trindex dist-lzip
- @vindex XZ_OPT
- @item @code{dist-xz}
- Generate an @samp{xz} tar archive of the distribution. @command{xz}
- archives are frequently smaller than @command{bzip2}-compressed archives.
- By default, this rule makes @samp{xz} use a compression option of
- @option{-e}. To make it use a different one, set the @env{XZ_OPT}
- environment variable. For example, run this command to use the
- default compression ratio, but with a progress indicator:
- @samp{make dist-xz XZ_OPT=-ve}.
- @trindex dist-xz
- @item @code{dist-zip}
- Generate a @samp{zip} archive of the distribution.
- @trindex dist-zip
- @item @code{dist-tarZ}
- Generate a tar archive of the distribution, compressed with the
- historical (and obsolescent) program @command{compress}. This
- option is deprecated, and it and the corresponding functionality
- will be removed altogether in Automake 2.0.
- @trindex dist-tarZ
- @item @code{dist-shar}
- Generate a @samp{shar} archive of the distribution. This format
- archive is obsolescent, and use of this option is deprecated.
- It and the corresponding functionality will be removed altogether
- in Automake 2.0.
- @trindex dist-shar
- @end table
- The rule @code{dist} (and its historical synonym @code{dist-all})
- will create archives in all the enabled formats (@pxref{List of
- Automake options} for how to change this list). By default, only
- the @code{dist-gzip} target is hooked to @code{dist}.
- @node Tests
- @chapter Support for test suites
- @cindex Test suites
- @cindex @code{make check}
- @trindex check
- Automake can generate code to handle two kinds of test suites. One is
- based on integration with the @command{dejagnu} framework. The other
- (and most used) form is based on the use of generic test scripts, and
- its activation is triggered by the definition of the special @code{TESTS}
- variable. This second form allows for various degrees of sophistication
- and customization; in particular, it allows for concurrent execution
- of test scripts, use of established test protocols such as TAP, and
- definition of custom test drivers and test runners.
- @noindent
- In either case, the testsuite is invoked via @samp{make check}.
- @menu
- * Generalities about Testing:: Concepts and terminology about testing
- * Simple Tests:: Listing test scripts in @code{TESTS}
- * Custom Test Drivers:: Writing and using custom test drivers
- * Using the TAP test protocol:: Integrating test scripts that use the TAP protocol
- * DejaGnu Tests:: Interfacing with the @command{dejagnu} testing framework
- * Install Tests:: Running tests on installed packages
- @end menu
- @node Generalities about Testing
- @section Generalities about Testing
- The purpose of testing is to determine whether a program or system behaves
- as expected (e.g., known inputs produce the expected outputs, error
- conditions are correctly handled or reported, and older bugs do not
- resurface).
- @cindex test case
- The minimal unit of testing is usually called @emph{test case}, or simply
- @emph{test}. How a test case is defined or delimited, and even what
- exactly @emph{constitutes} a test case, depends heavily on the testing
- paradigm and/or framework in use, so we won't attempt any more precise
- definition. The set of the test cases for a given program or system
- constitutes its @emph{testsuite}.
- @cindex test harness
- @cindex testsuite harness
- A @emph{test harness} (also @emph{testsuite harness}) is a program or
- software component that executes all (or part of) the defined test cases,
- analyzes their outcomes, and report or register these outcomes
- appropriately. Again, the details of how this is accomplished (and how
- the developer and user can influence it or interface with it) varies
- wildly, and we'll attempt no precise definition.
- @cindex test pass
- @cindex test failure
- A test is said to @emph{pass} when it can determine that the condition or
- behaviour it means to verify holds, and is said to @emph{fail} when it can
- determine that such condition of behaviour does @emph{not} hold.
- @cindex test skip
- Sometimes, tests can rely on non-portable tools or prerequisites, or
- simply make no sense on a given system (for example, a test checking a
- Windows-specific feature makes no sense on a GNU/Linux system). In this
- case, accordingly to the definition above, the tests can neither be
- considered passed nor failed; instead, they are @emph{skipped} -- i.e.,
- they are not run, or their result is anyway ignored for what concerns
- the count of failures an successes. Skips are usually explicitly
- reported though, so that the user will be aware that not all of the
- testsuite has really run.
- @cindex xfail
- @cindex expected failure
- @cindex expected test failure
- @cindex xpass
- @cindex unexpected pass
- @cindex unexpected test pass
- It's not uncommon, especially during early development stages, that some
- tests fail for known reasons, and that the developer doesn't want to
- tackle these failures immediately (this is especially true when the
- failing tests deal with corner cases). In this situation, the better
- policy is to declare that each of those failures is an @emph{expected
- failure} (or @emph{xfail}). In case a test that is expected to fail ends
- up passing instead, many testing environments will flag the result as a
- special kind of failure called @emph{unexpected pass} (or @emph{xpass}).
- @cindex hard error
- @cindex Distinction between errors and failures in testsuites
- Many testing environments and frameworks distinguish between test failures
- and hard errors. As we've seen, a test failure happens when some invariant
- or expected behaviour of the software under test is not met. An @emph{hard
- error} happens when e.g., the set-up of a test case scenario fails, or when
- some other unexpected or highly undesirable condition is encountered (for
- example, the program under test experiences a segmentation fault).
- @node Simple Tests
- @section Simple Tests
- @menu
- * Scripts-based Testsuites:: Automake-specific concepts and terminology
- * Serial Test Harness:: Older (and discouraged) serial test harness
- * Parallel Test Harness:: Generic concurrent test harness
- @end menu
- @node Scripts-based Testsuites
- @subsection Scripts-based Testsuites
- If the special variable @code{TESTS} is defined, its value is taken to be
- a list of programs or scripts to run in order to do the testing. Under
- the appropriate circumstances, it's possible for @code{TESTS} to list
- also data files to be passed to one or more test scripts defined by
- different means (the so-called ``log compilers'', @pxref{Parallel Test
- Harness}).
- Test scripts can be executed serially or concurrently. Automake supports
- both these kinds of test execution, with the parallel test harness being
- the default. The concurrent test harness relies on the concurrence
- capabilities (if any) offered by the underlying @command{make}
- implementation, and can thus only be as good as those are.
- By default, only the exit statuses of the test scripts are considered when
- determining the testsuite outcome. But Automake allows also the use of
- more complex test protocols, either standard (@pxref{Using the TAP test
- protocol}) or custom (@pxref{Custom Test Drivers}). Note that you can't
- enable such protocols when the serial harness is used, though.
- In the rest of this section we are going to concentrate mostly on
- protocol-less tests, since we cover test protocols in a later section
- (again, @pxref{Custom Test Drivers}).
- @cindex Exit status 77, special interpretation
- @cindex Exit status 99, special interpretation
- When no test protocol is in use, an exit status of 0 from a test script will
- denote a success, an exit status of 77 a skipped test, an exit status of 99
- an hard error, and any other exit status will denote a failure.
- @cindex Tests, expected failure
- @cindex Expected test failure
- @vindex XFAIL_TESTS
- @vindex DISABLE_HARD_ERRORS
- @cindex Disabling hard errors
- You may define the variable @code{XFAIL_TESTS} to a list of tests
- (usually a subset of @code{TESTS}) that are expected to fail; this will
- effectively reverse the result of those tests (with the provision that
- skips and hard errors remain untouched). You may also instruct the
- testsuite harness to treat hard errors like simple failures, by defining
- the @code{DISABLE_HARD_ERRORS} make variable to a nonempty value.
- Note however that, for tests based on more complex test protocols,
- the exact effects of @code{XFAIL_TESTS} and @code{DISABLE_HARD_ERRORS}
- might change, or they might even have no effect at all (for example,
- @c Keep this in sync with tap-no-disable-hard-errors.sh
- in tests using TAP, there is not way to disable hard errors, and the
- @code{DISABLE_HARD_ERRORS} variable has no effect on them).
- @anchor{Testsuite progress on console}
- @cindex Testsuite progress on console
- The result of each test case run by the scripts in @code{TESTS} will be
- printed on standard output, along with the test name. For test protocols
- that allow more test cases per test script (such as TAP), a number,
- identifier and/or brief description specific for the single test case is
- expected to be printed in addition to the name of the test script. The
- possible results (whose meanings should be clear from the previous
- @ref{Generalities about Testing}) are @code{PASS}, @code{FAIL},
- @code{SKIP}, @code{XFAIL}, @code{XPASS} and @code{ERROR}. Here is an
- example of output from an hypothetical testsuite that uses both plain
- and TAP tests:
- @c Keep in sync with tap-doc.sh
- @example
- PASS: foo.sh
- PASS: zardoz.tap 1 - Daemon started
- PASS: zardoz.tap 2 - Daemon responding
- SKIP: zardoz.tap 3 - Daemon uses /proc # SKIP /proc is not mounted
- PASS: zardoz.tap 4 - Daemon stopped
- SKIP: bar.sh
- PASS: mu.tap 1
- XFAIL: mu.tap 2 # TODO frobnication not yet implemented
- @end example
- @noindent
- A testsuite summary (expected to report at least the number of run,
- skipped and failed tests) will be printed at the end of the testsuite
- run.
- @anchor{Simple tests and color-tests}
- @vindex AM_COLOR_TESTS
- @cindex Colorized testsuite output
- If the standard output is connected to a capable terminal, then the test
- results and the summary are colored appropriately. The developer and the
- user can disable colored output by setting the @command{make} variable
- @samp{AM_COLOR_TESTS=no}; the user can in addition force colored output
- even without a connecting terminal with @samp{AM_COLOR_TESTS=always}.
- It's also worth noting that some @command{make} implementations,
- when used in parallel mode, have slightly different semantics
- (@pxref{Parallel make,,, autoconf, The Autoconf Manual}), which can
- break the automatic detection of a connection to a capable terminal.
- If this is the case, the user will have to resort to the use of
- @samp{AM_COLOR_TESTS=always} in order to have the testsuite output
- colorized.
- Test programs that need data files should look for them in @code{srcdir}
- (which is both a make variable and an environment variable made available
- to the tests), so that they work when building in a separate directory
- (@pxref{Build Directories, , Build Directories , autoconf,
- The Autoconf Manual}), and in particular for the @code{distcheck} rule
- (@pxref{Checking the Distribution}).
- @vindex TESTS
- @vindex TESTS_ENVIRONMENT
- @vindex AM_TESTS_ENVIRONMENT
- The @code{AM_TESTS_ENVIRONMENT} and @code{TESTS_ENVIRONMENT} variables can
- be used to run initialization code and set environment variables for the
- test scripts. The former variable is developer-reserved, and can be
- defined in the @file{Makefile.am}, while the latter is reserved for the
- user, which can employ it to extend or override the settings in the
- former; for this to work portably, however, the contents of a non-empty
- @code{AM_TESTS_ENVIRONMENT} @emph{must} be terminated by a semicolon.
- @vindex AM_TESTS_FD_REDIRECT
- The @code{AM_TESTS_FD_REDIRECT} variable can be used to define file
- descriptor redirections for the test scripts. One might think that
- @code{AM_TESTS_ENVIRONMENT} could be used for this purpose, but experience
- has shown that doing so portably is practically impossible. The main
- hurdle is constituted by Korn shells, which usually set the close-on-exec
- flag on file descriptors opened with the @command{exec} builtin, thus
- rendering an idiom like @code{AM_TESTS_ENVIRONMENT = exec 9>&2;}
- ineffectual. This issue also affects some Bourne shells, such as the
- HP-UX's @command{/bin/sh},
- @c Keep in sync with tests-environment-backcompat.sh
- @example
- AM_TESTS_ENVIRONMENT = \
- ## Some environment initializations are kept in a separate shell
- ## file 'tests-env.sh', which can make it easier to also run tests
- ## from the command line.
- . $(srcdir)/tests-env.sh; \
- ## On Solaris, prefer more POSIX-compliant versions of the standard
- ## tools by default.
- if test -d /usr/xpg4/bin; then \
- PATH=/usr/xpg4/bin:$$PATH; export PATH; \
- fi;
- @c $$ restore font-lock
- ## With this, the test scripts will be able to print diagnostic
- ## messages to the original standard error stream, even if the test
- ## driver redirects the stderr of the test scripts to a log file
- ## before executing them.
- AM_TESTS_FD_REDIRECT = 9>&2
- @end example
- @noindent
- Note however that @code{AM_TESTS_ENVIRONMENT} is, for historical and
- implementation reasons, @emph{not} supported by the serial harness
- (@pxref{Serial Test Harness}).
- Automake ensures that each file listed in @code{TESTS} is built before
- it is run; you can list both source and derived programs (or scripts)
- in @code{TESTS}; the generated rule will look both in @code{srcdir} and
- @file{.}. For instance, you might want to run a C program as a test.
- To do this you would list its name in @code{TESTS} and also in
- @code{check_PROGRAMS}, and then specify it as you would any other
- program.
- Programs listed in @code{check_PROGRAMS} (and @code{check_LIBRARIES},
- @code{check_LTLIBRARIES}...) are only built during @code{make check},
- not during @code{make all}. You should list there any program needed
- by your tests that does not need to be built by @code{make all}. Note
- that @code{check_PROGRAMS} are @emph{not} automatically added to
- @code{TESTS} because @code{check_PROGRAMS} usually lists programs used
- by the tests, not the tests themselves. Of course you can set
- @code{TESTS = $(check_PROGRAMS)} if all your programs are test cases.
- @node Serial Test Harness
- @subsection Older (and discouraged) serial test harness
- @cindex @option{serial-tests}, Using
- First, note that today the use of this harness is strongly discouraged in
- favour of the parallel test harness (@pxref{Parallel Test Harness}).
- Still, there are @emph{few} situations when the advantages offered by
- the parallel harness are irrelevant, and when test concurrency can
- even cause tricky problems. In those cases, it might make sense to
- still use the serial harness, for simplicity and reliability (we still
- suggest trying to give the parallel harness a shot though).
- The serial test harness is enabled by the Automake option
- @option{serial-tests}. It operates by simply running the tests serially,
- one at the time, without any I/O redirection. It's up to the user to
- implement logging of tests' output, if that's required or desired.
- For historical and implementation reasons, the @code{AM_TESTS_ENVIRONMENT}
- variable is @emph{not} supported by this harness (it will be silently
- ignored if defined); only @code{TESTS_ENVIRONMENT} is, and it is to be
- considered a developer-reserved variable. This is done so that, when
- using the serial harness, @code{TESTS_ENVIRONMENT} can be defined to an
- invocation of an interpreter through which the tests are to be run.
- For instance, the following setup may be used to run tests with Perl:
- @example
- TESTS_ENVIRONMENT = $(PERL) -Mstrict -w
- TESTS = foo.pl bar.pl baz.pl
- @end example
- @noindent
- It's important to note that the use of @code{TESTS_ENVIRONMENT} endorsed
- here would be @emph{invalid} with the parallel harness. That harness
- provides a more elegant way to achieve the same effect, with the further
- benefit of freeing the @code{TESTS_ENVIRONMENT} variable for the user
- (@pxref{Parallel Test Harness}).
- Another, less serious limit of the serial harness is that it doesn't
- really distinguish between simple failures and hard errors; this is
- due to historical reasons only, and might be fixed in future Automake
- versions.
- @node Parallel Test Harness
- @subsection Parallel Test Harness
- By default, Automake generated a parallel (concurrent) test harness. It
- features automatic collection of the test scripts output in @file{.log}
- files, concurrent execution of tests with @code{make -j}, specification
- of inter-test dependencies, lazy reruns of tests that have not completed
- in a prior run, and hard errors for exceptional failures.
- @anchor{Basics of test metadata}
- @vindex TEST_SUITE_LOG
- @vindex TESTS
- @cindex @file{.log} files
- @cindex @file{.trs} files
- @cindex test metadata
- The parallel test harness operates by defining a set of @command{make}
- rules that run the test scripts listed in @code{TESTS}, and, for each
- such script, save its output in a corresponding @file{.log} file and
- its results (and other ``metadata'', @pxref{API for Custom Test Drivers})
- in a corresponding @file{.trs} (as in @b{T}est @b{R}e@b{S}ults) file.
- @c We choose the '.trs' extension also because, at the time of writing,
- @c it isn't already used for other significant purposes; see e.g.:
- @c - http://filext.com/file-extension/trs
- @c - http://www.file-extensions.org/search/?searchstring=trs
- The @file{.log} file will contain all the output emitted by the test on
- its standard output and its standard error. The @file{.trs} file will
- contain, among the other things, the results of the test cases run by
- the script.
- The parallel test harness will also create a summary log file,
- @code{TEST_SUITE_LOG}, which defaults to @file{test-suite.log} and requires
- a @file{.log} suffix. This file depends upon all the @file{.log} and
- @file{.trs} files created for the test scripts listed in @code{TESTS}.
- @vindex VERBOSE
- As with the serial harness above, by default one status line is printed
- per completed test, and a short summary after the suite has completed.
- However, standard output and standard error of the test are redirected
- to a per-test log file, so that parallel execution does not produce
- intermingled output. The output from failed tests is collected in the
- @file{test-suite.log} file. If the variable @samp{VERBOSE} is set, this
- file is output after the summary.
- @vindex TEST_EXTENSIONS
- @vindex TEST_LOGS
- Each couple of @file{.log} and @file{.trs} files is created when the
- corresponding test has completed. The set of log files is listed in
- the read-only variable @code{TEST_LOGS}, and defaults to @code{TESTS},
- with the executable extension if any (@pxref{EXEEXT}), as well as any
- suffix listed in @code{TEST_EXTENSIONS} removed, and @file{.log} appended.
- Results are undefined if a test file name ends in several concatenated
- suffixes. @code{TEST_EXTENSIONS} defaults to @file{.test}; it can be
- overridden by the user, in which case any extension listed in it must be
- constituted by a dot, followed by a non-digit alphabetic character,
- followed by any number of alphabetic characters.
- @c Keep in sync with test-extensions.sh
- For example, @samp{.sh}, @samp{.T} and @samp{.t1} are valid extensions,
- while @samp{.x-y}, @samp{.6c} and @samp{.t.1} are not.
- @cindex Configure substitutions in @code{TESTS}
- It is important to note that, due to current limitations (unlikely to be
- lifted), configure substitutions in the definition of @code{TESTS} can
- only work if they will expand to a list of tests that have a suffix listed
- in @code{TEST_EXTENSIONS}.
- @vindex _LOG_COMPILE
- @vindex _LOG_COMPILER
- @vindex _LOG_FLAGS
- @vindex LOG_COMPILE
- @vindex LOG_COMPILER
- @vindex LOG_FLAGS
- @vindex @var{ext}_LOG_COMPILE
- @vindex @var{ext}_LOG_COMPILER
- @vindex @var{ext}_LOG_FLAGS
- @vindex AM_@var{ext}_LOG_FLAGS
- @vindex AM_LOG_FLAGS
- For tests that match an extension @code{.@var{ext}} listed in
- @code{TEST_EXTENSIONS}, you can provide a custom ``test runner'' using
- the variable @code{@var{ext}_LOG_COMPILER} (note the upper-case
- extension) and pass options in @code{AM_@var{ext}_LOG_FLAGS} and allow
- the user to pass options in @code{@var{ext}_LOG_FLAGS}. It will cause
- all tests with this extension to be called with this runner. For all
- tests without a registered extension, the variables @code{LOG_COMPILER},
- @code{AM_LOG_FLAGS}, and @code{LOG_FLAGS} may be used. For example,
- @c Keep in sync with parallel-tests-log-compiler-example.sh
- @example
- TESTS = foo.pl bar.py baz
- TEST_EXTENSIONS = .pl .py
- PL_LOG_COMPILER = $(PERL)
- AM_PL_LOG_FLAGS = -w
- PY_LOG_COMPILER = $(PYTHON)
- AM_PY_LOG_FLAGS = -v
- LOG_COMPILER = ./wrapper-script
- AM_LOG_FLAGS = -d
- @end example
- @noindent
- will invoke @samp{$(PERL) -w foo.pl}, @samp{$(PYTHON) -v bar.py},
- and @samp{./wrapper-script -d baz} to produce @file{foo.log},
- @file{bar.log}, and @file{baz.log}, respectively. The @file{foo.trs},
- @file{bar.trs} and @file{baz.trs} files will be automatically produced
- as a side-effect.
- It's important to note that, differently from what we've seen for the
- serial test harness (@pxref{Serial Test Harness}), the
- @code{AM_TESTS_ENVIRONMENT} and @code{TESTS_ENVIRONMENT} variables
- @emph{cannot} be use to define a custom test runner; the
- @code{LOG_COMPILER} and @code{LOG_FLAGS} (or their extension-specific
- counterparts) should be used instead:
- @example
- ## This is WRONG!
- AM_TESTS_ENVIRONMENT = PERL5LIB='$(srcdir)/lib' $(PERL) -Mstrict -w
- @end example
- @example
- ## Do this instead.
- AM_TESTS_ENVIRONMENT = PERL5LIB='$(srcdir)/lib'; export PERL5LIB;
- LOG_COMPILER = $(PERL)
- AM_LOG_FLAGS = -Mstrict -w
- @end example
- By default, the test suite harness will run all tests, but there are
- several ways to limit the set of tests that are run:
- @itemize @bullet
- @item
- You can set the @code{TESTS} variable. For example, you can use a
- command like this to run only a subset of the tests:
- @example
- env TESTS="foo.test bar.test" make -e check
- @end example
- Note however that the command above will unconditionally overwrite the
- @file{test-suite.log} file, thus clobbering the recorded results
- of any previous testsuite run. This might be undesirable for packages
- whose testsuite takes long time to execute. Luckily, this problem can
- easily be avoided by overriding also @code{TEST_SUITE_LOG} at runtime;
- for example,
- @c Keep in sync with parallel-tests-log-override-2.sh
- @example
- env TEST_SUITE_LOG=partial.log TESTS="..." make -e check
- @end example
- will write the result of the partial testsuite runs to the
- @file{partial.log}, without touching @file{test-suite.log}.
- @item
- You can set the @code{TEST_LOGS} variable. By default, this variable is
- computed at @command{make} run time from the value of @code{TESTS} as
- described above. For example, you can use the following:
- @example
- set x subset*.log; shift
- env TEST_LOGS="foo.log $*" make -e check
- @end example
- The comments made above about @code{TEST_SUITE_LOG} overriding applies
- here too.
- @item
- @vindex RECHECK_LOGS
- @cindex lazy test execution
- By default, the test harness removes all old per-test @file{.log} and
- @file{.trs} files before it starts running tests to regenerate them. The
- variable @code{RECHECK_LOGS} contains the set of @file{.log} (and, by
- implication, @file{.trs}) files which are removed. @code{RECHECK_LOGS}
- defaults to @code{TEST_LOGS}, which means all tests need to be rechecked.
- By overriding this variable, you can choose which tests need to be
- reconsidered. For example, you can lazily rerun only those tests which
- are outdated, i.e., older than their prerequisite test files, by setting
- this variable to the empty value:
- @example
- env RECHECK_LOGS= make -e check
- @end example
- @item
- @trindex recheck
- You can ensure that all tests are rerun which have failed or passed
- unexpectedly, by running @code{make recheck} in the test directory.
- This convenience target will set @code{RECHECK_LOGS} appropriately
- before invoking the main test harness.
- @end itemize
- @noindent
- In order to guarantee an ordering between tests even with @code{make
- -j@var{N}}, dependencies between the corresponding @file{.log} files
- may be specified through usual @command{make} dependencies. For example,
- the following snippet lets the test named @file{foo-execute.test} depend
- upon completion of the test @file{foo-compile.test}:
- @example
- TESTS = foo-compile.test foo-execute.test
- foo-execute.log: foo-compile.log
- @end example
- @noindent
- Please note that this ordering ignores the @emph{results} of required
- tests, thus the test @file{foo-execute.test} is run even if the test
- @file{foo-compile.test} failed or was skipped beforehand. Further,
- please note that specifying such dependencies currently works only for
- tests that end in one of the suffixes listed in @code{TEST_EXTENSIONS}.
- Tests without such specified dependencies may be run concurrently with
- parallel @command{make -j@var{N}}, so be sure they are prepared for
- concurrent execution.
- @cindex Unit tests
- @c Keep in sync with 'parallel-tests-extra-programs.sh'.
- The combination of lazy test execution and correct dependencies between
- tests and their sources may be exploited for efficient unit testing
- during development. To further speed up the edit-compile-test cycle, it
- may even be useful to specify compiled programs in @code{EXTRA_PROGRAMS}
- instead of with @code{check_PROGRAMS}, as the former allows intertwined
- compilation and test execution (but note that @code{EXTRA_PROGRAMS} are
- not cleaned automatically, @pxref{Uniform}).
- The variables @code{TESTS} and @code{XFAIL_TESTS} may contain
- conditional parts as well as configure substitutions. In the latter
- case, however, certain restrictions apply: substituted test names
- must end with a nonempty test suffix like @file{.test}, so that one of
- the inference rules generated by @command{automake} can apply. For
- literal test names, @command{automake} can generate per-target rules
- to avoid this limitation.
- Please note that it is currently not possible to use @code{$(srcdir)/}
- or @code{$(top_srcdir)/} in the @code{TESTS} variable. This technical
- limitation is necessary to avoid generating test logs in the source tree
- and has the unfortunate consequence that it is not possible to specify
- distributed tests that are themselves generated by means of explicit
- rules, in a way that is portable to all @command{make} implementations
- (@pxref{Make Target Lookup,,, autoconf, The Autoconf Manual}, the
- semantics of FreeBSD and OpenBSD @command{make} conflict with this).
- In case of doubt you may want to require to use GNU @command{make},
- or work around the issue with inference rules to generate the tests.
- @node Custom Test Drivers
- @section Custom Test Drivers
- @menu
- * Overview of Custom Test Drivers Support::
- * Declaring Custom Test Drivers::
- * API for Custom Test Drivers::
- @end menu
- @node Overview of Custom Test Drivers Support
- @subsection Overview of Custom Test Drivers Support
- Starting from Automake version 1.12, the parallel test harness allows
- the package authors to use third-party custom test drivers, in case the
- default ones are inadequate for their purposes, or do not support their
- testing protocol of choice.
- A custom test driver is expected to properly run the test programs passed
- to it (including the command-line arguments passed to those programs, if
- any), to analyze their execution and outcome, to create the @file{.log}
- and @file{.trs} files associated to these test runs, and to display the test
- results on the console. It is responsibility of the author of the test
- driver to ensure that it implements all the above steps meaningfully and
- correctly; Automake isn't and can't be of any help here. On the other
- hand, the Automake-provided code for testsuite summary generation offers
- support for test drivers allowing several test results per test script,
- if they take care to register such results properly (@pxref{Log files
- generation and test results recording}).
- The exact details of how test scripts' results are to be determined and
- analyzed is left to the individual drivers. Some drivers might only
- consider the test script exit status (this is done for example by the
- default test driver used by the parallel test harness, described
- in the previous section). Other drivers might implement more complex and
- advanced test protocols, which might require them to parse and interpreter
- the output emitted by the test script they're running (examples of such
- protocols are TAP and SubUnit).
- It's very important to note that, even when using custom test drivers,
- most of the infrastructure described in the previous section about the
- parallel harness remains in place; this includes:
- @itemize
- @item
- list of test scripts defined in @code{TESTS}, and overridable at
- runtime through the redefinition of @code{TESTS} or @code{TEST_LOGS};
- @item
- concurrency through the use of @command{make}'s option @option{-j};
- @item
- per-test @file{.log} and @file{.trs} files, and generation of a summary
- @file{.log} file from them;
- @item
- @code{recheck} target, @code{RECHECK_LOGS} variable, and lazy reruns
- of tests;
- @item
- inter-test dependencies;
- @item
- support for @code{check_*} variables (@code{check_PROGRAMS},
- @code{check_LIBRARIES}, ...);
- @item
- use of @code{VERBOSE} environment variable to get verbose output on
- testsuite failures;
- @item
- definition and honoring of @code{TESTS_ENVIRONMENT},
- @code{AM_TESTS_ENVIRONMENT} and @code{AM_TESTS_FD_REDIRECT}
- variables;
- @item
- definition of generic and extension-specific @code{LOG_COMPILER} and
- @code{LOG_FLAGS} variables.
- @end itemize
- @noindent
- On the other hand, the exact semantics of how (and if) testsuite output
- colorization, @code{XFAIL_TESTS}, and hard errors are supported and
- handled is left to the individual test drivers.
- @c TODO: We should really add a working example in the doc/ directory,
- @c TODO: and reference if from here.
- @node Declaring Custom Test Drivers
- @subsection Declaring Custom Test Drivers
- @vindex _LOG_DRIVER
- @vindex _LOG_DRIVER_FLAGS
- @vindex LOG_DRIVER
- @vindex LOG_DRIVER_FLAGS
- @vindex @var{ext}_LOG_DRIVER
- @vindex @var{ext}_LOG_DRIVER_FLAGS
- @vindex AM_@var{ext}_LOG_DRIVER_FLAGS
- @vindex AM_LOG_DRIVER_FLAGS
- Custom testsuite drivers are declared by defining the make variables
- @code{LOG_DRIVER} or @code{@var{ext}_LOG_DRIVER} (where @var{ext} must
- be declared in @code{TEST_EXTENSIONS}). They must be defined to
- programs or scripts that will be used to drive the execution, logging,
- and outcome report of the tests with corresponding extensions (or of
- those with no registered extension in the case of @code{LOG_DRIVER}).
- Clearly, multiple distinct test drivers can be declared in the same
- @file{Makefile.am}. Note moreover that the @code{LOG_DRIVER} variables
- are @emph{not} a substitute for the @code{LOG_COMPILER} variables: the
- two sets of variables can, and often do, usefully and legitimately
- coexist.
- @c TODO: We should really be able to point to a clarifying example here!
- The developer-reserved variable @code{AM_LOG_DRIVER_FLAGS} and the
- user-reserved variable @code{LOG_DRIVER_FLAGS} can be used to define
- flags that will be passed to each invocation of @code{LOG_DRIVER},
- with the user-defined flags obviously taking precedence over the
- developer-reserved ones. Similarly, for each extension @var{ext}
- declared in @code{TEST_EXTENSIONS}, flags listed in
- @code{AM_@var{ext}_LOG_DRIVER_FLAGS} and
- @code{@var{ext}_LOG_DRIVER_FLAGS} will be passed to
- invocations of @code{@var{ext}_LOG_DRIVER}.
- @node API for Custom Test Drivers
- @subsection API for Custom Test Drivers
- Note that @emph{the APIs described here are still highly experimental},
- and will very likely undergo tightenings and likely also extensive changes
- in the future, to accommodate for new features or to satisfy additional
- portability requirements.
- The main characteristic of these APIs is that they are designed to share
- as much infrastructure, semantics, and implementation details as possible
- with the parallel test harness and its default driver.
- @menu
- * Command-line arguments for test drivers::
- * Log files generation and test results recording::
- * Testsuite progress output::
- @end menu
- @node Command-line arguments for test drivers
- @subsubsection Command-line arguments for test drivers
- A custom driver can rely on various command-line options and arguments
- being passed to it automatically by the Automake-generated test harness.
- It is @emph{mandatory} that it understands all of them (even if the exact
- interpretation of the associated semantics can legitimately change
- between a test driver and another, and even be a no-op in some drivers).
- @noindent
- Here is the list of options:
- @table @option
- @item --test-name=@var{NAME}
- The name of the test, with VPATH prefix (if any) removed. This can have a
- suffix and a directory component (as in e.g., @file{sub/foo.test}), and is
- mostly meant to be used in console reports about testsuite advancements and
- results (@pxref{Testsuite progress output}).
- @item --log-file=@file{@var{PATH}.log}
- The @file{.log} file the test driver must create (@pxref{Basics of
- test metadata}). If it has a directory component (as in e.g.,
- @file{sub/foo.log}), the test harness will ensure that such directory
- exists @emph{before} the test driver is called.
- @item --trs-file=@file{@var{PATH}.trs}
- The @file{.trs} file the test driver must create (@pxref{Basics of
- test metadata}). If it has a directory component (as in e.g.,
- @file{sub/foo.trs}), the test harness will ensure that such directory
- exists @emph{before} the test driver is called.
- @item --color-tests=@{yes|no@}
- Whether the console output should be colorized or not (@pxref{Simple
- tests and color-tests}, to learn when this option gets activated and
- when it doesn't).
- @item --expect-failure=@{yes|no@}
- Whether the tested program is expected to fail.
- @item --enable-hard-errors=@{yes|no@}
- Whether ``hard errors'' in the tested program should be treated differently
- from normal failures or not (the default should be @code{yes}). The exact
- meaning of ``hard error'' is highly dependent from the test protocols or
- conventions in use.
- @item --
- Explicitly terminate the list of options.
- @end table
- @noindent
- The first non-option argument passed to the test driver is the program to
- be run, and all the following ones are command-line options and arguments
- for this program.
- Note that the exact semantics attached to the @option{--color-tests},
- @option{--expect-failure} and @option{--enable-hard-errors} options are
- left up to the individual test drivers. Still, having a behaviour
- compatible or at least similar to that provided by the default driver
- is advised, as that would offer a better consistency and a more pleasant
- user experience.
- @node Log files generation and test results recording
- @subsubsection Log files generation and test results recording
- The test driver must correctly generate the files specified by the
- @option{--log-file} and @option{--trs-file} option (even when the tested
- program fails or crashes).
- The @file{.log} file should ideally contain all the output produced by the
- tested program, plus optionally other information that might facilitate
- debugging or analysis of bug reports. Apart from that, its format is
- basically free.
- The @file{.trs} file is used to register some metadata through the use
- of custom reStructuredText fields. This metadata is expected to be
- employed in various ways by the parallel test harness; for example, to
- count the test results when printing the testsuite summary, or to decide
- which tests to re-run upon @command{make recheck}. Unrecognized metadata
- in a @file{.trs} file is currently ignored by the harness, but this might
- change in the future. The list of currently recognized metadata follows.
- @table @code
- @item :test-result:
- @cindex Register test result
- @cindex Register test case result
- @cindex Test result, registering
- @cindex Test case result, registering
- @cindex @code{:test-result:}
- @cindex reStructuredText field, @code{:test-result:}
- The test driver must use this field to register the results of @emph{each}
- test case run by a test script file. Several @code{:test-result:} fields
- can be present in the same @file{.trs} file; this is done in order to
- support test protocols that allow a single test script to run more test
- cases.
- @c Keep this in sync with lib/am/check-am:$(TEST_SUITE_LOG).
- The only recognized test results are currently @code{PASS}, @code{XFAIL},
- @code{SKIP}, @code{FAIL}, @code{XPASS} and @code{ERROR}. These results,
- when declared with @code{:test-result:}, can be optionally followed by
- text holding the name and/or a brief description of the corresponding
- test; the harness will ignore such extra text when generating
- @file{test-suite.log} and preparing the testsuite summary.
- @c Keep in sync with 'test-metadata-recheck.sh'.
- @item @code{:recheck:}
- @cindex :recheck:
- @cindex reStructuredText field, @code{:recheck:}
- If this field is present and defined to @code{no}, then the corresponding
- test script will @emph{not} be run upon a @command{make recheck}. What
- happens when two or more @code{:recheck:} fields are present in the same
- @file{.trs} file is undefined behaviour.
- @c Keep in sync with 'test-metadata-global-log.sh'.
- @item @code{:copy-in-global-log:}
- @cindex :copy-in-global-log:
- @cindex reStructuredText field, @code{:copy-in-global-log:}
- If this field is present and defined to @code{no}, then the content
- of the @file{.log} file will @emph{not} be copied into the global
- @file{test-suite.log}. We allow to forsake such copying because, while
- it can be useful in debugging and analysis of bug report, it can also be
- just a waste of space in normal situations, e.g., when a test script is
- successful. What happens when two or more @code{:copy-in-global-log:}
- fields are present in the same @file{.trs} file is undefined behaviour.
- @c Keep in sync with 'test-metadata-global-result.sh'.
- @item @code{:test-global-result:}
- @cindex :test-global-result:
- @cindex reStructuredText field, @code{:test-global-result:}
- This is used to declare the "global result" of the script. Currently,
- the value of this field is needed only to be reported (more or less
- verbatim) in the generated global log file @code{$(TEST_SUITE_LOG)},
- so it's quite free-form. For example, a test script which run 10 test
- cases, 6 of which pass and 4 of which are skipped, could reasonably have
- a @code{PASS/SKIP} value for this field, while a test script which run
- 19 successful tests and one failed test could have an @code{ALMOST
- PASSED} value. What happens when two or more @code{:test-global-result:}
- fields are present in the same @file{.trs} file is undefined behaviour.
- @end table
- @noindent
- Let's see a small example. Assume a @file{.trs} file contains the
- following lines:
- @example
- :test-result: PASS server starts
- :global-log-copy: no
- :test-result: PASS HTTP/1.1 request
- :test-result: FAIL HTTP/1.0 request
- :recheck: yes
- :test-result: SKIP HTTPS request (TLS library wasn't available)
- :test-result: PASS server stops
- @end example
- @noindent
- Then the corresponding test script will be re-run by @command{make check},
- will contribute with @emph{five} test results to the testsuite summary
- (three of these tests being successful, one failed, and one skipped), and
- the content of the corresponding @file{.log} file will @emph{not} be
- copied in the global log file @file{test-suite.log}.
- @node Testsuite progress output
- @subsubsection Testsuite progress output
- A custom test driver also has the task of displaying, on the standard
- output, the test results as soon as they become available. Depending on
- the protocol in use, it can also display the reasons for failures and
- skips, and, more generally, any useful diagnostic output (but remember
- that each line on the screen is precious, so that cluttering the screen
- with overly verbose information is bad idea). The exact format of this
- progress output is left up to the test driver; in fact, a custom test
- driver might @emph{theoretically} even decide not to do any such report,
- leaving it all to the testsuite summary (that would be a very lousy idea,
- of course, and serves only to illustrate the flexibility that is
- granted here).
- Remember that consistency is good; so, if possible, try to be consistent
- with the output of the built-in Automake test drivers, providing a similar
- ``look & feel''. In particular, the testsuite progress output should be
- colorized when the @option{--color-tests} is passed to the driver. On the
- other end, if you are using a known and widespread test protocol with
- well-established implementations, being consistent with those
- implementations' output might be a good idea too.
- @node Using the TAP test protocol
- @section Using the TAP test protocol
- @menu
- * Introduction to TAP::
- * Use TAP with the Automake test harness::
- * Incompatibilities with other TAP parsers and drivers::
- * Links and external resources on TAP::
- @end menu
- @node Introduction to TAP
- @subsection Introduction to TAP
- TAP, the Test Anything Protocol, is a simple text-based interface between
- testing modules or programs and a test harness. The tests (also called
- ``TAP producers'' in this context) write test results in a simple format
- on standard output; a test harness (also called ``TAP consumer'') will
- parse and interpret these results, and properly present them to the user,
- and/or register them for later analysis. The exact details of how this
- is accomplished can vary among different test harnesses. The Automake
- harness will present the results on the console in the usual
- fashion (@pxref{Testsuite progress on console}), and will use the
- @file{.trs} files (@pxref{Basics of test metadata}) to store the test
- results and related metadata. Apart from that, it will try to remain
- as much compatible as possible with pre-existing and widespread utilities,
- such as the @uref{http://search.cpan.org/~andya/Test-Harness/bin/prove,
- @command{prove} utility}, at least for the simpler usages.
- TAP started its life as part of the test harness for Perl, but today
- it has been (mostly) standardized, and has various independent
- implementations in different languages; among them, C, C++, Perl,
- Python, PHP, and Java. For a semi-official specification of the
- TAP protocol, please refer to the documentation of
- @uref{http://search.cpan.org/~petdance/Test-Harness/lib/Test/Harness/TAP.pod,
- @samp{Test::Harness::TAP}}.
- The most relevant real-world usages of TAP are obviously in the testsuites
- of @command{perl} and of many perl modules. Still, also other important
- third-party packages, such as @uref{http://git-scm.com/, @command{git}},
- use TAP in their testsuite.
- @node Use TAP with the Automake test harness
- @subsection Use TAP with the Automake test harness
- Currently, the TAP driver that comes with Automake requires some by-hand
- steps on the developer's part (this situation should hopefully be improved
- in future Automake versions). You'll have to grab the @file{tap-driver.sh}
- script from the Automake distribution by hand, copy it in your source tree,
- and use the Automake support for third-party test drivers to instruct the
- harness to use the @file{tap-driver.sh} script and the awk program found
- by @code{AM_INIT_AUTOMAKE} to run your TAP-producing tests. See the example
- below for clarification.
- Apart from the options common to all the Automake test drivers
- (@pxref{Command-line arguments for test drivers}), the @file{tap-driver.sh}
- supports the following options, whose names are chosen for enhanced
- compatibility with the @command{prove} utility.
- @table @option
- @c Keep in sync with 'tap-exit.sh' and 'tap-signal.tap'.
- @item --ignore-exit
- Causes the test driver to ignore the exit status of the test scripts;
- by default, the driver will report an error if the script exits with a
- non-zero status. This option has effect also on non-zero exit statuses
- due to termination by a signal.
- @item --comments
- Instruct the test driver to display TAP diagnostic (i.e., lines beginning
- with the @samp{#} character) in the testsuite progress output too; by
- default, TAP diagnostic is only copied to the @file{.log} file.
- @item --no-comments
- Revert the effects of @option{--comments}.
- @item --merge
- Instruct the test driver to merge the test scripts' standard error into
- their standard output. This is necessary if you want to ensure that
- diagnostics from the test scripts are displayed in the correct order
- relative to test results; this can be of great help in debugging
- (especially if your test scripts are shell scripts run with shell
- tracing active). As a downside, this option might cause the test
- harness to get confused if anything that appears on standard error
- looks like a test result.
- @item --no-merge
- Revert the effects of @option{--merge}.
- @item --diagnostic-string=@var{STRING}
- Change the string that introduces TAP diagnostic from the default value
- of ``@code{#}'' to @code{@var{STRING}}. This can be useful if your
- TAP-based test scripts produce verbose output on which they have limited
- control (because, say, the output comes from other tools invoked in the
- scripts), and it might contain text that gets spuriously interpreted as
- TAP diagnostic: such an issue can be solved by redefining the string that
- activates TAP diagnostic to a value you know won't appear by chance in
- the tests' output. Note however that this feature is non-standard, as
- the ``official'' TAP protocol does not allow for such a customization; so
- don't use it if you can avoid it.
- @end table
- @noindent
- Here is an example of how the TAP driver can be set up and used.
- @c Keep in sync with tap-doc2.sh
- @example
- % @kbd{cat configure.ac}
- AC_INIT([GNU Try Tap], [1.0], [bug-automake@@gnu.org])
- AC_CONFIG_AUX_DIR([build-aux])
- AM_INIT_AUTOMAKE([foreign -Wall -Werror])
- AC_CONFIG_FILES([Makefile])
- AC_REQUIRE_AUX_FILE([tap-driver.sh])
- AC_OUTPUT
- % @kbd{cat Makefile.am}
- TEST_LOG_DRIVER = env AM_TAP_AWK='$(AWK)' $(SHELL) \
- $(top_srcdir)/build-aux/tap-driver.sh
- TESTS = foo.test bar.test baz.test
- EXTRA_DIST = $(TESTS)
- % @kbd{cat foo.test}
- #!/bin/sh
- echo 1..4 # Number of tests to be executed.
- echo 'ok 1 - Swallows fly'
- echo 'not ok 2 - Caterpillars fly # TODO metamorphosis in progress'
- echo 'ok 3 - Pigs fly # SKIP not enough acid'
- echo '# I just love word plays ...'
- echo 'ok 4 - Flies fly too :-)'
- % @kbd{cat bar.test}
- #!/bin/sh
- echo 1..3
- echo 'not ok 1 - Bummer, this test has failed.'
- echo 'ok 2 - This passed though.'
- echo 'Bail out! Ennui kicking in, sorry...'
- echo 'ok 3 - This will not be seen.'
- % @kbd{cat baz.test}
- #!/bin/sh
- echo 1..1
- echo ok 1
- # Exit with error, even if all the tests have been successful.
- exit 7
- % @kbd{cp @var{PREFIX}/share/automake-@var{APIVERSION}/tap-driver.sh .}
- % @kbd{autoreconf -vi && ./configure && make check}
- ...
- PASS: foo.test 1 - Swallows fly
- XFAIL: foo.test 2 - Caterpillars fly # TODO metamorphosis in progress
- SKIP: foo.test 3 - Pigs fly # SKIP not enough acid
- PASS: foo.test 4 - Flies fly too :-)
- FAIL: bar.test 1 - Bummer, this test has failed.
- PASS: bar.test 2 - This passed though.
- ERROR: bar.test - Bail out! Ennui kicking in, sorry...
- PASS: baz.test 1
- ERROR: baz.test - exited with status 7
- ...
- Please report to bug-automake@@gnu.org
- ...
- % @kbd{echo exit status: $?}
- exit status: 1
- @c Keep the "skewed" indentation below, it produces pretty PDF output.
- % @kbd{env TEST_LOG_DRIVER_FLAGS='--comments --ignore-exit' \
- TESTS='foo.test baz.test' make -e check}
- ...
- PASS: foo.test 1 - Swallows fly
- XFAIL: foo.test 2 - Caterpillars fly # TODO metamorphosis in progress
- SKIP: foo.test 3 - Pigs fly # SKIP not enough acid
- # foo.test: I just love word plays...
- PASS: foo.test 4 - Flies fly too :-)
- PASS: baz.test 1
- ...
- % @kbd{echo exit status: $?}
- exit status: 0
- @end example
- @node Incompatibilities with other TAP parsers and drivers
- @subsection Incompatibilities with other TAP parsers and drivers
- For implementation or historical reasons, the TAP driver and harness as
- implemented by Automake have some minors incompatibilities with the
- mainstream versions, which you should be aware of.
- @itemize @bullet
- @item
- A @code{Bail out!} directive doesn't stop the whole testsuite, but only
- the test script it occurs in. This doesn't follow TAP specifications,
- but on the other hand it maximizes compatibility (and code sharing) with
- the ``hard error'' concept of the default testsuite driver.
- @item
- The @code{version} and @code{pragma} directives are not supported.
- @item
- The @option{--diagnostic-string} option of our driver allows to modify
- the string that introduces TAP diagnostic from the default value
- of ``@code{#}''. The standard TAP protocol has currently no way to
- allow this, so if you use it your diagnostic will be lost to more
- compliant tools like @command{prove} and @code{Test::Harness}
- @item
- And there are probably some other small and yet undiscovered
- incompatibilities, especially in corner cases or with rare usages.
- @end itemize
- @node Links and external resources on TAP
- @subsection Links and external resources on TAP
- @noindent
- Here are some links to more extensive official or third-party
- documentation and resources about the TAP protocol and related
- tools and libraries.
- @itemize @bullet
- @item
- @uref{http://search.cpan.org/~petdance/Test-Harness/lib/Test/Harness/TAP.pod,
- @samp{Test::Harness::TAP}},
- the (mostly) official documentation about the TAP format and protocol.
- @item
- @uref{http://search.cpan.org/~andya/Test-Harness/bin/prove,
- @command{prove}},
- the most famous command-line TAP test driver, included in the distribution
- of @command{perl} and
- @uref{http://search.cpan.org/~andya/Test-Harness/lib/Test/Harness.pm,
- @samp{Test::Harness}}.
- @item
- The @uref{http://testanything.org/wiki/index.php/Main_Page,TAP wiki}.
- @item
- A ``gentle introduction'' to testing for perl coders:
- @uref{http://search.cpan.org/dist/Test-Simple/lib/Test/Tutorial.pod,
- @samp{Test::Tutorial}}.
- @item
- @uref{http://search.cpan.org/~mschwern/Test-Simple/lib/Test/Simple.pm,
- @samp{Test::Simple}}
- and
- @uref{http://search.cpan.org/~mschwern/Test-Simple/lib/Test/More.pm,
- @samp{Test::More}},
- the standard perl testing libraries, which are based on TAP.
- @item
- @uref{http://www.eyrie.org/~eagle/software/c-tap-harness/,C TAP Harness},
- a C-based project implementing both a TAP producer and a TAP consumer.
- @item
- @uref{http://www.tap4j.org/,tap4j},
- a Java-based project implementing both a TAP producer and a TAP consumer.
- @end itemize
- @node DejaGnu Tests
- @section DejaGnu Tests
- If @uref{ftp://ftp.gnu.org/gnu/dejagnu/, @command{dejagnu}} appears in
- @code{AUTOMAKE_OPTIONS}, then a @command{dejagnu}-based test suite is
- assumed. The variable @code{DEJATOOL} is a list of names that are
- passed, one at a time, as the @option{--tool} argument to
- @command{runtest} invocations; it defaults to the name of the package.
- The variable @code{RUNTESTDEFAULTFLAGS} holds the @option{--tool} and
- @option{--srcdir} flags that are passed to dejagnu by default; this can be
- overridden if necessary.
- @vindex RUNTESTDEFAULTFLAGS
- The variables @code{EXPECT} and @code{RUNTEST} can
- also be overridden to provide project-specific values. For instance,
- you will need to do this if you are testing a compiler toolchain,
- because the default values do not take into account host and target
- names.
- @opindex dejagnu
- @vindex DEJATOOL
- @vindex EXPECT
- @vindex RUNTEST
- The contents of the variable @code{RUNTESTFLAGS} are passed to the
- @code{runtest} invocation. This is considered a ``user variable''
- (@pxref{User Variables}). If you need to set @command{runtest} flags in
- @file{Makefile.am}, you can use @code{AM_RUNTESTFLAGS} instead.
- @vindex RUNTESTFLAGS
- @vindex AM_RUNTESTFLAGS
- @cindex @file{site.exp}
- Automake will generate rules to create a local @file{site.exp} file,
- defining various variables detected by @command{configure}. This file
- is automatically read by DejaGnu. It is OK for the user of a package
- to edit this file in order to tune the test suite. However this is
- not the place where the test suite author should define new variables:
- this should be done elsewhere in the real test suite code.
- Especially, @file{site.exp} should not be distributed.
- Still, if the package author has legitimate reasons to extend
- @file{site.exp} at @command{make} time, he can do so by defining
- the variable @code{EXTRA_DEJAGNU_SITE_CONFIG}; the files listed
- there will be considered @file{site.exp} prerequisites, and their
- content will be appended to it (in the same order in which they
- appear in @code{EXTRA_DEJAGNU_SITE_CONFIG}). Note that files are
- @emph{not} distributed by default.
- For more information regarding DejaGnu test suites, see @ref{Top, , ,
- dejagnu, The DejaGnu Manual}.
- @node Install Tests
- @section Install Tests
- The @code{installcheck} target is available to the user as a way to
- run any tests after the package has been installed. You can add tests
- to this by writing an @code{installcheck-local} rule.
- @node Rebuilding
- @chapter Rebuilding Makefiles
- @cindex rebuild rules
- Automake generates rules to automatically rebuild @file{Makefile}s,
- @file{configure}, and other derived files like @file{Makefile.in}.
- @acindex AM_MAINTAINER_MODE
- If you are using @code{AM_MAINTAINER_MODE} in @file{configure.ac}, then
- these automatic rebuilding rules are only enabled in maintainer mode.
- @vindex CONFIG_STATUS_DEPENDENCIES
- @vindex CONFIGURE_DEPENDENCIES
- @cindex @file{version.sh}, example
- @cindex @file{version.m4}, example
- Sometimes it is convenient to supplement the rebuild rules for
- @file{configure} or @file{config.status} with additional dependencies.
- The variables @code{CONFIGURE_DEPENDENCIES} and
- @code{CONFIG_STATUS_DEPENDENCIES} can be used to list these extra
- dependencies. These variables should be defined in all
- @file{Makefile}s of the tree (because these two rebuild rules are
- output in all them), so it is safer and easier to @code{AC_SUBST} them
- from @file{configure.ac}. For instance, the following statement will
- cause @file{configure} to be rerun each time @file{version.sh} is
- changed.
- @c Keep in sync with remake-config-status-dependencies.sh
- @example
- AC_SUBST([CONFIG_STATUS_DEPENDENCIES], ['$(top_srcdir)/version.sh'])
- @end example
- @noindent
- Note the @samp{$(top_srcdir)/} in the file name. Since this variable
- is to be used in all @file{Makefile}s, its value must be sensible at
- any level in the build hierarchy.
- Beware not to mistake @code{CONFIGURE_DEPENDENCIES} for
- @code{CONFIG_STATUS_DEPENDENCIES}.
- @c Keep in sync with remake-configure-dependencies.sh
- @code{CONFIGURE_DEPENDENCIES} adds dependencies to the
- @file{configure} rule, whose effect is to run @command{autoconf}. This
- variable should be seldom used, because @command{automake} already tracks
- @code{m4_include}d files. However it can be useful when playing
- tricky games with @code{m4_esyscmd} or similar non-recommendable
- macros with side effects. Be also aware that interactions of this
- variable with the @ref{Autom4te Cache, , autom4te cache, autoconf,
- The Autoconf Manual} are quite problematic and can cause subtle
- breakage, so you might want to disable the cache if you want to use
- @code{CONFIGURE_DEPENDENCIES}.
- @code{CONFIG_STATUS_DEPENDENCIES} adds dependencies to the
- @file{config.status} rule, whose effect is to run @file{configure}.
- This variable should therefore carry any non-standard source that may
- be read as a side effect of running @command{configure}, like @file{version.sh}
- in the example above.
- Speaking of @file{version.sh} scripts, we recommend against them
- today. They are mainly used when the version of a package is updated
- automatically by a script (e.g., in daily builds). Here is what some
- old-style @file{configure.ac}s may look like:
- @example
- AC_INIT
- . $srcdir/version.sh
- AM_INIT_AUTOMAKE([name], $VERSION_NUMBER)
- @dots{}
- @end example
- @noindent
- Here, @file{version.sh} is a shell fragment that sets
- @code{VERSION_NUMBER}. The problem with this example is that
- @command{automake} cannot track dependencies (listing @file{version.sh}
- in @command{CONFIG_STATUS_DEPENDENCIES}, and distributing this file is up
- to the user), and that it uses the obsolete form of @code{AC_INIT} and
- @code{AM_INIT_AUTOMAKE}. Upgrading to the new syntax is not
- straightforward, because shell variables are not allowed in
- @code{AC_INIT}'s arguments. We recommend that @file{version.sh} be
- replaced by an M4 file that is included by @file{configure.ac}:
- @example
- m4_include([version.m4])
- AC_INIT([name], VERSION_NUMBER)
- AM_INIT_AUTOMAKE
- @dots{}
- @end example
- @noindent
- Here @file{version.m4} could contain something like
- @samp{m4_define([VERSION_NUMBER], [1.2])}. The advantage of this
- second form is that @command{automake} will take care of the
- dependencies when defining the rebuild rule, and will also distribute
- the file automatically. An inconvenience is that @command{autoconf}
- will now be rerun each time the version number is bumped, when only
- @file{configure} had to be rerun in the previous setup.
- @node Options
- @chapter Changing Automake's Behavior
- @menu
- * Options generalities:: Semantics of Automake option
- * List of Automake options:: A comprehensive list of Automake options
- @end menu
- @node Options generalities
- @section Options generalities
- Various features of Automake can be controlled by options. Except where
- noted otherwise, options can be specified in one of several ways. Most
- options can be applied on a per-@file{Makefile} basis when listed in a
- special @file{Makefile} variable named @code{AUTOMAKE_OPTIONS}. Some
- of these options only make sense when specified in the toplevel
- @file{Makefile.am} file. Options are applied globally to all processed
- @file{Makefile} files when listed in the first argument of
- @code{AM_INIT_AUTOMAKE} in @file{configure.ac}, and some options which
- require changes to the @command{configure} script can only be specified
- there. These are annotated below.
- As a general rule, options specified in @code{AUTOMAKE_OPTIONS} take
- precedence over those specified in @code{AM_INIT_AUTOMAKE}, which in
- turn take precedence over those specified on the command line.
- Also, some care must be taken about the interactions among strictness
- level and warning categories. As a general rule, strictness-implied
- warnings are overridden by those specified by explicit options. For
- example, even if @samp{portability} warnings are disabled by default
- in @option{foreign} strictness, an usage like this will end up enabling
- them:
- @example
- AUTOMAKE_OPTIONS = -Wportability foreign
- @end example
- However, a strictness level specified in a higher-priority context
- will override all the explicit warnings specified in a lower-priority
- context. For example, if @file{configure.ac} contains:
- @example
- AM_INIT_AUTOMAKE([-Wportability])
- @end example
- @noindent
- and @file{Makefile.am} contains:
- @example
- AUTOMAKE_OPTIONS = foreign
- @end example
- @noindent
- then @samp{portability} warnings will be @emph{disabled} in
- @file{Makefile.am}.
- @node List of Automake options
- @section List of Automake options
- @vindex AUTOMAKE_OPTIONS
- @table @asis
- @item @option{gnits}
- @itemx @option{gnu}
- @itemx @option{foreign}
- @cindex Option, @option{gnits}
- @cindex Option, @option{gnu}
- @cindex Option, @option{foreign}
- @opindex gnits
- @opindex gnu
- @opindex foreign
- Set the strictness as appropriate. The @option{gnits} option also
- implies options @option{readme-alpha} and @option{check-news}.
- @item @option{check-news}
- @cindex Option, @option{check-news}
- @opindex check-news
- Cause @samp{make dist} to fail unless the current version number appears
- in the first few lines of the @file{NEWS} file.
- @item @option{dejagnu}
- @cindex Option, @option{dejagnu}
- @opindex dejagnu
- Cause @command{dejagnu}-specific rules to be generated. @xref{DejaGnu Tests}.
- @item @option{dist-bzip2}
- @cindex Option, @option{dist-bzip2}
- @opindex dist-bzip2
- Hook @code{dist-bzip2} to @code{dist}.
- @trindex dist-bzip2
- @item @option{dist-lzip}
- @cindex Option, @option{dist-lzip}
- @opindex dist-lzip
- Hook @code{dist-lzip} to @code{dist}.
- @trindex dist-lzip
- @item @option{dist-xz}
- @cindex Option, @option{dist-xz}
- @opindex dist-xz
- Hook @code{dist-xz} to @code{dist}.
- @trindex dist-xz
- @item @option{dist-zip}
- @cindex Option, @option{dist-zip}
- @opindex dist-zip
- Hook @code{dist-zip} to @code{dist}.
- @trindex dist-zip
- @item @option{dist-shar}
- @cindex Option, @option{dist-shar}
- @opindex dist-shar
- Hook @code{dist-shar} to @code{dist}. Use of this option
- is deprecated, as the @samp{shar} format is obsolescent and
- problematic. Support for it will be removed altogether in
- Automake 2.0.
- @trindex dist-shar
- @item @option{dist-tarZ}
- @cindex Option, @option{dist-tarZ}
- @opindex dist-tarZ
- Hook @code{dist-tarZ} to @code{dist}. Use of this option
- is deprecated, as the @samp{compress} program is obsolete.
- Support for it will be removed altogether in Automake 2.0.
- @trindex dist-tarZ
- @item @option{filename-length-max=99}
- @cindex Option, @option{filename-length-max=99}
- @opindex filename-length-max=99
- Abort if file names longer than 99 characters are found during
- @samp{make dist}. Such long file names are generally considered not to
- be portable in tarballs. See the @option{tar-v7} and @option{tar-ustar}
- options below. This option should be used in the top-level
- @file{Makefile.am} or as an argument of @code{AM_INIT_AUTOMAKE} in
- @file{configure.ac}, it will be ignored otherwise. It will also be
- ignored in sub-packages of nested packages (@pxref{Subpackages}).
- @item @option{info-in-builddir}
- @cindex Option, @option{info-in-builddir}
- @opindex info-in-builddir
- Instruct Automake to place the generated @file{.info} files in the
- @code{builddir} rather than in the @code{srcdir}. Note that this
- might make VPATH builds with some non-GNU make implementations more
- brittle.
- @item @option{no-define}
- @cindex Option, @option{no-define}
- @opindex no-define
- This option is meaningful only when passed as an argument to
- @code{AM_INIT_AUTOMAKE}. It will prevent the @code{PACKAGE} and
- @code{VERSION} variables from being @code{AC_DEFINE}d. But notice
- that they will remain defined as shell variables in the generated
- @code{configure}, and as make variables in the generated
- @code{Makefile}; this is deliberate, and required for backward
- compatibility.
- @item @option{no-dependencies}
- @cindex Option, @option{no-dependencies}
- @opindex no-dependencies
- This is similar to using @option{--ignore-deps} on the command line,
- but is useful for those situations where you don't have the necessary
- bits to make automatic dependency tracking work
- (@pxref{Dependencies}). In this case the effect is to effectively
- disable automatic dependency tracking.
- @item @option{no-dist}
- @cindex Option, @option{no-dist}
- @opindex no-dist
- Don't emit any code related to @code{dist} target. This is useful
- when a package has its own method for making distributions.
- @item @option{no-dist-gzip}
- @cindex Option, @option{no-dist-gzip}
- @opindex no-dist-gzip
- Do not hook @code{dist-gzip} to @code{dist}.
- @trindex no-dist-gzip
- @item @option{no-exeext}
- @cindex Option, @option{no-exeext}
- @opindex no-exeext
- If your @file{Makefile.am} defines a rule for target @code{foo}, it
- will override a rule for a target named @samp{foo$(EXEEXT)}. This is
- necessary when @code{EXEEXT} is found to be empty. However, by
- default @command{automake} will generate an error for this use. The
- @option{no-exeext} option will disable this error. This is intended for
- use only where it is known in advance that the package will not be
- ported to Windows, or any other operating system using extensions on
- executables.
- @item @option{no-installinfo}
- @cindex Option, @option{no-installinfo}
- @opindex no-installinfo
- The generated @file{Makefile.in} will not cause info pages to be built
- or installed by default. However, @code{info} and @code{install-info}
- targets will still be available. This option is disallowed at
- @option{gnu} strictness and above.
- @trindex info
- @trindex install-info
- @item @option{no-installman}
- @cindex Option, @option{no-installman}
- @opindex no-installman
- The generated @file{Makefile.in} will not cause man pages to be
- installed by default. However, an @code{install-man} target will still
- be available for optional installation. This option is disallowed at
- @option{gnu} strictness and above.
- @trindex install-man
- @item @option{nostdinc}
- @cindex Option, @option{nostdinc}
- @opindex nostdinc
- This option can be used to disable the standard @option{-I} options that
- are ordinarily automatically provided by Automake.
- @item @option{no-texinfo.tex}
- @cindex Option, @option{no-texinfo.tex}
- @opindex no-texinfo.tex
- Don't require @file{texinfo.tex}, even if there are texinfo files in
- this directory.
- @item @option{serial-tests}
- @cindex Option, @option{serial-tests}
- @opindex serial-tests
- Enable the older serial test suite harness for @code{TESTS} (@pxref{Serial
- Test Harness}, for more information).
- @item @option{parallel-tests}
- @cindex Option, @option{parallel-tests}
- @opindex parallel-tests
- Enable test suite harness for @code{TESTS} that can run tests in parallel
- (@pxref{Parallel Test Harness}, for more information). This option is
- only kept for backward-compatibility, since the parallel test harness is
- the default now.
- @item @option{readme-alpha}
- @cindex Option, @option{readme-alpha}
- @opindex readme-alpha
- If this release is an alpha release, and the file @file{README-alpha}
- exists, then it will be added to the distribution. If this option is
- given, version numbers are expected to follow one of two forms. The
- first form is @samp{@var{major}.@var{minor}.@var{alpha}}, where each
- element is a number; the final period and number should be left off for
- non-alpha releases. The second form is
- @samp{@var{major}.@var{minor}@var{alpha}}, where @var{alpha} is a
- letter; it should be omitted for non-alpha releases.
- @item @option{std-options}
- @cindex Options, @option{std-options}
- @cindex @samp{make installcheck}, testing @option{--help} and @option{--version}
- @cindex @option{--help} check
- @cindex @option{--version} check
- @opindex std-options
- Make the @code{installcheck} rule check that installed scripts and
- programs support the @option{--help} and @option{--version} options.
- This also provides a basic check that the program's
- run-time dependencies are satisfied after installation.
- @vindex AM_INSTALLCHECK_STD_OPTIONS_EXEMPT
- In a few situations, programs (or scripts) have to be exempted from this
- test. For instance, @command{false} (from GNU coreutils) is never
- successful, even for @option{--help} or @option{--version}. You can list
- such programs in the variable @code{AM_INSTALLCHECK_STD_OPTIONS_EXEMPT}.
- Programs (not scripts) listed in this variable should be suffixed by
- @samp{$(EXEEXT)} for the sake of Windows or OS/2. For instance, suppose we
- build @file{false} as a program but @file{true.sh} as a script, and that
- neither of them support @option{--help} or @option{--version}:
- @example
- AUTOMAKE_OPTIONS = std-options
- bin_PROGRAMS = false ...
- bin_SCRIPTS = true.sh ...
- AM_INSTALLCHECK_STD_OPTIONS_EXEMPT = false$(EXEEXT) true.sh
- @end example
- @item @option{subdir-objects}
- @cindex Options, @option{subdir-objects}
- @opindex subdir-objects
- If this option is specified, then objects are placed into the
- subdirectory of the build directory corresponding to the subdirectory of
- the source file. For instance, if the source file is
- @file{subdir/file.cxx}, then the output file would be
- @file{subdir/file.o}.
- @anchor{tar-formats}
- @item @option{tar-v7}
- @itemx @option{tar-ustar}
- @itemx @option{tar-pax}
- @cindex Option, @option{tar-v7}
- @cindex Option, @option{tar-ustar}
- @cindex Option, @option{tar-pax}
- @cindex @command{tar} formats
- @cindex v7 @command{tar} format
- @cindex ustar format
- @cindex pax format
- @opindex tar-v7
- @opindex tar-ustar
- @opindex tar-pax
- These three mutually exclusive options select the tar format to use
- when generating tarballs with @samp{make dist}. (The tar file created
- is then compressed according to the set of @option{no-dist-gzip},
- @option{dist-bzip2}, @option{dist-lzip}, @option{dist-xz} and
- @option{dist-tarZ} options in use.)
- These options must be passed as arguments to @code{AM_INIT_AUTOMAKE}
- (@pxref{Macros}) because they can require additional configure checks.
- Automake will complain if it sees such options in an
- @code{AUTOMAKE_OPTIONS} variable.
- @option{tar-v7} selects the old V7 tar format. This is the historical
- default. This antiquated format is understood by all tar
- implementations and supports file names with up to 99 characters. When
- given longer file names some tar implementations will diagnose the
- problem while other will generate broken tarballs or use non-portable
- extensions. Furthermore, the V7 format cannot store empty
- directories. When using this format, consider using the
- @option{filename-length-max=99} option to catch file names too long.
- @option{tar-ustar} selects the ustar format defined by POSIX
- 1003.1-1988. This format is believed to be old enough to be portable.
- It fully supports empty directories. It can store file names with up
- to 256 characters, provided that the file name can be split at
- directory separator in two parts, first of them being at most 155
- bytes long. So, in most cases the maximum file name length will be
- shorter than 256 characters. However you may run against broken tar
- implementations that incorrectly handle file names longer than 99
- characters (please report them to @email{@value{PACKAGE_BUGREPORT}} so we
- can document this accurately).
- @option{tar-pax} selects the new pax interchange format defined by POSIX
- 1003.1-2001. It does not limit the length of file names. However,
- this format is very young and should probably be restricted to
- packages that target only very modern platforms. There are moves to
- change the pax format in an upward-compatible way, so this option may
- refer to a more recent version in the future.
- @xref{Formats, , Controlling the Archive Format, tar, GNU Tar}, for
- further discussion about tar formats.
- @command{configure} knows several ways to construct these formats. It
- will not abort if it cannot find a tool up to the task (so that the
- package can still be built), but @samp{make dist} will fail.
- @item @var{version}
- @cindex Option, @var{version}
- A version number (e.g., @samp{0.30}) can be specified. If Automake is not
- newer than the version specified, creation of the @file{Makefile.in}
- will be suppressed.
- @item @option{-W@var{category}} or @option{--warnings=@var{category}}
- @cindex Option, warnings
- @cindex Option, @option{-W@var{category}}
- @cindex Option, @option{--warnings=@var{category}}
- These options behave exactly like their command-line counterpart
- (@pxref{automake Invocation}). This allows you to enable or disable some
- warning categories on a per-file basis. You can also setup some warnings
- for your entire project; for instance, try @samp{AM_INIT_AUTOMAKE([-Wall])}
- in your @file{configure.ac}.
- @end table
- Unrecognized options are diagnosed by @command{automake}.
- If you want an option to apply to all the files in the tree, you can use
- the @code{AM_INIT_AUTOMAKE} macro in @file{configure.ac}.
- @xref{Macros}.
- @node Miscellaneous
- @chapter Miscellaneous Rules
- There are a few rules and variables that didn't fit anywhere else.
- @menu
- * Tags:: Interfacing to cscope, etags and mkid
- * Suffixes:: Handling new file extensions
- @end menu
- @node Tags
- @section Interfacing to @command{etags}
- @cindex @file{TAGS} support
- Automake will generate rules to generate @file{TAGS} files for use with
- GNU Emacs under some circumstances.
- @trindex tags
- If any C, C++ or Fortran 77 source code or headers are present, then
- @code{tags} and @code{TAGS} rules will be generated for the directory.
- All files listed using the @code{_SOURCES}, @code{_HEADERS}, and
- @code{_LISP} primaries will be used to generate tags. Note that
- generated source files that are not distributed must be declared in
- variables like @code{nodist_noinst_HEADERS} or
- @code{nodist_@var{prog}_SOURCES} or they will be ignored.
- A @code{tags} rule will be output at the topmost directory of a
- multi-directory package. When run from this topmost directory,
- @samp{make tags} will generate a @file{TAGS} file that includes by
- reference all @file{TAGS} files from subdirectories.
- The @code{tags} rule will also be generated if the variable
- @code{ETAGS_ARGS} is defined. This variable is intended for use in
- directories that contain taggable source that @command{etags} does
- not understand. The user can use the @code{ETAGSFLAGS} to pass
- additional flags to @command{etags}; @code{AM_ETAGSFLAGS} is also
- available for use in @file{Makefile.am}.
- @vindex ETAGS_ARGS
- @vindex ETAGSFLAGS
- @vindex AM_ETAGSFLAGS
- Here is how Automake generates tags for its source, and for nodes in its
- Texinfo file:
- @example
- ETAGS_ARGS = automake.in --lang=none \
- --regex='/^@@node[ \t]+\([^,]+\)/\1/' automake.texi
- @end example
- If you add file names to @code{ETAGS_ARGS}, you will probably also
- want to define @code{TAGS_DEPENDENCIES}. The contents of this variable
- are added directly to the dependencies for the @code{tags} rule.
- @vindex TAGS_DEPENDENCIES
- Automake also generates a @code{ctags} rule that can be used to
- build @command{vi}-style @file{tags} files. The variable @code{CTAGS}
- is the name of the program to invoke (by default @command{ctags});
- @code{CTAGSFLAGS} can be used by the user to pass additional flags,
- and @code{AM_CTAGSFLAGS} can be used by the @file{Makefile.am}.
- @trindex id
- Automake will also generate an @code{ID} rule that will run
- @command{mkid} on the source. This is only supported on a
- directory-by-directory basis.
- Similarly, the @code{cscope} rule will create a list of all the source
- files in the tree and run @command{cscope} to build an inverted index
- database. The variable @code{CSCOPE} is the name of the program to invoke
- (by default @command{cscope}); @code{CSCOPEFLAGS} and
- @code{CSCOPE_ARGS} can be used by the user to pass additional flags and
- file names respectively, while @code{AM_CSCOPEFLAGS} can be used by the
- @file{Makefile.am}. Note that, currently, the Automake-provided
- @code{cscope} support, when used in a VPATH build, might not work well
- with non-GNU make implementations (especially with make implementations
- performing @ref{Automatic Rule Rewriting, , VPATH rewrites, autoconf,
- The Autoconf Manual}).
- Finally, Automake also emits rules to support the
- @uref{http://www.gnu.org/software/global/, GNU Global Tags program}.
- The @code{GTAGS} rule runs Global Tags and puts the
- result in the top build directory. The variable @code{GTAGS_ARGS}
- holds arguments that are passed to @command{gtags}.
- @vindex GTAGS_ARGS
- @node Suffixes
- @section Handling new file extensions
- @cindex Adding new @code{SUFFIXES}
- @cindex @code{SUFFIXES}, adding
- @vindex SUFFIXES
- It is sometimes useful to introduce a new implicit rule to handle a file
- type that Automake does not know about.
- For instance, suppose you had a compiler that could compile @file{.foo}
- files to @file{.o} files. You would simply define a suffix rule for
- your language:
- @example
- .foo.o:
- foocc -c -o $@@ $<
- @end example
- Then you could directly use a @file{.foo} file in a @code{_SOURCES}
- variable and expect the correct results:
- @example
- bin_PROGRAMS = doit
- doit_SOURCES = doit.foo
- @end example
- This was the simpler and more common case. In other cases, you will
- have to help Automake to figure out which extensions you are defining your
- suffix rule for. This usually happens when your extension does not
- start with a dot. Then, all you have to do is to put a list of new
- suffixes in the @code{SUFFIXES} variable @strong{before} you define your
- implicit rule.
- For instance, the following definition prevents Automake from misinterpreting
- the @samp{.idlC.cpp:} rule as an attempt to transform @file{.idlC} files into
- @file{.cpp} files.
- @c Keep in sync with suffix7.sh
- @example
- SUFFIXES = .idl C.cpp
- .idlC.cpp:
- # whatever
- @end example
- As you may have noted, the @code{SUFFIXES} variable behaves like the
- @code{.SUFFIXES} special target of @command{make}. You should not touch
- @code{.SUFFIXES} yourself, but use @code{SUFFIXES} instead and let
- Automake generate the suffix list for @code{.SUFFIXES}. Any given
- @code{SUFFIXES} go at the start of the generated suffixes list, followed
- by Automake generated suffixes not already in the list.
- @node Include
- @chapter Include
- @cmindex include
- @cindex Including @file{Makefile} fragment
- @cindex @file{Makefile} fragment, including
- Automake supports an @code{include} directive that can be used to
- include other @file{Makefile} fragments when @command{automake} is run.
- Note that these fragments are read and interpreted by @command{automake},
- not by @command{make}. As with conditionals, @command{make} has no idea that
- @code{include} is in use.
- There are two forms of @code{include}:
- @table @code
- @item include $(srcdir)/file
- Include a fragment that is found relative to the current source
- directory.
- @item include $(top_srcdir)/file
- Include a fragment that is found relative to the top source directory.
- @end table
- Note that if a fragment is included inside a conditional, then the
- condition applies to the entire contents of that fragment.
- Makefile fragments included this way are always distributed because
- they are needed to rebuild @file{Makefile.in}.
- Inside a fragment, the construct @code{%reldir%} is replaced with the
- directory of the fragment relative to the base @file{Makefile.am}.
- Similarly, @code{%canon_reldir%} is replaced with the canonicalized
- (@pxref{Canonicalization}) form of @code{%reldir%}. As a convenience,
- @code{%D%} is a synonym for @code{%reldir%}, and @code{%C%}
- is a synonym for @code{%canon_reldir%}.
- A special feature is that if the fragment is in the same directory as
- the base @file{Makefile.am} (i.e., @code{%reldir%} is @code{.}), then
- @code{%reldir%} and @code{%canon_reldir%} will expand to the empty
- string as well as eat, if present, a following slash or underscore
- respectively.
- Thus, a makefile fragment might look like this:
- @example
- bin_PROGRAMS += %reldir%/mumble
- %canon_reldir%_mumble_SOURCES = %reldir%/one.c
- @end example
- @node Conditionals
- @chapter Conditionals
- @cindex Conditionals
- Automake supports a simple type of conditionals.
- These conditionals are not the same as conditionals in
- GNU Make. Automake conditionals are checked at configure time by the
- @file{configure} script, and affect the translation from
- @file{Makefile.in} to @file{Makefile}. They are based on options passed
- to @file{configure} and on results that @file{configure} has discovered
- about the host system. GNU Make conditionals are checked at @command{make}
- time, and are based on variables passed to the make program or defined
- in the @file{Makefile}.
- Automake conditionals will work with any make program.
- @menu
- * Usage of Conditionals:: Declaring conditional content
- * Limits of Conditionals:: Enclosing complete statements
- @end menu
- @node Usage of Conditionals
- @section Usage of Conditionals
- @acindex AM_CONDITIONAL
- Before using a conditional, you must define it by using
- @code{AM_CONDITIONAL} in the @file{configure.ac} file (@pxref{Macros}).
- @defmac AM_CONDITIONAL (@var{conditional}, @var{condition})
- The conditional name, @var{conditional}, should be a simple string
- starting with a letter and containing only letters, digits, and
- underscores. It must be different from @samp{TRUE} and @samp{FALSE}
- that are reserved by Automake.
- The shell @var{condition} (suitable for use in a shell @code{if}
- statement) is evaluated when @command{configure} is run. Note that you
- must arrange for @emph{every} @code{AM_CONDITIONAL} to be invoked every
- time @command{configure} is run. If @code{AM_CONDITIONAL} is run
- conditionally (e.g., in a shell @code{if} statement), then the result
- will confuse @command{automake}.
- @end defmac
- @cindex @option{--enable-debug}, example
- @cindex Example conditional @option{--enable-debug}
- @cindex Conditional example, @option{--enable-debug}
- Conditionals typically depend upon options that the user provides to
- the @command{configure} script. Here is an example of how to write a
- conditional that is true if the user uses the @option{--enable-debug}
- option.
- @example
- AC_ARG_ENABLE([debug],
- [ --enable-debug Turn on debugging],
- [case "$@{enableval@}" in
- yes) debug=true ;;
- no) debug=false ;;
- *) AC_MSG_ERROR([bad value $@{enableval@} for --enable-debug]) ;;
- esac],[debug=false])
- AM_CONDITIONAL([DEBUG], [test x$debug = xtrue])
- @end example
- Here is an example of how to use that conditional in @file{Makefile.am}:
- @cmindex if
- @cmindex endif
- @cmindex else
- @example
- if DEBUG
- DBG = debug
- else
- DBG =
- endif
- noinst_PROGRAMS = $(DBG)
- @end example
- This trivial example could also be handled using @code{EXTRA_PROGRAMS}
- (@pxref{Conditional Programs}).
- You may only test a single variable in an @code{if} statement, possibly
- negated using @samp{!}. The @code{else} statement may be omitted.
- Conditionals may be nested to any depth. You may specify an argument to
- @code{else} in which case it must be the negation of the condition used
- for the current @code{if}. Similarly you may specify the condition
- that is closed on the @code{endif} line:
- @example
- if DEBUG
- DBG = debug
- else !DEBUG
- DBG =
- endif !DEBUG
- @end example
- @noindent
- Unbalanced conditions are errors. The @code{if}, @code{else}, and
- @code{endif} statements should not be indented, i.e., start on column
- one.
- The @code{else} branch of the above two examples could be omitted,
- since assigning the empty string to an otherwise undefined variable
- makes no difference.
- @acindex AM_COND_IF
- In order to allow access to the condition registered by
- @code{AM_CONDITIONAL} inside @file{configure.ac}, and to allow
- conditional @code{AC_CONFIG_FILES}, @code{AM_COND_IF} may be used:
- @defmac AM_COND_IF (@var{conditional}, @ovar{if-true}, @ovar{if-false})
- If @var{conditional} is fulfilled, execute @var{if-true}, otherwise
- execute @var{if-false}. If either branch contains @code{AC_CONFIG_FILES},
- it will cause @command{automake} to output the rules for the respective
- files only for the given condition.
- @end defmac
- @code{AM_COND_IF} macros may be nested when m4 quotation is used
- properly (@pxref{M4 Quotation, ,, autoconf, The Autoconf Manual}).
- @cindex Example conditional @code{AC_CONFIG_FILES}
- @cindex @code{AC_CONFIG_FILES}, conditional
- Here is an example of how to define a conditional config file:
- @example
- AM_CONDITIONAL([SHELL_WRAPPER], [test "x$with_wrapper" = xtrue])
- AM_COND_IF([SHELL_WRAPPER],
- [AC_CONFIG_FILES([wrapper:wrapper.in])])
- @end example
- @node Limits of Conditionals
- @section Limits of Conditionals
- Conditionals should enclose complete statements like variables or
- rules definitions. Automake cannot deal with conditionals used inside
- a variable definition, for instance, and is not even able to diagnose
- this situation. The following example would not work:
- @example
- # This syntax is not understood by Automake
- AM_CPPFLAGS = \
- -DFEATURE_A \
- if WANT_DEBUG
- -DDEBUG \
- endif
- -DFEATURE_B
- @end example
- However the intended definition of @code{AM_CPPFLAGS} can be achieved
- with
- @example
- if WANT_DEBUG
- DEBUGFLAGS = -DDEBUG
- endif
- AM_CPPFLAGS = -DFEATURE_A $(DEBUGFLAGS) -DFEATURE_B
- @end example
- @noindent
- or
- @example
- AM_CPPFLAGS = -DFEATURE_A
- if WANT_DEBUG
- AM_CPPFLAGS += -DDEBUG
- endif
- AM_CPPFLAGS += -DFEATURE_B
- @end example
- More details and examples of conditionals are described alongside
- various Automake features in this manual (@pxref{Conditional
- Subdirectories}, @pxref{Conditional Sources}, @pxref{Conditional
- Programs}, @pxref{Conditional Libtool Libraries}, @pxref{Conditional
- Libtool Sources}).
- @node Silencing Make
- @chapter Silencing @command{make}
- @cindex Silent @command{make}
- @cindex Silencing @command{make}
- @cindex Silent rules
- @cindex Silent @command{make} rules
- @menu
- * Make verbosity:: Make is verbose by default
- * Tricks For Silencing Make:: Standard and generic ways to silence make
- * Automake Silent Rules:: How Automake can help in silencing make
- @end menu
- @node Make verbosity
- @section Make is verbose by default
- Normally, when executing the set of rules associated with a target,
- @command{make} prints each rule before it is executed. This behaviour,
- while having been in place for a long time, and being even mandated by
- the POSIX standard, starkly violates the ``silence is golden'' UNIX
- principle@footnote{See also
- @uref{http://catb.org/~esr/writings/taoup/html/ch11s09.html}.}:
- @quotation
- When a program has nothing interesting or surprising to say, it should
- say nothing. Well-behaved Unix programs do their jobs unobtrusively,
- with a minimum of fuss and bother. Silence is golden.
- @end quotation
- In fact, while such verbosity of @command{make} can theoretically be
- useful to track bugs and understand reasons of failures right away, it
- can also hide warning and error messages from @command{make}-invoked
- tools, drowning them in a flood of uninteresting and seldom useful
- messages, and thus allowing them to go easily undetected.
- This problem can be very annoying, especially for developers, who usually
- know quite well what's going on behind the scenes, and for whom the
- verbose output from @command{make} ends up being mostly noise that hampers
- the easy detection of potentially important warning messages.
- @node Tricks For Silencing Make
- @section Standard and generic ways to silence make
- Here we describe some common idioms/tricks to obtain a quieter make
- output, with their relative advantages and drawbacks. In the next
- section (@ref{Automake Silent Rules}) we'll see how Automake can help
- in this respect, providing more elaborate and flexible idioms.
- @itemize @bullet
- @item @command{make -s}
- This simply causes @command{make} not to print @emph{any} rule before
- executing it.
- The @option{-s} flag is mandated by POSIX, universally supported, and
- its purpose and function are easy to understand.
- But it also has its serious limitations too. First of all, it embodies
- an ``all or nothing'' strategy, i.e., either everything is silenced, or
- nothing is; this lack of granularity can sometimes be a fatal flaw.
- Moreover, when the @option{-s} flag is used, the @command{make} output
- might turn out to be too much terse; in case of errors, the user won't
- be able to easily see what rule or command have caused them, or even,
- in case of tools with poor error reporting, what the errors were!
- @item @command{make >/dev/null || make}
- Apparently, this perfectly obeys the ``silence is golden'' rule: warnings
- from stderr are passed through, output reporting is done only in case of
- error, and in that case it should provide a verbose-enough report to allow
- an easy determination of the error location and causes.
- However, calling @command{make} two times in a row might hide errors
- (especially intermittent ones), or subtly change the expected semantic
- of the @command{make} calls --- things these which can clearly make
- debugging and error assessment very difficult.
- @item @command{make --no-print-directory}
- This is GNU @command{make} specific. When called with the
- @option{--no-print-directory} option, GNU @command{make} will disable
- printing of the working directory by invoked sub-@command{make}s (the
- well-known ``@i{Entering/Leaving directory ...}'' messages). This helps
- to decrease the verbosity of the output, but experience has shown that
- it can also often render debugging considerably harder in projects using
- deeply-nested @command{make} recursion.
- As an aside, notice that the @option{--no-print-directory} option is
- automatically activated if the @option{-s} flag is used.
- @c TODO: Other tricks?
- @c TODO: Maybe speak about the @code{.SILENT} target?
- @c TODO: - Pros: More granularity on what to silence.
- @c TODO: - Cons: No easy way to temporarily override.
- @end itemize
- @node Automake Silent Rules
- @section How Automake can help in silencing make
- The tricks and idioms for silencing @command{make} described in the
- previous section can be useful from time to time, but we've seen that
- they all have their serious drawbacks and limitations. That's why
- automake provides support for a more advanced and flexible way of
- obtaining quieter output from @command{make} (for most rules at least).
- To give the gist of what Automake can do in this respect, here is a simple
- comparison between a typical @command{make} output (where silent rules
- are disabled) and one with silent rules enabled:
- @example
- % @kbd{cat Makefile.am}
- bin_PROGRAMS = foo
- foo_SOURCES = main.c func.c
- % @kbd{cat main.c}
- int main (void) @{ return func (); @} /* func used undeclared */
- % @kbd{cat func.c}
- int func (void) @{ int i; return i; @} /* i used uninitialized */
- @i{The make output is by default very verbose. This causes warnings
- from the compiler to be somewhat hidden, and not immediate to spot.}
- % @kbd{make CFLAGS=-Wall}
- gcc -DPACKAGE_NAME=\"foo\" -DPACKAGE_TARNAME=\"foo\" ...
- -DPACKAGE_STRING=\"foo\ 1.0\" -DPACKAGE_BUGREPORT=\"\" ...
- -DPACKAGE=\"foo\" -DVERSION=\"1.0\" -I. -Wall -MT main.o
- -MD -MP -MF .deps/main.Tpo -c -o main.o main.c
- main.c: In function ‘main’:
- main.c:3:3: warning: implicit declaration of function ‘func’
- mv -f .deps/main.Tpo .deps/main.Po
- gcc -DPACKAGE_NAME=\"foo\" -DPACKAGE_TARNAME=\"foo\" ...
- -DPACKAGE_STRING=\"foo\ 1.0\" -DPACKAGE_BUGREPORT=\"\" ...
- -DPACKAGE=\"foo\" -DVERSION=\"1.0\" -I. -Wall -MT func.o
- -MD -MP -MF .deps/func.Tpo -c -o func.o func.c
- func.c: In function ‘func’:
- func.c:4:3: warning: ‘i’ used uninitialized in this function
- mv -f .deps/func.Tpo .deps/func.Po
- gcc -Wall -o foo main.o func.o
- @i{Clean up, so that we we can rebuild everything from scratch.}
- % @kbd{make clean}
- test -z "foo" || rm -f foo
- rm -f *.o
- @i{Silent rules enabled: the output is minimal but informative. In
- particular, the warnings from the compiler stick out very clearly.}
- % @kbd{make V=0 CFLAGS=-Wall}
- CC main.o
- main.c: In function ‘main’:
- main.c:3:3: warning: implicit declaration of function ‘func’
- CC func.o
- func.c: In function ‘func’:
- func.c:4:3: warning: ‘i’ used uninitialized in this function
- CCLD foo
- @end example
- @cindex silent rules and libtool
- Also, in projects using @command{libtool}, the use of silent rules can
- automatically enable the @command{libtool}'s @option{--silent} option:
- @example
- % @kbd{cat Makefile.am}
- lib_LTLIBRARIES = libx.la
- % @kbd{make # Both make and libtool are verbose by default.}
- ...
- libtool: compile: gcc -DPACKAGE_NAME=\"foo\" ... -DLT_OBJDIR=\".libs/\"
- -I. -g -O2 -MT libx.lo -MD -MP -MF .deps/libx.Tpo -c libx.c -fPIC
- -DPIC -o .libs/libx.o
- mv -f .deps/libx.Tpo .deps/libx.Plo
- /bin/sh ./libtool --tag=CC --mode=link gcc -g -O2 -o libx.la -rpath
- /usr/local/lib libx.lo
- libtool: link: gcc -shared .libs/libx.o -Wl,-soname -Wl,libx.so.0
- -o .libs/libx.so.0.0.0
- libtool: link: cd .libs && rm -f libx.so && ln -s libx.so.0.0.0 libx.so
- ...
- % @kbd{make V=0}
- CC libx.lo
- CCLD libx.la
- @end example
- For Automake-generated @file{Makefile}s, the user may influence the
- verbosity at @command{configure} run time as well as at @command{make}
- run time:
- @itemize @bullet
- @item
- @opindex --enable-silent-rules
- @opindex --disable-silent-rules
- Passing @option{--enable-silent-rules} to @command{configure} will cause
- build rules to be less verbose; the option @option{--disable-silent-rules}
- will cause normal verbose output.
- @item
- @vindex @code{V}
- At @command{make} run time, the default chosen at @command{configure}
- time may be overridden: @code{make V=1} will produce verbose output,
- @code{make V=0} less verbose output.
- @end itemize
- @cindex default verbosity for silent rules
- Note that silent rules are @emph{disabled} by default; the user must
- enable them explicitly at either @command{configure} run time or at
- @command{make} run time. We think that this is a good policy, since
- it provides the casual user with enough information to prepare a good
- bug report in case anything breaks.
- Still, notwithstanding the rationales above, a developer who really
- wants to make silent rules enabled by default in his own package can
- do so by calling @code{AM_SILENT_RULES([yes])} in @file{configure.ac}.
- @c Keep in sync with silent-configsite.sh
- Users who prefer to have silent rules enabled by default can edit their
- @file{config.site} file to make the variable @code{enable_silent_rules}
- default to @samp{yes}. This should still allow disabling silent rules
- at @command{configure} time and at @command{make} time.
- @c FIXME: there's really a need to specify this explicitly?
- For portability to different @command{make} implementations, package authors
- are advised to not set the variable @code{V} inside the @file{Makefile.am}
- file, to allow the user to override the value for subdirectories as well.
- To work at its best, the current implementation of this feature normally
- uses nested variable expansion @samp{$(@var{var1}$(V))}, a @file{Makefile}
- feature that is not required by POSIX 2008 but is widely supported in
- practice. On the rare @command{make} implementations that do not support
- nested variable expansion, whether rules are silent is always determined at
- configure time, and cannot be overridden at make time. Future versions of
- POSIX are likely to require nested variable expansion, so this minor
- limitation should go away with time.
- @vindex @code{AM_V_GEN}
- @vindex @code{AM_V_at}
- @vindex @code{AM_DEFAULT_VERBOSITY}
- @vindex @code{AM_V}
- @vindex @code{AM_DEFAULT_V}
- To extend the silent mode to your own rules, you have few choices:
- @itemize @bullet
- @item
- You can use the predefined variable @code{AM_V_GEN} as a prefix to
- commands that should output a status line in silent mode, and
- @code{AM_V_at} as a prefix to commands that should not output anything
- in silent mode. When output is to be verbose, both of these variables
- will expand to the empty string.
- @item
- You can silence a recipe unconditionally with @code{@@}, and then use
- the predefined variable @code{AM_V_P} to know whether make is being run
- in silent or verbose mode, adjust the verbose information your recipe
- displays accordingly:
- @example
- generate-headers:
- @set -e; \
- ... [commands defining a shell variable '$headers'] ...; \
- if $(AM_V_P); then set -x; else echo " GEN [headers]"; fi; \
- rm -f $$headers && generate-header --flags $$headers
- @end example
- @item
- You can add your own variables, so strings of your own choice are shown.
- The following snippet shows how you would define your own equivalent of
- @code{AM_V_GEN}:
- @example
- pkg_verbose = $(pkg_verbose_@@AM_V@@)
- pkg_verbose_ = $(pkg_verbose_@@AM_DEFAULT_V@@)
- pkg_verbose_0 = @@echo PKG-GEN $@@;
- foo: foo.in
- $(pkg_verbose)cp $(srcdir)/foo.in $@@
- @end example
- @end itemize
- As a final note, observe that, even when silent rules are enabled,
- the @option{--no-print-directory} option is still required with GNU
- @command{make} if the ``@i{Entering/Leaving directory ...}'' messages
- are to be disabled.
- @node Gnits
- @chapter The effect of @option{--gnu} and @option{--gnits}
- @cindex @option{--gnu}, required files
- @cindex @option{--gnu}, complete description
- The @option{--gnu} option (or @option{gnu} in the
- @code{AUTOMAKE_OPTIONS} variable) causes @command{automake} to check
- the following:
- @itemize @bullet
- @item
- The files @file{INSTALL}, @file{NEWS}, @file{README}, @file{AUTHORS},
- and @file{ChangeLog}, plus one of @file{COPYING.LIB}, @file{COPYING.LESSER}
- or @file{COPYING}, are required at the topmost directory of the package.
- If the @option{--add-missing} option is given, @command{automake} will
- add a generic version of the @file{INSTALL} file as well as the
- @file{COPYING} file containing the text of the current version of the
- GNU General Public License existing at the time of this Automake release
- (version 3 as this is written, @uref{http://www.gnu.org/@/copyleft/@/gpl.html}).
- However, an existing @file{COPYING} file will never be overwritten by
- @command{automake}.
- @item
- The options @option{no-installman} and @option{no-installinfo} are
- prohibited.
- @end itemize
- Note that this option will be extended in the future to do even more
- checking; it is advisable to be familiar with the precise requirements
- of the GNU standards. Also, @option{--gnu} can require certain
- non-standard GNU programs to exist for use by various maintainer-only
- rules; for instance, in the future @command{pathchk} might be required for
- @samp{make dist}.
- @cindex @option{--gnits}, complete description
- The @option{--gnits} option does everything that @option{--gnu} does, and
- checks the following as well:
- @itemize @bullet
- @item
- @samp{make installcheck} will check to make sure that the @option{--help}
- and @option{--version} really print a usage message and a version string,
- respectively. This is the @option{std-options} option (@pxref{Options}).
- @item
- @samp{make dist} will check to make sure the @file{NEWS} file has been
- updated to the current version.
- @item
- @code{VERSION} is checked to make sure its format complies with Gnits
- standards.
- @c FIXME xref when standards are finished
- @item
- @cindex @file{README-alpha}
- If @code{VERSION} indicates that this is an alpha release, and the file
- @file{README-alpha} appears in the topmost directory of a package, then
- it is included in the distribution. This is done in @option{--gnits}
- mode, and no other, because this mode is the only one where version
- number formats are constrained, and hence the only mode where Automake
- can automatically determine whether @file{README-alpha} should be
- included.
- @item
- The file @file{THANKS} is required.
- @end itemize
- @node Not Enough
- @chapter When Automake Isn't Enough
- In some situations, where Automake is not up to one task, one has to
- resort to handwritten rules or even handwritten @file{Makefile}s.
- @menu
- * Extending:: Adding new rules or overriding existing ones.
- * Third-Party Makefiles:: Integrating Non-Automake @file{Makefile}s.
- @end menu
- @node Extending
- @section Extending Automake Rules
- With some minor exceptions (for example @code{_PROGRAMS} variables,
- @code{TESTS}, or @code{XFAIL_TESTS}) being rewritten to append
- @samp{$(EXEEXT)}), the contents of a @file{Makefile.am} is copied to
- @file{Makefile.in} verbatim.
- @cindex copying semantics
- These copying semantics mean that many problems can be worked around
- by simply adding some @command{make} variables and rules to
- @file{Makefile.am}. Automake will ignore these additions.
- @cindex conflicting definitions
- @cindex rules, conflicting
- @cindex variables, conflicting
- @cindex definitions, conflicts
- Since a @file{Makefile.in} is built from data gathered from three
- different places (@file{Makefile.am}, @file{configure.ac}, and
- @command{automake} itself), it is possible to have conflicting
- definitions of rules or variables. When building @file{Makefile.in}
- the following priorities are respected by @command{automake} to ensure
- the user always has the last word:
- @itemize
- @item
- User defined variables in @file{Makefile.am} have priority over
- variables @code{AC_SUBST}ed from @file{configure.ac}, and
- @code{AC_SUBST}ed variables have priority over
- @command{automake}-defined variables.
- @item
- As far as rules are concerned, a user-defined rule overrides any
- @command{automake}-defined rule for the same target.
- @end itemize
- @cindex overriding rules
- @cindex overriding semantics
- @cindex rules, overriding
- These overriding semantics make it possible to fine tune some default
- settings of Automake, or replace some of its rules. Overriding
- Automake rules is often inadvisable, particularly in the topmost
- directory of a package with subdirectories. The @option{-Woverride}
- option (@pxref{automake Invocation}) comes in handy to catch overridden
- definitions.
- Note that Automake does not make any distinction between rules with
- commands and rules that only specify dependencies. So it is not
- possible to append new dependencies to an @command{automake}-defined
- target without redefining the entire rule.
- @cindex @option{-local} targets
- @cindex local targets
- However, various useful targets have a @samp{-local} version you can
- specify in your @file{Makefile.am}. Automake will supplement the
- standard target with these user-supplied targets.
- @trindex all
- @trindex all-local
- @trindex info
- @trindex info-local
- @trindex dvi
- @trindex dvi-local
- @trindex ps
- @trindex ps-local
- @trindex pdf
- @trindex pdf-local
- @trindex html
- @trindex html-local
- @trindex check
- @trindex check-local
- @trindex install
- @trindex install-data
- @trindex install-data-local
- @trindex install-dvi
- @trindex install-dvi-local
- @trindex install-exec
- @trindex install-exec-local
- @trindex install-html
- @trindex install-html-local
- @trindex install-info
- @trindex install-info-local
- @trindex install-pdf
- @trindex install-pdf-local
- @trindex install-ps
- @trindex install-ps-local
- @trindex uninstall
- @trindex uninstall-local
- @trindex mostlyclean
- @trindex mostlyclean-local
- @trindex clean
- @trindex clean-local
- @trindex distclean
- @trindex distclean-local
- @trindex installdirs
- @trindex installdirs-local
- @trindex installcheck
- @trindex installcheck-local
- The targets that support a local version are @code{all}, @code{info},
- @code{dvi}, @code{ps}, @code{pdf}, @code{html}, @code{check},
- @code{install-data}, @code{install-dvi}, @code{install-exec},
- @code{install-html}, @code{install-info}, @code{install-pdf},
- @code{install-ps}, @code{uninstall}, @code{installdirs},
- @code{installcheck} and the various @code{clean} targets
- (@code{mostlyclean}, @code{clean}, @code{distclean}, and
- @code{maintainer-clean}).
- Note that there are no @code{uninstall-exec-local} or
- @code{uninstall-data-local} targets; just use @code{uninstall-local}.
- It doesn't make sense to uninstall just data or just executables.
- For instance, here is one way to erase a subdirectory during
- @samp{make clean} (@pxref{Clean}).
- @example
- clean-local:
- -rm -rf testSubDir
- @end example
- You may be tempted to use @code{install-data-local} to install a file
- to some hard-coded location, but you should avoid this
- (@pxref{Hard-Coded Install Paths}).
- With the @code{-local} targets, there is no particular guarantee of
- execution order; typically, they are run early, but with parallel
- make, there is no way to be sure of that.
- @cindex @option{-hook} targets
- @cindex hook targets
- @trindex install-data-hook
- @trindex install-exec-hook
- @trindex uninstall-hook
- @trindex dist-hook
- In contrast, some rules also have a way to run another rule, called a
- @dfn{hook}; hooks are always executed after the main rule's work is done.
- The hook is named after the principal target, with @samp{-hook} appended.
- The targets allowing hooks are @code{install-data},
- @code{install-exec}, @code{uninstall}, @code{dist}, and
- @code{distcheck}.
- For instance, here is how to create a hard link to an installed program:
- @example
- install-exec-hook:
- ln $(DESTDIR)$(bindir)/program$(EXEEXT) \
- $(DESTDIR)$(bindir)/proglink$(EXEEXT)
- @end example
- Although cheaper and more portable than symbolic links, hard links
- will not work everywhere (for instance, OS/2 does not have
- @command{ln}). Ideally you should fall back to @samp{cp -p} when
- @command{ln} does not work. An easy way, if symbolic links are
- acceptable to you, is to add @code{AC_PROG_LN_S} to
- @file{configure.ac} (@pxref{Particular Programs, , Particular Program
- Checks, autoconf, The Autoconf Manual}) and use @samp{$(LN_S)} in
- @file{Makefile.am}.
- @cindex versioned binaries, installing
- @cindex installing versioned binaries
- @cindex @code{LN_S} example
- For instance, here is how you could install a versioned copy of a
- program using @samp{$(LN_S)}:
- @c Keep in sync with insthook.sh
- @example
- install-exec-hook:
- cd $(DESTDIR)$(bindir) && \
- mv -f prog$(EXEEXT) prog-$(VERSION)$(EXEEXT) && \
- $(LN_S) prog-$(VERSION)$(EXEEXT) prog$(EXEEXT)
- @end example
- Note that we rename the program so that a new version will erase the
- symbolic link, not the real binary. Also we @command{cd} into the
- destination directory in order to create relative links.
- When writing @code{install-exec-hook} or @code{install-data-hook},
- please bear in mind that the exec/data distinction is based on the
- installation directory, not on the primary used (@pxref{The Two Parts of
- Install}).
- @c Keep in sync with primary-prefix-couples-documented-valid.sh
- So a @code{foo_SCRIPTS} will be installed by
- @code{install-data}, and a @code{barexec_SCRIPTS} will be installed by
- @code{install-exec}. You should define your hooks consequently.
- @c FIXME should include discussion of variables you can use in these
- @c rules
- @node Third-Party Makefiles
- @section Third-Party @file{Makefile}s
- @cindex Third-party packages, interfacing with
- @cindex Interfacing with third-party packages
- In most projects all @file{Makefile}s are generated by Automake. In
- some cases, however, projects need to embed subdirectories with
- handwritten @file{Makefile}s. For instance, one subdirectory could be
- a third-party project with its own build system, not using Automake.
- It is possible to list arbitrary directories in @code{SUBDIRS} or
- @code{DIST_SUBDIRS} provided each of these directories has a
- @file{Makefile} that recognizes all the following recursive targets.
- @cindex recursive targets and third-party @file{Makefile}s
- When a user runs one of these targets, that target is run recursively
- in all subdirectories. This is why it is important that even
- third-party @file{Makefile}s support them.
- @table @code
- @item all
- Compile the entire package. This is the default target in
- Automake-generated @file{Makefile}s, but it does not need to be the
- default in third-party @file{Makefile}s.
- @item distdir
- @trindex distdir
- @vindex distdir
- @vindex top_distdir
- Copy files to distribute into @samp{$(distdir)}, before a tarball is
- constructed. Of course this target is not required if the
- @option{no-dist} option (@pxref{Options}) is used.
- The variables @samp{$(top_distdir)} and @samp{$(distdir)}
- (@pxref{The dist Hook}) will be passed from the outer package to the subpackage
- when the @code{distdir} target is invoked. These two variables have
- been adjusted for the directory that is being recursed into, so they
- are ready to use.
- @item install
- @itemx install-data
- @itemx install-exec
- @itemx uninstall
- Install or uninstall files (@pxref{Install}).
- @item install-dvi
- @itemx install-html
- @itemx install-info
- @itemx install-ps
- @itemx install-pdf
- Install only some specific documentation format (@pxref{Texinfo}).
- @item installdirs
- Create install directories, but do not install any files.
- @item check
- @itemx installcheck
- Check the package (@pxref{Tests}).
- @item mostlyclean
- @itemx clean
- @itemx distclean
- @itemx maintainer-clean
- Cleaning rules (@pxref{Clean}).
- @item dvi
- @itemx pdf
- @itemx ps
- @itemx info
- @itemx html
- Build the documentation in various formats (@pxref{Texinfo}).
- @item tags
- @itemx ctags
- Build @file{TAGS} and @file{CTAGS} (@pxref{Tags}).
- @end table
- If you have ever used Gettext in a project, this is a good example of
- how third-party @file{Makefile}s can be used with Automake. The
- @file{Makefile}s @command{gettextize} puts in the @file{po/} and
- @file{intl/} directories are handwritten @file{Makefile}s that
- implement all of these targets. That way they can be added to
- @code{SUBDIRS} in Automake packages.
- Directories that are only listed in @code{DIST_SUBDIRS} but not in
- @code{SUBDIRS} need only the @code{distclean},
- @code{maintainer-clean}, and @code{distdir} rules (@pxref{Conditional
- Subdirectories}).
- Usually, many of these rules are irrelevant to the third-party
- subproject, but they are required for the whole package to work. It's
- OK to have a rule that does nothing, so if you are integrating a
- third-party project with no documentation or tag support, you could
- simply augment its @file{Makefile} as follows:
- @example
- EMPTY_AUTOMAKE_TARGETS = dvi pdf ps info html tags ctags
- .PHONY: $(EMPTY_AUTOMAKE_TARGETS)
- $(EMPTY_AUTOMAKE_TARGETS):
- @end example
- Another aspect of integrating third-party build systems is whether
- they support VPATH builds (@pxref{VPATH Builds}). Obviously if the
- subpackage does not support VPATH builds the whole package will not
- support VPATH builds. This in turns means that @samp{make distcheck}
- will not work, because it relies on VPATH builds. Some people can
- live without this (actually, many Automake users have never heard of
- @samp{make distcheck}). Other people may prefer to revamp the
- existing @file{Makefile}s to support VPATH@. Doing so does not
- necessarily require Automake, only Autoconf is needed (@pxref{Build
- Directories, , Build Directories, autoconf, The Autoconf Manual}).
- The necessary substitutions: @samp{@@srcdir@@}, @samp{@@top_srcdir@@},
- and @samp{@@top_builddir@@} are defined by @file{configure} when it
- processes a @file{Makefile} (@pxref{Preset Output Variables, , Preset
- Output Variables, autoconf, The Autoconf Manual}), they are not
- computed by the Makefile like the aforementioned @samp{$(distdir)} and
- @samp{$(top_distdir)} variables.
- It is sometimes inconvenient to modify a third-party @file{Makefile}
- to introduce the above required targets. For instance, one may want to
- keep the third-party sources untouched to ease upgrades to new
- versions.
- @cindex @file{GNUmakefile} including @file{Makefile}
- Here are two other ideas. If GNU make is assumed, one possibility is
- to add to that subdirectory a @file{GNUmakefile} that defines the
- required targets and includes the third-party @file{Makefile}. For
- this to work in VPATH builds, @file{GNUmakefile} must lie in the build
- directory; the easiest way to do this is to write a
- @file{GNUmakefile.in} instead, and have it processed with
- @code{AC_CONFIG_FILES} from the outer package. For example if we
- assume @file{Makefile} defines all targets except the documentation
- targets, and that the @code{check} target is actually called
- @code{test}, we could write @file{GNUmakefile} (or
- @file{GNUmakefile.in}) like this:
- @example
- # First, include the real Makefile
- include Makefile
- # Then, define the other targets needed by Automake Makefiles.
- .PHONY: dvi pdf ps info html check
- dvi pdf ps info html:
- check: test
- @end example
- @cindex Proxy @file{Makefile} for third-party packages
- A similar idea that does not use @code{include} is to write a proxy
- @file{Makefile} that dispatches rules to the real @file{Makefile},
- either with @samp{$(MAKE) -f Makefile.real $(AM_MAKEFLAGS) target} (if
- it's OK to rename the original @file{Makefile}) or with @samp{cd
- subdir && $(MAKE) $(AM_MAKEFLAGS) target} (if it's OK to store the
- subdirectory project one directory deeper). The good news is that
- this proxy @file{Makefile} can be generated with Automake. All we
- need are @option{-local} targets (@pxref{Extending}) that perform the
- dispatch. Of course the other Automake features are available, so you
- could decide to let Automake perform distribution or installation.
- Here is a possible @file{Makefile.am}:
- @example
- all-local:
- cd subdir && $(MAKE) $(AM_MAKEFLAGS) all
- check-local:
- cd subdir && $(MAKE) $(AM_MAKEFLAGS) test
- clean-local:
- cd subdir && $(MAKE) $(AM_MAKEFLAGS) clean
- # Assuming the package knows how to install itself
- install-data-local:
- cd subdir && $(MAKE) $(AM_MAKEFLAGS) install-data
- install-exec-local:
- cd subdir && $(MAKE) $(AM_MAKEFLAGS) install-exec
- uninstall-local:
- cd subdir && $(MAKE) $(AM_MAKEFLAGS) uninstall
- # Distribute files from here.
- EXTRA_DIST = subdir/Makefile subdir/program.c ...
- @end example
- Pushing this idea to the extreme, it is also possible to ignore the
- subproject build system and build everything from this proxy
- @file{Makefile.am}. This might sound very sensible if you need VPATH
- builds but the subproject does not support them.
- @node Distributing
- @chapter Distributing @file{Makefile.in}s
- Automake places no restrictions on the distribution of the resulting
- @file{Makefile.in}s. We still encourage software authors to
- distribute their work under terms like those of the GPL, but doing so
- is not required to use Automake.
- Some of the files that can be automatically installed via the
- @option{--add-missing} switch do fall under the GPL@. However, these also
- have a special exception allowing you to distribute them with your
- package, regardless of the licensing you choose.
- @node API Versioning
- @chapter Automake API Versioning
- New Automake releases usually include bug fixes and new features.
- Unfortunately they may also introduce new bugs and incompatibilities.
- This makes four reasons why a package may require a particular Automake
- version.
- Things get worse when maintaining a large tree of packages, each one
- requiring a different version of Automake. In the past, this meant that
- any developer (and sometimes users) had to install several versions of
- Automake in different places, and switch @samp{$PATH} appropriately for
- each package.
- Starting with version 1.6, Automake installs versioned binaries. This
- means you can install several versions of Automake in the same
- @samp{$prefix}, and can select an arbitrary Automake version by running
- @command{automake-1.6} or @command{automake-1.7} without juggling with
- @samp{$PATH}. Furthermore, @file{Makefile}'s generated by Automake 1.6
- will use @command{automake-1.6} explicitly in their rebuild rules.
- The number @samp{1.6} in @command{automake-1.6} is Automake's API version,
- not Automake's version. If a bug fix release is made, for instance
- Automake 1.6.1, the API version will remain 1.6. This means that a
- package that works with Automake 1.6 should also work with 1.6.1; after
- all, this is what people expect from bug fix releases.
- If your package relies on a feature or a bug fix introduced in
- a release, you can pass this version as an option to Automake to ensure
- older releases will not be used. For instance, use this in your
- @file{configure.ac}:
- @example
- AM_INIT_AUTOMAKE([1.6.1]) dnl Require Automake 1.6.1 or better.
- @end example
- @noindent
- or, in a particular @file{Makefile.am}:
- @example
- AUTOMAKE_OPTIONS = 1.6.1 # Require Automake 1.6.1 or better.
- @end example
- @noindent
- Automake will print an error message if its version is
- older than the requested version.
- @heading What is in the API
- Automake's programming interface is not easy to define. Basically it
- should include at least all @strong{documented} variables and targets
- that a @file{Makefile.am} author can use, any behavior associated with
- them (e.g., the places where @samp{-hook}'s are run), the command line
- interface of @command{automake} and @command{aclocal}, @dots{}
- @heading What is not in the API
- Every undocumented variable, target, or command line option, is not part
- of the API@. You should avoid using them, as they could change from one
- version to the other (even in bug fix releases, if this helps to fix a
- bug).
- If it turns out you need to use such an undocumented feature, contact
- @email{automake@@gnu.org} and try to get it documented and exercised by
- the test-suite.
- @node Upgrading
- @chapter Upgrading a Package to a Newer Automake Version
- Automake maintains three kind of files in a package.
- @itemize
- @item @file{aclocal.m4}
- @item @file{Makefile.in}s
- @item auxiliary tools like @file{install-sh} or @file{py-compile}
- @end itemize
- @file{aclocal.m4} is generated by @command{aclocal} and contains some
- Automake-supplied M4 macros. Auxiliary tools are installed by
- @samp{automake --add-missing} when needed. @file{Makefile.in}s are
- built from @file{Makefile.am} by @command{automake}, and rely on the
- definitions of the M4 macros put in @file{aclocal.m4} as well as the
- behavior of the auxiliary tools installed.
- Because all of these files are closely related, it is important to
- regenerate all of them when upgrading to a newer Automake release.
- The usual way to do that is
- @example
- aclocal # with any option needed (such a -I m4)
- autoconf
- automake --add-missing --force-missing
- @end example
- @noindent
- or more conveniently:
- @example
- autoreconf -vfi
- @end example
- The use of @option{--force-missing} ensures that auxiliary tools will be
- overridden by new versions (@pxref{automake Invocation}).
- It is important to regenerate all of these files each time Automake is
- upgraded, even between bug fixes releases. For instance, it is not
- unusual for a bug fix to involve changes to both the rules generated
- in @file{Makefile.in} and the supporting M4 macros copied to
- @file{aclocal.m4}.
- Presently @command{automake} is able to diagnose situations where
- @file{aclocal.m4} has been generated with another version of
- @command{aclocal}. However it never checks whether auxiliary scripts
- are up-to-date. In other words, @command{automake} will tell you when
- @command{aclocal} needs to be rerun, but it will never diagnose a
- missing @option{--force-missing}.
- Before upgrading to a new major release, it is a good idea to read the
- file @file{NEWS}. This file lists all changes between releases: new
- features, obsolete constructs, known incompatibilities, and
- workarounds.
- @node FAQ
- @chapter Frequently Asked Questions about Automake
- This chapter covers some questions that often come up on the mailing
- lists.
- @menu
- * CVS:: CVS and generated files
- * maintainer-mode:: missing and AM_MAINTAINER_MODE
- * Wildcards:: Why doesn't Automake support wildcards?
- * Limitations on File Names:: Limitations on source and installed file names
- * Errors with distclean:: Files left in build directory after distclean
- * Flag Variables Ordering:: CFLAGS vs.@: AM_CFLAGS vs.@: mumble_CFLAGS
- * Renamed Objects:: Why are object files sometimes renamed?
- * Per-Object Flags:: How to simulate per-object flags?
- * Multiple Outputs:: Writing rules for tools with many output files
- * Hard-Coded Install Paths:: Installing to hard-coded locations
- * Debugging Make Rules:: Strategies when things don't work as expected
- * Reporting Bugs:: Feedback on bugs and feature requests
- @end menu
- @node CVS
- @section CVS and generated files
- @subheading Background: distributed generated Files
- @cindex generated files, distributed
- @cindex rebuild rules
- Packages made with Autoconf and Automake ship with some generated
- files like @file{configure} or @file{Makefile.in}. These files were
- generated on the developer's machine and are distributed so that
- end-users do not have to install the maintainer tools required to
- rebuild them. Other generated files like Lex scanners, Yacc parsers,
- or Info documentation, are usually distributed on similar grounds.
- Automake output rules in @file{Makefile}s to rebuild these files. For
- instance, @command{make} will run @command{autoconf} to rebuild
- @file{configure} whenever @file{configure.ac} is changed. This makes
- development safer by ensuring a @file{configure} is never out-of-date
- with respect to @file{configure.ac}.
- As generated files shipped in packages are up-to-date, and because
- @command{tar} preserves times-tamps, these rebuild rules are not
- triggered when a user unpacks and builds a package.
- @subheading Background: CVS and Timestamps
- @cindex timestamps and CVS
- @cindex CVS and timestamps
- Unless you use CVS keywords (in which case files must be updated at
- commit time), CVS preserves timestamp during @samp{cvs commit} and
- @samp{cvs import -d} operations.
- When you check out a file using @samp{cvs checkout} its timestamp is
- set to that of the revision that is being checked out.
- However, during @command{cvs update}, files will have the date of the
- update, not the original timestamp of this revision. This is meant to
- make sure that @command{make} notices sources files have been updated.
- This timestamp shift is troublesome when both sources and generated
- files are kept under CVS@. Because CVS processes files in lexical
- order, @file{configure.ac} will appear newer than @file{configure}
- after a @command{cvs update} that updates both files, even if
- @file{configure} was newer than @file{configure.ac} when it was
- checked in. Calling @command{make} will then trigger a spurious rebuild
- of @file{configure}.
- @subheading Living with CVS in Autoconfiscated Projects
- @cindex CVS and generated files
- @cindex generated files and CVS
- There are basically two clans amongst maintainers: those who keep all
- distributed files under CVS, including generated files, and those who
- keep generated files @emph{out} of CVS.
- @subsubheading All Files in CVS
- @itemize @bullet
- @item
- The CVS repository contains all distributed files so you know exactly
- what is distributed, and you can checkout any prior version entirely.
- @item
- Maintainers can see how generated files evolve (for instance, you can
- see what happens to your @file{Makefile.in}s when you upgrade Automake
- and make sure they look OK).
- @item
- Users do not need the autotools to build a checkout of the project, it
- works just like a released tarball.
- @item
- If users use @command{cvs update} to update their copy, instead of
- @command{cvs checkout} to fetch a fresh one, timestamps will be
- inaccurate. Some rebuild rules will be triggered and attempt to
- run developer tools such as @command{autoconf} or @command{automake}.
- Calls to such tools are all wrapped into a call to the @command{missing}
- script discussed later (@pxref{maintainer-mode}), so that the user will
- see more descriptive warnings about missing or out-of-date tools, and
- possible suggestions about how to obtain them, rather than just some
- ``command not found'' error, or (worse) some obscure message from some
- older version of the required tool they happen to have installed.
- Maintainers interested in keeping their package buildable from a CVS
- checkout even for those users that lack maintainer-specific tools might
- want to provide an helper script (or to enhance their existing bootstrap
- script) to fix the timestamps after a
- @command{cvs update} or a @command{git checkout}, to prevent spurious
- rebuilds. In case of a project committing the Autotools-generated
- files, as well as the generated @file{.info} files, such script might
- look something like this:
- @smallexample
- #!/bin/sh
- # fix-timestamp.sh: prevents useless rebuilds after "cvs update"
- sleep 1
- # aclocal-generated aclocal.m4 depends on locally-installed
- # '.m4' macro files, as well as on 'configure.ac'
- touch aclocal.m4
- sleep 1
- # autoconf-generated configure depends on aclocal.m4 and on
- # configure.ac
- touch configure
- # so does autoheader-generated config.h.in
- touch config.h.in
- # and all the automake-generated Makefile.in files
- touch `find . -name Makefile.in -print`
- # finally, the makeinfo-generated '.info' files depend on the
- # corresponding '.texi' files
- touch doc/*.info
- @end smallexample
- @item
- In distributed development, developers are likely to have different
- version of the maintainer tools installed. In this case rebuilds
- triggered by timestamp lossage will lead to spurious changes
- to generated files. There are several solutions to this:
- @itemize
- @item
- All developers should use the same versions, so that the rebuilt files
- are identical to files in CVS@. (This starts to be difficult when each
- project you work on uses different versions.)
- @item
- Or people use a script to fix the timestamp after a checkout (the GCC
- folks have such a script).
- @item
- Or @file{configure.ac} uses @code{AM_MAINTAINER_MODE}, which will
- disable all of these rebuild rules by default. This is further discussed
- in @ref{maintainer-mode}.
- @end itemize
- @item
- Although we focused on spurious rebuilds, the converse can also
- happen. CVS's timestamp handling can also let you think an
- out-of-date file is up-to-date.
- For instance, suppose a developer has modified @file{Makefile.am} and
- has rebuilt @file{Makefile.in}, and then decides to do a last-minute
- change to @file{Makefile.am} right before checking in both files
- (without rebuilding @file{Makefile.in} to account for the change).
- This last change to @file{Makefile.am} makes the copy of
- @file{Makefile.in} out-of-date. Since CVS processes files
- alphabetically, when another developer @samp{cvs update}s his or her
- tree, @file{Makefile.in} will happen to be newer than
- @file{Makefile.am}. This other developer will not see that
- @file{Makefile.in} is out-of-date.
- @end itemize
- @subsubheading Generated Files out of CVS
- One way to get CVS and @command{make} working peacefully is to never
- store generated files in CVS, i.e., do not CVS-control files that
- are @file{Makefile} targets (also called @emph{derived} files).
- This way developers are not annoyed by changes to generated files. It
- does not matter if they all have different versions (assuming they are
- compatible, of course). And finally, timestamps are not lost, changes
- to sources files can't be missed as in the
- @file{Makefile.am}/@file{Makefile.in} example discussed earlier.
- The drawback is that the CVS repository is not an exact copy of what
- is distributed and that users now need to install various development
- tools (maybe even specific versions) before they can build a checkout.
- But, after all, CVS's job is versioning, not distribution.
- Allowing developers to use different versions of their tools can also
- hide bugs during distributed development. Indeed, developers will be
- using (hence testing) their own generated files, instead of the
- generated files that will be released actually. The developer who
- prepares the tarball might be using a version of the tool that
- produces bogus output (for instance a non-portable C file), something
- other developers could have noticed if they weren't using their own
- versions of this tool.
- @subheading Third-party Files
- @cindex CVS and third-party files
- @cindex third-party files and CVS
- Another class of files not discussed here (because they do not cause
- timestamp issues) are files that are shipped with a package, but
- maintained elsewhere. For instance, tools like @command{gettextize}
- and @command{autopoint} (from Gettext) or @command{libtoolize} (from
- Libtool), will install or update files in your package.
- These files, whether they are kept under CVS or not, raise similar
- concerns about version mismatch between developers' tools. The
- Gettext manual has a section about this, see @ref{CVS Issues, CVS
- Issues, Integrating with CVS, gettext, GNU gettext tools}.
- @node maintainer-mode
- @section @command{missing} and @code{AM_MAINTAINER_MODE}
- @subheading @command{missing}
- @cindex @command{missing}, purpose
- The @command{missing} script is a wrapper around several maintainer
- tools, designed to warn users if a maintainer tool is required but
- missing. Typical maintainer tools are @command{autoconf},
- @command{automake}, @command{bison}, etc. Because file generated by
- these tools are shipped with the other sources of a package, these
- tools shouldn't be required during a user build and they are not
- checked for in @file{configure}.
- However, if for some reason a rebuild rule is triggered and involves a
- missing tool, @command{missing} will notice it and warn the user, even
- suggesting how to obtain such a tool (at least in case it is a well-known
- one, like @command{makeinfo} or @command{bison}). This is more helpful
- and user-friendly than just having the rebuild rules spewing out a terse
- error message like @samp{sh: @var{tool}: command not found}. Similarly,
- @command{missing} will warn the user if it detects that a maintainer
- tool it attempted to use seems too old (be warned that diagnosing this
- correctly is typically more difficult that detecting missing tools, and
- requires cooperation from the tool itself, so it won't always work).
- If the required tool is installed, @command{missing} will run it and
- won't attempt to continue after failures. This is correct during
- development: developers love fixing failures. However, users with
- missing or too old maintainer tools may get an error when the rebuild
- rule is spuriously triggered, halting the build. This failure to let
- the build continue is one of the arguments of the
- @code{AM_MAINTAINER_MODE} advocates.
- @subheading @code{AM_MAINTAINER_MODE}
- @cindex @code{AM_MAINTAINER_MODE}, purpose
- @acindex AM_MAINTAINER_MODE
- @code{AM_MAINTAINER_MODE} allows you to choose whether the so called
- "rebuild rules" should be enabled or disabled. With
- @code{AM_MAINTAINER_MODE([enable])}, they are enabled by default,
- otherwise they are disabled by default. In the latter case, if
- you have @code{AM_MAINTAINER_MODE} in @file{configure.ac}, and run
- @samp{./configure && make}, then @command{make} will *never* attempt to
- rebuild @file{configure}, @file{Makefile.in}s, Lex or Yacc outputs, etc.
- I.e., this disables build rules for files that are usually distributed
- and that users should normally not have to update.
- The user can override the default setting by passing either
- @samp{--enable-maintainer-mode} or @samp{--disable-maintainer-mode}
- to @command{configure}.
- People use @code{AM_MAINTAINER_MODE} either because they do not want their
- users (or themselves) annoyed by timestamps lossage (@pxref{CVS}), or
- because they simply can't stand the rebuild rules and prefer running
- maintainer tools explicitly.
- @code{AM_MAINTAINER_MODE} also allows you to disable some custom build
- rules conditionally. Some developers use this feature to disable
- rules that need exotic tools that users may not have available.
- Several years ago Fran@,{c}ois Pinard pointed out several arguments
- against this @code{AM_MAINTAINER_MODE} macro. Most of them relate to
- insecurity. By removing dependencies you get non-dependable builds:
- changes to sources files can have no effect on generated files and this
- can be very confusing when unnoticed. He adds that security shouldn't
- be reserved to maintainers (what @option{--enable-maintainer-mode}
- suggests), on the contrary. If one user has to modify a
- @file{Makefile.am}, then either @file{Makefile.in} should be updated
- or a warning should be output (this is what Automake uses
- @command{missing} for) but the last thing you want is that nothing
- happens and the user doesn't notice it (this is what happens when
- rebuild rules are disabled by @code{AM_MAINTAINER_MODE}).
- Jim Meyering, the inventor of the @code{AM_MAINTAINER_MODE} macro was
- swayed by Fran@,{c}ois's arguments, and got rid of
- @code{AM_MAINTAINER_MODE} in all of his packages.
- Still many people continue to use @code{AM_MAINTAINER_MODE}, because
- it helps them working on projects where all files are kept under version
- control, and because @command{missing} isn't enough if you have the
- wrong version of the tools.
- @node Wildcards
- @section Why doesn't Automake support wildcards?
- @cindex wildcards
- Developers are lazy. They would often like to use wildcards in
- @file{Makefile.am}s, so that they would not need to remember to
- update @file{Makefile.am}s every time they add, delete, or rename
- a file.
- There are several objections to this:
- @itemize
- @item
- When using CVS (or similar) developers need to remember they have to
- run @samp{cvs add} or @samp{cvs rm} anyway. Updating
- @file{Makefile.am} accordingly quickly becomes a reflex.
- Conversely, if your application doesn't compile
- because you forgot to add a file in @file{Makefile.am}, it will help
- you remember to @samp{cvs add} it.
- @item
- Using wildcards makes it easy to distribute files by mistake. For
- instance, some code a developer is experimenting with (a test case,
- say) that should not be part of the distribution.
- @item
- Using wildcards it's easy to omit some files by mistake. For
- instance, one developer creates a new file, uses it in many places,
- but forgets to commit it. Another developer then checks out the
- incomplete project and is able to run @samp{make dist} successfully,
- even though a file is missing. By listing files, @samp{make dist}
- @emph{will} complain.
- @item
- Wildcards are not portable to some non-GNU @command{make} implementations,
- e.g., NetBSD @command{make} will not expand globs such as @samp{*} in
- prerequisites of a target.
- @item
- Finally, it's really hard to @emph{forget} to add a file to
- @file{Makefile.am}: files that are not listed in @file{Makefile.am} are
- not compiled or installed, so you can't even test them.
- @end itemize
- Still, these are philosophical objections, and as such you may disagree,
- or find enough value in wildcards to dismiss all of them. Before you
- start writing a patch against Automake to teach it about wildcards,
- let's see the main technical issue: portability.
- Although @samp{$(wildcard ...)} works with GNU @command{make}, it is
- not portable to other @command{make} implementations.
- The only way Automake could support @command{$(wildcard ...)} is by
- expanding @command{$(wildcard ...)} when @command{automake} is run.
- The resulting @file{Makefile.in}s would be portable since they would
- list all files and not use @samp{$(wildcard ...)}. However that
- means developers would need to remember to run @command{automake} each
- time they add, delete, or rename files.
- Compared to editing @file{Makefile.am}, this is a very small gain. Sure,
- it's easier and faster to type @samp{automake; make} than to type
- @samp{emacs Makefile.am; make}. But nobody bothered enough to write a
- patch to add support for this syntax. Some people use scripts to
- generate file lists in @file{Makefile.am} or in separate
- @file{Makefile} fragments.
- Even if you don't care about portability, and are tempted to use
- @samp{$(wildcard ...)} anyway because you target only GNU Make, you
- should know there are many places where Automake needs to know exactly
- which files should be processed. As Automake doesn't know how to
- expand @samp{$(wildcard ...)}, you cannot use it in these places.
- @samp{$(wildcard ...)} is a black box comparable to @code{AC_SUBST}ed
- variables as far Automake is concerned.
- You can get warnings about @samp{$(wildcard ...}) constructs using the
- @option{-Wportability} flag.
- @node Limitations on File Names
- @section Limitations on File Names
- @cindex file names, limitations on
- Automake attempts to support all kinds of file names, even those that
- contain unusual characters or are unusually long. However, some
- limitations are imposed by the underlying operating system and tools.
- Most operating systems prohibit the use of the null byte in file
- names, and reserve @samp{/} as a directory separator. Also, they
- require that file names are properly encoded for the user's locale.
- Automake is subject to these limits.
- Portable packages should limit themselves to POSIX file
- names. These can contain ASCII letters and digits,
- @samp{_}, @samp{.}, and @samp{-}. File names consist of components
- separated by @samp{/}. File name components cannot begin with
- @samp{-}.
- Portable POSIX file names cannot contain components that exceed a
- 14-byte limit, but nowadays it's normally safe to assume the
- more-generous XOPEN limit of 255 bytes. POSIX
- limits file names to 255 bytes (XOPEN allows 1023 bytes),
- but you may want to limit a source tarball to file names of 99 bytes
- to avoid interoperability problems with old versions of @command{tar}.
- If you depart from these rules (e.g., by using non-ASCII
- characters in file names, or by using lengthy file names), your
- installers may have problems for reasons unrelated to Automake.
- However, if this does not concern you, you should know about the
- limitations imposed by Automake itself. These limitations are
- undesirable, but some of them seem to be inherent to underlying tools
- like Autoconf, Make, M4, and the shell. They fall into three
- categories: install directories, build directories, and file names.
- The following characters:
- @example
- @r{newline} " # $ ' `
- @end example
- should not appear in the names of install directories. For example,
- the operand of @command{configure}'s @option{--prefix} option should
- not contain these characters.
- Build directories suffer the same limitations as install directories,
- and in addition should not contain the following characters:
- @example
- & @@ \
- @end example
- For example, the full name of the directory containing the source
- files should not contain these characters.
- Source and installation file names like @file{main.c} are limited even
- further: they should conform to the POSIX/XOPEN
- rules described above. In addition, if you plan to port to
- non-POSIX environments, you should avoid file names that
- differ only in case (e.g., @file{makefile} and @file{Makefile}).
- Nowadays it is no longer worth worrying about the 8.3 limits of
- DOS file systems.
- @c FIXME This should probably be moved in the "Checking the Distribution"
- @c FIXME section...
- @node Errors with distclean
- @section Errors with distclean
- @cindex @code{distclean}, diagnostic
- @cindex @samp{make distclean}, diagnostic
- @cindex dependencies and distributed files
- @trindex distclean
- This is a diagnostic you might encounter while running @samp{make
- distcheck}.
- As explained in @ref{Checking the Distribution}, @samp{make distcheck}
- attempts to build and check your package for errors like this one.
- @samp{make distcheck} will perform a @code{VPATH} build of your
- package (@pxref{VPATH Builds}), and then call @samp{make distclean}.
- Files left in the build directory after @samp{make distclean} has run
- are listed after this error.
- This diagnostic really covers two kinds of errors:
- @itemize @bullet
- @item
- files that are forgotten by distclean;
- @item
- distributed files that are erroneously rebuilt.
- @end itemize
- The former left-over files are not distributed, so the fix is to mark
- them for cleaning (@pxref{Clean}), this is obvious and doesn't deserve
- more explanations.
- The latter bug is not always easy to understand and fix, so let's
- proceed with an example. Suppose our package contains a program for
- which we want to build a man page using @command{help2man}. GNU
- @command{help2man} produces simple manual pages from the @option{--help}
- and @option{--version} output of other commands (@pxref{Top, , Overview,
- help2man, The Help2man Manual}). Because we don't want to force our
- users to install @command{help2man}, we decide to distribute the
- generated man page using the following setup.
- @example
- # This Makefile.am is bogus.
- bin_PROGRAMS = foo
- foo_SOURCES = foo.c
- dist_man_MANS = foo.1
- foo.1: foo$(EXEEXT)
- help2man --output=foo.1 ./foo$(EXEEXT)
- @end example
- This will effectively distribute the man page. However,
- @samp{make distcheck} will fail with:
- @example
- ERROR: files left in build directory after distclean:
- ./foo.1
- @end example
- Why was @file{foo.1} rebuilt? Because although distributed,
- @file{foo.1} depends on a non-distributed built file:
- @file{foo$(EXEEXT)}. @file{foo$(EXEEXT)} is built by the user, so it
- will always appear to be newer than the distributed @file{foo.1}.
- @samp{make distcheck} caught an inconsistency in our package. Our
- intent was to distribute @file{foo.1} so users do not need to install
- @command{help2man}, however since this rule causes this file to be
- always rebuilt, users @emph{do} need @command{help2man}. Either we
- should ensure that @file{foo.1} is not rebuilt by users, or there is
- no point in distributing @file{foo.1}.
- More generally, the rule is that distributed files should never depend
- on non-distributed built files. If you distribute something
- generated, distribute its sources.
- One way to fix the above example, while still distributing
- @file{foo.1} is to not depend on @file{foo$(EXEEXT)}. For instance,
- assuming @command{foo --version} and @command{foo --help} do not
- change unless @file{foo.c} or @file{configure.ac} change, we could
- write the following @file{Makefile.am}:
- @example
- bin_PROGRAMS = foo
- foo_SOURCES = foo.c
- dist_man_MANS = foo.1
- foo.1: foo.c $(top_srcdir)/configure.ac
- $(MAKE) $(AM_MAKEFLAGS) foo$(EXEEXT)
- help2man --output=foo.1 ./foo$(EXEEXT)
- @end example
- This way, @file{foo.1} will not get rebuilt every time
- @file{foo$(EXEEXT)} changes. The @command{make} call makes sure
- @file{foo$(EXEEXT)} is up-to-date before @command{help2man}. Another
- way to ensure this would be to use separate directories for binaries
- and man pages, and set @code{SUBDIRS} so that binaries are built
- before man pages.
- We could also decide not to distribute @file{foo.1}. In
- this case it's fine to have @file{foo.1} dependent upon
- @file{foo$(EXEEXT)}, since both will have to be rebuilt.
- However it would be impossible to build the package in a
- cross-compilation, because building @file{foo.1} involves
- an @emph{execution} of @file{foo$(EXEEXT)}.
- Another context where such errors are common is when distributed files
- are built by tools that are built by the package. The pattern is
- similar:
- @example
- distributed-file: built-tools distributed-sources
- build-command
- @end example
- @noindent
- should be changed to
- @example
- distributed-file: distributed-sources
- $(MAKE) $(AM_MAKEFLAGS) built-tools
- build-command
- @end example
- @noindent
- or you could choose not to distribute @file{distributed-file}, if
- cross-compilation does not matter.
- The points made through these examples are worth a summary:
- @cartouche
- @itemize
- @item
- Distributed files should never depend upon non-distributed built
- files.
- @item
- Distributed files should be distributed with all their dependencies.
- @item
- If a file is @emph{intended} to be rebuilt by users, then there is no point
- in distributing it.
- @end itemize
- @end cartouche
- @vrindex distcleancheck_listfiles
- For desperate cases, it's always possible to disable this check by
- setting @code{distcleancheck_listfiles} as documented in @ref{Checking
- the Distribution}.
- Make sure you do understand the reason why @samp{make distcheck}
- complains before you do this. @code{distcleancheck_listfiles} is a
- way to @emph{hide} errors, not to fix them. You can always do better.
- @node Flag Variables Ordering
- @section Flag Variables Ordering
- @cindex Ordering flag variables
- @cindex Flag variables, ordering
- @display
- What is the difference between @code{AM_CFLAGS}, @code{CFLAGS}, and
- @code{mumble_CFLAGS}?
- @end display
- @display
- Why does @command{automake} output @code{CPPFLAGS} after
- @code{AM_CPPFLAGS} on compile lines? Shouldn't it be the converse?
- @end display
- @display
- My @file{configure} adds some warning flags into @code{CXXFLAGS}. In
- one @file{Makefile.am} I would like to append a new flag, however if I
- put the flag into @code{AM_CXXFLAGS} it is prepended to the other
- flags, not appended.
- @end display
- @subheading Compile Flag Variables
- @cindex Flag Variables, Ordering
- @cindex Compile Flag Variables
- @cindex @code{AM_CCASFLAGS} and @code{CCASFLAGS}
- @cindex @code{AM_CFLAGS} and @code{CFLAGS}
- @cindex @code{AM_CPPFLAGS} and @code{CPPFLAGS}
- @cindex @code{AM_CXXFLAGS} and @code{CXXFLAGS}
- @cindex @code{AM_FCFLAGS} and @code{FCFLAGS}
- @cindex @code{AM_FFLAGS} and @code{FFLAGS}
- @cindex @code{AM_GCJFLAGS} and @code{GCJFLAGS}
- @cindex @code{AM_LDFLAGS} and @code{LDFLAGS}
- @cindex @code{AM_LFLAGS} and @code{LFLAGS}
- @cindex @code{AM_LIBTOOLFLAGS} and @code{LIBTOOLFLAGS}
- @cindex @code{AM_OBJCFLAGS} and @code{OBJCFLAGS}
- @cindex @code{AM_OBJCXXFLAGS} and @code{OBJXXCFLAGS}
- @cindex @code{AM_RFLAGS} and @code{RFLAGS}
- @cindex @code{AM_UPCFLAGS} and @code{UPCFLAGS}
- @cindex @code{AM_YFLAGS} and @code{YFLAGS}
- @cindex @code{CCASFLAGS} and @code{AM_CCASFLAGS}
- @cindex @code{CFLAGS} and @code{AM_CFLAGS}
- @cindex @code{CPPFLAGS} and @code{AM_CPPFLAGS}
- @cindex @code{CXXFLAGS} and @code{AM_CXXFLAGS}
- @cindex @code{FCFLAGS} and @code{AM_FCFLAGS}
- @cindex @code{FFLAGS} and @code{AM_FFLAGS}
- @cindex @code{GCJFLAGS} and @code{AM_GCJFLAGS}
- @cindex @code{LDFLAGS} and @code{AM_LDFLAGS}
- @cindex @code{LFLAGS} and @code{AM_LFLAGS}
- @cindex @code{LIBTOOLFLAGS} and @code{AM_LIBTOOLFLAGS}
- @cindex @code{OBJCFLAGS} and @code{AM_OBJCFLAGS}
- @cindex @code{OBJCXXFLAGS} and @code{AM_OBJCXXFLAGS}
- @cindex @code{RFLAGS} and @code{AM_RFLAGS}
- @cindex @code{UPCFLAGS} and @code{AM_UPCFLAGS}
- @cindex @code{YFLAGS} and @code{AM_YFLAGS}
- This section attempts to answer all the above questions. We will
- mostly discuss @code{CPPFLAGS} in our examples, but actually the
- answer holds for all the compile flags used in Automake:
- @code{CCASFLAGS}, @code{CFLAGS}, @code{CPPFLAGS}, @code{CXXFLAGS},
- @code{FCFLAGS}, @code{FFLAGS}, @code{GCJFLAGS}, @code{LDFLAGS},
- @code{LFLAGS}, @code{LIBTOOLFLAGS}, @code{OBJCFLAGS}, @code{OBJCXXFLAGS},
- @code{RFLAGS}, @code{UPCFLAGS}, and @code{YFLAGS}.
- @code{CPPFLAGS}, @code{AM_CPPFLAGS}, and @code{mumble_CPPFLAGS} are
- three variables that can be used to pass flags to the C preprocessor
- (actually these variables are also used for other languages like C++
- or preprocessed Fortran). @code{CPPFLAGS} is the user variable
- (@pxref{User Variables}), @code{AM_CPPFLAGS} is the Automake variable,
- and @code{mumble_CPPFLAGS} is the variable specific to the
- @code{mumble} target (we call this a per-target variable,
- @pxref{Program and Library Variables}).
- Automake always uses two of these variables when compiling C sources
- files. When compiling an object file for the @code{mumble} target,
- the first variable will be @code{mumble_CPPFLAGS} if it is defined, or
- @code{AM_CPPFLAGS} otherwise. The second variable is always
- @code{CPPFLAGS}.
- In the following example,
- @example
- bin_PROGRAMS = foo bar
- foo_SOURCES = xyz.c
- bar_SOURCES = main.c
- foo_CPPFLAGS = -DFOO
- AM_CPPFLAGS = -DBAZ
- @end example
- @noindent
- @file{xyz.o} will be compiled with @samp{$(foo_CPPFLAGS) $(CPPFLAGS)},
- (because @file{xyz.o} is part of the @code{foo} target), while
- @file{main.o} will be compiled with @samp{$(AM_CPPFLAGS) $(CPPFLAGS)}
- (because there is no per-target variable for target @code{bar}).
- The difference between @code{mumble_CPPFLAGS} and @code{AM_CPPFLAGS}
- being clear enough, let's focus on @code{CPPFLAGS}. @code{CPPFLAGS}
- is a user variable, i.e., a variable that users are entitled to modify
- in order to compile the package. This variable, like many others,
- is documented at the end of the output of @samp{configure --help}.
- For instance, someone who needs to add @file{/home/my/usr/include} to
- the C compiler's search path would configure a package with
- @example
- ./configure CPPFLAGS='-I /home/my/usr/include'
- @end example
- @noindent
- and this flag would be propagated to the compile rules of all
- @file{Makefile}s.
- It is also not uncommon to override a user variable at
- @command{make}-time. Many installers do this with @code{prefix}, but
- this can be useful with compiler flags too. For instance, if, while
- debugging a C++ project, you need to disable optimization in one
- specific object file, you can run something like
- @example
- rm file.o
- make CXXFLAGS=-O0 file.o
- make
- @end example
- The reason @samp{$(CPPFLAGS)} appears after @samp{$(AM_CPPFLAGS)} or
- @samp{$(mumble_CPPFLAGS)} in the compile command is that users
- should always have the last say. It probably makes more sense if you
- think about it while looking at the @samp{CXXFLAGS=-O0} above, which
- should supersede any other switch from @code{AM_CXXFLAGS} or
- @code{mumble_CXXFLAGS} (and this of course replaces the previous value
- of @code{CXXFLAGS}).
- You should never redefine a user variable such as @code{CPPFLAGS} in
- @file{Makefile.am}. Use @samp{automake -Woverride} to diagnose such
- mistakes. Even something like
- @example
- CPPFLAGS = -DDATADIR=\"$(datadir)\" @@CPPFLAGS@@
- @end example
- @noindent
- is erroneous. Although this preserves @file{configure}'s value of
- @code{CPPFLAGS}, the definition of @code{DATADIR} will disappear if a
- user attempts to override @code{CPPFLAGS} from the @command{make}
- command line.
- @example
- AM_CPPFLAGS = -DDATADIR=\"$(datadir)\"
- @end example
- @noindent
- is all that is needed here if no per-target flags are used.
- You should not add options to these user variables within
- @file{configure} either, for the same reason. Occasionally you need
- to modify these variables to perform a test, but you should reset
- their values afterwards. In contrast, it is OK to modify the
- @samp{AM_} variables within @file{configure} if you @code{AC_SUBST}
- them, but it is rather rare that you need to do this, unless you
- really want to change the default definitions of the @samp{AM_}
- variables in all @file{Makefile}s.
- What we recommend is that you define extra flags in separate
- variables. For instance, you may write an Autoconf macro that computes
- a set of warning options for the C compiler, and @code{AC_SUBST} them
- in @code{WARNINGCFLAGS}; you may also have an Autoconf macro that
- determines which compiler and which linker flags should be used to
- link with library @file{libfoo}, and @code{AC_SUBST} these in
- @code{LIBFOOCFLAGS} and @code{LIBFOOLDFLAGS}. Then, a
- @file{Makefile.am} could use these variables as follows:
- @example
- AM_CFLAGS = $(WARNINGCFLAGS)
- bin_PROGRAMS = prog1 prog2
- prog1_SOURCES = @dots{}
- prog2_SOURCES = @dots{}
- prog2_CFLAGS = $(LIBFOOCFLAGS) $(AM_CFLAGS)
- prog2_LDFLAGS = $(LIBFOOLDFLAGS)
- @end example
- In this example both programs will be compiled with the flags
- substituted into @samp{$(WARNINGCFLAGS)}, and @code{prog2} will
- additionally be compiled with the flags required to link with
- @file{libfoo}.
- Note that listing @code{AM_CFLAGS} in a per-target @code{CFLAGS}
- variable is a common idiom to ensure that @code{AM_CFLAGS} applies to
- every target in a @file{Makefile.in}.
- Using variables like this gives you full control over the ordering of
- the flags. For instance, if there is a flag in $(WARNINGCFLAGS) that
- you want to negate for a particular target, you can use something like
- @samp{prog1_CFLAGS = $(AM_CFLAGS) -no-flag}. If all of these flags had
- been forcefully appended to @code{CFLAGS}, there would be no way to
- disable one flag. Yet another reason to leave user variables to
- users.
- Finally, we have avoided naming the variable of the example
- @code{LIBFOO_LDFLAGS} (with an underscore) because that would cause
- Automake to think that this is actually a per-target variable (like
- @code{mumble_LDFLAGS}) for some non-declared @code{LIBFOO} target.
- @subheading Other Variables
- There are other variables in Automake that follow similar principles
- to allow user options. For instance, Texinfo rules (@pxref{Texinfo})
- use @code{MAKEINFOFLAGS} and @code{AM_MAKEINFOFLAGS}. Similarly,
- DejaGnu tests (@pxref{DejaGnu Tests}) use @code{RUNTESTDEFAULTFLAGS} and
- @code{AM_RUNTESTDEFAULTFLAGS}. The tags and ctags rules
- (@pxref{Tags}) use @code{ETAGSFLAGS}, @code{AM_ETAGSFLAGS},
- @code{CTAGSFLAGS}, and @code{AM_CTAGSFLAGS}. Java rules
- (@pxref{Java}) use @code{JAVACFLAGS} and @code{AM_JAVACFLAGS}. None
- of these rules support per-target flags (yet).
- To some extent, even @code{AM_MAKEFLAGS} (@pxref{Subdirectories})
- obeys this naming scheme. The slight difference is that
- @code{MAKEFLAGS} is passed to sub-@command{make}s implicitly by
- @command{make} itself.
- @code{ARFLAGS} (@pxref{A Library}) is usually defined by Automake and
- has neither @code{AM_} nor per-target cousin.
- Finally you should not think that the existence of a per-target
- variable implies the existence of an @code{AM_} variable or of a user
- variable. For instance, the @code{mumble_LDADD} per-target variable
- overrides the makefile-wide @code{LDADD} variable (which is not a user
- variable), and @code{mumble_LIBADD} exists only as a per-target
- variable. @xref{Program and Library Variables}.
- @node Renamed Objects
- @section Why are object files sometimes renamed?
- This happens when per-target compilation flags are used. Object
- files need to be renamed just in case they would clash with object
- files compiled from the same sources, but with different flags.
- Consider the following example.
- @example
- bin_PROGRAMS = true false
- true_SOURCES = generic.c
- true_CPPFLAGS = -DEXIT_CODE=0
- false_SOURCES = generic.c
- false_CPPFLAGS = -DEXIT_CODE=1
- @end example
- @noindent
- Obviously the two programs are built from the same source, but it
- would be bad if they shared the same object, because @file{generic.o}
- cannot be built with both @samp{-DEXIT_CODE=0} @emph{and}
- @samp{-DEXIT_CODE=1}. Therefore @command{automake} outputs rules to
- build two different objects: @file{true-generic.o} and
- @file{false-generic.o}.
- @command{automake} doesn't actually look whether source files are
- shared to decide if it must rename objects. It will just rename all
- objects of a target as soon as it sees per-target compilation flags
- used.
- It's OK to share object files when per-target compilation flags are not
- used. For instance, @file{true} and @file{false} will both use
- @file{version.o} in the following example.
- @example
- AM_CPPFLAGS = -DVERSION=1.0
- bin_PROGRAMS = true false
- true_SOURCES = true.c version.c
- false_SOURCES = false.c version.c
- @end example
- Note that the renaming of objects is also affected by the
- @code{_SHORTNAME} variable (@pxref{Program and Library Variables}).
- @node Per-Object Flags
- @section Per-Object Flags Emulation
- @cindex Per-object flags, emulated
- @display
- One of my source files needs to be compiled with different flags. How
- do I do?
- @end display
- Automake supports per-program and per-library compilation flags (see
- @ref{Program and Library Variables} and @ref{Flag Variables
- Ordering}). With this you can define compilation flags that apply to
- all files compiled for a target. For instance, in
- @example
- bin_PROGRAMS = foo
- foo_SOURCES = foo.c foo.h bar.c bar.h main.c
- foo_CFLAGS = -some -flags
- @end example
- @noindent
- @file{foo-foo.o}, @file{foo-bar.o}, and @file{foo-main.o} will all be
- compiled with @samp{-some -flags}. (If you wonder about the names of
- these object files, see @ref{Renamed Objects}.) Note that
- @code{foo_CFLAGS} gives the flags to use when compiling all the C
- sources of the @emph{program} @code{foo}, it has nothing to do with
- @file{foo.c} or @file{foo-foo.o} specifically.
- What if @file{foo.c} needs to be compiled into @file{foo.o} using some
- specific flags, that none of the other files requires? Obviously
- per-program flags are not directly applicable here. Something like
- per-object flags are expected, i.e., flags that would be used only
- when creating @file{foo-foo.o}. Automake does not support that,
- however this is easy to simulate using a library that contains only
- that object, and compiling this library with per-library flags.
- @example
- bin_PROGRAMS = foo
- foo_SOURCES = bar.c bar.h main.c
- foo_CFLAGS = -some -flags
- foo_LDADD = libfoo.a
- noinst_LIBRARIES = libfoo.a
- libfoo_a_SOURCES = foo.c foo.h
- libfoo_a_CFLAGS = -some -other -flags
- @end example
- Here @file{foo-bar.o} and @file{foo-main.o} will all be
- compiled with @samp{-some -flags}, while @file{libfoo_a-foo.o} will
- be compiled using @samp{-some -other -flags}. Eventually, all
- three objects will be linked to form @file{foo}.
- This trick can also be achieved using Libtool convenience libraries,
- for instance @samp{noinst_LTLIBRARIES = libfoo.la} (@pxref{Libtool
- Convenience Libraries}).
- Another tempting idea to implement per-object flags is to override the
- compile rules @command{automake} would output for these files.
- Automake will not define a rule for a target you have defined, so you
- could think about defining the @samp{foo-foo.o: foo.c} rule yourself.
- We recommend against this, because this is error prone. For instance,
- if you add such a rule to the first example, it will break the day you
- decide to remove @code{foo_CFLAGS} (because @file{foo.c} will then be
- compiled as @file{foo.o} instead of @file{foo-foo.o}, @pxref{Renamed
- Objects}). Also in order to support dependency tracking, the two
- @file{.o}/@file{.obj} extensions, and all the other flags variables
- involved in a compilation, you will end up modifying a copy of the
- rule previously output by @command{automake} for this file. If a new
- release of Automake generates a different rule, your copy will need to
- be updated by hand.
- @node Multiple Outputs
- @section Handling Tools that Produce Many Outputs
- @cindex multiple outputs, rules with
- @cindex many outputs, rules with
- @cindex rules with multiple outputs
- This section describes a @command{make} idiom that can be used when a
- tool produces multiple output files. It is not specific to Automake
- and can be used in ordinary @file{Makefile}s.
- Suppose we have a program called @command{foo} that will read one file
- called @file{data.foo} and produce two files named @file{data.c} and
- @file{data.h}. We want to write a @file{Makefile} rule that captures
- this one-to-two dependency.
- The naive rule is incorrect:
- @example
- # This is incorrect.
- data.c data.h: data.foo
- foo data.foo
- @end example
- @noindent
- What the above rule really says is that @file{data.c} and
- @file{data.h} each depend on @file{data.foo}, and can each be built by
- running @samp{foo data.foo}. In other words it is equivalent to:
- @example
- # We do not want this.
- data.c: data.foo
- foo data.foo
- data.h: data.foo
- foo data.foo
- @end example
- @noindent
- which means that @command{foo} can be run twice. Usually it will not
- be run twice, because @command{make} implementations are smart enough
- to check for the existence of the second file after the first one has
- been built; they will therefore detect that it already exists.
- However there are a few situations where it can run twice anyway:
- @itemize
- @item
- The most worrying case is when running a parallel @command{make}. If
- @file{data.c} and @file{data.h} are built in parallel, two @samp{foo
- data.foo} commands will run concurrently. This is harmful.
- @item
- Another case is when the dependency (here @file{data.foo}) is
- (or depends upon) a phony target.
- @end itemize
- A solution that works with parallel @command{make} but not with
- phony dependencies is the following:
- @example
- data.c data.h: data.foo
- foo data.foo
- data.h: data.c
- @end example
- @noindent
- The above rules are equivalent to
- @example
- data.c: data.foo
- foo data.foo
- data.h: data.foo data.c
- foo data.foo
- @end example
- @noindent
- therefore a parallel @command{make} will have to serialize the builds
- of @file{data.c} and @file{data.h}, and will detect that the second is
- no longer needed once the first is over.
- Using this pattern is probably enough for most cases. However it does
- not scale easily to more output files (in this scheme all output files
- must be totally ordered by the dependency relation), so we will
- explore a more complicated solution.
- Another idea is to write the following:
- @example
- # There is still a problem with this one.
- data.c: data.foo
- foo data.foo
- data.h: data.c
- @end example
- @noindent
- The idea is that @samp{foo data.foo} is run only when @file{data.c}
- needs to be updated, but we further state that @file{data.h} depends
- upon @file{data.c}. That way, if @file{data.h} is required and
- @file{data.foo} is out of date, the dependency on @file{data.c} will
- trigger the build.
- This is almost perfect, but suppose we have built @file{data.h} and
- @file{data.c}, and then we erase @file{data.h}. Then, running
- @samp{make data.h} will not rebuild @file{data.h}. The above rules
- just state that @file{data.c} must be up-to-date with respect to
- @file{data.foo}, and this is already the case.
- What we need is a rule that forces a rebuild when @file{data.h} is
- missing. Here it is:
- @example
- data.c: data.foo
- foo data.foo
- data.h: data.c
- ## Recover from the removal of $@@
- @@if test -f $@@; then :; else \
- rm -f data.c; \
- $(MAKE) $(AM_MAKEFLAGS) data.c; \
- fi
- @end example
- The above scheme can be extended to handle more outputs and more
- inputs. One of the outputs is selected to serve as a witness to the
- successful completion of the command, it depends upon all inputs, and
- all other outputs depend upon it. For instance, if @command{foo}
- should additionally read @file{data.bar} and also produce
- @file{data.w} and @file{data.x}, we would write:
- @example
- data.c: data.foo data.bar
- foo data.foo data.bar
- data.h data.w data.x: data.c
- ## Recover from the removal of $@@
- @@if test -f $@@; then :; else \
- rm -f data.c; \
- $(MAKE) $(AM_MAKEFLAGS) data.c; \
- fi
- @end example
- However there are now three minor problems in this setup. One is related
- to the timestamp ordering of @file{data.h}, @file{data.w},
- @file{data.x}, and @file{data.c}. Another one is a race condition
- if a parallel @command{make} attempts to run multiple instances of the
- recover block at once. Finally, the recursive rule breaks @samp{make -n}
- when run with GNU @command{make} (as well as some other @command{make}
- implementations), as it may remove @file{data.h} even when it should not
- (@pxref{MAKE Variable, , How the @code{MAKE} Variable Works, make,
- The GNU Make Manual}).
- Let us deal with the first problem. @command{foo} outputs four files,
- but we do not know in which order these files are created. Suppose
- that @file{data.h} is created before @file{data.c}. Then we have a
- weird situation. The next time @command{make} is run, @file{data.h}
- will appear older than @file{data.c}, the second rule will be
- triggered, a shell will be started to execute the @samp{if@dots{}fi}
- command, but actually it will just execute the @code{then} branch,
- that is: nothing. In other words, because the witness we selected is
- not the first file created by @command{foo}, @command{make} will start
- a shell to do nothing each time it is run.
- A simple riposte is to fix the timestamps when this happens.
- @example
- data.c: data.foo data.bar
- foo data.foo data.bar
- data.h data.w data.x: data.c
- @@if test -f $@@; then \
- touch $@@; \
- else \
- ## Recover from the removal of $@@
- rm -f data.c; \
- $(MAKE) $(AM_MAKEFLAGS) data.c; \
- fi
- @end example
- Another solution is to use a different and dedicated file as witness,
- rather than using any of @command{foo}'s outputs.
- @example
- data.stamp: data.foo data.bar
- @@rm -f data.tmp
- @@touch data.tmp
- foo data.foo data.bar
- @@mv -f data.tmp $@@
- data.c data.h data.w data.x: data.stamp
- ## Recover from the removal of $@@
- @@if test -f $@@; then :; else \
- rm -f data.stamp; \
- $(MAKE) $(AM_MAKEFLAGS) data.stamp; \
- fi
- @end example
- @file{data.tmp} is created before @command{foo} is run, so it has a
- timestamp older than output files output by @command{foo}. It is then
- renamed to @file{data.stamp} after @command{foo} has run, because we
- do not want to update @file{data.stamp} if @command{foo} fails.
- This solution still suffers from the second problem: the race
- condition in the recover rule. If, after a successful build, a user
- erases @file{data.c} and @file{data.h}, and runs @samp{make -j}, then
- @command{make} may start both recover rules in parallel. If the two
- instances of the rule execute @samp{$(MAKE) $(AM_MAKEFLAGS)
- data.stamp} concurrently the build is likely to fail (for instance, the
- two rules will create @file{data.tmp}, but only one can rename it).
- Admittedly, such a weird situation does not arise during ordinary
- builds. It occurs only when the build tree is mutilated. Here
- @file{data.c} and @file{data.h} have been explicitly removed without
- also removing @file{data.stamp} and the other output files.
- @code{make clean; make} will always recover from these situations even
- with parallel makes, so you may decide that the recover rule is solely
- to help non-parallel make users and leave things as-is. Fixing this
- requires some locking mechanism to ensure only one instance of the
- recover rule rebuilds @file{data.stamp}. One could imagine something
- along the following lines.
- @example
- data.c data.h data.w data.x: data.stamp
- ## Recover from the removal of $@@
- @@if test -f $@@; then :; else \
- trap 'rm -rf data.lock data.stamp' 1 2 13 15; \
- ## mkdir is a portable test-and-set
- if mkdir data.lock 2>/dev/null; then \
- ## This code is being executed by the first process.
- rm -f data.stamp; \
- $(MAKE) $(AM_MAKEFLAGS) data.stamp; \
- result=$$?; rm -rf data.lock; exit $$result; \
- else \
- ## This code is being executed by the follower processes.
- ## Wait until the first process is done.
- while test -d data.lock; do sleep 1; done; \
- ## Succeed if and only if the first process succeeded.
- test -f data.stamp; \
- fi; \
- fi
- @end example
- Using a dedicated witness, like @file{data.stamp}, is very handy when
- the list of output files is not known beforehand. As an illustration,
- consider the following rules to compile many @file{*.el} files into
- @file{*.elc} files in a single command. It does not matter how
- @code{ELFILES} is defined (as long as it is not empty: empty targets
- are not accepted by POSIX).
- @example
- ELFILES = one.el two.el three.el @dots{}
- ELCFILES = $(ELFILES:=c)
- elc-stamp: $(ELFILES)
- @@rm -f elc-temp
- @@touch elc-temp
- $(elisp_comp) $(ELFILES)
- @@mv -f elc-temp $@@
- $(ELCFILES): elc-stamp
- @@if test -f $@@; then :; else \
- ## Recover from the removal of $@@
- trap 'rm -rf elc-lock elc-stamp' 1 2 13 15; \
- if mkdir elc-lock 2>/dev/null; then \
- ## This code is being executed by the first process.
- rm -f elc-stamp; \
- $(MAKE) $(AM_MAKEFLAGS) elc-stamp; \
- rmdir elc-lock; \
- else \
- ## This code is being executed by the follower processes.
- ## Wait until the first process is done.
- while test -d elc-lock; do sleep 1; done; \
- ## Succeed if and only if the first process succeeded.
- test -f elc-stamp; exit $$?; \
- @c $$
- fi; \
- fi
- @end example
- These solutions all still suffer from the third problem, namely that
- they break the promise that @samp{make -n} should not cause any actual
- changes to the tree. For those solutions that do not create lock files,
- it is possible to split the recover rules into two separate recipe
- commands, one of which does all work but the recursion, and the
- other invokes the recursive @samp{$(MAKE)}. The solutions involving
- locking could act upon the contents of the @samp{MAKEFLAGS} variable,
- but parsing that portably is not easy (@pxref{The Make Macro MAKEFLAGS,,,
- autoconf, The Autoconf Manual}). Here is an example:
- @example
- ELFILES = one.el two.el three.el @dots{}
- ELCFILES = $(ELFILES:=c)
- elc-stamp: $(ELFILES)
- @@rm -f elc-temp
- @@touch elc-temp
- $(elisp_comp) $(ELFILES)
- @@mv -f elc-temp $@@
- $(ELCFILES): elc-stamp
- ## Recover from the removal of $@@
- @@dry=; for f in x $$MAKEFLAGS; do \
- case $$f in \
- *=*|--*);; \
- *n*) dry=:;; \
- esac; \
- done; \
- if test -f $@@; then :; else \
- $$dry trap 'rm -rf elc-lock elc-stamp' 1 2 13 15; \
- if $$dry mkdir elc-lock 2>/dev/null; then \
- ## This code is being executed by the first process.
- $$dry rm -f elc-stamp; \
- $(MAKE) $(AM_MAKEFLAGS) elc-stamp; \
- $$dry rmdir elc-lock; \
- else \
- ## This code is being executed by the follower processes.
- ## Wait until the first process is done.
- while test -d elc-lock && test -z "$$dry"; do \
- @c $$
- sleep 1; \
- done; \
- ## Succeed if and only if the first process succeeded.
- $$dry test -f elc-stamp; exit $$?; \
- fi; \
- fi
- @end example
- For completeness it should be noted that GNU @command{make} is able to
- express rules with multiple output files using pattern rules
- (@pxref{Pattern Examples, , Pattern Rule Examples, make, The GNU Make
- Manual}). We do not discuss pattern rules here because they are not
- portable, but they can be convenient in packages that assume GNU
- @command{make}.
- @node Hard-Coded Install Paths
- @section Installing to Hard-Coded Locations
- @display
- My package needs to install some configuration file. I tried to use
- the following rule, but @samp{make distcheck} fails. Why?
- @example
- # Do not do this.
- install-data-local:
- $(INSTALL_DATA) $(srcdir)/afile $(DESTDIR)/etc/afile
- @end example
- @end display
- @display
- My package needs to populate the installation directory of another
- package at install-time. I can easily compute that installation
- directory in @file{configure}, but if I install files therein,
- @samp{make distcheck} fails. How else should I do?
- @end display
- These two setups share their symptoms: @samp{make distcheck} fails
- because they are installing files to hard-coded paths. In the later
- case the path is not really hard-coded in the package, but we can
- consider it to be hard-coded in the system (or in whichever tool that
- supplies the path). As long as the path does not use any of the
- standard directory variables (@samp{$(prefix)}, @samp{$(bindir)},
- @samp{$(datadir)}, etc.), the effect will be the same:
- user-installations are impossible.
- As a (non-root) user who wants to install a package, you usually have no
- right to install anything in @file{/usr} or @file{/usr/local}. So you
- do something like @samp{./configure --prefix ~/usr} to install a
- package in your own @file{~/usr} tree.
- If a package attempts to install something to some hard-coded path
- (e.g., @file{/etc/afile}), regardless of this @option{--prefix} setting,
- then the installation will fail. @samp{make distcheck} performs such
- a @option{--prefix} installation, hence it will fail too.
- Now, there are some easy solutions.
- The above @code{install-data-local} example for installing
- @file{/etc/afile} would be better replaced by
- @example
- sysconf_DATA = afile
- @end example
- @noindent
- by default @code{sysconfdir} will be @samp{$(prefix)/etc}, because
- this is what the GNU Standards require. When such a package is
- installed on an FHS compliant system, the installer will have to set
- @samp{--sysconfdir=/etc}. As the maintainer of the package you
- should not be concerned by such site policies: use the appropriate
- standard directory variable to install your files so that the installer
- can easily redefine these variables to match their site conventions.
- Installing files that should be used by another package is slightly
- more involved. Let's take an example and assume you want to install
- a shared library that is a Python extension module. If you ask Python
- where to install the library, it will answer something like this:
- @example
- % @kbd{python -c 'from distutils import sysconfig;
- print sysconfig.get_python_lib(1,0)'}
- /usr/lib/python2.5/site-packages
- @end example
- If you indeed use this absolute path to install your shared library,
- non-root users will not be able to install the package, hence
- distcheck fails.
- Let's do better. The @samp{sysconfig.get_python_lib()} function
- actually accepts a third argument that will replace Python's
- installation prefix.
- @example
- % @kbd{python -c 'from distutils import sysconfig;
- print sysconfig.get_python_lib(1,0,"$@{exec_prefix@}")'}
- $@{exec_prefix@}/lib/python2.5/site-packages
- @end example
- You can also use this new path. If you do
- @itemize @bullet
- @item
- root users can install your package with the same @option{--prefix}
- as Python (you get the behavior of the previous attempt)
- @item
- non-root users can install your package too, they will have the
- extension module in a place that is not searched by Python but they
- can work around this using environment variables (and if you installed
- scripts that use this shared library, it's easy to tell Python were to
- look in the beginning of your script, so the script works in both
- cases).
- @end itemize
- The @code{AM_PATH_PYTHON} macro uses similar commands to define
- @samp{$(pythondir)} and @samp{$(pyexecdir)} (@pxref{Python}).
- Of course not all tools are as advanced as Python regarding that
- substitution of @var{prefix}. So another strategy is to figure the
- part of the installation directory that must be preserved. For
- instance, here is how @code{AM_PATH_LISPDIR} (@pxref{Emacs Lisp})
- computes @samp{$(lispdir)}:
- @example
- $EMACS -batch -Q -eval '(while load-path
- (princ (concat (car load-path) "\n"))
- (setq load-path (cdr load-path)))' >conftest.out
- lispdir=`sed -n
- -e 's,/$,,'
- -e '/.*\/lib\/x*emacs\/site-lisp$/@{
- s,.*/lib/\(x*emacs/site-lisp\)$,$@{libdir@}/\1,;p;q;
- @}'
- -e '/.*\/share\/x*emacs\/site-lisp$/@{
- s,.*/share/\(x*emacs/site-lisp\),$@{datarootdir@}/\1,;p;q;
- @}'
- conftest.out`
- @end example
- I.e., it just picks the first directory that looks like
- @file{*/lib/*emacs/site-lisp} or @file{*/share/*emacs/site-lisp} in
- the search path of emacs, and then substitutes @samp{$@{libdir@}} or
- @samp{$@{datadir@}} appropriately.
- The emacs case looks complicated because it processes a list and
- expects two possible layouts, otherwise it's easy, and the benefits for
- non-root users are really worth the extra @command{sed} invocation.
- @node Debugging Make Rules
- @section Debugging Make Rules
- @cindex debugging rules
- @cindex rules, debugging
- The rules and dependency trees generated by @command{automake} can get
- rather complex, and leave the developer head-scratching when things
- don't work as expected. Besides the debug options provided by the
- @command{make} command (@pxref{Options Summary,,, make, The GNU Make
- Manual}), here's a couple of further hints for debugging makefiles
- generated by @command{automake} effectively:
- @itemize
- @item
- If less verbose output has been enabled in the package with the use
- of silent rules (@pxref{Automake Silent Rules}), you can use
- @code{make V=1} to see the commands being executed.
- @item
- @code{make -n} can help show what would be done without actually doing
- it. Note however, that this will @emph{still execute} commands prefixed
- with @samp{+}, and, when using GNU @command{make}, commands that contain
- the strings @samp{$(MAKE)} or @samp{$@{MAKE@}} (@pxref{Instead of
- Execution,,, make, The GNU Make Manual}).
- Typically, this is helpful to show what recursive rules would do, but it
- means that, in your own rules, you should not mix such recursion with
- actions that change any files.@footnote{Automake's @samp{dist} and
- @samp{distcheck} rules had a bug in this regard in that they created
- directories even with @option{-n}, but this has been fixed in Automake
- 1.11.} Furthermore, note that GNU @command{make} will update
- prerequisites for the @file{Makefile} file itself even with @option{-n}
- (@pxref{Remaking Makefiles,,, make, The GNU Make Manual}).
- @item
- @code{make SHELL="/bin/bash -vx"} can help debug complex rules.
- @xref{The Make Macro SHELL,,, autoconf, The Autoconf Manual}, for some
- portability quirks associated with this construct.
- @item
- @code{echo 'print: ; @@echo "$(VAR)"' | make -f Makefile -f - print}
- can be handy to examine the expanded value of variables. You may need
- to use a target other than @samp{print} if that is already used or a
- file with that name exists.
- @item
- @url{http://bashdb.sourceforge.net/@/remake/} provides a modified
- GNU @command{make} command called @command{remake} that copes with
- complex GNU @command{make}-specific Makefiles and allows to trace
- execution, examine variables, and call rules interactively, much like
- a debugger.
- @end itemize
- @node Reporting Bugs
- @section Reporting Bugs
- Most nontrivial software has bugs. Automake is no exception. Although
- we cannot promise we can or will fix a bug, and we might not even agree
- that it is a bug, we want to hear about problems you encounter. Often we
- agree they are bugs and want to fix them.
- To make it possible for us to fix a bug, please report it. In order to
- do so effectively, it helps to know when and how to do it.
- Before reporting a bug, it is a good idea to see if it is already known.
- You can look at the @uref{http://debbugs.gnu.org/, GNU Bug Tracker}
- and the @uref{http://lists.gnu.org/@/archive/@/html/@/bug-automake/,
- bug-automake mailing list archives} for previous bug reports. We
- previously used a
- @uref{http://sourceware.org/@/cgi-bin/@/gnatsweb.pl?database=automake,
- Gnats database} for bug tracking, so some bugs might have been reported
- there already. Please do not use it for new bug reports, however.
- If the bug is not already known, it should be reported. It is very
- important to report bugs in a way that is useful and efficient. For
- this, please familiarize yourself with
- @uref{http://www.chiark.greenend.org.uk/@/~sgtatham/@/bugs.html, How to
- Report Bugs Effectively} and
- @uref{http://catb.org/@/~esr/@/faqs/@/smart-questions.html, How to Ask
- Questions the Smart Way}. This helps you and developers to save time
- which can then be spent on fixing more bugs and implementing more
- features.
- For a bug report, a feature request or other suggestions, please send
- email to @email{@value{PACKAGE_BUGREPORT}}. This will then open a new
- bug in the @uref{http://debbugs.gnu.org/@/automake, bug tracker}. Be
- sure to include the versions of Autoconf and Automake that you use.
- Ideally, post a minimal @file{Makefile.am} and @file{configure.ac} that
- reproduces the problem you encounter. If you have encountered test
- suite failures, please attach the @file{test-suite.log} file.
- @c ========================================================== Appendices
- @page
- @node Copying This Manual
- @appendix Copying This Manual
- @menu
- * GNU Free Documentation License:: License for copying this manual
- @end menu
- @node GNU Free Documentation License
- @appendixsec GNU Free Documentation License
- @include fdl.texi
- @page
- @node Indices
- @appendix Indices
- @menu
- * Macro Index:: Index of Autoconf macros
- * Variable Index:: Index of Makefile variables
- * General Index:: General index
- @end menu
- @node Macro Index
- @appendixsec Macro Index
- @printindex fn
- @node Variable Index
- @appendixsec Variable Index
- @printindex vr
- @node General Index
- @appendixsec General Index
- @printindex cp
- @bye
- @c LocalWords: texinfo setfilename settitle setchapternewpage texi direntry
- @c LocalWords: dircategory in's aclocal ifinfo titlepage Tromey vskip pt sp
- @c LocalWords: filll defcodeindex ov cv op tr syncodeindex fn cp vr ifnottex
- @c LocalWords: dir Automake's ac Dist Gnits gnits dfn Autoconf's pxref
- @c LocalWords: cindex Autoconf autoconf perl samp cvs dist trindex SUBST foo
- @c LocalWords: xs emph FIXME ref vindex pkglibdir pkgincludedir pkgdatadir mt
- @c LocalWords: pkg libdir cpio bindir sbindir rmt pax sbin zar zardir acindex
- @c LocalWords: HTML htmldir html noinst TEXINFOS nodist nobase strudel CFLAGS
- @c LocalWords: libmumble CC YFLAGS itemx de fication config url comp
- @c LocalWords: depcomp elisp sh mdate mkinstalldirs mkdir py tex dvi ps pdf
- @c LocalWords: ylwrap zardoz INIT gettext acinclude mv FUNCS LIBOBJS LDADD fr
- @c LocalWords: uref featureful dnl src LINGUAS es ko nl pl sl sv PROG ISC doc
- @c LocalWords: POSIX STDC fcntl FUNC ALLOCA blksize struct stat intl po chmod
- @c LocalWords: ChangeLog SUBDIRS gettextize gpl testdata getopt INTLLIBS cpp
- @c LocalWords: localedir datadir DLOCALEDIR DEXIT CPPFLAGS autoreconf opindex
- @c LocalWords: AUX var symlink deps Wno Wnone package's aclocal's distclean
- @c LocalWords: ltmain xref LIBSOURCE LIBSOURCES LIBOBJ MEMCMP vs RANLIB CXX
- @c LocalWords: LDFLAGS LIBTOOL libtool XTRA LIBS gettext's acdir APIVERSION
- @c LocalWords: dirlist noindent usr TIOCGWINSZ sc
- @c LocalWords: GWINSZ termios SRCDIR tarball bzip LISPDIR lispdir XEmacs CCAS
- @c LocalWords: emacsen MicroEmacs CCASFLAGS UX GCJ gcj GCJFLAGS posix DMALLOC
- @c LocalWords: dmalloc ldmalloc REGEX regex DEPDIR DEP DEFUN aclocaldir fi
- @c LocalWords: mymacro myothermacro AMFLAGS autopoint autogen libtoolize yum
- @c LocalWords: autoheader README MAKEFLAGS subdir Inetutils sync COND endif
- @c LocalWords: Miller's installable includedir inc pkgdata EXEEXT libexec bsd
- @c LocalWords: pkglib libexecdir prog libcpio cpio's dlopen dlpreopen linux
- @c LocalWords: subsubsection OBJEXT esac lib LTLIBRARIES liblob LIBADD AR ar
- @c LocalWords: ARFLAGS cru ing maude libgettext lo LTLIBOBJS rpath SGI PRE yy
- @c LocalWords: libmaude CCLD CXXFLAGS FFLAGS LFLAGS OBJCFLAGS RFLAGS DEFS cc
- @c LocalWords: OBJCXXFLAGS
- @c LocalWords: SHORTNAME vtable srcdir nostdinc basename yxx cxx ll lxx gdb
- @c LocalWords: lexers yymaxdepth maxdepth yyparse yylex yyerror yylval lval
- @c LocalWords: yychar yydebug yypact yyr yydef def yychk chk yypgo pgo yyact
- @c LocalWords: yyexca exca yyerrflag errflag yynerrs nerrs yyps yypv pv yys
- @c LocalWords: yystate yytmp tmp yyv yyval val yylloc lloc yyreds yytoks toks
- @c LocalWords: yylhs yylen yydefred yydgoto yysindex yyrindex yygindex yyname
- @c LocalWords: yytable yycheck yyrule byacc CXXCOMPILE CXXLINK FLINK cfortran
- @c LocalWords: Catalogue preprocessable FLIBS libfoo baz JAVACFLAGS java exe
- @c LocalWords: SunOS fying basenames exeext uninstalled oldinclude kr FSF's
- @c LocalWords: pkginclude oldincludedir sysconf sharedstate localstate gcc rm
- @c LocalWords: sysconfdir sharedstatedir localstatedir preexist CLEANFILES gz
- @c LocalWords: depfile tmpdepfile depmode const interoperate
- @c LocalWords: JAVAC javac JAVAROOT builddir CLASSPATH ENV pyc pyo pkgpython
- @c LocalWords: pyexecdir pkgpyexecdir Python's pythondir pkgpythondir txi ois
- @c LocalWords: installinfo vers MAKEINFO makeinfo MAKEINFOFLAGS noinstall rf
- @c LocalWords: mandir thesame alsothesame installman myexecbin DESTDIR Pinard
- @c LocalWords: uninstall installdirs uninstalls MOSTLYCLEANFILES mostlyclean
- @c LocalWords: DISTCLEANFILES MAINTAINERCLEANFILES GZIP gzip shar exp
- @c LocalWords: distdir distcheck distcleancheck listfiles distuninstallcheck
- @c LocalWords: VPATH tarfile stdout XFAIL DejaGnu dejagnu DEJATOOL runtest ln
- @c LocalWords: RUNTESTDEFAULTFLAGS toolchain RUNTESTFLAGS asis readme DVIPS
- @c LocalWords: installcheck gzipped tarZ std utils etags mkid cd
- @c LocalWords: ARGS taggable ETAGSFLAGS lang ctags CTAGSFLAGS GTAGS gtags idl
- @c LocalWords: foocc doit idlC multilibs ABIs cmindex defmac ARG enableval FC
- @c LocalWords: MSG xtrue DBG pathchk CYGWIN afile proglink versioned CVS's TE
- @c LocalWords: wildcards Autoconfiscated subsubheading autotools Meyering API
- @c LocalWords: ois's wildcard Wportability cartouche vrindex printindex Duret
- @c LocalWords: DSOMEFLAG DVERSION automake Lutz insertcopying versioning FAQ
- @c LocalWords: LTLIBOBJ Libtool's libtool's libltdl dlopening itutions libbar
- @c LocalWords: WANTEDLIBS libhello sublibraries libtop libsub dlopened Ratfor
- @c LocalWords: mymodule timestamps timestamp underquoted MAKEINFOHTMLFLAGS te
- @c LocalWords: GNUmakefile Subpackages subpackage's subpackages aux
- @c LocalWords: detailmenu Timeline pwd reldir AUTOM autom PREREQ FOOBAR libc
- @c LocalWords: libhand subpackage moduleN libmain libmisc FCFLAGS FCCOMPILE
- @c LocalWords: FCLINK subst sed ELCFILES elc MAKEINFOHTML dvips esyscmd ustar
- @c LocalWords: tarballs Woverride vfi ELFILES djm AutoMake honkin FSF
- @c LocalWords: fileutils precanned MacKenzie's reimplement termutils Tromey's
- @c LocalWords: cois gnitsians LIBPROGRAMS progs LIBLIBRARIES Textutils Ulrich
- @c LocalWords: Matzigkeit Drepper's Gord Matzigkeit's jm Dalley Debian org
- @c LocalWords: Administrivia ILU CORBA Sourceware Molenda sourceware Elliston
- @c LocalWords: dep Oliva Akim Demaille Aiieeee Demaillator Akim's sourcequake
- @c LocalWords: grep backported screenshots libgcj KB unnumberedsubsubsec pre
- @c LocalWords: precomputing hacky makedepend inline clearmake LD PRELOAD Rel
- @c LocalWords: syscalls perlhist acl pm multitable headitem fdl appendixsec
- @c LocalWords: LTALLOCA MALLOC malloc memcmp strdup alloca libcompat xyz DFOO
- @c LocalWords: unprefixed buildable preprocessed DBAZ DDATADIR WARNINGCFLAGS
- @c LocalWords: LIBFOOCFLAGS LIBFOOLDFLAGS ftable testSubDir obj LIBTOOLFLAGS
- @c LocalWords: barexec Pinard's automatize initialize lzip xz cscope
|