package Ġio . x make . shared Ċ Ċ import Ġcom . intellij . execution . configuration . Environment Variables Data Ċ import Ġcom . intellij . execution . configurations . General CommandLine Ċ import Ġcom . intellij . openapi . components . Persistent State Component Ċ import Ġcom . intellij . openapi . components . State Ċ import Ġcom . intellij . openapi . components . Project Component Ċ import Ġcom . intellij . openapi . diagnostic . Logger Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġio . x make . utils . System Utils Ċ Ċ @ State ( name Ġ= Ġ" X Make Project Settings ") Ċ class ĠX Make Configuration ( // Ġthe Ġproject ĊĠĠĠ Ġval Ġproject : ĠProject Ċ ) Ġ: ĠPersistent State Component < X Make Configuration . State >, ĠProject Component Ġ{ ĊĊĠĠĠ Ġ// Ġthe Ġplatforms ĊĠĠĠ Ġval Ġplatforms Ġ= ĠarrayOf (" mac osx ", Ġ" linux ", Ġ" windows ", Ġ" android ", Ġ" iphone os ", Ġ" watch os ", Ġ" mingw ") ĊĊĠĠĠ Ġ// Ġthe Ġarchitectures ĊĠĠĠ Ġval Ġarchitectures : ĠArray < String > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġget Arch itect ures By Platform ( data . current Platform ) ĊĊĠĠĠ Ġ// Ġthe Ġmodes ĊĠĠĠ Ġval Ġmodes Ġ= ĠarrayOf (" release ", Ġ" debug ") ĊĊĠĠĠ Ġ// Ġthe Ġbuild Ġcommand Ġline ĊĠĠĠ Ġval Ġbuild CommandLine : ĠGeneral CommandLine ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmake Ġparameters ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data . verbose Output ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . add ("- v ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . add ("- w ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmake Ġcommand Ġline ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmake CommandLine ( parameters ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġthe Ġrebuild Ġcommand Ġline ĊĠĠĠ Ġval Ġrebuild CommandLine : ĠGeneral CommandLine ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmake Ġparameters ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġmutable ListOf ("- r ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data . verbose Output ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . add ("- v ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . add ("- w ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmake Ġcommand Ġline ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmake CommandLine ( parameters ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġthe Ġclean Ġcommand Ġline ĊĠĠĠ Ġval Ġclean CommandLine : ĠGeneral CommandLine ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmake Ġparameters ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġmutable ListOf (" c ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data . verbose Output ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . add ("- v ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmake Ġcommand Ġline ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmake CommandLine ( parameters ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġthe Ġclean Ġconfiguration Ġcommand Ġline ĊĠĠĠ Ġval Ġclean Configuration CommandLine : ĠGeneral CommandLine ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmake Ġparameters ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġmutable ListOf (" f ", Ġ"- c ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data . verbose Output ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . add ("- v ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data . build Output Directory Ġ!= Ġ"") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . add ("- o ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . add ( data . build Output Directory ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmake Ġcommand Ġline ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmake CommandLine ( parameters ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġthe Ġconfiguration Ġcommand Ġline ĊĠĠĠ Ġval Ġconfiguration CommandLine : ĠGeneral CommandLine ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmake Ġparameters ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmutable ListOf (" f ", Ġ"- p ", Ġdata . current Platform , Ġ"- a ", Ġdata . current Architecture , Ġ"- m ", Ġdata . current Mode ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data . current Platform Ġ== Ġ" android " Ġ&& Ġdata . android N DK Directory Ġ!= Ġ"") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . add ("-- nd k =\" ${ data . android N DK Directory }\" ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data . verbose Output ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . add ("- v ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data . build Output Directory Ġ!= Ġ"") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . add ("- o ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . add ( data . build Output Directory ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmake Ġcommand Ġline ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmake CommandLine ( parameters ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġthe Ġquick Ġstart Ġcommand Ġline ĊĠĠĠ Ġval Ġquick Start CommandLine : ĠGeneral CommandLine ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmake Ġparameters ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġmutable ListOf (" f ", Ġ"- y ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data . verbose Output ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . add ("- v ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmake Ġcommand Ġline ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmake CommandLine ( parameters ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġupdate C make Lists CommandLine : ĠGeneral CommandLine ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġmake CommandLine ( mutable ListOf (" project ", Ġ"- k ", Ġ" cmake ", Ġ"- y ")) ĊĊĠĠĠ Ġval Ġupdate Compile Comm ans Line : ĠGeneral CommandLine ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġmake CommandLine ( mutable ListOf (" project ", Ġ"- k ", Ġ" compile _ commands ")) ĊĊĠĠĠ Ġ// Ġthe Ġtargets ĊĠĠĠ Ġval Ġtargets : ĠArray < String > ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmake Ġtargets ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtargets Ġ= ĠarrayOf (" default ", Ġ" all ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresults Ġ= ĠSystem Utils . io Run v ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem Utils . x make Program , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" l ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- c ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" import (\" core . project . config \ "); Ġimport (\" core . project . project \ "); Ġconfig . load (); Ġfor Ġname , Ġ_ Ġin Ġpairs (( project . targets ())) Ġdo Ġprint ( name ) Ġend " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), Ġdata . working Directory ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresults . split ("\ n "). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . trim () Ġ!= Ġ"") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtargets Ġ+= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtargets ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġconfiguration Ġis Ġchanged ? ĊĠĠĠ Ġvar Ġchanged Ġ= Ġtrue ĊĊĠĠĠ Ġ// Ġthe Ġstate Ġdata ĊĠĠĠ Ġvar Ġ_ data : ĠState Ġ= ĠState () ĊĠĠĠ Ġvar Ġdata : ĠState ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ data ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewState Ġ= ĠState ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Platform Ġ= Ġvalue . current Platform , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Architecture Ġ= Ġvalue . current Architecture , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Mode Ġ= Ġvalue . current Mode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworking Directory Ġ= Ġvalue . working Directory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġandroid N DK Directory Ġ= Ġvalue . android N DK Directory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Output Directory Ġ= Ġvalue . build Output Directory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverbose Output Ġ= Ġvalue . verbose Output , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Configuration Ġ= Ġvalue . additional Configuration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ data Ġ!= ĠnewState ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ data Ġ= ĠnewState ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanged Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġmake Ġcommand Ġline ĊĠĠĠ Ġfun Ġmake CommandLine ( ĊĠĠĠĠĠĠĠ Ġparameters : ĠList < String >, ĊĠĠĠĠĠĠĠ Ġenvironment Variables : ĠEnvironment Variables Data Ġ= ĠEnvironment Variables Data . DEFAULT ĊĠĠĠ Ġ): ĠGeneral CommandLine Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġmake Ġcommand ĊĠĠĠĠĠĠĠ Ġreturn ĠGeneral CommandLine ( System Utils . x make Program ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Parameters ( parameters ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Charset ( Charsets . UTF _ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Work Directory ( data . working Directory ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Environment ( environment Variables . envs ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Redirect Error Stream ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠState ( ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Platform : ĠString Ġ= ĠSystem Utils . platform (), ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Architecture : ĠString Ġ= Ġ"", ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Mode : ĠString Ġ= Ġ" release ", ĊĠĠĠĠĠĠĠ Ġvar Ġworking Directory : ĠString Ġ= Ġ"", ĊĠĠĠĠĠĠĠ Ġvar Ġandroid N DK Directory : ĠString Ġ= Ġ"", ĊĠĠĠĠĠĠĠ Ġvar Ġbuild Output Directory : ĠString Ġ= Ġ"", ĊĠĠĠĠĠĠĠ Ġvar Ġverbose Output : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġvar Ġadditional Configuration : ĠString Ġ= Ġ"" ĊĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// Ġensure Ġstate ĊĠĠĠ Ġprivate Ġfun Ġensure State () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( data . working Directory Ġ== Ġ"") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . working Directory Ġ= Ġproject . basePath . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( data . current Architecture Ġ== Ġ"" Ġ&& Ġarchitectures . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . current Architecture Ġ= Ġarchitectures [ 0 ] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġget Ġand Ġsave Ġstate Ġto Ġfile ĊĠĠĠ Ġoverride Ġfun ĠgetState (): ĠState Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdata ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġload Ġstate Ġfrom Ġfile ĊĠĠĠ Ġoverride Ġfun Ġload State ( state : ĠState ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdata Ġ= Ġstate ĊĠĠĠĠĠĠĠ Ġensure State () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinit Component () Ġ{ ĊĠĠĠĠĠĠĠ Ġensure State () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdispose Component () Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Component Name (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" X Make Configuration " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġproject Opened () Ġ{ ĊĠĠĠĠĠĠĠ Ġensure State () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġproject Closed () Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġget Ġarchitectures Ġby Ġplatform ĊĠĠĠĠĠĠĠ Ġfun Ġget Arch itect ures By Platform ( platform : ĠString ) Ġ= Ġwhen Ġ( platform ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" mac osx ", Ġ" linux ", Ġ" mingw " Ġ-> ĠarrayOf (" x 8 6 _ 6 4 ", Ġ" i 3 8 6 ", Ġ" arm 6 4 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" windows " Ġ-> ĠarrayOf (" x 8 6 ", Ġ" x 6 4 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" iphone os " Ġ-> ĠarrayOf (" arm 6 4 ", Ġ" arm v 7 ", Ġ" arm v 7 s ", Ġ" x 8 6 _ 6 4 ", Ġ" i 3 8 6 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" watch os " Ġ-> ĠarrayOf (" arm v 7 s ", Ġ" i 3 8 6 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" android " Ġ-> ĠarrayOf (" arm v 7 - a ", Ġ" arm v 5 te ", Ġ" arm v 6 ", Ġ" arm v 8 - a ", Ġ" arm 6 4 - v 8 a ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠarrayOf () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġget Ġlog ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLog Ġ= ĠLogger . getInstance ( X Make Configuration :: class . java . getName ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ val ĠProject . x make Configuration : ĠX Make Configuration ĊĠĠĠ Ġget () Ġ= Ġthis . getComponent ( X Make Configuration :: class . java ) ĊĠĠĠĠĠĠĠ Ġ?: Ġerror (" Failed Ġto Ġget ĠX Make Configuration Ġfor Ġ$ this ") Ċ Ċ val ĠProject . x make Configuration OrNull : ĠX Make Configuration ? ĊĠĠĠ Ġget () Ġ= Ġthis . getComponent ( X Make Configuration :: class . java ) Ġ?: Ġnull ĊĊ