/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 7 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . android . build . gradle . tasks Ċ Ċ import Ġcom . android . build . gradle . external . cmake . C make Utils Ċ import Ġcom . android . build . gradle . external . cmake . server . Compute Result Ċ import Ġcom . android . build . gradle . external . cmake . server . Configure Command Result Ċ import Ġcom . android . build . gradle . external . cmake . server . Handshake Request Ċ import Ġcom . android . build . gradle . external . cmake . server . Protocol Version Ċ import Ġcom . android . build . gradle . external . cmake . server . Server Ċ import Ġcom . android . build . gradle . external . cmake . server . Server Factory Ċ import Ġcom . android . build . gradle . external . cmake . server . Server Utils Ċ import Ġcom . android . build . gradle . external . cmake . server . Target Ċ import Ġcom . android . build . gradle . external . cmake . server . find Runtime Files Ċ import Ġcom . android . build . gradle . external . cmake . server . receiver . Interactive Message Ċ import Ġcom . android . build . gradle . external . cmake . server . receiver . Server Receiver Ċ import Ġcom . android . build . gradle . internal . cxx . cmake . make C make Message Paths Absolute Ċ import Ġcom . android . build . gradle . internal . cxx . cmake . parse Link Libraries Ċ import Ġcom . android . build . gradle . internal . cxx . configure . convert CMake To Compile Commands Bin Ċ import Ġcom . android . build . gradle . internal . cxx . configure . getC make Binary Output Path Ċ import Ġcom . android . build . gradle . internal . cxx . configure . getC make Generator Ċ import Ġcom . android . build . gradle . internal . cxx . configure . only Keep C make Server Arguments Ċ import Ġcom . android . build . gradle . internal . cxx . configure . to C make Arguments Ċ import Ġcom . android . build . gradle . internal . cxx . configure . toString List Ċ import Ġcom . android . build . gradle . internal . cxx . json . Android Build Gradle Json s Ċ import Ġcom . android . build . gradle . internal . cxx . json . Native Build Config Value Ċ import Ġcom . android . build . gradle . internal . cxx . json . Native Library Value Ċ import Ġcom . android . build . gradle . internal . cxx . logging . Pass Through PrintWriter Logging Environment Ċ import Ġcom . android . build . gradle . internal . cxx . logging . error ln Ċ import Ġcom . android . build . gradle . internal . cxx . logging . inf ol n Ċ import Ġcom . android . build . gradle . internal . cxx . logging . warn ln Ċ import Ġcom . android . build . gradle . internal . cxx . model . Cxx Ab i Model Ċ import Ġcom . android . build . gradle . internal . cxx . model . Cxx Variant Model Ċ import Ġcom . android . build . gradle . internal . cxx . model . additional Project Files Index File Ċ import Ġcom . android . build . gradle . internal . cxx . model . cmake Server LogFile Ċ import Ġcom . android . build . gradle . internal . cxx . model . compile Commands Json Bin File Ċ import Ġcom . android . build . gradle . internal . cxx . model . compile Commands Json File Ċ import Ġcom . android . build . gradle . internal . cxx . model . get Build Command Arguments Ċ import Ġcom . android . build . gradle . internal . cxx . model . json File Ċ import Ġcom . android . ide . common . process . Process Exception Ċ import Ġcom . android . ide . common . process . Process Info Builder Ċ import Ġcom . google . common . annotations . Visible ForTesting Ċ import Ġcom . google . common . collect . Maps Ċ import Ġcom . google . wire less . android . sdk . stats . Gradle Build Variant Ċ import Ġcom . google . wire less . android . sdk . stats . Gradle Native Android Module . Native Build System Type . CMAKE Ċ import Ġorg . gradle . process . Exec Operations Ċ import Ġjava . io . Buffered Writer Ċ import Ġjava . io . File Ċ import Ġjava . io . FileNotFoundException Ċ import Ġjava . io . IOException Ċ import Ġjava . io . PrintWriter Ċ import Ġjava . nio . charset . StandardCharsets Ċ import Ġjava . nio . file . Paths Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠThis Ġstrategy Ġuses Ġthe ĠVan illa - CMake Ġthat Ġsupports ĠC make Ġserver Ġversion Ġ 1 . 0 Ġto Ġconfigure Ġthe Ċ Ġ* Ġproject Ġand Ġgenerate Ġthe Ġandroid Ġbuild ĠJSON . Ċ Ġ*/ Ċ internal Ġclass ĠC make Server External Native Json Generator ( ĊĠĠĠ Ġvariant : ĠC xx Variant Model , ĊĠĠĠ Ġab is : ĠList < Cxx Ab i Model >, ĊĠĠĠ Ġvariant Builder : ĠGradle Build Variant . Builder ? Ċ ) Ġ: ĠExternal Native Json Generator ( variant , Ġab is , Ġvariant Builder ) Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġvariant Builder ?. native Build System Type Ġ= ĠCMAKE ĊĠĠĠĠĠĠĠ Ġcmake Makefile Checks ( variant ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġcmake Ġget () Ġ= Ġvariant . module . cmake !! ĊĊĠĠĠ Ġoverride Ġfun Ġexecute Process ( ops : ĠExec Operations , Ġabi : ĠC xx Ab i Model ) Ġ{ ĊĠĠĠĠĠĠĠ Ġexecute Process AndGet Output ( abi ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Process Builder ( abi : ĠC xx Ab i Model ): ĠProcess Info Builder Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠProcess Info Builder () ĊĠĠĠĠĠĠĠ Ġbuilder . set Executable ( cmake . cmake Exe !! ) ĊĠĠĠĠĠĠĠ Ġbuilder . add Args ( abi . configuration Arguments ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExec utes Ġthe ĠJSON Ġgeneration Ġprocess . ĠReturn Ġthe Ġcombination Ġof ĠST DIO Ġand ĠSTDERR Ġfrom Ġrunning ĊĠĠĠĠ Ġ* Ġthe Ġprocess . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠReturns Ġthe Ġcombination Ġof ĠST DIO Ġand ĠSTDERR Ġfrom Ġrunning Ġthe Ġprocess . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġexecute Process AndGet Output ( abi : ĠC xx Ab i Model ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠOnce Ġa ĠC make Ġserver Ġobject Ġis Ġcreated ĊĠĠĠĠĠĠĠ Ġ// Ġ- Ġconnect Ġto Ġthe Ġserver ĊĠĠĠĠĠĠĠ Ġ// Ġ- Ġperform Ġa Ġhandshake ĊĠĠĠĠĠĠĠ Ġ// Ġ- Ġconfigure Ġand Ġcompute . ĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġthe ĠNative Build Config Value Ġand Ġwrite Ġthe Ġrequired ĠJSON Ġfile . ĊĠĠĠĠĠĠĠ Ġval Ġcmake Server LogFile Ġ= Ġabi . cmake Server LogFile . absolute File ĊĠĠĠĠĠĠĠ Ġcmake Server LogFile . parent File . mkdir s () ĊĠĠĠĠĠĠĠ ĠPass Through PrintWriter Logging Environment ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPrintWriter ( cmake Server LogFile , Ġ" UTF - 8 "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCMAKE _ SERVER _ LOG _ PREFIX ĊĠĠĠĠĠĠĠ Ġ). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġa Ġnew Ġcmake Ġserver Ġfor Ġthe Ġgiven ĠC make Ġand Ġconfigure Ġthe Ġgiven Ġproject . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserver Receiver Ġ= ĠServer Receiver () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage Receiver Ġ{ Ġmessage : ĠInteractive Message Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Interactive Message ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage , Ġvariant . module . make File . parent File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Diagnostic Receiver Ġ{ Ġmessage : ĠString ? Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin fol n ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcmake Bin Folder Ġ= Ġcmake . cmake Exe !!. parent File ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcmake Server Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠServer Factory . create ( cmake Bin Folder , Ġserver Receiver ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cmake Server Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Ġ= ĠC make Utils . getVersion ( cmake Bin Folder ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString . format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Actual ĠCMake Ġversion Ġ'% s .% s .% s ' Ġdid Ġnot Ġsatisfy Ġrequested Ġminimum Ġor Ġdefault Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" CMake Ġminimum Ġversion Ġ'% s '. ĠPo ss ibly Ġcmake . dir Ġdoesn 't Ġmatch Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" android . external Native Build . cmake . version .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual . major , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual . minor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual . micro , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcmake . minimum C make Version ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! cmake Server . connect ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unable Ġto Ġconnect Ġto ĠC make Ġserver Ġlocated Ġat : Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġcmake Bin Folder . absolute Path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarguments Ġ= Ġabi . configuration Arguments . to C make Arguments () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcache Arguments List Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . only Keep C make Server Arguments () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toString List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfigure Command Result : ĠConfigure Command Result ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHand shake ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Handshake ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . getC make Generator () !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariant . module . make File . parent File , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( arguments . getC make Binary Output Path () !! ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcmake Server ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠConfigure ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs Array Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache Arguments List . to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure Command Result Ġ= Ġcmake Server . configure (* args Array ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Server Utils . is Configure Result Valid ( configure Command Result . configure Result )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠProcess Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString . format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Error Ġconfiguring ĠCMake Ġserver Ġ(% s ).\ r \ n % s ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcmake Server . cmake Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure Command Result . interactive Messages ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcompute Result Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Compute ( cmake Server ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Server Utils . is Computed Result Valid ( compute Result )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠProcess Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠError Ġcomputing ĠCMake Ġserver Ġresult . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ${ configure Command Result . interactive Messages } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Android Gradle Build ( abi , Ġcmake Server ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcmake Server . disconnect () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRequests Ġa Ġhandshake Ġto Ġa Ġconnected ĠC make Ġserver . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIOException ĠI / O Ġfailure . ĠNote : ĠThe Ġfunction Ġthrows ĠRuntimeException Ġif Ġwe Ġreceive Ġan ĊĠĠĠĠ Ġ* Ġinvalid / err one ous Ġhandshake Ġresult . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġdo Handshake ( ĊĠĠĠĠĠĠĠ Ġgenerator : ĠString , ĊĠĠĠĠĠĠĠ Ġsource Directory : ĠFile , ĊĠĠĠĠĠĠĠ Ġbuild Directory : ĠFile , ĊĠĠĠĠĠĠĠ Ġcmake Server : ĠServer ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsupported Protocol Versions Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcmake Server . supported Version ĊĠĠĠĠĠĠĠ Ġif Ġ( supported Protocol Versions Ġ== Ġnull Ġ|| Ġsupported Protocol Versions . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString . format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Gradle Ġdoes Ġnot Ġsupport Ġthe ĠC make Ġserver Ġversion . Ġ% s ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetC make Info String ( cmake Server ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġhandshake Result Ġ= Ġcmake Server . handshake ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Handshake Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerator , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Directory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Directory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsupported Protocol Versions [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! Server Utils . is Handshake Result Valid ( handshake Result )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString . format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Invalid Ġhandshake Ġresult Ġfrom ĠC make Ġserver : Ġ\ n % s \ n % s ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC make Utils . getObject ToString ( handshake Result ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetC make Info String ( cmake Server ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġa Ġdefault Ġhandshake Ġrequest Ġfor Ġthe Ġgiven ĠC make Ġserver - protocol Ġversion ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġhandshake Ġrequest ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Handshake Request ( ĊĠĠĠĠĠĠĠ Ġgenerator : ĠString , ĊĠĠĠĠĠĠĠ Ġsource Directory : ĠFile , ĊĠĠĠĠĠĠĠ Ġbuild Directory : ĠFile , ĊĠĠĠĠĠĠĠ Ġcmake Server Protocol Version : ĠProtocol Version ĊĠĠĠ Ġ): ĠHand shake Request Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! source Directory . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror ln (" Not Ġa Ġdirectory : Ġ% s ", Ġsource Directory ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġhandshake Request Ġ= ĠHand shake Request () ĊĠĠĠĠĠĠĠ Ġhandshake Request . cookie Ġ= Ġ" gradle - cmake - cookie " ĊĠĠĠĠĠĠĠ Ġhandshake Request . generator Ġ= Ġgenerator ĊĠĠĠĠĠĠĠ Ġhandshake Request . protocol Version Ġ= Ġcmake Server Protocol Version ĊĠĠĠĠĠĠĠ Ġhandshake Request . build Directory Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnormalize FilePath ( build Directory ) ĊĠĠĠĠĠĠĠ Ġhandshake Request . source Directory Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnormalize FilePath ( source Directory ) ĊĠĠĠĠĠĠĠ Ġreturn Ġhandshake Request ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerates Ġnative Build Config Value Ġby Ġgenerating Ġthe Ġcode Ġmodel Ġfrom Ġthe Ġcmake Ġserver Ġand ĊĠĠĠĠ Ġ* Ġwrites Ġthe Ġandroid _ gradle _ build . json . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIOException ĠI / O Ġfailure ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġgenerate Android Gradle Build ( ĊĠĠĠĠĠĠĠ Ġabi : ĠC xx Ab i Model , Ġcmake Server : ĠServer ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnative Build Config Value Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Native Build Config Value ( abi , Ġcmake Server ) ĊĠĠĠĠĠĠĠ ĠAndroid Build Gradle Json s . write Native Build Config Value ToJson File ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġabi . json File , Ġnative Build Config Value ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġconvert CMake To Compile Commands Bin ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġabi . compile Commands Json File , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġabi . compile Commands Json Bin File ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns ĠNative Build Config Value Ġfor Ġthe Ġgiven Ġabi Ġfrom Ġthe Ġgiven ĠC make Ġserver . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġreturns ĠNative Build Config Value ĊĠĠĠĠ Ġ* Ġ@ throws ĠIOException ĠI / O Ġfailure ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġget Native Build Config Value ( ĊĠĠĠĠĠĠĠ Ġabi : ĠC xx Ab i Model , Ġcmake Server : ĠServer ĊĠĠĠ Ġ): ĠNative Build Config Value Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnative Build Config Value Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Default Native Build Config Value () ĊĠĠĠĠĠĠĠ Ġassert ( native Build Config Value . build Files Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠ Ġnative Build Config Value . build Files !!. addAll ( get Build Files ( cmake Server )) ĊĠĠĠĠĠĠĠ Ġassert ( native Build Config Value . clean Commands Components Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠ Ġnative Build Config Value . clean Commands Components !!. add ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC make Utils . get Clean Command ( cmake . cmake Exe !! , Ġabi . cxx Build Folder ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert ( native Build Config Value . build Targets Command Components Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠ Ġnative Build Config Value . build Targets Command Components Ġ= ĠC make Utils . get Build Targets Command ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcmake . cmake Exe !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġabi . cxx Build Folder , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġabi . get Build Command Arguments () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġcode Model Ġ= Ġcmake Server . code model () ĊĠĠĠĠĠĠĠ Ġif Ġ(! Server Utils . is Code Model Valid ( code Model )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString . format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Invalid Ġcode Ġmodel Ġreceived Ġfrom ĠC make Ġserver : Ġ\ n % s \ n % s ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC make Utils . getObject ToString ( code Model ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetC make Info String ( cmake Server ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġassert ( native Build Config Value . c File Extensions Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠ Ġnative Build Config Value . c File Extensions !!. addAll ( C make Utils . getC Extension Set ( code Model )) ĊĠĠĠĠĠĠĠ Ġassert ( native Build Config Value . cpp File Extensions Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠ Ġnative Build Config Value . cpp File Extensions !!. addAll ( C make Utils . get Cpp Extension Set ( code Model )) ĊĊĠĠĠĠĠĠĠ Ġabi . additional Project Files Index File . buffered Writer ( StandardCharsets . UTF _ 8 ). use Ġ{ Ġadditional Project Files Index Writer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFill Ġin Ġthe Ġrequired Ġfields Ġin ĠNative Build Config Value Ġfrom Ġthe Ġcode Ġmodel Ġobtained Ġfrom ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠC make Ġserver . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( config Ġin Ġcode Model . configurations ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( project Ġin Ġconfig . projects ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( target Ġin Ġproject . targets ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIgnore Ġtargets Ġthat Ġaren 't Ġvalid . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! can Add Target To Native Library ( target )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnative Library Value Ġ= Ġget Native Library Value ( abi , Ġtarget , Ġadditional Project Files Index Writer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlibrary Name Ġ= Ġtarget . name Ġ+ Ġ"-" Ġ+ Ġconfig . name Ġ+ Ġ"-" Ġ+ Ġabi . abi . tag ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( native Build Config Value . libraries Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnative Build Config Value . libraries ! ![ library Name ] Ġ= Ġnative Library Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ// Ġtarget ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ// Ġproject ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnative Build Config Value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġ@ Throws ( FileNotFoundException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġget Native Library Value ( ĊĠĠĠĠĠ Ġabi : ĠC xx Ab i Model , ĊĠĠĠĠĠ Ġtarget : ĠTarget , ĊĠĠĠĠĠ Ġadditional Project Files Index Writer : ĠBuffered Writer , ĊĠĠĠ Ġ): ĠNative Library Value Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Native Library Value ( ĊĠĠĠĠĠĠĠĠĠ Ġcmake . cmake Exe !! , ĊĠĠĠĠĠĠĠĠĠ Ġabi . cxx Build Folder , ĊĠĠĠĠĠĠĠĠĠ Ġvariant . isDebug gable Enabled , ĊĠĠĠĠĠĠĠĠĠ Ġabi . abi . tag , ĊĠĠĠĠĠĠĠĠĠ Ġtarget , ĊĠĠĠĠĠĠĠĠĠ Ġadditional Project Files Index Writer ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġlist Ġof Ġbuild Ġfiles Ġused Ġby ĠCMake Ġas Ġpart Ġof Ġthe Ġbuild Ġsystem . ĠTemporary Ġfiles ĊĠĠĠĠ Ġ* Ġare Ġcurrently Ġignored . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Build Files ( cmake Server : ĠServer ): ĠList < File > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcmake Inputs Result Ġ= Ġcmake Server . cmake Inputs () ĊĠĠĠĠĠĠĠ Ġif Ġ(! Server Utils . is C make Inputs Result Valid ( cmake Inputs Result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġcmake Inputs Result . build Files Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen ĠCMake Ġserver Ġdoesn 't Ġreturn Ġa Ġresult Ġjust Ġuse Ġthe ĠCMake Lists . txt Ġwe Ġknow Ġabout . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( variant . module . make File . absolute File ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġpath Ġto Ġthe Ġbuild Ġfile Ġsource Ġmight Ġbe Ġrelative , Ġso Ġuse Ġthe Ġabsolute Ġpath Ġusing ĊĠĠĠĠĠĠĠ Ġ// Ġsource Ġdirectory Ġinformation . ĊĠĠĠĠĠĠĠ Ġval Ġsource Directory = ĠFile ( cmake Inputs Result . source Directory ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġvariant . module . make File . absolute File . parent ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfiles Ġ= ĠlistOf ( variant . module . make File ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcmake Inputs Result . build Files ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCombine Ġmultiple Ġresults Ġfrom ĠCMake Ġserver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġbuild Files Ġ-> Ġbuild Files . sources ?. filter NotNull () Ġ?: ĠlistOf () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠFile ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġremove Ġduplicates , Ġfilter Ġdown Ġto Ġonly ĠCMake Lists . txt ĊĠĠĠĠĠĠĠ Ġreturn Ġfiles ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThrow Ġaway Ġeverything Ġexcept ĠCMake Lists . txt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . name . compareTo (" CMake Lists . txt ", Ġignore Case Ġ= Ġtrue ) Ġ== Ġ 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMake Ġcanonical ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġfile Ġ-> Ġsource Directory . resolve ( file ). canonical File Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove Ġduplicates ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSort Ġby Ġlength Ġof Ġpath Ġto Ġput Ġmore Ġimportant Ġones Ġhigher Ġfor Ġread ability ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ Ġit . path . length Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCMAKE _ SERVER _ LOG _ PREFIX Ġ= Ġ" CMAKE ĠSERVER : Ġ" ĊĊĠĠĠĠĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠgetC make Info String ( cmake Server : ĠServer ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠString . format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" C make Ġpath : Ġ% s , Ġversion : Ġ% s ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcmake Server . cmake Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC make Utils . getVersion ( File ( cmake Server . cmake Path )). toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠLogs Ġinfo / warning / error Ġfor Ġthe Ġgiven Ġinteractive Ġmessage . ĠThrows Ġa ĠRun Time Exception Ġin Ġcase ĊĠĠĠĠĠĠĠĠ Ġ* Ġof Ġan Ġ' error ' Ġmessage Ġtype . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġlog Interactive Message ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage : ĠInteractive Message , Ġmake File Directory : ĠFile ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCMake Ġerror / warning Ġprefix Ġstrings . ĠThe ĠCMake Ġerrors Ġand Ġwarnings Ġare Ġpart Ġof Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmessage Ġtype Ġ" message " Ġeven Ġthough ĠCMake Ġis Ġreporting Ġerrors / warnings Ġ( Note : ĠThey Ġcould ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhave Ġa Ġtitle Ġthat Ġsays Ġif Ġit 's Ġan Ġerror Ġor Ġwarning , Ġwe Ġcheck Ġthat Ġfirst Ġbefore Ġchecking ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġprefix Ġof Ġthe Ġmessage Ġstring ). ĠHence Ġwe Ġwould Ġneed Ġto Ġparse Ġthe Ġoutput Ġmessage Ġto ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfigure Ġout Ġif Ġwe Ġneed Ġto Ġlog Ġthem Ġas Ġerror Ġor Ġwarning . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcmake Error Prefix Ġ= Ġ" CMake ĠError " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcmake Warning Prefix Ġ= Ġ" CMake ĠWarning " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġfinal Ġmessage Ġreceived Ġis Ġof Ġtype Ġerror , Ġlog Ġand Ġerror Ġand Ġthrow Ġan Ġexception . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNote : ĠThis Ġis Ġnot Ġthe Ġsame Ġas Ġa Ġmessage Ġwith Ġtype Ġ" message " Ġwith Ġerror Ġinformation , Ġthat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcase Ġis Ġhandled Ġbelow . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message . type Ġ!= Ġnull Ġ&& Ġmessage . type Ġ== Ġ" error ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror ln ( make C make Message Paths Absolute ( message . errorMessage , Ġmake File Directory )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcorrected Message Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmake C make Message Paths Absolute ( message . message , Ġmake File Directory ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message . title Ġ!= Ġnull Ġ&& Ġmessage . title Ġ== Ġ" Error " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġmessage . message . startsWith ( cmake Error Prefix ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror ln ( corrected Message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message . title Ġ!= Ġnull Ġ&& Ġmessage . title Ġ== Ġ" Warning " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġmessage . message . startsWith ( cmake Warning Prefix ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwarn ln ( corrected Message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin fol n ( corrected Message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠGenerate Ġbuild Ġsystem Ġfiles Ġin Ġthe Ġbuild Ġdirectly , Ġor Ġcompute Ġthe Ġgiven Ġproject Ġand Ġreturns ĊĠĠĠĠĠĠĠĠ Ġ* Ġthe Ġcomputed Ġresult . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġcmake Server ĠConnected Ġcmake Ġserver . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ throws ĠIOException ĠI / O Ġfailure . ĠNote : ĠThe Ġfunction Ġthrows ĠRuntimeException Ġif Ġwe Ġreceive Ġan ĊĠĠĠĠĠĠĠĠ Ġ* Ġinvalid / err one ous ĠCompute Result . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġdo Compute ( cmake Server : ĠServer ): ĠCompute Result Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcmake Server . compute () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠĠĠĠĠ Ġfun Ġget Native Library Value ( ĊĠĠĠĠĠĠĠĠĠ Ġcmake Executable : ĠFile , ĊĠĠĠĠĠĠĠĠĠ Ġoutput Folder : ĠFile , ĊĠĠĠĠĠĠĠĠĠ Ġis Debug gable : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠ Ġabi : ĠString , ĊĠĠĠĠĠĠĠĠĠ Ġtarget : ĠTarget , ĊĠĠĠĠĠĠĠĠĠ Ġadditional Project Files Index Writer : ĠBuffered Writer , ĊĠĠĠĠĠĠĠ Ġ): ĠNative Library Value Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnative Library Value Ġ= ĠNative Library Value () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnative Library Value . abi Ġ= Ġabi ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnative Library Value . build Command Components Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC make Utils . get Build Command ( cmake Executable , Ġoutput Folder , Ġtarget . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnative Library Value . artifact Name Ġ= Ġtarget . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnative Library Value . build Type Ġ= Ġif Ġ( isDebug gable ) Ġ" debug " Ġelse Ġ" release " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġtarget Ġtype Ġis Ġan ĠOBJECT _ LIBRARY , Ġit Ġdoes Ġnot Ġbuild Ġany Ġoutput Ġthat Ġwe Ġcare . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(" OBJECT _ LIBRARY " Ġ!= Ġtarget . type Ġ// Ġartifacts Ġof Ġan Ġobject Ġlibrary Ġcould Ġbe Ġnull . ĠSee Ġexample Ġin Ġb / 1 4 4 9 3 8 5 1 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġtarget . artifacts Ġ!= Ġnull Ġ&& Ġtarget . artifacts . isNotEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe 'll Ġhave Ġonly Ġone Ġoutput , Ġso Ġget Ġthe Ġfirst Ġone . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnative Library Value . output Ġ= ĠFile ( target . artifacts [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnative Library Value . runtime Files Ġ= Ġtarget . find Runtime Files () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Directory Ġ= ĠFile ( target . source Directory ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( file Group Ġin Ġtarget . file Groups . or Empty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file Group . language Ġ== Ġ" C " Ġ|| Ġfile Group . language Ġ== Ġ" CXX ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSkip ĠC Ġand ĠCXX Ġsince Ġthese Ġare Ġcontained Ġin Ġcompile _ commands . json Ġalready . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( source Ġin Ġfile Group . sources ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Project Files Index Writer . append ln ( source Directory . resolve ( source ). absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnative Library Value ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠHelper Ġfunction Ġthat Ġreturns Ġtrue Ġif Ġthe ĠTarget Ġobject Ġis Ġvalid Ġto Ġbe Ġadded Ġto Ġnative ĊĠĠĠĠĠĠĠĠ Ġ* Ġlibrary . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcan Add Target To Native Library ( target : ĠTarget ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġtarget Ġhas Ġartifact , Ġthen Ġwe Ġneed Ġto Ġbuild Ġit . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġtarget Ġhas Ġfiles , Ġthen Ġwe Ġneed Ġit Ġfor Ġint ell is ense . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtarget . artifacts Ġ!= Ġnull Ġ|| Ġtarget . file Groups Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCreates Ġa Ġdefault ĠNative Build Config Value . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġa Ġdefault ĠNative Build Config Value . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcreate Default Native Build Config Value (): ĠNative Build Config Value Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnative Build Config Value Ġ= ĠNative Build Config Value () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnative Build Config Value . build Files Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnative Build Config Value . clean Commands Components Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnative Build Config Value . libraries Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHashMap () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnative Build Config Value . tool chains Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHashMap () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnative Build Config Value . c File Extensions Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnative Build Config Value . cpp File Extensions Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnative Build Config Value . string Table Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMaps . new HashMap () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnative Build Config Value ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠReturns Ġthe Ġnormalized Ġpath Ġfor Ġthe Ġgiven Ġfile . ĠThe Ġnormalized Ġpath Ġfor ĠUnix Ġis Ġthe Ġdefault ĊĠĠĠĠĠĠĠĠ Ġ* Ġstring Ġreturned Ġby ĠgetPath . ĠFor ĠMicrosoft ĠWindows , ĠgetPath Ġreturns Ġa Ġpath Ġwith Ġ"\ \" Ġ( example : ĊĠĠĠĠĠĠĠĠ Ġ* Ġ" C :\\ Android \\ Sdk ") Ġwhile ĠVan illa - CMake Ġpref ers Ġa Ġforward Ġslash Ġ( example Ġ" C :/ Android / Sdk "), ĊĠĠĠĠĠĠĠĠ Ġ* Ġwithout Ġthe Ġforward Ġslash , ĠCMake Ġwould Ġmix Ġbackward Ġslash Ġand Ġforward Ġslash Ġcausing Ġcompiler ĊĠĠĠĠĠĠĠĠ Ġ* Ġissues . ĠThis Ġfunction Ġreplaces Ġthe Ġbackward Ġsl ashes Ġwith Ġforward Ġsl ashes Ġfor ĠMicrosoft ĊĠĠĠĠĠĠĠĠ Ġ* ĠWindows . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġnormalize FilePath ( file : ĠFile ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is Windows ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . path . replace ("\\ ", Ġ"/") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġfile . path ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ