PNG  IHDRX cHRMz&u0`:pQ<bKGD pHYsodtIME MeqIDATxw]Wug^Qd˶ 6`!N:!@xI~)%7%@Bh&`lnjVF29gΨ4E$|>cɚ{gk= %,a KX%,a KX%,a KX%,a KX%,a KX%,a KX%, b` ǟzeאfp]<!SJmɤY޲ڿ,%c ~ع9VH.!Ͳz&QynֺTkRR.BLHi٪:l;@(!MԴ=žI,:o&N'Kù\vRmJ雵֫AWic H@" !: Cé||]k-Ha oݜ:y F())u]aG7*JV@J415p=sZH!=!DRʯvɱh~V\}v/GKY$n]"X"}t@ xS76^[bw4dsce)2dU0 CkMa-U5tvLƀ~mlMwfGE/-]7XAƟ`׮g ewxwC4\[~7@O-Q( a*XGƒ{ ՟}$_y3tĐƤatgvێi|K=uVyrŲlLӪuܿzwk$m87k( `múcE)"@rK( z4$D; 2kW=Xb$V[Ru819קR~qloѱDyįݎ*mxw]y5e4K@ЃI0A D@"BDk_)N\8͜9dz"fK0zɿvM /.:2O{ Nb=M=7>??Zuo32 DLD@D| &+֎C #B8ַ`bOb $D#ͮҪtx]%`ES`Ru[=¾!@Od37LJ0!OIR4m]GZRJu$‡c=%~s@6SKy?CeIh:[vR@Lh | (BhAMy=݃  G"'wzn޺~8ԽSh ~T*A:xR[ܹ?X[uKL_=fDȊ؂p0}7=D$Ekq!/t.*2ʼnDbŞ}DijYaȲ(""6HA;:LzxQ‘(SQQ}*PL*fc\s `/d'QXW, e`#kPGZuŞuO{{wm[&NBTiiI0bukcA9<4@SӊH*؎4U/'2U5.(9JuDfrޱtycU%j(:RUbArLֺN)udA':uGQN"-"Is.*+k@ `Ojs@yU/ H:l;@yyTn}_yw!VkRJ4P)~y#)r,D =ě"Q]ci'%HI4ZL0"MJy 8A{ aN<8D"1#IJi >XjX֔#@>-{vN!8tRݻ^)N_╗FJEk]CT՟ YP:_|H1@ CBk]yKYp|og?*dGvzنzӴzjֺNkC~AbZƷ`.H)=!QͷVTT(| u78y֮}|[8-Vjp%2JPk[}ԉaH8Wpqhwr:vWª<}l77_~{s۴V+RCģ%WRZ\AqHifɤL36: #F:p]Bq/z{0CU6ݳEv_^k7'>sq*+kH%a`0ԣisqにtү04gVgW΂iJiS'3w.w}l6MC2uԯ|>JF5`fV5m`Y**Db1FKNttu]4ccsQNnex/87+}xaUW9y>ͯ骵G{䩓Գ3+vU}~jJ.NFRD7<aJDB1#ҳgSb,+CS?/ VG J?|?,2#M9}B)MiE+G`-wo߫V`fio(}S^4e~V4bHOYb"b#E)dda:'?}׮4繏`{7Z"uny-?ǹ;0MKx{:_pÚmFמ:F " .LFQLG)Q8qN q¯¯3wOvxDb\. BKD9_NN &L:4D{mm o^tֽ:q!ƥ}K+<"m78N< ywsard5+вz~mnG)=}lYݧNj'QJS{S :UYS-952?&O-:W}(!6Mk4+>A>j+i|<<|;ر^߉=HE|V#F)Emm#}/"y GII웻Jі94+v뾧xu~5C95~ūH>c@덉pʃ1/4-A2G%7>m;–Y,cyyaln" ?ƻ!ʪ<{~h~i y.zZB̃/,雋SiC/JFMmBH&&FAbϓO^tubbb_hZ{_QZ-sύodFgO(6]TJA˯#`۶ɟ( %$&+V'~hiYy>922 Wp74Zkq+Ovn錄c>8~GqܲcWꂎz@"1A.}T)uiW4="jJ2W7mU/N0gcqܗOO}?9/wìXžΏ0 >֩(V^Rh32!Hj5`;O28؇2#ݕf3 ?sJd8NJ@7O0 b־?lldщ̡&|9C.8RTWwxWy46ah嘦mh٤&l zCy!PY?: CJyв]dm4ǜҐR޻RլhX{FƯanшQI@x' ao(kUUuxW_Ñ줮[w8 FRJ(8˼)_mQ _!RJhm=!cVmm ?sFOnll6Qk}alY}; "baӌ~M0w,Ggw2W:G/k2%R,_=u`WU R.9T"v,<\Ik޽/2110Ӿxc0gyC&Ny޽JҢrV6N ``یeA16"J³+Rj*;BϜkZPJaÍ<Jyw:NP8/D$ 011z֊Ⱳ3ι֘k1V_"h!JPIΣ'ɜ* aEAd:ݺ>y<}Lp&PlRfTb1]o .2EW\ͮ]38؋rTJsǏP@芎sF\> P^+dYJLbJ C-xϐn> ι$nj,;Ǖa FU *择|h ~izť3ᤓ`K'-f tL7JK+vf2)V'-sFuB4i+m+@My=O҈0"|Yxoj,3]:cо3 $#uŘ%Y"y죯LebqtҢVzq¼X)~>4L׶m~[1_k?kxֺQ`\ |ٛY4Ѯr!)N9{56(iNq}O()Em]=F&u?$HypWUeB\k]JɩSع9 Zqg4ZĊo oMcjZBU]B\TUd34ݝ~:7ڶSUsB0Z3srx 7`:5xcx !qZA!;%͚7&P H<WL!džOb5kF)xor^aujƍ7 Ǡ8/p^(L>ὴ-B,{ۇWzֺ^k]3\EE@7>lYBȝR.oHnXO/}sB|.i@ɥDB4tcm,@ӣgdtJ!lH$_vN166L__'Z)y&kH;:,Y7=J 9cG) V\hjiE;gya~%ks_nC~Er er)muuMg2;֫R)Md) ,¶ 2-wr#F7<-BBn~_(o=KO㭇[Xv eN_SMgSҐ BS헃D%g_N:/pe -wkG*9yYSZS.9cREL !k}<4_Xs#FmҶ:7R$i,fi!~' # !6/S6y@kZkZcX)%5V4P]VGYq%H1!;e1MV<!ϐHO021Dp= HMs~~a)ަu7G^];git!Frl]H/L$=AeUvZE4P\.,xi {-~p?2b#amXAHq)MWǾI_r`S Hz&|{ +ʖ_= (YS(_g0a03M`I&'9vl?MM+m~}*xT۲(fY*V4x@29s{DaY"toGNTO+xCAO~4Ϳ;p`Ѫ:>Ҵ7K 3}+0 387x\)a"/E>qpWB=1 ¨"MP(\xp߫́A3+J] n[ʼnӼaTbZUWb={~2ooKױӰp(CS\S筐R*JغV&&"FA}J>G֐p1ٸbk7 ŘH$JoN <8s^yk_[;gy-;߉DV{c B yce% aJhDȶ 2IdйIB/^n0tNtџdcKj4϶v~- CBcgqx9= PJ) dMsjpYB] GD4RDWX +h{y`,3ꊕ$`zj*N^TP4L:Iz9~6s) Ga:?y*J~?OrMwP\](21sZUD ?ܟQ5Q%ggW6QdO+\@ ̪X'GxN @'4=ˋ+*VwN ne_|(/BDfj5(Dq<*tNt1х!MV.C0 32b#?n0pzj#!38}޴o1KovCJ`8ŗ_"]] rDUy޲@ Ȗ-;xџ'^Y`zEd?0„ DAL18IS]VGq\4o !swV7ˣι%4FѮ~}6)OgS[~Q vcYbL!wG3 7띸*E Pql8=jT\꘿I(z<[6OrR8ºC~ډ]=rNl[g|v TMTղb-o}OrP^Q]<98S¤!k)G(Vkwyqyr޽Nv`N/e p/~NAOk \I:G6]4+K;j$R:Mi #*[AȚT,ʰ,;N{HZTGMoּy) ]%dHء9Պ䠬|<45,\=[bƟ8QXeB3- &dҩ^{>/86bXmZ]]yޚN[(WAHL$YAgDKp=5GHjU&99v簪C0vygln*P)9^͞}lMuiH!̍#DoRBn9l@ xA/_v=ȺT{7Yt2N"4!YN`ae >Q<XMydEB`VU}u]嫇.%e^ánE87Mu\t`cP=AD/G)sI"@MP;)]%fH9'FNsj1pVhY&9=0pfuJ&gޤx+k:!r˭wkl03׼Ku C &ѓYt{.O.zҏ z}/tf_wEp2gvX)GN#I ݭ߽v/ .& и(ZF{e"=V!{zW`, ]+LGz"(UJp|j( #V4, 8B 0 9OkRrlɱl94)'VH9=9W|>PS['G(*I1==C<5"Pg+x'K5EMd؞Af8lG ?D FtoB[je?{k3zQ vZ;%Ɠ,]E>KZ+T/ EJxOZ1i #T<@ I}q9/t'zi(EMqw`mYkU6;[t4DPeckeM;H}_g pMww}k6#H㶏+b8雡Sxp)&C $@'b,fPߑt$RbJ'vznuS ~8='72_`{q纶|Q)Xk}cPz9p7O:'|G~8wx(a 0QCko|0ASD>Ip=4Q, d|F8RcU"/KM opKle M3#i0c%<7׿p&pZq[TR"BpqauIp$ 8~Ĩ!8Սx\ւdT>>Z40ks7 z2IQ}ItԀ<-%S⍤};zIb$I 5K}Q͙D8UguWE$Jh )cu4N tZl+[]M4k8֦Zeq֮M7uIqG 1==tLtR,ƜSrHYt&QP윯Lg' I,3@P'}'R˪e/%-Auv·ñ\> vDJzlӾNv5:|K/Jb6KI9)Zh*ZAi`?S {aiVDԲuy5W7pWeQJk֤#5&V<̺@/GH?^τZL|IJNvI:'P=Ϛt"¨=cud S Q.Ki0 !cJy;LJR;G{BJy޺[^8fK6)=yʊ+(k|&xQ2`L?Ȓ2@Mf 0C`6-%pKpm')c$׻K5[J*U[/#hH!6acB JA _|uMvDyk y)6OPYjœ50VT K}cǻP[ $:]4MEA.y)|B)cf-A?(e|lɉ#P9V)[9t.EiQPDѠ3ϴ;E:+Օ t ȥ~|_N2,ZJLt4! %ա]u {+=p.GhNcŞQI?Nd'yeh n7zi1DB)1S | S#ًZs2|Ɛy$F SxeX{7Vl.Src3E℃Q>b6G ўYCmtկ~=K0f(=LrAS GN'ɹ9<\!a`)֕y[uՍ[09` 9 +57ts6}b4{oqd+J5fa/,97J#6yν99mRWxJyѡyu_TJc`~W>l^q#Ts#2"nD1%fS)FU w{ܯ R{ ˎ󅃏џDsZSQS;LV;7 Od1&1n$ N /.q3~eNɪ]E#oM~}v֯FڦwyZ=<<>Xo稯lfMFV6p02|*=tV!c~]fa5Y^Q_WN|Vs 0ҘދU97OI'N2'8N֭fgg-}V%y]U4 峧p*91#9U kCac_AFңĪy뚇Y_AiuYyTTYЗ-(!JFLt›17uTozc. S;7A&&<ԋ5y;Ro+:' *eYJkWR[@F %SHWP 72k4 qLd'J "zB6{AC0ƁA6U.'F3:Ȅ(9ΜL;D]m8ڥ9}dU "v!;*13Rg^fJyShyy5auA?ɩGHRjo^]׽S)Fm\toy 4WQS@mE#%5ʈfFYDX ~D5Ϡ9tE9So_aU4?Ѽm%&c{n>.KW1Tlb}:j uGi(JgcYj0qn+>) %\!4{LaJso d||u//P_y7iRJ߬nHOy) l+@$($VFIQ9%EeKʈU. ia&FY̒mZ=)+qqoQn >L!qCiDB;Y<%} OgBxB!ØuG)WG9y(Ą{_yesuZmZZey'Wg#C~1Cev@0D $a@˲(.._GimA:uyw֬%;@!JkQVM_Ow:P.s\)ot- ˹"`B,e CRtaEUP<0'}r3[>?G8xU~Nqu;Wm8\RIkբ^5@k+5(By'L&'gBJ3ݶ!/㮻w҅ yqPWUg<e"Qy*167΃sJ\oz]T*UQ<\FԎ`HaNmڜ6DysCask8wP8y9``GJ9lF\G g's Nn͵MLN֪u$| /|7=]O)6s !ĴAKh]q_ap $HH'\1jB^s\|- W1:=6lJBqjY^LsPk""`]w)󭃈,(HC ?䔨Y$Sʣ{4Z+0NvQkhol6C.婧/u]FwiVjZka&%6\F*Ny#8O,22+|Db~d ~Çwc N:FuuCe&oZ(l;@ee-+Wn`44AMK➝2BRՈt7g*1gph9N) *"TF*R(#'88pm=}X]u[i7bEc|\~EMn}P瘊J)K.0i1M6=7'_\kaZ(Th{K*GJyytw"IO-PWJk)..axӝ47"89Cc7ĐBiZx 7m!fy|ϿF9CbȩV 9V-՛^pV̌ɄS#Bv4-@]Vxt-Z, &ֺ*diؠ2^VXbs֔Ìl.jQ]Y[47gj=幽ex)A0ip׳ W2[ᎇhuE^~q흙L} #-b۸oFJ_QP3r6jr+"nfzRJTUqoaۍ /$d8Mx'ݓ= OՃ| )$2mcM*cЙj}f };n YG w0Ia!1Q.oYfr]DyISaP}"dIӗթO67jqR ҊƐƈaɤGG|h;t]䗖oSv|iZqX)oalv;۩meEJ\!8=$4QU4Xo&VEĊ YS^E#d,yX_> ۘ-e\ "Wa6uLĜZi`aD9.% w~mB(02G[6y.773a7 /=o7D)$Z 66 $bY^\CuP. (x'"J60׿Y:Oi;F{w佩b+\Yi`TDWa~|VH)8q/=9!g߆2Y)?ND)%?Ǐ`k/sn:;O299yB=a[Ng 3˲N}vLNy;*?x?~L&=xyӴ~}q{qE*IQ^^ͧvü{Huu=R|>JyUlZV, B~/YF!Y\u_ݼF{_C)LD]m {H 0ihhadd nUkf3oٺCvE\)QJi+֥@tDJkB$1!Đr0XQ|q?d2) Ӣ_}qv-< FŊ߫%roppVBwü~JidY4:}L6M7f٬F "?71<2#?Jyy4뷢<_a7_=Q E=S1И/9{+93֮E{ǂw{))?maÆm(uLE#lïZ  ~d];+]h j?!|$F}*"4(v'8s<ŏUkm7^7no1w2ؗ}TrͿEk>p'8OB7d7R(A 9.*Mi^ͳ; eeUwS+C)uO@ =Sy]` }l8^ZzRXj[^iUɺ$tj))<sbDJfg=Pk_{xaKo1:-uyG0M ԃ\0Lvuy'ȱc2Ji AdyVgVh!{]/&}}ċJ#%d !+87<;qN޼Nفl|1N:8ya  8}k¾+-$4FiZYÔXk*I&'@iI99)HSh4+2G:tGhS^繿 Kتm0 вDk}֚+QT4;sC}rՅE,8CX-e~>G&'9xpW,%Fh,Ry56Y–hW-(v_,? ; qrBk4-V7HQ;ˇ^Gv1JVV%,ik;D_W!))+BoS4QsTM;gt+ndS-~:11Sgv!0qRVh!"Ȋ(̦Yl.]PQWgٳE'`%W1{ndΗBk|Ž7ʒR~,lnoa&:ü$ 3<a[CBݮwt"o\ePJ=Hz"_c^Z.#ˆ*x z̝grY]tdkP*:97YľXyBkD4N.C_[;F9`8& !AMO c `@BA& Ost\-\NX+Xp < !bj3C&QL+*&kAQ=04}cC!9~820G'PC9xa!w&bo_1 Sw"ܱ V )Yl3+ס2KoXOx]"`^WOy :3GO0g;%Yv㐫(R/r (s } u B &FeYZh0y> =2<Ϟc/ -u= c&׭,.0"g"7 6T!vl#sc>{u/Oh Bᾈ)۴74]x7 gMӒ"d]U)}" v4co[ ɡs 5Gg=XR14?5A}D "b{0$L .\4y{_fe:kVS\\O]c^W52LSBDM! C3Dhr̦RtArx4&agaN3Cf<Ԉp4~ B'"1@.b_/xQ} _߃҉/gٓ2Qkqp0շpZ2fԫYz< 4L.Cyυι1t@鎫Fe sYfsF}^ V}N<_`p)alٶ "(XEAVZ<)2},:Ir*#m_YӼ R%a||EƼIJ,,+f"96r/}0jE/)s)cjW#w'Sʯ5<66lj$a~3Kʛy 2:cZ:Yh))+a߭K::N,Q F'qB]={.]h85C9cr=}*rk?vwV렵ٸW Rs%}rNAkDv|uFLBkWY YkX מ|)1!$#3%y?pF<@<Rr0}: }\J [5FRxY<9"SQdE(Q*Qʻ)q1E0B_O24[U'],lOb ]~WjHޏTQ5Syu wq)xnw8~)c 쫬gٲߠ H% k5dƝk> kEj,0% b"vi2Wس_CuK)K{n|>t{P1򨾜j>'kEkƗBg*H%'_aY6Bn!TL&ɌOb{c`'d^{t\i^[uɐ[}q0lM˕G:‚4kb祔c^:?bpg… +37stH:0}en6x˟%/<]BL&* 5&fK9Mq)/iyqtA%kUe[ڛKN]Ě^,"`/ s[EQQm?|XJ߅92m]G.E΃ח U*Cn.j_)Tѧj̿30ڇ!A0=͜ar I3$C^-9#|pk!)?7.x9 @OO;WƝZBFU keZ75F6Tc6"ZȚs2y/1 ʵ:u4xa`C>6Rb/Yм)^=+~uRd`/|_8xbB0?Ft||Z\##|K 0>>zxv8۴吅q 8ĥ)"6>~\8:qM}#͚'ĉ#p\׶ l#bA?)|g g9|8jP(cr,BwV (WliVxxᡁ@0Okn;ɥh$_ckCgriv}>=wGzβ KkBɛ[˪ !J)h&k2%07δt}!d<9;I&0wV/ v 0<H}L&8ob%Hi|޶o&h1L|u֦y~󛱢8fٲUsւ)0oiFx2}X[zVYr_;N(w]_4B@OanC?gĦx>мgx>ΛToZoOMp>40>V Oy V9iq!4 LN,ˢu{jsz]|"R޻&'ƚ{53ўFu(<٪9:΋]B;)B>1::8;~)Yt|0(pw2N%&X,URBK)3\zz&}ax4;ǟ(tLNg{N|Ǽ\G#C9g$^\}p?556]/RP.90 k,U8/u776s ʪ_01چ|\N 0VV*3H鴃J7iI!wG_^ypl}r*jɤSR 5QN@ iZ#1ٰy;_\3\BQQ x:WJv츟ٯ$"@6 S#qe딇(/P( Dy~TOϻ<4:-+F`0||;Xl-"uw$Цi󼕝mKʩorz"mϺ$F:~E'ҐvD\y?Rr8_He@ e~O,T.(ފR*cY^m|cVR[8 JҡSm!ΆԨb)RHG{?MpqrmN>߶Y)\p,d#xۆWY*,l6]v0h15M˙MS8+EdI='LBJIH7_9{Caз*Lq,dt >+~ّeʏ?xԕ4bBAŚjﵫ!'\Ը$WNvKO}ӽmSşذqsOy?\[,d@'73'j%kOe`1.g2"e =YIzS2|zŐƄa\U,dP;jhhhaxǶ?КZ՚.q SE+XrbOu%\GتX(H,N^~]JyEZQKceTQ]VGYqnah;y$cQahT&QPZ*iZ8UQQM.qo/T\7X"u?Mttl2Xq(IoW{R^ ux*SYJ! 4S.Jy~ BROS[V|žKNɛP(L6V^|cR7i7nZW1Fd@ Ara{詑|(T*dN]Ko?s=@ |_EvF]׍kR)eBJc" MUUbY6`~V޴dJKß&~'d3i WWWWWW
Current Directory: /usr/share/doc/pkgconfig-0.27.1
Viewing File: /usr/share/doc/pkgconfig-0.27.1/pkg-config-guide.html
<!-- Copyright (C) 2010 Dan Nicholson. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. --> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <style type="text/css"> pre { background-color: #f0f0f0; padding: 0.4cm; } </style> <title>Guide to pkg-config</title> </head> <body> <h1><a name="top">Guide to pkg-config</a></h1> <h3>Dan Nicholson</h3> <ul> <li><a href="#overview">Overview</a></li> <li><a href="#why">Why?</a></li> <li><a href="#concepts">Concepts</a></li> <li><a href="#writing">Writing pkg-config files</a></li> <li><a href="#using">Using pkg-config files</a></li> <!--<li><a href="#examples">Examples</a></li>--> <li><a href="#faq">Frequently asked questions</a></li> </ul> <h2><a name="overview">Overview</a></h2> <p>This document aims to give an overview to using the <tt>pkg-config</tt> tool from the perspective of both a user and a developer. It reviews the concepts behind <tt>pkg-config</tt>, how to write <tt>pkg-config</tt> files to support your project, and how to use <tt>pkg-config</tt> to integrate with 3rd party projects.</p> <p>More information on <tt>pkg-config</tt> can be found at the <a href="http://pkg-config.freedesktop.org/">website</a> and in the <tt>pkg-config(1)</tt> manual page.</p> <p>This document assumes usage of <tt>pkg-config</tt> on a Unix-like operating system such as Linux. Some of the details may be different on other platforms.</p> <h2><a name="why">Why?</a></h2> <p>Modern computer systems use many layered components to provide applications to the user. One of the difficulties in assembling these parts is properly integrating them. <tt>pkg-config</tt> collects metadata about the installed libraries on the system and easily provides it to the user. </p> <p>Without a metadata system such as <tt>pkg-config</tt>, it can be very difficult to locate and obtain details about the services provided on a given computer. For a developer, installing <tt>pkg-config</tt> files with your package greatly eases adoption of your API.</p> <h2><a name="concepts">Concepts</a></h2> <p>The primary use of <tt>pkg-config</tt> is to provide the necessary details for compiling and linking a program to a library. This metadata is stored in <tt>pkg-config</tt> files. These files have the suffix <tt>.pc</tt> and reside in specific locations known to the <tt>pkg-config</tt> tool. This will be described in more detail later.</p> <p>The file format contains predefined metadata keywords and freeform variables. An example may be illustrative:<p> <pre>prefix=/usr/local exec_prefix=${prefix} includedir=${prefix}/include libdir=${exec_prefix}/lib Name: foo Description: The foo library Version: 1.0.0 Cflags: -I${includedir}/foo Libs: -L${libdir} -lfoo</pre> <p>The keyword definitions such as <tt>Name:</tt> begin with a keyword followed by a colon and the value. The variables such as <tt>prefix=</tt> are a string and value separated by an equals sign. The keywords are defined and exported by <tt>pkg-config</tt>. The variables are not necessary, but can be used by the keyword definitions for flexibility or to store data not covered by <tt>pkg-config</tt>.</p> <p>Here is a short description of the keyword fields. A more in depth description of these fields and how to use them effectively will be given in the <a href="#writing">Writing pkg-config files</a> section.</p> <ul> <li><b>Name</b>: A human-readable name for the library or package. This does not affect usage of the <tt>pkg-config</tt> tool, which uses the name of the <tt>.pc</tt> file.</li> <li><b>Description</b>: A brief description of the package.</li> <li><b>URL</b>: An URL where people can get more information about and download the package.</li> <li><b>Version</b>: A string specifically defining the version of the package.</li> <li><b>Requires</b>: A list of packages required by this package. The versions of these packages may be specified using the comparison operators =, &lt;, &gt;, &lt;= or &gt;=.</li> <li><b>Requires.private</b>: A list of private packages required by this package but not exposed to applications. The version specific rules from the <tt>Requires</tt> field also apply here.</li> <li><b>Conflicts</b>: An optional field describing packages that this one conflicts with. The version specific rules from the <tt>Requires</tt> field also apply here. This field also takes multiple instances of the same package. E.g., <tt>Conflicts: bar < 1.2.3, bar >= 1.3.0</tt>.</li> <li><b>Cflags</b>: The compiler flags specific to this package and any required libraries that don't support <tt>pkg-config</tt>. If the required libraries support <tt>pkg-config</tt>, they should be added to <tt>Requires</tt> or <tt>Requires.private</tt>.</li> <li><b>Libs</b>: The link flags specific to this package and any required libraries that don't support <tt>pkg-config</tt>. The same rule as <tt>Cflags</tt> applies here.</li> <li><b>Libs.private</b>: The link flags for private libraries required by this package but not exposed to applications. The same rule as <tt>Cflags</tt> applies here.</li> </ul> <h2><a name="writing">Writing pkg-config files</a></h2> <p>When creating <tt>pkg-config</tt> files for a package, it is first necessary to decide how they will be distributed. Each file is best used to describe a single library, so each package should have at least as many <tt>pkg-config</tt> files as they do installed libraries.</p> <p>The package name is determined through the filename of the <tt>pkg-config</tt> metadata file. This is the portion of the filename prior to the <tt>.pc</tt> suffix. A common choice is to match the library name to the <tt>.pc</tt> name. For instance, a package installing <tt>libfoo.so</tt> would have a corresponding <tt>libfoo.pc</tt> file containing the <tt>pkg-config</tt> metadata. This choice is not necessary; the <tt>.pc</tt> file should simply be a unique identifier for your library. Following the above example, <tt>foo.pc</tt> or <tt>foolib.pc</tt> would probably work just as well.</p> <p>The <tt>Name</tt>, <tt>Description</tt> and <tt>URL</tt> fields are purely informational and should be easy to fill in. The <tt>Version</tt> field is a bit trickier to ensure that it is usable by consumers of the data. <tt>pkg-config</tt> uses the algorithm from <a href="http://rpm.org/">RPM</a> for version comparisons. This works best with a dotted decimal number such as <tt>1.2.3</tt> since letters can cause unexpected results. The number should be monotonically increasing and be as specific as possible in describing the library. Usually it's sufficient to use the package's version number here since it's easy for consumers to track.</p> <p>Before describing the more useful fields, it will be helpful to demonstrate variable definitions. The most common usage is to define the installation paths so that they don't clutter the metadata fields. Since the variables are expanded recursively, this is very helpful when used in conjunction with autoconf derived paths.</p> <pre>prefix=/usr/local includedir=${prefix}/include Cflags: -I${includedir}/foo</pre> <p>The most important <tt>pkg-config</tt> metadata fields are <tt>Requires</tt>, <tt>Requires.private</tt>, <tt>Cflags</tt>, <tt>Libs</tt> and <tt>Libs.private</tt>. They will define the metadata used by external projects to compile and link with the library.</p> <p><tt>Requires</tt> and <tt>Requires.private</tt> define other modules needed by the library. It is usually preferred to use the private variant of <tt>Requires</tt> to avoid exposing unnecessary libraries to the program that is linking with your library. If the program will not be using the symbols of the required library, it should not be linking directly to that library. See the discussion of <a href="http://wiki.mandriva.com/en/Overlinking">overlinking</a> for a more thorough explanation.</p> <p>Since <tt>pkg-config</tt> always exposes the link flags of the <tt>Requires</tt> libraries, these modules will become direct dependencies of the program. On the other hand, libraries from <tt>Requires.private</tt> will only be included when static linking. For this reason, it is usually only appropriate to add modules from the same package in <tt>Requires</tt>. </p> <p>The <tt>Libs</tt> field contains the link flags necessary to use that library. In addition, <tt>Libs</tt> and <tt>Libs.private</tt> contain link flags for other libraries not supported by <tt>pkg-config</tt>. Similar to the <tt>Requires</tt> field, it is preferred to add link flags for external libraries to the <tt>Libs.private</tt> field so programs do not acquire an additional direct dependency.</p> <p>Finally, the <tt>Cflags</tt> contains the compiler flags for using the library. Unlike the <tt>Libs</tt> field, there is not a private variant of <tt>Cflags</tt>. This is because the data types and macro definitions are needed regardless of the linking scenario.</p> <h2><a name="using">Using pkg-config files</a></h2> <p>Assuming that there are <tt>.pc</tt> files installed on the system, the <tt>pkg-config</tt> tool is used to extract the metadata for usage. A short description of the options can be seen by executing <tt>pkg-config --help</tt>. A more in depth discussion can be found in the <tt>pkg-config(1)</tt> manual page. This section will provide a brief explanation of common usages.</tt> <p>Consider a system with two modules, <tt>foo</tt> and <tt>bar</tt>. Their <tt>.pc</tt> files might look like this:</p> <pre>foo.pc: prefix=/usr exec_prefix=${prefix} includedir=${prefix}/include libdir=${exec_prefix}/lib Name: foo Description: The foo library Version: 1.0.0 Cflags: -I${includedir}/foo Libs: -L${libdir} -lfoo bar.pc: prefix=/usr exec_prefix=${prefix} includedir=${prefix}/include libdir=${exec_prefix}/lib Name: bar Description: The bar library Version: 2.1.2 Requires.private: foo >= 0.7 Cflags: -I${includedir} Libs: -L${libdir} -lbar</pre> <p>The version of the modules can be obtained with the <tt>--modversion</tt> option.</p> <pre>$ pkg-config --modversion foo 1.0.0 $ pkg-config --modversion bar 2.1.2</pre> <p>To print the link flags needed for each module, use the <tt>--libs</tt> option.</p> <pre>$ pkg-config --libs foo -lfoo $ pkg-config --libs bar -lbar</pre> <p>Notice that <tt>pkg-config</tt> has suppressed part of the <tt>Libs</tt> field for both modules. This is because it treats the <tt>-L</tt> flag specially and knows that the <tt>${libdir}</tt> directory <tt>/usr/lib</tt> is part of the system linker search path. This keeps <tt>pkg-config</tt> from interfering with the linker operation.</p> <p>Also, although <tt>foo</tt> is required by <tt>bar</tt>, the link flags for <tt>foo</tt> are not output. This is because <tt>foo</tt> is not directly needed by an application that only wants to use the <tt>bar</tt> library. For statically linking a <tt>bar</tt> application, we need both sets of linker flags:</p> <pre>$ pkg-config --libs --static bar -lbar -lfoo</pre> <p><tt>pkg-config</tt> needs to output both sets of link flags in this case to ensure that the statically linked application will find all the necessary symbols. On the other hand, it will always output all the <tt>Cflags</tt>. </p> <pre>$ pkg-config --cflags bar -I/usr/include/foo $ pkg-config --cflags --static bar -I/usr/include/foo</pre> <p>Another useful option, <tt>--exists</tt>, can be used to test for a module's availability.</p> <pre>$ pkg-config --exists foo $ echo $? 0</pre> <p>One of the nicest features of <tt>pkg-config</tt> is providing version checking. It can be used to determine if a sufficient version is available. </p> <pre>$ pkg-config --libs "bar >= 2.7" Requested 'bar >= 2.7' but version of bar is 2.1.2</pre> <p>Some commands will provide more verbose output when combined with the <tt>--print-errors</tt> option.</p> <pre>$ pkg-config --exists --print-errors xoxo Package xoxo was not found in the pkg-config search path. Perhaps you should add the directory containing `xoxo.pc' to the PKG_CONFIG_PATH environment variable No package 'xoxo' found</pre> <p>The message above references the <tt>PKG_CONFIG_PATH</tt> environment variable. This variable is used to augment <tt>pkg-config</tt>'s search path. On a typical Unix system, it will search in the directories <tt>/usr/lib/pkgconfig</tt> and <tt>/usr/share/pkgconfig</tt>. This will usually cover system installed modules. However, some local modules may be installed in a different prefix such as <tt>/usr/local</tt>. In that case, it's necessary to prepend the search path so that <tt>pkg-config</tt> can locate the <tt>.pc</tt> files.</p> <pre>$ pkg-config --modversion hello Package hello was not found in the pkg-config search path. Perhaps you should add the directory containing `hello.pc' to the PKG_CONFIG_PATH environment variable No package 'hello' found $ export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig $ pkg-config --modversion hello 1.0.0</pre> <p>A few <a href="http://www.gnu.org/software/autoconf/">autoconf</a> macros are also provided to ease integration of <tt>pkg-config</tt> modules into projects.</p> <ul> <li><b>PKG_PROG_PKG_CONFIG([MIN-VERSION])</b>: Locates the <tt>pkg-config</tt> tool on the system and checks the version for compatibility.</li> <li><b>PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])</b>: Checks to see whether a particular set of modules exists.</li> <li><b>PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])</b>: Checks to see whether a particular set of modules exists. If so, it sets <tt>&lt;VARIABLE-PREFIX&gt;_CFLAGS</tt> and <tt>&lt;VARIABLE-PREFIX&gt;_LIBS</tt> according to the output from <tt>pkg-config --cflags</tt> and <tt>pkg-config --libs</tt>.</li> </ul> <!--<h2><a name="examples">Examples</a></h2>--> <h2><a name="faq">Frequently asked questions</a></h2> <ol> <li>My program uses library <tt>x</tt>. What do I do?</li> <p>The <tt>pkg-config</tt> output can easily be used on the compiler command line. Assuming the <tt>x</tt> library has a <tt>x.pc</tt> <tt>pkg-config</tt> file:</p> <pre>cc `pkg-config --cflags --libs x` -o myapp myapp.c</pre> <p>The integration can be more robust when used with <a href="http://www.gnu.org/software/autoconf/">autoconf</a> and <a href="http://www.gnu.org/software/automake/">automake</a>. By using the supplied <tt>PKG_CHECK_MODULES</tt> macro, the metadata is easily accessed in the build process.</p> <pre>configure.ac: PKG_CHECK_MODULES([X], [x]) Makefile.am: myapp_CFLAGS = $(X_CFLAGS) myapp_LDADD = $(X_LIBS)</pre> <p>If the <tt>x</tt> module is found, the macro will fill and substitute the <tt>X_CFLAGS</tt> and <tt>X_LIBS</tt> variables. If the module is not found, an error will be produced. Optional 3rd and 4th arguments can be supplied to <tt>PKG_CHECK_MODULES</tt> to control actions when the module is found or not.</p> <li>My library <tt>z</tt> installs header files which include <tt>libx</tt> headers. What do I put in my <tt>z.pc</tt> file?</li> <p>If the <tt>x</tt> library has <tt>pkg-config</tt> support, add it to the <tt>Requires.private</tt> field. If it does not, augment the <tt>Cflags</tt> field with the necessary compiler flags for using the <tt>libx</tt> headers. In either case, <tt>pkg-config</tt> will output the compiler flags when <tt>--static</tt> is used or not.</p> <li>My library <tt>z</tt> uses <tt>libx</tt> internally, but does not expose <tt>libx</tt> data types in its public API. What do I put in my <tt>z.pc</tt> file?</li> <p>Again, add the module to <tt>Requires.private</tt> if it supports <tt>pkg-config</tt>. In this case, the compiler flags will be emitted unnecessarily, but it ensures that the linker flags will be present when linking statically. If <tt>libx</tt> does not support <tt>pkg-config</tt>, add the necessary linker flags to <tt>Libs.private</tt>.</p> </ol> <hr/> <address>Dan Nicholson &lt;dbn.lists (at) gmail (dot) com&gt;</address> <p>Copyright (C) 2010 Dan Nicholson.<br/> This document is licensed under the <a href="http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt">GNU General Public License, Version 2</a> or any later version.</p> </body> </html>