makepanda.py 347 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829
  1. #!/usr/bin/env python
  2. ########################################################################
  3. #
  4. # To build panda using this script, type 'makepanda.py' on unix
  5. # or 'makepanda.bat' on windows, and examine the help-text.
  6. # Then run the script again with the appropriate options to compile
  7. # panda3d.
  8. #
  9. ########################################################################
  10. try:
  11. import sys, os, platform, time, stat, re, getopt, threading, signal, shutil
  12. if sys.platform == "darwin" or sys.version_info >= (2, 6):
  13. import plistlib
  14. if sys.version_info >= (3, 0):
  15. import queue
  16. else:
  17. import Queue as queue
  18. except:
  19. print("You are either using an incomplete or an old version of Python!")
  20. print("Please install the development package of Python 2.x and try again.")
  21. exit(1)
  22. from makepandacore import *
  23. from installpanda import *
  24. from distutils.util import get_platform
  25. import time
  26. import os
  27. import sys
  28. ########################################################################
  29. ##
  30. ## PARSING THE COMMAND LINE OPTIONS
  31. ##
  32. ## You might be tempted to change the defaults by editing them
  33. ## here. Don't do it. Instead, create a script that compiles
  34. ## panda with your preferred options. Or, create
  35. ## a 'makepandaPreferences' file and put it into your python path.
  36. ##
  37. ########################################################################
  38. COMPILER=0
  39. INSTALLER=0
  40. WHEEL=0
  41. RUNTESTS=0
  42. GENMAN=0
  43. COMPRESSOR="zlib"
  44. THREADCOUNT=0
  45. CFLAGS=""
  46. CXXFLAGS=""
  47. LDFLAGS=""
  48. RTDIST=0
  49. RTDIST_VERSION=None
  50. RUNTIME=0
  51. DISTRIBUTOR=""
  52. VERSION=None
  53. DEBVERSION=None
  54. WHLVERSION=None
  55. RPMRELEASE="1"
  56. GIT_COMMIT=None
  57. P3DSUFFIX=None
  58. MAJOR_VERSION=None
  59. COREAPI_VERSION=None
  60. PLUGIN_VERSION=None
  61. OSXTARGET=None
  62. OSX_ARCHS=[]
  63. HOST_URL=None
  64. global STRDXSDKVERSION, BOOUSEINTELCOMPILER
  65. STRDXSDKVERSION = 'default'
  66. WINDOWS_SDK = None
  67. MSVC_VERSION = None
  68. BOOUSEINTELCOMPILER = False
  69. OPENCV_VER_23 = False
  70. PLATFORM = None
  71. if "MACOSX_DEPLOYMENT_TARGET" in os.environ:
  72. OSXTARGET=os.environ["MACOSX_DEPLOYMENT_TARGET"]
  73. PkgListSet(["PYTHON", "DIRECT", # Python support
  74. "GL", "GLES", "GLES2"] + DXVERSIONS + ["TINYDISPLAY", "NVIDIACG", # 3D graphics
  75. "EGL", # OpenGL (ES) integration
  76. "EIGEN", # Linear algebra acceleration
  77. "OPENAL", "FMODEX", # Audio playback
  78. "VORBIS", "OPUS", "FFMPEG", "SWSCALE", "SWRESAMPLE", # Audio decoding
  79. "ODE", "PHYSX", "BULLET", "PANDAPHYSICS", # Physics
  80. "SPEEDTREE", # SpeedTree
  81. "ZLIB", "PNG", "JPEG", "TIFF", "OPENEXR", "SQUISH", # 2D Formats support
  82. ] + MAYAVERSIONS + MAXVERSIONS + [ "FCOLLADA", "ASSIMP", "EGG", # 3D Formats support
  83. "FREETYPE", "HARFBUZZ", # Text rendering
  84. "VRPN", "OPENSSL", # Transport
  85. "FFTW", # Algorithm helpers
  86. "ARTOOLKIT", "OPENCV", "DIRECTCAM", "VISION", # Augmented Reality
  87. "GTK2", # GTK2 is used for PStats on Unix
  88. "MFC", "WX", "FLTK", # Used for web plug-in only
  89. "ROCKET", "AWESOMIUM", # GUI libraries
  90. "CARBON", "COCOA", # Mac OS X toolkits
  91. "X11", # Unix platform support
  92. "PANDATOOL", "PVIEW", "DEPLOYTOOLS", # Toolchain
  93. "SKEL", # Example SKEL project
  94. "PANDAFX", # Some distortion special lenses
  95. "PANDAPARTICLESYSTEM", # Built in particle system
  96. "CONTRIB", # Experimental
  97. "SSE2", "NEON", # Compiler features
  98. ])
  99. CheckPandaSourceTree()
  100. def keyboardInterruptHandler(x,y):
  101. exit("keyboard interrupt")
  102. signal.signal(signal.SIGINT, keyboardInterruptHandler)
  103. ########################################################################
  104. ##
  105. ## Command-line parser.
  106. ##
  107. ## You can type "makepanda --help" to see all the options.
  108. ##
  109. ########################################################################
  110. def usage(problem):
  111. if (problem):
  112. print("")
  113. print("Error parsing command-line input: %s" % (problem))
  114. print("")
  115. print("Makepanda generates a 'built' subdirectory containing a")
  116. print("compiled copy of Panda3D. Command-line arguments are:")
  117. print("")
  118. print(" --help (print the help message you're reading now)")
  119. print(" --verbose (print out more information)")
  120. print(" --runtime (build a runtime build instead of an SDK build)")
  121. print(" --tests (run the test suite)")
  122. print(" --installer (build an installer)")
  123. print(" --wheel (build a pip-installable .whl)")
  124. print(" --optimize X (optimization level can be 1,2,3,4)")
  125. print(" --version X (set the panda version number)")
  126. print(" --lzma (use lzma compression when building Windows installer)")
  127. print(" --distributor X (short string identifying the distributor of the build)")
  128. print(" --outputdir X (use the specified directory instead of 'built')")
  129. print(" --host URL (set the host url (runtime build only))")
  130. print(" --threads N (use the multithreaded build system. see manual)")
  131. print(" --osxtarget N (the OS X version number to build for (OS X only))")
  132. print(" --universal (build universal binaries (OS X only))")
  133. print(" --override \"O=V\" (override dtool_config/prc option value)")
  134. print(" --static (builds libraries for static linking)")
  135. print(" --target X (experimental cross-compilation (android only))")
  136. print(" --arch X (target architecture for cross-compilation)")
  137. print("")
  138. for pkg in PkgListGet():
  139. p = pkg.lower()
  140. print(" --use-%-9s --no-%-9s (enable/disable use of %s)"%(p, p, pkg))
  141. if sys.platform != 'win32':
  142. print(" --<PKG>-incdir (custom location for header files of thirdparty package)")
  143. print(" --<PKG>-libdir (custom location for library files of thirdparty package)")
  144. print("")
  145. print(" --nothing (disable every third-party lib)")
  146. print(" --everything (enable every third-party lib)")
  147. print(" --directx-sdk=X (specify version of DirectX SDK to use: jun2010, aug2009, mar2009, aug2006)")
  148. print(" --windows-sdk=X (specify Windows SDK version, eg. 7.0, 7.1 or 10. Default is 7.1)")
  149. print(" --msvc-version=X (specify Visual C++ version, eg. 10, 11, 12, 14. Default is 14)")
  150. print(" --use-icl (experimental setting to use an intel compiler instead of MSVC on Windows)")
  151. print("")
  152. print("The simplest way to compile panda is to just type:")
  153. print("")
  154. print(" makepanda --everything")
  155. print("")
  156. os._exit(1)
  157. def parseopts(args):
  158. global INSTALLER,WHEEL,RUNTESTS,RTDIST,RUNTIME,GENMAN,DISTRIBUTOR,VERSION
  159. global COMPRESSOR,THREADCOUNT,OSXTARGET,OSX_ARCHS,HOST_URL
  160. global DEBVERSION,WHLVERSION,RPMRELEASE,GIT_COMMIT,P3DSUFFIX,RTDIST_VERSION
  161. global STRDXSDKVERSION, WINDOWS_SDK, MSVC_VERSION, BOOUSEINTELCOMPILER
  162. longopts = [
  163. "help","distributor=","verbose","runtime","osxtarget=","tests",
  164. "optimize=","everything","nothing","installer","wheel","rtdist","nocolor",
  165. "version=","lzma","no-python","threads=","outputdir=","override=",
  166. "static","host=","debversion=","rpmrelease=","p3dsuffix=","rtdist-version=",
  167. "directx-sdk=", "windows-sdk=", "msvc-version=", "clean", "use-icl",
  168. "universal", "target=", "arch=", "git-commit=", "no-directscripts",
  169. "use-touchinput", "no-touchinput"]
  170. anything = 0
  171. optimize = ""
  172. target = None
  173. target_arch = None
  174. universal = False
  175. clean_build = False
  176. for pkg in PkgListGet():
  177. longopts.append("use-" + pkg.lower())
  178. longopts.append("no-" + pkg.lower())
  179. longopts.append(pkg.lower() + "-incdir=")
  180. longopts.append(pkg.lower() + "-libdir=")
  181. try:
  182. opts, extras = getopt.getopt(args, "", longopts)
  183. for option, value in opts:
  184. if (option=="--help"): raise Exception
  185. elif (option=="--optimize"): optimize=value
  186. elif (option=="--installer"): INSTALLER=1
  187. elif (option=="--tests"): RUNTESTS=1
  188. elif (option=="--wheel"): WHEEL=1
  189. elif (option=="--verbose"): SetVerbose(True)
  190. elif (option=="--distributor"): DISTRIBUTOR=value
  191. elif (option=="--rtdist"): RTDIST=1
  192. elif (option=="--runtime"): RUNTIME=1
  193. elif (option=="--genman"): GENMAN=1
  194. elif (option=="--everything"): PkgEnableAll()
  195. elif (option=="--nothing"): PkgDisableAll()
  196. elif (option=="--threads"): THREADCOUNT=int(value)
  197. elif (option=="--outputdir"): SetOutputDir(value.strip())
  198. elif (option=="--osxtarget"): OSXTARGET=value.strip()
  199. elif (option=="--universal"): universal = True
  200. elif (option=="--target"): target = value.strip()
  201. elif (option=="--arch"): target_arch = value.strip()
  202. elif (option=="--nocolor"): DisableColors()
  203. elif (option=="--version"):
  204. match = re.match(r'^\d+\.\d+\.\d+', value)
  205. if not match:
  206. usage("version requires three digits")
  207. WHLVERSION = value
  208. VERSION = match.group()
  209. elif (option=="--lzma"): COMPRESSOR="lzma"
  210. elif (option=="--override"): AddOverride(value.strip())
  211. elif (option=="--static"): SetLinkAllStatic(True)
  212. elif (option=="--host"): HOST_URL=value
  213. elif (option=="--debversion"): DEBVERSION=value
  214. elif (option=="--rpmrelease"): RPMRELEASE=value
  215. elif (option=="--git-commit"): GIT_COMMIT=value
  216. elif (option=="--p3dsuffix"): P3DSUFFIX=value
  217. elif (option=="--rtdist-version"): RTDIST_VERSION=value
  218. # Backward compatibility, OPENGL was renamed to GL
  219. elif (option=="--use-opengl"): PkgEnable("GL")
  220. elif (option=="--no-opengl"): PkgDisable("GL")
  221. elif (option=="--no-directscripts"): pass
  222. elif (option=="--directx-sdk"):
  223. STRDXSDKVERSION = value.strip().lower()
  224. if STRDXSDKVERSION == '':
  225. print("No DirectX SDK version specified. Using 'default' DirectX SDK search")
  226. STRDXSDKVERSION = 'default'
  227. elif (option=="--windows-sdk"):
  228. WINDOWS_SDK = value.strip().lower()
  229. elif (option=="--msvc-version"):
  230. MSVC_VERSION = value.strip().lower()
  231. elif (option=="--use-icl"): BOOUSEINTELCOMPILER = True
  232. elif (option=="--clean"): clean_build = True
  233. else:
  234. for pkg in PkgListGet():
  235. if option == "--use-" + pkg.lower():
  236. PkgEnable(pkg)
  237. break
  238. elif option == "--no-" + pkg.lower():
  239. PkgDisable(pkg)
  240. break
  241. elif option == "--" + pkg.lower() + "-incdir":
  242. PkgSetCustomLocation(pkg)
  243. IncDirectory(pkg, value)
  244. break
  245. elif option == "--" + pkg.lower() + "-libdir":
  246. PkgSetCustomLocation(pkg)
  247. LibDirectory(pkg, value)
  248. break
  249. if (option == "--everything" or option.startswith("--use-")
  250. or option == "--nothing" or option.startswith("--no-")):
  251. anything = 1
  252. except:
  253. usage(sys.exc_info()[1])
  254. if not anything:
  255. if RUNTIME:
  256. PkgEnableAll()
  257. else:
  258. usage("You should specify a list of packages to use or --everything to enable all packages.")
  259. if (RTDIST and RUNTIME):
  260. usage("Options --runtime and --rtdist cannot be specified at the same time!")
  261. if (optimize=="" and (RTDIST or RUNTIME)): optimize = "4"
  262. elif (optimize==""): optimize = "3"
  263. if OSXTARGET:
  264. try:
  265. maj, min = OSXTARGET.strip().split('.')
  266. OSXTARGET = int(maj), int(min)
  267. assert OSXTARGET[0] == 10
  268. except:
  269. usage("Invalid setting for OSXTARGET")
  270. else:
  271. OSXTARGET = None
  272. if target is not None or target_arch is not None:
  273. SetTarget(target, target_arch)
  274. if universal:
  275. if target_arch:
  276. exit("--universal is incompatible with --arch")
  277. OSX_ARCHS.append("i386")
  278. if OSXTARGET:
  279. osxver = OSXTARGET
  280. else:
  281. maj, min = platform.mac_ver()[0].split('.')[:2]
  282. osxver = int(maj), int(min)
  283. if osxver[1] < 6:
  284. OSX_ARCHS.append("ppc")
  285. else:
  286. OSX_ARCHS.append("x86_64")
  287. elif HasTargetArch():
  288. OSX_ARCHS.append(GetTargetArch())
  289. try:
  290. SetOptimize(int(optimize))
  291. assert GetOptimize() in [1, 2, 3, 4]
  292. except:
  293. usage("Invalid setting for OPTIMIZE")
  294. if GIT_COMMIT is not None and not re.match("^[a-f0-9]{40}$", GIT_COMMIT):
  295. usage("Invalid SHA-1 hash given for --git-commit option!")
  296. if GetTarget() == 'windows':
  297. show_warning = False
  298. if not MSVC_VERSION:
  299. show_warning = True
  300. print("No MSVC version specified. Defaulting to 14 (Visual Studio 2015).")
  301. MSVC_VERSION = (14, 0)
  302. else:
  303. try:
  304. MSVC_VERSION = tuple(int(d) for d in MSVC_VERSION.split('.'))[:2]
  305. if (len(MSVC_VERSION) == 1):
  306. MSVC_VERSION += (0,)
  307. if MSVC_VERSION < (14, 0):
  308. show_warning = True
  309. except:
  310. usage("Invalid setting for --msvc-version")
  311. if show_warning:
  312. warn_prefix = "%sWARNING:%s " % (GetColor("red"), GetColor())
  313. print("=========================================================================")
  314. print(warn_prefix + "Support for MSVC versions before 2015 will soon be discontinued.")
  315. print(warn_prefix + "If you wish to keep using MSVC 2010, make your voice heard at:")
  316. print(warn_prefix + " https://github.com/panda3d/panda3d/issues/288")
  317. if MSVC_VERSION >= (14, 0):
  318. print(warn_prefix + "To squelch this warning, pass --msvc-version {0}.{1}".format(*MSVC_VERSION))
  319. print("=========================================================================")
  320. sys.stdout.flush()
  321. time.sleep(1.0)
  322. if not WINDOWS_SDK:
  323. print("No Windows SDK version specified. Defaulting to '7.1'.")
  324. WINDOWS_SDK = '7.1'
  325. if clean_build and os.path.isdir(GetOutputDir()):
  326. print("Deleting %s" % (GetOutputDir()))
  327. shutil.rmtree(GetOutputDir())
  328. parseopts(sys.argv[1:])
  329. ########################################################################
  330. ##
  331. ## Handle environment variables.
  332. ##
  333. ########################################################################
  334. if ("CFLAGS" in os.environ):
  335. CFLAGS = os.environ["CFLAGS"].strip()
  336. if ("CXXFLAGS" in os.environ):
  337. CXXFLAGS = os.environ["CXXFLAGS"].strip()
  338. if ("RPM_OPT_FLAGS" in os.environ):
  339. CFLAGS += " " + os.environ["RPM_OPT_FLAGS"].strip()
  340. CXXFLAGS += " " + os.environ["RPM_OPT_FLAGS"].strip()
  341. if ("LDFLAGS" in os.environ):
  342. LDFLAGS = os.environ["LDFLAGS"].strip()
  343. os.environ["MAKEPANDA"] = os.path.abspath(sys.argv[0])
  344. if GetHost() == "darwin" and OSXTARGET is not None:
  345. os.environ["MACOSX_DEPLOYMENT_TARGET"] = "%d.%d" % OSXTARGET
  346. ########################################################################
  347. ##
  348. ## Configure things based on the command-line parameters.
  349. ##
  350. ########################################################################
  351. PLUGIN_VERSION = ParsePluginVersion("dtool/PandaVersion.pp")
  352. COREAPI_VERSION = PLUGIN_VERSION + "." + ParseCoreapiVersion("dtool/PandaVersion.pp")
  353. if VERSION is None:
  354. if RUNTIME:
  355. VERSION = PLUGIN_VERSION
  356. else:
  357. # Take the value from the setup.cfg file.
  358. VERSION = GetMetadataValue('version')
  359. if WHLVERSION is None:
  360. WHLVERSION = VERSION
  361. print("Version: %s" % VERSION)
  362. if RUNTIME or RTDIST:
  363. print("Core API Version: %s" % COREAPI_VERSION)
  364. if DEBVERSION is None:
  365. DEBVERSION = VERSION
  366. MAJOR_VERSION = '.'.join(VERSION.split('.')[:2])
  367. if P3DSUFFIX is None:
  368. P3DSUFFIX = MAJOR_VERSION
  369. # Now determine the distutils-style platform tag for the target system.
  370. target = GetTarget()
  371. if target == 'windows':
  372. if GetTargetArch() == 'x64':
  373. PLATFORM = 'win-amd64'
  374. else:
  375. PLATFORM = 'win32'
  376. elif target == 'darwin':
  377. if OSXTARGET:
  378. osxver = OSXTARGET
  379. else:
  380. maj, min = platform.mac_ver()[0].split('.')[:2]
  381. osxver = int(maj), int(min)
  382. arch_tag = None
  383. if not OSX_ARCHS:
  384. arch_tag = GetTargetArch()
  385. elif len(OSX_ARCHS) == 1:
  386. arch_tag = OSX_ARCHS[0]
  387. elif frozenset(OSX_ARCHS) == frozenset(('i386', 'ppc')):
  388. arch_tag = 'fat'
  389. elif frozenset(OSX_ARCHS) == frozenset(('x86_64', 'i386')):
  390. arch_tag = 'intel'
  391. elif frozenset(OSX_ARCHS) == frozenset(('x86_64', 'ppc64')):
  392. arch_tag = 'fat64'
  393. elif frozenset(OSX_ARCHS) == frozenset(('x86_64', 'i386', 'ppc')):
  394. arch_tag = 'fat32'
  395. else:
  396. raise RuntimeError('No arch tag for arch combination %s' % OSX_ARCHS)
  397. PLATFORM = 'macosx-{0}.{1}-{2}'.format(osxver[0], osxver[1], arch_tag)
  398. elif target == 'linux' and os.path.isfile("/lib/libc-2.5.so") and os.path.isdir("/opt/python"):
  399. # This is manylinux1. A bit of a sloppy check, though.
  400. if GetTargetArch() in ('x86_64', 'amd64'):
  401. PLATFORM = 'manylinux1-x86_64'
  402. else:
  403. PLATFORM = 'manylinux1-i686'
  404. elif not CrossCompiling():
  405. if HasTargetArch():
  406. # Replace the architecture in the platform string.
  407. platform_parts = get_platform().rsplit('-', 1)
  408. target_arch = GetTargetArch()
  409. if target_arch == 'amd64':
  410. target_arch = 'x86_64'
  411. PLATFORM = platform_parts[0] + '-' + target_arch
  412. else:
  413. # We're not cross-compiling; just take the host arch.
  414. PLATFORM = get_platform()
  415. else:
  416. target_arch = GetTargetArch()
  417. if target_arch == 'amd64':
  418. target_arch = 'x86_64'
  419. PLATFORM = '{0}-{1}' % (target, target_arch)
  420. print("Platform: %s" % PLATFORM)
  421. outputdir_suffix = ""
  422. if (RUNTIME or RTDIST):
  423. # Compiling Maya/Max is pointless in rtdist build
  424. for ver in MAYAVERSIONS + MAXVERSIONS:
  425. PkgDisable(ver)
  426. if (DISTRIBUTOR.strip() == ""):
  427. exit("You must provide a valid distributor name when making a runtime or rtdist build!")
  428. outputdir_suffix += "_" + DISTRIBUTOR.strip()
  429. if (RUNTIME):
  430. outputdir_suffix += "_rt"
  431. if DISTRIBUTOR == "":
  432. DISTRIBUTOR = "makepanda"
  433. elif not RTDIST_VERSION:
  434. RTDIST_VERSION = DISTRIBUTOR.strip() + "_" + MAJOR_VERSION
  435. if not RTDIST_VERSION:
  436. RTDIST_VERSION = "dev"
  437. if not IsCustomOutputDir():
  438. if GetTarget() == "windows" and GetTargetArch() == 'x64':
  439. outputdir_suffix += '_x64'
  440. SetOutputDir("built" + outputdir_suffix)
  441. if (RUNTIME):
  442. for pkg in PkgListGet():
  443. if pkg in ["GTK2", "MFC"]:
  444. # Optional package(s) for runtime.
  445. pass
  446. elif pkg in ["OPENSSL", "ZLIB"]:
  447. # Required packages for runtime.
  448. if (PkgSkip(pkg)==1):
  449. exit("Runtime must be compiled with OpenSSL and ZLib support!")
  450. else:
  451. # Unused packages for runtime.
  452. PkgDisable(pkg)
  453. if (INSTALLER and RTDIST):
  454. exit("Cannot build an installer for the rtdist build!")
  455. if (WHEEL and RUNTIME):
  456. exit("Cannot build a wheel for the runtime build!")
  457. if (WHEEL and RTDIST):
  458. exit("Cannot build a wheel for the rtdist build!")
  459. if (INSTALLER) and (PkgSkip("PYTHON")) and (not RUNTIME) and GetTarget() == 'windows':
  460. exit("Cannot build installer on Windows without python")
  461. if WHEEL and PkgSkip("PYTHON"):
  462. exit("Cannot build wheel without Python")
  463. if (RTDIST) and (PkgSkip("WX") and PkgSkip("FLTK")):
  464. exit("Cannot build rtdist without wx or fltk")
  465. if (RUNTIME):
  466. SetLinkAllStatic(True)
  467. if not os.path.isdir("contrib"):
  468. PkgDisable("CONTRIB")
  469. ########################################################################
  470. ##
  471. ## Load the dependency cache.
  472. ##
  473. ########################################################################
  474. LoadDependencyCache()
  475. ########################################################################
  476. ##
  477. ## Locate various SDKs.
  478. ##
  479. ########################################################################
  480. MakeBuildTree()
  481. SdkLocateDirectX(STRDXSDKVERSION)
  482. SdkLocateMaya()
  483. SdkLocateMax()
  484. SdkLocateMacOSX(OSXTARGET)
  485. SdkLocatePython(RTDIST)
  486. SdkLocateWindows(WINDOWS_SDK)
  487. SdkLocatePhysX()
  488. SdkLocateSpeedTree()
  489. SdkLocateAndroid()
  490. SdkAutoDisableDirectX()
  491. SdkAutoDisableMaya()
  492. SdkAutoDisableMax()
  493. SdkAutoDisablePhysX()
  494. SdkAutoDisableSpeedTree()
  495. if RTDIST and DISTRIBUTOR == "cmu":
  496. # Some validation checks for the CMU builds.
  497. if (RTDIST_VERSION == "cmu_1.7" and SDK["PYTHONVERSION"] != "python2.6"):
  498. exit("The CMU 1.7 runtime distribution must be built against Python 2.6!")
  499. elif (RTDIST_VERSION == "cmu_1.8" and SDK["PYTHONVERSION"] != "python2.7"):
  500. exit("The CMU 1.8 runtime distribution must be built against Python 2.7!")
  501. elif (RTDIST_VERSION == "cmu_1.9" and SDK["PYTHONVERSION"] != "python2.7"):
  502. exit("The CMU 1.9 runtime distribution must be built against Python 2.7!")
  503. if RTDIST and not HOST_URL:
  504. exit("You must specify a host URL when building the rtdist!")
  505. if RUNTIME and not HOST_URL:
  506. # Set this to a nice default.
  507. HOST_URL = "https://runtime.panda3d.org/"
  508. ########################################################################
  509. ##
  510. ## Choose a Compiler.
  511. ##
  512. ## This should also set up any environment variables needed to make
  513. ## the compiler work.
  514. ##
  515. ########################################################################
  516. if GetHost() == 'windows' and GetTarget() == 'windows':
  517. COMPILER = "MSVC"
  518. SdkLocateVisualStudio(MSVC_VERSION)
  519. else:
  520. COMPILER = "GCC"
  521. SetupBuildEnvironment(COMPILER)
  522. ########################################################################
  523. ##
  524. ## External includes, external libraries, and external defsyms.
  525. ##
  526. ########################################################################
  527. IncDirectory("ALWAYS", GetOutputDir()+"/tmp")
  528. IncDirectory("ALWAYS", GetOutputDir()+"/include")
  529. if (COMPILER == "MSVC"):
  530. PkgDisable("X11")
  531. PkgDisable("GLES")
  532. PkgDisable("GLES2")
  533. PkgDisable("EGL")
  534. PkgDisable("CARBON")
  535. PkgDisable("COCOA")
  536. DefSymbol("FLEX", "YY_NO_UNISTD_H")
  537. if (PkgSkip("PYTHON")==0):
  538. IncDirectory("ALWAYS", SDK["PYTHON"] + "/include")
  539. LibDirectory("ALWAYS", SDK["PYTHON"] + "/libs")
  540. SmartPkgEnable("EIGEN", "eigen3", (), ("Eigen/Dense",), target_pkg = 'ALWAYS')
  541. for pkg in PkgListGet():
  542. if (PkgSkip(pkg)==0):
  543. if (pkg[:4]=="MAYA"):
  544. IncDirectory(pkg, SDK[pkg] + "/include")
  545. DefSymbol(pkg, "MAYAVERSION", pkg)
  546. DefSymbol(pkg, "MLIBRARY_DONTUSE_MFC_MANIFEST", "")
  547. elif (pkg[:3]=="MAX"):
  548. IncDirectory(pkg, SDK[pkg] + "/include")
  549. IncDirectory(pkg, SDK[pkg] + "/include/CS")
  550. IncDirectory(pkg, SDK[pkg+"CS"] + "/include")
  551. IncDirectory(pkg, SDK[pkg+"CS"] + "/include/CS")
  552. DefSymbol(pkg, "MAX", pkg)
  553. if (int(pkg[3:]) >= 2013):
  554. DefSymbol(pkg, "UNICODE", "")
  555. DefSymbol(pkg, "_UNICODE", "")
  556. elif (pkg[:2]=="DX"):
  557. IncDirectory(pkg, SDK[pkg] + "/include")
  558. elif GetThirdpartyDir() is not None:
  559. IncDirectory(pkg, GetThirdpartyDir() + pkg.lower() + "/include")
  560. for pkg in DXVERSIONS:
  561. if (PkgSkip(pkg)==0):
  562. vnum=pkg[2:]
  563. if GetTargetArch() == 'x64':
  564. LibDirectory(pkg, SDK[pkg] + '/lib/x64')
  565. else:
  566. LibDirectory(pkg, SDK[pkg] + '/lib/x86')
  567. LibDirectory(pkg, SDK[pkg] + '/lib')
  568. LibName(pkg, 'd3dVNUM.lib'.replace("VNUM", vnum))
  569. LibName(pkg, 'd3dxVNUM.lib'.replace("VNUM", vnum))
  570. if int(vnum) >= 9 and "GENERIC_DXERR_LIBRARY" in SDK:
  571. LibName(pkg, 'dxerr.lib')
  572. else:
  573. LibName(pkg, 'dxerrVNUM.lib'.replace("VNUM", vnum))
  574. #LibName(pkg, 'ddraw.lib')
  575. LibName(pkg, 'dxguid.lib')
  576. if SDK.get("VISUALSTUDIO_VERSION") >= (14,0):
  577. # dxerr needs this for __vsnwprintf definition.
  578. LibName(pkg, 'legacy_stdio_definitions.lib')
  579. if not PkgSkip("FREETYPE") and os.path.isdir(GetThirdpartyDir() + "freetype/include/freetype2"):
  580. IncDirectory("FREETYPE", GetThirdpartyDir() + "freetype/include/freetype2")
  581. IncDirectory("ALWAYS", GetThirdpartyDir() + "extras/include")
  582. LibName("WINSOCK", "wsock32.lib")
  583. LibName("WINSOCK2", "wsock32.lib")
  584. LibName("WINSOCK2", "ws2_32.lib")
  585. LibName("WINCOMCTL", "comctl32.lib")
  586. LibName("WINCOMDLG", "comdlg32.lib")
  587. LibName("WINUSER", "user32.lib")
  588. LibName("WINMM", "winmm.lib")
  589. LibName("WINIMM", "imm32.lib")
  590. LibName("WINKERNEL", "kernel32.lib")
  591. LibName("WINOLE", "ole32.lib")
  592. LibName("WINOLEAUT", "oleaut32.lib")
  593. LibName("WINOLDNAMES", "oldnames.lib")
  594. LibName("WINSHELL", "shell32.lib")
  595. LibName("WINGDI", "gdi32.lib")
  596. LibName("ADVAPI", "advapi32.lib")
  597. LibName("IPHLPAPI", "iphlpapi.lib")
  598. LibName("GL", "opengl32.lib")
  599. LibName("GLES", "libgles_cm.lib")
  600. LibName("GLES2", "libGLESv2.lib")
  601. LibName("EGL", "libEGL.lib")
  602. LibName("MSIMG", "msimg32.lib")
  603. if (PkgSkip("DIRECTCAM")==0): LibName("DIRECTCAM", "strmiids.lib")
  604. if (PkgSkip("DIRECTCAM")==0): LibName("DIRECTCAM", "quartz.lib")
  605. if (PkgSkip("DIRECTCAM")==0): LibName("DIRECTCAM", "odbc32.lib")
  606. if (PkgSkip("DIRECTCAM")==0): LibName("DIRECTCAM", "odbccp32.lib")
  607. if (PkgSkip("OPENSSL")==0):
  608. if os.path.isfile(GetThirdpartyDir() + "openssl/lib/libpandassl.lib"):
  609. LibName("OPENSSL", GetThirdpartyDir() + "openssl/lib/libpandassl.lib")
  610. LibName("OPENSSL", GetThirdpartyDir() + "openssl/lib/libpandaeay.lib")
  611. else:
  612. LibName("OPENSSL", GetThirdpartyDir() + "openssl/lib/libeay32.lib")
  613. LibName("OPENSSL", GetThirdpartyDir() + "openssl/lib/ssleay32.lib")
  614. if (PkgSkip("PNG")==0):
  615. if os.path.isfile(GetThirdpartyDir() + "png/lib/libpng16_static.lib"):
  616. LibName("PNG", GetThirdpartyDir() + "png/lib/libpng16_static.lib")
  617. else:
  618. LibName("PNG", GetThirdpartyDir() + "png/lib/libpng_static.lib")
  619. if (PkgSkip("TIFF")==0):
  620. if os.path.isfile(GetThirdpartyDir() + "tiff/lib/libtiff.lib"):
  621. LibName("TIFF", GetThirdpartyDir() + "tiff/lib/libtiff.lib")
  622. else:
  623. LibName("TIFF", GetThirdpartyDir() + "tiff/lib/tiff.lib")
  624. if (PkgSkip("OPENEXR")==0):
  625. suffix = ""
  626. if os.path.isfile(GetThirdpartyDir() + "openexr/lib/IlmImf-2_2.lib"):
  627. suffix = "-2_2"
  628. LibName("OPENEXR", GetThirdpartyDir() + "openexr/lib/IlmImf" + suffix + ".lib")
  629. LibName("OPENEXR", GetThirdpartyDir() + "openexr/lib/IlmThread" + suffix + ".lib")
  630. LibName("OPENEXR", GetThirdpartyDir() + "openexr/lib/Iex" + suffix + ".lib")
  631. LibName("OPENEXR", GetThirdpartyDir() + "openexr/lib/Half.lib")
  632. IncDirectory("OPENEXR", GetThirdpartyDir() + "openexr/include/OpenEXR")
  633. if (PkgSkip("JPEG")==0): LibName("JPEG", GetThirdpartyDir() + "jpeg/lib/jpeg-static.lib")
  634. if (PkgSkip("ZLIB")==0): LibName("ZLIB", GetThirdpartyDir() + "zlib/lib/zlibstatic.lib")
  635. if (PkgSkip("VRPN")==0): LibName("VRPN", GetThirdpartyDir() + "vrpn/lib/vrpn.lib")
  636. if (PkgSkip("VRPN")==0): LibName("VRPN", GetThirdpartyDir() + "vrpn/lib/quat.lib")
  637. if (PkgSkip("NVIDIACG")==0): LibName("CGGL", GetThirdpartyDir() + "nvidiacg/lib/cgGL.lib")
  638. if (PkgSkip("NVIDIACG")==0): LibName("CGDX9", GetThirdpartyDir() + "nvidiacg/lib/cgD3D9.lib")
  639. if (PkgSkip("NVIDIACG")==0): LibName("NVIDIACG", GetThirdpartyDir() + "nvidiacg/lib/cg.lib")
  640. if (PkgSkip("FREETYPE")==0): LibName("FREETYPE", GetThirdpartyDir() + "freetype/lib/freetype.lib")
  641. if (PkgSkip("HARFBUZZ")==0):
  642. LibName("HARFBUZZ", GetThirdpartyDir() + "harfbuzz/lib/harfbuzz.lib")
  643. IncDirectory("HARFBUZZ", GetThirdpartyDir() + "harfbuzz/include/harfbuzz")
  644. if (PkgSkip("FFTW")==0): LibName("FFTW", GetThirdpartyDir() + "fftw/lib/fftw3.lib")
  645. if (PkgSkip("ARTOOLKIT")==0):LibName("ARTOOLKIT",GetThirdpartyDir() + "artoolkit/lib/libAR.lib")
  646. if (PkgSkip("OPENCV")==0): LibName("OPENCV", GetThirdpartyDir() + "opencv/lib/cv.lib")
  647. if (PkgSkip("OPENCV")==0): LibName("OPENCV", GetThirdpartyDir() + "opencv/lib/highgui.lib")
  648. if (PkgSkip("OPENCV")==0): LibName("OPENCV", GetThirdpartyDir() + "opencv/lib/cvaux.lib")
  649. if (PkgSkip("OPENCV")==0): LibName("OPENCV", GetThirdpartyDir() + "opencv/lib/ml.lib")
  650. if (PkgSkip("OPENCV")==0): LibName("OPENCV", GetThirdpartyDir() + "opencv/lib/cxcore.lib")
  651. if (PkgSkip("AWESOMIUM")==0):LibName("AWESOMIUM",GetThirdpartyDir() + "awesomium/lib/Awesomium.lib")
  652. if (PkgSkip("FFMPEG")==0): LibName("FFMPEG", GetThirdpartyDir() + "ffmpeg/lib/avcodec.lib")
  653. if (PkgSkip("FFMPEG")==0): LibName("FFMPEG", GetThirdpartyDir() + "ffmpeg/lib/avformat.lib")
  654. if (PkgSkip("FFMPEG")==0): LibName("FFMPEG", GetThirdpartyDir() + "ffmpeg/lib/avutil.lib")
  655. if (PkgSkip("SWSCALE")==0): LibName("SWSCALE", GetThirdpartyDir() + "ffmpeg/lib/swscale.lib")
  656. if (PkgSkip("SWRESAMPLE")==0):LibName("SWRESAMPLE",GetThirdpartyDir() + "ffmpeg/lib/swresample.lib")
  657. if (PkgSkip("FCOLLADA")==0):
  658. LibName("FCOLLADA", GetThirdpartyDir() + "fcollada/lib/FCollada.lib")
  659. IncDirectory("FCOLLADA", GetThirdpartyDir() + "fcollada/include/FCollada")
  660. if (PkgSkip("ASSIMP")==0):
  661. LibName("ASSIMP", GetThirdpartyDir() + "assimp/lib/assimp.lib")
  662. IncDirectory("ASSIMP", GetThirdpartyDir() + "assimp/include/assimp")
  663. if (PkgSkip("SQUISH")==0):
  664. if GetOptimize() <= 2:
  665. LibName("SQUISH", GetThirdpartyDir() + "squish/lib/squishd.lib")
  666. else:
  667. LibName("SQUISH", GetThirdpartyDir() + "squish/lib/squish.lib")
  668. if (PkgSkip("ROCKET")==0):
  669. LibName("ROCKET", GetThirdpartyDir() + "rocket/lib/RocketCore.lib")
  670. LibName("ROCKET", GetThirdpartyDir() + "rocket/lib/RocketControls.lib")
  671. if (PkgSkip("PYTHON")==0):
  672. LibName("ROCKET", GetThirdpartyDir() + "rocket/lib/" + SDK["PYTHONVERSION"] + "/boost_python-vc100-mt-1_54.lib")
  673. if (GetOptimize() <= 3):
  674. LibName("ROCKET", GetThirdpartyDir() + "rocket/lib/RocketDebugger.lib")
  675. if (PkgSkip("OPENAL")==0):
  676. LibName("OPENAL", GetThirdpartyDir() + "openal/lib/OpenAL32.lib")
  677. if not os.path.isfile(GetThirdpartyDir() + "openal/bin/OpenAL32.dll"):
  678. # Link OpenAL Soft statically.
  679. DefSymbol("OPENAL", "AL_LIBTYPE_STATIC")
  680. if (PkgSkip("ODE")==0):
  681. LibName("ODE", GetThirdpartyDir() + "ode/lib/ode_single.lib")
  682. DefSymbol("ODE", "dSINGLE", "")
  683. if (PkgSkip("FMODEX")==0):
  684. if (GetTargetArch() == 'x64'):
  685. LibName("FMODEX", GetThirdpartyDir() + "fmodex/lib/fmodex64_vc.lib")
  686. else:
  687. LibName("FMODEX", GetThirdpartyDir() + "fmodex/lib/fmodex_vc.lib")
  688. if (PkgSkip("FLTK")==0 and RTDIST):
  689. LibName("FLTK", GetThirdpartyDir() + "fltk/lib/fltk.lib")
  690. if not PkgSkip("FLTK"):
  691. # If we have fltk, we don't need wx
  692. PkgDisable("WX")
  693. if (PkgSkip("WX")==0 and RTDIST):
  694. LibName("WX", GetThirdpartyDir() + "wx/lib/wxbase28u.lib")
  695. LibName("WX", GetThirdpartyDir() + "wx/lib/wxmsw28u_core.lib")
  696. DefSymbol("WX", "__WXMSW__", "")
  697. DefSymbol("WX", "_UNICODE", "")
  698. DefSymbol("WX", "UNICODE", "")
  699. if (PkgSkip("VORBIS")==0):
  700. for lib in ('ogg', 'vorbis', 'vorbisfile'):
  701. path = GetThirdpartyDir() + "vorbis/lib/lib{0}_static.lib".format(lib)
  702. if not os.path.isfile(path):
  703. path = GetThirdpartyDir() + "vorbis/lib/{0}.lib".format(lib)
  704. LibName("VORBIS", path)
  705. if (PkgSkip("OPUS")==0):
  706. LibName("OPUS", GetThirdpartyDir() + "opus/lib/libogg_static.lib")
  707. LibName("OPUS", GetThirdpartyDir() + "opus/lib/libopus_static.lib")
  708. LibName("OPUS", GetThirdpartyDir() + "opus/lib/libopusfile_static.lib")
  709. for pkg in MAYAVERSIONS:
  710. if (PkgSkip(pkg)==0):
  711. LibName(pkg, '"' + SDK[pkg] + '/lib/Foundation.lib"')
  712. LibName(pkg, '"' + SDK[pkg] + '/lib/OpenMaya.lib"')
  713. LibName(pkg, '"' + SDK[pkg] + '/lib/OpenMayaAnim.lib"')
  714. LibName(pkg, '"' + SDK[pkg] + '/lib/OpenMayaUI.lib"')
  715. for pkg in MAXVERSIONS:
  716. if (PkgSkip(pkg)==0):
  717. LibName(pkg, SDK[pkg] + '/lib/core.lib')
  718. LibName(pkg, SDK[pkg] + '/lib/edmodel.lib')
  719. LibName(pkg, SDK[pkg] + '/lib/gfx.lib')
  720. LibName(pkg, SDK[pkg] + '/lib/geom.lib')
  721. LibName(pkg, SDK[pkg] + '/lib/mesh.lib')
  722. LibName(pkg, SDK[pkg] + '/lib/maxutil.lib')
  723. LibName(pkg, SDK[pkg] + '/lib/paramblk2.lib')
  724. if (PkgSkip("PHYSX")==0):
  725. if GetTargetArch() == 'x64':
  726. LibName("PHYSX", SDK["PHYSXLIBS"] + "/PhysXLoader64.lib")
  727. LibName("PHYSX", SDK["PHYSXLIBS"] + "/NxCharacter64.lib")
  728. else:
  729. LibName("PHYSX", SDK["PHYSXLIBS"] + "/PhysXLoader.lib")
  730. LibName("PHYSX", SDK["PHYSXLIBS"] + "/NxCharacter.lib")
  731. IncDirectory("PHYSX", SDK["PHYSX"] + "/Physics/include")
  732. IncDirectory("PHYSX", SDK["PHYSX"] + "/PhysXLoader/include")
  733. IncDirectory("PHYSX", SDK["PHYSX"] + "/NxCharacter/include")
  734. IncDirectory("PHYSX", SDK["PHYSX"] + "/NxExtensions/include")
  735. IncDirectory("PHYSX", SDK["PHYSX"] + "/Foundation/include")
  736. IncDirectory("PHYSX", SDK["PHYSX"] + "/Cooking/include")
  737. if (PkgSkip("SPEEDTREE")==0):
  738. if GetTargetArch() == 'x64':
  739. libdir = SDK["SPEEDTREE"] + "/Lib/Windows/VC10.x64/"
  740. p64ext = '64'
  741. else:
  742. libdir = SDK["SPEEDTREE"] + "/Lib/Windows/VC10/"
  743. p64ext = ''
  744. debugext = ''
  745. if (GetOptimize() <= 2): debugext = "_d"
  746. libsuffix = "_v%s_VC100MT%s_Static%s.lib" % (
  747. SDK["SPEEDTREEVERSION"], p64ext, debugext)
  748. LibName("SPEEDTREE", "%sSpeedTreeCore%s" % (libdir, libsuffix))
  749. LibName("SPEEDTREE", "%sSpeedTreeForest%s" % (libdir, libsuffix))
  750. LibName("SPEEDTREE", "%sSpeedTree%sRenderer%s" % (libdir, SDK["SPEEDTREEAPI"], libsuffix))
  751. LibName("SPEEDTREE", "%sSpeedTreeRenderInterface%s" % (libdir, libsuffix))
  752. if (SDK["SPEEDTREEAPI"] == "OpenGL"):
  753. LibName("SPEEDTREE", "%sglew32.lib" % (libdir))
  754. LibName("SPEEDTREE", "glu32.lib")
  755. IncDirectory("SPEEDTREE", SDK["SPEEDTREE"] + "/Include")
  756. if (PkgSkip("BULLET")==0):
  757. suffix = '.lib'
  758. if GetTargetArch() == 'x64' and os.path.isfile(GetThirdpartyDir() + "bullet/lib/BulletCollision_x64.lib"):
  759. suffix = '_x64.lib'
  760. LibName("BULLET", GetThirdpartyDir() + "bullet/lib/LinearMath" + suffix)
  761. LibName("BULLET", GetThirdpartyDir() + "bullet/lib/BulletCollision" + suffix)
  762. LibName("BULLET", GetThirdpartyDir() + "bullet/lib/BulletDynamics" + suffix)
  763. LibName("BULLET", GetThirdpartyDir() + "bullet/lib/BulletSoftBody" + suffix)
  764. if (COMPILER=="GCC"):
  765. PkgDisable("AWESOMIUM")
  766. if GetTarget() != "darwin":
  767. PkgDisable("CARBON")
  768. PkgDisable("COCOA")
  769. elif RUNTIME:
  770. # We don't support Cocoa in the runtime yet.
  771. PkgDisable("COCOA")
  772. if 'x86_64' in OSX_ARCHS:
  773. # 64-bits OS X doesn't have Carbon.
  774. PkgDisable("CARBON")
  775. #if (PkgSkip("PYTHON")==0):
  776. # IncDirectory("PYTHON", SDK["PYTHON"])
  777. if (GetHost() == "darwin"):
  778. if (PkgSkip("FREETYPE")==0 and not os.path.isdir(GetThirdpartyDir() + 'freetype')):
  779. IncDirectory("FREETYPE", "/usr/X11/include")
  780. IncDirectory("FREETYPE", "/usr/X11/include/freetype2")
  781. LibDirectory("FREETYPE", "/usr/X11/lib")
  782. if (GetHost() == "freebsd"):
  783. IncDirectory("ALWAYS", "/usr/local/include")
  784. LibDirectory("ALWAYS", "/usr/local/lib")
  785. if (os.path.isdir("/usr/PCBSD")):
  786. IncDirectory("ALWAYS", "/usr/PCBSD/local/include")
  787. LibDirectory("ALWAYS", "/usr/PCBSD/local/lib")
  788. if GetTarget() != "windows":
  789. PkgDisable("DIRECTCAM")
  790. fcollada_libs = ("FColladaD", "FColladaSD", "FColladaS")
  791. # WARNING! The order of the ffmpeg libraries matters!
  792. ffmpeg_libs = ("libavformat", "libavcodec", "libavutil")
  793. # Name pkg-config libs, include(dir)s
  794. if (not RUNTIME):
  795. SmartPkgEnable("EIGEN", "eigen3", (), ("Eigen/Dense",), target_pkg = 'ALWAYS')
  796. SmartPkgEnable("ARTOOLKIT", "", ("AR"), "AR/ar.h")
  797. SmartPkgEnable("FCOLLADA", "", ChooseLib(fcollada_libs, "FCOLLADA"), ("FCollada", "FCollada/FCollada.h"))
  798. SmartPkgEnable("ASSIMP", "", ("assimp"), "assimp")
  799. SmartPkgEnable("FFMPEG", ffmpeg_libs, ffmpeg_libs, ("libavformat/avformat.h", "libavcodec/avcodec.h", "libavutil/avutil.h"))
  800. SmartPkgEnable("SWSCALE", "libswscale", "libswscale", ("libswscale/swscale.h"), target_pkg = "FFMPEG", thirdparty_dir = "ffmpeg")
  801. SmartPkgEnable("SWRESAMPLE","libswresample", "libswresample", ("libswresample/swresample.h"), target_pkg = "FFMPEG", thirdparty_dir = "ffmpeg")
  802. SmartPkgEnable("FFTW", "", ("fftw3"), ("fftw.h"))
  803. SmartPkgEnable("FMODEX", "", ("fmodex"), ("fmodex", "fmodex/fmod.h"))
  804. SmartPkgEnable("FREETYPE", "freetype2", ("freetype"), ("freetype2", "freetype2/freetype/freetype.h"))
  805. SmartPkgEnable("HARFBUZZ", "harfbuzz", ("harfbuzz"), ("harfbuzz", "harfbuzz/hb-ft.h"))
  806. SmartPkgEnable("GL", "gl", ("GL"), ("GL/gl.h"), framework = "OpenGL")
  807. SmartPkgEnable("GLES", "glesv1_cm", ("GLESv1_CM"), ("GLES/gl.h"), framework = "OpenGLES")
  808. SmartPkgEnable("GLES2", "glesv2", ("GLESv2"), ("GLES2/gl2.h")) #framework = "OpenGLES"?
  809. SmartPkgEnable("EGL", "egl", ("EGL"), ("EGL/egl.h"))
  810. SmartPkgEnable("NVIDIACG", "", ("Cg"), "Cg/cg.h", framework = "Cg")
  811. SmartPkgEnable("ODE", "", ("ode"), "ode/ode.h", tool = "ode-config")
  812. SmartPkgEnable("OPENAL", "openal", ("openal"), "AL/al.h", framework = "OpenAL")
  813. SmartPkgEnable("SQUISH", "", ("squish"), "squish.h")
  814. SmartPkgEnable("TIFF", "libtiff-4", ("tiff"), "tiff.h")
  815. SmartPkgEnable("OPENEXR", "OpenEXR", ("IlmImf", "Imath", "Half", "Iex", "IexMath", "IlmThread"), ("OpenEXR", "OpenEXR/ImfOutputFile.h"))
  816. SmartPkgEnable("VRPN", "", ("vrpn", "quat"), ("vrpn", "quat.h", "vrpn/vrpn_Types.h"))
  817. SmartPkgEnable("BULLET", "bullet", ("BulletSoftBody", "BulletDynamics", "BulletCollision", "LinearMath"), ("bullet", "bullet/btBulletDynamicsCommon.h"))
  818. SmartPkgEnable("VORBIS", "vorbisfile",("vorbisfile", "vorbis", "ogg"), ("ogg/ogg.h", "vorbis/vorbisfile.h"))
  819. SmartPkgEnable("OPUS", "opusfile", ("opusfile", "opus", "ogg"), ("ogg/ogg.h", "opus/opusfile.h", "opus"))
  820. SmartPkgEnable("JPEG", "", ("jpeg"), "jpeglib.h")
  821. SmartPkgEnable("PNG", "libpng", ("png"), "png.h", tool = "libpng-config")
  822. if not PkgSkip("FFMPEG"):
  823. if GetTarget() == "darwin":
  824. LibName("FFMPEG", "-Wl,-read_only_relocs,suppress")
  825. LibName("FFMPEG", "-framework VideoDecodeAcceleration")
  826. elif os.path.isfile(GetThirdpartyDir() + "ffmpeg/lib/libavcodec.a"):
  827. # Needed when linking ffmpeg statically on Linux.
  828. LibName("FFMPEG", "-Wl,-Bsymbolic")
  829. if PkgSkip("FFMPEG") or GetTarget() == "darwin":
  830. cv_lib = ChooseLib(("opencv_core", "cv"), "OPENCV")
  831. if cv_lib == "opencv_core":
  832. OPENCV_VER_23 = True
  833. SmartPkgEnable("OPENCV", "opencv", ("opencv_core", "opencv_highgui"), ("opencv2/core/core.hpp"))
  834. else:
  835. SmartPkgEnable("OPENCV", "opencv", ("cv", "highgui", "cvaux", "ml", "cxcore"),
  836. ("opencv", "opencv/cv.h", "opencv/cxcore.h", "opencv/highgui.h"))
  837. else:
  838. PkgDisable("OPENCV")
  839. rocket_libs = ("RocketCore", "RocketControls")
  840. if (GetOptimize() <= 3):
  841. rocket_libs += ("RocketDebugger",)
  842. rocket_libs += ("boost_python",)
  843. SmartPkgEnable("ROCKET", "", rocket_libs, "Rocket/Core.h")
  844. if not PkgSkip("PYTHON"):
  845. python_lib = SDK["PYTHONVERSION"]
  846. SmartPkgEnable("PYTHON", "", python_lib, (SDK["PYTHONVERSION"], SDK["PYTHONVERSION"] + "/Python.h"))
  847. if GetTarget() == "linux":
  848. LibName("PYTHON", "-lutil")
  849. LibName("PYTHON", "-lrt")
  850. SmartPkgEnable("OPENSSL", "openssl", ("ssl", "crypto"), ("openssl/ssl.h", "openssl/crypto.h"))
  851. SmartPkgEnable("ZLIB", "zlib", ("z"), "zlib.h")
  852. SmartPkgEnable("GTK2", "gtk+-2.0")
  853. if (RTDIST):
  854. SmartPkgEnable("WX", tool = "wx-config")
  855. SmartPkgEnable("FLTK", "", ("fltk"), ("FL/Fl.H"), tool = "fltk-config")
  856. if GetTarget() != 'darwin':
  857. # CgGL is covered by the Cg framework, and we don't need X11 components on OSX
  858. if not PkgSkip("NVIDIACG") and not RUNTIME:
  859. SmartPkgEnable("CGGL", "", ("CgGL"), "Cg/cgGL.h", thirdparty_dir = "nvidiacg")
  860. if not RUNTIME:
  861. SmartPkgEnable("X11", "x11", "X11", ("X11", "X11/Xlib.h", "X11/XKBlib.h"))
  862. if GetHost() != "darwin":
  863. # Workaround for an issue where pkg-config does not include this path
  864. if GetTargetArch() in ("x86_64", "amd64"):
  865. if (os.path.isdir("/usr/lib64/glib-2.0/include")):
  866. IncDirectory("GTK2", "/usr/lib64/glib-2.0/include")
  867. if (os.path.isdir("/usr/lib64/gtk-2.0/include")):
  868. IncDirectory("GTK2", "/usr/lib64/gtk-2.0/include")
  869. if not PkgSkip("X11"):
  870. if (os.path.isdir("/usr/X11R6/lib64")):
  871. LibDirectory("ALWAYS", "/usr/X11R6/lib64")
  872. else:
  873. LibDirectory("ALWAYS", "/usr/X11R6/lib")
  874. elif not PkgSkip("X11"):
  875. LibDirectory("ALWAYS", "/usr/X11R6/lib")
  876. if RUNTIME:
  877. # For the runtime, these packages are required
  878. for pkg in ["OPENSSL", "ZLIB"]:
  879. skips = []
  880. if (pkg in PkgListGet() and PkgSkip(pkg)==1):
  881. skips.append(pkg)
  882. if skips:
  883. exit("Runtime must be compiled with OpenSSL and ZLib support (missing %s)" % (', '.join(skips)))
  884. for pkg in MAYAVERSIONS:
  885. if (PkgSkip(pkg)==0 and (pkg in SDK)):
  886. if (GetHost() == "darwin"):
  887. # Sheesh, Autodesk really can't make up their mind
  888. # regarding the location of the Maya devkit on OS X.
  889. if (os.path.isdir(SDK[pkg] + "/Maya.app/Contents/lib")):
  890. LibDirectory(pkg, SDK[pkg] + "/Maya.app/Contents/lib")
  891. if (os.path.isdir(SDK[pkg] + "/Maya.app/Contents/MacOS")):
  892. LibDirectory(pkg, SDK[pkg] + "/Maya.app/Contents/MacOS")
  893. if (os.path.isdir(SDK[pkg] + "/lib")):
  894. LibDirectory(pkg, SDK[pkg] + "/lib")
  895. if (os.path.isdir(SDK[pkg] + "/Maya.app/Contents/include/maya")):
  896. IncDirectory(pkg, SDK[pkg] + "/Maya.app/Contents/include")
  897. if (os.path.isdir(SDK[pkg] + "/devkit/include/maya")):
  898. IncDirectory(pkg, SDK[pkg] + "/devkit/include")
  899. if (os.path.isdir(SDK[pkg] + "/include/maya")):
  900. IncDirectory(pkg, SDK[pkg] + "/include")
  901. else:
  902. LibDirectory(pkg, SDK[pkg] + "/lib")
  903. IncDirectory(pkg, SDK[pkg] + "/include")
  904. DefSymbol(pkg, "MAYAVERSION", pkg)
  905. if GetTarget() == 'darwin':
  906. LibName("ALWAYS", "-framework AppKit")
  907. if (PkgSkip("OPENCV")==0):
  908. LibName("OPENCV", "-framework QuickTime")
  909. LibName("AGL", "-framework AGL")
  910. LibName("CARBON", "-framework Carbon")
  911. LibName("COCOA", "-framework Cocoa")
  912. # Fix for a bug in OSX Leopard:
  913. LibName("GL", "-dylib_file /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib:/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib")
  914. if GetTarget() == 'android':
  915. LibName("ALWAYS", '-llog')
  916. LibName("ANDROID", '-landroid')
  917. LibName("JNIGRAPHICS", '-ljnigraphics')
  918. for pkg in MAYAVERSIONS:
  919. if (PkgSkip(pkg)==0 and (pkg in SDK)):
  920. if GetTarget() == 'darwin':
  921. LibName(pkg, "-Wl,-rpath," + SDK[pkg] + "/Maya.app/Contents/MacOS")
  922. else:
  923. LibName(pkg, "-Wl,-rpath," + SDK[pkg] + "/lib")
  924. LibName(pkg, "-lOpenMaya")
  925. LibName(pkg, "-lOpenMayaAnim")
  926. LibName(pkg, "-lAnimSlice")
  927. LibName(pkg, "-lDeformSlice")
  928. LibName(pkg, "-lModifiers")
  929. LibName(pkg, "-lDynSlice")
  930. LibName(pkg, "-lKinSlice")
  931. LibName(pkg, "-lModelSlice")
  932. LibName(pkg, "-lNurbsSlice")
  933. LibName(pkg, "-lPolySlice")
  934. LibName(pkg, "-lProjectSlice")
  935. LibName(pkg, "-lImage")
  936. LibName(pkg, "-lShared")
  937. LibName(pkg, "-lTranslators")
  938. LibName(pkg, "-lDataModel")
  939. LibName(pkg, "-lRenderModel")
  940. LibName(pkg, "-lNurbsEngine")
  941. LibName(pkg, "-lDependEngine")
  942. LibName(pkg, "-lCommandEngine")
  943. LibName(pkg, "-lFoundation")
  944. LibName(pkg, "-lIMFbase")
  945. if GetTarget() != 'darwin':
  946. LibName(pkg, "-lOpenMayalib")
  947. else:
  948. LibName(pkg, "-dylib_file /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib:/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib")
  949. if (PkgSkip("PHYSX")==0):
  950. IncDirectory("PHYSX", SDK["PHYSX"] + "/Physics/include")
  951. IncDirectory("PHYSX", SDK["PHYSX"] + "/PhysXLoader/include")
  952. IncDirectory("PHYSX", SDK["PHYSX"] + "/NxCharacter/include")
  953. IncDirectory("PHYSX", SDK["PHYSX"] + "/NxExtensions/include")
  954. IncDirectory("PHYSX", SDK["PHYSX"] + "/Foundation/include")
  955. IncDirectory("PHYSX", SDK["PHYSX"] + "/Cooking/include")
  956. LibDirectory("PHYSX", SDK["PHYSXLIBS"])
  957. if (GetHost() == "darwin"):
  958. LibName("PHYSX", SDK["PHYSXLIBS"] + "/osxstatic/PhysXCooking.a")
  959. LibName("PHYSX", SDK["PHYSXLIBS"] + "/osxstatic/PhysXCore.a")
  960. else:
  961. LibName("PHYSX", "-lPhysXLoader")
  962. LibName("PHYSX", "-lNxCharacter")
  963. DefSymbol("WITHINPANDA", "WITHIN_PANDA", "1")
  964. if GetLinkAllStatic():
  965. DefSymbol("ALWAYS", "LINK_ALL_STATIC")
  966. if GetTarget() == 'android':
  967. DefSymbol("ALWAYS", "ANDROID")
  968. if not PkgSkip("EIGEN"):
  969. if GetOptimize() >= 3:
  970. if COMPILER == "MSVC":
  971. # Squeeze out a bit more performance on MSVC builds...
  972. # Only do this if EIGEN_NO_DEBUG is also set, otherwise it
  973. # will turn them into runtime assertions.
  974. DefSymbol("ALWAYS", "EIGEN_NO_STATIC_ASSERT")
  975. ########################################################################
  976. ##
  977. ## Give a Status Report on Command-Line Options
  978. ##
  979. ########################################################################
  980. def printStatus(header,warnings):
  981. if GetVerbose():
  982. print("")
  983. print("-------------------------------------------------------------------")
  984. print(header)
  985. tkeep = ""
  986. tomit = ""
  987. for x in PkgListGet():
  988. if PkgSkip(x):
  989. tomit = tomit + x + " "
  990. else:
  991. tkeep = tkeep + x + " "
  992. if RTDIST:
  993. print("Makepanda: Runtime distribution build")
  994. elif RUNTIME:
  995. print("Makepanda: Runtime build")
  996. else:
  997. print("Makepanda: Regular build")
  998. print("Makepanda: Compiler: %s" % (COMPILER))
  999. print("Makepanda: Optimize: %d" % (GetOptimize()))
  1000. print("Makepanda: Keep Pkg: %s" % (tkeep))
  1001. print("Makepanda: Omit Pkg: %s" % (tomit))
  1002. if GENMAN:
  1003. print("Makepanda: Generate API reference manual")
  1004. else:
  1005. print("Makepanda: Don't generate API reference manual")
  1006. if GetHost() == "windows" and not RTDIST:
  1007. if INSTALLER:
  1008. print("Makepanda: Build installer, using %s" % (COMPRESSOR))
  1009. else:
  1010. print("Makepanda: Don't build installer")
  1011. print("Makepanda: Version ID: %s" % (VERSION))
  1012. for x in warnings:
  1013. print("Makepanda: %s" % (x))
  1014. print("-------------------------------------------------------------------")
  1015. print("")
  1016. sys.stdout.flush()
  1017. ########################################################################
  1018. ##
  1019. ## BracketNameWithQuotes
  1020. ##
  1021. ########################################################################
  1022. def BracketNameWithQuotes(name):
  1023. # Workaround for OSX bug - compiler doesn't like those flags quoted.
  1024. if (name.startswith("-framework")): return name
  1025. if (name.startswith("-dylib_file")): return name
  1026. # Don't add quotes when it's not necessary.
  1027. if " " not in name: return name
  1028. # Account for quoted name (leave as is) but quote everything else (e.g., to protect spaces within paths from improper parsing)
  1029. if (name.startswith('"') and name.endswith('"')): return name
  1030. else: return '"' + name + '"'
  1031. ########################################################################
  1032. ##
  1033. ## CompileCxx
  1034. ##
  1035. ########################################################################
  1036. def CompileCxx(obj,src,opts):
  1037. ipath = GetListOption(opts, "DIR:")
  1038. optlevel = GetOptimizeOption(opts)
  1039. if (COMPILER=="MSVC"):
  1040. if not BOOUSEINTELCOMPILER:
  1041. cmd = "cl "
  1042. if GetTargetArch() == 'x64':
  1043. cmd += "/favor:blend "
  1044. cmd += "/wd4996 /wd4275 /wd4273 "
  1045. # We still target Windows XP.
  1046. cmd += "/DWINVER=0x501 "
  1047. # Work around a WinXP/2003 bug when using VS 2015+.
  1048. if SDK.get("VISUALSTUDIO_VERSION") >= (14,0):
  1049. cmd += "/Zc:threadSafeInit- "
  1050. cmd += "/Fo" + obj + " /nologo /c"
  1051. if GetTargetArch() != 'x64' and (not PkgSkip("SSE2") or 'SSE2' in opts):
  1052. cmd += " /arch:SSE2"
  1053. for x in ipath: cmd += " /I" + x
  1054. for (opt,dir) in INCDIRECTORIES:
  1055. if (opt=="ALWAYS") or (opt in opts): cmd += " /I" + BracketNameWithQuotes(dir)
  1056. for (opt,var,val) in DEFSYMBOLS:
  1057. if (opt=="ALWAYS") or (opt in opts): cmd += " /D" + var + "=" + val
  1058. if (opts.count('MSFORSCOPE')): cmd += ' /Zc:forScope-'
  1059. if (optlevel==1): cmd += " /MDd /Zi /RTCs /GS"
  1060. if (optlevel==2): cmd += " /MDd /Zi"
  1061. if (optlevel==3): cmd += " /MD /Zi /GS- /O2 /Ob2 /Oi /Ot /fp:fast"
  1062. if (optlevel==4):
  1063. cmd += " /MD /Zi /GS- /Ox /Ob2 /Oi /Ot /fp:fast /DFORCE_INLINING /DNDEBUG /GL"
  1064. cmd += " /Oy /Zp16" # jean-claude add /Zp16 insures correct static alignment for SSEx
  1065. cmd += " /Fd" + os.path.splitext(obj)[0] + ".pdb"
  1066. building = GetValueOption(opts, "BUILDING:")
  1067. if (building):
  1068. cmd += " /DBUILDING_" + building
  1069. if ("BIGOBJ" in opts) or GetTargetArch() == 'x64':
  1070. cmd += " /bigobj"
  1071. cmd += " /Zm300 /DWIN32_VC /DWIN32"
  1072. if 'EXCEPTIONS' in opts:
  1073. cmd += " /EHsc"
  1074. else:
  1075. cmd += " /D_HAS_EXCEPTIONS=0"
  1076. if 'RTTI' not in opts:
  1077. cmd += " /GR-"
  1078. if GetTargetArch() == 'x64':
  1079. cmd += " /DWIN64_VC /DWIN64"
  1080. if WINDOWS_SDK.startswith('7.') and MSVC_VERSION > (10,):
  1081. # To preserve Windows XP compatibility.
  1082. cmd += " /D_USING_V110_SDK71_"
  1083. cmd += " /W3 " + BracketNameWithQuotes(src)
  1084. oscmd(cmd)
  1085. else:
  1086. cmd = "icl "
  1087. if GetTargetArch() == 'x64':
  1088. cmd += "/favor:blend "
  1089. cmd += "/wd4996 /wd4275 /wd4267 /wd4101 /wd4273 "
  1090. cmd += "/DWINVER=0x501 "
  1091. cmd += "/Fo" + obj + " /c"
  1092. for x in ipath: cmd += " /I" + x
  1093. for (opt,dir) in INCDIRECTORIES:
  1094. if (opt=="ALWAYS") or (opt in opts): cmd += " /I" + BracketNameWithQuotes(dir)
  1095. for (opt,var,val) in DEFSYMBOLS:
  1096. if (opt=="ALWAYS") or (opt in opts): cmd += " /D" + var + "=" + val
  1097. if (opts.count('MSFORSCOPE')): cmd += ' /Zc:forScope-'
  1098. if (optlevel==1): cmd += " /MDd /Zi /RTCs /GS"
  1099. if (optlevel==2): cmd += " /MDd /Zi /arch:SSE3"
  1100. # core changes from jean-claude (dec 2011)
  1101. # ----------------------------------------
  1102. # performance will be seeked at level 3 & 4
  1103. # -----------------------------------------
  1104. if (optlevel==3):
  1105. cmd += " /MD /Zi /O2 /Oi /Ot /arch:SSE3"
  1106. cmd += " /Ob0"
  1107. cmd += " /Qipo-" # beware of IPO !!!
  1108. ## Lesson learned: Don't use /GL flag -> end result is MESSY
  1109. ## ----------------------------------------------------------------
  1110. if (optlevel==4):
  1111. cmd += " /MD /Zi /O3 /Oi /Ot /Ob0 /Yc /DNDEBUG" # /Ob0 a ete rajoute en cours de route a 47%
  1112. cmd += " /Qipo" # optimization multi file
  1113. # for 3 & 4 optimization levels
  1114. # -----------------------------
  1115. if (optlevel>=3):
  1116. cmd += " /fp:fast=2"
  1117. cmd += " /Qftz"
  1118. cmd += " /Qfp-speculation:fast"
  1119. cmd += " /Qopt-matmul" # needs /O2 or /O3
  1120. cmd += " /Qprec-div-"
  1121. cmd += " /Qsimd"
  1122. cmd += " /QxHost" # compile for target host; Compiling for distribs should probably strictly enforce /arch:..
  1123. cmd += " /Quse-intel-optimized-headers" # use intel optimized headers
  1124. cmd += " /Qparallel" # enable parallelization
  1125. cmd += " /Qvc10" # for Microsoft Visual C++ 2010
  1126. ## PCH files coexistence: the /Qpchi option causes the Intel C++ Compiler to name its
  1127. ## PCH files with a .pchi filename suffix and reduce build time.
  1128. ## The /Qpchi option is on by default but interferes with Microsoft libs; so use /Qpchi- to turn it off.
  1129. ## I need to have a deeper look at this since the compile time is quite influenced by this setting !!!
  1130. cmd += " /Qpchi-" # keep it this way!
  1131. ## Inlining seems to be an issue here ! (the linker doesn't find necessary info later on)
  1132. ## ------------------------------------
  1133. ## so don't use cmd += " /DFORCE_INLINING" (need to check why with Panda developpers!)
  1134. ## Inline expansion /Ob1 : Allow functions marked inline to be inlined.
  1135. ## Inline any /Ob2 : Inline functions deemed appropriate by compiler.
  1136. ## Ctor displacement /vd0 : Disable constructor displacement.
  1137. ## Choose this option only if no class constructors or destructors call virtual functions.
  1138. ## Use /vd1 (default) to enable. Alternate: #pragma vtordisp
  1139. ## Best case ptrs /vmb : Use best case "pointer to class member" representation.
  1140. ## Use this option if you always define a class before you declare a pointer to a member of the class.
  1141. ## The compiler will issue an error if it encounters a pointer declaration before the class is defined.
  1142. ## Alternate: #pragma pointers_to_members
  1143. cmd += " /Fd" + os.path.splitext(obj)[0] + ".pdb"
  1144. building = GetValueOption(opts, "BUILDING:")
  1145. if (building): cmd += " /DBUILDING_" + building
  1146. if ("BIGOBJ" in opts) or GetTargetArch() == 'x64':
  1147. cmd += " /bigobj"
  1148. # level of warnings and optimization reports
  1149. if GetVerbose():
  1150. cmd += " /W3 " # or /W4 or /Wall
  1151. cmd += " /Qopt-report:2 /Qopt-report-phase:hlo /Qopt-report-phase:hpo" # some optimization reports
  1152. else:
  1153. cmd += " /W1 "
  1154. cmd += " /EHa /Zm300 /DWIN32_VC /DWIN32"
  1155. if GetTargetArch() == 'x64':
  1156. cmd += " /DWIN64_VC /DWIN64"
  1157. cmd += " " + BracketNameWithQuotes(src)
  1158. oscmd(cmd)
  1159. if (COMPILER=="GCC"):
  1160. if (src.endswith(".c")): cmd = GetCC() +' -fPIC -c -o ' + obj
  1161. else: cmd = GetCXX()+' -std=gnu++11 -ftemplate-depth-70 -fPIC -c -o ' + obj
  1162. for (opt, dir) in INCDIRECTORIES:
  1163. if (opt=="ALWAYS") or (opt in opts): cmd += ' -I' + BracketNameWithQuotes(dir)
  1164. for (opt, dir) in FRAMEWORKDIRECTORIES:
  1165. if (opt=="ALWAYS") or (opt in opts): cmd += ' -F' + BracketNameWithQuotes(dir)
  1166. for (opt,var,val) in DEFSYMBOLS:
  1167. if (opt=="ALWAYS") or (opt in opts): cmd += ' -D' + var + '=' + val
  1168. for x in ipath: cmd += ' -I' + x
  1169. if not GetLinkAllStatic() and 'NOHIDDEN' not in opts:
  1170. cmd += ' -fvisibility=hidden'
  1171. # Mac-specific flags.
  1172. if GetTarget() == "darwin":
  1173. cmd += " -Wno-deprecated-declarations"
  1174. if OSXTARGET is not None:
  1175. cmd += " -isysroot " + SDK["MACOSX"]
  1176. cmd += " -mmacosx-version-min=%d.%d" % (OSXTARGET)
  1177. for arch in OSX_ARCHS:
  1178. if 'NOARCH:' + arch.upper() not in opts:
  1179. cmd += " -arch %s" % arch
  1180. if "SYSROOT" in SDK:
  1181. if GetTarget() != "android":
  1182. cmd += ' --sysroot=%s' % (SDK["SYSROOT"])
  1183. else:
  1184. ndk_dir = SDK["ANDROID_NDK"].replace('\\', '/')
  1185. cmd += ' -isystem %s/sysroot/usr/include' % (ndk_dir)
  1186. cmd += ' -isystem %s/sysroot/usr/include/%s' % (ndk_dir, SDK["ANDROID_TRIPLE"])
  1187. cmd += ' -no-canonical-prefixes'
  1188. # Android-specific flags.
  1189. arch = GetTargetArch()
  1190. if GetTarget() == "android":
  1191. # Most of the specific optimization flags here were
  1192. # just copied from the default Android Makefiles.
  1193. if "ANDROID_API" in SDK:
  1194. cmd += ' -D__ANDROID_API__=' + str(SDK["ANDROID_API"])
  1195. if "ANDROID_GCC_TOOLCHAIN" in SDK:
  1196. cmd += ' -gcc-toolchain ' + SDK["ANDROID_GCC_TOOLCHAIN"].replace('\\', '/')
  1197. cmd += ' -ffunction-sections -funwind-tables'
  1198. if arch == 'armv7a':
  1199. cmd += ' -target armv7-none-linux-androideabi'
  1200. cmd += ' -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16'
  1201. cmd += ' -fno-integrated-as'
  1202. elif arch == 'arm':
  1203. cmd += ' -target armv5te-none-linux-androideabi'
  1204. cmd += ' -march=armv5te -mtune=xscale -msoft-float'
  1205. cmd += ' -fno-integrated-as'
  1206. elif arch == 'aarch64':
  1207. cmd += ' -target aarch64-none-linux-android'
  1208. elif arch == 'mips':
  1209. cmd += ' -target mipsel-none-linux-android'
  1210. cmd += ' -mips32'
  1211. elif arch == 'mips64':
  1212. cmd += ' -target mips64el-none-linux-android'
  1213. cmd += ' -fintegrated-as'
  1214. elif arch == 'x86':
  1215. cmd += ' -target i686-none-linux-android'
  1216. cmd += ' -march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32'
  1217. cmd += ' -mstackrealign'
  1218. elif arch == 'x86_64':
  1219. cmd += ' -target x86_64-none-linux-android'
  1220. cmd += ' -march=x86-64 -msse4.2 -mpopcnt -m64 -mtune=intel'
  1221. cmd += " -Wa,--noexecstack"
  1222. # Do we want thumb or arm instructions?
  1223. if arch.startswith('arm'):
  1224. if optlevel >= 3:
  1225. cmd += ' -mthumb'
  1226. else:
  1227. cmd += ' -marm'
  1228. # Enable SIMD instructions if requested
  1229. if arch.startswith('arm') and PkgSkip("NEON") == 0:
  1230. cmd += ' -mfpu=neon'
  1231. else:
  1232. cmd += " -pthread"
  1233. if not src.endswith(".c"):
  1234. # We don't use exceptions for most modules.
  1235. if 'EXCEPTIONS' in opts:
  1236. cmd += " -fexceptions"
  1237. else:
  1238. cmd += " -fno-exceptions"
  1239. if src.endswith(".mm"):
  1240. # Work around Apple compiler bug.
  1241. cmd += " -U__EXCEPTIONS"
  1242. if 'RTTI' not in opts:
  1243. # We always disable RTTI on Android for memory usage reasons.
  1244. if optlevel >= 4 or GetTarget() == "android":
  1245. cmd += " -fno-rtti"
  1246. if ('SSE2' in opts or not PkgSkip("SSE2")) and not arch.startswith("arm") and arch != 'aarch64':
  1247. cmd += " -msse2"
  1248. # Needed by both Python, Panda, Eigen, all of which break aliasing rules.
  1249. cmd += " -fno-strict-aliasing"
  1250. if optlevel >= 3:
  1251. cmd += " -ffast-math -fno-stack-protector"
  1252. if optlevel == 3:
  1253. # Fast math is nice, but we'd like to see NaN in dev builds.
  1254. cmd += " -fno-finite-math-only"
  1255. if (optlevel==1): cmd += " -ggdb -D_DEBUG"
  1256. if (optlevel==2): cmd += " -O1 -D_DEBUG"
  1257. if (optlevel==3): cmd += " -O2"
  1258. if (optlevel==4): cmd += " -O3 -DNDEBUG"
  1259. if src.endswith(".c"):
  1260. cmd += ' ' + CFLAGS
  1261. else:
  1262. cmd += ' ' + CXXFLAGS
  1263. cmd = cmd.rstrip()
  1264. building = GetValueOption(opts, "BUILDING:")
  1265. if (building): cmd += " -DBUILDING_" + building
  1266. cmd += ' ' + BracketNameWithQuotes(src)
  1267. oscmd(cmd)
  1268. ########################################################################
  1269. ##
  1270. ## CompileBison
  1271. ##
  1272. ########################################################################
  1273. def CompileBison(wobj, wsrc, opts):
  1274. ifile = os.path.basename(wsrc)
  1275. wdsth = GetOutputDir()+"/include/" + ifile[:-4] + ".h"
  1276. wdstc = GetOutputDir()+"/tmp/" + ifile + ".cxx"
  1277. pre = GetValueOption(opts, "BISONPREFIX_")
  1278. bison = GetBison()
  1279. if bison is None:
  1280. # We don't have bison. See if there is a prebuilt file.
  1281. base, ext = os.path.splitext(wsrc)
  1282. if os.path.isfile(base + '.h.prebuilt') and \
  1283. os.path.isfile(base + '.cxx.prebuilt'):
  1284. CopyFile(wdstc, base + '.cxx.prebuilt')
  1285. CopyFile(wdsth, base + '.h.prebuilt')
  1286. else:
  1287. exit('Could not find bison!')
  1288. else:
  1289. oscmd(bison + ' -y -d -o'+GetOutputDir()+'/tmp/'+ifile+'.c -p '+pre+' '+wsrc)
  1290. CopyFile(wdstc, GetOutputDir()+"/tmp/"+ifile+".c")
  1291. CopyFile(wdsth, GetOutputDir()+"/tmp/"+ifile+".h")
  1292. # Finally, compile the generated source file.
  1293. CompileCxx(wobj, wdstc, opts + ["FLEX"])
  1294. ########################################################################
  1295. ##
  1296. ## CompileFlex
  1297. ##
  1298. ########################################################################
  1299. def CompileFlex(wobj,wsrc,opts):
  1300. ifile = os.path.basename(wsrc)
  1301. wdst = GetOutputDir()+"/tmp/"+ifile+".cxx"
  1302. pre = GetValueOption(opts, "BISONPREFIX_")
  1303. dashi = opts.count("FLEXDASHI")
  1304. flex = GetFlex()
  1305. if flex is None:
  1306. # We don't have flex. See if there is a prebuilt file.
  1307. base, ext = os.path.splitext(wsrc)
  1308. if os.path.isfile(base + '.cxx.prebuilt'):
  1309. CopyFile(wdst, base + '.cxx.prebuilt')
  1310. else:
  1311. exit('Could not find flex!')
  1312. else:
  1313. if (dashi):
  1314. oscmd(flex + " -i -P" + pre + " -o"+wdst+" "+wsrc)
  1315. else:
  1316. oscmd(flex + " -P" + pre + " -o"+wdst+" "+wsrc)
  1317. # Finally, compile the generated source file.
  1318. CompileCxx(wobj,wdst,opts)
  1319. ########################################################################
  1320. ##
  1321. ## CompileIgate
  1322. ##
  1323. ########################################################################
  1324. def CompileIgate(woutd,wsrc,opts):
  1325. outbase = os.path.basename(woutd)[:-3]
  1326. woutc = GetOutputDir()+"/tmp/"+outbase+"_igate.cxx"
  1327. wobj = FindLocation(outbase + "_igate.obj", [])
  1328. srcdir = GetValueOption(opts, "SRCDIR:")
  1329. module = GetValueOption(opts, "IMOD:")
  1330. library = GetValueOption(opts, "ILIB:")
  1331. ipath = GetListOption(opts, "DIR:")
  1332. if (PkgSkip("PYTHON")):
  1333. WriteFile(woutc, "")
  1334. WriteFile(woutd, "")
  1335. ConditionalWriteFile(woutd, "")
  1336. return (wobj, woutc, opts)
  1337. if not CrossCompiling():
  1338. # If we're compiling for this platform, we can use the one we've built.
  1339. cmd = os.path.join(GetOutputDir(), 'bin', 'interrogate')
  1340. else:
  1341. # Assume that interrogate is on the PATH somewhere.
  1342. cmd = 'interrogate'
  1343. if GetVerbose():
  1344. cmd += ' -v'
  1345. cmd += ' -srcdir %s -I%s' % (srcdir, srcdir)
  1346. cmd += ' -DCPPPARSER -D__STDC__=1 -D__cplusplus=201103L'
  1347. if (COMPILER=="MSVC"):
  1348. cmd += ' -DWIN32_VC -DWIN32 -D_WIN32'
  1349. if GetTargetArch() == 'x64':
  1350. cmd += ' -DWIN64_VC -DWIN64 -D_WIN64 -D_M_X64 -D_M_AMD64'
  1351. else:
  1352. cmd += ' -D_M_IX86'
  1353. # NOTE: this 1600 value is the version number for VC2010.
  1354. cmd += ' -D_MSC_VER=1600 -D"__declspec(param)=" -D__cdecl -D_near -D_far -D__near -D__far -D__stdcall'
  1355. if (COMPILER=="GCC"):
  1356. cmd += ' -D__attribute__\(x\)='
  1357. target_arch = GetTargetArch()
  1358. if target_arch in ("x86_64", "amd64"):
  1359. cmd += ' -D_LP64'
  1360. elif target_arch == 'aarch64':
  1361. cmd += ' -D_LP64 -D__LP64__ -D__aarch64__'
  1362. else:
  1363. cmd += ' -D__i386__'
  1364. target = GetTarget()
  1365. if target == 'darwin':
  1366. cmd += ' -D__APPLE__'
  1367. elif target == 'android':
  1368. cmd += ' -D__ANDROID__'
  1369. optlevel = GetOptimizeOption(opts)
  1370. if (optlevel==1): cmd += ' -D_DEBUG'
  1371. if (optlevel==2): cmd += ' -D_DEBUG'
  1372. if (optlevel==3): pass
  1373. if (optlevel==4): cmd += ' -DNDEBUG'
  1374. cmd += ' -oc ' + woutc + ' -od ' + woutd
  1375. cmd += ' -fnames -string -refcount -assert -python-native'
  1376. cmd += ' -S' + GetOutputDir() + '/include/parser-inc'
  1377. # Add -I, -S and -D flags
  1378. for x in ipath:
  1379. cmd += ' -I' + BracketNameWithQuotes(x)
  1380. for (opt,dir) in INCDIRECTORIES:
  1381. if (opt=="ALWAYS") or (opt in opts):
  1382. cmd += ' -S' + BracketNameWithQuotes(dir)
  1383. for (opt,var,val) in DEFSYMBOLS:
  1384. if (opt=="ALWAYS") or (opt in opts):
  1385. cmd += ' -D' + var + '=' + val
  1386. #building = GetValueOption(opts, "BUILDING:")
  1387. #if (building): cmd += " -DBUILDING_"+building
  1388. cmd += ' -module ' + module + ' -library ' + library
  1389. for x in wsrc:
  1390. if (x.startswith("/")):
  1391. cmd += ' ' + BracketNameWithQuotes(x)
  1392. else:
  1393. cmd += ' ' + BracketNameWithQuotes(os.path.basename(x))
  1394. oscmd(cmd)
  1395. return (wobj, woutc, opts)
  1396. ########################################################################
  1397. ##
  1398. ## CompileImod
  1399. ##
  1400. ########################################################################
  1401. def CompileImod(wobj, wsrc, opts):
  1402. module = GetValueOption(opts, "IMOD:")
  1403. library = GetValueOption(opts, "ILIB:")
  1404. if (COMPILER=="MSVC"):
  1405. woutc = wobj[:-4]+".cxx"
  1406. if (COMPILER=="GCC"):
  1407. woutc = wobj[:-2]+".cxx"
  1408. if (PkgSkip("PYTHON")):
  1409. WriteFile(woutc, "")
  1410. CompileCxx(wobj, woutc, opts)
  1411. return
  1412. if not CrossCompiling():
  1413. # If we're compiling for this platform, we can use the one we've built.
  1414. cmd = os.path.join(GetOutputDir(), 'bin', 'interrogate_module')
  1415. else:
  1416. # Assume that interrogate_module is on the PATH somewhere.
  1417. cmd = 'interrogate_module'
  1418. cmd += ' -oc ' + woutc + ' -module ' + module + ' -library ' + library + ' -python-native'
  1419. importmod = GetValueOption(opts, "IMPORT:")
  1420. if importmod:
  1421. cmd += ' -import ' + importmod
  1422. for x in wsrc: cmd += ' ' + BracketNameWithQuotes(x)
  1423. oscmd(cmd)
  1424. CompileCxx(wobj,woutc,opts)
  1425. return
  1426. ########################################################################
  1427. ##
  1428. ## CompileLib
  1429. ##
  1430. ########################################################################
  1431. def CompileLib(lib, obj, opts):
  1432. if (COMPILER=="MSVC"):
  1433. if not BOOUSEINTELCOMPILER:
  1434. #Use MSVC Linker
  1435. cmd = 'link /lib /nologo'
  1436. if GetOptimizeOption(opts) == 4:
  1437. cmd += " /LTCG"
  1438. if HasTargetArch():
  1439. cmd += " /MACHINE:" + GetTargetArch().upper()
  1440. cmd += ' /OUT:' + BracketNameWithQuotes(lib)
  1441. for x in obj:
  1442. if not x.endswith('.lib'):
  1443. cmd += ' ' + BracketNameWithQuotes(x)
  1444. oscmd(cmd)
  1445. else:
  1446. # Choose Intel linker; from Jean-Claude
  1447. cmd = 'xilink /verbose:lib /lib '
  1448. if HasTargetArch():
  1449. cmd += " /MACHINE:" + GetTargetArch().upper()
  1450. cmd += ' /OUT:' + BracketNameWithQuotes(lib)
  1451. for x in obj: cmd += ' ' + BracketNameWithQuotes(x)
  1452. cmd += ' /LIBPATH:"C:\Program Files (x86)\Intel\Composer XE 2011 SP1\ipp\lib\ia32"'
  1453. cmd += ' /LIBPATH:"C:\Program Files (x86)\Intel\Composer XE 2011 SP1\TBB\Lib\ia32\vc10"'
  1454. cmd += ' /LIBPATH:"C:\Program Files (x86)\Intel\Composer XE 2011 SP1\compiler\lib\ia32"'
  1455. oscmd(cmd)
  1456. if (COMPILER=="GCC"):
  1457. if GetTarget() == 'darwin':
  1458. cmd = 'libtool -static -o ' + BracketNameWithQuotes(lib)
  1459. else:
  1460. cmd = GetAR() + ' cru ' + BracketNameWithQuotes(lib)
  1461. for x in obj:
  1462. cmd += ' ' + BracketNameWithQuotes(x)
  1463. oscmd(cmd)
  1464. oscmd(GetRanlib() + ' ' + BracketNameWithQuotes(lib))
  1465. ########################################################################
  1466. ##
  1467. ## CompileLink
  1468. ##
  1469. ########################################################################
  1470. def CompileLink(dll, obj, opts):
  1471. if (COMPILER=="MSVC"):
  1472. if not BOOUSEINTELCOMPILER:
  1473. cmd = "link /nologo "
  1474. if HasTargetArch():
  1475. cmd += " /MACHINE:" + GetTargetArch().upper()
  1476. if ("MFC" not in opts):
  1477. cmd += " /NOD:MFC90.LIB /NOD:MFC80.LIB /NOD:LIBCMT"
  1478. cmd += " /NOD:LIBCI.LIB /DEBUG"
  1479. cmd += " /nod:libc /nod:libcmtd /nod:atlthunk /nod:atls /nod:atlsd"
  1480. if (GetOrigExt(dll) != ".exe"): cmd += " /DLL"
  1481. optlevel = GetOptimizeOption(opts)
  1482. if (optlevel==1): cmd += " /MAP /MAPINFO:EXPORTS /NOD:MSVCRT.LIB /NOD:MSVCPRT.LIB /NOD:MSVCIRT.LIB"
  1483. if (optlevel==2): cmd += " /MAP:NUL /NOD:MSVCRT.LIB /NOD:MSVCPRT.LIB /NOD:MSVCIRT.LIB"
  1484. if (optlevel==3): cmd += " /MAP:NUL /NOD:MSVCRTD.LIB /NOD:MSVCPRTD.LIB /NOD:MSVCIRTD.LIB"
  1485. if (optlevel==4): cmd += " /MAP:NUL /LTCG /NOD:MSVCRTD.LIB /NOD:MSVCPRTD.LIB /NOD:MSVCIRTD.LIB"
  1486. if ("MFC" in opts):
  1487. if (optlevel<=2): cmd += " /NOD:MSVCRTD.LIB mfcs100d.lib MSVCRTD.lib"
  1488. else: cmd += " /NOD:MSVCRT.LIB mfcs100.lib MSVCRT.lib"
  1489. cmd += " /FIXED:NO /OPT:REF /STACK:4194304 /INCREMENTAL:NO "
  1490. cmd += ' /OUT:' + BracketNameWithQuotes(dll)
  1491. if not PkgSkip("PYTHON"):
  1492. # If we're building without Python, don't pick it up implicitly.
  1493. if "PYTHON" not in opts:
  1494. pythonv = SDK["PYTHONVERSION"].replace('.', '')
  1495. if optlevel <= 2:
  1496. cmd += ' /NOD:{}d.lib'.format(pythonv)
  1497. else:
  1498. cmd += ' /NOD:{}.lib'.format(pythonv)
  1499. # Yes, we know we are importing "locally defined symbols".
  1500. for x in obj:
  1501. if x.endswith('libp3pystub.lib'):
  1502. cmd += ' /ignore:4049,4217'
  1503. break
  1504. # Set the subsystem. Specify that we want to target Windows XP.
  1505. subsystem = GetValueOption(opts, "SUBSYSTEM:") or "CONSOLE"
  1506. cmd += " /SUBSYSTEM:" + subsystem
  1507. if GetTargetArch() == 'x64':
  1508. cmd += ",5.02"
  1509. else:
  1510. cmd += ",5.01"
  1511. if dll.endswith(".dll") or dll.endswith(".pyd"):
  1512. cmd += ' /IMPLIB:' + GetOutputDir() + '/lib/' + os.path.splitext(os.path.basename(dll))[0] + ".lib"
  1513. for (opt, dir) in LIBDIRECTORIES:
  1514. if (opt=="ALWAYS") or (opt in opts):
  1515. cmd += ' /LIBPATH:' + BracketNameWithQuotes(dir)
  1516. for x in obj:
  1517. if x.endswith(".dll") or x.endswith(".pyd"):
  1518. cmd += ' ' + GetOutputDir() + '/lib/' + os.path.splitext(os.path.basename(x))[0] + ".lib"
  1519. elif x.endswith(".lib"):
  1520. dname = os.path.splitext(os.path.basename(x))[0] + ".dll"
  1521. if (GetOrigExt(x) != ".ilb" and os.path.exists(GetOutputDir()+"/bin/" + dname)):
  1522. exit("Error: in makepanda, specify "+dname+", not "+x)
  1523. cmd += ' ' + BracketNameWithQuotes(x)
  1524. elif x.endswith(".def"):
  1525. cmd += ' /DEF:' + BracketNameWithQuotes(x)
  1526. elif x.endswith(".dat"):
  1527. pass
  1528. else:
  1529. cmd += ' ' + BracketNameWithQuotes(x)
  1530. if (GetOrigExt(dll)==".exe" and "NOICON" not in opts):
  1531. cmd += " " + GetOutputDir() + "/tmp/pandaIcon.res"
  1532. for (opt, name) in LIBNAMES:
  1533. if (opt=="ALWAYS") or (opt in opts):
  1534. cmd += " " + BracketNameWithQuotes(name)
  1535. oscmd(cmd)
  1536. else:
  1537. cmd = "xilink"
  1538. if GetVerbose(): cmd += " /verbose:lib"
  1539. if HasTargetArch():
  1540. cmd += " /MACHINE:" + GetTargetArch().upper()
  1541. if ("MFC" not in opts):
  1542. cmd += " /NOD:MFC90.LIB /NOD:MFC80.LIB /NOD:LIBCMT"
  1543. cmd += " /NOD:LIBCI.LIB /DEBUG"
  1544. cmd += " /nod:libc /nod:libcmtd /nod:atlthunk /nod:atls"
  1545. cmd += ' /LIBPATH:"C:\Program Files (x86)\Intel\Composer XE 2011 SP1\ipp\lib\ia32"'
  1546. cmd += ' /LIBPATH:"C:\Program Files (x86)\Intel\Composer XE 2011 SP1\TBB\Lib\ia32\vc10"'
  1547. cmd += ' /LIBPATH:"C:\Program Files (x86)\Intel\Composer XE 2011 SP1\compiler\lib\ia32"'
  1548. if (GetOrigExt(dll) != ".exe"): cmd += " /DLL"
  1549. optlevel = GetOptimizeOption(opts)
  1550. if (optlevel==1): cmd += " /MAP /MAPINFO:EXPORTS /NOD:MSVCRT.LIB /NOD:MSVCPRT.LIB /NOD:MSVCIRT.LIB"
  1551. if (optlevel==2): cmd += " /MAP:NUL /NOD:MSVCRT.LIB /NOD:MSVCPRT.LIB /NOD:MSVCIRT.LIB"
  1552. if (optlevel==3): cmd += " /MAP:NUL /NOD:MSVCRTD.LIB /NOD:MSVCPRTD.LIB /NOD:MSVCIRTD.LIB"
  1553. if (optlevel==4): cmd += " /MAP:NUL /LTCG /NOD:MSVCRTD.LIB /NOD:MSVCPRTD.LIB /NOD:MSVCIRTD.LIB"
  1554. if ("MFC" in opts):
  1555. if (optlevel<=2): cmd += " /NOD:MSVCRTD.LIB mfcs100d.lib MSVCRTD.lib"
  1556. else: cmd += " /NOD:MSVCRT.LIB mfcs100.lib MSVCRT.lib"
  1557. cmd += " /FIXED:NO /OPT:REF /STACK:4194304 /INCREMENTAL:NO "
  1558. cmd += ' /OUT:' + BracketNameWithQuotes(dll)
  1559. subsystem = GetValueOption(opts, "SUBSYSTEM:")
  1560. if subsystem:
  1561. cmd += " /SUBSYSTEM:" + subsystem
  1562. if dll.endswith(".dll"):
  1563. cmd += ' /IMPLIB:' + GetOutputDir() + '/lib/' + os.path.splitext(os.path.basename(dll))[0] + ".lib"
  1564. for (opt, dir) in LIBDIRECTORIES:
  1565. if (opt=="ALWAYS") or (opt in opts):
  1566. cmd += ' /LIBPATH:' + BracketNameWithQuotes(dir)
  1567. for x in obj:
  1568. if x.endswith(".dll") or x.endswith(".pyd"):
  1569. cmd += ' ' + GetOutputDir() + '/lib/' + os.path.splitext(os.path.basename(x))[0] + ".lib"
  1570. elif x.endswith(".lib"):
  1571. dname = os.path.splitext(dll)[0]+".dll"
  1572. if (GetOrigExt(x) != ".ilb" and os.path.exists(GetOutputDir()+"/bin/" + os.path.splitext(os.path.basename(x))[0] + ".dll")):
  1573. exit("Error: in makepanda, specify "+dname+", not "+x)
  1574. cmd += ' ' + BracketNameWithQuotes(x)
  1575. elif x.endswith(".def"):
  1576. cmd += ' /DEF:' + BracketNameWithQuotes(x)
  1577. elif x.endswith(".dat"):
  1578. pass
  1579. else:
  1580. cmd += ' ' + BracketNameWithQuotes(x)
  1581. if (GetOrigExt(dll)==".exe" and "NOICON" not in opts):
  1582. cmd += " " + GetOutputDir() + "/tmp/pandaIcon.res"
  1583. for (opt, name) in LIBNAMES:
  1584. if (opt=="ALWAYS") or (opt in opts):
  1585. cmd += " " + BracketNameWithQuotes(name)
  1586. oscmd(cmd)
  1587. if COMPILER == "GCC":
  1588. cxx = GetCXX()
  1589. if GetOrigExt(dll) == ".exe":
  1590. cmd = cxx + ' -o ' + dll + ' -L' + GetOutputDir() + '/lib -L' + GetOutputDir() + '/tmp'
  1591. if GetTarget() == "android":
  1592. # Necessary to work around an issue with libandroid depending on vendor libraries
  1593. cmd += ' -Wl,--allow-shlib-undefined'
  1594. else:
  1595. if (GetTarget() == "darwin"):
  1596. cmd = cxx + ' -undefined dynamic_lookup'
  1597. if ("BUNDLE" in opts or GetOrigExt(dll) == ".pyd"):
  1598. cmd += ' -bundle '
  1599. else:
  1600. install_name = '@loader_path/../lib/' + os.path.basename(dll)
  1601. cmd += ' -dynamiclib -install_name ' + install_name
  1602. cmd += ' -compatibility_version ' + MAJOR_VERSION + ' -current_version ' + VERSION
  1603. cmd += ' -o ' + dll + ' -L' + GetOutputDir() + '/lib -L' + GetOutputDir() + '/tmp'
  1604. else:
  1605. cmd = cxx + ' -shared'
  1606. # Always set soname on Android to avoid a linker warning when loading the library.
  1607. if "MODULE" not in opts or GetTarget() == 'android':
  1608. cmd += " -Wl,-soname=" + os.path.basename(dll)
  1609. cmd += ' -o ' + dll + ' -L' + GetOutputDir() + '/lib -L' + GetOutputDir() + '/tmp'
  1610. for x in obj:
  1611. if GetOrigExt(x) != ".dat":
  1612. cmd += ' ' + x
  1613. if (GetOrigExt(dll) == ".exe" and GetTarget() == 'windows' and "NOICON" not in opts):
  1614. cmd += " " + GetOutputDir() + "/tmp/pandaIcon.res"
  1615. # Mac OS X specific flags.
  1616. if GetTarget() == 'darwin':
  1617. cmd += " -headerpad_max_install_names"
  1618. if OSXTARGET is not None:
  1619. cmd += " -isysroot " + SDK["MACOSX"] + " -Wl,-syslibroot," + SDK["MACOSX"]
  1620. cmd += " -mmacosx-version-min=%d.%d" % (OSXTARGET)
  1621. for arch in OSX_ARCHS:
  1622. if 'NOARCH:' + arch.upper() not in opts:
  1623. cmd += " -arch %s" % arch
  1624. elif GetTarget() == 'android':
  1625. arch = GetTargetArch()
  1626. if "ANDROID_GCC_TOOLCHAIN" in SDK:
  1627. cmd += ' -gcc-toolchain ' + SDK["ANDROID_GCC_TOOLCHAIN"].replace('\\', '/')
  1628. cmd += " -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now"
  1629. if arch == 'armv7a':
  1630. cmd += ' -target armv7-none-linux-androideabi'
  1631. cmd += " -march=armv7-a -Wl,--fix-cortex-a8"
  1632. elif arch == 'arm':
  1633. cmd += ' -target armv5te-none-linux-androideabi'
  1634. elif arch == 'aarch64':
  1635. cmd += ' -target aarch64-none-linux-android'
  1636. elif arch == 'mips':
  1637. cmd += ' -target mipsel-none-linux-android'
  1638. cmd += ' -mips32'
  1639. elif arch == 'mips64':
  1640. cmd += ' -target mips64el-none-linux-android'
  1641. elif arch == 'x86':
  1642. cmd += ' -target i686-none-linux-android'
  1643. elif arch == 'x86_64':
  1644. cmd += ' -target x86_64-none-linux-android'
  1645. cmd += ' -lc -lm'
  1646. else:
  1647. cmd += " -pthread"
  1648. if "SYSROOT" in SDK:
  1649. cmd += " --sysroot=%s -no-canonical-prefixes" % (SDK["SYSROOT"])
  1650. if LDFLAGS != "":
  1651. cmd += " " + LDFLAGS
  1652. # Don't link libraries with Python, except on Android.
  1653. if "PYTHON" in opts and GetOrigExt(dll) != ".exe" and not RTDIST and GetTarget() != 'android':
  1654. opts = opts[:]
  1655. opts.remove("PYTHON")
  1656. for (opt, dir) in LIBDIRECTORIES:
  1657. if (opt=="ALWAYS") or (opt in opts):
  1658. cmd += ' -L' + BracketNameWithQuotes(dir)
  1659. for (opt, dir) in FRAMEWORKDIRECTORIES:
  1660. if (opt=="ALWAYS") or (opt in opts):
  1661. cmd += ' -F' + BracketNameWithQuotes(dir)
  1662. for (opt, name) in LIBNAMES:
  1663. if (opt=="ALWAYS") or (opt in opts):
  1664. cmd += ' ' + BracketNameWithQuotes(name)
  1665. if GetTarget() != 'freebsd':
  1666. cmd += " -ldl"
  1667. oscmd(cmd)
  1668. if GetOptimizeOption(opts) == 4 and GetTarget() in ('linux', 'android'):
  1669. oscmd(GetStrip() + " --strip-unneeded " + BracketNameWithQuotes(dll))
  1670. os.system("chmod +x " + BracketNameWithQuotes(dll))
  1671. if dll.endswith("." + MAJOR_VERSION + ".dylib"):
  1672. newdll = dll[:-6-len(MAJOR_VERSION)] + "dylib"
  1673. if os.path.isfile(newdll):
  1674. os.remove(newdll)
  1675. oscmd("ln -s " + BracketNameWithQuotes(os.path.basename(dll)) + " " + BracketNameWithQuotes(newdll))
  1676. elif dll.endswith("." + MAJOR_VERSION):
  1677. newdll = dll[:-len(MAJOR_VERSION)-1]
  1678. if os.path.isfile(newdll):
  1679. os.remove(newdll)
  1680. oscmd("ln -s " + BracketNameWithQuotes(os.path.basename(dll)) + " " + BracketNameWithQuotes(newdll))
  1681. ##########################################################################################
  1682. #
  1683. # CompileEgg
  1684. #
  1685. ##########################################################################################
  1686. def CompileEgg(eggfile, src, opts):
  1687. pz = False
  1688. if eggfile.endswith(".pz"):
  1689. pz = True
  1690. eggfile = eggfile[:-3]
  1691. # Determine the location of the pzip and flt2egg tools.
  1692. if CrossCompiling():
  1693. # We may not be able to use our generated versions of these tools,
  1694. # so we'll expect them to already be present in the PATH.
  1695. pzip = 'pzip'
  1696. flt2egg = 'flt2egg'
  1697. else:
  1698. # If we're compiling for this machine, we can use the binaries we've built.
  1699. pzip = os.path.join(GetOutputDir(), 'bin', 'pzip')
  1700. flt2egg = os.path.join(GetOutputDir(), 'bin', 'flt2egg')
  1701. if not os.path.isfile(pzip):
  1702. pzip = 'pzip'
  1703. if not os.path.isfile(flt2egg):
  1704. flt2egg = 'flt2egg'
  1705. if src.endswith(".egg"):
  1706. CopyFile(eggfile, src)
  1707. elif src.endswith(".flt"):
  1708. oscmd(flt2egg + ' -ps keep -o ' + BracketNameWithQuotes(eggfile) + ' ' + BracketNameWithQuotes(src))
  1709. if pz:
  1710. oscmd(pzip + ' ' + BracketNameWithQuotes(eggfile))
  1711. ##########################################################################################
  1712. #
  1713. # CompileRes, CompileRsrc
  1714. #
  1715. ##########################################################################################
  1716. def CompileRes(target, src, opts):
  1717. """Compiles a Windows .rc file into a .res file."""
  1718. ipath = GetListOption(opts, "DIR:")
  1719. if (COMPILER == "MSVC"):
  1720. cmd = "rc"
  1721. cmd += " /Fo" + BracketNameWithQuotes(target)
  1722. for x in ipath: cmd += " /I" + x
  1723. for (opt,dir) in INCDIRECTORIES:
  1724. if (opt=="ALWAYS") or (opt in opts):
  1725. cmd += " /I" + BracketNameWithQuotes(dir)
  1726. for (opt,var,val) in DEFSYMBOLS:
  1727. if (opt=="ALWAYS") or (opt in opts):
  1728. cmd += " /D" + var + "=" + val
  1729. cmd += " " + BracketNameWithQuotes(src)
  1730. else:
  1731. cmd = "windres"
  1732. for x in ipath: cmd += " -I" + x
  1733. for (opt,dir) in INCDIRECTORIES:
  1734. if (opt=="ALWAYS") or (opt in opts):
  1735. cmd += " -I" + BracketNameWithQuotes(dir)
  1736. for (opt,var,val) in DEFSYMBOLS:
  1737. if (opt=="ALWAYS") or (opt in opts):
  1738. cmd += " -D" + var + "=" + val
  1739. cmd += " -i " + BracketNameWithQuotes(src)
  1740. cmd += " -o " + BracketNameWithQuotes(target)
  1741. oscmd(cmd)
  1742. def CompileRsrc(target, src, opts):
  1743. """Compiles a Mac OS .r file into an .rsrc file."""
  1744. ipath = GetListOption(opts, "DIR:")
  1745. if os.path.isfile("/usr/bin/Rez"):
  1746. cmd = "Rez -useDF"
  1747. else:
  1748. cmd = "/Developer/Tools/Rez -useDF"
  1749. cmd += " -o " + BracketNameWithQuotes(target)
  1750. for x in ipath:
  1751. cmd += " -i " + x
  1752. for (opt,dir) in INCDIRECTORIES:
  1753. if (opt=="ALWAYS") or (opt in opts):
  1754. cmd += " -i " + BracketNameWithQuotes(dir)
  1755. for (opt,var,val) in DEFSYMBOLS:
  1756. if (opt=="ALWAYS") or (opt in opts):
  1757. if (val == ""):
  1758. cmd += " -d " + var
  1759. else:
  1760. cmd += " -d " + var + " = " + val
  1761. cmd += " " + BracketNameWithQuotes(src)
  1762. oscmd(cmd)
  1763. ##########################################################################################
  1764. #
  1765. # CompileJava (Android only)
  1766. #
  1767. ##########################################################################################
  1768. def CompileJava(target, src, opts):
  1769. """Compiles a .java file into a .class file."""
  1770. cmd = "ecj "
  1771. optlevel = GetOptimizeOption(opts)
  1772. if optlevel >= 4:
  1773. cmd += "-debug:none "
  1774. cmd += "-cp " + GetOutputDir() + "/classes "
  1775. cmd += "-d " + GetOutputDir() + "/classes "
  1776. cmd += BracketNameWithQuotes(src)
  1777. oscmd(cmd)
  1778. ##########################################################################################
  1779. #
  1780. # FreezePy
  1781. #
  1782. ##########################################################################################
  1783. def FreezePy(target, inputs, opts):
  1784. assert len(inputs) > 0
  1785. cmdstr = BracketNameWithQuotes(SDK["PYTHONEXEC"].replace('\\', '/')) + " "
  1786. if sys.version_info >= (2, 6):
  1787. cmdstr += "-B "
  1788. cmdstr += os.path.join(GetOutputDir(), "direct", "showutil", "pfreeze.py")
  1789. if 'FREEZE_STARTUP' in opts:
  1790. cmdstr += " -s"
  1791. if GetOrigExt(target) == '.exe':
  1792. src = inputs.pop(0)
  1793. else:
  1794. src = ""
  1795. for i in inputs:
  1796. i = os.path.splitext(i)[0]
  1797. i = i.replace('/', '.')
  1798. if i.startswith('direct.src'):
  1799. i = i.replace('.src.', '.')
  1800. cmdstr += " -i " + i
  1801. cmdstr += " -o " + target + " " + src
  1802. if ("LINK_PYTHON_STATIC" in opts):
  1803. os.environ["LINK_PYTHON_STATIC"] = "1"
  1804. oscmd(cmdstr)
  1805. if ("LINK_PYTHON_STATIC" in os.environ):
  1806. del os.environ["LINK_PYTHON_STATIC"]
  1807. if (not os.path.exists(target)):
  1808. exit("FREEZER_ERROR")
  1809. ##########################################################################################
  1810. #
  1811. # Package
  1812. #
  1813. ##########################################################################################
  1814. def Package(target, inputs, opts):
  1815. assert len(inputs) == 1
  1816. # Invoke the ppackage script.
  1817. command = BracketNameWithQuotes(SDK["PYTHONEXEC"]) + " "
  1818. if GetOptimizeOption(opts) >= 4:
  1819. command += "-OO "
  1820. if sys.version_info >= (2, 6):
  1821. command += "-B "
  1822. command += "direct/src/p3d/ppackage.py"
  1823. if not RTDIST:
  1824. # Don't compile Python sources, because we might not running in the same
  1825. # Python version as the selected host.
  1826. command += " -N"
  1827. if GetTarget() == "darwin":
  1828. if SDK.get("MACOSX"):
  1829. command += " -R \"%s\"" % SDK["MACOSX"]
  1830. for arch in OSX_ARCHS:
  1831. if arch == "x86_64":
  1832. arch = "amd64"
  1833. command += " -P osx_%s" % arch
  1834. command += " -i \"" + GetOutputDir() + "/stage\""
  1835. if (P3DSUFFIX):
  1836. command += ' -a "' + P3DSUFFIX + '"'
  1837. command += " " + inputs[0]
  1838. if GetOrigExt(target) == '.p3d':
  1839. # Build a specific .p3d file.
  1840. basename = os.path.basename(os.path.splitext(target)[0])
  1841. command += " " + basename
  1842. oscmd(command)
  1843. if GetTarget() == 'windows':
  1844. # Make an .exe that calls this .p3d.
  1845. objfile = FindLocation('p3dWrapper_' + basename + '.obj', [])
  1846. CompileCxx(objfile, 'direct/src/p3d/p3dWrapper.c', [])
  1847. exefile = FindLocation(basename + '.exe', [])
  1848. CompileLink(exefile, [objfile], ['ADVAPI'])
  1849. # Move it to the bin directory.
  1850. os.rename(GetOutputDir() + '/stage/' + basename + P3DSUFFIX + '.p3d', target)
  1851. if sys.platform != 'win32':
  1852. oscmd('chmod +x ' + BracketNameWithQuotes(target))
  1853. else:
  1854. # This is presumably a package or set of packages.
  1855. oscmd(command)
  1856. ##########################################################################################
  1857. #
  1858. # CompileBundle
  1859. #
  1860. ##########################################################################################
  1861. def CompileBundle(target, inputs, opts):
  1862. assert GetTarget() == "darwin", 'bundles can only be made for Mac OS X'
  1863. plist = None
  1864. resources = []
  1865. objects = []
  1866. for i in inputs:
  1867. if (i.endswith(".plist")):
  1868. if (plist != None): exit("Only one plist file can be used when creating a bundle!")
  1869. plist = i
  1870. elif (i.endswith(".rsrc") or i.endswith(".icns")):
  1871. resources.append(i)
  1872. elif (GetOrigExt(i) == ".obj" or GetOrigExt(i) in SUFFIX_LIB or GetOrigExt(i) in SUFFIX_DLL):
  1873. objects.append(i)
  1874. else:
  1875. exit("Don't know how to bundle file %s" % i)
  1876. # Now link the object files to form the bundle.
  1877. if (plist == None): exit("One plist file must be used when creating a bundle!")
  1878. bundleName = plistlib.readPlist(plist)["CFBundleExecutable"]
  1879. oscmd("rm -rf %s" % target)
  1880. oscmd("mkdir -p %s/Contents/MacOS/" % target)
  1881. oscmd("mkdir -p %s/Contents/Resources/" % target)
  1882. if target.endswith(".app"):
  1883. SetOrigExt("%s/Contents/MacOS/%s" % (target, bundleName), ".exe")
  1884. else:
  1885. SetOrigExt("%s/Contents/MacOS/%s" % (target, bundleName), ".dll")
  1886. CompileLink("%s/Contents/MacOS/%s" % (target, bundleName), objects, opts + ["BUNDLE"])
  1887. oscmd("cp %s %s/Contents/Info.plist" % (plist, target))
  1888. for r in resources:
  1889. oscmd("cp %s %s/Contents/Resources/" % (r, target))
  1890. ##########################################################################################
  1891. #
  1892. # CompileMIDL
  1893. #
  1894. ##########################################################################################
  1895. def CompileMIDL(target, src, opts):
  1896. ipath = GetListOption(opts, "DIR:")
  1897. if (COMPILER=="MSVC"):
  1898. cmd = "midl"
  1899. cmd += " /out" + BracketNameWithQuotes(os.path.dirname(target))
  1900. for x in ipath: cmd += " /I" + x
  1901. for (opt,dir) in INCDIRECTORIES:
  1902. if (opt=="ALWAYS") or (opt in opts): cmd += " /I" + BracketNameWithQuotes(dir)
  1903. for (opt,var,val) in DEFSYMBOLS:
  1904. if (opt=="ALWAYS") or (opt in opts): cmd += " /D" + var + "=" + val
  1905. cmd += " " + BracketNameWithQuotes(src)
  1906. oscmd(cmd)
  1907. ##########################################################################################
  1908. #
  1909. # CompileAnything
  1910. #
  1911. ##########################################################################################
  1912. def CompileAnything(target, inputs, opts, progress = None):
  1913. if (opts.count("DEPENDENCYONLY")):
  1914. return
  1915. if (len(inputs)==0):
  1916. exit("No input files for target "+target)
  1917. infile = inputs[0]
  1918. origsuffix = GetOrigExt(target)
  1919. if (len(inputs) == 1 and origsuffix == GetOrigExt(infile)):
  1920. # It must be a simple copy operation.
  1921. ProgressOutput(progress, "Copying file", target)
  1922. CopyFile(target, infile)
  1923. if (origsuffix==".exe" and GetHost() != "windows"):
  1924. os.system("chmod +x \"%s\"" % target)
  1925. return
  1926. elif (infile.endswith(".py")):
  1927. if origsuffix == ".obj":
  1928. source = os.path.splitext(target)[0] + ".c"
  1929. SetOrigExt(source, ".c")
  1930. ProgressOutput(progress, "Building frozen source", source)
  1931. FreezePy(source, inputs, opts)
  1932. ProgressOutput(progress, "Building C++ object", target)
  1933. return CompileCxx(target, source, opts)
  1934. if origsuffix == ".exe":
  1935. ProgressOutput(progress, "Building frozen executable", target)
  1936. else:
  1937. ProgressOutput(progress, "Building frozen library", target)
  1938. return FreezePy(target, inputs, opts)
  1939. elif (infile.endswith(".idl")):
  1940. ProgressOutput(progress, "Compiling MIDL file", infile)
  1941. return CompileMIDL(target, infile, opts)
  1942. elif (infile.endswith(".pdef")):
  1943. if origsuffix == '.p3d':
  1944. ProgressOutput(progress, "Building package", target)
  1945. else:
  1946. ProgressOutput(progress, "Building package from pdef file", infile)
  1947. return Package(target, inputs, opts)
  1948. elif origsuffix in SUFFIX_LIB:
  1949. ProgressOutput(progress, "Linking static library", target)
  1950. return CompileLib(target, inputs, opts)
  1951. elif origsuffix in SUFFIX_DLL or (origsuffix==".plugin" and GetTarget() != "darwin"):
  1952. if (origsuffix==".exe"):
  1953. ProgressOutput(progress, "Linking executable", target)
  1954. else:
  1955. ProgressOutput(progress, "Linking dynamic library", target)
  1956. # Add version number to the dynamic library, on unix
  1957. if origsuffix == ".dll" and "MODULE" not in opts and not RTDIST:
  1958. tplatform = GetTarget()
  1959. if tplatform == "darwin":
  1960. # On Mac, libraries are named like libpanda.1.2.dylib
  1961. if target.lower().endswith(".dylib"):
  1962. target = target[:-5] + MAJOR_VERSION + ".dylib"
  1963. SetOrigExt(target, origsuffix)
  1964. elif tplatform != "windows" and tplatform != "android":
  1965. # On Linux, libraries are named like libpanda.so.1.2
  1966. target += "." + MAJOR_VERSION
  1967. SetOrigExt(target, origsuffix)
  1968. return CompileLink(target, inputs, opts)
  1969. elif (origsuffix==".in"):
  1970. ProgressOutput(progress, "Building Interrogate database", target)
  1971. args = CompileIgate(target, inputs, opts)
  1972. ProgressOutput(progress, "Building C++ object", args[0])
  1973. return CompileCxx(*args)
  1974. elif (origsuffix==".plugin" and GetTarget() == "darwin"):
  1975. ProgressOutput(progress, "Building plugin bundle", target)
  1976. return CompileBundle(target, inputs, opts)
  1977. elif (origsuffix==".app"):
  1978. ProgressOutput(progress, "Building application bundle", target)
  1979. return CompileBundle(target, inputs, opts)
  1980. elif (origsuffix==".pz"):
  1981. ProgressOutput(progress, "Compressing", target)
  1982. return CompileEgg(target, infile, opts)
  1983. elif (origsuffix==".egg"):
  1984. ProgressOutput(progress, "Converting", target)
  1985. return CompileEgg(target, infile, opts)
  1986. elif (origsuffix==".res"):
  1987. ProgressOutput(progress, "Building resource object", target)
  1988. return CompileRes(target, infile, opts)
  1989. elif (origsuffix==".rsrc"):
  1990. ProgressOutput(progress, "Building resource object", target)
  1991. return CompileRsrc(target, infile, opts)
  1992. elif (origsuffix==".class"):
  1993. ProgressOutput(progress, "Building Java class", target)
  1994. return CompileJava(target, infile, opts)
  1995. elif (origsuffix==".obj"):
  1996. if (infile.endswith(".cxx")):
  1997. ProgressOutput(progress, "Building C++ object", target)
  1998. return CompileCxx(target, infile, opts)
  1999. elif (infile.endswith(".c")):
  2000. ProgressOutput(progress, "Building C object", target)
  2001. return CompileCxx(target, infile, opts)
  2002. elif (infile.endswith(".mm")):
  2003. ProgressOutput(progress, "Building Objective-C++ object", target)
  2004. return CompileCxx(target, infile, opts)
  2005. elif (infile.endswith(".yxx")):
  2006. ProgressOutput(progress, "Building Bison object", target)
  2007. return CompileBison(target, infile, opts)
  2008. elif (infile.endswith(".lxx")):
  2009. ProgressOutput(progress, "Building Flex object", target)
  2010. return CompileFlex(target, infile, opts)
  2011. elif (infile.endswith(".in")):
  2012. ProgressOutput(progress, "Building Interrogate object", target)
  2013. return CompileImod(target, inputs, opts)
  2014. elif (infile.endswith(".rc")):
  2015. ProgressOutput(progress, "Building resource object", target)
  2016. return CompileRes(target, infile, opts)
  2017. elif (infile.endswith(".r")):
  2018. ProgressOutput(progress, "Building resource object", target)
  2019. return CompileRsrc(target, infile, opts)
  2020. exit("Don't know how to compile: %s from %s" % (target, inputs))
  2021. ##########################################################################################
  2022. #
  2023. # Generate dtool_config.h, prc_parameters.h, and dtool_have_xxx.dat
  2024. #
  2025. ##########################################################################################
  2026. DTOOL_CONFIG=[
  2027. #_Variable_________________________Windows___________________Unix__________
  2028. ("HAVE_PYTHON", '1', '1'),
  2029. ("USE_DEBUG_PYTHON", 'UNDEF', 'UNDEF'),
  2030. ("PYTHON_FRAMEWORK", 'UNDEF', 'UNDEF'),
  2031. ("COMPILE_IN_DEFAULT_FONT", '1', '1'),
  2032. ("STDFLOAT_DOUBLE", 'UNDEF', 'UNDEF'),
  2033. ("HAVE_MAYA", '1', '1'),
  2034. ("HAVE_SOFTIMAGE", 'UNDEF', 'UNDEF'),
  2035. ("REPORT_OPENSSL_ERRORS", '1', '1'),
  2036. ("USE_PANDAFILESTREAM", '1', '1'),
  2037. ("USE_DELETED_CHAIN", '1', '1'),
  2038. ("HAVE_GLX", 'UNDEF', '1'),
  2039. ("HAVE_WGL", '1', 'UNDEF'),
  2040. ("HAVE_DX9", 'UNDEF', 'UNDEF'),
  2041. ("HAVE_THREADS", '1', '1'),
  2042. ("SIMPLE_THREADS", 'UNDEF', 'UNDEF'),
  2043. ("OS_SIMPLE_THREADS", '1', '1'),
  2044. ("DEBUG_THREADS", 'UNDEF', 'UNDEF'),
  2045. ("HAVE_POSIX_THREADS", 'UNDEF', '1'),
  2046. ("HAVE_AUDIO", '1', '1'),
  2047. ("NOTIFY_DEBUG", 'UNDEF', 'UNDEF'),
  2048. ("DO_PSTATS", 'UNDEF', 'UNDEF'),
  2049. ("DO_DCAST", 'UNDEF', 'UNDEF'),
  2050. ("DO_COLLISION_RECORDING", 'UNDEF', 'UNDEF'),
  2051. ("SUPPORT_IMMEDIATE_MODE", 'UNDEF', 'UNDEF'),
  2052. ("SUPPORT_FIXED_FUNCTION", '1', '1'),
  2053. ("DO_MEMORY_USAGE", 'UNDEF', 'UNDEF'),
  2054. ("DO_PIPELINING", '1', '1'),
  2055. ("DEFAULT_PATHSEP", '";"', '":"'),
  2056. ("WORDS_BIGENDIAN", 'UNDEF', 'UNDEF'),
  2057. ("HAVE_NAMESPACE", '1', '1'),
  2058. ("HAVE_OPEN_MASK", 'UNDEF', 'UNDEF'),
  2059. ("HAVE_LOCKF", '1', '1'),
  2060. ("HAVE_WCHAR_T", '1', '1'),
  2061. ("HAVE_WSTRING", '1', '1'),
  2062. ("HAVE_TYPENAME", '1', '1'),
  2063. ("SIMPLE_STRUCT_POINTERS", '1', 'UNDEF'),
  2064. ("HAVE_DINKUM", 'UNDEF', 'UNDEF'),
  2065. ("HAVE_STL_HASH", 'UNDEF', 'UNDEF'),
  2066. ("GETTIMEOFDAY_ONE_PARAM", 'UNDEF', 'UNDEF'),
  2067. ("HAVE_GETOPT", 'UNDEF', '1'),
  2068. ("HAVE_GETOPT_LONG_ONLY", 'UNDEF', '1'),
  2069. ("PHAVE_GETOPT_H", 'UNDEF', '1'),
  2070. ("PHAVE_LINUX_INPUT_H", 'UNDEF', '1'),
  2071. ("IOCTL_TERMINAL_WIDTH", 'UNDEF', '1'),
  2072. ("HAVE_STREAMSIZE", '1', '1'),
  2073. ("HAVE_IOS_TYPEDEFS", '1', '1'),
  2074. ("HAVE_IOS_BINARY", '1', '1'),
  2075. ("STATIC_INIT_GETENV", '1', 'UNDEF'),
  2076. ("HAVE_PROC_SELF_EXE", 'UNDEF', '1'),
  2077. ("HAVE_PROC_SELF_MAPS", 'UNDEF', '1'),
  2078. ("HAVE_PROC_SELF_ENVIRON", 'UNDEF', '1'),
  2079. ("HAVE_PROC_SELF_CMDLINE", 'UNDEF', '1'),
  2080. ("HAVE_PROC_CURPROC_FILE", 'UNDEF', 'UNDEF'),
  2081. ("HAVE_PROC_CURPROC_MAP", 'UNDEF', 'UNDEF'),
  2082. ("HAVE_PROC_SELF_CMDLINE", 'UNDEF', 'UNDEF'),
  2083. ("HAVE_GLOBAL_ARGV", '1', 'UNDEF'),
  2084. ("PROTOTYPE_GLOBAL_ARGV", 'UNDEF', 'UNDEF'),
  2085. ("GLOBAL_ARGV", '__argv', 'UNDEF'),
  2086. ("GLOBAL_ARGC", '__argc', 'UNDEF'),
  2087. ("PHAVE_IO_H", '1', 'UNDEF'),
  2088. ("PHAVE_IOSTREAM", '1', '1'),
  2089. ("PHAVE_STRING_H", 'UNDEF', '1'),
  2090. ("PHAVE_LIMITS_H", 'UNDEF', '1'),
  2091. ("PHAVE_STDLIB_H", 'UNDEF', '1'),
  2092. ("PHAVE_MALLOC_H", '1', '1'),
  2093. ("PHAVE_SYS_MALLOC_H", 'UNDEF', 'UNDEF'),
  2094. ("PHAVE_ALLOCA_H", 'UNDEF', '1'),
  2095. ("PHAVE_LOCALE_H", 'UNDEF', '1'),
  2096. ("PHAVE_MINMAX_H", '1', 'UNDEF'),
  2097. ("PHAVE_SSTREAM", '1', '1'),
  2098. ("PHAVE_NEW", '1', '1'),
  2099. ("PHAVE_SYS_TYPES_H", '1', '1'),
  2100. ("PHAVE_SYS_TIME_H", 'UNDEF', '1'),
  2101. ("PHAVE_UNISTD_H", 'UNDEF', '1'),
  2102. ("PHAVE_UTIME_H", 'UNDEF', '1'),
  2103. ("PHAVE_GLOB_H", 'UNDEF', '1'),
  2104. ("PHAVE_DIRENT_H", 'UNDEF', '1'),
  2105. ("PHAVE_SYS_SOUNDCARD_H", 'UNDEF', '1'),
  2106. ("PHAVE_UCONTEXT_H", 'UNDEF', '1'),
  2107. ("PHAVE_STDINT_H", '1', '1'),
  2108. ("HAVE_RTTI", '1', '1'),
  2109. ("HAVE_X11", 'UNDEF', '1'),
  2110. ("IS_LINUX", 'UNDEF', '1'),
  2111. ("IS_OSX", 'UNDEF', 'UNDEF'),
  2112. ("IS_FREEBSD", 'UNDEF', 'UNDEF'),
  2113. ("HAVE_EIGEN", 'UNDEF', 'UNDEF'),
  2114. ("LINMATH_ALIGN", '1', '1'),
  2115. ("HAVE_ZLIB", 'UNDEF', 'UNDEF'),
  2116. ("HAVE_PNG", 'UNDEF', 'UNDEF'),
  2117. ("HAVE_JPEG", 'UNDEF', 'UNDEF'),
  2118. ("PHAVE_JPEGINT_H", '1', '1'),
  2119. ("HAVE_VIDEO4LINUX", 'UNDEF', '1'),
  2120. ("HAVE_TIFF", 'UNDEF', 'UNDEF'),
  2121. ("HAVE_OPENEXR", 'UNDEF', 'UNDEF'),
  2122. ("HAVE_SGI_RGB", '1', '1'),
  2123. ("HAVE_TGA", '1', '1'),
  2124. ("HAVE_IMG", '1', '1'),
  2125. ("HAVE_SOFTIMAGE_PIC", '1', '1'),
  2126. ("HAVE_BMP", '1', '1'),
  2127. ("HAVE_PNM", '1', '1'),
  2128. ("HAVE_STB_IMAGE", '1', '1'),
  2129. ("HAVE_VORBIS", 'UNDEF', 'UNDEF'),
  2130. ("HAVE_OPUS", 'UNDEF', 'UNDEF'),
  2131. ("HAVE_FREETYPE", 'UNDEF', 'UNDEF'),
  2132. ("HAVE_FFTW", 'UNDEF', 'UNDEF'),
  2133. ("HAVE_OPENSSL", 'UNDEF', 'UNDEF'),
  2134. ("HAVE_NET", 'UNDEF', 'UNDEF'),
  2135. ("WANT_NATIVE_NET", '1', '1'),
  2136. ("SIMULATE_NETWORK_DELAY", 'UNDEF', 'UNDEF'),
  2137. ("HAVE_CG", 'UNDEF', 'UNDEF'),
  2138. ("HAVE_CGGL", 'UNDEF', 'UNDEF'),
  2139. ("HAVE_CGDX9", 'UNDEF', 'UNDEF'),
  2140. ("HAVE_ARTOOLKIT", 'UNDEF', 'UNDEF'),
  2141. ("HAVE_DIRECTCAM", 'UNDEF', 'UNDEF'),
  2142. ("HAVE_SQUISH", 'UNDEF', 'UNDEF'),
  2143. ("HAVE_CARBON", 'UNDEF', 'UNDEF'),
  2144. ("HAVE_COCOA", 'UNDEF', 'UNDEF'),
  2145. ("HAVE_OPENAL_FRAMEWORK", 'UNDEF', 'UNDEF'),
  2146. ("HAVE_ROCKET_PYTHON", '1', '1'),
  2147. ("HAVE_ROCKET_DEBUGGER", 'UNDEF', 'UNDEF'),
  2148. ("USE_TAU", 'UNDEF', 'UNDEF'),
  2149. ("PRC_SAVE_DESCRIPTIONS", '1', '1'),
  2150. # ("_SECURE_SCL", '0', 'UNDEF'),
  2151. # ("_SECURE_SCL_THROWS", '0', 'UNDEF'),
  2152. ("HAVE_P3D_PLUGIN", 'UNDEF', 'UNDEF'),
  2153. ]
  2154. PRC_PARAMETERS=[
  2155. ("DEFAULT_PRC_DIR", '"<auto>etc"', '"<auto>etc"'),
  2156. ("PRC_DIR_ENVVARS", '"PANDA_PRC_DIR"', '"PANDA_PRC_DIR"'),
  2157. ("PRC_PATH_ENVVARS", '"PANDA_PRC_PATH"', '"PANDA_PRC_PATH"'),
  2158. ("PRC_PATH2_ENVVARS", '""', '""'),
  2159. ("PRC_PATTERNS", '"*.prc"', '"*.prc"'),
  2160. ("PRC_ENCRYPTED_PATTERNS", '"*.prc.pe"', '"*.prc.pe"'),
  2161. ("PRC_ENCRYPTION_KEY", '""', '""'),
  2162. ("PRC_EXECUTABLE_PATTERNS", '""', '""'),
  2163. ("PRC_EXECUTABLE_ARGS_ENVVAR", '"PANDA_PRC_XARGS"', '"PANDA_PRC_XARGS"'),
  2164. ("PRC_PUBLIC_KEYS_FILENAME", '""', '""'),
  2165. ("PRC_RESPECT_TRUST_LEVEL", 'UNDEF', 'UNDEF'),
  2166. ("PRC_DCONFIG_TRUST_LEVEL", '0', '0'),
  2167. ("PRC_INC_TRUST_LEVEL", '0', '0'),
  2168. ]
  2169. def WriteConfigSettings():
  2170. dtool_config={}
  2171. prc_parameters={}
  2172. speedtree_parameters={}
  2173. plugin_config={}
  2174. if (GetTarget() == 'windows'):
  2175. for key,win,unix in DTOOL_CONFIG:
  2176. dtool_config[key] = win
  2177. for key,win,unix in PRC_PARAMETERS:
  2178. prc_parameters[key] = win
  2179. else:
  2180. for key,win,unix in DTOOL_CONFIG:
  2181. dtool_config[key] = unix
  2182. for key,win,unix in PRC_PARAMETERS:
  2183. prc_parameters[key] = unix
  2184. for x in PkgListGet():
  2185. if ("HAVE_"+x in dtool_config):
  2186. if (PkgSkip(x)==0):
  2187. dtool_config["HAVE_"+x] = '1'
  2188. else:
  2189. dtool_config["HAVE_"+x] = 'UNDEF'
  2190. dtool_config["HAVE_NET"] = '1'
  2191. if (PkgSkip("NVIDIACG")==0):
  2192. dtool_config["HAVE_CG"] = '1'
  2193. dtool_config["HAVE_CGGL"] = '1'
  2194. dtool_config["HAVE_CGDX9"] = '1'
  2195. if GetTarget() not in ("linux", "android"):
  2196. dtool_config["HAVE_PROC_SELF_EXE"] = 'UNDEF'
  2197. dtool_config["HAVE_PROC_SELF_MAPS"] = 'UNDEF'
  2198. dtool_config["HAVE_PROC_SELF_CMDLINE"] = 'UNDEF'
  2199. dtool_config["HAVE_PROC_SELF_ENVIRON"] = 'UNDEF'
  2200. if (GetTarget() == "darwin"):
  2201. dtool_config["PYTHON_FRAMEWORK"] = 'Python'
  2202. dtool_config["PHAVE_MALLOC_H"] = 'UNDEF'
  2203. dtool_config["PHAVE_SYS_MALLOC_H"] = '1'
  2204. dtool_config["HAVE_OPENAL_FRAMEWORK"] = '1'
  2205. dtool_config["HAVE_X11"] = 'UNDEF' # We might have X11, but we don't need it.
  2206. dtool_config["HAVE_GLX"] = 'UNDEF'
  2207. dtool_config["IS_LINUX"] = 'UNDEF'
  2208. dtool_config["HAVE_VIDEO4LINUX"] = 'UNDEF'
  2209. dtool_config["IS_OSX"] = '1'
  2210. # 10.4 had a broken ucontext implementation
  2211. if int(platform.mac_ver()[0][3]) <= 4:
  2212. dtool_config["PHAVE_UCONTEXT_H"] = 'UNDEF'
  2213. if (GetTarget() == "freebsd"):
  2214. dtool_config["IS_LINUX"] = 'UNDEF'
  2215. dtool_config["HAVE_VIDEO4LINUX"] = 'UNDEF'
  2216. dtool_config["IS_FREEBSD"] = '1'
  2217. dtool_config["PHAVE_ALLOCA_H"] = 'UNDEF'
  2218. dtool_config["PHAVE_MALLOC_H"] = 'UNDEF'
  2219. dtool_config["PHAVE_LINUX_INPUT_H"] = 'UNDEF'
  2220. dtool_config["HAVE_PROC_CURPROC_FILE"] = '1'
  2221. dtool_config["HAVE_PROC_CURPROC_MAP"] = '1'
  2222. dtool_config["HAVE_PROC_CURPROC_CMDLINE"] = '1'
  2223. if (GetTarget() == "android"):
  2224. # Android does have RTTI, but we disable it anyway.
  2225. dtool_config["HAVE_RTTI"] = 'UNDEF'
  2226. dtool_config["PHAVE_GLOB_H"] = 'UNDEF'
  2227. dtool_config["HAVE_LOCKF"] = 'UNDEF'
  2228. dtool_config["HAVE_VIDEO4LINUX"] = 'UNDEF'
  2229. if (GetOptimize() <= 2 and GetTarget() == "windows"):
  2230. dtool_config["USE_DEBUG_PYTHON"] = '1'
  2231. # This should probably be more sophisticated, such as based
  2232. # on whether the libRocket Python modules are available.
  2233. if (PkgSkip("PYTHON") != 0):
  2234. dtool_config["HAVE_ROCKET_PYTHON"] = 'UNDEF'
  2235. if (GetOptimize() <= 3):
  2236. dtool_config["HAVE_ROCKET_DEBUGGER"] = '1'
  2237. if (GetOptimize() <= 3):
  2238. if (dtool_config["HAVE_NET"] != 'UNDEF'):
  2239. dtool_config["DO_PSTATS"] = '1'
  2240. if (GetOptimize() <= 3):
  2241. dtool_config["DO_DCAST"] = '1'
  2242. if (GetOptimize() <= 3):
  2243. dtool_config["DO_COLLISION_RECORDING"] = '1'
  2244. if (GetOptimize() <= 3):
  2245. dtool_config["DO_MEMORY_USAGE"] = '1'
  2246. if (GetOptimize() <= 3):
  2247. dtool_config["NOTIFY_DEBUG"] = '1'
  2248. if (GetOptimize() >= 4):
  2249. dtool_config["PRC_SAVE_DESCRIPTIONS"] = 'UNDEF'
  2250. if (GetOptimize() >= 4):
  2251. # Disable RTTI on release builds.
  2252. dtool_config["HAVE_RTTI"] = 'UNDEF'
  2253. # Now that we have OS_SIMPLE_THREADS, we can support
  2254. # SIMPLE_THREADS on exotic architectures like win64, so we no
  2255. # longer need to disable it for this platform.
  2256. ## if GetTarget() == 'windows' and GetTargetArch() == 'x64':
  2257. ## dtool_config["SIMPLE_THREADS"] = 'UNDEF'
  2258. if (RTDIST or RUNTIME):
  2259. prc_parameters["DEFAULT_PRC_DIR"] = '""'
  2260. if HOST_URL:
  2261. plugin_config["PANDA_PACKAGE_HOST_URL"] = HOST_URL
  2262. #plugin_config["P3D_PLUGIN_LOG_DIRECTORY"] = ""
  2263. plugin_config["P3D_PLUGIN_LOG_BASENAME1"] = ""
  2264. plugin_config["P3D_PLUGIN_LOG_BASENAME2"] = ""
  2265. plugin_config["P3D_PLUGIN_LOG_BASENAME3"] = ""
  2266. plugin_config["P3D_PLUGIN_P3D_PLUGIN"] = ""
  2267. plugin_config["P3D_PLUGIN_P3DPYTHON"] = ""
  2268. plugin_config["P3D_COREAPI_VERSION_STR"] = COREAPI_VERSION
  2269. plugin_config["P3D_PLUGIN_VERSION_STR"] = PLUGIN_VERSION
  2270. if PkgSkip("GTK2") == 0:
  2271. plugin_config["HAVE_GTK"] = '1'
  2272. if (RUNTIME):
  2273. dtool_config["HAVE_P3D_PLUGIN"] = '1'
  2274. # Whether it's present on the system doesn't matter here,
  2275. # as the runtime itself doesn't include or link with X11.
  2276. if (RUNTIME and GetTarget() == 'linux'):
  2277. dtool_config["HAVE_X11"] = '1'
  2278. if ("GENERIC_DXERR_LIBRARY" in SDK):
  2279. dtool_config["USE_GENERIC_DXERR_LIBRARY"] = "1"
  2280. else:
  2281. dtool_config["USE_GENERIC_DXERR_LIBRARY"] = "UNDEF"
  2282. if (PkgSkip("SPEEDTREE")==0):
  2283. speedtree_parameters["SPEEDTREE_OPENGL"] = "UNDEF"
  2284. speedtree_parameters["SPEEDTREE_DIRECTX9"] = "UNDEF"
  2285. if SDK["SPEEDTREEAPI"] == "OpenGL":
  2286. speedtree_parameters["SPEEDTREE_OPENGL"] = "1"
  2287. elif SDK["SPEEDTREEAPI"] == "DirectX9":
  2288. speedtree_parameters["SPEEDTREE_DIRECTX9"] = "1"
  2289. speedtree_parameters["SPEEDTREE_BIN_DIR"] = (SDK["SPEEDTREE"] + "/Bin")
  2290. conf = "/* prc_parameters.h. Generated automatically by makepanda.py */\n"
  2291. for key in sorted(prc_parameters.keys()):
  2292. if ((key == "DEFAULT_PRC_DIR") or (key[:4]=="PRC_")):
  2293. val = OverrideValue(key, prc_parameters[key])
  2294. if (val == 'UNDEF'): conf = conf + "#undef " + key + "\n"
  2295. else: conf = conf + "#define " + key + " " + val + "\n"
  2296. ConditionalWriteFile(GetOutputDir() + '/include/prc_parameters.h', conf)
  2297. conf = "/* dtool_config.h. Generated automatically by makepanda.py */\n"
  2298. for key in sorted(dtool_config.keys()):
  2299. val = OverrideValue(key, dtool_config[key])
  2300. if (val == 'UNDEF'): conf = conf + "#undef " + key + "\n"
  2301. else: conf = conf + "#define " + key + " " + val + "\n"
  2302. ConditionalWriteFile(GetOutputDir() + '/include/dtool_config.h', conf)
  2303. if (RTDIST or RUNTIME):
  2304. conf = "/* p3d_plugin_config.h. Generated automatically by makepanda.py */\n"
  2305. for key in sorted(plugin_config.keys()):
  2306. val = plugin_config[key]
  2307. if (val == 'UNDEF'): conf = conf + "#undef " + key + "\n"
  2308. else: conf = conf + "#define " + key + " \"" + val.replace("\\", "\\\\") + "\"\n"
  2309. ConditionalWriteFile(GetOutputDir() + '/include/p3d_plugin_config.h', conf)
  2310. if (PkgSkip("SPEEDTREE")==0):
  2311. conf = "/* speedtree_parameters.h. Generated automatically by makepanda.py */\n"
  2312. for key in sorted(speedtree_parameters.keys()):
  2313. val = OverrideValue(key, speedtree_parameters[key])
  2314. if (val == 'UNDEF'): conf = conf + "#undef " + key + "\n"
  2315. else: conf = conf + "#define " + key + " \"" + val.replace("\\", "\\\\") + "\"\n"
  2316. ConditionalWriteFile(GetOutputDir() + '/include/speedtree_parameters.h', conf)
  2317. for x in PkgListGet():
  2318. if (PkgSkip(x)): ConditionalWriteFile(GetOutputDir() + '/tmp/dtool_have_'+x.lower()+'.dat', "0\n")
  2319. else: ConditionalWriteFile(GetOutputDir() + '/tmp/dtool_have_'+x.lower()+'.dat', "1\n")
  2320. # Finally, write a platform.dat with the platform we are compiling for.
  2321. ConditionalWriteFile(GetOutputDir() + '/tmp/platform.dat', PLATFORM)
  2322. WriteConfigSettings()
  2323. WarnConflictingFiles()
  2324. if SystemLibraryExists("dtoolbase"):
  2325. print("%sWARNING:%s Found conflicting Panda3D libraries from other ppremake build!" % (GetColor("red"), GetColor()))
  2326. if SystemLibraryExists("p3dtoolconfig"):
  2327. print("%sWARNING:%s Found conflicting Panda3D libraries from other makepanda build!" % (GetColor("red"), GetColor()))
  2328. ##########################################################################################
  2329. #
  2330. # Generate pandaVersion.h, pythonversion, null.cxx, etc.
  2331. #
  2332. ##########################################################################################
  2333. PANDAVERSION_H="""
  2334. #define PANDA_MAJOR_VERSION $VERSION1
  2335. #define PANDA_MINOR_VERSION $VERSION2
  2336. #define PANDA_SEQUENCE_VERSION $VERSION3
  2337. #define PANDA_VERSION $NVERSION
  2338. #define PANDA_NUMERIC_VERSION $NVERSION
  2339. #define PANDA_VERSION_STR "$VERSION1.$VERSION2.$VERSION3"
  2340. #define PANDA_ABI_VERSION_STR "$VERSION1.$VERSION2"
  2341. #define PANDA_DISTRIBUTOR "$DISTRIBUTOR"
  2342. #define PANDA_PACKAGE_VERSION_STR "$RTDIST_VERSION"
  2343. #define PANDA_PACKAGE_HOST_URL "$HOST_URL"
  2344. """
  2345. PANDAVERSION_H_RUNTIME="""
  2346. #define PANDA_MAJOR_VERSION 0
  2347. #define PANDA_MINOR_VERSION 0
  2348. #define PANDA_SEQUENCE_VERSION 0
  2349. #define PANDA_VERSION_STR "0.0.0"
  2350. #define PANDA_ABI_VERSION_STR "0.0"
  2351. #define P3D_PLUGIN_MAJOR_VERSION $VERSION1
  2352. #define P3D_PLUGIN_MINOR_VERSION $VERSION2
  2353. #define P3D_PLUGIN_SEQUENCE_VERSION $VERSION3
  2354. #define P3D_PLUGIN_VERSION_STR "$VERSION1.$VERSION2.$VERSION3"
  2355. #define P3D_COREAPI_VERSION_STR "$COREAPI_VERSION"
  2356. #define PANDA_DISTRIBUTOR "$DISTRIBUTOR"
  2357. #define PANDA_PACKAGE_VERSION_STR ""
  2358. #define PANDA_PACKAGE_HOST_URL "$HOST_URL"
  2359. """
  2360. CHECKPANDAVERSION_CXX="""
  2361. # include "dtoolbase.h"
  2362. EXPCL_DTOOL_DTOOLUTIL int panda_version_$VERSION1_$VERSION2 = 0;
  2363. """
  2364. CHECKPANDAVERSION_H="""
  2365. # include "dtoolbase.h"
  2366. extern EXPCL_DTOOL_DTOOLUTIL int panda_version_$VERSION1_$VERSION2;
  2367. # ifndef WIN32
  2368. /* For Windows, exporting the symbol from the DLL is sufficient; the
  2369. DLL will not load unless all expected public symbols are defined.
  2370. Other systems may not mind if the symbol is absent unless we
  2371. explictly write code that references it. */
  2372. static int check_panda_version = panda_version_$VERSION1_$VERSION2;
  2373. # endif
  2374. """
  2375. P3DACTIVEX_RC="""#include "resource.h"
  2376. #define APSTUDIO_READONLY_SYMBOLS
  2377. #include "afxres.h"
  2378. #undef APSTUDIO_READONLY_SYMBOLS
  2379. #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
  2380. #ifdef _WIN32
  2381. LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
  2382. #pragma code_page(1252)
  2383. #endif
  2384. #ifdef APSTUDIO_INVOKED
  2385. 1 TEXTINCLUDE
  2386. BEGIN
  2387. "resource.h\\0"
  2388. END
  2389. 2 TEXTINCLUDE
  2390. BEGIN
  2391. "#include ""afxres.h""\\r\\n"
  2392. "\\0"
  2393. END
  2394. 3 TEXTINCLUDE
  2395. BEGIN
  2396. "1 TYPELIB ""P3DActiveX.tlb""\\r\\n"
  2397. "\\0"
  2398. END
  2399. #endif
  2400. %s
  2401. IDB_P3DACTIVEX BITMAP "P3DActiveXCtrl.bmp"
  2402. IDD_PROPPAGE_P3DACTIVEX DIALOG 0, 0, 250, 62
  2403. STYLE DS_SETFONT | WS_CHILD
  2404. FONT 8, "MS Sans Serif"
  2405. BEGIN
  2406. LTEXT "TODO: Place controls to manipulate properties of P3DActiveX Control on this dialog.",
  2407. IDC_STATIC,7,25,229,16
  2408. END
  2409. #ifdef APSTUDIO_INVOKED
  2410. GUIDELINES DESIGNINFO
  2411. BEGIN
  2412. IDD_PROPPAGE_P3DACTIVEX, DIALOG
  2413. BEGIN
  2414. LEFTMARGIN, 7
  2415. RIGHTMARGIN, 243
  2416. TOPMARGIN, 7
  2417. BOTTOMMARGIN, 55
  2418. END
  2419. END
  2420. #endif
  2421. STRINGTABLE
  2422. BEGIN
  2423. IDS_P3DACTIVEX "P3DActiveX Control"
  2424. IDS_P3DACTIVEX_PPG "P3DActiveX Property Page"
  2425. END
  2426. STRINGTABLE
  2427. BEGIN
  2428. IDS_P3DACTIVEX_PPG_CAPTION "General"
  2429. END
  2430. #endif
  2431. #ifndef APSTUDIO_INVOKED
  2432. 1 TYPELIB "P3DActiveX.tlb"
  2433. #endif"""
  2434. def CreatePandaVersionFiles():
  2435. version1=int(VERSION.split(".")[0])
  2436. version2=int(VERSION.split(".")[1])
  2437. version3=int(VERSION.split(".")[2])
  2438. nversion=version1*1000000+version2*1000+version3
  2439. if (DISTRIBUTOR != "cmu"):
  2440. # Subtract 1 if we are not an official version.
  2441. nversion -= 1
  2442. if (RUNTIME):
  2443. pandaversion_h = PANDAVERSION_H_RUNTIME
  2444. else:
  2445. pandaversion_h = PANDAVERSION_H
  2446. pandaversion_h = pandaversion_h.replace("$VERSION1",str(version1))
  2447. pandaversion_h = pandaversion_h.replace("$VERSION2",str(version2))
  2448. pandaversion_h = pandaversion_h.replace("$VERSION3",str(version3))
  2449. pandaversion_h = pandaversion_h.replace("$NVERSION",str(nversion))
  2450. pandaversion_h = pandaversion_h.replace("$DISTRIBUTOR",DISTRIBUTOR)
  2451. pandaversion_h = pandaversion_h.replace("$RTDIST_VERSION",RTDIST_VERSION)
  2452. pandaversion_h = pandaversion_h.replace("$COREAPI_VERSION",COREAPI_VERSION)
  2453. pandaversion_h = pandaversion_h.replace("$HOST_URL",(HOST_URL or ""))
  2454. if (DISTRIBUTOR == "cmu"):
  2455. pandaversion_h += "\n#define PANDA_OFFICIAL_VERSION\n"
  2456. else:
  2457. pandaversion_h += "\n#undef PANDA_OFFICIAL_VERSION\n"
  2458. if GIT_COMMIT:
  2459. pandaversion_h += "\n#define PANDA_GIT_COMMIT_STR \"%s\"\n" % (GIT_COMMIT)
  2460. if not RUNTIME:
  2461. checkpandaversion_cxx = CHECKPANDAVERSION_CXX.replace("$VERSION1",str(version1))
  2462. checkpandaversion_cxx = checkpandaversion_cxx.replace("$VERSION2",str(version2))
  2463. checkpandaversion_cxx = checkpandaversion_cxx.replace("$VERSION3",str(version3))
  2464. checkpandaversion_cxx = checkpandaversion_cxx.replace("$NVERSION",str(nversion))
  2465. checkpandaversion_h = CHECKPANDAVERSION_H.replace("$VERSION1",str(version1))
  2466. checkpandaversion_h = checkpandaversion_h.replace("$VERSION2",str(version2))
  2467. checkpandaversion_h = checkpandaversion_h.replace("$VERSION3",str(version3))
  2468. checkpandaversion_h = checkpandaversion_h.replace("$NVERSION",str(nversion))
  2469. ConditionalWriteFile(GetOutputDir()+'/include/pandaVersion.h', pandaversion_h)
  2470. if RUNTIME:
  2471. ConditionalWriteFile(GetOutputDir()+'/include/checkPandaVersion.cxx', '')
  2472. ConditionalWriteFile(GetOutputDir()+'/include/checkPandaVersion.h', '')
  2473. else:
  2474. ConditionalWriteFile(GetOutputDir()+'/include/checkPandaVersion.cxx', checkpandaversion_cxx)
  2475. ConditionalWriteFile(GetOutputDir()+'/include/checkPandaVersion.h', checkpandaversion_h)
  2476. ConditionalWriteFile(GetOutputDir()+"/tmp/null.cxx","")
  2477. if RUNTIME:
  2478. p3dactivex_rc = {"name" : "Panda3D Game Engine Plug-in",
  2479. "version" : VERSION,
  2480. "description" : "Runs 3-D games and interactive applets",
  2481. "filename" : "p3dactivex.ocx",
  2482. "mimetype" : "application/x-panda3d",
  2483. "extension" : "p3d",
  2484. "filedesc" : "Panda3D applet"}
  2485. ConditionalWriteFile(GetOutputDir()+"/include/P3DActiveX.rc", P3DACTIVEX_RC % GenerateResourceFile(**p3dactivex_rc))
  2486. CreatePandaVersionFiles()
  2487. ##########################################################################################
  2488. #
  2489. # Copy the "direct" tree
  2490. #
  2491. ##########################################################################################
  2492. if (PkgSkip("DIRECT")==0):
  2493. CopyPythonTree(GetOutputDir() + '/direct', 'direct/src', threads=THREADCOUNT)
  2494. ConditionalWriteFile(GetOutputDir() + '/direct/__init__.py', "")
  2495. # This file used to be copied, but would nowadays cause conflicts.
  2496. # Let's get it out of the way in case someone hasn't cleaned their build since.
  2497. if os.path.isfile(GetOutputDir() + '/bin/panda3d.py'):
  2498. os.remove(GetOutputDir() + '/bin/panda3d.py')
  2499. if os.path.isfile(GetOutputDir() + '/lib/panda3d.py'):
  2500. os.remove(GetOutputDir() + '/lib/panda3d.py')
  2501. # This directory doesn't exist at all any more.
  2502. if os.path.isdir(os.path.join(GetOutputDir(), 'direct', 'ffi')):
  2503. shutil.rmtree(os.path.join(GetOutputDir(), 'direct', 'ffi'))
  2504. # These files used to exist; remove them to avoid conflicts.
  2505. del_files = ['core.py', 'core.pyc', 'core.pyo',
  2506. '_core.pyd', '_core.so',
  2507. 'direct.py', 'direct.pyc', 'direct.pyo',
  2508. '_direct.pyd', '_direct.so',
  2509. 'dtoolconfig.pyd', 'dtoolconfig.so']
  2510. for basename in del_files:
  2511. path = os.path.join(GetOutputDir(), 'panda3d', basename)
  2512. if os.path.isfile(path):
  2513. print("Removing %s" % (path))
  2514. os.remove(path)
  2515. # Write an appropriate panda3d/__init__.py
  2516. p3d_init = """"Python bindings for the Panda3D libraries"
  2517. __version__ = '%s'
  2518. """ % (WHLVERSION)
  2519. if GetTarget() == 'windows':
  2520. p3d_init += """
  2521. if '__file__' in locals():
  2522. import os
  2523. bindir = os.path.join(os.path.dirname(__file__), '..', 'bin')
  2524. if os.path.isdir(bindir):
  2525. if not os.environ.get('PATH'):
  2526. os.environ['PATH'] = bindir
  2527. else:
  2528. os.environ['PATH'] = bindir + os.pathsep + os.environ['PATH']
  2529. del os, bindir
  2530. """
  2531. if not PkgSkip("PYTHON"):
  2532. ConditionalWriteFile(GetOutputDir() + '/panda3d/__init__.py', p3d_init)
  2533. # Also add this file, for backward compatibility.
  2534. ConditionalWriteFile(GetOutputDir() + '/panda3d/dtoolconfig.py', """
  2535. if __debug__:
  2536. print("Warning: panda3d.dtoolconfig is deprecated, use panda3d.interrogatedb instead.")
  2537. from .interrogatedb import *
  2538. """)
  2539. # PandaModules is now deprecated; generate a shim for backward compatibility.
  2540. for fn in glob.glob(GetOutputDir() + '/pandac/*.py') + glob.glob(GetOutputDir() + '/pandac/*.py[co]'):
  2541. if os.path.basename(fn) not in ('PandaModules.py', '__init__.py'):
  2542. os.remove(fn)
  2543. panda_modules = ['core']
  2544. if not PkgSkip("PANDAPHYSICS"):
  2545. panda_modules.append('physics')
  2546. if not PkgSkip('PANDAFX'):
  2547. panda_modules.append('fx')
  2548. if not PkgSkip("DIRECT"):
  2549. panda_modules.append('direct')
  2550. if not PkgSkip("VISION"):
  2551. panda_modules.append('vision')
  2552. if not PkgSkip("SKEL"):
  2553. panda_modules.append('skel')
  2554. if not PkgSkip("EGG"):
  2555. panda_modules.append('egg')
  2556. if not PkgSkip("AWESOMIUM"):
  2557. panda_modules.append('awesomium')
  2558. if not PkgSkip("ODE"):
  2559. panda_modules.append('ode')
  2560. if not PkgSkip("VRPN"):
  2561. panda_modules.append('vrpn')
  2562. panda_modules_code = """
  2563. "This module is deprecated. Import from panda3d.core and other panda3d.* modules instead."
  2564. if __debug__:
  2565. print("Warning: pandac.PandaModules is deprecated, import from panda3d.core instead")
  2566. """
  2567. for module in panda_modules:
  2568. panda_modules_code += """
  2569. try:
  2570. from panda3d.%s import *
  2571. except ImportError as err:
  2572. if "No module named %s" not in str(err):
  2573. raise""" % (module, module)
  2574. exthelpers_code = """
  2575. "This module is deprecated. Import from direct.extensions_native.extension_native_helpers instead."
  2576. from direct.extensions_native.extension_native_helpers import *
  2577. """
  2578. if not PkgSkip("PYTHON"):
  2579. ConditionalWriteFile(GetOutputDir() + '/pandac/PandaModules.py', panda_modules_code)
  2580. ConditionalWriteFile(GetOutputDir() + '/pandac/extension_native_helpers.py', exthelpers_code)
  2581. ConditionalWriteFile(GetOutputDir() + '/pandac/__init__.py', '')
  2582. ##########################################################################################
  2583. #
  2584. # Write the dist-info directory.
  2585. #
  2586. ##########################################################################################
  2587. # This is just some basic stuff since setuptools just needs this file to
  2588. # exist, otherwise it will not read the entry_points.txt file. Maybe we will
  2589. # eventually want to merge this with the metadata generator in makewheel.py.
  2590. METADATA = """Metadata-Version: 2.0
  2591. Name: Panda3D
  2592. Version: {version}
  2593. License: BSD
  2594. Home-page: https://www.panda3d.org/
  2595. Author: Panda3D Team
  2596. Author-email: [email protected]
  2597. """
  2598. ENTRY_POINTS = """[distutils.commands]
  2599. build_apps = direct.showutil.dist:build_apps
  2600. bdist_apps = direct.showutil.dist:bdist_apps
  2601. """
  2602. if not PkgSkip("DIRECT"):
  2603. dist_dir = os.path.join(GetOutputDir(), 'panda3d.dist-info')
  2604. MakeDirectory(dist_dir)
  2605. ConditionalWriteFile(os.path.join(dist_dir, 'METADATA'), METADATA.format(version=VERSION))
  2606. ConditionalWriteFile(os.path.join(dist_dir, 'entry_points.txt'), ENTRY_POINTS)
  2607. ##########################################################################################
  2608. #
  2609. # Generate the PRC files into the ETC directory.
  2610. #
  2611. ##########################################################################################
  2612. confautoprc = ReadFile("makepanda/confauto.in")
  2613. if (PkgSkip("SPEEDTREE")==0):
  2614. # If SpeedTree is available, enable it in the config file
  2615. confautoprc = confautoprc.replace('#st#', '')
  2616. else:
  2617. # otherwise, disable it.
  2618. confautoprc = confautoprc.replace('#st#', '#')
  2619. if (os.path.isfile("makepanda/myconfig.in")):
  2620. configprc = ReadFile("makepanda/myconfig.in")
  2621. else:
  2622. configprc = ReadFile("makepanda/config.in")
  2623. if (GetTarget() == 'windows'):
  2624. configprc = configprc.replace("$XDG_CACHE_HOME/panda3d", "$USER_APPDATA/Panda3D-%s" % MAJOR_VERSION)
  2625. else:
  2626. configprc = configprc.replace("aux-display pandadx9", "")
  2627. if (GetTarget() == 'darwin'):
  2628. configprc = configprc.replace("$XDG_CACHE_HOME/panda3d", "Library/Caches/Panda3D-%s" % MAJOR_VERSION)
  2629. # OpenAL is not yet working well on OSX for us, so let's do this for now.
  2630. configprc = configprc.replace("p3openal_audio", "p3fmod_audio")
  2631. if GetTarget() == 'windows':
  2632. # Convert to Windows newlines.
  2633. ConditionalWriteFile(GetOutputDir()+"/etc/Config.prc", configprc, newline='\r\n')
  2634. ConditionalWriteFile(GetOutputDir()+"/etc/Confauto.prc", confautoprc, newline='\r\n')
  2635. else:
  2636. ConditionalWriteFile(GetOutputDir()+"/etc/Config.prc", configprc)
  2637. ConditionalWriteFile(GetOutputDir()+"/etc/Confauto.prc", confautoprc)
  2638. ##########################################################################################
  2639. #
  2640. # Copy the precompiled binaries and DLLs into the build.
  2641. #
  2642. ##########################################################################################
  2643. tp_dir = GetThirdpartyDir()
  2644. if tp_dir is not None:
  2645. dylibs = {}
  2646. if GetTarget() == 'darwin':
  2647. # Make a list of all the dylibs we ship, to figure out whether we should use
  2648. # install_name_tool to correct the library reference to point to our copy.
  2649. for lib in glob.glob(tp_dir + "/*/lib/*.dylib"):
  2650. dylibs[os.path.basename(lib)] = os.path.basename(os.path.realpath(lib))
  2651. if not PkgSkip("PYTHON"):
  2652. for lib in glob.glob(tp_dir + "/*/lib/" + SDK["PYTHONVERSION"] + "/*.dylib"):
  2653. dylibs[os.path.basename(lib)] = os.path.basename(os.path.realpath(lib))
  2654. for pkg in PkgListGet():
  2655. if PkgSkip(pkg):
  2656. continue
  2657. tp_pkg = tp_dir + pkg.lower()
  2658. if GetTarget() == 'windows':
  2659. if os.path.exists(tp_pkg + "/bin"):
  2660. CopyAllFiles(GetOutputDir() + "/bin/", tp_pkg + "/bin/")
  2661. if (PkgSkip("PYTHON")==0 and os.path.exists(tp_pkg + "/bin/" + SDK["PYTHONVERSION"])):
  2662. CopyAllFiles(GetOutputDir() + "/bin/", tp_pkg + "/bin/" + SDK["PYTHONVERSION"] + "/")
  2663. elif GetTarget() == 'darwin':
  2664. tp_libs = glob.glob(tp_pkg + "/lib/*.dylib")
  2665. if not PkgSkip("PYTHON"):
  2666. tp_libs += glob.glob(os.path.join(tp_pkg, "lib", SDK["PYTHONVERSION"], "*.dylib"))
  2667. tp_libs += glob.glob(os.path.join(tp_pkg, "lib", SDK["PYTHONVERSION"], "*.so"))
  2668. if pkg != 'PYTHON':
  2669. tp_libs += glob.glob(os.path.join(tp_pkg, "lib", SDK["PYTHONVERSION"], "*.py"))
  2670. for tp_lib in tp_libs:
  2671. basename = os.path.basename(tp_lib)
  2672. if basename.endswith('.dylib'):
  2673. # It's a dynamic link library. Put it in the lib directory.
  2674. target = GetOutputDir() + "/lib/" + basename
  2675. dep_prefix = "@loader_path/../lib/"
  2676. lib_id = dep_prefix + basename
  2677. else:
  2678. # It's a Python module, like _rocketcore.so. Copy it to the root, because
  2679. # nowadays the 'lib' directory may no longer be on the PYTHONPATH.
  2680. target = GetOutputDir() + "/" + basename
  2681. dep_prefix = "@loader_path/lib/"
  2682. lib_id = basename
  2683. if not NeedsBuild([target], [tp_lib]):
  2684. continue
  2685. CopyFile(target, tp_lib)
  2686. if os.path.islink(target) or target.endswith('.py'):
  2687. continue
  2688. # Correct the inter-library dependencies so that the build is relocatable.
  2689. oscmd('install_name_tool -id %s %s' % (lib_id, target))
  2690. oscmd("otool -L %s | grep .dylib > %s/tmp/otool-libs.txt" % (target, GetOutputDir()), True)
  2691. for line in open(GetOutputDir() + "/tmp/otool-libs.txt", "r"):
  2692. line = line.strip()
  2693. if not line or line.startswith(dep_prefix) or line.endswith(":"):
  2694. continue
  2695. libdep = line.split(" ", 1)[0]
  2696. dep_basename = os.path.basename(libdep)
  2697. if dep_basename in dylibs:
  2698. dep_target = dylibs[dep_basename]
  2699. oscmd("install_name_tool -change %s %s%s %s" % (libdep, dep_prefix, dep_target, target), True)
  2700. JustBuilt([target], [tp_lib])
  2701. for fwx in glob.glob(tp_pkg + "/*.framework"):
  2702. CopyTree(GetOutputDir() + "/Frameworks/" + os.path.basename(fwx), fwx)
  2703. else: # Linux / FreeBSD case.
  2704. for tp_lib in glob.glob(tp_pkg + "/lib/*.so*"):
  2705. CopyFile(GetOutputDir() + "/lib/" + os.path.basename(tp_lib), tp_lib)
  2706. if not PkgSkip("PYTHON"):
  2707. for tp_lib in glob.glob(os.path.join(tp_pkg, "lib", SDK["PYTHONVERSION"], "*.so*")):
  2708. base = os.path.basename(tp_lib)
  2709. if base.startswith('lib'):
  2710. CopyFile(GetOutputDir() + "/lib/" + base, tp_lib)
  2711. else:
  2712. # It's a Python module, like _rocketcore.so.
  2713. CopyFile(GetOutputDir() + "/" + base, tp_lib)
  2714. if GetTarget() == 'windows':
  2715. if os.path.isdir(os.path.join(tp_dir, "extras", "bin")):
  2716. CopyAllFiles(GetOutputDir() + "/bin/", tp_dir + "extras/bin/")
  2717. if not PkgSkip("PYTHON") and not RTDIST:
  2718. # We need to copy the Python DLL to the bin directory for now.
  2719. pydll = "/" + SDK["PYTHONVERSION"].replace(".", "")
  2720. if GetOptimize() <= 2:
  2721. pydll += "_d.dll"
  2722. else:
  2723. pydll += ".dll"
  2724. CopyFile(GetOutputDir() + "/bin" + pydll, SDK["PYTHON"] + pydll)
  2725. for fn in glob.glob(SDK["PYTHON"] + "/vcruntime*.dll"):
  2726. CopyFile(GetOutputDir() + "/bin/", fn)
  2727. # Copy the whole Python directory.
  2728. CopyTree(GetOutputDir() + "/python", SDK["PYTHON"])
  2729. # NB: Python does not always ship with the correct manifest/dll.
  2730. # Figure out the correct one to ship, and grab it from WinSxS dir.
  2731. manifest = GetOutputDir() + '/tmp/python.manifest'
  2732. if os.path.isfile(manifest):
  2733. os.unlink(manifest)
  2734. oscmd('mt -inputresource:"%s\\python.exe";#1 -out:"%s" -nologo' % (SDK["PYTHON"], manifest), True)
  2735. if os.path.isfile(manifest):
  2736. import xml.etree.ElementTree as ET
  2737. tree = ET.parse(manifest)
  2738. idents = tree.findall('./{urn:schemas-microsoft-com:asm.v1}dependency/{urn:schemas-microsoft-com:asm.v1}dependentAssembly/{urn:schemas-microsoft-com:asm.v1}assemblyIdentity')
  2739. else:
  2740. idents = ()
  2741. for ident in idents:
  2742. sxs_name = '_'.join([
  2743. ident.get('processorArchitecture'),
  2744. ident.get('name').lower(),
  2745. ident.get('publicKeyToken'),
  2746. ident.get('version'),
  2747. ])
  2748. # Find the manifest matching these parameters.
  2749. pattern = os.path.join('C:' + os.sep, 'Windows', 'WinSxS', 'Manifests', sxs_name + '_*.manifest')
  2750. manifests = glob.glob(pattern)
  2751. if not manifests:
  2752. print("%sWARNING:%s Could not locate manifest %s. You may need to reinstall the Visual C++ Redistributable." % (GetColor("red"), GetColor(), pattern))
  2753. continue
  2754. CopyFile(GetOutputDir() + "/python/" + ident.get('name') + ".manifest", manifests[0])
  2755. # Also copy the corresponding msvcr dll.
  2756. pattern = os.path.join('C:' + os.sep, 'Windows', 'WinSxS', sxs_name + '_*', 'msvcr*.dll')
  2757. for file in glob.glob(pattern):
  2758. CopyFile(GetOutputDir() + "/python/", file)
  2759. # Copy python.exe to ppython.exe.
  2760. if not os.path.isfile(SDK["PYTHON"] + "/ppython.exe") and os.path.isfile(SDK["PYTHON"] + "/python.exe"):
  2761. CopyFile(GetOutputDir() + "/python/ppython.exe", SDK["PYTHON"] + "/python.exe")
  2762. if not os.path.isfile(SDK["PYTHON"] + "/ppythonw.exe") and os.path.isfile(SDK["PYTHON"] + "/pythonw.exe"):
  2763. CopyFile(GetOutputDir() + "/python/ppythonw.exe", SDK["PYTHON"] + "/pythonw.exe")
  2764. ConditionalWriteFile(GetOutputDir() + "/python/panda.pth", "..\n../bin\n")
  2765. # Copy over the MSVC runtime.
  2766. if GetTarget() == 'windows' and "VISUALSTUDIO" in SDK:
  2767. vsver = "%s%s" % SDK["VISUALSTUDIO_VERSION"]
  2768. vcver = "%s%s" % (SDK["MSVC_VERSION"][0], 0) # ignore minor version.
  2769. crtname = "Microsoft.VC%s.CRT" % (vsver)
  2770. if ("VCTOOLSVERSION" in SDK):
  2771. dir = os.path.join(SDK["VISUALSTUDIO"], "VC", "Redist", "MSVC", SDK["VCTOOLSVERSION"], "onecore", GetTargetArch(), crtname)
  2772. else:
  2773. dir = os.path.join(SDK["VISUALSTUDIO"], "VC", "redist", GetTargetArch(), crtname)
  2774. if os.path.isfile(os.path.join(dir, "msvcr" + vcver + ".dll")):
  2775. CopyFile(GetOutputDir() + "/bin/", os.path.join(dir, "msvcr" + vcver + ".dll"))
  2776. if os.path.isfile(os.path.join(dir, "msvcp" + vcver + ".dll")):
  2777. CopyFile(GetOutputDir() + "/bin/", os.path.join(dir, "msvcp" + vcver + ".dll"))
  2778. if os.path.isfile(os.path.join(dir, "vcruntime" + vcver + ".dll")):
  2779. CopyFile(GetOutputDir() + "/bin/", os.path.join(dir, "vcruntime" + vcver + ".dll"))
  2780. ########################################################################
  2781. ##
  2782. ## Copy various stuff into the build.
  2783. ##
  2784. ########################################################################
  2785. if GetTarget() == 'windows':
  2786. # Convert to Windows newlines so they can be opened by notepad.
  2787. WriteFile(GetOutputDir() + "/LICENSE", ReadFile("doc/LICENSE"), newline='\r\n')
  2788. WriteFile(GetOutputDir() + "/ReleaseNotes", ReadFile("doc/ReleaseNotes"), newline='\r\n')
  2789. CopyFile(GetOutputDir() + "/pandaIcon.ico", "panda/src/configfiles/pandaIcon.ico")
  2790. else:
  2791. CopyFile(GetOutputDir()+"/", "doc/LICENSE")
  2792. CopyFile(GetOutputDir()+"/", "doc/ReleaseNotes")
  2793. if (PkgSkip("PANDATOOL")==0):
  2794. CopyAllFiles(GetOutputDir()+"/plugins/", "pandatool/src/scripts/", ".mel")
  2795. CopyAllFiles(GetOutputDir()+"/plugins/", "pandatool/src/scripts/", ".ms")
  2796. if (PkgSkip("PYTHON")==0 and os.path.isdir(GetThirdpartyBase()+"/Pmw")):
  2797. CopyTree(GetOutputDir()+'/Pmw', GetThirdpartyBase()+'/Pmw')
  2798. ConditionalWriteFile(GetOutputDir()+'/include/ctl3d.h', '/* dummy file to make MAX happy */')
  2799. # Since Eigen is included by all sorts of core headers, as a convenience
  2800. # to C++ users on Win and Mac, we include it in the Panda include directory.
  2801. if not PkgSkip("EIGEN") and GetTarget() in ("windows", "darwin") and GetThirdpartyDir():
  2802. CopyTree(GetOutputDir()+'/include/Eigen', GetThirdpartyDir()+'eigen/include/Eigen')
  2803. ########################################################################
  2804. #
  2805. # Copy header files to the built/include/parser-inc directory.
  2806. #
  2807. ########################################################################
  2808. CopyTree(GetOutputDir()+'/include/parser-inc','dtool/src/parser-inc')
  2809. DeleteVCS(GetOutputDir()+'/include/parser-inc')
  2810. ########################################################################
  2811. #
  2812. # Transfer all header files to the built/include directory.
  2813. #
  2814. ########################################################################
  2815. CopyAllHeaders('dtool/src/dtoolbase')
  2816. CopyAllHeaders('dtool/src/dtoolutil', skip=["pandaVersion.h", "checkPandaVersion.h"])
  2817. CopyFile(GetOutputDir()+'/include/','dtool/src/dtoolutil/vector_src.cxx')
  2818. CopyAllHeaders('dtool/metalibs/dtool')
  2819. CopyAllHeaders('dtool/src/cppparser')
  2820. CopyAllHeaders('dtool/src/prc', skip=["prc_parameters.h"])
  2821. CopyAllHeaders('dtool/src/dconfig')
  2822. CopyAllHeaders('dtool/src/interrogatedb')
  2823. CopyAllHeaders('dtool/metalibs/dtoolconfig')
  2824. CopyAllHeaders('dtool/src/pystub')
  2825. CopyAllHeaders('dtool/src/interrogate')
  2826. CopyAllHeaders('dtool/src/test_interrogate')
  2827. CopyAllHeaders('panda/src/putil')
  2828. CopyAllHeaders('panda/src/pandabase')
  2829. CopyAllHeaders('panda/src/express')
  2830. CopyAllHeaders('panda/src/downloader')
  2831. CopyAllHeaders('panda/metalibs/pandaexpress')
  2832. CopyAllHeaders('panda/src/pipeline')
  2833. CopyAllHeaders('panda/src/linmath')
  2834. CopyAllHeaders('panda/src/putil')
  2835. CopyAllHeaders('dtool/src/prckeys')
  2836. CopyAllHeaders('panda/src/audio')
  2837. CopyAllHeaders('panda/src/event')
  2838. CopyAllHeaders('panda/src/mathutil')
  2839. CopyAllHeaders('panda/src/gsgbase')
  2840. CopyAllHeaders('panda/src/pnmimage')
  2841. CopyAllHeaders('panda/src/nativenet')
  2842. CopyAllHeaders('panda/src/net')
  2843. CopyAllHeaders('panda/src/pstatclient')
  2844. CopyAllHeaders('panda/src/gobj')
  2845. CopyAllHeaders('panda/src/movies')
  2846. CopyAllHeaders('panda/src/pgraphnodes')
  2847. CopyAllHeaders('panda/src/pgraph')
  2848. CopyAllHeaders('panda/src/cull')
  2849. CopyAllHeaders('panda/src/chan')
  2850. CopyAllHeaders('panda/src/char')
  2851. CopyAllHeaders('panda/src/dgraph')
  2852. CopyAllHeaders('panda/src/display')
  2853. CopyAllHeaders('panda/src/device')
  2854. CopyAllHeaders('panda/src/pnmtext')
  2855. CopyAllHeaders('panda/src/text')
  2856. CopyAllHeaders('panda/src/grutil')
  2857. if (PkgSkip("VISION")==0):
  2858. CopyAllHeaders('panda/src/vision')
  2859. CopyAllHeaders('panda/src/awesomium')
  2860. if (PkgSkip("FFMPEG")==0):
  2861. CopyAllHeaders('panda/src/ffmpeg')
  2862. CopyAllHeaders('panda/src/tform')
  2863. CopyAllHeaders('panda/src/collide')
  2864. CopyAllHeaders('panda/src/parametrics')
  2865. CopyAllHeaders('panda/src/pgui')
  2866. CopyAllHeaders('panda/src/pnmimagetypes')
  2867. CopyAllHeaders('panda/src/recorder')
  2868. if (PkgSkip("ROCKET")==0):
  2869. CopyAllHeaders('panda/src/rocket')
  2870. if (PkgSkip("VRPN")==0):
  2871. CopyAllHeaders('panda/src/vrpn')
  2872. CopyAllHeaders('panda/src/wgldisplay')
  2873. CopyAllHeaders('panda/src/ode')
  2874. CopyAllHeaders('panda/metalibs/pandaode')
  2875. if (PkgSkip("PANDAPHYSICS")==0):
  2876. CopyAllHeaders('panda/src/physics')
  2877. if (PkgSkip("PANDAPARTICLESYSTEM")==0):
  2878. CopyAllHeaders('panda/src/particlesystem')
  2879. CopyAllHeaders('panda/src/dxml')
  2880. CopyAllHeaders('panda/metalibs/panda')
  2881. CopyAllHeaders('panda/src/audiotraits')
  2882. CopyAllHeaders('panda/src/audiotraits')
  2883. CopyAllHeaders('panda/src/distort')
  2884. CopyAllHeaders('panda/src/downloadertools')
  2885. CopyAllHeaders('panda/src/windisplay')
  2886. CopyAllHeaders('panda/src/dxgsg9')
  2887. CopyAllHeaders('panda/metalibs/pandadx9')
  2888. if not PkgSkip("EGG"):
  2889. CopyAllHeaders('panda/src/egg')
  2890. CopyAllHeaders('panda/src/egg2pg')
  2891. CopyAllHeaders('panda/src/framework')
  2892. CopyAllHeaders('panda/metalibs/pandafx')
  2893. CopyAllHeaders('panda/src/glstuff')
  2894. CopyAllHeaders('panda/src/glgsg')
  2895. CopyAllHeaders('panda/src/glesgsg')
  2896. CopyAllHeaders('panda/src/gles2gsg')
  2897. if not PkgSkip("EGG"):
  2898. CopyAllHeaders('panda/metalibs/pandaegg')
  2899. if GetTarget() == 'windows':
  2900. CopyAllHeaders('panda/src/wgldisplay')
  2901. elif GetTarget() == 'darwin':
  2902. CopyAllHeaders('panda/src/osxdisplay')
  2903. CopyAllHeaders('panda/src/cocoadisplay')
  2904. elif GetTarget() == 'android':
  2905. CopyAllHeaders('panda/src/android')
  2906. CopyAllHeaders('panda/src/androiddisplay')
  2907. else:
  2908. CopyAllHeaders('panda/src/x11display')
  2909. CopyAllHeaders('panda/src/glxdisplay')
  2910. CopyAllHeaders('panda/src/egldisplay')
  2911. CopyAllHeaders('panda/metalibs/pandagl')
  2912. CopyAllHeaders('panda/metalibs/pandagles')
  2913. CopyAllHeaders('panda/metalibs/pandagles2')
  2914. CopyAllHeaders('panda/metalibs/pandaphysics')
  2915. CopyAllHeaders('panda/src/testbed')
  2916. if (PkgSkip("PHYSX")==0):
  2917. CopyAllHeaders('panda/src/physx')
  2918. CopyAllHeaders('panda/metalibs/pandaphysx')
  2919. if (PkgSkip("BULLET")==0):
  2920. CopyAllHeaders('panda/src/bullet')
  2921. CopyAllHeaders('panda/metalibs/pandabullet')
  2922. if (PkgSkip("SPEEDTREE")==0):
  2923. CopyAllHeaders('panda/src/speedtree')
  2924. if (PkgSkip("DIRECT")==0):
  2925. CopyAllHeaders('direct/src/directbase')
  2926. CopyAllHeaders('direct/src/dcparser')
  2927. CopyAllHeaders('direct/src/deadrec')
  2928. CopyAllHeaders('direct/src/distributed')
  2929. CopyAllHeaders('direct/src/interval')
  2930. CopyAllHeaders('direct/src/showbase')
  2931. CopyAllHeaders('direct/src/dcparse')
  2932. if (RUNTIME or RTDIST):
  2933. CopyAllHeaders('direct/src/plugin', skip=["p3d_plugin_config.h"])
  2934. if (RUNTIME):
  2935. CopyAllHeaders('direct/src/plugin_npapi')
  2936. CopyAllHeaders('direct/src/plugin_standalone')
  2937. if (PkgSkip("PANDATOOL")==0):
  2938. CopyAllHeaders('pandatool/src/pandatoolbase')
  2939. CopyAllHeaders('pandatool/src/converter')
  2940. CopyAllHeaders('pandatool/src/progbase')
  2941. CopyAllHeaders('pandatool/src/eggbase')
  2942. CopyAllHeaders('pandatool/src/bam')
  2943. CopyAllHeaders('pandatool/src/cvscopy')
  2944. CopyAllHeaders('pandatool/src/daeegg')
  2945. CopyAllHeaders('pandatool/src/daeprogs')
  2946. CopyAllHeaders('pandatool/src/dxf')
  2947. CopyAllHeaders('pandatool/src/dxfegg')
  2948. CopyAllHeaders('pandatool/src/dxfprogs')
  2949. CopyAllHeaders('pandatool/src/palettizer')
  2950. CopyAllHeaders('pandatool/src/egg-mkfont')
  2951. CopyAllHeaders('pandatool/src/eggcharbase')
  2952. CopyAllHeaders('pandatool/src/egg-optchar')
  2953. CopyAllHeaders('pandatool/src/egg-palettize')
  2954. CopyAllHeaders('pandatool/src/egg-qtess')
  2955. CopyAllHeaders('pandatool/src/eggprogs')
  2956. CopyAllHeaders('pandatool/src/flt')
  2957. CopyAllHeaders('pandatool/src/fltegg')
  2958. CopyAllHeaders('pandatool/src/fltprogs')
  2959. CopyAllHeaders('pandatool/src/imagebase')
  2960. CopyAllHeaders('pandatool/src/imageprogs')
  2961. CopyAllHeaders('pandatool/src/pfmprogs')
  2962. CopyAllHeaders('pandatool/src/lwo')
  2963. CopyAllHeaders('pandatool/src/lwoegg')
  2964. CopyAllHeaders('pandatool/src/lwoprogs')
  2965. CopyAllHeaders('pandatool/src/maya')
  2966. CopyAllHeaders('pandatool/src/mayaegg')
  2967. CopyAllHeaders('pandatool/src/maxegg')
  2968. CopyAllHeaders('pandatool/src/maxprogs')
  2969. CopyAllHeaders('pandatool/src/objegg')
  2970. CopyAllHeaders('pandatool/src/objprogs')
  2971. CopyAllHeaders('pandatool/src/vrml')
  2972. CopyAllHeaders('pandatool/src/vrmlegg')
  2973. CopyAllHeaders('pandatool/src/xfile')
  2974. CopyAllHeaders('pandatool/src/xfileegg')
  2975. CopyAllHeaders('pandatool/src/ptloader')
  2976. CopyAllHeaders('pandatool/src/miscprogs')
  2977. CopyAllHeaders('pandatool/src/pstatserver')
  2978. CopyAllHeaders('pandatool/src/softprogs')
  2979. CopyAllHeaders('pandatool/src/text-stats')
  2980. CopyAllHeaders('pandatool/src/vrmlprogs')
  2981. CopyAllHeaders('pandatool/src/win-stats')
  2982. CopyAllHeaders('pandatool/src/xfileprogs')
  2983. if (PkgSkip("CONTRIB")==0):
  2984. CopyAllHeaders('contrib/src/contribbase')
  2985. CopyAllHeaders('contrib/src/ai')
  2986. ########################################################################
  2987. #
  2988. # These definitions are syntactic shorthand. They make it easy
  2989. # to link with the usual libraries without listing them all.
  2990. #
  2991. ########################################################################
  2992. COMMON_DTOOL_LIBS=[
  2993. 'libp3dtool.dll',
  2994. 'libp3dtoolconfig.dll',
  2995. ]
  2996. COMMON_PANDA_LIBS=[
  2997. 'libpanda.dll',
  2998. 'libpandaexpress.dll'
  2999. ] + COMMON_DTOOL_LIBS
  3000. COMMON_EGG2X_LIBS=[
  3001. 'libp3eggbase.lib',
  3002. 'libp3progbase.lib',
  3003. 'libp3converter.lib',
  3004. 'libp3pandatoolbase.lib',
  3005. 'libpandaegg.dll',
  3006. ] + COMMON_PANDA_LIBS
  3007. ########################################################################
  3008. #
  3009. # This section contains a list of all the files that need to be compiled.
  3010. #
  3011. ########################################################################
  3012. print("Generating dependencies...")
  3013. sys.stdout.flush()
  3014. #
  3015. # Compile Panda icon resource file.
  3016. # We do it first because we need it at
  3017. # the time we compile an executable.
  3018. #
  3019. if GetTarget() == 'windows':
  3020. OPTS=['DIR:panda/src/configfiles']
  3021. TargetAdd('pandaIcon.res', opts=OPTS, input='pandaIcon.rc')
  3022. #
  3023. # DIRECTORY: dtool/src/dtoolbase/
  3024. #
  3025. OPTS=['DIR:dtool/src/dtoolbase', 'BUILDING:DTOOL']
  3026. TargetAdd('p3dtoolbase_composite1.obj', opts=OPTS, input='p3dtoolbase_composite1.cxx')
  3027. TargetAdd('p3dtoolbase_composite2.obj', opts=OPTS, input='p3dtoolbase_composite2.cxx')
  3028. TargetAdd('p3dtoolbase_lookup3.obj', opts=OPTS, input='lookup3.c')
  3029. TargetAdd('p3dtoolbase_indent.obj', opts=OPTS, input='indent.cxx')
  3030. #
  3031. # DIRECTORY: dtool/src/dtoolutil/
  3032. #
  3033. OPTS=['DIR:dtool/src/dtoolutil', 'BUILDING:DTOOL']
  3034. TargetAdd('p3dtoolutil_composite1.obj', opts=OPTS, input='p3dtoolutil_composite1.cxx')
  3035. TargetAdd('p3dtoolutil_composite2.obj', opts=OPTS, input='p3dtoolutil_composite2.cxx')
  3036. if GetTarget() == 'darwin':
  3037. TargetAdd('p3dtoolutil_filename_assist.obj', opts=OPTS, input='filename_assist.mm')
  3038. #
  3039. # DIRECTORY: dtool/metalibs/dtool/
  3040. #
  3041. OPTS=['DIR:dtool/metalibs/dtool', 'BUILDING:DTOOL']
  3042. TargetAdd('p3dtool_dtool.obj', opts=OPTS, input='dtool.cxx')
  3043. TargetAdd('libp3dtool.dll', input='p3dtool_dtool.obj')
  3044. TargetAdd('libp3dtool.dll', input='p3dtoolutil_composite1.obj')
  3045. TargetAdd('libp3dtool.dll', input='p3dtoolutil_composite2.obj')
  3046. if GetTarget() == 'darwin':
  3047. TargetAdd('libp3dtool.dll', input='p3dtoolutil_filename_assist.obj')
  3048. TargetAdd('libp3dtool.dll', input='p3dtoolbase_composite1.obj')
  3049. TargetAdd('libp3dtool.dll', input='p3dtoolbase_composite2.obj')
  3050. TargetAdd('libp3dtool.dll', input='p3dtoolbase_indent.obj')
  3051. TargetAdd('libp3dtool.dll', input='p3dtoolbase_lookup3.obj')
  3052. TargetAdd('libp3dtool.dll', opts=['ADVAPI','WINSHELL','WINKERNEL'])
  3053. #
  3054. # DIRECTORY: dtool/src/cppparser/
  3055. #
  3056. if (not RUNTIME):
  3057. OPTS=['DIR:dtool/src/cppparser', 'BISONPREFIX_cppyy']
  3058. CreateFile(GetOutputDir()+"/include/cppBison.h")
  3059. TargetAdd('p3cppParser_cppBison.obj', opts=OPTS, input='cppBison.yxx')
  3060. TargetAdd('cppBison.h', input='p3cppParser_cppBison.obj', opts=['DEPENDENCYONLY'])
  3061. TargetAdd('p3cppParser_composite1.obj', opts=OPTS, input='p3cppParser_composite1.cxx')
  3062. TargetAdd('p3cppParser_composite2.obj', opts=OPTS, input='p3cppParser_composite2.cxx')
  3063. TargetAdd('libp3cppParser.ilb', input='p3cppParser_composite1.obj')
  3064. TargetAdd('libp3cppParser.ilb', input='p3cppParser_composite2.obj')
  3065. TargetAdd('libp3cppParser.ilb', input='p3cppParser_cppBison.obj')
  3066. #
  3067. # DIRECTORY: dtool/src/prc/
  3068. #
  3069. OPTS=['DIR:dtool/src/prc', 'BUILDING:DTOOLCONFIG', 'OPENSSL']
  3070. TargetAdd('p3prc_composite1.obj', opts=OPTS, input='p3prc_composite1.cxx')
  3071. TargetAdd('p3prc_composite2.obj', opts=OPTS, input='p3prc_composite2.cxx')
  3072. #
  3073. # DIRECTORY: dtool/src/dconfig/
  3074. #
  3075. OPTS=['DIR:dtool/src/dconfig', 'BUILDING:DTOOLCONFIG']
  3076. TargetAdd('p3dconfig_composite1.obj', opts=OPTS, input='p3dconfig_composite1.cxx')
  3077. #
  3078. # DIRECTORY: dtool/metalibs/dtoolconfig/
  3079. #
  3080. OPTS=['DIR:dtool/metalibs/dtoolconfig', 'BUILDING:DTOOLCONFIG']
  3081. TargetAdd('p3dtoolconfig_dtoolconfig.obj', opts=OPTS, input='dtoolconfig.cxx')
  3082. TargetAdd('libp3dtoolconfig.dll', input='p3dtoolconfig_dtoolconfig.obj')
  3083. TargetAdd('libp3dtoolconfig.dll', input='p3dconfig_composite1.obj')
  3084. TargetAdd('libp3dtoolconfig.dll', input='p3prc_composite1.obj')
  3085. TargetAdd('libp3dtoolconfig.dll', input='p3prc_composite2.obj')
  3086. TargetAdd('libp3dtoolconfig.dll', input='libp3dtool.dll')
  3087. TargetAdd('libp3dtoolconfig.dll', opts=['ADVAPI', 'OPENSSL', 'WINGDI', 'WINUSER'])
  3088. #
  3089. # DIRECTORY: dtool/src/interrogatedb/
  3090. #
  3091. OPTS=['DIR:dtool/src/interrogatedb', 'BUILDING:INTERROGATEDB', 'PYTHON']
  3092. TargetAdd('p3interrogatedb_composite1.obj', opts=OPTS, input='p3interrogatedb_composite1.cxx')
  3093. TargetAdd('p3interrogatedb_composite2.obj', opts=OPTS, input='p3interrogatedb_composite2.cxx')
  3094. TargetAdd('libp3interrogatedb.dll', input='p3interrogatedb_composite1.obj')
  3095. TargetAdd('libp3interrogatedb.dll', input='p3interrogatedb_composite2.obj')
  3096. TargetAdd('libp3interrogatedb.dll', input='libp3dtool.dll')
  3097. TargetAdd('libp3interrogatedb.dll', input='libp3dtoolconfig.dll')
  3098. TargetAdd('libp3interrogatedb.dll', opts=['PYTHON'])
  3099. if not PkgSkip("PYTHON"):
  3100. # This used to be called dtoolconfig.pyd, but it just contains the interrogatedb
  3101. # stuff, so it has been renamed appropriately.
  3102. OPTS=['DIR:dtool/metalibs/dtoolconfig', 'PYTHON']
  3103. TargetAdd('interrogatedb_pydtool.obj', opts=OPTS, input="pydtool.cxx")
  3104. TargetAdd('interrogatedb.pyd', input='interrogatedb_pydtool.obj')
  3105. TargetAdd('interrogatedb.pyd', input='libp3dtool.dll')
  3106. TargetAdd('interrogatedb.pyd', input='libp3dtoolconfig.dll')
  3107. TargetAdd('interrogatedb.pyd', input='libp3interrogatedb.dll')
  3108. TargetAdd('interrogatedb.pyd', opts=['PYTHON'])
  3109. #
  3110. # DIRECTORY: dtool/src/pystub/
  3111. #
  3112. if not RUNTIME and not RTDIST:
  3113. OPTS=['DIR:dtool/src/pystub']
  3114. TargetAdd('p3pystub_pystub.obj', opts=OPTS, input='pystub.cxx')
  3115. TargetAdd('libp3pystub.lib', input='p3pystub_pystub.obj')
  3116. #TargetAdd('libp3pystub.lib', input='libp3dtool.dll')
  3117. TargetAdd('libp3pystub.lib', opts=['ADVAPI'])
  3118. #
  3119. # DIRECTORY: dtool/src/interrogate/
  3120. #
  3121. if (not RUNTIME):
  3122. OPTS=['DIR:dtool/src/interrogate', 'DIR:dtool/src/cppparser', 'DIR:dtool/src/interrogatedb']
  3123. TargetAdd('interrogate_composite1.obj', opts=OPTS, input='interrogate_composite1.cxx')
  3124. TargetAdd('interrogate_composite2.obj', opts=OPTS, input='interrogate_composite2.cxx')
  3125. TargetAdd('interrogate.exe', input='interrogate_composite1.obj')
  3126. TargetAdd('interrogate.exe', input='interrogate_composite2.obj')
  3127. TargetAdd('interrogate.exe', input='libp3cppParser.ilb')
  3128. TargetAdd('interrogate.exe', input=COMMON_DTOOL_LIBS)
  3129. TargetAdd('interrogate.exe', input='libp3interrogatedb.dll')
  3130. TargetAdd('interrogate.exe', input='libp3pystub.lib')
  3131. TargetAdd('interrogate.exe', opts=['ADVAPI', 'OPENSSL', 'WINSHELL', 'WINGDI', 'WINUSER'])
  3132. TargetAdd('interrogate_module_interrogate_module.obj', opts=OPTS, input='interrogate_module.cxx')
  3133. TargetAdd('interrogate_module.exe', input='interrogate_module_interrogate_module.obj')
  3134. TargetAdd('interrogate_module.exe', input='libp3cppParser.ilb')
  3135. TargetAdd('interrogate_module.exe', input=COMMON_DTOOL_LIBS)
  3136. TargetAdd('interrogate_module.exe', input='libp3interrogatedb.dll')
  3137. TargetAdd('interrogate_module.exe', input='libp3pystub.lib')
  3138. TargetAdd('interrogate_module.exe', opts=['ADVAPI', 'OPENSSL', 'WINSHELL', 'WINGDI', 'WINUSER'])
  3139. if (not RTDIST):
  3140. TargetAdd('parse_file_parse_file.obj', opts=OPTS, input='parse_file.cxx')
  3141. TargetAdd('parse_file.exe', input='parse_file_parse_file.obj')
  3142. TargetAdd('parse_file.exe', input='libp3cppParser.ilb')
  3143. TargetAdd('parse_file.exe', input=COMMON_DTOOL_LIBS)
  3144. TargetAdd('parse_file.exe', input='libp3interrogatedb.dll')
  3145. TargetAdd('parse_file.exe', input='libp3pystub.lib')
  3146. TargetAdd('parse_file.exe', opts=['ADVAPI', 'OPENSSL', 'WINSHELL', 'WINGDI', 'WINUSER'])
  3147. #
  3148. # DIRECTORY: dtool/src/prckeys/
  3149. #
  3150. if (PkgSkip("OPENSSL")==0 and not RUNTIME and not RTDIST):
  3151. OPTS=['DIR:dtool/src/prckeys', 'OPENSSL']
  3152. TargetAdd('make-prc-key_makePrcKey.obj', opts=OPTS, input='makePrcKey.cxx')
  3153. TargetAdd('make-prc-key.exe', input='make-prc-key_makePrcKey.obj')
  3154. TargetAdd('make-prc-key.exe', input=COMMON_DTOOL_LIBS)
  3155. TargetAdd('make-prc-key.exe', opts=['ADVAPI', 'OPENSSL', 'WINSHELL', 'WINGDI', 'WINUSER'])
  3156. #
  3157. # DIRECTORY: dtool/src/test_interrogate/
  3158. #
  3159. if (not RTDIST and not RUNTIME):
  3160. OPTS=['DIR:dtool/src/test_interrogate']
  3161. TargetAdd('test_interrogate_test_interrogate.obj', opts=OPTS, input='test_interrogate.cxx')
  3162. TargetAdd('test_interrogate.exe', input='test_interrogate_test_interrogate.obj')
  3163. TargetAdd('test_interrogate.exe', input='libp3interrogatedb.dll')
  3164. TargetAdd('test_interrogate.exe', input=COMMON_DTOOL_LIBS)
  3165. TargetAdd('test_interrogate.exe', input='libp3pystub.lib')
  3166. TargetAdd('test_interrogate.exe', opts=['ADVAPI', 'OPENSSL', 'WINSHELL', 'WINGDI', 'WINUSER'])
  3167. #
  3168. # DIRECTORY: dtool/src/dtoolbase/
  3169. #
  3170. OPTS=['DIR:dtool/src/dtoolbase', 'PYTHON']
  3171. IGATEFILES=GetDirectoryContents('dtool/src/dtoolbase', ["*_composite*.cxx"])
  3172. IGATEFILES += [
  3173. "typeHandle.h",
  3174. "typeHandle_ext.h",
  3175. "typeRegistry.h",
  3176. "typedObject.h",
  3177. "neverFreeMemory.h",
  3178. ]
  3179. TargetAdd('libp3dtoolbase.in', opts=OPTS, input=IGATEFILES)
  3180. TargetAdd('libp3dtoolbase.in', opts=['IMOD:panda3d.core', 'ILIB:libp3dtoolbase', 'SRCDIR:dtool/src/dtoolbase'])
  3181. TargetAdd('libp3dtoolbase_igate.obj', input='libp3dtoolbase.in', opts=["DEPENDENCYONLY"])
  3182. TargetAdd('p3dtoolbase_typeHandle_ext.obj', opts=OPTS, input='typeHandle_ext.cxx')
  3183. #
  3184. # DIRECTORY: dtool/src/dtoolutil/
  3185. #
  3186. OPTS=['DIR:dtool/src/dtoolutil', 'PYTHON']
  3187. IGATEFILES=GetDirectoryContents('dtool/src/dtoolutil', ["*_composite*.cxx"])
  3188. IGATEFILES += [
  3189. "config_dtoolutil.h",
  3190. "pandaSystem.h",
  3191. "dSearchPath.h",
  3192. "executionEnvironment.h",
  3193. "textEncoder.h",
  3194. "filename.h",
  3195. "filename_ext.h",
  3196. "globPattern.h",
  3197. "globPattern_ext.h",
  3198. "pandaFileStream.h",
  3199. "lineStream.h",
  3200. ]
  3201. TargetAdd('libp3dtoolutil.in', opts=OPTS, input=IGATEFILES)
  3202. TargetAdd('libp3dtoolutil.in', opts=['IMOD:panda3d.core', 'ILIB:libp3dtoolutil', 'SRCDIR:dtool/src/dtoolutil'])
  3203. TargetAdd('libp3dtoolutil_igate.obj', input='libp3dtoolutil.in', opts=["DEPENDENCYONLY"])
  3204. TargetAdd('p3dtoolutil_ext_composite.obj', opts=OPTS, input='p3dtoolutil_ext_composite.cxx')
  3205. #
  3206. # DIRECTORY: dtool/src/prc/
  3207. #
  3208. OPTS=['DIR:dtool/src/prc', 'PYTHON']
  3209. IGATEFILES=GetDirectoryContents('dtool/src/prc', ["*.h", "*_composite*.cxx"])
  3210. TargetAdd('libp3prc.in', opts=OPTS, input=IGATEFILES)
  3211. TargetAdd('libp3prc.in', opts=['IMOD:panda3d.core', 'ILIB:libp3prc', 'SRCDIR:dtool/src/prc'])
  3212. TargetAdd('libp3prc_igate.obj', input='libp3prc.in', opts=["DEPENDENCYONLY"])
  3213. TargetAdd('p3prc_ext_composite.obj', opts=OPTS, input='p3prc_ext_composite.cxx')
  3214. #
  3215. # DIRECTORY: panda/src/pandabase/
  3216. #
  3217. OPTS=['DIR:panda/src/pandabase', 'BUILDING:PANDAEXPRESS']
  3218. TargetAdd('p3pandabase_pandabase.obj', opts=OPTS, input='pandabase.cxx')
  3219. #
  3220. # DIRECTORY: panda/src/express/
  3221. #
  3222. OPTS=['DIR:panda/src/express', 'BUILDING:PANDAEXPRESS', 'OPENSSL', 'ZLIB']
  3223. TargetAdd('p3express_composite1.obj', opts=OPTS, input='p3express_composite1.cxx')
  3224. TargetAdd('p3express_composite2.obj', opts=OPTS, input='p3express_composite2.cxx')
  3225. OPTS=['DIR:panda/src/express', 'OPENSSL', 'ZLIB', 'PYTHON']
  3226. IGATEFILES=GetDirectoryContents('panda/src/express', ["*.h", "*_composite*.cxx"])
  3227. TargetAdd('libp3express.in', opts=OPTS, input=IGATEFILES)
  3228. TargetAdd('libp3express.in', opts=['IMOD:panda3d.core', 'ILIB:libp3express', 'SRCDIR:panda/src/express'])
  3229. TargetAdd('libp3express_igate.obj', input='libp3express.in', opts=["DEPENDENCYONLY"])
  3230. TargetAdd('p3express_ext_composite.obj', opts=OPTS, input='p3express_ext_composite.cxx')
  3231. #
  3232. # DIRECTORY: panda/src/downloader/
  3233. #
  3234. OPTS=['DIR:panda/src/downloader', 'BUILDING:PANDAEXPRESS', 'OPENSSL', 'ZLIB']
  3235. TargetAdd('p3downloader_composite1.obj', opts=OPTS, input='p3downloader_composite1.cxx')
  3236. TargetAdd('p3downloader_composite2.obj', opts=OPTS, input='p3downloader_composite2.cxx')
  3237. OPTS=['DIR:panda/src/downloader', 'OPENSSL', 'ZLIB', 'PYTHON']
  3238. IGATEFILES=GetDirectoryContents('panda/src/downloader', ["*.h", "*_composite*.cxx"])
  3239. TargetAdd('libp3downloader.in', opts=OPTS, input=IGATEFILES)
  3240. TargetAdd('libp3downloader.in', opts=['IMOD:panda3d.core', 'ILIB:libp3downloader', 'SRCDIR:panda/src/downloader'])
  3241. TargetAdd('libp3downloader_igate.obj', input='libp3downloader.in', opts=["DEPENDENCYONLY"])
  3242. TargetAdd('p3downloader_stringStream_ext.obj', opts=OPTS, input='stringStream_ext.cxx')
  3243. #
  3244. # DIRECTORY: panda/metalibs/pandaexpress/
  3245. #
  3246. OPTS=['DIR:panda/metalibs/pandaexpress', 'BUILDING:PANDAEXPRESS', 'ZLIB']
  3247. TargetAdd('pandaexpress_pandaexpress.obj', opts=OPTS, input='pandaexpress.cxx')
  3248. TargetAdd('libpandaexpress.dll', input='pandaexpress_pandaexpress.obj')
  3249. TargetAdd('libpandaexpress.dll', input='p3downloader_composite1.obj')
  3250. TargetAdd('libpandaexpress.dll', input='p3downloader_composite2.obj')
  3251. TargetAdd('libpandaexpress.dll', input='p3express_composite1.obj')
  3252. TargetAdd('libpandaexpress.dll', input='p3express_composite2.obj')
  3253. TargetAdd('libpandaexpress.dll', input='p3pandabase_pandabase.obj')
  3254. TargetAdd('libpandaexpress.dll', input=COMMON_DTOOL_LIBS)
  3255. TargetAdd('libpandaexpress.dll', opts=['ADVAPI', 'WINSOCK2', 'OPENSSL', 'ZLIB', 'WINGDI', 'WINUSER', 'ANDROID'])
  3256. #
  3257. # DIRECTORY: panda/src/pipeline/
  3258. #
  3259. if (not RUNTIME):
  3260. OPTS=['DIR:panda/src/pipeline', 'BUILDING:PANDA']
  3261. TargetAdd('p3pipeline_composite1.obj', opts=OPTS, input='p3pipeline_composite1.cxx')
  3262. TargetAdd('p3pipeline_composite2.obj', opts=OPTS, input='p3pipeline_composite2.cxx')
  3263. TargetAdd('p3pipeline_contextSwitch.obj', opts=OPTS, input='contextSwitch.c')
  3264. OPTS=['DIR:panda/src/pipeline', 'PYTHON']
  3265. IGATEFILES=GetDirectoryContents('panda/src/pipeline', ["*.h", "*_composite*.cxx"])
  3266. TargetAdd('libp3pipeline.in', opts=OPTS, input=IGATEFILES)
  3267. TargetAdd('libp3pipeline.in', opts=['IMOD:panda3d.core', 'ILIB:libp3pipeline', 'SRCDIR:panda/src/pipeline'])
  3268. TargetAdd('libp3pipeline_igate.obj', input='libp3pipeline.in', opts=["DEPENDENCYONLY"])
  3269. TargetAdd('p3pipeline_pythonThread.obj', opts=OPTS, input='pythonThread.cxx')
  3270. #
  3271. # DIRECTORY: panda/src/linmath/
  3272. #
  3273. if (not RUNTIME):
  3274. OPTS=['DIR:panda/src/linmath', 'BUILDING:PANDA']
  3275. TargetAdd('p3linmath_composite1.obj', opts=OPTS, input='p3linmath_composite1.cxx')
  3276. TargetAdd('p3linmath_composite2.obj', opts=OPTS, input='p3linmath_composite2.cxx')
  3277. OPTS=['DIR:panda/src/linmath', 'PYTHON']
  3278. IGATEFILES=GetDirectoryContents('panda/src/linmath', ["*.h", "*_composite*.cxx"])
  3279. for ifile in IGATEFILES[:]:
  3280. if "_src." in ifile:
  3281. IGATEFILES.remove(ifile)
  3282. IGATEFILES.remove('cast_to_double.h')
  3283. IGATEFILES.remove('lmat_ops.h')
  3284. IGATEFILES.remove('cast_to_float.h')
  3285. TargetAdd('libp3linmath.in', opts=OPTS, input=IGATEFILES)
  3286. TargetAdd('libp3linmath.in', opts=['IMOD:panda3d.core', 'ILIB:libp3linmath', 'SRCDIR:panda/src/linmath'])
  3287. TargetAdd('libp3linmath_igate.obj', input='libp3linmath.in', opts=["DEPENDENCYONLY"])
  3288. #
  3289. # DIRECTORY: panda/src/putil/
  3290. #
  3291. if (not RUNTIME):
  3292. OPTS=['DIR:panda/src/putil', 'BUILDING:PANDA', 'ZLIB']
  3293. TargetAdd('p3putil_composite1.obj', opts=OPTS, input='p3putil_composite1.cxx')
  3294. TargetAdd('p3putil_composite2.obj', opts=OPTS, input='p3putil_composite2.cxx')
  3295. OPTS=['DIR:panda/src/putil', 'ZLIB', 'PYTHON']
  3296. IGATEFILES=GetDirectoryContents('panda/src/putil', ["*.h", "*_composite*.cxx"])
  3297. IGATEFILES.remove("test_bam.h")
  3298. TargetAdd('libp3putil.in', opts=OPTS, input=IGATEFILES)
  3299. TargetAdd('libp3putil.in', opts=['IMOD:panda3d.core', 'ILIB:libp3putil', 'SRCDIR:panda/src/putil'])
  3300. TargetAdd('libp3putil_igate.obj', input='libp3putil.in', opts=["DEPENDENCYONLY"])
  3301. TargetAdd('p3putil_ext_composite.obj', opts=OPTS, input='p3putil_ext_composite.cxx')
  3302. #
  3303. # DIRECTORY: panda/src/audio/
  3304. #
  3305. if (not RUNTIME):
  3306. OPTS=['DIR:panda/src/audio', 'BUILDING:PANDA']
  3307. TargetAdd('p3audio_composite1.obj', opts=OPTS, input='p3audio_composite1.cxx')
  3308. OPTS=['DIR:panda/src/audio', 'PYTHON']
  3309. IGATEFILES=["audio.h"]
  3310. TargetAdd('libp3audio.in', opts=OPTS, input=IGATEFILES)
  3311. TargetAdd('libp3audio.in', opts=['IMOD:panda3d.core', 'ILIB:libp3audio', 'SRCDIR:panda/src/audio'])
  3312. TargetAdd('libp3audio_igate.obj', input='libp3audio.in', opts=["DEPENDENCYONLY"])
  3313. #
  3314. # DIRECTORY: panda/src/event/
  3315. #
  3316. if (not RUNTIME):
  3317. OPTS=['DIR:panda/src/event', 'BUILDING:PANDA']
  3318. TargetAdd('p3event_composite1.obj', opts=OPTS, input='p3event_composite1.cxx')
  3319. TargetAdd('p3event_composite2.obj', opts=OPTS, input='p3event_composite2.cxx')
  3320. OPTS=['DIR:panda/src/event', 'PYTHON']
  3321. TargetAdd('p3event_asyncFuture_ext.obj', opts=OPTS, input='asyncFuture_ext.cxx')
  3322. TargetAdd('p3event_pythonTask.obj', opts=OPTS, input='pythonTask.cxx')
  3323. IGATEFILES=GetDirectoryContents('panda/src/event', ["*.h", "*_composite*.cxx"])
  3324. TargetAdd('libp3event.in', opts=OPTS, input=IGATEFILES)
  3325. TargetAdd('libp3event.in', opts=['IMOD:panda3d.core', 'ILIB:libp3event', 'SRCDIR:panda/src/event'])
  3326. TargetAdd('libp3event_igate.obj', input='libp3event.in', opts=["DEPENDENCYONLY"])
  3327. #
  3328. # DIRECTORY: panda/src/mathutil/
  3329. #
  3330. if (not RUNTIME):
  3331. OPTS=['DIR:panda/src/mathutil', 'BUILDING:PANDA', 'FFTW']
  3332. TargetAdd('p3mathutil_composite1.obj', opts=OPTS, input='p3mathutil_composite1.cxx')
  3333. TargetAdd('p3mathutil_composite2.obj', opts=OPTS, input='p3mathutil_composite2.cxx')
  3334. OPTS=['DIR:panda/src/mathutil', 'FFTW', 'PYTHON']
  3335. IGATEFILES=GetDirectoryContents('panda/src/mathutil', ["*.h", "*_composite*.cxx"])
  3336. for ifile in IGATEFILES[:]:
  3337. if "_src." in ifile:
  3338. IGATEFILES.remove(ifile)
  3339. TargetAdd('libp3mathutil.in', opts=OPTS, input=IGATEFILES)
  3340. TargetAdd('libp3mathutil.in', opts=['IMOD:panda3d.core', 'ILIB:libp3mathutil', 'SRCDIR:panda/src/mathutil'])
  3341. TargetAdd('libp3mathutil_igate.obj', input='libp3mathutil.in', opts=["DEPENDENCYONLY"])
  3342. #
  3343. # DIRECTORY: panda/src/gsgbase/
  3344. #
  3345. if (not RUNTIME):
  3346. OPTS=['DIR:panda/src/gsgbase', 'BUILDING:PANDA']
  3347. TargetAdd('p3gsgbase_composite1.obj', opts=OPTS, input='p3gsgbase_composite1.cxx')
  3348. OPTS=['DIR:panda/src/gsgbase', 'PYTHON']
  3349. IGATEFILES=GetDirectoryContents('panda/src/gsgbase', ["*.h", "*_composite*.cxx"])
  3350. TargetAdd('libp3gsgbase.in', opts=OPTS, input=IGATEFILES)
  3351. TargetAdd('libp3gsgbase.in', opts=['IMOD:panda3d.core', 'ILIB:libp3gsgbase', 'SRCDIR:panda/src/gsgbase'])
  3352. TargetAdd('libp3gsgbase_igate.obj', input='libp3gsgbase.in', opts=["DEPENDENCYONLY"])
  3353. #
  3354. # DIRECTORY: panda/src/pnmimage/
  3355. #
  3356. if (not RUNTIME):
  3357. OPTS=['DIR:panda/src/pnmimage', 'BUILDING:PANDA', 'ZLIB']
  3358. TargetAdd('p3pnmimage_composite1.obj', opts=OPTS, input='p3pnmimage_composite1.cxx')
  3359. TargetAdd('p3pnmimage_composite2.obj', opts=OPTS, input='p3pnmimage_composite2.cxx')
  3360. TargetAdd('p3pnmimage_convert_srgb_sse2.obj', opts=OPTS+['SSE2'], input='convert_srgb_sse2.cxx')
  3361. OPTS=['DIR:panda/src/pnmimage', 'ZLIB', 'PYTHON']
  3362. IGATEFILES=GetDirectoryContents('panda/src/pnmimage', ["*.h", "*_composite*.cxx"])
  3363. TargetAdd('libp3pnmimage.in', opts=OPTS, input=IGATEFILES)
  3364. TargetAdd('libp3pnmimage.in', opts=['IMOD:panda3d.core', 'ILIB:libp3pnmimage', 'SRCDIR:panda/src/pnmimage'])
  3365. TargetAdd('libp3pnmimage_igate.obj', input='libp3pnmimage.in', opts=["DEPENDENCYONLY"])
  3366. TargetAdd('p3pnmimage_pfmFile_ext.obj', opts=OPTS, input='pfmFile_ext.cxx')
  3367. #
  3368. # DIRECTORY: panda/src/nativenet/
  3369. #
  3370. if (not RUNTIME):
  3371. OPTS=['DIR:panda/src/nativenet', 'OPENSSL', 'BUILDING:PANDA']
  3372. TargetAdd('p3nativenet_composite1.obj', opts=OPTS, input='p3nativenet_composite1.cxx')
  3373. OPTS=['DIR:panda/src/nativenet', 'OPENSSL', 'PYTHON']
  3374. IGATEFILES=GetDirectoryContents('panda/src/nativenet', ["*.h", "*_composite*.cxx"])
  3375. TargetAdd('libp3nativenet.in', opts=OPTS, input=IGATEFILES)
  3376. TargetAdd('libp3nativenet.in', opts=['IMOD:panda3d.core', 'ILIB:libp3nativenet', 'SRCDIR:panda/src/nativenet'])
  3377. TargetAdd('libp3nativenet_igate.obj', input='libp3nativenet.in', opts=["DEPENDENCYONLY"])
  3378. #
  3379. # DIRECTORY: panda/src/net/
  3380. #
  3381. if (not RUNTIME):
  3382. OPTS=['DIR:panda/src/net', 'BUILDING:PANDA']
  3383. TargetAdd('p3net_composite1.obj', opts=OPTS, input='p3net_composite1.cxx')
  3384. TargetAdd('p3net_composite2.obj', opts=OPTS, input='p3net_composite2.cxx')
  3385. OPTS=['DIR:panda/src/net', 'PYTHON']
  3386. IGATEFILES=GetDirectoryContents('panda/src/net', ["*.h", "*_composite*.cxx"])
  3387. IGATEFILES.remove("datagram_ui.h")
  3388. TargetAdd('libp3net.in', opts=OPTS, input=IGATEFILES)
  3389. TargetAdd('libp3net.in', opts=['IMOD:panda3d.core', 'ILIB:libp3net', 'SRCDIR:panda/src/net'])
  3390. TargetAdd('libp3net_igate.obj', input='libp3net.in', opts=["DEPENDENCYONLY"])
  3391. #
  3392. # DIRECTORY: panda/src/pstatclient/
  3393. #
  3394. if (not RUNTIME):
  3395. OPTS=['DIR:panda/src/pstatclient', 'BUILDING:PANDA']
  3396. TargetAdd('p3pstatclient_composite1.obj', opts=OPTS, input='p3pstatclient_composite1.cxx')
  3397. TargetAdd('p3pstatclient_composite2.obj', opts=OPTS, input='p3pstatclient_composite2.cxx')
  3398. OPTS=['DIR:panda/src/pstatclient', 'PYTHON']
  3399. IGATEFILES=GetDirectoryContents('panda/src/pstatclient', ["*.h", "*_composite*.cxx"])
  3400. TargetAdd('libp3pstatclient.in', opts=OPTS, input=IGATEFILES)
  3401. TargetAdd('libp3pstatclient.in', opts=['IMOD:panda3d.core', 'ILIB:libp3pstatclient', 'SRCDIR:panda/src/pstatclient'])
  3402. TargetAdd('libp3pstatclient_igate.obj', input='libp3pstatclient.in', opts=["DEPENDENCYONLY"])
  3403. #
  3404. # DIRECTORY: panda/src/gobj/
  3405. #
  3406. if (not RUNTIME):
  3407. OPTS=['DIR:panda/src/gobj', 'BUILDING:PANDA', 'NVIDIACG', 'ZLIB', 'SQUISH']
  3408. TargetAdd('p3gobj_composite1.obj', opts=OPTS, input='p3gobj_composite1.cxx')
  3409. TargetAdd('p3gobj_composite2.obj', opts=OPTS, input='p3gobj_composite2.cxx')
  3410. OPTS=['DIR:panda/src/gobj', 'NVIDIACG', 'ZLIB', 'SQUISH', 'PYTHON']
  3411. IGATEFILES=GetDirectoryContents('panda/src/gobj', ["*.h", "*_composite*.cxx"])
  3412. if ("cgfx_states.h" in IGATEFILES): IGATEFILES.remove("cgfx_states.h")
  3413. TargetAdd('libp3gobj.in', opts=OPTS, input=IGATEFILES)
  3414. TargetAdd('libp3gobj.in', opts=['IMOD:panda3d.core', 'ILIB:libp3gobj', 'SRCDIR:panda/src/gobj'])
  3415. TargetAdd('libp3gobj_igate.obj', input='libp3gobj.in', opts=["DEPENDENCYONLY"])
  3416. TargetAdd('p3gobj_ext_composite.obj', opts=OPTS, input='p3gobj_ext_composite.cxx')
  3417. #
  3418. # DIRECTORY: panda/src/pgraphnodes/
  3419. #
  3420. if (not RUNTIME):
  3421. OPTS=['DIR:panda/src/pgraphnodes', 'BUILDING:PANDA']
  3422. TargetAdd('p3pgraphnodes_composite1.obj', opts=OPTS, input='p3pgraphnodes_composite1.cxx')
  3423. TargetAdd('p3pgraphnodes_composite2.obj', opts=OPTS, input='p3pgraphnodes_composite2.cxx')
  3424. OPTS=['DIR:panda/src/pgraphnodes', 'PYTHON']
  3425. IGATEFILES=GetDirectoryContents('panda/src/pgraphnodes', ["*.h", "*_composite*.cxx"])
  3426. TargetAdd('libp3pgraphnodes.in', opts=OPTS, input=IGATEFILES)
  3427. TargetAdd('libp3pgraphnodes.in', opts=['IMOD:panda3d.core', 'ILIB:libp3pgraphnodes', 'SRCDIR:panda/src/pgraphnodes'])
  3428. TargetAdd('libp3pgraphnodes_igate.obj', input='libp3pgraphnodes.in', opts=["DEPENDENCYONLY"])
  3429. #
  3430. # DIRECTORY: panda/src/pgraph/
  3431. #
  3432. if (not RUNTIME):
  3433. OPTS=['DIR:panda/src/pgraph', 'BUILDING:PANDA']
  3434. TargetAdd('p3pgraph_nodePath.obj', opts=OPTS, input='nodePath.cxx')
  3435. TargetAdd('p3pgraph_composite1.obj', opts=OPTS, input='p3pgraph_composite1.cxx')
  3436. TargetAdd('p3pgraph_composite2.obj', opts=OPTS, input='p3pgraph_composite2.cxx')
  3437. TargetAdd('p3pgraph_composite3.obj', opts=OPTS, input='p3pgraph_composite3.cxx')
  3438. TargetAdd('p3pgraph_composite4.obj', opts=OPTS, input='p3pgraph_composite4.cxx')
  3439. OPTS=['DIR:panda/src/pgraph', 'PYTHON']
  3440. IGATEFILES=GetDirectoryContents('panda/src/pgraph', ["*.h", "nodePath.cxx", "*_composite*.cxx"])
  3441. TargetAdd('libp3pgraph.in', opts=OPTS, input=IGATEFILES)
  3442. TargetAdd('libp3pgraph.in', opts=['IMOD:panda3d.core', 'ILIB:libp3pgraph', 'SRCDIR:panda/src/pgraph'])
  3443. TargetAdd('libp3pgraph_igate.obj', input='libp3pgraph.in', opts=["DEPENDENCYONLY","BIGOBJ"])
  3444. TargetAdd('p3pgraph_ext_composite.obj', opts=OPTS, input='p3pgraph_ext_composite.cxx')
  3445. #
  3446. # DIRECTORY: panda/src/cull/
  3447. #
  3448. if (not RUNTIME):
  3449. OPTS=['DIR:panda/src/cull', 'BUILDING:PANDA']
  3450. TargetAdd('p3cull_composite1.obj', opts=OPTS, input='p3cull_composite1.cxx')
  3451. TargetAdd('p3cull_composite2.obj', opts=OPTS, input='p3cull_composite2.cxx')
  3452. OPTS=['DIR:panda/src/cull', 'PYTHON']
  3453. IGATEFILES=GetDirectoryContents('panda/src/cull', ["*.h", "*_composite*.cxx"])
  3454. TargetAdd('libp3cull.in', opts=OPTS, input=IGATEFILES)
  3455. TargetAdd('libp3cull.in', opts=['IMOD:panda3d.core', 'ILIB:libp3cull', 'SRCDIR:panda/src/cull'])
  3456. TargetAdd('libp3cull_igate.obj', input='libp3cull.in', opts=["DEPENDENCYONLY"])
  3457. #
  3458. # DIRECTORY: panda/src/chan/
  3459. #
  3460. if (not RUNTIME):
  3461. OPTS=['DIR:panda/src/chan', 'BUILDING:PANDA']
  3462. TargetAdd('p3chan_composite1.obj', opts=OPTS, input='p3chan_composite1.cxx')
  3463. TargetAdd('p3chan_composite2.obj', opts=OPTS, input='p3chan_composite2.cxx')
  3464. OPTS=['DIR:panda/src/chan', 'PYTHON']
  3465. IGATEFILES=GetDirectoryContents('panda/src/chan', ["*.h", "*_composite*.cxx"])
  3466. IGATEFILES.remove('movingPart.h')
  3467. IGATEFILES.remove('animChannelFixed.h')
  3468. TargetAdd('libp3chan.in', opts=OPTS, input=IGATEFILES)
  3469. TargetAdd('libp3chan.in', opts=['IMOD:panda3d.core', 'ILIB:libp3chan', 'SRCDIR:panda/src/chan'])
  3470. TargetAdd('libp3chan_igate.obj', input='libp3chan.in', opts=["DEPENDENCYONLY"])
  3471. # DIRECTORY: panda/src/char/
  3472. #
  3473. if (not RUNTIME):
  3474. OPTS=['DIR:panda/src/char', 'BUILDING:PANDA']
  3475. TargetAdd('p3char_composite1.obj', opts=OPTS, input='p3char_composite1.cxx')
  3476. TargetAdd('p3char_composite2.obj', opts=OPTS, input='p3char_composite2.cxx')
  3477. OPTS=['DIR:panda/src/char', 'PYTHON']
  3478. IGATEFILES=GetDirectoryContents('panda/src/char', ["*.h", "*_composite*.cxx"])
  3479. TargetAdd('libp3char.in', opts=OPTS, input=IGATEFILES)
  3480. TargetAdd('libp3char.in', opts=['IMOD:panda3d.core', 'ILIB:libp3char', 'SRCDIR:panda/src/char'])
  3481. TargetAdd('libp3char_igate.obj', input='libp3char.in', opts=["DEPENDENCYONLY"])
  3482. #
  3483. # DIRECTORY: panda/src/dgraph/
  3484. #
  3485. if (not RUNTIME):
  3486. OPTS=['DIR:panda/src/dgraph', 'BUILDING:PANDA']
  3487. TargetAdd('p3dgraph_composite1.obj', opts=OPTS, input='p3dgraph_composite1.cxx')
  3488. TargetAdd('p3dgraph_composite2.obj', opts=OPTS, input='p3dgraph_composite2.cxx')
  3489. OPTS=['DIR:panda/src/dgraph', 'PYTHON']
  3490. IGATEFILES=GetDirectoryContents('panda/src/dgraph', ["*.h", "*_composite*.cxx"])
  3491. TargetAdd('libp3dgraph.in', opts=OPTS, input=IGATEFILES)
  3492. TargetAdd('libp3dgraph.in', opts=['IMOD:panda3d.core', 'ILIB:libp3dgraph', 'SRCDIR:panda/src/dgraph'])
  3493. TargetAdd('libp3dgraph_igate.obj', input='libp3dgraph.in', opts=["DEPENDENCYONLY"])
  3494. #
  3495. # DIRECTORY: panda/src/display/
  3496. #
  3497. if (not RUNTIME):
  3498. OPTS=['DIR:panda/src/display', 'BUILDING:PANDA']
  3499. TargetAdd('p3display_composite1.obj', opts=OPTS, input='p3display_composite1.cxx')
  3500. TargetAdd('p3display_composite2.obj', opts=OPTS, input='p3display_composite2.cxx')
  3501. OPTS=['DIR:panda/src/display', 'PYTHON']
  3502. IGATEFILES=GetDirectoryContents('panda/src/display', ["*.h", "*_composite*.cxx"])
  3503. IGATEFILES.remove("renderBuffer.h")
  3504. TargetAdd('libp3display.in', opts=OPTS, input=IGATEFILES)
  3505. TargetAdd('libp3display.in', opts=['IMOD:panda3d.core', 'ILIB:libp3display', 'SRCDIR:panda/src/display'])
  3506. TargetAdd('libp3display_igate.obj', input='libp3display.in', opts=["DEPENDENCYONLY"])
  3507. TargetAdd('p3display_graphicsStateGuardian_ext.obj', opts=OPTS, input='graphicsStateGuardian_ext.cxx')
  3508. TargetAdd('p3display_graphicsWindow_ext.obj', opts=OPTS, input='graphicsWindow_ext.cxx')
  3509. TargetAdd('p3display_pythonGraphicsWindowProc.obj', opts=OPTS, input='pythonGraphicsWindowProc.cxx')
  3510. if RTDIST and GetTarget() == 'darwin':
  3511. OPTS=['DIR:panda/src/display']
  3512. TargetAdd('subprocessWindowBuffer.obj', opts=OPTS, input='subprocessWindowBuffer.cxx')
  3513. TargetAdd('libp3subprocbuffer.ilb', input='subprocessWindowBuffer.obj')
  3514. #
  3515. # DIRECTORY: panda/src/device/
  3516. #
  3517. if (not RUNTIME):
  3518. OPTS=['DIR:panda/src/device', 'BUILDING:PANDA']
  3519. TargetAdd('p3device_composite1.obj', opts=OPTS, input='p3device_composite1.cxx')
  3520. TargetAdd('p3device_composite2.obj', opts=OPTS, input='p3device_composite2.cxx')
  3521. OPTS=['DIR:panda/src/device', 'PYTHON']
  3522. IGATEFILES=GetDirectoryContents('panda/src/device', ["*.h", "*_composite*.cxx"])
  3523. TargetAdd('libp3device.in', opts=OPTS, input=IGATEFILES)
  3524. TargetAdd('libp3device.in', opts=['IMOD:panda3d.core', 'ILIB:libp3device', 'SRCDIR:panda/src/device'])
  3525. TargetAdd('libp3device_igate.obj', input='libp3device.in', opts=["DEPENDENCYONLY"])
  3526. #
  3527. # DIRECTORY: panda/src/pnmtext/
  3528. #
  3529. if (PkgSkip("FREETYPE")==0 and not RUNTIME):
  3530. OPTS=['DIR:panda/src/pnmtext', 'BUILDING:PANDA', 'FREETYPE']
  3531. TargetAdd('p3pnmtext_composite1.obj', opts=OPTS, input='p3pnmtext_composite1.cxx')
  3532. OPTS=['DIR:panda/src/pnmtext', 'FREETYPE', 'PYTHON']
  3533. IGATEFILES=GetDirectoryContents('panda/src/pnmtext', ["*.h", "*_composite*.cxx"])
  3534. TargetAdd('libp3pnmtext.in', opts=OPTS, input=IGATEFILES)
  3535. TargetAdd('libp3pnmtext.in', opts=['IMOD:panda3d.core', 'ILIB:libp3pnmtext', 'SRCDIR:panda/src/pnmtext'])
  3536. TargetAdd('libp3pnmtext_igate.obj', input='libp3pnmtext.in', opts=["DEPENDENCYONLY"])
  3537. #
  3538. # DIRECTORY: panda/src/text/
  3539. #
  3540. if (not RUNTIME):
  3541. if not PkgSkip("HARFBUZZ"):
  3542. DefSymbol("HARFBUZZ", "HAVE_HARFBUZZ")
  3543. OPTS=['DIR:panda/src/text', 'BUILDING:PANDA', 'ZLIB', 'FREETYPE', 'HARFBUZZ']
  3544. TargetAdd('p3text_composite1.obj', opts=OPTS, input='p3text_composite1.cxx')
  3545. TargetAdd('p3text_composite2.obj', opts=OPTS, input='p3text_composite2.cxx')
  3546. OPTS=['DIR:panda/src/text', 'ZLIB', 'FREETYPE', 'PYTHON']
  3547. IGATEFILES=GetDirectoryContents('panda/src/text', ["*.h", "*_composite*.cxx"])
  3548. TargetAdd('libp3text.in', opts=OPTS, input=IGATEFILES)
  3549. TargetAdd('libp3text.in', opts=['IMOD:panda3d.core', 'ILIB:libp3text', 'SRCDIR:panda/src/text'])
  3550. TargetAdd('libp3text_igate.obj', input='libp3text.in', opts=["DEPENDENCYONLY"])
  3551. #
  3552. # DIRECTORY: panda/src/movies/
  3553. #
  3554. if (not RUNTIME):
  3555. OPTS=['DIR:panda/src/movies', 'BUILDING:PANDA', 'VORBIS', 'OPUS']
  3556. TargetAdd('p3movies_composite1.obj', opts=OPTS, input='p3movies_composite1.cxx')
  3557. OPTS=['DIR:panda/src/movies', 'VORBIS', 'OPUS', 'PYTHON']
  3558. IGATEFILES=GetDirectoryContents('panda/src/movies', ["*.h", "*_composite*.cxx"])
  3559. TargetAdd('libp3movies.in', opts=OPTS, input=IGATEFILES)
  3560. TargetAdd('libp3movies.in', opts=['IMOD:panda3d.core', 'ILIB:libp3movies', 'SRCDIR:panda/src/movies'])
  3561. TargetAdd('libp3movies_igate.obj', input='libp3movies.in', opts=["DEPENDENCYONLY"])
  3562. #
  3563. # DIRECTORY: panda/src/grutil/
  3564. #
  3565. if (not RUNTIME):
  3566. OPTS=['DIR:panda/src/grutil', 'BUILDING:PANDA']
  3567. TargetAdd('p3grutil_multitexReducer.obj', opts=OPTS, input='multitexReducer.cxx')
  3568. TargetAdd('p3grutil_composite1.obj', opts=OPTS, input='p3grutil_composite1.cxx')
  3569. TargetAdd('p3grutil_composite2.obj', opts=OPTS, input='p3grutil_composite2.cxx')
  3570. OPTS=['DIR:panda/src/grutil', 'PYTHON']
  3571. IGATEFILES=GetDirectoryContents('panda/src/grutil', ["*.h", "*_composite*.cxx"])
  3572. if 'convexHull.h' in IGATEFILES: IGATEFILES.remove('convexHull.h')
  3573. TargetAdd('libp3grutil.in', opts=OPTS, input=IGATEFILES)
  3574. TargetAdd('libp3grutil.in', opts=['IMOD:panda3d.core', 'ILIB:libp3grutil', 'SRCDIR:panda/src/grutil'])
  3575. TargetAdd('libp3grutil_igate.obj', input='libp3grutil.in', opts=["DEPENDENCYONLY"])
  3576. #
  3577. # DIRECTORY: panda/src/tform/
  3578. #
  3579. if (not RUNTIME):
  3580. OPTS=['DIR:panda/src/tform', 'BUILDING:PANDA']
  3581. TargetAdd('p3tform_composite1.obj', opts=OPTS, input='p3tform_composite1.cxx')
  3582. TargetAdd('p3tform_composite2.obj', opts=OPTS, input='p3tform_composite2.cxx')
  3583. OPTS=['DIR:panda/src/tform', 'PYTHON']
  3584. IGATEFILES=GetDirectoryContents('panda/src/tform', ["*.h", "*_composite*.cxx"])
  3585. TargetAdd('libp3tform.in', opts=OPTS, input=IGATEFILES)
  3586. TargetAdd('libp3tform.in', opts=['IMOD:panda3d.core', 'ILIB:libp3tform', 'SRCDIR:panda/src/tform'])
  3587. TargetAdd('libp3tform_igate.obj', input='libp3tform.in', opts=["DEPENDENCYONLY"])
  3588. #
  3589. # DIRECTORY: panda/src/collide/
  3590. #
  3591. if (not RUNTIME):
  3592. OPTS=['DIR:panda/src/collide', 'BUILDING:PANDA']
  3593. TargetAdd('p3collide_composite1.obj', opts=OPTS, input='p3collide_composite1.cxx')
  3594. TargetAdd('p3collide_composite2.obj', opts=OPTS, input='p3collide_composite2.cxx')
  3595. OPTS=['DIR:panda/src/collide', 'PYTHON']
  3596. IGATEFILES=GetDirectoryContents('panda/src/collide', ["*.h", "*_composite*.cxx"])
  3597. TargetAdd('libp3collide.in', opts=OPTS, input=IGATEFILES)
  3598. TargetAdd('libp3collide.in', opts=['IMOD:panda3d.core', 'ILIB:libp3collide', 'SRCDIR:panda/src/collide'])
  3599. TargetAdd('libp3collide_igate.obj', input='libp3collide.in', opts=["DEPENDENCYONLY"])
  3600. #
  3601. # DIRECTORY: panda/src/parametrics/
  3602. #
  3603. if (not RUNTIME):
  3604. OPTS=['DIR:panda/src/parametrics', 'BUILDING:PANDA']
  3605. TargetAdd('p3parametrics_composite1.obj', opts=OPTS, input='p3parametrics_composite1.cxx')
  3606. TargetAdd('p3parametrics_composite2.obj', opts=OPTS, input='p3parametrics_composite2.cxx')
  3607. OPTS=['DIR:panda/src/parametrics', 'PYTHON']
  3608. IGATEFILES=GetDirectoryContents('panda/src/parametrics', ["*.h", "*_composite*.cxx"])
  3609. TargetAdd('libp3parametrics.in', opts=OPTS, input=IGATEFILES)
  3610. TargetAdd('libp3parametrics.in', opts=['IMOD:panda3d.core', 'ILIB:libp3parametrics', 'SRCDIR:panda/src/parametrics'])
  3611. TargetAdd('libp3parametrics_igate.obj', input='libp3parametrics.in', opts=["DEPENDENCYONLY"])
  3612. #
  3613. # DIRECTORY: panda/src/pgui/
  3614. #
  3615. if (not RUNTIME):
  3616. OPTS=['DIR:panda/src/pgui', 'BUILDING:PANDA']
  3617. TargetAdd('p3pgui_composite1.obj', opts=OPTS, input='p3pgui_composite1.cxx')
  3618. TargetAdd('p3pgui_composite2.obj', opts=OPTS, input='p3pgui_composite2.cxx')
  3619. OPTS=['DIR:panda/src/pgui', 'PYTHON']
  3620. IGATEFILES=GetDirectoryContents('panda/src/pgui', ["*.h", "*_composite*.cxx"])
  3621. TargetAdd('libp3pgui.in', opts=OPTS, input=IGATEFILES)
  3622. TargetAdd('libp3pgui.in', opts=['IMOD:panda3d.core', 'ILIB:libp3pgui', 'SRCDIR:panda/src/pgui'])
  3623. TargetAdd('libp3pgui_igate.obj', input='libp3pgui.in', opts=["DEPENDENCYONLY"])
  3624. #
  3625. # DIRECTORY: panda/src/pnmimagetypes/
  3626. #
  3627. if (not RUNTIME):
  3628. OPTS=['DIR:panda/src/pnmimagetypes', 'DIR:panda/src/pnmimage', 'BUILDING:PANDA', 'PNG', 'ZLIB', 'JPEG', 'TIFF', 'OPENEXR', 'EXCEPTIONS']
  3629. TargetAdd('p3pnmimagetypes_composite1.obj', opts=OPTS, input='p3pnmimagetypes_composite1.cxx')
  3630. TargetAdd('p3pnmimagetypes_composite2.obj', opts=OPTS, input='p3pnmimagetypes_composite2.cxx')
  3631. #
  3632. # DIRECTORY: panda/src/recorder/
  3633. #
  3634. if (not RUNTIME):
  3635. OPTS=['DIR:panda/src/recorder', 'BUILDING:PANDA']
  3636. TargetAdd('p3recorder_composite1.obj', opts=OPTS, input='p3recorder_composite1.cxx')
  3637. TargetAdd('p3recorder_composite2.obj', opts=OPTS, input='p3recorder_composite2.cxx')
  3638. OPTS=['DIR:panda/src/recorder', 'PYTHON']
  3639. IGATEFILES=GetDirectoryContents('panda/src/recorder', ["*.h", "*_composite*.cxx"])
  3640. TargetAdd('libp3recorder.in', opts=OPTS, input=IGATEFILES)
  3641. TargetAdd('libp3recorder.in', opts=['IMOD:panda3d.core', 'ILIB:libp3recorder', 'SRCDIR:panda/src/recorder'])
  3642. TargetAdd('libp3recorder_igate.obj', input='libp3recorder.in', opts=["DEPENDENCYONLY"])
  3643. #
  3644. # DIRECTORY: panda/src/dxml/
  3645. #
  3646. DefSymbol("TINYXML", "TIXML_USE_STL", "")
  3647. OPTS=['DIR:panda/src/dxml', 'TINYXML']
  3648. TargetAdd('tinyxml_composite1.obj', opts=OPTS, input='tinyxml_composite1.cxx')
  3649. TargetAdd('libp3tinyxml.ilb', input='tinyxml_composite1.obj')
  3650. if (not RUNTIME):
  3651. OPTS=['DIR:panda/src/dxml', 'BUILDING:PANDA', 'TINYXML']
  3652. TargetAdd('p3dxml_composite1.obj', opts=OPTS, input='p3dxml_composite1.cxx')
  3653. OPTS=['DIR:panda/src/dxml', 'TINYXML', 'PYTHON']
  3654. IGATEFILES=GetDirectoryContents('panda/src/dxml', ["*.h", "p3dxml_composite1.cxx"])
  3655. TargetAdd('libp3dxml.in', opts=OPTS, input=IGATEFILES)
  3656. TargetAdd('libp3dxml.in', opts=['IMOD:panda3d.core', 'ILIB:libp3dxml', 'SRCDIR:panda/src/dxml'])
  3657. TargetAdd('libp3dxml_igate.obj', input='libp3dxml.in', opts=["DEPENDENCYONLY"])
  3658. #
  3659. # DIRECTORY: panda/metalibs/panda/
  3660. #
  3661. if (not RUNTIME):
  3662. OPTS=['DIR:panda/metalibs/panda', 'BUILDING:PANDA', 'JPEG', 'PNG', 'HARFBUZZ',
  3663. 'TIFF', 'OPENEXR', 'ZLIB', 'OPENSSL', 'FREETYPE', 'FFTW', 'ADVAPI', 'WINSOCK2',
  3664. 'SQUISH', 'NVIDIACG', 'VORBIS', 'OPUS', 'WINUSER', 'WINMM', 'WINGDI', 'IPHLPAPI']
  3665. TargetAdd('panda_panda.obj', opts=OPTS, input='panda.cxx')
  3666. TargetAdd('libpanda.dll', input='panda_panda.obj')
  3667. TargetAdd('libpanda.dll', input='p3recorder_composite1.obj')
  3668. TargetAdd('libpanda.dll', input='p3recorder_composite2.obj')
  3669. TargetAdd('libpanda.dll', input='p3pgraphnodes_composite1.obj')
  3670. TargetAdd('libpanda.dll', input='p3pgraphnodes_composite2.obj')
  3671. TargetAdd('libpanda.dll', input='p3pgraph_nodePath.obj')
  3672. TargetAdd('libpanda.dll', input='p3pgraph_composite1.obj')
  3673. TargetAdd('libpanda.dll', input='p3pgraph_composite2.obj')
  3674. TargetAdd('libpanda.dll', input='p3pgraph_composite3.obj')
  3675. TargetAdd('libpanda.dll', input='p3pgraph_composite4.obj')
  3676. TargetAdd('libpanda.dll', input='p3cull_composite1.obj')
  3677. TargetAdd('libpanda.dll', input='p3cull_composite2.obj')
  3678. TargetAdd('libpanda.dll', input='p3movies_composite1.obj')
  3679. TargetAdd('libpanda.dll', input='p3grutil_multitexReducer.obj')
  3680. TargetAdd('libpanda.dll', input='p3grutil_composite1.obj')
  3681. TargetAdd('libpanda.dll', input='p3grutil_composite2.obj')
  3682. TargetAdd('libpanda.dll', input='p3chan_composite1.obj')
  3683. TargetAdd('libpanda.dll', input='p3chan_composite2.obj')
  3684. TargetAdd('libpanda.dll', input='p3pstatclient_composite1.obj')
  3685. TargetAdd('libpanda.dll', input='p3pstatclient_composite2.obj')
  3686. TargetAdd('libpanda.dll', input='p3char_composite1.obj')
  3687. TargetAdd('libpanda.dll', input='p3char_composite2.obj')
  3688. TargetAdd('libpanda.dll', input='p3collide_composite1.obj')
  3689. TargetAdd('libpanda.dll', input='p3collide_composite2.obj')
  3690. TargetAdd('libpanda.dll', input='p3device_composite1.obj')
  3691. TargetAdd('libpanda.dll', input='p3device_composite2.obj')
  3692. TargetAdd('libpanda.dll', input='p3dgraph_composite1.obj')
  3693. TargetAdd('libpanda.dll', input='p3dgraph_composite2.obj')
  3694. TargetAdd('libpanda.dll', input='p3display_composite1.obj')
  3695. TargetAdd('libpanda.dll', input='p3display_composite2.obj')
  3696. TargetAdd('libpanda.dll', input='p3pipeline_composite1.obj')
  3697. TargetAdd('libpanda.dll', input='p3pipeline_composite2.obj')
  3698. TargetAdd('libpanda.dll', input='p3pipeline_contextSwitch.obj')
  3699. TargetAdd('libpanda.dll', input='p3event_composite1.obj')
  3700. TargetAdd('libpanda.dll', input='p3event_composite2.obj')
  3701. TargetAdd('libpanda.dll', input='p3gobj_composite1.obj')
  3702. TargetAdd('libpanda.dll', input='p3gobj_composite2.obj')
  3703. TargetAdd('libpanda.dll', input='p3gsgbase_composite1.obj')
  3704. TargetAdd('libpanda.dll', input='p3linmath_composite1.obj')
  3705. TargetAdd('libpanda.dll', input='p3linmath_composite2.obj')
  3706. TargetAdd('libpanda.dll', input='p3mathutil_composite1.obj')
  3707. TargetAdd('libpanda.dll', input='p3mathutil_composite2.obj')
  3708. TargetAdd('libpanda.dll', input='p3parametrics_composite1.obj')
  3709. TargetAdd('libpanda.dll', input='p3parametrics_composite2.obj')
  3710. TargetAdd('libpanda.dll', input='p3pnmimagetypes_composite1.obj')
  3711. TargetAdd('libpanda.dll', input='p3pnmimagetypes_composite2.obj')
  3712. TargetAdd('libpanda.dll', input='p3pnmimage_composite1.obj')
  3713. TargetAdd('libpanda.dll', input='p3pnmimage_composite2.obj')
  3714. TargetAdd('libpanda.dll', input='p3pnmimage_convert_srgb_sse2.obj')
  3715. TargetAdd('libpanda.dll', input='p3text_composite1.obj')
  3716. TargetAdd('libpanda.dll', input='p3text_composite2.obj')
  3717. TargetAdd('libpanda.dll', input='p3tform_composite1.obj')
  3718. TargetAdd('libpanda.dll', input='p3tform_composite2.obj')
  3719. TargetAdd('libpanda.dll', input='p3putil_composite1.obj')
  3720. TargetAdd('libpanda.dll', input='p3putil_composite2.obj')
  3721. TargetAdd('libpanda.dll', input='p3audio_composite1.obj')
  3722. TargetAdd('libpanda.dll', input='p3pgui_composite1.obj')
  3723. TargetAdd('libpanda.dll', input='p3pgui_composite2.obj')
  3724. TargetAdd('libpanda.dll', input='p3net_composite1.obj')
  3725. TargetAdd('libpanda.dll', input='p3net_composite2.obj')
  3726. TargetAdd('libpanda.dll', input='p3nativenet_composite1.obj')
  3727. TargetAdd('libpanda.dll', input='p3pandabase_pandabase.obj')
  3728. TargetAdd('libpanda.dll', input='libpandaexpress.dll')
  3729. TargetAdd('libpanda.dll', input='p3dxml_composite1.obj')
  3730. TargetAdd('libpanda.dll', input='libp3dtoolconfig.dll')
  3731. TargetAdd('libpanda.dll', input='libp3dtool.dll')
  3732. if PkgSkip("FREETYPE")==0:
  3733. TargetAdd('libpanda.dll', input="p3pnmtext_composite1.obj")
  3734. TargetAdd('libpanda.dll', dep='dtool_have_freetype.dat')
  3735. TargetAdd('libpanda.dll', opts=OPTS)
  3736. TargetAdd('core_module.obj', input='libp3dtoolbase.in')
  3737. TargetAdd('core_module.obj', input='libp3dtoolutil.in')
  3738. TargetAdd('core_module.obj', input='libp3prc.in')
  3739. TargetAdd('core_module.obj', input='libp3downloader.in')
  3740. TargetAdd('core_module.obj', input='libp3express.in')
  3741. TargetAdd('core_module.obj', input='libp3recorder.in')
  3742. TargetAdd('core_module.obj', input='libp3pgraphnodes.in')
  3743. TargetAdd('core_module.obj', input='libp3pgraph.in')
  3744. TargetAdd('core_module.obj', input='libp3cull.in')
  3745. TargetAdd('core_module.obj', input='libp3grutil.in')
  3746. TargetAdd('core_module.obj', input='libp3chan.in')
  3747. TargetAdd('core_module.obj', input='libp3pstatclient.in')
  3748. TargetAdd('core_module.obj', input='libp3char.in')
  3749. TargetAdd('core_module.obj', input='libp3collide.in')
  3750. TargetAdd('core_module.obj', input='libp3device.in')
  3751. TargetAdd('core_module.obj', input='libp3dgraph.in')
  3752. TargetAdd('core_module.obj', input='libp3display.in')
  3753. TargetAdd('core_module.obj', input='libp3pipeline.in')
  3754. TargetAdd('core_module.obj', input='libp3event.in')
  3755. TargetAdd('core_module.obj', input='libp3gobj.in')
  3756. TargetAdd('core_module.obj', input='libp3gsgbase.in')
  3757. TargetAdd('core_module.obj', input='libp3linmath.in')
  3758. TargetAdd('core_module.obj', input='libp3mathutil.in')
  3759. TargetAdd('core_module.obj', input='libp3parametrics.in')
  3760. TargetAdd('core_module.obj', input='libp3pnmimage.in')
  3761. TargetAdd('core_module.obj', input='libp3text.in')
  3762. TargetAdd('core_module.obj', input='libp3tform.in')
  3763. TargetAdd('core_module.obj', input='libp3putil.in')
  3764. TargetAdd('core_module.obj', input='libp3audio.in')
  3765. TargetAdd('core_module.obj', input='libp3nativenet.in')
  3766. TargetAdd('core_module.obj', input='libp3net.in')
  3767. TargetAdd('core_module.obj', input='libp3pgui.in')
  3768. TargetAdd('core_module.obj', input='libp3movies.in')
  3769. TargetAdd('core_module.obj', input='libp3dxml.in')
  3770. if PkgSkip("FREETYPE")==0:
  3771. TargetAdd('core_module.obj', input='libp3pnmtext.in')
  3772. TargetAdd('core_module.obj', opts=['PYTHON'])
  3773. TargetAdd('core_module.obj', opts=['IMOD:panda3d.core', 'ILIB:core'])
  3774. TargetAdd('core.pyd', input='libp3dtoolbase_igate.obj')
  3775. TargetAdd('core.pyd', input='p3dtoolbase_typeHandle_ext.obj')
  3776. TargetAdd('core.pyd', input='libp3dtoolutil_igate.obj')
  3777. TargetAdd('core.pyd', input='p3dtoolutil_ext_composite.obj')
  3778. TargetAdd('core.pyd', input='libp3prc_igate.obj')
  3779. TargetAdd('core.pyd', input='p3prc_ext_composite.obj')
  3780. TargetAdd('core.pyd', input='libp3downloader_igate.obj')
  3781. TargetAdd('core.pyd', input='p3downloader_stringStream_ext.obj')
  3782. TargetAdd('core.pyd', input='p3express_ext_composite.obj')
  3783. TargetAdd('core.pyd', input='libp3express_igate.obj')
  3784. TargetAdd('core.pyd', input='libp3recorder_igate.obj')
  3785. TargetAdd('core.pyd', input='libp3pgraphnodes_igate.obj')
  3786. TargetAdd('core.pyd', input='libp3pgraph_igate.obj')
  3787. TargetAdd('core.pyd', input='libp3movies_igate.obj')
  3788. TargetAdd('core.pyd', input='libp3grutil_igate.obj')
  3789. TargetAdd('core.pyd', input='libp3chan_igate.obj')
  3790. TargetAdd('core.pyd', input='libp3pstatclient_igate.obj')
  3791. TargetAdd('core.pyd', input='libp3char_igate.obj')
  3792. TargetAdd('core.pyd', input='libp3collide_igate.obj')
  3793. TargetAdd('core.pyd', input='libp3device_igate.obj')
  3794. TargetAdd('core.pyd', input='libp3dgraph_igate.obj')
  3795. TargetAdd('core.pyd', input='libp3display_igate.obj')
  3796. TargetAdd('core.pyd', input='libp3pipeline_igate.obj')
  3797. TargetAdd('core.pyd', input='libp3event_igate.obj')
  3798. TargetAdd('core.pyd', input='libp3gobj_igate.obj')
  3799. TargetAdd('core.pyd', input='libp3gsgbase_igate.obj')
  3800. TargetAdd('core.pyd', input='libp3linmath_igate.obj')
  3801. TargetAdd('core.pyd', input='libp3mathutil_igate.obj')
  3802. TargetAdd('core.pyd', input='libp3parametrics_igate.obj')
  3803. TargetAdd('core.pyd', input='libp3pnmimage_igate.obj')
  3804. TargetAdd('core.pyd', input='libp3text_igate.obj')
  3805. TargetAdd('core.pyd', input='libp3tform_igate.obj')
  3806. TargetAdd('core.pyd', input='libp3putil_igate.obj')
  3807. TargetAdd('core.pyd', input='libp3audio_igate.obj')
  3808. TargetAdd('core.pyd', input='libp3pgui_igate.obj')
  3809. TargetAdd('core.pyd', input='libp3net_igate.obj')
  3810. TargetAdd('core.pyd', input='libp3nativenet_igate.obj')
  3811. TargetAdd('core.pyd', input='libp3dxml_igate.obj')
  3812. if PkgSkip("FREETYPE")==0:
  3813. TargetAdd('core.pyd', input="libp3pnmtext_igate.obj")
  3814. TargetAdd('core.pyd', input='p3pipeline_pythonThread.obj')
  3815. TargetAdd('core.pyd', input='p3putil_ext_composite.obj')
  3816. TargetAdd('core.pyd', input='p3pnmimage_pfmFile_ext.obj')
  3817. TargetAdd('core.pyd', input='p3event_asyncFuture_ext.obj')
  3818. TargetAdd('core.pyd', input='p3event_pythonTask.obj')
  3819. TargetAdd('core.pyd', input='p3gobj_ext_composite.obj')
  3820. TargetAdd('core.pyd', input='p3pgraph_ext_composite.obj')
  3821. TargetAdd('core.pyd', input='p3display_graphicsStateGuardian_ext.obj')
  3822. TargetAdd('core.pyd', input='p3display_graphicsWindow_ext.obj')
  3823. TargetAdd('core.pyd', input='p3display_pythonGraphicsWindowProc.obj')
  3824. TargetAdd('core.pyd', input='core_module.obj')
  3825. if not GetLinkAllStatic() and GetTarget() != 'emscripten':
  3826. TargetAdd('core.pyd', input='libp3tinyxml.ilb')
  3827. TargetAdd('core.pyd', input='libp3interrogatedb.dll')
  3828. TargetAdd('core.pyd', input=COMMON_PANDA_LIBS)
  3829. TargetAdd('core.pyd', opts=['PYTHON', 'WINSOCK2'])
  3830. #
  3831. # DIRECTORY: panda/src/vision/
  3832. #
  3833. if (PkgSkip("VISION") == 0) and (not RUNTIME):
  3834. # We want to know whether we have ffmpeg so that we can override the .avi association.
  3835. if not PkgSkip("FFMPEG"):
  3836. DefSymbol("OPENCV", "HAVE_FFMPEG")
  3837. if not PkgSkip("OPENCV"):
  3838. DefSymbol("OPENCV", "HAVE_OPENCV")
  3839. if OPENCV_VER_23:
  3840. DefSymbol("OPENCV", "OPENCV_VER_23")
  3841. OPTS=['DIR:panda/src/vision', 'BUILDING:VISION', 'ARTOOLKIT', 'OPENCV', 'DX9', 'DIRECTCAM', 'JPEG', 'EXCEPTIONS']
  3842. TargetAdd('p3vision_composite1.obj', opts=OPTS, input='p3vision_composite1.cxx', dep=[
  3843. 'dtool_have_ffmpeg.dat',
  3844. 'dtool_have_opencv.dat',
  3845. 'dtool_have_directcam.dat',
  3846. ])
  3847. TargetAdd('libp3vision.dll', input='p3vision_composite1.obj')
  3848. TargetAdd('libp3vision.dll', input=COMMON_PANDA_LIBS)
  3849. TargetAdd('libp3vision.dll', opts=OPTS)
  3850. OPTS=['DIR:panda/src/vision', 'ARTOOLKIT', 'OPENCV', 'DX9', 'DIRECTCAM', 'JPEG', 'EXCEPTIONS', 'PYTHON']
  3851. IGATEFILES=GetDirectoryContents('panda/src/vision', ["*.h", "*_composite*.cxx"])
  3852. TargetAdd('libp3vision.in', opts=OPTS, input=IGATEFILES)
  3853. TargetAdd('libp3vision.in', opts=['IMOD:panda3d.vision', 'ILIB:libp3vision', 'SRCDIR:panda/src/vision'])
  3854. TargetAdd('libp3vision_igate.obj', input='libp3vision.in', opts=["DEPENDENCYONLY"])
  3855. TargetAdd('vision_module.obj', input='libp3vision.in')
  3856. TargetAdd('vision_module.obj', opts=OPTS)
  3857. TargetAdd('vision_module.obj', opts=['IMOD:panda3d.vision', 'ILIB:vision', 'IMPORT:panda3d.core'])
  3858. TargetAdd('vision.pyd', input='vision_module.obj')
  3859. TargetAdd('vision.pyd', input='libp3vision_igate.obj')
  3860. TargetAdd('vision.pyd', input='libp3vision.dll')
  3861. TargetAdd('vision.pyd', input='libp3interrogatedb.dll')
  3862. TargetAdd('vision.pyd', input=COMMON_PANDA_LIBS)
  3863. TargetAdd('vision.pyd', opts=['PYTHON'])
  3864. #
  3865. # DIRECTORY: panda/src/rocket/
  3866. #
  3867. if (PkgSkip("ROCKET") == 0) and (not RUNTIME):
  3868. OPTS=['DIR:panda/src/rocket', 'BUILDING:ROCKET', 'ROCKET', 'PYTHON']
  3869. TargetAdd('p3rocket_composite1.obj', opts=OPTS, input='p3rocket_composite1.cxx')
  3870. TargetAdd('libp3rocket.dll', input='p3rocket_composite1.obj')
  3871. TargetAdd('libp3rocket.dll', input=COMMON_PANDA_LIBS)
  3872. TargetAdd('libp3rocket.dll', opts=OPTS)
  3873. OPTS=['DIR:panda/src/rocket', 'ROCKET', 'RTTI', 'EXCEPTIONS', 'PYTHON']
  3874. IGATEFILES=GetDirectoryContents('panda/src/rocket', ["rocketInputHandler.h",
  3875. "rocketInputHandler.cxx", "rocketRegion.h", "rocketRegion.cxx", "rocketRegion_ext.h"])
  3876. TargetAdd('libp3rocket.in', opts=OPTS, input=IGATEFILES)
  3877. TargetAdd('libp3rocket.in', opts=['IMOD:panda3d.rocket', 'ILIB:libp3rocket', 'SRCDIR:panda/src/rocket'])
  3878. TargetAdd('libp3rocket_igate.obj', input='libp3rocket.in', opts=["DEPENDENCYONLY"])
  3879. TargetAdd('p3rocket_rocketRegion_ext.obj', opts=OPTS, input='rocketRegion_ext.cxx')
  3880. TargetAdd('rocket_module.obj', input='libp3rocket.in')
  3881. TargetAdd('rocket_module.obj', opts=OPTS)
  3882. TargetAdd('rocket_module.obj', opts=['IMOD:panda3d.rocket', 'ILIB:rocket', 'IMPORT:panda3d.core'])
  3883. TargetAdd('rocket.pyd', input='rocket_module.obj')
  3884. TargetAdd('rocket.pyd', input='libp3rocket_igate.obj')
  3885. TargetAdd('rocket.pyd', input='p3rocket_rocketRegion_ext.obj')
  3886. TargetAdd('rocket.pyd', input='libp3rocket.dll')
  3887. TargetAdd('rocket.pyd', input='libp3interrogatedb.dll')
  3888. TargetAdd('rocket.pyd', input=COMMON_PANDA_LIBS)
  3889. TargetAdd('rocket.pyd', opts=['PYTHON', 'ROCKET'])
  3890. #
  3891. # DIRECTORY: panda/src/p3awesomium
  3892. #
  3893. if PkgSkip("AWESOMIUM") == 0 and not RUNTIME:
  3894. OPTS=['DIR:panda/src/awesomium', 'BUILDING:PANDAAWESOMIUM', 'AWESOMIUM']
  3895. TargetAdd('pandaawesomium_composite1.obj', opts=OPTS, input='pandaawesomium_composite1.cxx')
  3896. TargetAdd('libp3awesomium.dll', input='pandaawesomium_composite1.obj')
  3897. TargetAdd('libp3awesomium.dll', input=COMMON_PANDA_LIBS)
  3898. TargetAdd('libp3awesomium.dll', opts=OPTS)
  3899. OPTS=['DIR:panda/src/awesomium', 'AWESOMIUM', 'PYTHON']
  3900. IGATEFILES=GetDirectoryContents('panda/src/awesomium', ["*.h", "*_composite1.cxx"])
  3901. TargetAdd('libp3awesomium.in', opts=OPTS, input=IGATEFILES)
  3902. TargetAdd('libp3awesomium.in', opts=['IMOD:panda3d.awesomium', 'ILIB:libp3awesomium', 'SRCDIR:panda/src/awesomium'])
  3903. TargetAdd('libp3awesomium_igate.obj', input='libp3awesomium.in', opts=["DEPENDENCYONLY"])
  3904. TargetAdd('awesomium_module.obj', input='libp3awesomium.in')
  3905. TargetAdd('awesomium_module.obj', opts=OPTS)
  3906. TargetAdd('awesomium_module.obj', opts=['IMOD:panda3d.awesomium', 'ILIB:awesomium', 'IMPORT:panda3d.core'])
  3907. TargetAdd('awesomium.pyd', input='awesomium_module.obj')
  3908. TargetAdd('awesomium.pyd', input='libp3awesomium_igate.obj')
  3909. TargetAdd('awesomium.pyd', input='libp3awesomium.dll')
  3910. TargetAdd('awesomium.pyd', input='libp3interrogatedb.dll')
  3911. TargetAdd('awesomium.pyd', input=COMMON_PANDA_LIBS)
  3912. TargetAdd('awesomium.pyd', opts=['PYTHON'])
  3913. #
  3914. # DIRECTORY: panda/src/p3skel
  3915. #
  3916. if (PkgSkip('SKEL')==0) and (not RUNTIME):
  3917. OPTS=['DIR:panda/src/skel', 'BUILDING:PANDASKEL', 'ADVAPI']
  3918. TargetAdd('p3skel_composite1.obj', opts=OPTS, input='p3skel_composite1.cxx')
  3919. OPTS=['DIR:panda/src/skel', 'ADVAPI', 'PYTHON']
  3920. IGATEFILES=GetDirectoryContents("panda/src/skel", ["*.h", "*_composite*.cxx"])
  3921. TargetAdd('libp3skel.in', opts=OPTS, input=IGATEFILES)
  3922. TargetAdd('libp3skel.in', opts=['IMOD:panda3d.skel', 'ILIB:libp3skel', 'SRCDIR:panda/src/skel'])
  3923. TargetAdd('libp3skel_igate.obj', input='libp3skel.in', opts=["DEPENDENCYONLY"])
  3924. #
  3925. # DIRECTORY: panda/src/p3skel
  3926. #
  3927. if (PkgSkip('SKEL')==0) and (not RUNTIME):
  3928. OPTS=['BUILDING:PANDASKEL', 'ADVAPI']
  3929. TargetAdd('libpandaskel.dll', input='p3skel_composite1.obj')
  3930. TargetAdd('libpandaskel.dll', input=COMMON_PANDA_LIBS)
  3931. TargetAdd('libpandaskel.dll', opts=OPTS)
  3932. OPTS=['PYTHON']
  3933. TargetAdd('skel_module.obj', input='libp3skel.in')
  3934. TargetAdd('skel_module.obj', opts=OPTS)
  3935. TargetAdd('skel_module.obj', opts=['IMOD:panda3d.skel', 'ILIB:skel', 'IMPORT:panda3d.core'])
  3936. TargetAdd('skel.pyd', input='skel_module.obj')
  3937. TargetAdd('skel.pyd', input='libp3skel_igate.obj')
  3938. TargetAdd('skel.pyd', input='libpandaskel.dll')
  3939. TargetAdd('skel.pyd', input='libp3interrogatedb.dll')
  3940. TargetAdd('skel.pyd', input=COMMON_PANDA_LIBS)
  3941. TargetAdd('skel.pyd', opts=['PYTHON'])
  3942. #
  3943. # DIRECTORY: panda/src/distort/
  3944. #
  3945. if (PkgSkip('PANDAFX')==0) and (not RUNTIME):
  3946. OPTS=['DIR:panda/src/distort', 'BUILDING:PANDAFX']
  3947. TargetAdd('p3distort_composite1.obj', opts=OPTS, input='p3distort_composite1.cxx')
  3948. OPTS=['DIR:panda/metalibs/pandafx', 'DIR:panda/src/distort', 'NVIDIACG', 'PYTHON']
  3949. IGATEFILES=GetDirectoryContents('panda/src/distort', ["*.h", "*_composite*.cxx"])
  3950. TargetAdd('libp3distort.in', opts=OPTS, input=IGATEFILES)
  3951. TargetAdd('libp3distort.in', opts=['IMOD:panda3d.fx', 'ILIB:libp3distort', 'SRCDIR:panda/src/distort'])
  3952. TargetAdd('libp3distort_igate.obj', input='libp3distort.in', opts=["DEPENDENCYONLY"])
  3953. #
  3954. # DIRECTORY: panda/metalibs/pandafx/
  3955. #
  3956. if (PkgSkip('PANDAFX')==0) and (not RUNTIME):
  3957. OPTS=['DIR:panda/metalibs/pandafx', 'DIR:panda/src/distort', 'BUILDING:PANDAFX', 'NVIDIACG']
  3958. TargetAdd('pandafx_pandafx.obj', opts=OPTS, input='pandafx.cxx')
  3959. TargetAdd('libpandafx.dll', input='pandafx_pandafx.obj')
  3960. TargetAdd('libpandafx.dll', input='p3distort_composite1.obj')
  3961. TargetAdd('libpandafx.dll', input=COMMON_PANDA_LIBS)
  3962. TargetAdd('libpandafx.dll', opts=['ADVAPI', 'NVIDIACG'])
  3963. OPTS=['DIR:panda/metalibs/pandafx', 'DIR:panda/src/distort', 'NVIDIACG', 'PYTHON']
  3964. TargetAdd('fx_module.obj', input='libp3distort.in')
  3965. TargetAdd('fx_module.obj', opts=OPTS)
  3966. TargetAdd('fx_module.obj', opts=['IMOD:panda3d.fx', 'ILIB:fx', 'IMPORT:panda3d.core'])
  3967. TargetAdd('fx.pyd', input='fx_module.obj')
  3968. TargetAdd('fx.pyd', input='libp3distort_igate.obj')
  3969. TargetAdd('fx.pyd', input='libpandafx.dll')
  3970. TargetAdd('fx.pyd', input='libp3interrogatedb.dll')
  3971. TargetAdd('fx.pyd', input=COMMON_PANDA_LIBS)
  3972. TargetAdd('fx.pyd', opts=['PYTHON'])
  3973. #
  3974. # DIRECTORY: panda/src/vrpn/
  3975. #
  3976. if (PkgSkip("VRPN")==0 and not RUNTIME):
  3977. OPTS=['DIR:panda/src/vrpn', 'BUILDING:VRPN', 'VRPN']
  3978. TargetAdd('p3vrpn_composite1.obj', opts=OPTS, input='p3vrpn_composite1.cxx')
  3979. TargetAdd('libp3vrpn.dll', input='p3vrpn_composite1.obj')
  3980. TargetAdd('libp3vrpn.dll', input=COMMON_PANDA_LIBS)
  3981. TargetAdd('libp3vrpn.dll', opts=['VRPN'])
  3982. OPTS=['DIR:panda/src/vrpn', 'VRPN', 'PYTHON']
  3983. IGATEFILES=GetDirectoryContents('panda/src/vrpn', ["*.h", "*_composite*.cxx"])
  3984. TargetAdd('libp3vrpn.in', opts=OPTS, input=IGATEFILES)
  3985. TargetAdd('libp3vrpn.in', opts=['IMOD:panda3d.vrpn', 'ILIB:libp3vrpn', 'SRCDIR:panda/src/vrpn'])
  3986. TargetAdd('libp3vrpn_igate.obj', input='libp3vrpn.in', opts=["DEPENDENCYONLY"])
  3987. TargetAdd('vrpn_module.obj', input='libp3vrpn.in')
  3988. TargetAdd('vrpn_module.obj', opts=OPTS)
  3989. TargetAdd('vrpn_module.obj', opts=['IMOD:panda3d.vrpn', 'ILIB:vrpn', 'IMPORT:panda3d.core'])
  3990. TargetAdd('vrpn.pyd', input='vrpn_module.obj')
  3991. TargetAdd('vrpn.pyd', input='libp3vrpn_igate.obj')
  3992. TargetAdd('vrpn.pyd', input='libp3vrpn.dll')
  3993. TargetAdd('vrpn.pyd', input='libp3interrogatedb.dll')
  3994. TargetAdd('vrpn.pyd', input=COMMON_PANDA_LIBS)
  3995. TargetAdd('vrpn.pyd', opts=['PYTHON'])
  3996. #
  3997. # DIRECTORY: panda/src/ffmpeg
  3998. #
  3999. if PkgSkip("FFMPEG") == 0 and not RUNTIME:
  4000. if not PkgSkip("SWSCALE"):
  4001. DefSymbol("FFMPEG", "HAVE_SWSCALE")
  4002. if not PkgSkip("SWRESAMPLE"):
  4003. DefSymbol("FFMPEG", "HAVE_SWRESAMPLE")
  4004. OPTS=['DIR:panda/src/ffmpeg', 'BUILDING:FFMPEG', 'FFMPEG', 'SWSCALE', 'SWRESAMPLE']
  4005. TargetAdd('p3ffmpeg_composite1.obj', opts=OPTS, input='p3ffmpeg_composite1.cxx', dep=[
  4006. 'dtool_have_swscale.dat', 'dtool_have_swresample.dat'])
  4007. TargetAdd('libp3ffmpeg.dll', input='p3ffmpeg_composite1.obj')
  4008. TargetAdd('libp3ffmpeg.dll', input=COMMON_PANDA_LIBS)
  4009. TargetAdd('libp3ffmpeg.dll', opts=OPTS)
  4010. #
  4011. # DIRECTORY: panda/src/audiotraits/
  4012. #
  4013. if PkgSkip("FMODEX") == 0 and not RUNTIME:
  4014. OPTS=['DIR:panda/src/audiotraits', 'BUILDING:FMOD_AUDIO', 'FMODEX']
  4015. TargetAdd('fmod_audio_fmod_audio_composite1.obj', opts=OPTS, input='fmod_audio_composite1.cxx')
  4016. TargetAdd('libp3fmod_audio.dll', input='fmod_audio_fmod_audio_composite1.obj')
  4017. TargetAdd('libp3fmod_audio.dll', input=COMMON_PANDA_LIBS)
  4018. TargetAdd('libp3fmod_audio.dll', opts=['MODULE', 'ADVAPI', 'WINUSER', 'WINMM', 'FMODEX'])
  4019. if PkgSkip("OPENAL") == 0 and not RUNTIME:
  4020. OPTS=['DIR:panda/src/audiotraits', 'BUILDING:OPENAL_AUDIO', 'OPENAL']
  4021. TargetAdd('openal_audio_openal_audio_composite1.obj', opts=OPTS, input='openal_audio_composite1.cxx')
  4022. TargetAdd('libp3openal_audio.dll', input='openal_audio_openal_audio_composite1.obj')
  4023. TargetAdd('libp3openal_audio.dll', input=COMMON_PANDA_LIBS)
  4024. TargetAdd('libp3openal_audio.dll', opts=['MODULE', 'ADVAPI', 'WINUSER', 'WINMM', 'WINSHELL', 'WINOLE', 'OPENAL'])
  4025. #
  4026. # DIRECTORY: panda/src/downloadertools/
  4027. #
  4028. if (PkgSkip("OPENSSL")==0 and not RTDIST and not RUNTIME and PkgSkip("DEPLOYTOOLS")==0):
  4029. OPTS=['DIR:panda/src/downloadertools', 'OPENSSL', 'ZLIB', 'ADVAPI', 'WINSOCK2', 'WINSHELL', 'WINGDI', 'WINUSER']
  4030. TargetAdd('apply_patch_apply_patch.obj', opts=OPTS, input='apply_patch.cxx')
  4031. TargetAdd('apply_patch.exe', input=['apply_patch_apply_patch.obj'])
  4032. TargetAdd('apply_patch.exe', input=COMMON_PANDA_LIBS)
  4033. TargetAdd('apply_patch.exe', opts=OPTS)
  4034. TargetAdd('build_patch_build_patch.obj', opts=OPTS, input='build_patch.cxx')
  4035. TargetAdd('build_patch.exe', input=['build_patch_build_patch.obj'])
  4036. TargetAdd('build_patch.exe', input=COMMON_PANDA_LIBS)
  4037. TargetAdd('build_patch.exe', opts=OPTS)
  4038. if not PkgSkip("ZLIB"):
  4039. TargetAdd('check_adler_check_adler.obj', opts=OPTS, input='check_adler.cxx')
  4040. TargetAdd('check_adler.exe', input=['check_adler_check_adler.obj'])
  4041. TargetAdd('check_adler.exe', input=COMMON_PANDA_LIBS)
  4042. TargetAdd('check_adler.exe', opts=OPTS)
  4043. TargetAdd('check_crc_check_crc.obj', opts=OPTS, input='check_crc.cxx')
  4044. TargetAdd('check_crc.exe', input=['check_crc_check_crc.obj'])
  4045. TargetAdd('check_crc.exe', input=COMMON_PANDA_LIBS)
  4046. TargetAdd('check_crc.exe', opts=OPTS)
  4047. TargetAdd('check_md5_check_md5.obj', opts=OPTS, input='check_md5.cxx')
  4048. TargetAdd('check_md5.exe', input=['check_md5_check_md5.obj'])
  4049. TargetAdd('check_md5.exe', input=COMMON_PANDA_LIBS)
  4050. TargetAdd('check_md5.exe', opts=OPTS)
  4051. TargetAdd('pdecrypt_pdecrypt.obj', opts=OPTS, input='pdecrypt.cxx')
  4052. TargetAdd('pdecrypt.exe', input=['pdecrypt_pdecrypt.obj'])
  4053. TargetAdd('pdecrypt.exe', input=COMMON_PANDA_LIBS)
  4054. TargetAdd('pdecrypt.exe', opts=OPTS)
  4055. TargetAdd('pencrypt_pencrypt.obj', opts=OPTS, input='pencrypt.cxx')
  4056. TargetAdd('pencrypt.exe', input=['pencrypt_pencrypt.obj'])
  4057. TargetAdd('pencrypt.exe', input=COMMON_PANDA_LIBS)
  4058. TargetAdd('pencrypt.exe', opts=OPTS)
  4059. TargetAdd('show_ddb_show_ddb.obj', opts=OPTS, input='show_ddb.cxx')
  4060. TargetAdd('show_ddb.exe', input=['show_ddb_show_ddb.obj'])
  4061. TargetAdd('show_ddb.exe', input=COMMON_PANDA_LIBS)
  4062. TargetAdd('show_ddb.exe', opts=OPTS)
  4063. #
  4064. # DIRECTORY: panda/src/downloadertools/
  4065. #
  4066. if (PkgSkip("ZLIB")==0 and not RTDIST and not RUNTIME and PkgSkip("DEPLOYTOOLS")==0):
  4067. OPTS=['DIR:panda/src/downloadertools', 'ZLIB', 'OPENSSL', 'ADVAPI', 'WINSOCK2', 'WINSHELL', 'WINGDI', 'WINUSER']
  4068. TargetAdd('multify_multify.obj', opts=OPTS, input='multify.cxx')
  4069. TargetAdd('multify.exe', input=['multify_multify.obj'])
  4070. TargetAdd('multify.exe', input=COMMON_PANDA_LIBS)
  4071. TargetAdd('multify.exe', opts=OPTS)
  4072. TargetAdd('pzip_pzip.obj', opts=OPTS, input='pzip.cxx')
  4073. TargetAdd('pzip.exe', input=['pzip_pzip.obj'])
  4074. TargetAdd('pzip.exe', input=COMMON_PANDA_LIBS)
  4075. TargetAdd('pzip.exe', opts=OPTS)
  4076. TargetAdd('punzip_punzip.obj', opts=OPTS, input='punzip.cxx')
  4077. TargetAdd('punzip.exe', input=['punzip_punzip.obj'])
  4078. TargetAdd('punzip.exe', input=COMMON_PANDA_LIBS)
  4079. TargetAdd('punzip.exe', opts=OPTS)
  4080. #
  4081. # DIRECTORY: panda/src/windisplay/
  4082. #
  4083. if (GetTarget() == 'windows' and not RUNTIME):
  4084. OPTS=['DIR:panda/src/windisplay', 'BUILDING:PANDAWIN']
  4085. TargetAdd('p3windisplay_composite1.obj', opts=OPTS+["BIGOBJ"], input='p3windisplay_composite1.cxx')
  4086. TargetAdd('p3windisplay_windetectdx9.obj', opts=OPTS + ["DX9"], input='winDetectDx9.cxx')
  4087. TargetAdd('libp3windisplay.dll', input='p3windisplay_composite1.obj')
  4088. TargetAdd('libp3windisplay.dll', input='p3windisplay_windetectdx9.obj')
  4089. TargetAdd('libp3windisplay.dll', input=COMMON_PANDA_LIBS)
  4090. TargetAdd('libp3windisplay.dll', opts=['WINIMM', 'WINGDI', 'WINKERNEL', 'WINOLDNAMES', 'WINUSER', 'WINMM',"BIGOBJ"])
  4091. #
  4092. # DIRECTORY: panda/metalibs/pandadx9/
  4093. #
  4094. if GetTarget() == 'windows' and PkgSkip("DX9")==0 and not RUNTIME:
  4095. OPTS=['DIR:panda/src/dxgsg9', 'BUILDING:PANDADX', 'DX9', 'NVIDIACG', 'CGDX9']
  4096. TargetAdd('p3dxgsg9_dxGraphicsStateGuardian9.obj', opts=OPTS, input='dxGraphicsStateGuardian9.cxx')
  4097. TargetAdd('p3dxgsg9_composite1.obj', opts=OPTS, input='p3dxgsg9_composite1.cxx')
  4098. OPTS=['DIR:panda/metalibs/pandadx9', 'BUILDING:PANDADX', 'DX9', 'NVIDIACG', 'CGDX9']
  4099. TargetAdd('pandadx9_pandadx9.obj', opts=OPTS, input='pandadx9.cxx')
  4100. TargetAdd('libpandadx9.dll', input='pandadx9_pandadx9.obj')
  4101. TargetAdd('libpandadx9.dll', input='p3dxgsg9_dxGraphicsStateGuardian9.obj')
  4102. TargetAdd('libpandadx9.dll', input='p3dxgsg9_composite1.obj')
  4103. TargetAdd('libpandadx9.dll', input='libp3windisplay.dll')
  4104. TargetAdd('libpandadx9.dll', input=COMMON_PANDA_LIBS)
  4105. TargetAdd('libpandadx9.dll', opts=['MODULE', 'ADVAPI', 'WINGDI', 'WINKERNEL', 'WINUSER', 'WINMM', 'DX9', 'NVIDIACG', 'CGDX9'])
  4106. #
  4107. # DIRECTORY: panda/src/egg/
  4108. #
  4109. if not RUNTIME and not PkgSkip("EGG"):
  4110. OPTS=['DIR:panda/src/egg', 'BUILDING:PANDAEGG', 'ZLIB', 'BISONPREFIX_eggyy', 'FLEXDASHI']
  4111. CreateFile(GetOutputDir()+"/include/parser.h")
  4112. TargetAdd('p3egg_parser.obj', opts=OPTS, input='parser.yxx')
  4113. TargetAdd('parser.h', input='p3egg_parser.obj', opts=['DEPENDENCYONLY'])
  4114. TargetAdd('p3egg_lexer.obj', opts=OPTS, input='lexer.lxx')
  4115. TargetAdd('p3egg_composite1.obj', opts=OPTS, input='p3egg_composite1.cxx')
  4116. TargetAdd('p3egg_composite2.obj', opts=OPTS, input='p3egg_composite2.cxx')
  4117. OPTS=['DIR:panda/src/egg', 'ZLIB', 'PYTHON']
  4118. IGATEFILES=GetDirectoryContents('panda/src/egg', ["*.h", "*_composite*.cxx"])
  4119. if "parser.h" in IGATEFILES: IGATEFILES.remove("parser.h")
  4120. TargetAdd('libp3egg.in', opts=OPTS, input=IGATEFILES)
  4121. TargetAdd('libp3egg.in', opts=['IMOD:panda3d.egg', 'ILIB:libp3egg', 'SRCDIR:panda/src/egg'])
  4122. TargetAdd('libp3egg_igate.obj', input='libp3egg.in', opts=["DEPENDENCYONLY"])
  4123. TargetAdd('p3egg_eggGroupNode_ext.obj', opts=OPTS, input='eggGroupNode_ext.cxx')
  4124. #
  4125. # DIRECTORY: panda/src/egg2pg/
  4126. #
  4127. if not RUNTIME and not PkgSkip("EGG"):
  4128. OPTS=['DIR:panda/src/egg2pg', 'BUILDING:PANDAEGG']
  4129. TargetAdd('p3egg2pg_composite1.obj', opts=OPTS, input='p3egg2pg_composite1.cxx')
  4130. TargetAdd('p3egg2pg_composite2.obj', opts=OPTS, input='p3egg2pg_composite2.cxx')
  4131. OPTS=['DIR:panda/src/egg2pg', 'PYTHON']
  4132. IGATEFILES=['load_egg_file.h']
  4133. TargetAdd('libp3egg2pg.in', opts=OPTS, input=IGATEFILES)
  4134. TargetAdd('libp3egg2pg.in', opts=['IMOD:panda3d.egg', 'ILIB:libp3egg2pg', 'SRCDIR:panda/src/egg2pg'])
  4135. TargetAdd('libp3egg2pg_igate.obj', input='libp3egg2pg.in', opts=["DEPENDENCYONLY"])
  4136. #
  4137. # DIRECTORY: panda/src/framework/
  4138. #
  4139. if (not RUNTIME):
  4140. deps = []
  4141. # Framework wants to link in a renderer when building statically, so tell it what is available.
  4142. if GetLinkAllStatic():
  4143. deps = ['dtool_have_gl.dat', 'dtool_have_tinydisplay.dat', 'dtool_have_egg.dat']
  4144. if not PkgSkip("GL"):
  4145. DefSymbol("FRAMEWORK", "HAVE_GL")
  4146. if not PkgSkip("TINYDISPLAY"):
  4147. DefSymbol("FRAMEWORK", "HAVE_TINYDISPLAY")
  4148. if not PkgSkip("EGG"):
  4149. DefSymbol("FRAMEWORK", "HAVE_EGG")
  4150. OPTS=['DIR:panda/src/framework', 'BUILDING:FRAMEWORK', 'FRAMEWORK']
  4151. TargetAdd('p3framework_composite1.obj', opts=OPTS, input='p3framework_composite1.cxx', dep=deps)
  4152. TargetAdd('libp3framework.dll', input='p3framework_composite1.obj')
  4153. TargetAdd('libp3framework.dll', input=COMMON_PANDA_LIBS)
  4154. TargetAdd('libp3framework.dll', opts=['ADVAPI'])
  4155. #
  4156. # DIRECTORY: panda/src/glgsg/
  4157. #
  4158. if (not RUNTIME and PkgSkip("GL")==0):
  4159. OPTS=['DIR:panda/src/glgsg', 'DIR:panda/src/glstuff', 'BUILDING:PANDAGL', 'GL', 'NVIDIACG']
  4160. TargetAdd('p3glgsg_config_glgsg.obj', opts=OPTS, input='config_glgsg.cxx')
  4161. TargetAdd('p3glgsg_glgsg.obj', opts=OPTS, input='glgsg.cxx')
  4162. #
  4163. # DIRECTORY: panda/src/glesgsg/
  4164. #
  4165. if (not RUNTIME and PkgSkip("GLES")==0):
  4166. OPTS=['DIR:panda/src/glesgsg', 'DIR:panda/src/glstuff', 'BUILDING:PANDAGLES', 'GLES']
  4167. TargetAdd('p3glesgsg_config_glesgsg.obj', opts=OPTS, input='config_glesgsg.cxx')
  4168. TargetAdd('p3glesgsg_glesgsg.obj', opts=OPTS, input='glesgsg.cxx')
  4169. #
  4170. # DIRECTORY: panda/src/gles2gsg/
  4171. #
  4172. if (not RUNTIME and PkgSkip("GLES2")==0):
  4173. OPTS=['DIR:panda/src/gles2gsg', 'DIR:panda/src/glstuff', 'BUILDING:PANDAGLES2', 'GLES2']
  4174. TargetAdd('p3gles2gsg_config_gles2gsg.obj', opts=OPTS, input='config_gles2gsg.cxx')
  4175. TargetAdd('p3gles2gsg_gles2gsg.obj', opts=OPTS, input='gles2gsg.cxx')
  4176. #
  4177. # DIRECTORY: panda/metalibs/pandaegg/
  4178. #
  4179. if not RUNTIME and not PkgSkip("EGG"):
  4180. OPTS=['DIR:panda/metalibs/pandaegg', 'DIR:panda/src/egg', 'BUILDING:PANDAEGG']
  4181. TargetAdd('pandaegg_pandaegg.obj', opts=OPTS, input='pandaegg.cxx')
  4182. TargetAdd('libpandaegg.dll', input='pandaegg_pandaegg.obj')
  4183. TargetAdd('libpandaegg.dll', input='p3egg2pg_composite1.obj')
  4184. TargetAdd('libpandaegg.dll', input='p3egg2pg_composite2.obj')
  4185. TargetAdd('libpandaegg.dll', input='p3egg_composite1.obj')
  4186. TargetAdd('libpandaegg.dll', input='p3egg_composite2.obj')
  4187. TargetAdd('libpandaegg.dll', input='p3egg_parser.obj')
  4188. TargetAdd('libpandaegg.dll', input='p3egg_lexer.obj')
  4189. TargetAdd('libpandaegg.dll', input=COMMON_PANDA_LIBS)
  4190. TargetAdd('libpandaegg.dll', opts=['ADVAPI'])
  4191. OPTS=['DIR:panda/metalibs/pandaegg', 'DIR:panda/src/egg', 'PYTHON']
  4192. TargetAdd('egg_module.obj', input='libp3egg2pg.in')
  4193. TargetAdd('egg_module.obj', input='libp3egg.in')
  4194. TargetAdd('egg_module.obj', opts=OPTS)
  4195. TargetAdd('egg_module.obj', opts=['IMOD:panda3d.egg', 'ILIB:egg', 'IMPORT:panda3d.core'])
  4196. TargetAdd('egg.pyd', input='egg_module.obj')
  4197. TargetAdd('egg.pyd', input='p3egg_eggGroupNode_ext.obj')
  4198. TargetAdd('egg.pyd', input='libp3egg_igate.obj')
  4199. TargetAdd('egg.pyd', input='libp3egg2pg_igate.obj')
  4200. TargetAdd('egg.pyd', input='libpandaegg.dll')
  4201. TargetAdd('egg.pyd', input='libp3interrogatedb.dll')
  4202. TargetAdd('egg.pyd', input=COMMON_PANDA_LIBS)
  4203. TargetAdd('egg.pyd', opts=['PYTHON'])
  4204. #
  4205. # DIRECTORY: panda/src/x11display/
  4206. #
  4207. if (GetTarget() not in ['windows', 'darwin'] and PkgSkip("X11")==0 and not RUNTIME):
  4208. OPTS=['DIR:panda/src/x11display', 'BUILDING:PANDAX11', 'X11']
  4209. TargetAdd('p3x11display_composite1.obj', opts=OPTS, input='p3x11display_composite1.cxx')
  4210. #
  4211. # DIRECTORY: panda/src/glxdisplay/
  4212. #
  4213. if (GetTarget() not in ['windows', 'darwin'] and PkgSkip("GL")==0 and PkgSkip("X11")==0 and not RUNTIME):
  4214. OPTS=['DIR:panda/src/glxdisplay', 'BUILDING:PANDAGL', 'GL', 'NVIDIACG', 'CGGL']
  4215. TargetAdd('p3glxdisplay_composite1.obj', opts=OPTS, input='p3glxdisplay_composite1.cxx')
  4216. OPTS=['DIR:panda/metalibs/pandagl', 'BUILDING:PANDAGL', 'GL', 'NVIDIACG', 'CGGL']
  4217. TargetAdd('pandagl_pandagl.obj', opts=OPTS, input='pandagl.cxx')
  4218. TargetAdd('libpandagl.dll', input='p3x11display_composite1.obj')
  4219. TargetAdd('libpandagl.dll', input='pandagl_pandagl.obj')
  4220. TargetAdd('libpandagl.dll', input='p3glgsg_config_glgsg.obj')
  4221. TargetAdd('libpandagl.dll', input='p3glgsg_glgsg.obj')
  4222. TargetAdd('libpandagl.dll', input='p3glxdisplay_composite1.obj')
  4223. TargetAdd('libpandagl.dll', input=COMMON_PANDA_LIBS)
  4224. TargetAdd('libpandagl.dll', opts=['MODULE', 'GL', 'NVIDIACG', 'CGGL', 'X11'])
  4225. #
  4226. # DIRECTORY: panda/src/cocoadisplay/
  4227. #
  4228. if (GetTarget() == 'darwin' and PkgSkip("COCOA")==0 and PkgSkip("GL")==0 and not RUNTIME):
  4229. OPTS=['DIR:panda/src/cocoadisplay', 'BUILDING:PANDAGL', 'GL', 'NVIDIACG', 'CGGL']
  4230. TargetAdd('p3cocoadisplay_composite1.obj', opts=OPTS, input='p3cocoadisplay_composite1.mm')
  4231. OPTS=['DIR:panda/metalibs/pandagl', 'BUILDING:PANDAGL', 'GL', 'NVIDIACG', 'CGGL']
  4232. TargetAdd('pandagl_pandagl.obj', opts=OPTS, input='pandagl.cxx')
  4233. TargetAdd('libpandagl.dll', input='pandagl_pandagl.obj')
  4234. TargetAdd('libpandagl.dll', input='p3glgsg_config_glgsg.obj')
  4235. TargetAdd('libpandagl.dll', input='p3glgsg_glgsg.obj')
  4236. TargetAdd('libpandagl.dll', input='p3cocoadisplay_composite1.obj')
  4237. if (PkgSkip('PANDAFX')==0):
  4238. TargetAdd('libpandagl.dll', input='libpandafx.dll')
  4239. TargetAdd('libpandagl.dll', input=COMMON_PANDA_LIBS)
  4240. TargetAdd('libpandagl.dll', opts=['MODULE', 'GL', 'NVIDIACG', 'CGGL', 'COCOA', 'CARBON'])
  4241. #
  4242. # DIRECTORY: panda/src/osxdisplay/
  4243. #
  4244. elif (GetTarget() == 'darwin' and PkgSkip("CARBON")==0 and PkgSkip("GL")==0 and not RUNTIME):
  4245. OPTS=['DIR:panda/src/osxdisplay', 'BUILDING:PANDAGL', 'GL', 'NVIDIACG', 'CGGL']
  4246. TargetAdd('p3osxdisplay_composite1.obj', opts=OPTS, input='p3osxdisplay_composite1.cxx')
  4247. TargetAdd('p3osxdisplay_osxGraphicsWindow.obj', opts=OPTS, input='osxGraphicsWindow.mm')
  4248. OPTS=['DIR:panda/metalibs/pandagl', 'BUILDING:PANDAGL', 'GL', 'NVIDIACG', 'CGGL']
  4249. TargetAdd('pandagl_pandagl.obj', opts=OPTS, input='pandagl.cxx')
  4250. TargetAdd('libpandagl.dll', input='pandagl_pandagl.obj')
  4251. TargetAdd('libpandagl.dll', input='p3glgsg_config_glgsg.obj')
  4252. TargetAdd('libpandagl.dll', input='p3glgsg_glgsg.obj')
  4253. TargetAdd('libpandagl.dll', input='p3osxdisplay_composite1.obj')
  4254. TargetAdd('libpandagl.dll', input='p3osxdisplay_osxGraphicsWindow.obj')
  4255. if (PkgSkip('PANDAFX')==0):
  4256. TargetAdd('libpandagl.dll', input='libpandafx.dll')
  4257. TargetAdd('libpandagl.dll', input=COMMON_PANDA_LIBS)
  4258. TargetAdd('libpandagl.dll', opts=['MODULE', 'GL', 'NVIDIACG', 'CGGL', 'CARBON', 'AGL', 'COCOA'])
  4259. #
  4260. # DIRECTORY: panda/src/wgldisplay/
  4261. #
  4262. if (GetTarget() == 'windows' and PkgSkip("GL")==0 and not RUNTIME):
  4263. OPTS=['DIR:panda/src/wgldisplay', 'DIR:panda/src/glstuff', 'BUILDING:PANDAGL', 'NVIDIACG', 'CGGL']
  4264. TargetAdd('p3wgldisplay_composite1.obj', opts=OPTS, input='p3wgldisplay_composite1.cxx')
  4265. OPTS=['DIR:panda/metalibs/pandagl', 'BUILDING:PANDAGL', 'NVIDIACG', 'CGGL']
  4266. TargetAdd('pandagl_pandagl.obj', opts=OPTS, input='pandagl.cxx')
  4267. TargetAdd('libpandagl.dll', input='pandagl_pandagl.obj')
  4268. TargetAdd('libpandagl.dll', input='p3glgsg_config_glgsg.obj')
  4269. TargetAdd('libpandagl.dll', input='p3glgsg_glgsg.obj')
  4270. TargetAdd('libpandagl.dll', input='p3wgldisplay_composite1.obj')
  4271. TargetAdd('libpandagl.dll', input='libp3windisplay.dll')
  4272. if (PkgSkip('PANDAFX')==0):
  4273. TargetAdd('libpandagl.dll', input='libpandafx.dll')
  4274. TargetAdd('libpandagl.dll', input=COMMON_PANDA_LIBS)
  4275. TargetAdd('libpandagl.dll', opts=['MODULE', 'WINGDI', 'GL', 'WINKERNEL', 'WINOLDNAMES', 'WINUSER', 'WINMM', 'NVIDIACG', 'CGGL'])
  4276. #
  4277. # DIRECTORY: panda/src/egldisplay/
  4278. #
  4279. if (PkgSkip("EGL")==0 and PkgSkip("GLES")==0 and PkgSkip("X11")==0 and not RUNTIME):
  4280. DefSymbol('GLES', 'OPENGLES_1', '')
  4281. OPTS=['DIR:panda/src/egldisplay', 'DIR:panda/src/glstuff', 'BUILDING:PANDAGLES', 'GLES', 'EGL']
  4282. TargetAdd('pandagles_egldisplay_composite1.obj', opts=OPTS, input='p3egldisplay_composite1.cxx')
  4283. OPTS=['DIR:panda/metalibs/pandagles', 'BUILDING:PANDAGLES', 'GLES', 'EGL']
  4284. TargetAdd('pandagles_pandagles.obj', opts=OPTS, input='pandagles.cxx')
  4285. TargetAdd('libpandagles.dll', input='p3x11display_composite1.obj')
  4286. TargetAdd('libpandagles.dll', input='pandagles_pandagles.obj')
  4287. TargetAdd('libpandagles.dll', input='p3glesgsg_config_glesgsg.obj')
  4288. TargetAdd('libpandagles.dll', input='p3glesgsg_glesgsg.obj')
  4289. TargetAdd('libpandagles.dll', input='pandagles_egldisplay_composite1.obj')
  4290. TargetAdd('libpandagles.dll', input=COMMON_PANDA_LIBS)
  4291. TargetAdd('libpandagles.dll', opts=['MODULE', 'GLES', 'EGL', 'X11'])
  4292. #
  4293. # DIRECTORY: panda/src/egldisplay/
  4294. #
  4295. if (PkgSkip("EGL")==0 and PkgSkip("GLES2")==0 and PkgSkip("X11")==0 and not RUNTIME):
  4296. DefSymbol('GLES2', 'OPENGLES_2', '')
  4297. OPTS=['DIR:panda/src/egldisplay', 'DIR:panda/src/glstuff', 'BUILDING:PANDAGLES2', 'GLES2', 'EGL']
  4298. TargetAdd('pandagles2_egldisplay_composite1.obj', opts=OPTS, input='p3egldisplay_composite1.cxx')
  4299. OPTS=['DIR:panda/metalibs/pandagles2', 'BUILDING:PANDAGLES2', 'GLES2', 'EGL']
  4300. TargetAdd('pandagles2_pandagles2.obj', opts=OPTS, input='pandagles2.cxx')
  4301. TargetAdd('libpandagles2.dll', input='p3x11display_composite1.obj')
  4302. TargetAdd('libpandagles2.dll', input='pandagles2_pandagles2.obj')
  4303. TargetAdd('libpandagles2.dll', input='p3gles2gsg_config_gles2gsg.obj')
  4304. TargetAdd('libpandagles2.dll', input='p3gles2gsg_gles2gsg.obj')
  4305. TargetAdd('libpandagles2.dll', input='pandagles2_egldisplay_composite1.obj')
  4306. TargetAdd('libpandagles2.dll', input=COMMON_PANDA_LIBS)
  4307. TargetAdd('libpandagles2.dll', opts=['MODULE', 'GLES2', 'EGL', 'X11'])
  4308. #
  4309. # DIRECTORY: panda/src/ode/
  4310. #
  4311. if (PkgSkip("ODE")==0 and not RUNTIME):
  4312. OPTS=['DIR:panda/src/ode', 'BUILDING:PANDAODE', 'ODE', 'PYTHON']
  4313. TargetAdd('p3ode_composite1.obj', opts=OPTS, input='p3ode_composite1.cxx')
  4314. TargetAdd('p3ode_composite2.obj', opts=OPTS, input='p3ode_composite2.cxx')
  4315. TargetAdd('p3ode_composite3.obj', opts=OPTS, input='p3ode_composite3.cxx')
  4316. OPTS=['DIR:panda/src/ode', 'ODE', 'PYTHON']
  4317. IGATEFILES=GetDirectoryContents('panda/src/ode', ["*.h", "*_composite*.cxx"])
  4318. IGATEFILES.remove("odeConvexGeom.h")
  4319. IGATEFILES.remove("odeHeightFieldGeom.h")
  4320. IGATEFILES.remove("odeHelperStructs.h")
  4321. TargetAdd('libpandaode.in', opts=OPTS, input=IGATEFILES)
  4322. TargetAdd('libpandaode.in', opts=['IMOD:panda3d.ode', 'ILIB:libpandaode', 'SRCDIR:panda/src/ode'])
  4323. TargetAdd('libpandaode_igate.obj', input='libpandaode.in', opts=["DEPENDENCYONLY"])
  4324. TargetAdd('p3ode_ext_composite.obj', opts=OPTS, input='p3ode_ext_composite.cxx')
  4325. #
  4326. # DIRECTORY: panda/metalibs/pandaode/
  4327. #
  4328. if (PkgSkip("ODE")==0 and not RUNTIME):
  4329. OPTS=['DIR:panda/metalibs/pandaode', 'BUILDING:PANDAODE', 'ODE']
  4330. TargetAdd('pandaode_pandaode.obj', opts=OPTS, input='pandaode.cxx')
  4331. TargetAdd('libpandaode.dll', input='pandaode_pandaode.obj')
  4332. TargetAdd('libpandaode.dll', input='p3ode_composite1.obj')
  4333. TargetAdd('libpandaode.dll', input='p3ode_composite2.obj')
  4334. TargetAdd('libpandaode.dll', input='p3ode_composite3.obj')
  4335. TargetAdd('libpandaode.dll', input=COMMON_PANDA_LIBS)
  4336. TargetAdd('libpandaode.dll', opts=['WINUSER', 'ODE'])
  4337. OPTS=['DIR:panda/metalibs/pandaode', 'ODE', 'PYTHON']
  4338. TargetAdd('ode_module.obj', input='libpandaode.in')
  4339. TargetAdd('ode_module.obj', opts=OPTS)
  4340. TargetAdd('ode_module.obj', opts=['IMOD:panda3d.ode', 'ILIB:ode', 'IMPORT:panda3d.core'])
  4341. TargetAdd('ode.pyd', input='ode_module.obj')
  4342. TargetAdd('ode.pyd', input='libpandaode_igate.obj')
  4343. TargetAdd('ode.pyd', input='p3ode_ext_composite.obj')
  4344. TargetAdd('ode.pyd', input='libpandaode.dll')
  4345. TargetAdd('ode.pyd', input='libp3interrogatedb.dll')
  4346. TargetAdd('ode.pyd', input=COMMON_PANDA_LIBS)
  4347. TargetAdd('ode.pyd', opts=['PYTHON', 'WINUSER', 'ODE'])
  4348. #
  4349. # DIRECTORY: panda/src/bullet/
  4350. #
  4351. if (PkgSkip("BULLET")==0 and not RUNTIME):
  4352. OPTS=['DIR:panda/src/bullet', 'BUILDING:PANDABULLET', 'BULLET']
  4353. TargetAdd('p3bullet_composite.obj', opts=OPTS, input='p3bullet_composite.cxx')
  4354. OPTS=['DIR:panda/src/bullet', 'BULLET', 'PYTHON']
  4355. IGATEFILES=GetDirectoryContents('panda/src/bullet', ["*.h", "*_composite*.cxx"])
  4356. TargetAdd('libpandabullet.in', opts=OPTS, input=IGATEFILES)
  4357. TargetAdd('libpandabullet.in', opts=['IMOD:panda3d.bullet', 'ILIB:libpandabullet', 'SRCDIR:panda/src/bullet'])
  4358. TargetAdd('libpandabullet_igate.obj', input='libpandabullet.in', opts=["DEPENDENCYONLY"])
  4359. #
  4360. # DIRECTORY: panda/metalibs/pandabullet/
  4361. #
  4362. if (PkgSkip("BULLET")==0 and not RUNTIME):
  4363. OPTS=['DIR:panda/metalibs/pandabullet', 'BUILDING:PANDABULLET', 'BULLET']
  4364. TargetAdd('pandabullet_pandabullet.obj', opts=OPTS, input='pandabullet.cxx')
  4365. TargetAdd('libpandabullet.dll', input='pandabullet_pandabullet.obj')
  4366. TargetAdd('libpandabullet.dll', input='p3bullet_composite.obj')
  4367. TargetAdd('libpandabullet.dll', input=COMMON_PANDA_LIBS)
  4368. TargetAdd('libpandabullet.dll', opts=['WINUSER', 'BULLET'])
  4369. OPTS=['DIR:panda/metalibs/pandabullet', 'BULLET', 'PYTHON']
  4370. TargetAdd('bullet_module.obj', input='libpandabullet.in')
  4371. TargetAdd('bullet_module.obj', opts=OPTS)
  4372. TargetAdd('bullet_module.obj', opts=['IMOD:panda3d.bullet', 'ILIB:bullet', 'IMPORT:panda3d.core'])
  4373. TargetAdd('bullet.pyd', input='bullet_module.obj')
  4374. TargetAdd('bullet.pyd', input='libpandabullet_igate.obj')
  4375. TargetAdd('bullet.pyd', input='libpandabullet.dll')
  4376. TargetAdd('bullet.pyd', input='libp3interrogatedb.dll')
  4377. TargetAdd('bullet.pyd', input=COMMON_PANDA_LIBS)
  4378. TargetAdd('bullet.pyd', opts=['PYTHON', 'WINUSER', 'BULLET'])
  4379. #
  4380. # DIRECTORY: panda/src/physx/
  4381. #
  4382. if (PkgSkip("PHYSX")==0):
  4383. OPTS=['DIR:panda/src/physx', 'BUILDING:PANDAPHYSX', 'PHYSX', 'NOARCH:PPC', 'PYTHON']
  4384. TargetAdd('p3physx_composite.obj', opts=OPTS, input='p3physx_composite.cxx')
  4385. OPTS=['DIR:panda/src/physx', 'PHYSX', 'NOARCH:PPC', 'PYTHON']
  4386. IGATEFILES=GetDirectoryContents('panda/src/physx', ["*.h", "*_composite*.cxx"])
  4387. TargetAdd('libpandaphysx.in', opts=OPTS, input=IGATEFILES)
  4388. TargetAdd('libpandaphysx.in', opts=['IMOD:panda3d.physx', 'ILIB:libpandaphysx', 'SRCDIR:panda/src/physx'])
  4389. TargetAdd('libpandaphysx_igate.obj', input='libpandaphysx.in', opts=["DEPENDENCYONLY"])
  4390. #
  4391. # DIRECTORY: panda/metalibs/pandaphysx/
  4392. #
  4393. if (PkgSkip("PHYSX")==0):
  4394. OPTS=['DIR:panda/metalibs/pandaphysx', 'BUILDING:PANDAPHYSX', 'PHYSX', 'NOARCH:PPC']
  4395. TargetAdd('pandaphysx_pandaphysx.obj', opts=OPTS, input='pandaphysx.cxx')
  4396. TargetAdd('libpandaphysx.dll', input='pandaphysx_pandaphysx.obj')
  4397. TargetAdd('libpandaphysx.dll', input='p3physx_composite.obj')
  4398. TargetAdd('libpandaphysx.dll', input=COMMON_PANDA_LIBS)
  4399. TargetAdd('libpandaphysx.dll', opts=['WINUSER', 'PHYSX', 'NOARCH:PPC', 'PYTHON'])
  4400. OPTS=['DIR:panda/metalibs/pandaphysx', 'PHYSX', 'NOARCH:PPC', 'PYTHON']
  4401. TargetAdd('physx_module.obj', input='libpandaphysx.in')
  4402. TargetAdd('physx_module.obj', opts=OPTS)
  4403. TargetAdd('physx_module.obj', opts=['IMOD:panda3d.physx', 'ILIB:physx', 'IMPORT:panda3d.core'])
  4404. TargetAdd('physx.pyd', input='physx_module.obj')
  4405. TargetAdd('physx.pyd', input='libpandaphysx_igate.obj')
  4406. TargetAdd('physx.pyd', input='libpandaphysx.dll')
  4407. TargetAdd('physx.pyd', input='libp3interrogatedb.dll')
  4408. TargetAdd('physx.pyd', input=COMMON_PANDA_LIBS)
  4409. TargetAdd('physx.pyd', opts=['PYTHON', 'WINUSER', 'PHYSX', 'NOARCH:PPC'])
  4410. #
  4411. # DIRECTORY: panda/src/physics/
  4412. #
  4413. if (PkgSkip("PANDAPHYSICS")==0) and (not RUNTIME):
  4414. OPTS=['DIR:panda/src/physics', 'BUILDING:PANDAPHYSICS']
  4415. TargetAdd('p3physics_composite1.obj', opts=OPTS, input='p3physics_composite1.cxx')
  4416. TargetAdd('p3physics_composite2.obj', opts=OPTS, input='p3physics_composite2.cxx')
  4417. OPTS=['DIR:panda/src/physics', 'PYTHON']
  4418. IGATEFILES=GetDirectoryContents('panda/src/physics', ["*.h", "*_composite*.cxx"])
  4419. IGATEFILES.remove("forces.h")
  4420. TargetAdd('libp3physics.in', opts=OPTS, input=IGATEFILES)
  4421. TargetAdd('libp3physics.in', opts=['IMOD:panda3d.physics', 'ILIB:libp3physics', 'SRCDIR:panda/src/physics'])
  4422. TargetAdd('libp3physics_igate.obj', input='libp3physics.in', opts=["DEPENDENCYONLY"])
  4423. #
  4424. # DIRECTORY: panda/src/particlesystem/
  4425. #
  4426. if (PkgSkip("PANDAPHYSICS")==0) and (PkgSkip("PANDAPARTICLESYSTEM")==0) and (not RUNTIME):
  4427. OPTS=['DIR:panda/src/particlesystem', 'BUILDING:PANDAPHYSICS']
  4428. TargetAdd('p3particlesystem_composite1.obj', opts=OPTS, input='p3particlesystem_composite1.cxx')
  4429. TargetAdd('p3particlesystem_composite2.obj', opts=OPTS, input='p3particlesystem_composite2.cxx')
  4430. OPTS=['DIR:panda/src/particlesystem', 'PYTHON']
  4431. IGATEFILES=GetDirectoryContents('panda/src/particlesystem', ["*.h", "*_composite*.cxx"])
  4432. IGATEFILES.remove('orientedParticle.h')
  4433. IGATEFILES.remove('orientedParticleFactory.h')
  4434. IGATEFILES.remove('particlefactories.h')
  4435. IGATEFILES.remove('emitters.h')
  4436. IGATEFILES.remove('particles.h')
  4437. TargetAdd('libp3particlesystem.in', opts=OPTS, input=IGATEFILES)
  4438. TargetAdd('libp3particlesystem.in', opts=['IMOD:panda3d.physics', 'ILIB:libp3particlesystem', 'SRCDIR:panda/src/particlesystem'])
  4439. TargetAdd('libp3particlesystem_igate.obj', input='libp3particlesystem.in', opts=["DEPENDENCYONLY"])
  4440. #
  4441. # DIRECTORY: panda/metalibs/pandaphysics/
  4442. #
  4443. if (PkgSkip("PANDAPHYSICS")==0) and (not RUNTIME):
  4444. OPTS=['DIR:panda/metalibs/pandaphysics', 'BUILDING:PANDAPHYSICS']
  4445. TargetAdd('pandaphysics_pandaphysics.obj', opts=OPTS, input='pandaphysics.cxx')
  4446. TargetAdd('libpandaphysics.dll', input='pandaphysics_pandaphysics.obj')
  4447. TargetAdd('libpandaphysics.dll', input='p3physics_composite1.obj')
  4448. TargetAdd('libpandaphysics.dll', input='p3physics_composite2.obj')
  4449. TargetAdd('libpandaphysics.dll', input='p3particlesystem_composite1.obj')
  4450. TargetAdd('libpandaphysics.dll', input='p3particlesystem_composite2.obj')
  4451. TargetAdd('libpandaphysics.dll', input=COMMON_PANDA_LIBS)
  4452. TargetAdd('libpandaphysics.dll', opts=['ADVAPI'])
  4453. OPTS=['DIR:panda/metalibs/pandaphysics', 'PYTHON']
  4454. TargetAdd('physics_module.obj', input='libp3physics.in')
  4455. if (PkgSkip("PANDAPARTICLESYSTEM")==0):
  4456. TargetAdd('physics_module.obj', input='libp3particlesystem.in')
  4457. TargetAdd('physics_module.obj', opts=OPTS)
  4458. TargetAdd('physics_module.obj', opts=['IMOD:panda3d.physics', 'ILIB:physics', 'IMPORT:panda3d.core'])
  4459. TargetAdd('physics.pyd', input='physics_module.obj')
  4460. TargetAdd('physics.pyd', input='libp3physics_igate.obj')
  4461. if (PkgSkip("PANDAPARTICLESYSTEM")==0):
  4462. TargetAdd('physics.pyd', input='libp3particlesystem_igate.obj')
  4463. TargetAdd('physics.pyd', input='libpandaphysics.dll')
  4464. TargetAdd('physics.pyd', input='libp3interrogatedb.dll')
  4465. TargetAdd('physics.pyd', input=COMMON_PANDA_LIBS)
  4466. TargetAdd('physics.pyd', opts=['PYTHON'])
  4467. #
  4468. # DIRECTORY: panda/src/speedtree/
  4469. #
  4470. if (PkgSkip("SPEEDTREE")==0):
  4471. OPTS=['DIR:panda/src/speedtree', 'BUILDING:PANDASPEEDTREE', 'SPEEDTREE', 'PYTHON']
  4472. TargetAdd('pandaspeedtree_composite1.obj', opts=OPTS, input='pandaspeedtree_composite1.cxx')
  4473. IGATEFILES=GetDirectoryContents('panda/src/speedtree', ["*.h", "*_composite*.cxx"])
  4474. TargetAdd('libpandaspeedtree.in', opts=OPTS, input=IGATEFILES)
  4475. TargetAdd('libpandaspeedtree.in', opts=['IMOD:libpandaspeedtree', 'ILIB:libpandaspeedtree', 'SRCDIR:panda/src/speedtree'])
  4476. TargetAdd('libpandaspeedtree_igate.obj', input='libpandaspeedtree.in', opts=["DEPENDENCYONLY"])
  4477. TargetAdd('libpandaspeedtree_module.obj', input='libpandaspeedtree.in')
  4478. TargetAdd('libpandaspeedtree_module.obj', opts=OPTS)
  4479. TargetAdd('libpandaspeedtree_module.obj', opts=['IMOD:libpandaspeedtree', 'ILIB:libpandaspeedtree'])
  4480. TargetAdd('libpandaspeedtree.dll', input='pandaspeedtree_composite1.obj')
  4481. TargetAdd('libpandaspeedtree.dll', input='libpandaspeedtree_igate.obj')
  4482. TargetAdd('libpandaspeedtree.dll', input='libpandaspeedtree_module.obj')
  4483. TargetAdd('libpandaspeedtree.dll', input=COMMON_PANDA_LIBS)
  4484. TargetAdd('libpandaspeedtree.dll', opts=['SPEEDTREE'])
  4485. if SDK["SPEEDTREEAPI"] == 'OpenGL':
  4486. TargetAdd('libpandaspeedtree.dll', opts=['GL', 'NVIDIACG', 'CGGL'])
  4487. elif SDK["SPEEDTREEAPI"] == 'DirectX9':
  4488. TargetAdd('libpandaspeedtree.dll', opts=['DX9', 'NVIDIACG', 'CGDX9'])
  4489. #
  4490. # DIRECTORY: panda/src/testbed/
  4491. #
  4492. if (not RTDIST and not RUNTIME and PkgSkip("PVIEW")==0):
  4493. OPTS=['DIR:panda/src/testbed']
  4494. TargetAdd('pview_pview.obj', opts=OPTS, input='pview.cxx')
  4495. TargetAdd('pview.exe', input='pview_pview.obj')
  4496. TargetAdd('pview.exe', input='libp3framework.dll')
  4497. if not PkgSkip("EGG"):
  4498. TargetAdd('pview.exe', input='libpandaegg.dll')
  4499. TargetAdd('pview.exe', input=COMMON_PANDA_LIBS)
  4500. TargetAdd('pview.exe', opts=['ADVAPI', 'WINSOCK2', 'WINSHELL'])
  4501. #
  4502. # DIRECTORY: panda/src/android/
  4503. #
  4504. if (not RUNTIME and GetTarget() == 'android'):
  4505. OPTS=['DIR:panda/src/android']
  4506. TargetAdd('org/panda3d/android/NativeIStream.class', opts=OPTS, input='NativeIStream.java')
  4507. TargetAdd('org/panda3d/android/NativeOStream.class', opts=OPTS, input='NativeOStream.java')
  4508. TargetAdd('org/panda3d/android/PandaActivity.class', opts=OPTS, input='PandaActivity.java')
  4509. TargetAdd('org/panda3d/android/PythonActivity.class', opts=OPTS, input='PythonActivity.java')
  4510. TargetAdd('p3android_composite1.obj', opts=OPTS, input='p3android_composite1.cxx')
  4511. TargetAdd('libp3android.dll', input='p3android_composite1.obj')
  4512. TargetAdd('libp3android.dll', input=COMMON_PANDA_LIBS)
  4513. TargetAdd('libp3android.dll', opts=['JNIGRAPHICS'])
  4514. TargetAdd('android_native_app_glue.obj', opts=OPTS + ['NOHIDDEN'], input='android_native_app_glue.c')
  4515. TargetAdd('android_main.obj', opts=OPTS, input='android_main.cxx')
  4516. if (not RTDIST and PkgSkip("PVIEW")==0):
  4517. TargetAdd('libpview_pview.obj', opts=OPTS, input='pview.cxx')
  4518. TargetAdd('libpview.dll', input='android_native_app_glue.obj')
  4519. TargetAdd('libpview.dll', input='android_main.obj')
  4520. TargetAdd('libpview.dll', input='libpview_pview.obj')
  4521. TargetAdd('libpview.dll', input='libp3framework.dll')
  4522. if not PkgSkip("EGG"):
  4523. TargetAdd('libpview.dll', input='libpandaegg.dll')
  4524. TargetAdd('libpview.dll', input='libp3android.dll')
  4525. TargetAdd('libpview.dll', input=COMMON_PANDA_LIBS)
  4526. TargetAdd('libpview.dll', opts=['MODULE', 'ANDROID'])
  4527. if (not RTDIST and PkgSkip("PYTHON")==0):
  4528. OPTS += ['PYTHON']
  4529. TargetAdd('ppython_ppython.obj', opts=OPTS, input='python_main.cxx')
  4530. TargetAdd('libppython.dll', input='android_native_app_glue.obj')
  4531. TargetAdd('libppython.dll', input='android_main.obj')
  4532. TargetAdd('libppython.dll', input='ppython_ppython.obj')
  4533. TargetAdd('libppython.dll', input='libp3framework.dll')
  4534. TargetAdd('libppython.dll', input='libp3android.dll')
  4535. TargetAdd('libppython.dll', input=COMMON_PANDA_LIBS)
  4536. TargetAdd('libppython.dll', opts=['MODULE', 'ANDROID', 'PYTHON'])
  4537. #
  4538. # DIRECTORY: panda/src/androiddisplay/
  4539. #
  4540. if (GetTarget() == 'android' and PkgSkip("EGL")==0 and PkgSkip("GLES")==0 and not RUNTIME):
  4541. DefSymbol('GLES', 'OPENGLES_1', '')
  4542. OPTS=['DIR:panda/src/androiddisplay', 'DIR:panda/src/glstuff', 'BUILDING:PANDAGLES', 'GLES', 'EGL']
  4543. TargetAdd('pandagles_androiddisplay_composite1.obj', opts=OPTS, input='p3androiddisplay_composite1.cxx')
  4544. OPTS=['DIR:panda/metalibs/pandagles', 'BUILDING:PANDAGLES', 'GLES', 'EGL']
  4545. TargetAdd('pandagles_pandagles.obj', opts=OPTS, input='pandagles.cxx')
  4546. TargetAdd('libpandagles.dll', input='pandagles_pandagles.obj')
  4547. TargetAdd('libpandagles.dll', input='p3glesgsg_config_glesgsg.obj')
  4548. TargetAdd('libpandagles.dll', input='p3glesgsg_glesgsg.obj')
  4549. TargetAdd('libpandagles.dll', input='pandagles_androiddisplay_composite1.obj')
  4550. TargetAdd('libpandagles.dll', input='libp3android.dll')
  4551. TargetAdd('libpandagles.dll', input=COMMON_PANDA_LIBS)
  4552. TargetAdd('libpandagles.dll', opts=['MODULE', 'GLES', 'EGL'])
  4553. #
  4554. # DIRECTORY: panda/src/tinydisplay/
  4555. #
  4556. if (not RUNTIME and (GetTarget() in ('windows', 'darwin') or PkgSkip("X11")==0) and PkgSkip("TINYDISPLAY")==0):
  4557. OPTS=['DIR:panda/src/tinydisplay', 'BUILDING:TINYDISPLAY']
  4558. TargetAdd('p3tinydisplay_composite1.obj', opts=OPTS, input='p3tinydisplay_composite1.cxx')
  4559. TargetAdd('p3tinydisplay_composite2.obj', opts=OPTS, input='p3tinydisplay_composite2.cxx')
  4560. TargetAdd('p3tinydisplay_ztriangle_1.obj', opts=OPTS, input='ztriangle_1.cxx')
  4561. TargetAdd('p3tinydisplay_ztriangle_2.obj', opts=OPTS, input='ztriangle_2.cxx')
  4562. TargetAdd('p3tinydisplay_ztriangle_3.obj', opts=OPTS, input='ztriangle_3.cxx')
  4563. TargetAdd('p3tinydisplay_ztriangle_4.obj', opts=OPTS, input='ztriangle_4.cxx')
  4564. TargetAdd('p3tinydisplay_ztriangle_table.obj', opts=OPTS, input='ztriangle_table.cxx')
  4565. if GetTarget() == 'darwin':
  4566. TargetAdd('p3tinydisplay_tinyOsxGraphicsWindow.obj', opts=OPTS, input='tinyOsxGraphicsWindow.mm')
  4567. TargetAdd('libp3tinydisplay.dll', input='p3tinydisplay_tinyOsxGraphicsWindow.obj')
  4568. TargetAdd('libp3tinydisplay.dll', opts=['CARBON', 'AGL', 'COCOA'])
  4569. elif GetTarget() == 'windows':
  4570. TargetAdd('libp3tinydisplay.dll', input='libp3windisplay.dll')
  4571. TargetAdd('libp3tinydisplay.dll', opts=['WINIMM', 'WINGDI', 'WINKERNEL', 'WINOLDNAMES', 'WINUSER', 'WINMM'])
  4572. else:
  4573. TargetAdd('libp3tinydisplay.dll', input='p3x11display_composite1.obj')
  4574. TargetAdd('libp3tinydisplay.dll', opts=['X11'])
  4575. TargetAdd('libp3tinydisplay.dll', input='p3tinydisplay_composite1.obj')
  4576. TargetAdd('libp3tinydisplay.dll', input='p3tinydisplay_composite2.obj')
  4577. TargetAdd('libp3tinydisplay.dll', input='p3tinydisplay_ztriangle_1.obj')
  4578. TargetAdd('libp3tinydisplay.dll', input='p3tinydisplay_ztriangle_2.obj')
  4579. TargetAdd('libp3tinydisplay.dll', input='p3tinydisplay_ztriangle_3.obj')
  4580. TargetAdd('libp3tinydisplay.dll', input='p3tinydisplay_ztriangle_4.obj')
  4581. TargetAdd('libp3tinydisplay.dll', input='p3tinydisplay_ztriangle_table.obj')
  4582. TargetAdd('libp3tinydisplay.dll', input=COMMON_PANDA_LIBS)
  4583. #
  4584. # DIRECTORY: direct/src/directbase/
  4585. #
  4586. if (PkgSkip("DIRECT")==0):
  4587. OPTS=['DIR:direct/src/directbase', 'PYTHON']
  4588. TargetAdd('p3directbase_directbase.obj', opts=OPTS+['BUILDING:DIRECT'], input='directbase.cxx')
  4589. #
  4590. # DIRECTORY: direct/src/dcparser/
  4591. #
  4592. if (PkgSkip("DIRECT")==0):
  4593. OPTS=['DIR:direct/src/dcparser', 'WITHINPANDA', 'BISONPREFIX_dcyy', 'PYTHON']
  4594. CreateFile(GetOutputDir()+"/include/dcParser.h")
  4595. TargetAdd('p3dcparser_dcParser.obj', opts=OPTS, input='dcParser.yxx')
  4596. TargetAdd('dcParser.h', input='p3dcparser_dcParser.obj', opts=['DEPENDENCYONLY'])
  4597. TargetAdd('p3dcparser_dcLexer.obj', opts=OPTS, input='dcLexer.lxx')
  4598. TargetAdd('p3dcparser_composite1.obj', opts=OPTS, input='p3dcparser_composite1.cxx')
  4599. TargetAdd('p3dcparser_composite2.obj', opts=OPTS, input='p3dcparser_composite2.cxx')
  4600. OPTS=['DIR:direct/src/dcparser', 'WITHINPANDA', 'PYTHON']
  4601. IGATEFILES=GetDirectoryContents('direct/src/dcparser', ["*.h", "*_composite*.cxx"])
  4602. if "dcParser.h" in IGATEFILES: IGATEFILES.remove("dcParser.h")
  4603. if "dcmsgtypes.h" in IGATEFILES: IGATEFILES.remove('dcmsgtypes.h')
  4604. TargetAdd('libp3dcparser.in', opts=OPTS, input=IGATEFILES)
  4605. TargetAdd('libp3dcparser.in', opts=['IMOD:panda3d.direct', 'ILIB:libp3dcparser', 'SRCDIR:direct/src/dcparser'])
  4606. TargetAdd('libp3dcparser_igate.obj', input='libp3dcparser.in', opts=["DEPENDENCYONLY"])
  4607. #
  4608. # DIRECTORY: direct/src/deadrec/
  4609. #
  4610. if (PkgSkip("DIRECT")==0):
  4611. OPTS=['DIR:direct/src/deadrec', 'BUILDING:DIRECT']
  4612. TargetAdd('p3deadrec_composite1.obj', opts=OPTS, input='p3deadrec_composite1.cxx')
  4613. OPTS=['DIR:direct/src/deadrec', 'PYTHON']
  4614. IGATEFILES=GetDirectoryContents('direct/src/deadrec', ["*.h", "*_composite*.cxx"])
  4615. TargetAdd('libp3deadrec.in', opts=OPTS, input=IGATEFILES)
  4616. TargetAdd('libp3deadrec.in', opts=['IMOD:panda3d.direct', 'ILIB:libp3deadrec', 'SRCDIR:direct/src/deadrec'])
  4617. TargetAdd('libp3deadrec_igate.obj', input='libp3deadrec.in', opts=["DEPENDENCYONLY"])
  4618. #
  4619. # DIRECTORY: direct/src/distributed/
  4620. #
  4621. if (PkgSkip("DIRECT")==0):
  4622. OPTS=['DIR:direct/src/distributed', 'DIR:direct/src/dcparser', 'WITHINPANDA', 'BUILDING:DIRECT', 'OPENSSL', 'PYTHON']
  4623. TargetAdd('p3distributed_config_distributed.obj', opts=OPTS, input='config_distributed.cxx')
  4624. TargetAdd('p3distributed_cConnectionRepository.obj', opts=OPTS, input='cConnectionRepository.cxx')
  4625. TargetAdd('p3distributed_cDistributedSmoothNodeBase.obj', opts=OPTS, input='cDistributedSmoothNodeBase.cxx')
  4626. OPTS=['DIR:direct/src/distributed', 'WITHINPANDA', 'OPENSSL', 'PYTHON']
  4627. IGATEFILES=GetDirectoryContents('direct/src/distributed', ["*.h", "*.cxx"])
  4628. TargetAdd('libp3distributed.in', opts=OPTS, input=IGATEFILES)
  4629. TargetAdd('libp3distributed.in', opts=['IMOD:panda3d.direct', 'ILIB:libp3distributed', 'SRCDIR:direct/src/distributed'])
  4630. TargetAdd('libp3distributed_igate.obj', input='libp3distributed.in', opts=["DEPENDENCYONLY"])
  4631. #
  4632. # DIRECTORY: direct/src/interval/
  4633. #
  4634. if (PkgSkip("DIRECT")==0):
  4635. OPTS=['DIR:direct/src/interval', 'BUILDING:DIRECT']
  4636. TargetAdd('p3interval_composite1.obj', opts=OPTS, input='p3interval_composite1.cxx')
  4637. OPTS=['DIR:direct/src/interval', 'PYTHON']
  4638. IGATEFILES=GetDirectoryContents('direct/src/interval', ["*.h", "*_composite*.cxx"])
  4639. TargetAdd('libp3interval.in', opts=OPTS, input=IGATEFILES)
  4640. TargetAdd('libp3interval.in', opts=['IMOD:panda3d.direct', 'ILIB:libp3interval', 'SRCDIR:direct/src/interval'])
  4641. TargetAdd('libp3interval_igate.obj', input='libp3interval.in', opts=["DEPENDENCYONLY"])
  4642. #
  4643. # DIRECTORY: direct/src/showbase/
  4644. #
  4645. if (PkgSkip("DIRECT")==0):
  4646. OPTS=['DIR:direct/src/showbase', 'BUILDING:DIRECT']
  4647. TargetAdd('p3showbase_showBase.obj', opts=OPTS, input='showBase.cxx')
  4648. if GetTarget() == 'darwin':
  4649. TargetAdd('p3showbase_showBase_assist.obj', opts=OPTS, input='showBase_assist.mm')
  4650. OPTS=['DIR:direct/src/showbase', 'PYTHON']
  4651. IGATEFILES=GetDirectoryContents('direct/src/showbase', ["*.h", "showBase.cxx"])
  4652. TargetAdd('libp3showbase.in', opts=OPTS, input=IGATEFILES)
  4653. TargetAdd('libp3showbase.in', opts=['IMOD:panda3d.direct', 'ILIB:libp3showbase', 'SRCDIR:direct/src/showbase'])
  4654. TargetAdd('libp3showbase_igate.obj', input='libp3showbase.in', opts=["DEPENDENCYONLY"])
  4655. #
  4656. # DIRECTORY: direct/src/motiontrail/
  4657. #
  4658. if (PkgSkip("DIRECT")==0):
  4659. OPTS=['DIR:direct/src/motiontrail', 'BUILDING:DIRECT']
  4660. TargetAdd('p3motiontrail_cMotionTrail.obj', opts=OPTS, input='cMotionTrail.cxx')
  4661. TargetAdd('p3motiontrail_config_motiontrail.obj', opts=OPTS, input='config_motiontrail.cxx')
  4662. OPTS=['DIR:direct/src/motiontrail', 'PYTHON']
  4663. IGATEFILES=GetDirectoryContents('direct/src/motiontrail', ["*.h", "cMotionTrail.cxx"])
  4664. TargetAdd('libp3motiontrail.in', opts=OPTS, input=IGATEFILES)
  4665. TargetAdd('libp3motiontrail.in', opts=['IMOD:panda3d.direct', 'ILIB:libp3motiontrail', 'SRCDIR:direct/src/motiontrail'])
  4666. TargetAdd('libp3motiontrail_igate.obj', input='libp3motiontrail.in', opts=["DEPENDENCYONLY"])
  4667. #
  4668. # DIRECTORY: direct/metalibs/direct/
  4669. #
  4670. if (PkgSkip("DIRECT")==0):
  4671. TargetAdd('libp3direct.dll', input='p3directbase_directbase.obj')
  4672. TargetAdd('libp3direct.dll', input='p3showbase_showBase.obj')
  4673. if GetTarget() == 'darwin':
  4674. TargetAdd('libp3direct.dll', input='p3showbase_showBase_assist.obj')
  4675. TargetAdd('libp3direct.dll', input='p3deadrec_composite1.obj')
  4676. TargetAdd('libp3direct.dll', input='p3interval_composite1.obj')
  4677. TargetAdd('libp3direct.dll', input='p3motiontrail_config_motiontrail.obj')
  4678. TargetAdd('libp3direct.dll', input='p3motiontrail_cMotionTrail.obj')
  4679. TargetAdd('libp3direct.dll', input=COMMON_PANDA_LIBS)
  4680. TargetAdd('libp3direct.dll', opts=['ADVAPI', 'OPENSSL', 'WINUSER', 'WINGDI'])
  4681. OPTS=['PYTHON']
  4682. TargetAdd('direct_module.obj', input='libp3dcparser.in')
  4683. TargetAdd('direct_module.obj', input='libp3showbase.in')
  4684. TargetAdd('direct_module.obj', input='libp3deadrec.in')
  4685. TargetAdd('direct_module.obj', input='libp3interval.in')
  4686. TargetAdd('direct_module.obj', input='libp3distributed.in')
  4687. TargetAdd('direct_module.obj', input='libp3motiontrail.in')
  4688. TargetAdd('direct_module.obj', opts=OPTS)
  4689. TargetAdd('direct_module.obj', opts=['IMOD:panda3d.direct', 'ILIB:direct', 'IMPORT:panda3d.core'])
  4690. TargetAdd('direct.pyd', input='libp3dcparser_igate.obj')
  4691. TargetAdd('direct.pyd', input='libp3showbase_igate.obj')
  4692. TargetAdd('direct.pyd', input='libp3deadrec_igate.obj')
  4693. TargetAdd('direct.pyd', input='libp3interval_igate.obj')
  4694. TargetAdd('direct.pyd', input='libp3distributed_igate.obj')
  4695. TargetAdd('direct.pyd', input='libp3motiontrail_igate.obj')
  4696. # These are part of direct.pyd, not libp3direct.dll, because they rely on
  4697. # the Python libraries. If a C++ user needs these modules, we can move them
  4698. # back and filter out the Python-specific code.
  4699. TargetAdd('direct.pyd', input='p3dcparser_composite1.obj')
  4700. TargetAdd('direct.pyd', input='p3dcparser_composite2.obj')
  4701. TargetAdd('direct.pyd', input='p3dcparser_dcParser.obj')
  4702. TargetAdd('direct.pyd', input='p3dcparser_dcLexer.obj')
  4703. TargetAdd('direct.pyd', input='p3distributed_config_distributed.obj')
  4704. TargetAdd('direct.pyd', input='p3distributed_cConnectionRepository.obj')
  4705. TargetAdd('direct.pyd', input='p3distributed_cDistributedSmoothNodeBase.obj')
  4706. TargetAdd('direct.pyd', input='direct_module.obj')
  4707. TargetAdd('direct.pyd', input='libp3direct.dll')
  4708. TargetAdd('direct.pyd', input='libp3interrogatedb.dll')
  4709. TargetAdd('direct.pyd', input=COMMON_PANDA_LIBS)
  4710. TargetAdd('direct.pyd', opts=['PYTHON', 'OPENSSL', 'WINUSER', 'WINGDI', 'WINSOCK2'])
  4711. #
  4712. # DIRECTORY: direct/src/dcparse/
  4713. #
  4714. if (PkgSkip("PYTHON")==0 and PkgSkip("DIRECT")==0 and not RTDIST and not RUNTIME):
  4715. OPTS=['DIR:direct/src/dcparse', 'DIR:direct/src/dcparser', 'WITHINPANDA', 'ADVAPI', 'PYTHON']
  4716. TargetAdd('dcparse_dcparse.obj', opts=OPTS, input='dcparse.cxx')
  4717. TargetAdd('p3dcparse.exe', input='p3dcparser_composite1.obj')
  4718. TargetAdd('p3dcparse.exe', input='p3dcparser_composite2.obj')
  4719. TargetAdd('p3dcparse.exe', input='p3dcparser_dcParser.obj')
  4720. TargetAdd('p3dcparse.exe', input='p3dcparser_dcLexer.obj')
  4721. TargetAdd('p3dcparse.exe', input='dcparse_dcparse.obj')
  4722. TargetAdd('p3dcparse.exe', input='libp3direct.dll')
  4723. TargetAdd('p3dcparse.exe', input=COMMON_PANDA_LIBS)
  4724. TargetAdd('p3dcparse.exe', input='libp3pystub.lib')
  4725. TargetAdd('p3dcparse.exe', opts=['ADVAPI', 'PYTHON'])
  4726. #
  4727. # DIRECTORY: direct/src/plugin/
  4728. #
  4729. if (RTDIST or RUNTIME):
  4730. # Explicitly define this as we don't include dtool_config.h here.
  4731. if GetTarget() not in ('windows', 'darwin'):
  4732. DefSymbol("RUNTIME", "HAVE_X11", "1")
  4733. OPTS=['DIR:direct/src/plugin', 'BUILDING:P3D_PLUGIN', 'RUNTIME', 'OPENSSL']
  4734. TargetAdd('plugin_common.obj', opts=OPTS, input='plugin_common_composite1.cxx')
  4735. OPTS += ['ZLIB', 'MSIMG']
  4736. TargetAdd('plugin_plugin.obj', opts=OPTS, input='p3d_plugin_composite1.cxx')
  4737. TargetAdd('plugin_mkdir_complete.obj', opts=OPTS, input='mkdir_complete.cxx')
  4738. TargetAdd('plugin_wstring_encode.obj', opts=OPTS, input='wstring_encode.cxx')
  4739. TargetAdd('plugin_parse_color.obj', opts=OPTS, input='parse_color.cxx')
  4740. TargetAdd('plugin_get_twirl_data.obj', opts=OPTS, input='get_twirl_data.cxx')
  4741. TargetAdd('plugin_find_root_dir.obj', opts=OPTS, input='find_root_dir.cxx')
  4742. if GetTarget() == 'darwin':
  4743. TargetAdd('plugin_find_root_dir_assist.obj', opts=OPTS, input='find_root_dir_assist.mm')
  4744. TargetAdd('plugin_binaryXml.obj', opts=OPTS, input='binaryXml.cxx')
  4745. TargetAdd('plugin_fileSpec.obj', opts=OPTS, input='fileSpec.cxx')
  4746. TargetAdd('plugin_handleStream.obj', opts=OPTS, input='handleStream.cxx')
  4747. TargetAdd('plugin_handleStreamBuf.obj', opts=OPTS, input='handleStreamBuf.cxx')
  4748. if (RTDIST):
  4749. for fname in ("p3d_plugin.dll", "libp3d_plugin_static.ilb"):
  4750. TargetAdd(fname, input='plugin_plugin.obj')
  4751. TargetAdd(fname, input='plugin_mkdir_complete.obj')
  4752. TargetAdd(fname, input='plugin_wstring_encode.obj')
  4753. TargetAdd(fname, input='plugin_parse_color.obj')
  4754. TargetAdd(fname, input='plugin_find_root_dir.obj')
  4755. if GetTarget() == 'darwin':
  4756. TargetAdd(fname, input='plugin_find_root_dir_assist.obj')
  4757. TargetAdd(fname, input='plugin_fileSpec.obj')
  4758. TargetAdd(fname, input='plugin_binaryXml.obj')
  4759. TargetAdd(fname, input='plugin_handleStream.obj')
  4760. TargetAdd(fname, input='plugin_handleStreamBuf.obj')
  4761. TargetAdd(fname, input='libp3tinyxml.ilb')
  4762. if GetTarget() == 'darwin':
  4763. TargetAdd(fname, input='libp3subprocbuffer.ilb')
  4764. TargetAdd(fname, opts=['OPENSSL', 'ZLIB', 'X11', 'ADVAPI', 'WINUSER', 'WINGDI', 'WINSHELL', 'WINCOMCTL', 'WINOLE', 'MSIMG'])
  4765. TargetAdd("libp3d_plugin_static.ilb", input='plugin_get_twirl_data.obj')
  4766. if (PkgSkip("PYTHON")==0 and RTDIST):
  4767. # Freeze VFSImporter and its dependency modules into p3dpython.
  4768. # Mark panda3d.core as a dependency to make sure to build that first.
  4769. TargetAdd('p3dpython_frozen.obj', input='VFSImporter.py', opts=['DIR:direct/src/showbase', 'FREEZE_STARTUP', 'PYTHON'])
  4770. TargetAdd('p3dpython_frozen.obj', dep='core.pyd')
  4771. OPTS += ['PYTHON']
  4772. TargetAdd('p3dpython_p3dpython_composite1.obj', opts=OPTS, input='p3dpython_composite1.cxx')
  4773. TargetAdd('p3dpython_p3dPythonMain.obj', opts=OPTS, input='p3dPythonMain.cxx')
  4774. TargetAdd('p3dpython.exe', input='p3dpython_p3dpython_composite1.obj')
  4775. TargetAdd('p3dpython.exe', input='p3dpython_p3dPythonMain.obj')
  4776. TargetAdd('p3dpython.exe', input='p3dpython_frozen.obj')
  4777. TargetAdd('p3dpython.exe', input=COMMON_PANDA_LIBS)
  4778. TargetAdd('p3dpython.exe', input='libp3tinyxml.ilb')
  4779. TargetAdd('p3dpython.exe', input='libp3interrogatedb.dll')
  4780. TargetAdd('p3dpython.exe', opts=['PYTHON', 'WINUSER'])
  4781. TargetAdd('libp3dpython.dll', input='p3dpython_p3dpython_composite1.obj')
  4782. TargetAdd('libp3dpython.dll', input='p3dpython_frozen.obj')
  4783. TargetAdd('libp3dpython.dll', input=COMMON_PANDA_LIBS)
  4784. TargetAdd('libp3dpython.dll', input='libp3tinyxml.ilb')
  4785. TargetAdd('libp3dpython.dll', input='libp3interrogatedb.dll')
  4786. TargetAdd('libp3dpython.dll', opts=['PYTHON', 'WINUSER'])
  4787. if GetTarget() == 'windows':
  4788. DefSymbol("NON_CONSOLE", "NON_CONSOLE", "")
  4789. OPTS.append("NON_CONSOLE")
  4790. TargetAdd('p3dpythonw_p3dpython_composite1.obj', opts=OPTS, input='p3dpython_composite1.cxx')
  4791. TargetAdd('p3dpythonw_p3dPythonMain.obj', opts=OPTS, input='p3dPythonMain.cxx')
  4792. TargetAdd('p3dpythonw.exe', input='p3dpythonw_p3dpython_composite1.obj')
  4793. TargetAdd('p3dpythonw.exe', input='p3dpythonw_p3dPythonMain.obj')
  4794. TargetAdd('p3dpythonw.exe', input='p3dpython_frozen.obj')
  4795. TargetAdd('p3dpythonw.exe', input=COMMON_PANDA_LIBS)
  4796. TargetAdd('p3dpythonw.exe', input='libp3tinyxml.ilb')
  4797. TargetAdd('p3dpythonw.exe', input='libp3interrogatedb.dll')
  4798. TargetAdd('p3dpythonw.exe', opts=['SUBSYSTEM:WINDOWS', 'PYTHON', 'WINUSER'])
  4799. if (PkgSkip("OPENSSL")==0 and RTDIST and False):
  4800. OPTS=['DIR:direct/src/plugin', 'DIR:panda/src/express', 'OPENSSL']
  4801. if GetTarget() == 'darwin':
  4802. OPTS += ['OPT:2']
  4803. if (PkgSkip("FLTK")==0):
  4804. OPTS.append("FLTK")
  4805. TargetAdd('plugin_p3dCert.obj', opts=OPTS, input='p3dCert.cxx')
  4806. TargetAdd('plugin_p3dCert_strings.obj', opts=OPTS, input='p3dCert_strings.cxx')
  4807. TargetAdd('p3dcert.exe', input='plugin_mkdir_complete.obj')
  4808. TargetAdd('p3dcert.exe', input='plugin_wstring_encode.obj')
  4809. TargetAdd('p3dcert.exe', input='plugin_p3dCert.obj')
  4810. TargetAdd('p3dcert.exe', input='plugin_p3dCert_strings.obj')
  4811. OPTS=['SUBSYSTEM:WINDOWS', 'OPENSSL', 'FLTK', 'X11', 'WINCOMCTL', 'WINSOCK', 'WINGDI', 'WINUSER', 'ADVAPI', 'WINOLE', 'WINSHELL', 'SUBSYSTEM:WINDOWS']
  4812. if GetTarget() == 'darwin':
  4813. OPTS += ['OPT:2']
  4814. TargetAdd('p3dcert.exe', opts=OPTS)
  4815. elif (PkgSkip("WX")==0):
  4816. OPTS += ["WX", "RTTI"]
  4817. TargetAdd('plugin_p3dCert.obj', opts=OPTS, input='p3dCert_wx.cxx')
  4818. TargetAdd('p3dcert.exe', input='plugin_mkdir_complete.obj')
  4819. TargetAdd('p3dcert.exe', input='plugin_wstring_encode.obj')
  4820. TargetAdd('p3dcert.exe', input='plugin_p3dCert.obj')
  4821. OPTS=['SUBSYSTEM:WINDOWS', 'OPENSSL', 'WX', 'CARBON', 'WINOLE', 'WINOLEAUT', 'WINUSER', 'ADVAPI', 'WINSHELL', 'WINCOMCTL', 'WINGDI', 'WINCOMDLG']
  4822. if GetTarget() == "darwin":
  4823. OPTS += ['GL', 'OPT:2']
  4824. TargetAdd('p3dcert.exe', opts=OPTS)
  4825. #
  4826. # DIRECTORY: direct/src/plugin_npapi/
  4827. #
  4828. if RUNTIME:
  4829. OPTS=['DIR:direct/src/plugin_npapi', 'RUNTIME', 'GTK2']
  4830. if GetTarget() == 'windows':
  4831. nppanda3d_rc = {"name" : "Panda3D Game Engine Plug-in",
  4832. "version" : VERSION,
  4833. "description" : "Runs 3-D games and interactive applets",
  4834. "filename" : "nppanda3d.dll",
  4835. "mimetype" : "application/x-panda3d",
  4836. "extension" : "p3d",
  4837. "filedesc" : "Panda3D applet"}
  4838. TargetAdd('nppanda3d.res', opts=OPTS, winrc=nppanda3d_rc)
  4839. elif GetTarget() == 'darwin':
  4840. TargetAdd('nppanda3d.rsrc', opts=OPTS, input='nppanda3d.r')
  4841. OPTS += ['GTK2']
  4842. TargetAdd('plugin_npapi_nppanda3d_composite1.obj', opts=OPTS, input='nppanda3d_composite1.cxx')
  4843. TargetAdd('nppanda3d.plugin', input='plugin_common.obj')
  4844. TargetAdd('nppanda3d.plugin', input='plugin_parse_color.obj')
  4845. TargetAdd('nppanda3d.plugin', input='plugin_get_twirl_data.obj')
  4846. TargetAdd('nppanda3d.plugin', input='plugin_wstring_encode.obj')
  4847. TargetAdd('nppanda3d.plugin', input='plugin_npapi_nppanda3d_composite1.obj')
  4848. if GetTarget() == 'windows':
  4849. TargetAdd('nppanda3d.plugin', input='nppanda3d.res')
  4850. TargetAdd('nppanda3d.plugin', input='nppanda3d.def', ipath=OPTS)
  4851. elif GetTarget() == 'darwin':
  4852. TargetAdd('nppanda3d.plugin', input='nppanda3d.rsrc')
  4853. TargetAdd('nppanda3d.plugin', input='nppanda3d.plist', ipath=OPTS)
  4854. TargetAdd('nppanda3d.plugin', input='plugin_find_root_dir_assist.obj')
  4855. TargetAdd('nppanda3d.plugin', input='libp3tinyxml.ilb')
  4856. TargetAdd('nppanda3d.plugin', opts=['OPENSSL', 'WINGDI', 'WINUSER', 'WINSHELL', 'WINOLE', 'CARBON'])
  4857. #
  4858. # DIRECTORY: direct/src/plugin_activex/
  4859. #
  4860. if (RUNTIME and GetTarget() == 'windows' and PkgSkip("MFC")==0):
  4861. OPTS=['DIR:direct/src/plugin_activex', 'RUNTIME', 'ACTIVEX', 'MFC']
  4862. DefSymbol('ACTIVEX', '_USRDLL', '')
  4863. DefSymbol('ACTIVEX', '_WINDLL', '')
  4864. DefSymbol('ACTIVEX', '_AFXDLL', '')
  4865. DefSymbol('ACTIVEX', '_MBCS', '')
  4866. TargetAdd('P3DActiveX.tlb', opts=OPTS, input='P3DActiveX.idl')
  4867. TargetAdd('P3DActiveX.res', opts=OPTS, input='P3DActiveX.rc')
  4868. TargetAdd('plugin_activex_p3dactivex_composite1.obj', opts=OPTS, input='p3dactivex_composite1.cxx')
  4869. TargetAdd('p3dactivex.ocx', input='plugin_common.obj')
  4870. TargetAdd('p3dactivex.ocx', input='plugin_parse_color.obj')
  4871. TargetAdd('p3dactivex.ocx', input='plugin_get_twirl_data.obj')
  4872. TargetAdd('p3dactivex.ocx', input='plugin_wstring_encode.obj')
  4873. TargetAdd('p3dactivex.ocx', input='plugin_activex_p3dactivex_composite1.obj')
  4874. TargetAdd('p3dactivex.ocx', input='P3DActiveX.res')
  4875. TargetAdd('p3dactivex.ocx', input='P3DActiveX.def', ipath=OPTS)
  4876. TargetAdd('p3dactivex.ocx', input='libp3tinyxml.ilb')
  4877. TargetAdd('p3dactivex.ocx', opts=['MFC', 'WINSOCK2', 'OPENSSL', 'WINGDI', 'WINUSER'])
  4878. #
  4879. # DIRECTORY: direct/src/plugin_standalone/
  4880. #
  4881. if (RUNTIME):
  4882. OPTS=['DIR:direct/src/plugin_standalone', 'RUNTIME', 'OPENSSL']
  4883. TargetAdd('plugin_standalone_panda3d.obj', opts=OPTS, input='panda3d.cxx')
  4884. TargetAdd('plugin_standalone_panda3dBase.obj', opts=OPTS, input='panda3dBase.cxx')
  4885. if GetTarget() == 'windows':
  4886. panda3d_rc = {"name" : "Panda3D Game Engine Plug-in",
  4887. "version" : VERSION,
  4888. "description" : "Runs 3-D games and interactive applets",
  4889. "filename" : "panda3d.exe",
  4890. "mimetype" : "application/x-panda3d",
  4891. "extension" : "p3d",
  4892. "filedesc" : "Panda3D applet",
  4893. "icon" : "panda3d.ico"}
  4894. TargetAdd('panda3d.res', opts=OPTS, winrc=panda3d_rc)
  4895. TargetAdd('plugin_standalone_panda3dMain.obj', opts=OPTS, input='panda3dMain.cxx')
  4896. TargetAdd('panda3d.exe', input='plugin_standalone_panda3d.obj')
  4897. TargetAdd('panda3d.exe', input='plugin_standalone_panda3dMain.obj')
  4898. TargetAdd('panda3d.exe', input='plugin_standalone_panda3dBase.obj')
  4899. TargetAdd('panda3d.exe', input='plugin_common.obj')
  4900. TargetAdd('panda3d.exe', input='plugin_wstring_encode.obj')
  4901. if GetTarget() == 'darwin':
  4902. TargetAdd('panda3d.exe', input='plugin_find_root_dir_assist.obj')
  4903. elif GetTarget() == 'windows':
  4904. TargetAdd('panda3d.exe', input='panda3d.res')
  4905. TargetAdd('panda3d.exe', input='libpandaexpress.dll')
  4906. TargetAdd('panda3d.exe', input='libp3dtoolconfig.dll')
  4907. TargetAdd('panda3d.exe', input='libp3dtool.dll')
  4908. #TargetAdd('panda3d.exe', input='libp3pystub.lib')
  4909. TargetAdd('panda3d.exe', input='libp3tinyxml.ilb')
  4910. TargetAdd('panda3d.exe', opts=['NOICON', 'OPENSSL', 'ZLIB', 'WINGDI', 'WINUSER', 'WINSHELL', 'ADVAPI', 'WINSOCK2', 'WINOLE', 'CARBON'])
  4911. if (GetTarget() == 'darwin'):
  4912. TargetAdd('plugin_standalone_panda3dMac.obj', opts=OPTS, input='panda3dMac.cxx')
  4913. TargetAdd('Panda3D.app', input='plugin_standalone_panda3d.obj')
  4914. TargetAdd('Panda3D.app', input='plugin_standalone_panda3dMac.obj')
  4915. TargetAdd('Panda3D.app', input='plugin_standalone_panda3dBase.obj')
  4916. TargetAdd('Panda3D.app', input='plugin_common.obj')
  4917. TargetAdd('Panda3D.app', input='plugin_find_root_dir_assist.obj')
  4918. TargetAdd('Panda3D.app', input='libpandaexpress.dll')
  4919. TargetAdd('Panda3D.app', input='libp3dtoolconfig.dll')
  4920. TargetAdd('Panda3D.app', input='libp3dtool.dll')
  4921. #TargetAdd('Panda3D.app', input='libp3pystub.lib')
  4922. TargetAdd('Panda3D.app', input='libp3tinyxml.ilb')
  4923. TargetAdd('Panda3D.app', input='panda3d_mac.plist', ipath=OPTS)
  4924. TargetAdd('Panda3D.app', input='models/plugin_images/panda3d.icns')
  4925. TargetAdd('Panda3D.app', opts=['OPENSSL', 'ZLIB', 'WINGDI', 'WINUSER', 'WINSHELL', 'ADVAPI', 'WINSOCK2', 'WINOLE', 'CARBON'])
  4926. elif (GetTarget() == 'windows'):
  4927. TargetAdd('plugin_standalone_panda3dWinMain.obj', opts=OPTS, input='panda3dWinMain.cxx')
  4928. TargetAdd('panda3dw.exe', input='plugin_standalone_panda3d.obj')
  4929. TargetAdd('panda3dw.exe', input='plugin_standalone_panda3dWinMain.obj')
  4930. TargetAdd('panda3dw.exe', input='plugin_standalone_panda3dBase.obj')
  4931. TargetAdd('panda3dw.exe', input='plugin_wstring_encode.obj')
  4932. TargetAdd('panda3dw.exe', input='plugin_common.obj')
  4933. TargetAdd('panda3dw.exe', input='libpandaexpress.dll')
  4934. TargetAdd('panda3dw.exe', input='libp3dtoolconfig.dll')
  4935. TargetAdd('panda3dw.exe', input='libp3dtool.dll')
  4936. #TargetAdd('panda3dw.exe', input='libp3pystub.lib')
  4937. TargetAdd('panda3dw.exe', input='libp3tinyxml.ilb')
  4938. TargetAdd('panda3dw.exe', opts=['SUBSYSTEM:WINDOWS', 'OPENSSL', 'ZLIB', 'WINGDI', 'WINUSER', 'WINSHELL', 'ADVAPI', 'WINSOCK2', 'WINOLE', 'CARBON'])
  4939. if (RTDIST):
  4940. OPTS=['BUILDING:P3D_PLUGIN', 'DIR:direct/src/plugin_standalone', 'DIR:direct/src/plugin', 'DIR:dtool/src/dtoolbase', 'DIR:dtool/src/dtoolutil', 'DIR:dtool/src/pystub', 'DIR:dtool/src/prc', 'DIR:dtool/src/dconfig', 'DIR:panda/src/express', 'DIR:panda/src/downloader', 'RUNTIME', 'P3DEMBED', 'OPENSSL', 'ZLIB']
  4941. # This is arguably a big fat ugly hack, but doing it otherwise would complicate the build process considerably.
  4942. DefSymbol("P3DEMBED", "LINK_ALL_STATIC", "")
  4943. TargetAdd('plugin_standalone_panda3dBase.obj', opts=OPTS, input='panda3dBase.cxx')
  4944. TargetAdd('plugin_standalone_p3dEmbedMain.obj', opts=OPTS, input='p3dEmbedMain.cxx')
  4945. TargetAdd('plugin_standalone_p3dEmbed.obj', opts=OPTS, input='p3dEmbed.cxx')
  4946. #TargetAdd('plugin_standalone_pystub.obj', opts=OPTS, input='pystub.cxx')
  4947. TargetAdd('plugin_standalone_dtoolbase_composite1.obj', opts=OPTS, input='p3dtoolbase_composite1.cxx')
  4948. TargetAdd('plugin_standalone_dtoolbase_composite2.obj', opts=OPTS, input='p3dtoolbase_composite2.cxx')
  4949. TargetAdd('plugin_standalone_lookup3.obj', opts=OPTS, input='lookup3.c')
  4950. TargetAdd('plugin_standalone_indent.obj', opts=OPTS, input='indent.cxx')
  4951. TargetAdd('plugin_standalone_dtoolutil_composite1.obj', opts=OPTS, input='p3dtoolutil_composite1.cxx')
  4952. TargetAdd('plugin_standalone_dtoolutil_composite2.obj', opts=OPTS, input='p3dtoolutil_composite2.cxx')
  4953. if (GetTarget() == 'darwin'):
  4954. TargetAdd('plugin_standalone_dtoolutil_filename_assist.obj', opts=OPTS, input='filename_assist.mm')
  4955. TargetAdd('plugin_standalone_prc_composite1.obj', opts=OPTS, input='p3prc_composite1.cxx')
  4956. TargetAdd('plugin_standalone_prc_composite2.obj', opts=OPTS, input='p3prc_composite2.cxx')
  4957. TargetAdd('plugin_standalone_dconfig_composite1.obj', opts=OPTS, input='p3dconfig_composite1.cxx')
  4958. TargetAdd('plugin_standalone_express_composite1.obj', opts=OPTS, input='p3express_composite1.cxx')
  4959. TargetAdd('plugin_standalone_express_composite2.obj', opts=OPTS, input='p3express_composite2.cxx')
  4960. TargetAdd('plugin_standalone_downloader_composite1.obj', opts=OPTS, input='p3downloader_composite1.cxx')
  4961. TargetAdd('plugin_standalone_downloader_composite2.obj', opts=OPTS, input='p3downloader_composite2.cxx')
  4962. TargetAdd('p3dembed.exe', input='plugin_standalone_panda3dBase.obj')
  4963. TargetAdd('p3dembed.exe', input='plugin_standalone_p3dEmbedMain.obj')
  4964. TargetAdd('p3dembed.exe', input='plugin_standalone_p3dEmbed.obj')
  4965. #TargetAdd('p3dembed.exe', input='plugin_standalone_pystub.obj')
  4966. TargetAdd('p3dembed.exe', input='plugin_standalone_dtoolbase_composite1.obj')
  4967. TargetAdd('p3dembed.exe', input='plugin_standalone_dtoolbase_composite2.obj')
  4968. TargetAdd('p3dembed.exe', input='plugin_standalone_lookup3.obj')
  4969. TargetAdd('p3dembed.exe', input='plugin_standalone_indent.obj')
  4970. TargetAdd('p3dembed.exe', input='plugin_standalone_dtoolutil_composite1.obj')
  4971. TargetAdd('p3dembed.exe', input='plugin_standalone_dtoolutil_composite2.obj')
  4972. if GetTarget() == 'darwin':
  4973. TargetAdd('p3dembed.exe', input='plugin_standalone_dtoolutil_filename_assist.obj')
  4974. TargetAdd('p3dembed.exe', input='plugin_standalone_prc_composite1.obj')
  4975. TargetAdd('p3dembed.exe', input='plugin_standalone_prc_composite2.obj')
  4976. TargetAdd('p3dembed.exe', input='plugin_standalone_dconfig_composite1.obj')
  4977. TargetAdd('p3dembed.exe', input='plugin_standalone_express_composite1.obj')
  4978. TargetAdd('p3dembed.exe', input='plugin_standalone_express_composite2.obj')
  4979. TargetAdd('p3dembed.exe', input='plugin_standalone_downloader_composite1.obj')
  4980. TargetAdd('p3dembed.exe', input='plugin_standalone_downloader_composite2.obj')
  4981. TargetAdd('p3dembed.exe', input='plugin_common.obj')
  4982. if GetTarget() == 'darwin':
  4983. TargetAdd('p3dembed.exe', input='plugin_find_root_dir_assist.obj')
  4984. TargetAdd('p3dembed.exe', input='libp3subprocbuffer.ilb')
  4985. TargetAdd('p3dembed.exe', input='libp3tinyxml.ilb')
  4986. TargetAdd('p3dembed.exe', input='libp3d_plugin_static.ilb')
  4987. TargetAdd('p3dembed.exe', opts=['NOICON', 'WINGDI', 'WINSOCK2', 'ZLIB', 'WINUSER', 'OPENSSL', 'WINOLE', 'CARBON', 'MSIMG', 'WINCOMCTL', 'ADVAPI', 'WINSHELL', 'X11'])
  4988. if GetTarget() == 'windows':
  4989. OPTS.append("P3DEMBEDW")
  4990. DefSymbol("P3DEMBEDW", "P3DEMBEDW", "")
  4991. TargetAdd('plugin_standalone_p3dEmbedWinMain.obj', opts=OPTS, input='p3dEmbedMain.cxx')
  4992. TargetAdd('p3dembedw.exe', input='plugin_standalone_panda3dBase.obj')
  4993. TargetAdd('p3dembedw.exe', input='plugin_standalone_p3dEmbedWinMain.obj')
  4994. TargetAdd('p3dembedw.exe', input='plugin_standalone_p3dEmbed.obj')
  4995. #TargetAdd('p3dembedw.exe', input='plugin_standalone_pystub.obj')
  4996. TargetAdd('p3dembedw.exe', input='plugin_standalone_dtoolbase_composite1.obj')
  4997. TargetAdd('p3dembedw.exe', input='plugin_standalone_dtoolbase_composite2.obj')
  4998. TargetAdd('p3dembedw.exe', input='plugin_standalone_lookup3.obj')
  4999. TargetAdd('p3dembedw.exe', input='plugin_standalone_indent.obj')
  5000. TargetAdd('p3dembedw.exe', input='plugin_standalone_dtoolutil_composite1.obj')
  5001. TargetAdd('p3dembedw.exe', input='plugin_standalone_dtoolutil_composite2.obj')
  5002. TargetAdd('p3dembedw.exe', input='plugin_standalone_prc_composite1.obj')
  5003. TargetAdd('p3dembedw.exe', input='plugin_standalone_prc_composite2.obj')
  5004. TargetAdd('p3dembedw.exe', input='plugin_standalone_dconfig_composite1.obj')
  5005. TargetAdd('p3dembedw.exe', input='plugin_standalone_express_composite1.obj')
  5006. TargetAdd('p3dembedw.exe', input='plugin_standalone_express_composite2.obj')
  5007. TargetAdd('p3dembedw.exe', input='plugin_standalone_downloader_composite1.obj')
  5008. TargetAdd('p3dembedw.exe', input='plugin_standalone_downloader_composite2.obj')
  5009. TargetAdd('p3dembedw.exe', input='plugin_common.obj')
  5010. TargetAdd('p3dembedw.exe', input='libp3tinyxml.ilb')
  5011. TargetAdd('p3dembedw.exe', input='libp3d_plugin_static.ilb')
  5012. TargetAdd('p3dembedw.exe', opts=['SUBSYSTEM:WINDOWS', 'NOICON', 'WINGDI', 'WINSOCK2', 'ZLIB', 'WINUSER', 'OPENSSL', 'WINOLE', 'MSIMG', 'WINCOMCTL', 'ADVAPI', 'WINSHELL'])
  5013. #
  5014. # DIRECTORY: pandatool/src/pandatoolbase/
  5015. #
  5016. if (PkgSkip("PANDATOOL")==0):
  5017. OPTS=['DIR:pandatool/src/pandatoolbase']
  5018. TargetAdd('p3pandatoolbase_composite1.obj', opts=OPTS, input='p3pandatoolbase_composite1.cxx')
  5019. TargetAdd('libp3pandatoolbase.lib', input='p3pandatoolbase_composite1.obj')
  5020. #
  5021. # DIRECTORY: pandatool/src/converter/
  5022. #
  5023. if not PkgSkip("PANDATOOL") and not PkgSkip("EGG"):
  5024. OPTS=['DIR:pandatool/src/converter']
  5025. TargetAdd('p3converter_somethingToEggConverter.obj', opts=OPTS, input='somethingToEggConverter.cxx')
  5026. TargetAdd('p3converter_eggToSomethingConverter.obj', opts=OPTS, input='eggToSomethingConverter.cxx')
  5027. TargetAdd('libp3converter.lib', input='p3converter_somethingToEggConverter.obj')
  5028. TargetAdd('libp3converter.lib', input='p3converter_eggToSomethingConverter.obj')
  5029. #
  5030. # DIRECTORY: pandatool/src/progbase/
  5031. #
  5032. if not PkgSkip("PANDATOOL"):
  5033. OPTS=['DIR:pandatool/src/progbase', 'ZLIB']
  5034. TargetAdd('p3progbase_composite1.obj', opts=OPTS, input='p3progbase_composite1.cxx')
  5035. TargetAdd('libp3progbase.lib', input='p3progbase_composite1.obj')
  5036. #
  5037. # DIRECTORY: pandatool/src/eggbase/
  5038. #
  5039. if not PkgSkip("PANDATOOL") and not PkgSkip("EGG"):
  5040. OPTS=['DIR:pandatool/src/eggbase']
  5041. TargetAdd('p3eggbase_composite1.obj', opts=OPTS, input='p3eggbase_composite1.cxx')
  5042. TargetAdd('libp3eggbase.lib', input='p3eggbase_composite1.obj')
  5043. #
  5044. # DIRECTORY: pandatool/src/bam/
  5045. #
  5046. if not PkgSkip("PANDATOOL"):
  5047. OPTS=['DIR:pandatool/src/bam']
  5048. TargetAdd('bam-info_bamInfo.obj', opts=OPTS, input='bamInfo.cxx')
  5049. TargetAdd('bam-info.exe', input='bam-info_bamInfo.obj')
  5050. TargetAdd('bam-info.exe', input='libp3progbase.lib')
  5051. TargetAdd('bam-info.exe', input='libp3pandatoolbase.lib')
  5052. TargetAdd('bam-info.exe', input=COMMON_PANDA_LIBS)
  5053. TargetAdd('bam-info.exe', opts=['ADVAPI', 'FFTW'])
  5054. if not PkgSkip("EGG"):
  5055. TargetAdd('bam2egg_bamToEgg.obj', opts=OPTS, input='bamToEgg.cxx')
  5056. TargetAdd('bam2egg.exe', input='bam2egg_bamToEgg.obj')
  5057. TargetAdd('bam2egg.exe', input=COMMON_EGG2X_LIBS)
  5058. TargetAdd('bam2egg.exe', opts=['ADVAPI', 'FFTW'])
  5059. TargetAdd('egg2bam_eggToBam.obj', opts=OPTS, input='eggToBam.cxx')
  5060. TargetAdd('egg2bam.exe', input='egg2bam_eggToBam.obj')
  5061. TargetAdd('egg2bam.exe', input=COMMON_EGG2X_LIBS)
  5062. TargetAdd('egg2bam.exe', opts=['ADVAPI', 'FFTW'])
  5063. #
  5064. # DIRECTORY: pandatool/src/cvscopy/
  5065. #
  5066. if not PkgSkip("PANDATOOL"):
  5067. OPTS=['DIR:pandatool/src/cvscopy']
  5068. TargetAdd('p3cvscopy_composite1.obj', opts=OPTS, input='p3cvscopy_composite1.cxx')
  5069. TargetAdd('libp3cvscopy.lib', input='p3cvscopy_composite1.obj')
  5070. #
  5071. # DIRECTORY: pandatool/src/daeegg/
  5072. #
  5073. if not PkgSkip("PANDATOOL") and not PkgSkip("FCOLLADA") and not PkgSkip("EGG"):
  5074. OPTS=['DIR:pandatool/src/daeegg', 'FCOLLADA']
  5075. TargetAdd('p3daeegg_composite1.obj', opts=OPTS, input='p3daeegg_composite1.cxx')
  5076. TargetAdd('libp3daeegg.lib', input='p3daeegg_composite1.obj')
  5077. TargetAdd('libp3daeegg.lib', opts=['FCOLLADA', 'CARBON'])
  5078. #
  5079. # DIRECTORY: pandatool/src/assimp
  5080. #
  5081. if not PkgSkip("PANDATOOL") and not PkgSkip("ASSIMP"):
  5082. OPTS=['DIR:pandatool/src/assimp', 'BUILDING:ASSIMP', 'ASSIMP', 'MODULE']
  5083. TargetAdd('p3assimp_composite1.obj', opts=OPTS, input='p3assimp_composite1.cxx')
  5084. TargetAdd('libp3assimp.dll', input='p3assimp_composite1.obj')
  5085. TargetAdd('libp3assimp.dll', input=COMMON_PANDA_LIBS)
  5086. TargetAdd('libp3assimp.dll', opts=OPTS+['ZLIB'])
  5087. #
  5088. # DIRECTORY: pandatool/src/daeprogs/
  5089. #
  5090. if not PkgSkip("PANDATOOL") and not PkgSkip("FCOLLADA") and not PkgSkip("EGG"):
  5091. OPTS=['DIR:pandatool/src/daeprogs', 'FCOLLADA']
  5092. TargetAdd('dae2egg_daeToEgg.obj', opts=OPTS, input='daeToEgg.cxx')
  5093. TargetAdd('dae2egg.exe', input='dae2egg_daeToEgg.obj')
  5094. TargetAdd('dae2egg.exe', input='libp3daeegg.lib')
  5095. TargetAdd('dae2egg.exe', input=COMMON_EGG2X_LIBS)
  5096. TargetAdd('dae2egg.exe', opts=['WINUSER', 'FCOLLADA', 'CARBON'])
  5097. #
  5098. # DIRECTORY: pandatool/src/dxf/
  5099. #
  5100. if not PkgSkip("PANDATOOL"):
  5101. OPTS=['DIR:pandatool/src/dxf']
  5102. TargetAdd('p3dxf_composite1.obj', opts=OPTS, input='p3dxf_composite1.cxx')
  5103. TargetAdd('libp3dxf.lib', input='p3dxf_composite1.obj')
  5104. #
  5105. # DIRECTORY: pandatool/src/dxfegg/
  5106. #
  5107. if not PkgSkip("PANDATOOL") and not PkgSkip("EGG"):
  5108. OPTS=['DIR:pandatool/src/dxfegg']
  5109. TargetAdd('p3dxfegg_dxfToEggConverter.obj', opts=OPTS, input='dxfToEggConverter.cxx')
  5110. TargetAdd('p3dxfegg_dxfToEggLayer.obj', opts=OPTS, input='dxfToEggLayer.cxx')
  5111. TargetAdd('libp3dxfegg.lib', input='p3dxfegg_dxfToEggConverter.obj')
  5112. TargetAdd('libp3dxfegg.lib', input='p3dxfegg_dxfToEggLayer.obj')
  5113. #
  5114. # DIRECTORY: pandatool/src/dxfprogs/
  5115. #
  5116. if not PkgSkip("PANDATOOL"):
  5117. OPTS=['DIR:pandatool/src/dxfprogs']
  5118. TargetAdd('dxf-points_dxfPoints.obj', opts=OPTS, input='dxfPoints.cxx')
  5119. TargetAdd('dxf-points.exe', input='dxf-points_dxfPoints.obj')
  5120. TargetAdd('dxf-points.exe', input='libp3progbase.lib')
  5121. TargetAdd('dxf-points.exe', input='libp3dxf.lib')
  5122. TargetAdd('dxf-points.exe', input='libp3pandatoolbase.lib')
  5123. TargetAdd('dxf-points.exe', input=COMMON_PANDA_LIBS)
  5124. TargetAdd('dxf-points.exe', opts=['ADVAPI', 'FFTW'])
  5125. if not PkgSkip("EGG"):
  5126. TargetAdd('dxf2egg_dxfToEgg.obj', opts=OPTS, input='dxfToEgg.cxx')
  5127. TargetAdd('dxf2egg.exe', input='dxf2egg_dxfToEgg.obj')
  5128. TargetAdd('dxf2egg.exe', input='libp3dxfegg.lib')
  5129. TargetAdd('dxf2egg.exe', input='libp3dxf.lib')
  5130. TargetAdd('dxf2egg.exe', input=COMMON_EGG2X_LIBS)
  5131. TargetAdd('dxf2egg.exe', opts=['ADVAPI', 'FFTW'])
  5132. TargetAdd('egg2dxf_eggToDXF.obj', opts=OPTS, input='eggToDXF.cxx')
  5133. TargetAdd('egg2dxf_eggToDXFLayer.obj', opts=OPTS, input='eggToDXFLayer.cxx')
  5134. TargetAdd('egg2dxf.exe', input='egg2dxf_eggToDXF.obj')
  5135. TargetAdd('egg2dxf.exe', input='egg2dxf_eggToDXFLayer.obj')
  5136. TargetAdd('egg2dxf.exe', input='libp3dxf.lib')
  5137. TargetAdd('egg2dxf.exe', input=COMMON_EGG2X_LIBS)
  5138. TargetAdd('egg2dxf.exe', opts=['ADVAPI', 'FFTW'])
  5139. #
  5140. # DIRECTORY: pandatool/src/objegg/
  5141. #
  5142. if not PkgSkip("PANDATOOL") and not PkgSkip("EGG"):
  5143. OPTS=['DIR:pandatool/src/objegg']
  5144. TargetAdd('p3objegg_objToEggConverter.obj', opts=OPTS, input='objToEggConverter.cxx')
  5145. TargetAdd('p3objegg_eggToObjConverter.obj', opts=OPTS, input='eggToObjConverter.cxx')
  5146. TargetAdd('p3objegg_config_objegg.obj', opts=OPTS, input='config_objegg.cxx')
  5147. TargetAdd('libp3objegg.lib', input='p3objegg_objToEggConverter.obj')
  5148. TargetAdd('libp3objegg.lib', input='p3objegg_eggToObjConverter.obj')
  5149. TargetAdd('libp3objegg.lib', input='p3objegg_config_objegg.obj')
  5150. #
  5151. # DIRECTORY: pandatool/src/objprogs/
  5152. #
  5153. if not PkgSkip("PANDATOOL") and not PkgSkip("EGG"):
  5154. OPTS=['DIR:pandatool/src/objprogs']
  5155. TargetAdd('obj2egg_objToEgg.obj', opts=OPTS, input='objToEgg.cxx')
  5156. TargetAdd('obj2egg.exe', input='obj2egg_objToEgg.obj')
  5157. TargetAdd('obj2egg.exe', input='libp3objegg.lib')
  5158. TargetAdd('obj2egg.exe', input=COMMON_EGG2X_LIBS)
  5159. TargetAdd('egg2obj_eggToObj.obj', opts=OPTS, input='eggToObj.cxx')
  5160. TargetAdd('egg2obj.exe', input='egg2obj_eggToObj.obj')
  5161. TargetAdd('egg2obj.exe', input='libp3objegg.lib')
  5162. TargetAdd('egg2obj.exe', input=COMMON_EGG2X_LIBS)
  5163. #
  5164. # DIRECTORY: pandatool/src/palettizer/
  5165. #
  5166. if not PkgSkip("PANDATOOL") and not PkgSkip("EGG"):
  5167. OPTS=['DIR:pandatool/src/palettizer']
  5168. TargetAdd('p3palettizer_composite1.obj', opts=OPTS, input='p3palettizer_composite1.cxx')
  5169. TargetAdd('libp3palettizer.lib', input='p3palettizer_composite1.obj')
  5170. #
  5171. # DIRECTORY: pandatool/src/egg-mkfont/
  5172. #
  5173. if not PkgSkip("FREETYPE") and not PkgSkip("PANDATOOL") and not PkgSkip("EGG"):
  5174. OPTS=['DIR:pandatool/src/egg-mkfont', 'DIR:pandatool/src/palettizer', 'FREETYPE']
  5175. TargetAdd('egg-mkfont_eggMakeFont.obj', opts=OPTS, input='eggMakeFont.cxx')
  5176. TargetAdd('egg-mkfont_rangeDescription.obj', opts=OPTS, input='rangeDescription.cxx')
  5177. TargetAdd('egg-mkfont_rangeIterator.obj', opts=OPTS, input='rangeIterator.cxx')
  5178. TargetAdd('egg-mkfont.exe', input='egg-mkfont_eggMakeFont.obj')
  5179. TargetAdd('egg-mkfont.exe', input='egg-mkfont_rangeDescription.obj')
  5180. TargetAdd('egg-mkfont.exe', input='egg-mkfont_rangeIterator.obj')
  5181. TargetAdd('egg-mkfont.exe', input='libp3palettizer.lib')
  5182. TargetAdd('egg-mkfont.exe', input=COMMON_EGG2X_LIBS)
  5183. TargetAdd('egg-mkfont.exe', opts=['ADVAPI', 'FREETYPE'])
  5184. #
  5185. # DIRECTORY: pandatool/src/eggcharbase/
  5186. #
  5187. if not PkgSkip("PANDATOOL") and not PkgSkip("EGG"):
  5188. OPTS=['DIR:pandatool/src/eggcharbase', 'ZLIB']
  5189. TargetAdd('p3eggcharbase_composite1.obj', opts=OPTS, input='p3eggcharbase_composite1.cxx')
  5190. TargetAdd('libp3eggcharbase.lib', input='p3eggcharbase_composite1.obj')
  5191. #
  5192. # DIRECTORY: pandatool/src/egg-optchar/
  5193. #
  5194. if not PkgSkip("PANDATOOL") and not PkgSkip("EGG"):
  5195. OPTS=['DIR:pandatool/src/egg-optchar']
  5196. TargetAdd('egg-optchar_config_egg_optchar.obj', opts=OPTS, input='config_egg_optchar.cxx')
  5197. TargetAdd('egg-optchar_eggOptchar.obj', opts=OPTS, input='eggOptchar.cxx')
  5198. TargetAdd('egg-optchar_eggOptcharUserData.obj', opts=OPTS, input='eggOptcharUserData.cxx')
  5199. TargetAdd('egg-optchar_vertexMembership.obj', opts=OPTS, input='vertexMembership.cxx')
  5200. TargetAdd('egg-optchar.exe', input='egg-optchar_config_egg_optchar.obj')
  5201. TargetAdd('egg-optchar.exe', input='egg-optchar_eggOptchar.obj')
  5202. TargetAdd('egg-optchar.exe', input='egg-optchar_eggOptcharUserData.obj')
  5203. TargetAdd('egg-optchar.exe', input='egg-optchar_vertexMembership.obj')
  5204. TargetAdd('egg-optchar.exe', input='libp3eggcharbase.lib')
  5205. TargetAdd('egg-optchar.exe', input=COMMON_EGG2X_LIBS)
  5206. TargetAdd('egg-optchar.exe', opts=['ADVAPI', 'FREETYPE'])
  5207. #
  5208. # DIRECTORY: pandatool/src/egg-palettize/
  5209. #
  5210. if not PkgSkip("PANDATOOL") and not PkgSkip("EGG"):
  5211. OPTS=['DIR:pandatool/src/egg-palettize', 'DIR:pandatool/src/palettizer']
  5212. TargetAdd('egg-palettize_eggPalettize.obj', opts=OPTS, input='eggPalettize.cxx')
  5213. TargetAdd('egg-palettize.exe', input='egg-palettize_eggPalettize.obj')
  5214. TargetAdd('egg-palettize.exe', input='libp3palettizer.lib')
  5215. TargetAdd('egg-palettize.exe', input=COMMON_EGG2X_LIBS)
  5216. TargetAdd('egg-palettize.exe', opts=['ADVAPI'])
  5217. #
  5218. # DIRECTORY: pandatool/src/egg-qtess/
  5219. #
  5220. if not PkgSkip("PANDATOOL") and not PkgSkip("EGG"):
  5221. OPTS=['DIR:pandatool/src/egg-qtess']
  5222. TargetAdd('egg-qtess_composite1.obj', opts=OPTS, input='egg-qtess_composite1.cxx')
  5223. TargetAdd('egg-qtess.exe', input='egg-qtess_composite1.obj')
  5224. TargetAdd('egg-qtess.exe', input='libp3eggbase.lib')
  5225. TargetAdd('egg-qtess.exe', input='libp3progbase.lib')
  5226. TargetAdd('egg-qtess.exe', input='libp3converter.lib')
  5227. TargetAdd('egg-qtess.exe', input=COMMON_EGG2X_LIBS)
  5228. TargetAdd('egg-qtess.exe', opts=['ADVAPI'])
  5229. #
  5230. # DIRECTORY: pandatool/src/eggprogs/
  5231. #
  5232. if not PkgSkip("PANDATOOL") and not PkgSkip("EGG"):
  5233. OPTS=['DIR:pandatool/src/eggprogs']
  5234. TargetAdd('egg-crop_eggCrop.obj', opts=OPTS, input='eggCrop.cxx')
  5235. TargetAdd('egg-crop.exe', input='egg-crop_eggCrop.obj')
  5236. TargetAdd('egg-crop.exe', input=COMMON_EGG2X_LIBS)
  5237. TargetAdd('egg-crop.exe', opts=['ADVAPI'])
  5238. TargetAdd('egg-make-tube_eggMakeTube.obj', opts=OPTS, input='eggMakeTube.cxx')
  5239. TargetAdd('egg-make-tube.exe', input='egg-make-tube_eggMakeTube.obj')
  5240. TargetAdd('egg-make-tube.exe', input=COMMON_EGG2X_LIBS)
  5241. TargetAdd('egg-make-tube.exe', opts=['ADVAPI'])
  5242. TargetAdd('egg-texture-cards_eggTextureCards.obj', opts=OPTS, input='eggTextureCards.cxx')
  5243. TargetAdd('egg-texture-cards.exe', input='egg-texture-cards_eggTextureCards.obj')
  5244. TargetAdd('egg-texture-cards.exe', input=COMMON_EGG2X_LIBS)
  5245. TargetAdd('egg-texture-cards.exe', opts=['ADVAPI'])
  5246. TargetAdd('egg-topstrip_eggTopstrip.obj', opts=OPTS, input='eggTopstrip.cxx')
  5247. TargetAdd('egg-topstrip.exe', input='egg-topstrip_eggTopstrip.obj')
  5248. TargetAdd('egg-topstrip.exe', input='libp3eggcharbase.lib')
  5249. TargetAdd('egg-topstrip.exe', input=COMMON_EGG2X_LIBS)
  5250. TargetAdd('egg-topstrip.exe', opts=['ADVAPI'])
  5251. TargetAdd('egg-trans_eggTrans.obj', opts=OPTS, input='eggTrans.cxx')
  5252. TargetAdd('egg-trans.exe', input='egg-trans_eggTrans.obj')
  5253. TargetAdd('egg-trans.exe', input=COMMON_EGG2X_LIBS)
  5254. TargetAdd('egg-trans.exe', opts=['ADVAPI'])
  5255. TargetAdd('egg2c_eggToC.obj', opts=OPTS, input='eggToC.cxx')
  5256. TargetAdd('egg2c.exe', input='egg2c_eggToC.obj')
  5257. TargetAdd('egg2c.exe', input=COMMON_EGG2X_LIBS)
  5258. TargetAdd('egg2c.exe', opts=['ADVAPI'])
  5259. TargetAdd('egg-rename_eggRename.obj', opts=OPTS, input='eggRename.cxx')
  5260. TargetAdd('egg-rename.exe', input='egg-rename_eggRename.obj')
  5261. TargetAdd('egg-rename.exe', input=COMMON_EGG2X_LIBS)
  5262. TargetAdd('egg-rename.exe', opts=['ADVAPI'])
  5263. TargetAdd('egg-retarget-anim_eggRetargetAnim.obj', opts=OPTS, input='eggRetargetAnim.cxx')
  5264. TargetAdd('egg-retarget-anim.exe', input='egg-retarget-anim_eggRetargetAnim.obj')
  5265. TargetAdd('egg-retarget-anim.exe', input='libp3eggcharbase.lib')
  5266. TargetAdd('egg-retarget-anim.exe', input=COMMON_EGG2X_LIBS)
  5267. TargetAdd('egg-retarget-anim.exe', opts=['ADVAPI'])
  5268. TargetAdd('egg-list-textures_eggListTextures.obj', opts=OPTS, input='eggListTextures.cxx')
  5269. TargetAdd('egg-list-textures.exe', input='egg-list-textures_eggListTextures.obj')
  5270. TargetAdd('egg-list-textures.exe', input=COMMON_EGG2X_LIBS)
  5271. TargetAdd('egg-list-textures.exe', opts=['ADVAPI'])
  5272. #
  5273. # DIRECTORY: pandatool/src/flt/
  5274. #
  5275. if not PkgSkip("PANDATOOL"):
  5276. OPTS=['DIR:pandatool/src/flt', 'ZLIB']
  5277. TargetAdd('p3flt_composite1.obj', opts=OPTS, input='p3flt_composite1.cxx')
  5278. TargetAdd('libp3flt.lib', input=['p3flt_composite1.obj'])
  5279. #
  5280. # DIRECTORY: pandatool/src/fltegg/
  5281. #
  5282. if not PkgSkip("PANDATOOL") and not PkgSkip("EGG"):
  5283. OPTS=['DIR:pandatool/src/fltegg']
  5284. TargetAdd('p3fltegg_fltToEggConverter.obj', opts=OPTS, input='fltToEggConverter.cxx')
  5285. TargetAdd('p3fltegg_fltToEggLevelState.obj', opts=OPTS, input='fltToEggLevelState.cxx')
  5286. TargetAdd('libp3fltegg.lib', input=['p3fltegg_fltToEggConverter.obj', 'p3fltegg_fltToEggLevelState.obj'])
  5287. #
  5288. # DIRECTORY: pandatool/src/fltprogs/
  5289. #
  5290. if not PkgSkip("PANDATOOL"):
  5291. OPTS=['DIR:pandatool/src/fltprogs', 'DIR:pandatool/src/flt', 'DIR:pandatool/src/cvscopy']
  5292. TargetAdd('flt-info_fltInfo.obj', opts=OPTS, input='fltInfo.cxx')
  5293. TargetAdd('flt-info.exe', input='flt-info_fltInfo.obj')
  5294. TargetAdd('flt-info.exe', input='libp3flt.lib')
  5295. TargetAdd('flt-info.exe', input='libp3progbase.lib')
  5296. TargetAdd('flt-info.exe', input='libp3pandatoolbase.lib')
  5297. TargetAdd('flt-info.exe', input=COMMON_PANDA_LIBS)
  5298. TargetAdd('flt-info.exe', opts=['ADVAPI'])
  5299. TargetAdd('flt-trans_fltTrans.obj', opts=OPTS, input='fltTrans.cxx')
  5300. TargetAdd('flt-trans.exe', input='flt-trans_fltTrans.obj')
  5301. TargetAdd('flt-trans.exe', input='libp3flt.lib')
  5302. TargetAdd('flt-trans.exe', input='libp3progbase.lib')
  5303. TargetAdd('flt-trans.exe', input='libp3pandatoolbase.lib')
  5304. TargetAdd('flt-trans.exe', input=COMMON_PANDA_LIBS)
  5305. TargetAdd('flt-trans.exe', opts=['ADVAPI'])
  5306. TargetAdd('fltcopy_fltCopy.obj', opts=OPTS, input='fltCopy.cxx')
  5307. TargetAdd('fltcopy.exe', input='fltcopy_fltCopy.obj')
  5308. TargetAdd('fltcopy.exe', input='libp3cvscopy.lib')
  5309. TargetAdd('fltcopy.exe', input='libp3flt.lib')
  5310. TargetAdd('fltcopy.exe', input='libp3progbase.lib')
  5311. TargetAdd('fltcopy.exe', input='libp3pandatoolbase.lib')
  5312. TargetAdd('fltcopy.exe', input=COMMON_PANDA_LIBS)
  5313. TargetAdd('fltcopy.exe', opts=['ADVAPI'])
  5314. if not PkgSkip("EGG"):
  5315. TargetAdd('egg2flt_eggToFlt.obj', opts=OPTS, input='eggToFlt.cxx')
  5316. TargetAdd('egg2flt.exe', input='egg2flt_eggToFlt.obj')
  5317. TargetAdd('egg2flt.exe', input='libp3flt.lib')
  5318. TargetAdd('egg2flt.exe', input=COMMON_EGG2X_LIBS)
  5319. TargetAdd('egg2flt.exe', opts=['ADVAPI'])
  5320. TargetAdd('flt2egg_fltToEgg.obj', opts=OPTS, input='fltToEgg.cxx')
  5321. TargetAdd('flt2egg.exe', input='flt2egg_fltToEgg.obj')
  5322. TargetAdd('flt2egg.exe', input='libp3flt.lib')
  5323. TargetAdd('flt2egg.exe', input='libp3fltegg.lib')
  5324. TargetAdd('flt2egg.exe', input=COMMON_EGG2X_LIBS)
  5325. TargetAdd('flt2egg.exe', opts=['ADVAPI'])
  5326. #
  5327. # DIRECTORY: pandatool/src/imagebase/
  5328. #
  5329. if not PkgSkip("PANDATOOL"):
  5330. OPTS=['DIR:pandatool/src/imagebase']
  5331. TargetAdd('p3imagebase_composite1.obj', opts=OPTS, input='p3imagebase_composite1.cxx')
  5332. TargetAdd('libp3imagebase.lib', input='p3imagebase_composite1.obj')
  5333. #
  5334. # DIRECTORY: pandatool/src/imageprogs/
  5335. #
  5336. if not PkgSkip("PANDATOOL"):
  5337. OPTS=['DIR:pandatool/src/imageprogs']
  5338. TargetAdd('image-info_imageInfo.obj', opts=OPTS, input='imageInfo.cxx')
  5339. TargetAdd('image-info.exe', input='image-info_imageInfo.obj')
  5340. TargetAdd('image-info.exe', input='libp3imagebase.lib')
  5341. TargetAdd('image-info.exe', input='libp3progbase.lib')
  5342. TargetAdd('image-info.exe', input='libp3pandatoolbase.lib')
  5343. TargetAdd('image-info.exe', input=COMMON_PANDA_LIBS)
  5344. TargetAdd('image-info.exe', opts=['ADVAPI'])
  5345. TargetAdd('image-resize_imageResize.obj', opts=OPTS, input='imageResize.cxx')
  5346. TargetAdd('image-resize.exe', input='image-resize_imageResize.obj')
  5347. TargetAdd('image-resize.exe', input='libp3imagebase.lib')
  5348. TargetAdd('image-resize.exe', input='libp3progbase.lib')
  5349. TargetAdd('image-resize.exe', input='libp3pandatoolbase.lib')
  5350. TargetAdd('image-resize.exe', input=COMMON_PANDA_LIBS)
  5351. TargetAdd('image-resize.exe', opts=['ADVAPI'])
  5352. TargetAdd('image-trans_imageTrans.obj', opts=OPTS, input='imageTrans.cxx')
  5353. TargetAdd('image-trans.exe', input='image-trans_imageTrans.obj')
  5354. TargetAdd('image-trans.exe', input='libp3imagebase.lib')
  5355. TargetAdd('image-trans.exe', input='libp3progbase.lib')
  5356. TargetAdd('image-trans.exe', input='libp3pandatoolbase.lib')
  5357. TargetAdd('image-trans.exe', input=COMMON_PANDA_LIBS)
  5358. TargetAdd('image-trans.exe', opts=['ADVAPI'])
  5359. #
  5360. # DIRECTORY: pandatool/src/pfmprogs/
  5361. #
  5362. if not PkgSkip("PANDATOOL"):
  5363. OPTS=['DIR:pandatool/src/pfmprogs']
  5364. TargetAdd('pfm-trans_pfmTrans.obj', opts=OPTS, input='pfmTrans.cxx')
  5365. TargetAdd('pfm-trans.exe', input='pfm-trans_pfmTrans.obj')
  5366. TargetAdd('pfm-trans.exe', input='libp3progbase.lib')
  5367. TargetAdd('pfm-trans.exe', input='libp3pandatoolbase.lib')
  5368. TargetAdd('pfm-trans.exe', input=COMMON_PANDA_LIBS)
  5369. TargetAdd('pfm-trans.exe', opts=['ADVAPI'])
  5370. TargetAdd('pfm-bba_pfmBba.obj', opts=OPTS, input='pfmBba.cxx')
  5371. TargetAdd('pfm-bba_config_pfm.obj', opts=OPTS, input='config_pfm.cxx')
  5372. TargetAdd('pfm-bba.exe', input='pfm-bba_pfmBba.obj')
  5373. TargetAdd('pfm-bba.exe', input='pfm-bba_config_pfm.obj')
  5374. TargetAdd('pfm-bba.exe', input='libp3progbase.lib')
  5375. TargetAdd('pfm-bba.exe', input='libp3pandatoolbase.lib')
  5376. TargetAdd('pfm-bba.exe', input=COMMON_PANDA_LIBS)
  5377. TargetAdd('pfm-bba.exe', opts=['ADVAPI'])
  5378. #
  5379. # DIRECTORY: pandatool/src/lwo/
  5380. #
  5381. if not PkgSkip("PANDATOOL"):
  5382. OPTS=['DIR:pandatool/src/lwo']
  5383. TargetAdd('p3lwo_composite1.obj', opts=OPTS, input='p3lwo_composite1.cxx')
  5384. TargetAdd('libp3lwo.lib', input='p3lwo_composite1.obj')
  5385. #
  5386. # DIRECTORY: pandatool/src/lwoegg/
  5387. #
  5388. if not PkgSkip("PANDATOOL") and not PkgSkip("EGG"):
  5389. OPTS=['DIR:pandatool/src/lwoegg']
  5390. TargetAdd('p3lwoegg_composite1.obj', opts=OPTS, input='p3lwoegg_composite1.cxx')
  5391. TargetAdd('libp3lwoegg.lib', input='p3lwoegg_composite1.obj')
  5392. #
  5393. # DIRECTORY: pandatool/src/lwoprogs/
  5394. #
  5395. if not PkgSkip("PANDATOOL"):
  5396. OPTS=['DIR:pandatool/src/lwoprogs', 'DIR:pandatool/src/lwo']
  5397. TargetAdd('lwo-scan_lwoScan.obj', opts=OPTS, input='lwoScan.cxx')
  5398. TargetAdd('lwo-scan.exe', input='lwo-scan_lwoScan.obj')
  5399. TargetAdd('lwo-scan.exe', input='libp3lwo.lib')
  5400. TargetAdd('lwo-scan.exe', input='libp3progbase.lib')
  5401. TargetAdd('lwo-scan.exe', input='libp3pandatoolbase.lib')
  5402. TargetAdd('lwo-scan.exe', input=COMMON_PANDA_LIBS)
  5403. TargetAdd('lwo-scan.exe', opts=['ADVAPI'])
  5404. if not PkgSkip("EGG"):
  5405. TargetAdd('lwo2egg_lwoToEgg.obj', opts=OPTS, input='lwoToEgg.cxx')
  5406. TargetAdd('lwo2egg.exe', input='lwo2egg_lwoToEgg.obj')
  5407. TargetAdd('lwo2egg.exe', input='libp3lwo.lib')
  5408. TargetAdd('lwo2egg.exe', input='libp3lwoegg.lib')
  5409. TargetAdd('lwo2egg.exe', input=COMMON_EGG2X_LIBS)
  5410. TargetAdd('lwo2egg.exe', opts=['ADVAPI'])
  5411. #
  5412. # DIRECTORY: pandatool/src/maya/
  5413. #
  5414. for VER in MAYAVERSIONS:
  5415. VNUM=VER[4:]
  5416. if not PkgSkip(VER) and not PkgSkip("PANDATOOL"):
  5417. OPTS=['DIR:pandatool/src/maya', VER]
  5418. TargetAdd('maya'+VNUM+'_composite1.obj', opts=OPTS, input='p3maya_composite1.cxx')
  5419. TargetAdd('libmaya'+VNUM+'.lib', input='maya'+VNUM+'_composite1.obj')
  5420. #
  5421. # DIRECTORY: pandatool/src/mayaegg/
  5422. #
  5423. for VER in MAYAVERSIONS:
  5424. VNUM=VER[4:]
  5425. if not PkgSkip(VER) and not PkgSkip("PANDATOOL") and not PkgSkip("EGG"):
  5426. OPTS=['DIR:pandatool/src/mayaegg', 'DIR:pandatool/src/maya', VER]
  5427. TargetAdd('mayaegg'+VNUM+'_loader.obj', opts=OPTS, input='mayaEggLoader.cxx')
  5428. TargetAdd('mayaegg'+VNUM+'_composite1.obj', opts=OPTS, input='p3mayaegg_composite1.cxx')
  5429. TargetAdd('libmayaegg'+VNUM+'.lib', input='mayaegg'+VNUM+'_loader.obj')
  5430. TargetAdd('libmayaegg'+VNUM+'.lib', input='mayaegg'+VNUM+'_composite1.obj')
  5431. #
  5432. # DIRECTORY: pandatool/src/maxegg/
  5433. #
  5434. for VER in MAXVERSIONS:
  5435. VNUM=VER[3:]
  5436. if not PkgSkip(VER) and not PkgSkip("PANDATOOL") and not PkgSkip("EGG"):
  5437. OPTS=['DIR:pandatool/src/maxegg', VER, "WINCOMCTL", "WINCOMDLG", "WINUSER", "MSFORSCOPE", "RTTI"]
  5438. TargetAdd('maxEgg'+VNUM+'.res', opts=OPTS, input='maxEgg.rc')
  5439. TargetAdd('maxegg'+VNUM+'_loader.obj', opts=OPTS, input='maxEggLoader.cxx')
  5440. TargetAdd('maxegg'+VNUM+'_composite1.obj', opts=OPTS, input='p3maxegg_composite1.cxx')
  5441. TargetAdd('maxegg'+VNUM+'.dlo', input='maxegg'+VNUM+'_composite1.obj')
  5442. TargetAdd('maxegg'+VNUM+'.dlo', input='maxEgg'+VNUM+'.res')
  5443. TargetAdd('maxegg'+VNUM+'.dlo', input='maxEgg.def', ipath=OPTS)
  5444. TargetAdd('maxegg'+VNUM+'.dlo', input=COMMON_EGG2X_LIBS)
  5445. TargetAdd('maxegg'+VNUM+'.dlo', opts=OPTS)
  5446. #
  5447. # DIRECTORY: pandatool/src/maxprogs/
  5448. #
  5449. for VER in MAXVERSIONS:
  5450. VNUM=VER[3:]
  5451. if not PkgSkip(VER) and not PkgSkip("PANDATOOL") and not PkgSkip("EGG"):
  5452. OPTS=['DIR:pandatool/src/maxprogs', VER, "WINCOMCTL", "WINCOMDLG", "WINUSER", "MSFORSCOPE", "RTTI"]
  5453. TargetAdd('maxImportRes.res', opts=OPTS, input='maxImportRes.rc')
  5454. TargetAdd('maxprogs'+VNUM+'_maxeggimport.obj', opts=OPTS, input='maxEggImport.cxx')
  5455. TargetAdd('maxeggimport'+VNUM+'.dle', input='maxegg'+VNUM+'_loader.obj')
  5456. TargetAdd('maxeggimport'+VNUM+'.dle', input='maxprogs'+VNUM+'_maxeggimport.obj')
  5457. TargetAdd('maxeggimport'+VNUM+'.dle', input='libpandaegg.dll')
  5458. TargetAdd('maxeggimport'+VNUM+'.dle', input='libpanda.dll')
  5459. TargetAdd('maxeggimport'+VNUM+'.dle', input='libpandaexpress.dll')
  5460. TargetAdd('maxeggimport'+VNUM+'.dle', input='maxImportRes.res')
  5461. TargetAdd('maxeggimport'+VNUM+'.dle', input='maxEggImport.def', ipath=OPTS)
  5462. TargetAdd('maxeggimport'+VNUM+'.dle', input=COMMON_DTOOL_LIBS)
  5463. TargetAdd('maxeggimport'+VNUM+'.dle', opts=OPTS)
  5464. #
  5465. # DIRECTORY: pandatool/src/vrml/
  5466. #
  5467. if not PkgSkip("PANDATOOL"):
  5468. OPTS=['DIR:pandatool/src/vrml', 'ZLIB', 'BISONPREFIX_vrmlyy']
  5469. CreateFile(GetOutputDir()+"/include/vrmlParser.h")
  5470. TargetAdd('p3vrml_vrmlParser.obj', opts=OPTS, input='vrmlParser.yxx')
  5471. TargetAdd('vrmlParser.h', input='p3vrml_vrmlParser.obj', opts=['DEPENDENCYONLY'])
  5472. TargetAdd('p3vrml_vrmlLexer.obj', opts=OPTS, input='vrmlLexer.lxx')
  5473. TargetAdd('p3vrml_parse_vrml.obj', opts=OPTS, input='parse_vrml.cxx')
  5474. TargetAdd('p3vrml_standard_nodes.obj', opts=OPTS, input='standard_nodes.cxx')
  5475. TargetAdd('p3vrml_vrmlNode.obj', opts=OPTS, input='vrmlNode.cxx')
  5476. TargetAdd('p3vrml_vrmlNodeType.obj', opts=OPTS, input='vrmlNodeType.cxx')
  5477. TargetAdd('libp3vrml.lib', input='p3vrml_parse_vrml.obj')
  5478. TargetAdd('libp3vrml.lib', input='p3vrml_standard_nodes.obj')
  5479. TargetAdd('libp3vrml.lib', input='p3vrml_vrmlNode.obj')
  5480. TargetAdd('libp3vrml.lib', input='p3vrml_vrmlNodeType.obj')
  5481. TargetAdd('libp3vrml.lib', input='p3vrml_vrmlParser.obj')
  5482. TargetAdd('libp3vrml.lib', input='p3vrml_vrmlLexer.obj')
  5483. #
  5484. # DIRECTORY: pandatool/src/vrmlegg/
  5485. #
  5486. if not PkgSkip("PANDATOOL") and not PkgSkip("EGG"):
  5487. OPTS=['DIR:pandatool/src/vrmlegg', 'DIR:pandatool/src/vrml']
  5488. TargetAdd('p3vrmlegg_indexedFaceSet.obj', opts=OPTS, input='indexedFaceSet.cxx')
  5489. TargetAdd('p3vrmlegg_vrmlAppearance.obj', opts=OPTS, input='vrmlAppearance.cxx')
  5490. TargetAdd('p3vrmlegg_vrmlToEggConverter.obj', opts=OPTS, input='vrmlToEggConverter.cxx')
  5491. TargetAdd('libp3vrmlegg.lib', input='p3vrmlegg_indexedFaceSet.obj')
  5492. TargetAdd('libp3vrmlegg.lib', input='p3vrmlegg_vrmlAppearance.obj')
  5493. TargetAdd('libp3vrmlegg.lib', input='p3vrmlegg_vrmlToEggConverter.obj')
  5494. #
  5495. # DIRECTORY: pandatool/src/xfile/
  5496. #
  5497. if not PkgSkip("PANDATOOL"):
  5498. OPTS=['DIR:pandatool/src/xfile', 'ZLIB', 'BISONPREFIX_xyy', 'FLEXDASHI']
  5499. CreateFile(GetOutputDir()+"/include/xParser.h")
  5500. TargetAdd('p3xfile_xParser.obj', opts=OPTS, input='xParser.yxx')
  5501. TargetAdd('xParser.h', input='p3xfile_xParser.obj', opts=['DEPENDENCYONLY'])
  5502. TargetAdd('p3xfile_xLexer.obj', opts=OPTS, input='xLexer.lxx')
  5503. TargetAdd('p3xfile_composite1.obj', opts=OPTS, input='p3xfile_composite1.cxx')
  5504. TargetAdd('libp3xfile.lib', input='p3xfile_composite1.obj')
  5505. TargetAdd('libp3xfile.lib', input='p3xfile_xParser.obj')
  5506. TargetAdd('libp3xfile.lib', input='p3xfile_xLexer.obj')
  5507. #
  5508. # DIRECTORY: pandatool/src/xfileegg/
  5509. #
  5510. if not PkgSkip("PANDATOOL") and not PkgSkip("EGG"):
  5511. OPTS=['DIR:pandatool/src/xfileegg', 'DIR:pandatool/src/xfile']
  5512. TargetAdd('p3xfileegg_composite1.obj', opts=OPTS, input='p3xfileegg_composite1.cxx')
  5513. TargetAdd('libp3xfileegg.lib', input='p3xfileegg_composite1.obj')
  5514. #
  5515. # DIRECTORY: pandatool/src/ptloader/
  5516. #
  5517. if not PkgSkip("PANDATOOL") and not PkgSkip("EGG"):
  5518. if not PkgSkip("FCOLLADA"):
  5519. DefSymbol("FCOLLADA", "HAVE_FCOLLADA")
  5520. OPTS=['DIR:pandatool/src/ptloader', 'DIR:pandatool/src/flt', 'DIR:pandatool/src/lwo', 'DIR:pandatool/src/xfile', 'DIR:pandatool/src/xfileegg', 'DIR:pandatool/src/daeegg', 'BUILDING:PTLOADER', 'FCOLLADA']
  5521. TargetAdd('p3ptloader_config_ptloader.obj', opts=OPTS, input='config_ptloader.cxx', dep='dtool_have_fcollada.dat')
  5522. TargetAdd('p3ptloader_loaderFileTypePandatool.obj', opts=OPTS, input='loaderFileTypePandatool.cxx')
  5523. TargetAdd('libp3ptloader.dll', input='p3ptloader_config_ptloader.obj')
  5524. TargetAdd('libp3ptloader.dll', input='p3ptloader_loaderFileTypePandatool.obj')
  5525. TargetAdd('libp3ptloader.dll', input='libp3fltegg.lib')
  5526. TargetAdd('libp3ptloader.dll', input='libp3flt.lib')
  5527. TargetAdd('libp3ptloader.dll', input='libp3lwoegg.lib')
  5528. TargetAdd('libp3ptloader.dll', input='libp3lwo.lib')
  5529. TargetAdd('libp3ptloader.dll', input='libp3dxfegg.lib')
  5530. TargetAdd('libp3ptloader.dll', input='libp3dxf.lib')
  5531. TargetAdd('libp3ptloader.dll', input='libp3objegg.lib')
  5532. TargetAdd('libp3ptloader.dll', input='libp3vrmlegg.lib')
  5533. TargetAdd('libp3ptloader.dll', input='libp3vrml.lib')
  5534. TargetAdd('libp3ptloader.dll', input='libp3xfileegg.lib')
  5535. TargetAdd('libp3ptloader.dll', input='libp3xfile.lib')
  5536. if (PkgSkip("FCOLLADA")==0): TargetAdd('libp3ptloader.dll', input='libp3daeegg.lib')
  5537. TargetAdd('libp3ptloader.dll', input='libp3eggbase.lib')
  5538. TargetAdd('libp3ptloader.dll', input='libp3progbase.lib')
  5539. TargetAdd('libp3ptloader.dll', input='libp3converter.lib')
  5540. TargetAdd('libp3ptloader.dll', input='libp3pandatoolbase.lib')
  5541. TargetAdd('libp3ptloader.dll', input='libpandaegg.dll')
  5542. TargetAdd('libp3ptloader.dll', input=COMMON_PANDA_LIBS)
  5543. TargetAdd('libp3ptloader.dll', opts=['MODULE', 'ADVAPI', 'FCOLLADA', 'WINUSER'])
  5544. #
  5545. # DIRECTORY: pandatool/src/miscprogs/
  5546. #
  5547. # This is a bit of an esoteric tool, and it causes issues because
  5548. # it conflicts with tools of the same name in different packages.
  5549. #if (PkgSkip("PANDATOOL")==0):
  5550. # OPTS=['DIR:pandatool/src/miscprogs']
  5551. # TargetAdd('bin2c_binToC.obj', opts=OPTS, input='binToC.cxx')
  5552. # TargetAdd('bin2c.exe', input='bin2c_binToC.obj')
  5553. # TargetAdd('bin2c.exe', input='libp3progbase.lib')
  5554. # TargetAdd('bin2c.exe', input='libp3pandatoolbase.lib')
  5555. # TargetAdd('bin2c.exe', input=COMMON_PANDA_LIBS)
  5556. # TargetAdd('bin2c.exe', input='libp3pystub.lib')
  5557. # TargetAdd('bin2c.exe', opts=['ADVAPI'])
  5558. #
  5559. # DIRECTORY: pandatool/src/pstatserver/
  5560. #
  5561. if (PkgSkip("PANDATOOL")==0):
  5562. OPTS=['DIR:pandatool/src/pstatserver']
  5563. TargetAdd('p3pstatserver_composite1.obj', opts=OPTS, input='p3pstatserver_composite1.cxx')
  5564. TargetAdd('libp3pstatserver.lib', input='p3pstatserver_composite1.obj')
  5565. #
  5566. # DIRECTORY: pandatool/src/softprogs/
  5567. #
  5568. if (PkgSkip("PANDATOOL")==0):
  5569. OPTS=['DIR:pandatool/src/softprogs', 'OPENSSL']
  5570. TargetAdd('softcvs_softCVS.obj', opts=OPTS, input='softCVS.cxx')
  5571. TargetAdd('softcvs_softFilename.obj', opts=OPTS, input='softFilename.cxx')
  5572. TargetAdd('softcvs.exe', input='softcvs_softCVS.obj')
  5573. TargetAdd('softcvs.exe', input='softcvs_softFilename.obj')
  5574. TargetAdd('softcvs.exe', input='libp3progbase.lib')
  5575. TargetAdd('softcvs.exe', input='libp3pandatoolbase.lib')
  5576. TargetAdd('softcvs.exe', input=COMMON_PANDA_LIBS)
  5577. TargetAdd('softcvs.exe', opts=['ADVAPI'])
  5578. #
  5579. # DIRECTORY: pandatool/src/text-stats/
  5580. #
  5581. if (PkgSkip("PANDATOOL")==0):
  5582. OPTS=['DIR:pandatool/src/text-stats']
  5583. TargetAdd('text-stats_textMonitor.obj', opts=OPTS, input='textMonitor.cxx')
  5584. TargetAdd('text-stats_textStats.obj', opts=OPTS, input='textStats.cxx')
  5585. TargetAdd('text-stats.exe', input='text-stats_textMonitor.obj')
  5586. TargetAdd('text-stats.exe', input='text-stats_textStats.obj')
  5587. TargetAdd('text-stats.exe', input='libp3progbase.lib')
  5588. TargetAdd('text-stats.exe', input='libp3pstatserver.lib')
  5589. TargetAdd('text-stats.exe', input='libp3pandatoolbase.lib')
  5590. TargetAdd('text-stats.exe', input=COMMON_PANDA_LIBS)
  5591. TargetAdd('text-stats.exe', opts=['ADVAPI'])
  5592. #
  5593. # DIRECTORY: pandatool/src/vrmlprogs/
  5594. #
  5595. if not PkgSkip("PANDATOOL"):
  5596. OPTS=['DIR:pandatool/src/vrmlprogs', 'DIR:pandatool/src/vrml', 'DIR:pandatool/src/vrmlegg']
  5597. TargetAdd('vrml-trans_vrmlTrans.obj', opts=OPTS, input='vrmlTrans.cxx')
  5598. TargetAdd('vrml-trans.exe', input='vrml-trans_vrmlTrans.obj')
  5599. TargetAdd('vrml-trans.exe', input='libp3vrml.lib')
  5600. TargetAdd('vrml-trans.exe', input='libp3progbase.lib')
  5601. TargetAdd('vrml-trans.exe', input='libp3pandatoolbase.lib')
  5602. TargetAdd('vrml-trans.exe', input=COMMON_PANDA_LIBS)
  5603. TargetAdd('vrml-trans.exe', opts=['ADVAPI'])
  5604. if not PkgSkip("EGG"):
  5605. TargetAdd('vrml2egg_vrmlToEgg.obj', opts=OPTS, input='vrmlToEgg.cxx')
  5606. TargetAdd('vrml2egg.exe', input='vrml2egg_vrmlToEgg.obj')
  5607. TargetAdd('vrml2egg.exe', input='libp3vrmlegg.lib')
  5608. TargetAdd('vrml2egg.exe', input='libp3vrml.lib')
  5609. TargetAdd('vrml2egg.exe', input=COMMON_EGG2X_LIBS)
  5610. TargetAdd('vrml2egg.exe', opts=['ADVAPI'])
  5611. #
  5612. # DIRECTORY: pandatool/src/win-stats/
  5613. # DIRECTORY: pandatool/src/gtk-stats/
  5614. #
  5615. if (PkgSkip("PANDATOOL")==0 and (GetTarget() == 'windows' or PkgSkip("GTK2")==0)):
  5616. if GetTarget() == 'windows':
  5617. OPTS=['DIR:pandatool/src/win-stats']
  5618. TargetAdd('pstats_composite1.obj', opts=OPTS, input='winstats_composite1.cxx')
  5619. else:
  5620. OPTS=['DIR:pandatool/src/gtk-stats', 'GTK2']
  5621. TargetAdd('pstats_composite1.obj', opts=OPTS, input='gtkstats_composite1.cxx')
  5622. TargetAdd('pstats.exe', input='pstats_composite1.obj')
  5623. TargetAdd('pstats.exe', input='libp3pstatserver.lib')
  5624. TargetAdd('pstats.exe', input='libp3progbase.lib')
  5625. TargetAdd('pstats.exe', input='libp3pandatoolbase.lib')
  5626. TargetAdd('pstats.exe', input=COMMON_PANDA_LIBS)
  5627. TargetAdd('pstats.exe', opts=['SUBSYSTEM:WINDOWS', 'WINSOCK', 'WINIMM', 'WINGDI', 'WINKERNEL', 'WINOLDNAMES', 'WINUSER', 'WINMM', 'GTK2'])
  5628. #
  5629. # DIRECTORY: pandatool/src/xfileprogs/
  5630. #
  5631. if not PkgSkip("PANDATOOL"):
  5632. OPTS=['DIR:pandatool/src/xfileprogs', 'DIR:pandatool/src/xfile', 'DIR:pandatool/src/xfileegg']
  5633. TargetAdd('x-trans_xFileTrans.obj', opts=OPTS, input='xFileTrans.cxx')
  5634. TargetAdd('x-trans.exe', input='x-trans_xFileTrans.obj')
  5635. TargetAdd('x-trans.exe', input='libp3progbase.lib')
  5636. TargetAdd('x-trans.exe', input='libp3xfile.lib')
  5637. TargetAdd('x-trans.exe', input='libp3pandatoolbase.lib')
  5638. TargetAdd('x-trans.exe', input=COMMON_PANDA_LIBS)
  5639. TargetAdd('x-trans.exe', opts=['ADVAPI'])
  5640. if not PkgSkip("EGG"):
  5641. TargetAdd('egg2x_eggToX.obj', opts=OPTS, input='eggToX.cxx')
  5642. TargetAdd('egg2x.exe', input='egg2x_eggToX.obj')
  5643. TargetAdd('egg2x.exe', input='libp3xfileegg.lib')
  5644. TargetAdd('egg2x.exe', input='libp3xfile.lib')
  5645. TargetAdd('egg2x.exe', input=COMMON_EGG2X_LIBS)
  5646. TargetAdd('egg2x.exe', opts=['ADVAPI'])
  5647. TargetAdd('x2egg_xFileToEgg.obj', opts=OPTS, input='xFileToEgg.cxx')
  5648. TargetAdd('x2egg.exe', input='x2egg_xFileToEgg.obj')
  5649. TargetAdd('x2egg.exe', input='libp3xfileegg.lib')
  5650. TargetAdd('x2egg.exe', input='libp3xfile.lib')
  5651. TargetAdd('x2egg.exe', input=COMMON_EGG2X_LIBS)
  5652. TargetAdd('x2egg.exe', opts=['ADVAPI'])
  5653. #
  5654. # DIRECTORY: pandatool/src/mayaprogs/
  5655. #
  5656. for VER in MAYAVERSIONS:
  5657. VNUM = VER[4:]
  5658. if not PkgSkip(VER) and not PkgSkip("PANDATOOL") and not PkgSkip("EGG"):
  5659. if GetTarget() == 'darwin' and int(VNUM) >= 2012:
  5660. ARCH_OPTS = ['NOARCH:PPC', 'NOARCH:I386']
  5661. if len(OSX_ARCHS) != 0 and 'x86_64' not in OSX_ARCHS:
  5662. continue
  5663. elif GetTarget() == 'darwin' and int(VNUM) >= 2009:
  5664. ARCH_OPTS = ['NOARCH:PPC']
  5665. elif GetTarget() == 'darwin':
  5666. ARCH_OPTS = ['NOARCH:X86_64']
  5667. else:
  5668. ARCH_OPTS = []
  5669. OPTS=['DIR:pandatool/src/mayaprogs', 'DIR:pandatool/src/maya', 'DIR:pandatool/src/mayaegg', 'DIR:pandatool/src/cvscopy', 'BUILDING:MISC', VER] + ARCH_OPTS
  5670. TargetAdd('mayaeggimport'+VNUM+'_mayaeggimport.obj', opts=OPTS, input='mayaEggImport.cxx')
  5671. TargetAdd('mayaeggimport'+VNUM+'.mll', input='mayaegg'+VNUM+'_loader.obj')
  5672. TargetAdd('mayaeggimport'+VNUM+'.mll', input='mayaeggimport'+VNUM+'_mayaeggimport.obj')
  5673. TargetAdd('mayaeggimport'+VNUM+'.mll', input='libpandaegg.dll')
  5674. TargetAdd('mayaeggimport'+VNUM+'.mll', input=COMMON_PANDA_LIBS)
  5675. #if GetTarget() == 'windows':
  5676. # TargetAdd('mayaeggimport'+VNUM+'.mll', input='libp3pystub.lib')
  5677. TargetAdd('mayaeggimport'+VNUM+'.mll', opts=['ADVAPI', VER]+ARCH_OPTS)
  5678. TargetAdd('mayaloader'+VNUM+'_config_mayaloader.obj', opts=OPTS, input='config_mayaloader.cxx')
  5679. TargetAdd('libp3mayaloader'+VNUM+'.dll', input='mayaloader'+VNUM+'_config_mayaloader.obj')
  5680. TargetAdd('libp3mayaloader'+VNUM+'.dll', input='libmayaegg'+VNUM+'.lib')
  5681. TargetAdd('libp3mayaloader'+VNUM+'.dll', input='libp3ptloader.dll')
  5682. TargetAdd('libp3mayaloader'+VNUM+'.dll', input='libmaya'+VNUM+'.lib')
  5683. TargetAdd('libp3mayaloader'+VNUM+'.dll', input='libp3fltegg.lib')
  5684. TargetAdd('libp3mayaloader'+VNUM+'.dll', input='libp3flt.lib')
  5685. TargetAdd('libp3mayaloader'+VNUM+'.dll', input='libp3lwoegg.lib')
  5686. TargetAdd('libp3mayaloader'+VNUM+'.dll', input='libp3lwo.lib')
  5687. TargetAdd('libp3mayaloader'+VNUM+'.dll', input='libp3dxfegg.lib')
  5688. TargetAdd('libp3mayaloader'+VNUM+'.dll', input='libp3dxf.lib')
  5689. TargetAdd('libp3mayaloader'+VNUM+'.dll', input='libp3objegg.lib')
  5690. TargetAdd('libp3mayaloader'+VNUM+'.dll', input='libp3vrmlegg.lib')
  5691. TargetAdd('libp3mayaloader'+VNUM+'.dll', input='libp3vrml.lib')
  5692. TargetAdd('libp3mayaloader'+VNUM+'.dll', input='libp3xfileegg.lib')
  5693. TargetAdd('libp3mayaloader'+VNUM+'.dll', input='libp3xfile.lib')
  5694. TargetAdd('libp3mayaloader'+VNUM+'.dll', input='libp3eggbase.lib')
  5695. TargetAdd('libp3mayaloader'+VNUM+'.dll', input='libp3progbase.lib')
  5696. TargetAdd('libp3mayaloader'+VNUM+'.dll', input='libp3converter.lib')
  5697. TargetAdd('libp3mayaloader'+VNUM+'.dll', input='libp3pandatoolbase.lib')
  5698. TargetAdd('libp3mayaloader'+VNUM+'.dll', input='libpandaegg.dll')
  5699. TargetAdd('libp3mayaloader'+VNUM+'.dll', input=COMMON_PANDA_LIBS)
  5700. TargetAdd('libp3mayaloader'+VNUM+'.dll', opts=['ADVAPI', VER]+ARCH_OPTS)
  5701. TargetAdd('mayapview'+VNUM+'_mayaPview.obj', opts=OPTS, input='mayaPview.cxx')
  5702. TargetAdd('libmayapview'+VNUM+'.mll', input='mayapview'+VNUM+'_mayaPview.obj')
  5703. TargetAdd('libmayapview'+VNUM+'.mll', input='libmayaegg'+VNUM+'.lib')
  5704. TargetAdd('libmayapview'+VNUM+'.mll', input='libmaya'+VNUM+'.lib')
  5705. TargetAdd('libmayapview'+VNUM+'.mll', input='libp3framework.dll')
  5706. if GetTarget() == 'windows':
  5707. TargetAdd('libmayapview'+VNUM+'.mll', input=COMMON_EGG2X_LIBS)
  5708. else:
  5709. TargetAdd('libmayapview'+VNUM+'.mll', input=COMMON_EGG2X_LIBS)
  5710. TargetAdd('libmayapview'+VNUM+'.mll', opts=['ADVAPI', VER]+ARCH_OPTS)
  5711. TargetAdd('maya2egg'+VNUM+'_mayaToEgg.obj', opts=OPTS, input='mayaToEgg.cxx')
  5712. TargetAdd('maya2egg'+VNUM+'_bin.exe', input='maya2egg'+VNUM+'_mayaToEgg.obj')
  5713. TargetAdd('maya2egg'+VNUM+'_bin.exe', input='libmayaegg'+VNUM+'.lib')
  5714. TargetAdd('maya2egg'+VNUM+'_bin.exe', input='libmaya'+VNUM+'.lib')
  5715. if GetTarget() == 'windows':
  5716. TargetAdd('maya2egg'+VNUM+'_bin.exe', input=COMMON_EGG2X_LIBS)
  5717. else:
  5718. TargetAdd('maya2egg'+VNUM+'_bin.exe', input=COMMON_EGG2X_LIBS)
  5719. TargetAdd('maya2egg'+VNUM+'_bin.exe', opts=['ADVAPI', VER]+ARCH_OPTS)
  5720. TargetAdd('egg2maya'+VNUM+'_eggToMaya.obj', opts=OPTS, input='eggToMaya.cxx')
  5721. TargetAdd('egg2maya'+VNUM+'_bin.exe', input='egg2maya'+VNUM+'_eggToMaya.obj')
  5722. TargetAdd('egg2maya'+VNUM+'_bin.exe', input='libmayaegg'+VNUM+'.lib')
  5723. TargetAdd('egg2maya'+VNUM+'_bin.exe', input='libmaya'+VNUM+'.lib')
  5724. if GetTarget() == 'windows':
  5725. TargetAdd('egg2maya'+VNUM+'_bin.exe', input=COMMON_EGG2X_LIBS)
  5726. else:
  5727. TargetAdd('egg2maya'+VNUM+'_bin.exe', input=COMMON_EGG2X_LIBS)
  5728. TargetAdd('egg2maya'+VNUM+'_bin.exe', opts=['ADVAPI', VER]+ARCH_OPTS)
  5729. TargetAdd('mayacopy'+VNUM+'_mayaCopy.obj', opts=OPTS, input='mayaCopy.cxx')
  5730. TargetAdd('mayacopy'+VNUM+'_bin.exe', input='mayacopy'+VNUM+'_mayaCopy.obj')
  5731. TargetAdd('mayacopy'+VNUM+'_bin.exe', input='libp3cvscopy.lib')
  5732. TargetAdd('mayacopy'+VNUM+'_bin.exe', input='libmaya'+VNUM+'.lib')
  5733. if GetTarget() == 'windows':
  5734. TargetAdd('mayacopy'+VNUM+'_bin.exe', input=COMMON_EGG2X_LIBS)
  5735. else:
  5736. TargetAdd('mayacopy'+VNUM+'_bin.exe', input=COMMON_EGG2X_LIBS)
  5737. TargetAdd('mayacopy'+VNUM+'_bin.exe', opts=['ADVAPI', VER]+ARCH_OPTS)
  5738. TargetAdd('mayasavepview'+VNUM+'_mayaSavePview.obj', opts=OPTS, input='mayaSavePview.cxx')
  5739. TargetAdd('libmayasavepview'+VNUM+'.mll', input='mayasavepview'+VNUM+'_mayaSavePview.obj')
  5740. TargetAdd('libmayasavepview'+VNUM+'.mll', opts=['ADVAPI', VER]+ARCH_OPTS)
  5741. TargetAdd('mayapath'+VNUM+'.obj', opts=OPTS, input='mayapath.cxx')
  5742. TargetAdd('maya2egg'+VNUM+'.exe', input='mayapath'+VNUM+'.obj')
  5743. TargetAdd('maya2egg'+VNUM+'.exe', input='libpandaexpress.dll')
  5744. TargetAdd('maya2egg'+VNUM+'.exe', input=COMMON_DTOOL_LIBS)
  5745. TargetAdd('maya2egg'+VNUM+'.exe', opts=['ADVAPI']+ARCH_OPTS)
  5746. TargetAdd('egg2maya'+VNUM+'.exe', input='mayapath'+VNUM+'.obj')
  5747. TargetAdd('egg2maya'+VNUM+'.exe', input='libpandaexpress.dll')
  5748. TargetAdd('egg2maya'+VNUM+'.exe', input=COMMON_DTOOL_LIBS)
  5749. TargetAdd('egg2maya'+VNUM+'.exe', opts=['ADVAPI']+ARCH_OPTS)
  5750. TargetAdd('mayacopy'+VNUM+'.exe', input='mayapath'+VNUM+'.obj')
  5751. TargetAdd('mayacopy'+VNUM+'.exe', input='libpandaexpress.dll')
  5752. TargetAdd('mayacopy'+VNUM+'.exe', input=COMMON_DTOOL_LIBS)
  5753. TargetAdd('mayacopy'+VNUM+'.exe', opts=['ADVAPI']+ARCH_OPTS)
  5754. #
  5755. # DIRECTORY: contrib/src/ai/
  5756. #
  5757. if (PkgSkip("CONTRIB")==0 and not RUNTIME):
  5758. OPTS=['DIR:contrib/src/ai', 'BUILDING:PANDAAI']
  5759. TargetAdd('p3ai_composite1.obj', opts=OPTS, input='p3ai_composite1.cxx')
  5760. TargetAdd('libpandaai.dll', input='p3ai_composite1.obj')
  5761. TargetAdd('libpandaai.dll', input=COMMON_PANDA_LIBS)
  5762. OPTS=['DIR:contrib/src/ai', 'PYTHON']
  5763. IGATEFILES=GetDirectoryContents('contrib/src/ai', ["*.h", "*_composite*.cxx"])
  5764. TargetAdd('libpandaai.in', opts=OPTS, input=IGATEFILES)
  5765. TargetAdd('libpandaai.in', opts=['IMOD:panda3d.ai', 'ILIB:libpandaai', 'SRCDIR:contrib/src/ai'])
  5766. TargetAdd('libpandaai_igate.obj', input='libpandaai.in', opts=["DEPENDENCYONLY"])
  5767. TargetAdd('ai_module.obj', input='libpandaai.in')
  5768. TargetAdd('ai_module.obj', opts=OPTS)
  5769. TargetAdd('ai_module.obj', opts=['IMOD:panda3d.ai', 'ILIB:ai', 'IMPORT:panda3d.core'])
  5770. TargetAdd('ai.pyd', input='ai_module.obj')
  5771. TargetAdd('ai.pyd', input='libpandaai_igate.obj')
  5772. TargetAdd('ai.pyd', input='libpandaai.dll')
  5773. TargetAdd('ai.pyd', input='libp3interrogatedb.dll')
  5774. TargetAdd('ai.pyd', input=COMMON_PANDA_LIBS)
  5775. TargetAdd('ai.pyd', opts=['PYTHON'])
  5776. #
  5777. # DIRECTORY: contrib/src/rplight/
  5778. #
  5779. if not PkgSkip("CONTRIB") and not PkgSkip("PYTHON") and not RUNTIME:
  5780. OPTS=['DIR:contrib/src/rplight', 'BUILDING:RPLIGHT', 'PYTHON']
  5781. TargetAdd('p3rplight_composite1.obj', opts=OPTS, input='p3rplight_composite1.cxx')
  5782. IGATEFILES=GetDirectoryContents('contrib/src/rplight', ["*.h", "*_composite*.cxx"])
  5783. TargetAdd('libp3rplight.in', opts=OPTS, input=IGATEFILES)
  5784. TargetAdd('libp3rplight.in', opts=['IMOD:panda3d._rplight', 'ILIB:libp3rplight', 'SRCDIR:contrib/src/rplight'])
  5785. TargetAdd('libp3rplight_igate.obj', input='libp3rplight.in', opts=["DEPENDENCYONLY"])
  5786. TargetAdd('rplight_module.obj', input='libp3rplight.in')
  5787. TargetAdd('rplight_module.obj', opts=OPTS)
  5788. TargetAdd('rplight_module.obj', opts=['IMOD:panda3d._rplight', 'ILIB:_rplight', 'IMPORT:panda3d.core'])
  5789. TargetAdd('_rplight.pyd', input='rplight_module.obj')
  5790. TargetAdd('_rplight.pyd', input='libp3rplight_igate.obj')
  5791. TargetAdd('_rplight.pyd', input='p3rplight_composite1.obj')
  5792. TargetAdd('_rplight.pyd', input='libp3interrogatedb.dll')
  5793. TargetAdd('_rplight.pyd', input=COMMON_PANDA_LIBS)
  5794. TargetAdd('_rplight.pyd', opts=['PYTHON'])
  5795. #
  5796. # DIRECTORY: pandatool/src/deploy-stub
  5797. #
  5798. if PkgSkip("PYTHON") == 0:
  5799. OPTS=['DIR:pandatool/src/deploy-stub', 'BUILDING:DEPLOYSTUB', 'PYTHON']
  5800. TargetAdd('deploy-stub.obj', opts=OPTS, input='deploy-stub.c')
  5801. if GetTarget() == 'windows':
  5802. TargetAdd('frozen_dllmain.obj', opts=OPTS, input='frozen_dllmain.c')
  5803. if GetTarget() == 'linux' or GetTarget() == 'freebsd':
  5804. # Setup rpath so libs can be found in the same directory as the deployed game
  5805. LibName('DEPLOYSTUB', "-Wl,-rpath,\$ORIGIN")
  5806. LibName('DEPLOYSTUB', "-Wl,-z,origin")
  5807. LibName('DEPLOYSTUB', "-rdynamic")
  5808. TargetAdd('deploy-stub.exe', input='deploy-stub.obj')
  5809. if GetTarget() == 'windows':
  5810. TargetAdd('deploy-stub.exe', input='frozen_dllmain.obj')
  5811. TargetAdd('deploy-stub.exe', opts=['WINSHELL', 'PYTHON', 'DEPLOYSTUB', 'NOICON'])
  5812. if GetTarget() == 'windows':
  5813. TargetAdd('deploy-stubw.exe', input='deploy-stub.obj')
  5814. TargetAdd('deploy-stubw.exe', input='frozen_dllmain.obj')
  5815. TargetAdd('deploy-stubw.exe', opts=['SUBSYSTEM:WINDOWS', 'WINSHELL', 'PYTHON', 'DEPLOYSTUB', 'NOICON'])
  5816. elif GetTarget() == 'darwin':
  5817. DefSymbol('MACOS_APP_BUNDLE', 'MACOS_APP_BUNDLE')
  5818. OPTS = OPTS + ['MACOS_APP_BUNDLE']
  5819. TargetAdd('deploy-stubw.obj', opts=OPTS, input='deploy-stub.c')
  5820. TargetAdd('deploy-stubw.exe', input='deploy-stubw.obj')
  5821. TargetAdd('deploy-stubw.exe', opts=['MACOS_APP_BUNDLE', 'PYTHON', 'DEPLOYSTUB', 'NOICON'])
  5822. #
  5823. # Generate the models directory and samples directory
  5824. #
  5825. if not PkgSkip("DIRECT") and not RUNTIME and not PkgSkip("EGG"):
  5826. model_extensions = ["*.egg"]
  5827. # Check if we have access to an flt2egg utility, either self-compiled or on the system.
  5828. if ((PkgSkip("PANDATOOL")==0 and GetHost()==GetTarget()) or LocateBinary('flt2egg')):
  5829. model_extensions.append("*.flt")
  5830. for model in GetDirectoryContents("dmodels/src/misc", model_extensions):
  5831. if (PkgSkip("ZLIB")==0 and PkgSkip("DEPLOYTOOLS")==0 and not RTDIST):
  5832. newname = model[:-4] + ".egg.pz"
  5833. else:
  5834. newname = model[:-4] + ".egg"
  5835. TargetAdd(GetOutputDir()+"/models/misc/"+newname, input="dmodels/src/misc/"+model)
  5836. for model in GetDirectoryContents("dmodels/src/gui", model_extensions):
  5837. if (PkgSkip("ZLIB")==0 and PkgSkip("DEPLOYTOOLS")==0 and not RTDIST):
  5838. newname = model[:-4] + ".egg.pz"
  5839. else:
  5840. newname = model[:-4] + ".egg"
  5841. TargetAdd(GetOutputDir()+"/models/gui/"+newname, input="dmodels/src/gui/"+model)
  5842. for model in GetDirectoryContents("models", model_extensions):
  5843. if (PkgSkip("ZLIB")==0 and PkgSkip("DEPLOYTOOLS")==0 and not RTDIST):
  5844. newname = model[:-4] + ".egg.pz"
  5845. else:
  5846. newname = model[:-4] + ".egg"
  5847. TargetAdd(GetOutputDir()+"/models/"+newname, input="models/"+model)
  5848. if not PkgSkip("DIRECT") and not RUNTIME:
  5849. CopyAllFiles(GetOutputDir()+"/models/audio/sfx/", "dmodels/src/audio/sfx/", ".wav")
  5850. CopyAllFiles(GetOutputDir()+"/models/icons/", "dmodels/src/icons/", ".gif")
  5851. CopyAllFiles(GetOutputDir()+"/models/maps/", "models/maps/", ".jpg")
  5852. CopyAllFiles(GetOutputDir()+"/models/maps/", "models/maps/", ".png")
  5853. CopyAllFiles(GetOutputDir()+"/models/maps/", "models/maps/", ".rgb")
  5854. CopyAllFiles(GetOutputDir()+"/models/maps/", "models/maps/", ".rgba")
  5855. CopyAllFiles(GetOutputDir()+"/models/maps/", "dmodels/src/maps/", ".jpg")
  5856. CopyAllFiles(GetOutputDir()+"/models/maps/", "dmodels/src/maps/", ".png")
  5857. CopyAllFiles(GetOutputDir()+"/models/maps/", "dmodels/src/maps/", ".rgb")
  5858. CopyAllFiles(GetOutputDir()+"/models/maps/", "dmodels/src/maps/", ".rgba")
  5859. #
  5860. # Build the rtdist.
  5861. #
  5862. if (RTDIST):
  5863. OPTS=['DIR:direct/src/p3d']
  5864. TargetAdd('_panda3d', opts=OPTS, input='panda3d.pdef')
  5865. TargetAdd('_coreapi', opts=OPTS, input='coreapi.pdef')
  5866. TargetAdd('_thirdparty', opts=OPTS, input='thirdparty.pdef')
  5867. #
  5868. # If we have a host URL and distributor, we can make .p3d deployment tools.
  5869. #
  5870. if not PkgSkip("DIRECT") and not PkgSkip("DEPLOYTOOLS") and not RUNTIME and not RTDIST and HOST_URL and DISTRIBUTOR:
  5871. OPTS=['DIR:direct/src/p3d']
  5872. TargetAdd('packp3d.p3d', opts=OPTS, input='panda3d.pdef')
  5873. TargetAdd('pdeploy.p3d', opts=OPTS, input='panda3d.pdef')
  5874. TargetAdd('pmerge.p3d', opts=OPTS, input='panda3d.pdef')
  5875. TargetAdd('ppackage.p3d', opts=OPTS, input='panda3d.pdef')
  5876. TargetAdd('ppatcher.p3d', opts=OPTS, input='panda3d.pdef')
  5877. ##########################################################################################
  5878. #
  5879. # Dependency-Based Distributed Build System.
  5880. #
  5881. ##########################################################################################
  5882. DEPENDENCYQUEUE=[]
  5883. for target in TARGET_LIST:
  5884. name = target.name
  5885. inputs = target.inputs
  5886. opts = target.opts
  5887. deps = target.deps
  5888. DEPENDENCYQUEUE.append([CompileAnything, [name, inputs, opts], [name], deps, []])
  5889. def BuildWorker(taskqueue, donequeue):
  5890. while True:
  5891. try:
  5892. task = taskqueue.get(timeout=1)
  5893. except:
  5894. ProgressOutput(None, "Waiting for tasks...")
  5895. task = taskqueue.get()
  5896. sys.stdout.flush()
  5897. if (task == 0): return
  5898. try:
  5899. task[0](*task[1])
  5900. donequeue.put(task)
  5901. except:
  5902. donequeue.put(0)
  5903. def AllSourcesReady(task, pending):
  5904. sources = task[3]
  5905. for x in sources:
  5906. if (x in pending):
  5907. return 0
  5908. sources = task[1][1]
  5909. for x in sources:
  5910. if (x in pending):
  5911. return 0
  5912. altsources = task[4]
  5913. for x in altsources:
  5914. if (x in pending):
  5915. return 0
  5916. return 1
  5917. def ParallelMake(tasklist):
  5918. # Create the communication queues.
  5919. donequeue = queue.Queue()
  5920. taskqueue = queue.Queue()
  5921. # Build up a table listing all the pending targets
  5922. #task = [CompileAnything, [name, inputs, opts], [name], deps, []]
  5923. # task[2] = [name]
  5924. # task[3] = deps
  5925. # The python tool package, in particular fltegg seems to throw parallelmake off
  5926. # A hack for now is to divide the tasklist into two parts, one to be built in parallel
  5927. # and another subpart to be built sequentially. The most time consuming part of the process
  5928. # is the c++ code generation anyways.
  5929. tasklist_seq = []
  5930. i = 0
  5931. while i < len(tasklist):
  5932. if tasklist[i][2][0].endswith('.egg') | tasklist[i][2][0].endswith('.egg.pz'):
  5933. break
  5934. i += 1
  5935. if i < len(tasklist):
  5936. tasklist_seq = tasklist[i:]
  5937. tasklist = tasklist[:i]
  5938. iNumStartingTasks = len(tasklist)
  5939. pending = {}
  5940. for task in tasklist:
  5941. for target in task[2]:
  5942. pending[target] = 1
  5943. # Create the workers
  5944. for slave in range(THREADCOUNT):
  5945. th = threading.Thread(target=BuildWorker, args=[taskqueue, donequeue])
  5946. th.setDaemon(1)
  5947. th.start()
  5948. # Feed tasks to the workers.
  5949. tasksqueued = 0
  5950. while True:
  5951. if (tasksqueued < THREADCOUNT):
  5952. extras = []
  5953. for task in tasklist:
  5954. if (tasksqueued < THREADCOUNT) and (AllSourcesReady(task, pending)):
  5955. if (NeedsBuild(task[2], task[3])):
  5956. tasksqueued += 1
  5957. taskqueue.put(task)
  5958. else:
  5959. for target in task[2]:
  5960. del pending[target]
  5961. else:
  5962. extras.append(task)
  5963. tasklist = extras
  5964. sys.stdout.flush()
  5965. if (tasksqueued == 0): break
  5966. donetask = donequeue.get()
  5967. if (donetask == 0):
  5968. exit("Build process aborting.")
  5969. sys.stdout.flush()
  5970. tasksqueued -= 1
  5971. JustBuilt(donetask[2], donetask[3])
  5972. for target in donetask[2]:
  5973. del pending[target]
  5974. # Kill the workers.
  5975. for slave in range(THREADCOUNT):
  5976. taskqueue.put(0)
  5977. # Make sure there aren't any unsatisfied tasks
  5978. if len(tasklist) > 0:
  5979. exit("Dependency problems: " + str(len(tasklist)) + " tasks not finished. First task unsatisfied: "+str(tasklist[0][2]))
  5980. SequentialMake(tasklist_seq)
  5981. def SequentialMake(tasklist):
  5982. i = 0
  5983. for task in tasklist:
  5984. if (NeedsBuild(task[2], task[3])):
  5985. task[0](*task[1] + [(i * 100.0) / len(tasklist)])
  5986. JustBuilt(task[2], task[3])
  5987. i += 1
  5988. def RunDependencyQueue(tasklist):
  5989. if (THREADCOUNT!=0):
  5990. ParallelMake(tasklist)
  5991. else:
  5992. SequentialMake(tasklist)
  5993. try:
  5994. RunDependencyQueue(DEPENDENCYQUEUE)
  5995. except:
  5996. SaveDependencyCache()
  5997. raise
  5998. # Run the test suite.
  5999. if RUNTESTS:
  6000. cmdstr = BracketNameWithQuotes(SDK["PYTHONEXEC"].replace('\\', '/'))
  6001. if sys.version_info >= (2, 6):
  6002. cmdstr += " -B"
  6003. cmdstr += " -m pytest tests"
  6004. if GetVerbose():
  6005. cmdstr += " --verbose"
  6006. oscmd(cmdstr)
  6007. ##########################################################################################
  6008. #
  6009. # The Installers
  6010. #
  6011. # Under windows, we can build an 'exe' package using NSIS
  6012. # Under linux, we can build a 'deb' package or an 'rpm' package.
  6013. # Under OSX, we can make a 'dmg' package.
  6014. #
  6015. ##########################################################################################
  6016. def MakeInstallerNSIS(file, title, installdir):
  6017. if (os.path.isfile(file)):
  6018. os.remove(file)
  6019. elif (os.path.isdir(file)):
  6020. shutil.rmtree(file)
  6021. if GetTargetArch() == 'x64':
  6022. regview = '64'
  6023. else:
  6024. regview = '32'
  6025. if (RUNTIME):
  6026. # Invoke the make_installer script.
  6027. AddToPathEnv("PATH", GetOutputDir() + "\\bin")
  6028. AddToPathEnv("PATH", GetOutputDir() + "\\plugins")
  6029. cmd = sys.executable + " -B -u " + os.path.join("direct", "src", "plugin_installer", "make_installer.py")
  6030. cmd += " --version %s --regview %s" % (VERSION, regview)
  6031. if GetTargetArch() == 'x64':
  6032. cmd += " --install \"$PROGRAMFILES64\\Panda3D\" "
  6033. else:
  6034. cmd += " --install \"$PROGRAMFILES32\\Panda3D\" "
  6035. oscmd(cmd)
  6036. shutil.move(os.path.join("direct", "src", "plugin_installer", "p3d-setup.exe"), file)
  6037. return
  6038. print("Building "+title+" installer at %s" % (file))
  6039. if (COMPRESSOR != "lzma"):
  6040. print("Note: you are using zlib, which is faster, but lzma gives better compression.")
  6041. if (os.path.exists("nsis-output.exe")):
  6042. os.remove("nsis-output.exe")
  6043. WriteFile(GetOutputDir()+"/tmp/__init__.py", "")
  6044. nsis_defs = {
  6045. 'COMPRESSOR' : COMPRESSOR,
  6046. 'TITLE' : title,
  6047. 'INSTALLDIR' : installdir,
  6048. 'OUTFILE' : '..\\' + file,
  6049. 'BUILT' : '..\\' + GetOutputDir(),
  6050. 'SOURCE' : '..',
  6051. 'PYVER' : SDK["PYTHONVERSION"][6:9],
  6052. 'REGVIEW' : regview,
  6053. }
  6054. if GetHost() == 'windows':
  6055. cmd = os.path.join(GetThirdpartyBase(), 'win-nsis', 'makensis') + ' /V2'
  6056. for item in nsis_defs.items():
  6057. cmd += ' /D%s="%s"' % item
  6058. else:
  6059. cmd = 'makensis -V2'
  6060. for item in nsis_defs.items():
  6061. cmd += ' -D%s="%s"' % item
  6062. cmd += ' "makepanda\installer.nsi"'
  6063. oscmd(cmd)
  6064. def MakeDebugSymbolArchive(zipname, dirname):
  6065. import zipfile
  6066. zip = zipfile.ZipFile(zipname, 'w', zipfile.ZIP_DEFLATED)
  6067. for fn in glob.glob(os.path.join(GetOutputDir(), 'bin', '*.pdb')):
  6068. zip.write(fn, dirname + '/bin/' + os.path.basename(fn))
  6069. for fn in glob.glob(os.path.join(GetOutputDir(), 'panda3d', '*.pdb')):
  6070. zip.write(fn, dirname + '/panda3d/' + os.path.basename(fn))
  6071. for fn in glob.glob(os.path.join(GetOutputDir(), 'plugins', '*.pdb')):
  6072. zip.write(fn, dirname + '/plugins/' + os.path.basename(fn))
  6073. for fn in glob.glob(os.path.join(GetOutputDir(), 'python', '*.pdb')):
  6074. zip.write(fn, dirname + '/python/' + os.path.basename(fn))
  6075. for fn in glob.glob(os.path.join(GetOutputDir(), 'python', 'DLLs', '*.pdb')):
  6076. zip.write(fn, dirname + '/python/DLLs/' + os.path.basename(fn))
  6077. zip.close()
  6078. INSTALLER_DEB_FILE="""
  6079. Package: panda3dMAJOR
  6080. Version: VERSION
  6081. Section: libdevel
  6082. Priority: optional
  6083. Architecture: ARCH
  6084. Essential: no
  6085. Depends: DEPENDS
  6086. Recommends: RECOMMENDS
  6087. Suggests: panda3d-runtime
  6088. Provides: panda3d
  6089. Conflicts: panda3d
  6090. Replaces: panda3d
  6091. Maintainer: rdb <[email protected]>
  6092. Installed-Size: INSTSIZE
  6093. Description: Panda3D free 3D engine SDK
  6094. Panda3D is a game engine which includes graphics, audio, I/O, collision detection, and other abilities relevant to the creation of 3D games. Panda3D is open source and free software under the revised BSD license, and can be used for both free and commercial game development at no financial cost.
  6095. Panda3D's intended game-development language is Python. The engine itself is written in C++, and utilizes an automatic wrapper-generator to expose the complete functionality of the engine in a Python interface.
  6096. .
  6097. This package contains the SDK for development with Panda3D, install panda3d-runtime for the runtime files.
  6098. """
  6099. RUNTIME_INSTALLER_DEB_FILE="""
  6100. Package: panda3d-runtime
  6101. Version: VERSION
  6102. Section: web
  6103. Priority: optional
  6104. Architecture: ARCH
  6105. Essential: no
  6106. Depends: DEPENDS
  6107. Provides: panda3d-runtime
  6108. Maintainer: rdb <[email protected]>
  6109. Installed-Size: INSTSIZE
  6110. Description: Runtime binary and browser plugin for the Panda3D Game Engine
  6111. This package contains the runtime distribution and browser plugin of the Panda3D engine. It allows you view webpages that contain Panda3D content and to run games created with Panda3D that are packaged as .p3d file.
  6112. """
  6113. # We're not putting "python" in the "Requires" field,
  6114. # since the rpm-based distros don't have a common
  6115. # naming for the Python package.
  6116. INSTALLER_SPEC_FILE="""
  6117. Summary: The Panda3D free 3D engine SDK
  6118. Name: panda3d
  6119. Version: VERSION
  6120. Release: RPMRELEASE
  6121. License: BSD License
  6122. Group: Development/Libraries
  6123. BuildRoot: PANDASOURCE/targetroot
  6124. %description
  6125. Panda3D is a game engine which includes graphics, audio, I/O, collision detection, and other abilities relevant to the creation of 3D games. Panda3D is open source and free software under the revised BSD license, and can be used for both free and commercial game development at no financial cost.
  6126. Panda3D's intended game-development language is Python. The engine itself is written in C++, and utilizes an automatic wrapper-generator to expose the complete functionality of the engine in a Python interface.
  6127. This package contains the SDK for development with Panda3D, install panda3d-runtime for the runtime files.
  6128. %post
  6129. /sbin/ldconfig
  6130. %postun
  6131. /sbin/ldconfig
  6132. %files
  6133. %defattr(-,root,root)
  6134. /etc/Confauto.prc
  6135. /etc/Config.prc
  6136. /usr/share/panda3d
  6137. /etc/ld.so.conf.d/panda3d.conf
  6138. /usr/%_lib/panda3d
  6139. """ + PYTHON_SITEPACKAGES + """
  6140. /usr/include/panda3d
  6141. """
  6142. if not PkgSkip("PVIEW"):
  6143. INSTALLER_SPEC_FILE += \
  6144. """/usr/share/applications/pview.desktop
  6145. /usr/share/mime-info/panda3d.mime
  6146. /usr/share/mime-info/panda3d.keys
  6147. /usr/share/mime/packages/panda3d.xml
  6148. /usr/share/application-registry/panda3d.applications
  6149. """
  6150. RUNTIME_INSTALLER_SPEC_FILE="""
  6151. Summary: Runtime binary and browser plugin for the Panda3D Game Engine
  6152. Name: panda3d-runtime
  6153. Version: VERSION
  6154. Release: RPMRELEASE
  6155. License: BSD License
  6156. Group: Productivity/Graphics/Other
  6157. BuildRoot: PANDASOURCE/targetroot
  6158. %description
  6159. This package contains the runtime distribution and browser plugin of the Panda3D engine. It allows you view webpages that contain Panda3D content and to run games created with Panda3D that are packaged as .p3d file.
  6160. %files
  6161. %defattr(-,root,root)
  6162. /usr/bin/panda3d
  6163. /usr/%_lib/nppanda3d.so
  6164. /usr/%_lib/mozilla/plugins/nppanda3d.so
  6165. /usr/%_lib/mozilla-firefox/plugins/nppanda3d.so
  6166. /usr/%_lib/xulrunner-addons/plugins/nppanda3d.so
  6167. /usr/share/mime-info/panda3d-runtime.mime
  6168. /usr/share/mime-info/panda3d-runtime.keys
  6169. /usr/share/mime/packages/panda3d-runtime.xml
  6170. /usr/share/application-registry/panda3d-runtime.applications
  6171. /usr/share/applications/*.desktop
  6172. """
  6173. # plist file for Mac OSX
  6174. Info_plist = """<?xml version="1.0" encoding="UTF-8"?>
  6175. <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  6176. <plist version="1.0">
  6177. <dict>
  6178. <key>CFBundleIdentifier</key>
  6179. <string>%(package_id)s</string>
  6180. <key>CFBundleShortVersionString</key>
  6181. <string>%(version)s</string>
  6182. <key>IFPkgFlagRelocatable</key>
  6183. <false/>
  6184. <key>IFPkgFlagAuthorizationAction</key>
  6185. <string>RootAuthorization</string>
  6186. <key>IFPkgFlagAllowBackRev</key>
  6187. <true/>
  6188. </dict>
  6189. </plist>
  6190. """
  6191. # FreeBSD pkg-descr
  6192. INSTALLER_PKG_DESCR_FILE = """
  6193. Panda3D is a game engine which includes graphics, audio, I/O, collision detection, and other abilities relevant to the creation of 3D games. Panda3D is open source and free software under the revised BSD license, and can be used for both free and commercial game development at no financial cost.
  6194. Panda3D's intended game-development language is Python. The engine itself is written in C++, and utilizes an automatic wrapper-generator to expose the complete functionality of the engine in a Python interface.
  6195. This package contains the SDK for development with Panda3D, install panda3d-runtime for the runtime files.
  6196. WWW: https://www.panda3d.org/
  6197. """
  6198. # FreeBSD pkg-descr
  6199. RUNTIME_INSTALLER_PKG_DESCR_FILE = """
  6200. Runtime binary and browser plugin for the Panda3D Game Engine
  6201. This package contains the runtime distribution and browser plugin of the Panda3D engine. It allows you view webpages that contain Panda3D content and to run games created with Panda3D that are packaged as .p3d file.
  6202. WWW: https://www.panda3d.org/
  6203. """
  6204. # FreeBSD PKG Manifest template file
  6205. INSTALLER_PKG_MANIFEST_FILE = """
  6206. name: NAME
  6207. version: VERSION
  6208. arch: ARCH
  6209. origin: ORIGIN
  6210. comment: "Panda3D free 3D engine SDK"
  6211. www: https://www.panda3d.org
  6212. maintainer: rdb <[email protected]>
  6213. prefix: /usr/local
  6214. flatsize: INSTSIZEMB
  6215. deps: {DEPENDS}
  6216. """
  6217. def MakeInstallerLinux():
  6218. if not RUNTIME and not PkgSkip("PYTHON"):
  6219. PYTHONV = SDK["PYTHONVERSION"].rstrip('dmu')
  6220. else:
  6221. PYTHONV = "python"
  6222. PV = PYTHONV.replace("python", "")
  6223. # Clean and set up a directory to install Panda3D into
  6224. oscmd("rm -rf targetroot data.tar.gz control.tar.gz panda3d.spec")
  6225. oscmd("mkdir --mode=0755 targetroot")
  6226. dpkg_present = False
  6227. if os.path.exists("/usr/bin/dpkg-architecture") and os.path.exists("/usr/bin/dpkg-deb"):
  6228. dpkg_present = True
  6229. rpmbuild_present = False
  6230. if os.path.exists("/usr/bin/rpmbuild"):
  6231. rpmbuild_present = True
  6232. if dpkg_present and rpmbuild_present:
  6233. print("Warning: both dpkg and rpmbuild present.")
  6234. if dpkg_present:
  6235. # Invoke installpanda.py to install it into a temporary dir
  6236. lib_dir = GetDebLibDir()
  6237. if RUNTIME:
  6238. InstallRuntime(destdir="targetroot", prefix="/usr", outputdir=GetOutputDir(), libdir=lib_dir)
  6239. else:
  6240. InstallPanda(destdir="targetroot", prefix="/usr", outputdir=GetOutputDir(), libdir=lib_dir)
  6241. oscmd("chmod -R 755 targetroot/usr/share/panda3d")
  6242. oscmd("mkdir -m 0755 -p targetroot/usr/share/man/man1")
  6243. oscmd("install -m 0644 doc/man/*.1 targetroot/usr/share/man/man1/")
  6244. oscmd("dpkg --print-architecture > "+GetOutputDir()+"/tmp/architecture.txt")
  6245. pkg_arch = ReadFile(GetOutputDir()+"/tmp/architecture.txt").strip()
  6246. if (RUNTIME):
  6247. txt = RUNTIME_INSTALLER_DEB_FILE[1:]
  6248. else:
  6249. txt = INSTALLER_DEB_FILE[1:]
  6250. txt = txt.replace("VERSION", DEBVERSION).replace("ARCH", pkg_arch).replace("PV", PV).replace("MAJOR", MAJOR_VERSION)
  6251. txt = txt.replace("INSTSIZE", str(GetDirectorySize("targetroot") / 1024))
  6252. oscmd("mkdir --mode=0755 -p targetroot/DEBIAN")
  6253. oscmd("cd targetroot && (find usr -type f -exec md5sum {} ;) > DEBIAN/md5sums")
  6254. if (not RUNTIME):
  6255. oscmd("cd targetroot && (find etc -type f -exec md5sum {} ;) >> DEBIAN/md5sums")
  6256. WriteFile("targetroot/DEBIAN/conffiles","/etc/Config.prc\n")
  6257. WriteFile("targetroot/DEBIAN/postinst","#!/bin/sh\necho running ldconfig\nldconfig\n")
  6258. oscmd("cp targetroot/DEBIAN/postinst targetroot/DEBIAN/postrm")
  6259. # Determine the package name and the locations that
  6260. # dpkg-shlibdeps should look in for executables.
  6261. pkg_version = DEBVERSION
  6262. if RUNTIME:
  6263. pkg_name = "panda3d-runtime"
  6264. lib_pattern = "debian/%s/usr/%s/*.so" % (pkg_name, lib_dir)
  6265. else:
  6266. pkg_name = "panda3d" + MAJOR_VERSION
  6267. lib_pattern = "debian/%s/usr/%s/panda3d/*.so*" % (pkg_name, lib_dir)
  6268. bin_pattern = "debian/%s/usr/bin/*" % (pkg_name)
  6269. # dpkg-shlibdeps looks in the debian/{pkg_name}/DEBIAN/shlibs directory
  6270. # and also expects a debian/control file, so we create this dummy set-up.
  6271. oscmd("mkdir targetroot/debian")
  6272. oscmd("ln -s .. targetroot/debian/" + pkg_name)
  6273. WriteFile("targetroot/debian/control", "")
  6274. dpkg_shlibdeps = "dpkg-shlibdeps"
  6275. if GetVerbose():
  6276. dpkg_shlibdeps += " -v"
  6277. if RUNTIME:
  6278. # The runtime doesn't export any useful symbols, so just query the dependencies.
  6279. oscmd("cd targetroot && %(dpkg_shlibdeps)s -x%(pkg_name)s %(lib_pattern)s %(bin_pattern)s*" % locals())
  6280. depends = ReadFile("targetroot/debian/substvars").replace("shlibs:Depends=", "").strip()
  6281. recommends = ""
  6282. else:
  6283. pkg_name = "panda3d" + MAJOR_VERSION
  6284. pkg_dir = "debian/panda3d" + MAJOR_VERSION
  6285. # Generate a symbols file so that other packages can know which symbols we export.
  6286. oscmd("cd targetroot && dpkg-gensymbols -q -ODEBIAN/symbols -v%(pkg_version)s -p%(pkg_name)s -e%(lib_pattern)s" % locals())
  6287. # Library dependencies are required, binary dependencies are recommended.
  6288. # We explicitly exclude libphysx-extras since we don't want to depend on PhysX.
  6289. oscmd("cd targetroot && LD_LIBRARY_PATH=usr/%(lib_dir)s/panda3d %(dpkg_shlibdeps)s -Tdebian/substvars_dep --ignore-missing-info -x%(pkg_name)s -xlibphysx-extras %(lib_pattern)s" % locals())
  6290. oscmd("cd targetroot && LD_LIBRARY_PATH=usr/%(lib_dir)s/panda3d %(dpkg_shlibdeps)s -Tdebian/substvars_rec --ignore-missing-info -x%(pkg_name)s %(bin_pattern)s" % locals())
  6291. # Parse the substvars files generated by dpkg-shlibdeps.
  6292. depends = ReadFile("targetroot/debian/substvars_dep").replace("shlibs:Depends=", "").strip()
  6293. recommends = ReadFile("targetroot/debian/substvars_rec").replace("shlibs:Depends=", "").strip()
  6294. if PkgSkip("PYTHON")==0:
  6295. depends += ", " + PYTHONV
  6296. recommends += ", python-wxversion, python-profiler (>= " + PV + "), python-pmw, python-tk (>= " + PV + ")"
  6297. if PkgSkip("NVIDIACG")==0:
  6298. depends += ", nvidia-cg-toolkit"
  6299. # Write back the dependencies, and delete the dummy set-up.
  6300. txt = txt.replace("DEPENDS", depends.strip(', '))
  6301. txt = txt.replace("RECOMMENDS", recommends.strip(', '))
  6302. WriteFile("targetroot/DEBIAN/control", txt)
  6303. oscmd("rm -rf targetroot/debian")
  6304. # Package it all up into a .deb file.
  6305. oscmd("chmod -R 755 targetroot/DEBIAN")
  6306. oscmd("chmod 644 targetroot/DEBIAN/control targetroot/DEBIAN/md5sums")
  6307. if not RUNTIME:
  6308. oscmd("chmod 644 targetroot/DEBIAN/conffiles targetroot/DEBIAN/symbols")
  6309. oscmd("fakeroot dpkg-deb -b targetroot %s_%s_%s.deb" % (pkg_name, pkg_version, pkg_arch))
  6310. elif rpmbuild_present:
  6311. # Invoke installpanda.py to install it into a temporary dir
  6312. if RUNTIME:
  6313. InstallRuntime(destdir="targetroot", prefix="/usr", outputdir=GetOutputDir(), libdir=GetRPMLibDir())
  6314. else:
  6315. InstallPanda(destdir="targetroot", prefix="/usr", outputdir=GetOutputDir(), libdir=GetRPMLibDir())
  6316. oscmd("chmod -R 755 targetroot/usr/share/panda3d")
  6317. oscmd("rpm -E '%_target_cpu' > "+GetOutputDir()+"/tmp/architecture.txt")
  6318. ARCH = ReadFile(GetOutputDir()+"/tmp/architecture.txt").strip()
  6319. pandasource = os.path.abspath(os.getcwd())
  6320. if RUNTIME:
  6321. txt = RUNTIME_INSTALLER_SPEC_FILE[1:]
  6322. else:
  6323. txt = INSTALLER_SPEC_FILE[1:]
  6324. # Add the binaries in /usr/bin explicitly to the spec file
  6325. for base in os.listdir(GetOutputDir() + "/bin"):
  6326. txt += "/usr/bin/%s\n" % (base)
  6327. # Write out the spec file.
  6328. txt = txt.replace("VERSION", VERSION)
  6329. txt = txt.replace("RPMRELEASE", RPMRELEASE)
  6330. txt = txt.replace("PANDASOURCE", pandasource)
  6331. txt = txt.replace("PV", PV)
  6332. WriteFile("panda3d.spec", txt)
  6333. oscmd("fakeroot rpmbuild --define '_rpmdir "+pandasource+"' --buildroot '"+os.path.abspath("targetroot")+"' -bb panda3d.spec")
  6334. if (RUNTIME):
  6335. oscmd("mv "+ARCH+"/panda3d-runtime-"+VERSION+"-"+RPMRELEASE+"."+ARCH+".rpm .")
  6336. else:
  6337. oscmd("mv "+ARCH+"/panda3d-"+VERSION+"-"+RPMRELEASE+"."+ARCH+".rpm .")
  6338. oscmd("rm -rf "+ARCH, True)
  6339. else:
  6340. exit("To build an installer, either rpmbuild or dpkg-deb must be present on your system!")
  6341. def MakeInstallerOSX():
  6342. if (RUNTIME):
  6343. # Invoke the make_installer script.
  6344. AddToPathEnv("DYLD_LIBRARY_PATH", GetOutputDir() + "/plugins")
  6345. cmdstr = sys.executable + " "
  6346. if sys.version_info >= (2, 6):
  6347. cmdstr += "-B "
  6348. cmdstr += "direct/src/plugin_installer/make_installer.py --version %s" % VERSION
  6349. oscmd(cmdstr)
  6350. return
  6351. dmg_name = "Panda3D-" + VERSION
  6352. if not SDK["PYTHONVERSION"].startswith("python2."):
  6353. dmg_name += '-py' + SDK["PYTHONVERSION"][6:9]
  6354. dmg_name += ".dmg"
  6355. import compileall
  6356. if (os.path.isfile(dmg_name)): oscmd("rm -f %s" % dmg_name)
  6357. if (os.path.exists("dstroot")): oscmd("rm -rf dstroot")
  6358. if (os.path.exists("Panda3D-rw.dmg")): oscmd('rm -f Panda3D-rw.dmg')
  6359. oscmd("mkdir -p dstroot/base/Developer/Panda3D/lib")
  6360. oscmd("mkdir -p dstroot/base/Developer/Panda3D/etc")
  6361. oscmd("cp %s/etc/Config.prc dstroot/base/Developer/Panda3D/etc/Config.prc" % GetOutputDir())
  6362. oscmd("cp %s/etc/Confauto.prc dstroot/base/Developer/Panda3D/etc/Confauto.prc" % GetOutputDir())
  6363. oscmd("cp -R %s/models dstroot/base/Developer/Panda3D/models" % GetOutputDir())
  6364. oscmd("cp -R doc/LICENSE dstroot/base/Developer/Panda3D/LICENSE")
  6365. oscmd("cp -R doc/ReleaseNotes dstroot/base/Developer/Panda3D/ReleaseNotes")
  6366. oscmd("cp -R %s/Frameworks dstroot/base/Developer/Panda3D/Frameworks" % GetOutputDir())
  6367. if os.path.isdir(GetOutputDir()+"/plugins"):
  6368. oscmd("cp -R %s/plugins dstroot/base/Developer/Panda3D/plugins" % GetOutputDir())
  6369. # Libraries that shouldn't be in base, but are instead in other modules.
  6370. no_base_libs = ['libp3ffmpeg', 'libp3fmod_audio', 'libfmodex', 'libfmodexL']
  6371. for base in os.listdir(GetOutputDir()+"/lib"):
  6372. if not base.endswith(".a") and base.split('.')[0] not in no_base_libs:
  6373. libname = "dstroot/base/Developer/Panda3D/lib/" + base
  6374. # We really need to specify -R in order not to follow symlinks
  6375. # On OSX, just specifying -P is not enough to do that.
  6376. oscmd("cp -R -P " + GetOutputDir() + "/lib/" + base + " " + libname)
  6377. oscmd("mkdir -p dstroot/tools/Developer/Panda3D/bin")
  6378. oscmd("mkdir -p dstroot/tools/Developer/Tools")
  6379. oscmd("ln -s ../Panda3D/bin dstroot/tools/Developer/Tools/Panda3D")
  6380. oscmd("mkdir -p dstroot/tools/etc/paths.d")
  6381. # Trailing newline is important, works around a bug in OSX
  6382. WriteFile("dstroot/tools/etc/paths.d/Panda3D", "/Developer/Panda3D/bin\n")
  6383. oscmd("mkdir -m 0755 -p dstroot/tools/usr/local/share/man/man1")
  6384. oscmd("install -m 0644 doc/man/*.1 dstroot/tools/usr/local/share/man/man1/")
  6385. for base in os.listdir(GetOutputDir()+"/bin"):
  6386. binname = "dstroot/tools/Developer/Panda3D/bin/" + base
  6387. # OSX needs the -R argument to copy symbolic links correctly, it doesn't have -d. How weird.
  6388. oscmd("cp -R " + GetOutputDir() + "/bin/" + base + " " + binname)
  6389. if PkgSkip("PYTHON")==0:
  6390. PV = SDK["PYTHONVERSION"][6:9]
  6391. oscmd("mkdir -p dstroot/pythoncode/usr/local/bin")
  6392. oscmd("mkdir -p dstroot/pythoncode/Developer/Panda3D/panda3d")
  6393. oscmd("mkdir -p dstroot/pythoncode/Library/Python/%s/site-packages" % PV)
  6394. WriteFile("dstroot/pythoncode/Library/Python/%s/site-packages/Panda3D.pth" % PV, "/Developer/Panda3D")
  6395. oscmd("cp -R %s/pandac dstroot/pythoncode/Developer/Panda3D/pandac" % GetOutputDir())
  6396. oscmd("cp -R %s/direct dstroot/pythoncode/Developer/Panda3D/direct" % GetOutputDir())
  6397. oscmd("ln -s %s dstroot/pythoncode/usr/local/bin/ppython" % SDK["PYTHONEXEC"])
  6398. oscmd("cp -R %s/*.so dstroot/pythoncode/Developer/Panda3D/" % GetOutputDir(), True)
  6399. oscmd("cp -R %s/*.py dstroot/pythoncode/Developer/Panda3D/" % GetOutputDir(), True)
  6400. if os.path.isdir(GetOutputDir()+"/Pmw"):
  6401. oscmd("cp -R %s/Pmw dstroot/pythoncode/Developer/Panda3D/Pmw" % GetOutputDir())
  6402. compileall.compile_dir("dstroot/pythoncode/Developer/Panda3D/Pmw")
  6403. WriteFile("dstroot/pythoncode/Developer/Panda3D/direct/__init__.py", "")
  6404. for base in os.listdir("dstroot/pythoncode/Developer/Panda3D/direct"):
  6405. if ((base != "extensions") and (base != "extensions_native")):
  6406. compileall.compile_dir("dstroot/pythoncode/Developer/Panda3D/direct/"+base)
  6407. for base in os.listdir(GetOutputDir()+"/panda3d"):
  6408. if base.endswith('.py') or base.endswith('.so'):
  6409. libname = "dstroot/pythoncode/Developer/Panda3D/panda3d/" + base
  6410. # We really need to specify -R in order not to follow symlinks
  6411. # On OSX, just specifying -P is not enough to do that.
  6412. oscmd("cp -R -P " + GetOutputDir() + "/panda3d/" + base + " " + libname)
  6413. if not PkgSkip("FFMPEG"):
  6414. oscmd("mkdir -p dstroot/ffmpeg/Developer/Panda3D/lib")
  6415. oscmd("cp -R %s/lib/libp3ffmpeg.* dstroot/ffmpeg/Developer/Panda3D/lib/" % GetOutputDir())
  6416. #if not PkgSkip("OPENAL"):
  6417. # oscmd("mkdir -p dstroot/openal/Developer/Panda3D/lib")
  6418. # oscmd("cp -R %s/lib/libp3openal_audio.* dstroot/openal/Developer/Panda3D/lib/" % GetOutputDir())
  6419. if not PkgSkip("FMODEX"):
  6420. oscmd("mkdir -p dstroot/fmodex/Developer/Panda3D/lib")
  6421. oscmd("cp -R %s/lib/libp3fmod_audio.* dstroot/fmodex/Developer/Panda3D/lib/" % GetOutputDir())
  6422. oscmd("cp -R %s/lib/libfmodex* dstroot/fmodex/Developer/Panda3D/lib/" % GetOutputDir())
  6423. oscmd("mkdir -p dstroot/headers/Developer/Panda3D/lib")
  6424. oscmd("cp -R %s/include dstroot/headers/Developer/Panda3D/include" % GetOutputDir())
  6425. if os.path.isfile(GetOutputDir() + "/lib/libp3pystub.a"):
  6426. oscmd("cp -R -P %s/lib/libp3pystub.a dstroot/headers/Developer/Panda3D/lib/" % GetOutputDir())
  6427. if os.path.isdir("samples"):
  6428. oscmd("mkdir -p dstroot/samples/Developer/Examples/Panda3D")
  6429. oscmd("cp -R samples/* dstroot/samples/Developer/Examples/Panda3D/")
  6430. oscmd("chmod -R 0775 dstroot/*")
  6431. DeleteVCS("dstroot")
  6432. DeleteBuildFiles("dstroot")
  6433. # We need to be root to perform a chown. Bleh.
  6434. # Fortunately PackageMaker does it for us, on 10.5 and above.
  6435. #oscmd("chown -R root:admin dstroot/*", True)
  6436. oscmd("mkdir -p dstroot/Panda3D/Panda3D.mpkg/Contents/Packages/")
  6437. oscmd("mkdir -p dstroot/Panda3D/Panda3D.mpkg/Contents/Resources/en.lproj/")
  6438. pkgs = ["base", "tools", "headers"]
  6439. if not PkgSkip("PYTHON"): pkgs.append("pythoncode")
  6440. if not PkgSkip("FFMPEG"): pkgs.append("ffmpeg")
  6441. #if not PkgSkip("OPENAL"): pkgs.append("openal")
  6442. if not PkgSkip("FMODEX"): pkgs.append("fmodex")
  6443. if os.path.isdir("samples"): pkgs.append("samples")
  6444. for pkg in pkgs:
  6445. identifier = "org.panda3d.panda3d.%s.pkg" % pkg
  6446. plist = open("/tmp/Info_plist", "w")
  6447. plist.write(Info_plist % { "package_id" : identifier, "version" : VERSION })
  6448. plist.close()
  6449. if not os.path.isdir("dstroot/" + pkg):
  6450. os.makedirs("dstroot/" + pkg)
  6451. if OSXTARGET and OSXTARGET <= (10, 5):
  6452. target = '--target %d.%d' % (OSXTARGET)
  6453. else:
  6454. target = ''
  6455. if os.path.exists("/usr/bin/pkgbuild"):
  6456. # This new package builder is used in Lion and above.
  6457. cmd = '/usr/bin/pkgbuild --identifier ' + identifier + ' --version ' + VERSION + ' --root dstroot/' + pkg + '/ dstroot/Panda3D/Panda3D.mpkg/Contents/Packages/' + pkg + '.pkg'
  6458. # In older versions, we use PackageMaker. Apple keeps changing its location.
  6459. elif os.path.exists("/Developer/usr/bin/packagemaker"):
  6460. cmd = '/Developer/usr/bin/packagemaker --info /tmp/Info_plist --version ' + VERSION + ' --out dstroot/Panda3D/Panda3D.mpkg/Contents/Packages/' + pkg + '.pkg ' + target + ' --domain system --root dstroot/' + pkg + '/ --no-relocate'
  6461. elif os.path.exists("/Applications/Xcode.app/Contents/Applications/PackageMaker.app/Contents/MacOS/PackageMaker"):
  6462. cmd = '/Applications/Xcode.app/Contents/Applications/PackageMaker.app/Contents/MacOS/PackageMaker --info /tmp/Info_plist --version ' + VERSION + ' --out dstroot/Panda3D/Panda3D.mpkg/Contents/Packages/' + pkg + '.pkg ' + target + ' --domain system --root dstroot/' + pkg + '/ --no-relocate'
  6463. elif os.path.exists("/Developer/Tools/PackageMaker.app/Contents/MacOS/PackageMaker"):
  6464. cmd = '/Developer/Tools/PackageMaker.app/Contents/MacOS/PackageMaker --info /tmp/Info_plist --version ' + VERSION + ' --out dstroot/Panda3D/Panda3D.mpkg/Contents/Packages/' + pkg + '.pkg ' + target + ' --domain system --root dstroot/' + pkg + '/ --no-relocate'
  6465. elif os.path.exists("/Developer/Tools/packagemaker"):
  6466. cmd = '/Developer/Tools/packagemaker -build -f dstroot/' + pkg + '/ -p dstroot/Panda3D/Panda3D.mpkg/Contents/Packages/' + pkg + '.pkg -i /tmp/Info_plist'
  6467. elif os.path.exists("/Applications/PackageMaker.app/Contents/MacOS/PackageMaker"):
  6468. cmd = '/Applications/PackageMaker.app/Contents/MacOS/PackageMaker --info /tmp/Info_plist --version ' + VERSION + ' --out dstroot/Panda3D/Panda3D.mpkg/Contents/Packages/' + pkg + '.pkg ' + target + ' --domain system --root dstroot/' + pkg + '/ --no-relocate'
  6469. else:
  6470. exit("Neither pkgbuild nor PackageMaker could be found!")
  6471. oscmd(cmd)
  6472. if os.path.isfile("/tmp/Info_plist"):
  6473. oscmd("rm -f /tmp/Info_plist")
  6474. # Now that we've built all of the individual packages, build the metapackage.
  6475. dist = open("dstroot/Panda3D/Panda3D.mpkg/Contents/distribution.dist", "w")
  6476. dist.write('<?xml version="1.0" encoding="utf-8"?>\n')
  6477. dist.write('<installer-script minSpecVersion="1.000000" authoringTool="com.apple.PackageMaker" authoringToolVersion="3.0.3" authoringToolBuild="174">\n')
  6478. dist.write(' <title>Panda3D SDK %s</title>\n' % (VERSION))
  6479. dist.write(' <options customize="always" allow-external-scripts="no" rootVolumeOnly="false"/>\n')
  6480. dist.write(' <license language="en" mime-type="text/plain">%s</license>\n' % ReadFile("doc/LICENSE"))
  6481. dist.write(' <choices-outline>\n')
  6482. for pkg in pkgs:
  6483. dist.write(' <line choice="%s"/>\n' % (pkg))
  6484. dist.write(' </choices-outline>\n')
  6485. dist.write(' <choice id="base" title="Panda3D Base Installation" description="This package contains the Panda3D libraries, configuration files and models/textures that are needed to use Panda3D. Location: /Developer/Panda3D/" start_enabled="false">\n')
  6486. dist.write(' <pkg-ref id="org.panda3d.panda3d.base.pkg"/>\n')
  6487. dist.write(' </choice>\n')
  6488. dist.write(' <choice id="tools" title="Tools" tooltip="Useful tools and model converters to help with Panda3D development" description="This package contains the various utilities that ship with Panda3D, including packaging tools, model converters, and many more. Location: /Developer/Panda3D/bin/">\n')
  6489. dist.write(' <pkg-ref id="org.panda3d.panda3d.tools.pkg"/>\n')
  6490. dist.write(' </choice>\n')
  6491. if not PkgSkip("PYTHON"):
  6492. dist.write(' <choice id="pythoncode" title="Python Support" tooltip="Python bindings for the Panda3D libraries" description="This package contains the \'direct\', \'pandac\' and \'panda3d\' python packages that are needed to do Python development with Panda3D. Location: /Developer/Panda3D/">\n')
  6493. dist.write(' <pkg-ref id="org.panda3d.panda3d.pythoncode.pkg"/>\n')
  6494. dist.write(' </choice>\n')
  6495. if not PkgSkip("FFMPEG"):
  6496. dist.write(' <choice id="ffmpeg" title="FFMpeg Plug-In" tooltip="FFMpeg video and audio decoding plug-in" description="This package contains the FFMpeg plug-in, which is used for decoding video and audio files with OpenAL.')
  6497. if PkgSkip("VORBIS") and PkgSkip("OPUS"):
  6498. dist.write(' It is not required for loading .wav files, which Panda3D can read out of the box.">\n')
  6499. elif PkgSkip("VORBIS"):
  6500. dist.write(' It is not required for loading .wav or .opus files, which Panda3D can read out of the box.">\n')
  6501. elif PkgSkip("OPUS"):
  6502. dist.write(' It is not required for loading .wav or .ogg files, which Panda3D can read out of the box.">\n')
  6503. else:
  6504. dist.write(' It is not required for loading .wav, .ogg or .opus files, which Panda3D can read out of the box.">\n')
  6505. dist.write(' <pkg-ref id="org.panda3d.panda3d.ffmpeg.pkg"/>\n')
  6506. dist.write(' </choice>\n')
  6507. #if not PkgSkip("OPENAL"):
  6508. # dist.write(' <choice id="openal" title="OpenAL Audio Plug-In" tooltip="OpenAL audio output plug-in" description="This package contains the OpenAL audio plug-in, which is an open-source library for playing sounds.">\n')
  6509. # dist.write(' <pkg-ref id="org.panda3d.panda3d.openal.pkg"/>\n')
  6510. # dist.write(' </choice>\n')
  6511. if not PkgSkip("FMODEX"):
  6512. dist.write(' <choice id="fmodex" title="FMOD Ex Plug-In" tooltip="FMOD Ex audio output plug-in" description="This package contains the FMOD Ex audio plug-in, which is a commercial library for playing sounds. It is an optional component as Panda3D can use the open-source alternative OpenAL instead.">\n')
  6513. dist.write(' <pkg-ref id="org.panda3d.panda3d.fmodex.pkg"/>\n')
  6514. dist.write(' </choice>\n')
  6515. if os.path.isdir("samples"):
  6516. dist.write(' <choice id="samples" title="Sample Programs" tooltip="Python sample programs that use Panda3D" description="This package contains the Python sample programs that can help you with learning how to use Panda3D. Location: /Developer/Examples/Panda3D/">\n')
  6517. dist.write(' <pkg-ref id="org.panda3d.panda3d.samples.pkg"/>\n')
  6518. dist.write(' </choice>\n')
  6519. dist.write(' <choice id="headers" title="C++ Header Files" tooltip="Header files for C++ development with Panda3D" description="This package contains the C++ header files that are needed in order to do C++ development with Panda3D. You don\'t need this if you want to develop in Python. Location: /Developer/Panda3D/include/" start_selected="false">\n')
  6520. dist.write(' <pkg-ref id="org.panda3d.panda3d.headers.pkg"/>\n')
  6521. dist.write(' </choice>\n')
  6522. for pkg in pkgs:
  6523. size = GetDirectorySize("dstroot/" + pkg) // 1024
  6524. dist.write(' <pkg-ref id="org.panda3d.panda3d.%s.pkg" installKBytes="%d" version="1" auth="Root">file:./Contents/Packages/%s.pkg</pkg-ref>\n' % (pkg, size, pkg))
  6525. dist.write('</installer-script>\n')
  6526. dist.close()
  6527. oscmd('hdiutil create Panda3D-rw.dmg -volname "Panda3D SDK %s" -srcfolder dstroot/Panda3D' % (VERSION))
  6528. oscmd('hdiutil convert Panda3D-rw.dmg -format UDBZ -o %s' % (dmg_name))
  6529. oscmd('rm -f Panda3D-rw.dmg')
  6530. def MakeInstallerFreeBSD():
  6531. oscmd("rm -rf targetroot +DESC pkg-plist +MANIFEST")
  6532. oscmd("mkdir targetroot")
  6533. # Invoke installpanda.py to install it into a temporary dir
  6534. if RUNTIME:
  6535. InstallRuntime(destdir = "targetroot", prefix = "/usr/local", outputdir = GetOutputDir())
  6536. else:
  6537. InstallPanda(destdir = "targetroot", prefix = "/usr/local", outputdir = GetOutputDir())
  6538. if not os.path.exists("/usr/sbin/pkg"):
  6539. exit("Cannot create an installer without pkg")
  6540. plist_txt = ''
  6541. for root, dirs, files in os.walk("targetroot/usr/local/", True):
  6542. for f in files:
  6543. plist_txt += os.path.join(root, f)[21:] + "\n"
  6544. if not RUNTIME:
  6545. plist_txt += "@postexec /sbin/ldconfig -m /usr/local/lib/panda3d\n"
  6546. plist_txt += "@postunexec /sbin/ldconfig -R\n"
  6547. for remdir in ("lib/panda3d", "share/panda3d", "include/panda3d"):
  6548. for root, dirs, files in os.walk("targetroot/usr/local/" + remdir, False):
  6549. for d in dirs:
  6550. plist_txt += "@dir %s\n" % os.path.join(root, d)[21:]
  6551. plist_txt += "@dir %s\n" % remdir
  6552. oscmd("echo \"`pkg config abi | tr '[:upper:]' '[:lower:]' | cut -d: -f1,2`:*\" > " + GetOutputDir() + "/tmp/architecture.txt")
  6553. pkg_arch = ReadFile(GetOutputDir()+"/tmp/architecture.txt").strip()
  6554. dependencies = ''
  6555. if PkgSkip("PYTHON") == 0:
  6556. # If this version of Python was installed from a package or ports, let's mark it as dependency.
  6557. oscmd("rm -f %s/tmp/python_dep" % GetOutputDir())
  6558. oscmd("pkg query \"\n\t%%n : {\n\t\torigin : %%o,\n\t\tversion : %%v\n\t},\n\" python%s > %s/tmp/python_dep" % (SDK["PYTHONVERSION"][6:9:2], GetOutputDir()), True)
  6559. if os.path.isfile(GetOutputDir() + "/tmp/python_dep"):
  6560. python_pkg = ReadFile(GetOutputDir() + "/tmp/python_dep")
  6561. if python_pkg:
  6562. dependencies += python_pkg
  6563. manifest_txt = INSTALLER_PKG_MANIFEST_FILE[1:].replace("NAME", 'panda3d' if not RUNTIME else 'panda3d-runtime')
  6564. manifest_txt = manifest_txt.replace("VERSION", VERSION)
  6565. manifest_txt = manifest_txt.replace("ARCH", pkg_arch)
  6566. manifest_txt = manifest_txt.replace("ORIGIN", 'devel/panda3d' if not RUNTIME else 'graphics/panda3d-runtime')
  6567. manifest_txt = manifest_txt.replace("DEPENDS", dependencies)
  6568. manifest_txt = manifest_txt.replace("INSTSIZE", str(GetDirectorySize("targetroot") / 1024 / 1024))
  6569. WriteFile("pkg-plist", plist_txt)
  6570. WriteFile("+DESC", INSTALLER_PKG_DESCR_FILE[1:] if not RUNTIME else RUNTIME_INSTALLER_PKG_DESCR_FILE[1:])
  6571. WriteFile("+MANIFEST", manifest_txt)
  6572. oscmd("pkg create -p pkg-plist -r %s -m . -o . %s" % (os.path.abspath("targetroot"), "--verbose" if GetVerbose() else "--quiet"))
  6573. def MakeInstallerAndroid():
  6574. oscmd("rm -rf apkroot")
  6575. oscmd("mkdir apkroot")
  6576. # Also remove the temporary apks.
  6577. apk_unaligned = os.path.join(GetOutputDir(), "tmp", "panda3d-unaligned.apk")
  6578. apk_unsigned = os.path.join(GetOutputDir(), "tmp", "panda3d-unsigned.apk")
  6579. if os.path.exists(apk_unaligned):
  6580. os.unlink(apk_unaligned)
  6581. if os.path.exists(apk_unsigned):
  6582. os.unlink(apk_unsigned)
  6583. # Compile the Java classes into a Dalvik executable.
  6584. dx_cmd = "dx --dex --output=apkroot/classes.dex "
  6585. if GetOptimize() <= 2:
  6586. dx_cmd += "--debug "
  6587. if GetVerbose():
  6588. dx_cmd += "--verbose "
  6589. if "ANDROID_API" in SDK:
  6590. dx_cmd += "--min-sdk-version=%d " % (SDK["ANDROID_API"])
  6591. dx_cmd += os.path.join(GetOutputDir(), "classes")
  6592. oscmd(dx_cmd)
  6593. # Copy the libraries one by one. In case of library dependencies, strip
  6594. # off any suffix (eg. libfile.so.1.0), as Android does not support them.
  6595. source_dir = os.path.join(GetOutputDir(), "lib")
  6596. target_dir = os.path.join("apkroot", "lib", SDK["ANDROID_ABI"])
  6597. oscmd("mkdir -p %s" % (target_dir))
  6598. # Determine the library directories we should look in.
  6599. libpath = [source_dir]
  6600. for dir in os.environ.get("LD_LIBRARY_PATH", "").split(':'):
  6601. dir = os.path.expandvars(dir)
  6602. dir = os.path.expanduser(dir)
  6603. if os.path.isdir(dir):
  6604. dir = os.path.realpath(dir)
  6605. if not dir.startswith("/system") and not dir.startswith("/vendor"):
  6606. libpath.append(dir)
  6607. def copy_library(source, base):
  6608. # Copy file to destination, stripping version suffix.
  6609. target = os.path.join(target_dir, base)
  6610. if not target.endswith('.so'):
  6611. target = target.rpartition('.so.')[0] + '.so'
  6612. if os.path.isfile(target):
  6613. # Already processed.
  6614. return
  6615. oscmd("cp %s %s" % (source, target))
  6616. # Walk through the library dependencies.
  6617. oscmd("ldd %s | grep .so > %s/tmp/otool-libs.txt" % (target, GetOutputDir()), True)
  6618. for line in open(GetOutputDir() + "/tmp/otool-libs.txt", "r"):
  6619. line = line.strip()
  6620. if not line:
  6621. continue
  6622. if '.so.' in line:
  6623. dep = line.rpartition('.so.')[0] + '.so'
  6624. oscmd("patchelf --replace-needed %s %s %s" % (line, dep, target), True)
  6625. else:
  6626. dep = line
  6627. # Find it on the LD_LIBRARY_PATH.
  6628. for dir in libpath:
  6629. fulldep = os.path.join(dir, dep)
  6630. if os.path.isfile(fulldep):
  6631. copy_library(os.path.realpath(fulldep), dep)
  6632. break
  6633. # Now copy every lib in the lib dir, and its dependencies.
  6634. for base in os.listdir(source_dir):
  6635. if not base.startswith('lib'):
  6636. continue
  6637. if not base.endswith('.so') and '.so.' not in base:
  6638. continue
  6639. source = os.path.join(source_dir, base)
  6640. if os.path.islink(source):
  6641. continue
  6642. copy_library(source, base)
  6643. # Same for Python extension modules. However, Android is strict about
  6644. # library naming, so we have a special naming scheme for these, in
  6645. # conjunction with a custom import hook to find these modules.
  6646. if not PkgSkip("PYTHON"):
  6647. suffix = GetExtensionSuffix()
  6648. source_dir = os.path.join(GetOutputDir(), "panda3d")
  6649. for base in os.listdir(source_dir):
  6650. if not base.endswith(suffix):
  6651. continue
  6652. modname = base[:-len(suffix)]
  6653. source = os.path.join(source_dir, base)
  6654. copy_library(source, "libpy.panda3d.{}.so".format(modname))
  6655. # Same for standard Python modules.
  6656. import _ctypes
  6657. source_dir = os.path.dirname(_ctypes.__file__)
  6658. for base in os.listdir(source_dir):
  6659. if not base.endswith('.so'):
  6660. continue
  6661. modname = base.partition('.')[0]
  6662. source = os.path.join(source_dir, base)
  6663. copy_library(source, "libpy.{}.so".format(modname))
  6664. def copy_python_tree(source_root, target_root):
  6665. for source_dir, dirs, files in os.walk(source_root):
  6666. if 'site-packages' in dirs:
  6667. dirs.remove('site-packages')
  6668. if not any(base.endswith('.py') for base in files):
  6669. continue
  6670. target_dir = os.path.join(target_root, os.path.relpath(source_dir, source_root))
  6671. target_dir = os.path.normpath(target_dir)
  6672. os.makedirs(target_dir, 0o755)
  6673. for base in files:
  6674. if base.endswith('.py'):
  6675. target = os.path.join(target_dir, base)
  6676. shutil.copy(os.path.join(source_dir, base), target)
  6677. # Copy the Python standard library to the .apk as well.
  6678. from distutils.sysconfig import get_python_lib
  6679. stdlib_source = get_python_lib(False, True)
  6680. stdlib_target = os.path.join("apkroot", "lib", "python{0}.{1}".format(*sys.version_info))
  6681. copy_python_tree(stdlib_source, stdlib_target)
  6682. # But also copy over our custom site.py.
  6683. shutil.copy("panda/src/android/site.py", os.path.join(stdlib_target, "site.py"))
  6684. # And now make a site-packages directory containing our direct/panda3d/pandac modules.
  6685. for tree in "panda3d", "direct", "pandac":
  6686. copy_python_tree(os.path.join(GetOutputDir(), tree), os.path.join(stdlib_target, "site-packages", tree))
  6687. # Copy the models and config files to the virtual assets filesystem.
  6688. oscmd("mkdir apkroot/assets")
  6689. oscmd("cp -R %s apkroot/assets/models" % (os.path.join(GetOutputDir(), "models")))
  6690. oscmd("cp -R %s apkroot/assets/etc" % (os.path.join(GetOutputDir(), "etc")))
  6691. # Make an empty res folder. It's needed for the apk to be installable, apparently.
  6692. oscmd("mkdir apkroot/res")
  6693. # Now package up the application
  6694. oscmd("cp panda/src/android/pview_manifest.xml apkroot/AndroidManifest.xml")
  6695. aapt_cmd = "aapt package"
  6696. aapt_cmd += " -F %s" % (apk_unaligned)
  6697. aapt_cmd += " -M apkroot/AndroidManifest.xml"
  6698. aapt_cmd += " -A apkroot/assets -S apkroot/res"
  6699. aapt_cmd += " -I $PREFIX/share/aapt/android.jar"
  6700. oscmd(aapt_cmd)
  6701. # And add all the libraries to it.
  6702. oscmd("cd apkroot && aapt add ../%s classes.dex" % (apk_unaligned))
  6703. for path, dirs, files in os.walk('apkroot/lib'):
  6704. if files:
  6705. rel = os.path.relpath(path, 'apkroot')
  6706. oscmd("cd apkroot && aapt add ../%s %s/*" % (apk_unaligned, rel))
  6707. # Now align the .apk, which is necessary for Android to load it.
  6708. oscmd("zipalign -v -p 4 %s %s" % (apk_unaligned, apk_unsigned))
  6709. # Finally, sign it using a debug key. This is generated if it doesn't exist.
  6710. oscmd("apksigner debug.ks %s panda3d.apk" % (apk_unsigned))
  6711. # Clean up.
  6712. oscmd("rm -rf apkroot")
  6713. os.unlink(apk_unaligned)
  6714. os.unlink(apk_unsigned)
  6715. try:
  6716. if INSTALLER:
  6717. ProgressOutput(100.0, "Building installer")
  6718. target = GetTarget()
  6719. if target == 'windows':
  6720. fn = "Panda3D-"
  6721. dir = "Panda3D-" + VERSION
  6722. if RUNTIME:
  6723. fn += "Runtime-"
  6724. title = "Panda3D " + VERSION
  6725. else:
  6726. title = "Panda3D SDK " + VERSION
  6727. fn += VERSION
  6728. if not RUNTIME and SDK["PYTHONVERSION"] != "python2.7":
  6729. fn += '-py' + SDK["PYTHONVERSION"][6:]
  6730. if GetOptimize() <= 2:
  6731. fn += "-dbg"
  6732. if GetTargetArch() == 'x64':
  6733. fn += '-x64'
  6734. dir += '-x64'
  6735. MakeInstallerNSIS(fn + '.exe', title, 'C:\\' + dir)
  6736. if not RUNTIME:
  6737. MakeDebugSymbolArchive(fn + '-pdb.zip', dir)
  6738. elif (target == 'linux'):
  6739. MakeInstallerLinux()
  6740. elif (target == 'darwin'):
  6741. MakeInstallerOSX()
  6742. elif (target == 'freebsd'):
  6743. MakeInstallerFreeBSD()
  6744. elif (target == 'android'):
  6745. MakeInstallerAndroid()
  6746. else:
  6747. exit("Do not know how to make an installer for this platform")
  6748. if WHEEL:
  6749. ProgressOutput(100.0, "Building wheel")
  6750. from makewheel import makewheel
  6751. makewheel(WHLVERSION, GetOutputDir())
  6752. finally:
  6753. SaveDependencyCache()
  6754. ##########################################################################################
  6755. #
  6756. # Print final status report.
  6757. #
  6758. ##########################################################################################
  6759. WARNINGS.append("Elapsed Time: "+PrettyTime(time.time() - STARTTIME))
  6760. printStatus("Makepanda Final Status Report", WARNINGS)
  6761. print(GetColor("green") + "Build successfully finished, elapsed time: " + PrettyTime(time.time() - STARTTIME) + GetColor())