88import java .util .Arrays ;
99import java .util .HashMap ;
1010
11+ import org .gradle .api .DefaultTask ;
1112import org .gradle .api .GradleException ;
1213import org .gradle .api .Project ;
1314import org .gradle .api .artifacts .Configuration ;
@@ -27,10 +28,40 @@ public class OSXPrefPaneCreator extends AbstractOSXApplicationBuilder<Dmg, Setup
2728
2829 private Project project ;
2930
30- protected OSXPrefPaneCreator ( Dmg task , SetupBuilder setup , FileResolver fileResolver ) {
31+ private Service service ;
32+
33+ private String displayName ;
34+
35+ private String internalName ;
36+
37+ private File prefPaneSource ;
38+
39+ protected OSXPrefPaneCreator ( Dmg task , SetupBuilder setup , FileResolver fileResolver , Service service ) {
3140 super ( task , setup , fileResolver );
3241 buildDir = task .getTemporaryDir ();
3342 project = task .getProject ();
43+ this .service = service ;
44+
45+ displayName = service .getDisplayName ();
46+ internalName = displayName .replaceAll ( "[^A-Za-z0-9]" , "" );
47+
48+ // Create a task and run it before, this must be called in project.afterEvaluate()
49+ GradleBuild gradleBuild = project .getTasks ().create ("OSXPrefPaneBuildTask-" +internalName , GradleBuild .class );
50+ gradleBuild .setDescription ( "Run the xcodebuild task for the prefpane." );
51+ gradleBuild .setTasks ( Arrays .asList ( "clean" , "xcodebuild" ) );
52+ task .dependsOn ( gradleBuild );
53+
54+ DefaultTask gradleBuildInit = project .getTasks ().create ("OSXPrefPaneBuildTask-Init-" +internalName , DefaultTask .class );
55+ gradleBuildInit .doFirst ( (t ) -> {
56+ try {
57+ prefPaneSource = unpackAndPatchPrefPaneSource ( internalName );
58+ } catch ( Exception ex ) {
59+ ex .printStackTrace ();
60+ throw new RuntimeException ( ex );
61+ }
62+ gradleBuild .setBuildFile ( new File ( prefPaneSource , "build.gradle" ) );
63+ } );
64+ gradleBuild .dependsOn ( gradleBuildInit );
3465 }
3566
3667 /**
@@ -42,18 +73,7 @@ protected OSXPrefPaneCreator( Dmg task, SetupBuilder setup, FileResolver fileRes
4273 * @return the file to the created pref pane.
4374 * @throws Exception if any error occur
4475 */
45- void create ( Service service ) throws Exception {
46-
47- String displayName = service .getDisplayName ();
48- String internalName = displayName .replaceAll ( "[^A-Za-z0-9]" , "" );
49- File prefPaneSource = unpackAndPatchPrefPaneSource ( internalName );
50-
51- GradleBuild gradleBuild = project .getTasks ().create ("OSXPrefPaneBuildTask" , GradleBuild .class );
52- gradleBuild .setDescription ( "Run the xcodebuild task for the prefpane." );
53- gradleBuild .setBuildFile ( new File ( prefPaneSource , "build.gradle" ) );
54- gradleBuild .setTasks ( Arrays .asList ( "clean" , "xcodebuild" ) );
55- gradleBuild .execute ();
56-
76+ void create () throws Exception {
5777 File prefPaneBinary = new File ( prefPaneSource , "build/sym/Release/" + internalName + ".prefPane" );
5878
5979 if ( !prefPaneBinary .exists () ) {
@@ -169,7 +189,7 @@ private File unpackAndPatchPrefPaneSource( String internalName ) throws Exceptio
169189 }
170190
171191 // Prepare output directory
172- File outputDir = new File ( buildDir , configName );
192+ File outputDir = new File ( buildDir , internalName );
173193 outputDir .mkdirs ();
174194
175195 URL dirURL = OSXPrefPaneCreator .class .getClassLoader ().getResource ( "com/inet/gradle/setup/dmg/preferences/build.gradle" );
0 commit comments