# Multi-Project Cross platform gradle build

**URL:** https://discuss.gradle.org/t/multi-project-cross-platform-gradle-build/22733
**Category:** Help/Discuss
**Created:** [May 22, 2017, 5:35am UTC](https://discuss.gradle.org/t/multi-project-cross-platform-gradle-build/22733 "2017-05-22T05:35:11Z")
**Posts on this page:** 5
**Page:** 1

<div class="post-metadata">

### Author: ![Pratham](https://avatars.discourse-cdn.com/v4/letter/p/da6949/32.png) [@Pratham](https://discuss.gradle.org/u/Pratham)
#### Post date: [May 22, 2017, 5:35am UTC](https://discuss.gradle.org/t/multi-project-cross-platform-gradle-build/22733/1 "2017-05-22T05:35:11Z")

</div>

I am new to Gradle and facing some problem to build my multi-project cross platform project. Project structure is as below:

Root projects A  
Build.gradle  
Setting.gradle

- SubProject (Java)  
Build.gradle  
Setting.gradle  
SubProject J1  
SubProject J2

- SubProject Native (C/C++)  
Build.gradle  
Setting.gradle  
SubProject C1  
SubProject C2

I can build both SubProjects (C & java) individually from respective subproject’s build file. Now I want to build java and native subprojects separately (as individual tasks) from the root folder, how can I do that? What will be the content of setting.gradle file of project A?

---

<div class="post-metadata">

### Author: ![n\_s\_skvortsov](https://sea1.discourse-cdn.com/gradle/user_avatar/discuss.gradle.org/n_s_skvortsov/32/1011_2.png) [@n\_s\_skvortsov](https://discuss.gradle.org/u/n_s_skvortsov)
#### Post date: [May 22, 2017, 3:35pm UTC](https://discuss.gradle.org/t/multi-project-cross-platform-gradle-build/22733/2 "2017-05-22T15:35:14Z")

</div>

Afaik, you are supposed to have one `settings.gradle` file per multi-project build. In your case - at top level (Project A)

If you need to keep multiple `settings.gradle` and be able to build both projects separately, please take a look at [composite builds](https://docs.gradle.org/current/userguide/composite_builds.html)

---

<div class="post-metadata">

### Author: ![Pratham](https://avatars.discourse-cdn.com/v4/letter/p/da6949/32.png) [@Pratham](https://discuss.gradle.org/u/Pratham)
#### Post date: [May 22, 2017, 4:50pm UTC](https://discuss.gradle.org/t/multi-project-cross-platform-gradle-build/22733/3 "2017-05-22T16:50:55Z")

</div>

Thank you for your response. But in section 10.5 it is mention that composite builds are not supported for Native Builds. I am trying to create two separate tasks for java and native in root projects with corresponding subprojects. I am not sure whether this is right approach or not.

---

<div class="post-metadata">

### Author: ![jjustinic](https://sea1.discourse-cdn.com/gradle/user_avatar/discuss.gradle.org/jjustinic/32/9005_2.png) [@jjustinic](https://discuss.gradle.org/u/jjustinic)
#### Post date: [May 22, 2017, 6:45pm UTC](https://discuss.gradle.org/t/multi-project-cross-platform-gradle-build/22733/4 "2017-05-22T18:45:55Z")

</div>

If your structure for your entire multi-project build looks like this:

```
- Root Project: A
   - build.gradle
   - settings.gradle
   - SubProject: Java 
      - build.gradle
      - SubProject: J1
      - SubProject: J2
   - SubProject: Native
      - build.gradle
      - SubProject: C1
      - SubProject: C2

```

It is correct that you would only have one `settings.gradle` for a single multi-project build (no composite). It should like this for the above structure:

```
rootProject.name = 'A'
include 'Java'
include 'Java:J1'
include 'Java:J2'
include 'Native'
include 'Native:C1'
include 'Native:C2'

```

If you are in the root build, `gradle build` would build everything. If you’re wanting to build just one subproject tree, use the path when specifying the task. For the Java subprojects, use `gradle :Java:build`. For the Native project, use `gradle :Native:build`. The expectation is that the `Java` project `build` task is wired up to build everything in the subprojects already. If you want to create a root project task like `buildJavaProjects` or `buildNativeProjects`, you can wire up a dependency in the `A` root project:

```
task buildJavaSubProjects(dependsOn ':Java:build') {
    group = 'Build'
    description = 'Builds all Java projects.'
}

```

Alternatively, if you want the behavior of calling only `J1` and `J2` project `build` tasks (without wiring up anything special in `Java` ), you can use:

```
task buildJavaSubProjects {
    group = 'Build'
    description = 'Builds all Java projects.'
    project(':Java').subprojects { dependsOn "${it.path}:build" }
}

```

Replace `project(':Java').subprojects` with `project(':Java').allprojects` if you want `build` to run on `Java`, `J1`, and `J2` without doing anything special in `Java` (same as running `gradle build` from a project normally).

The same procedure would apply on the `Native` side.

---

<div class="post-metadata">

### Author: ![Pratham](https://avatars.discourse-cdn.com/v4/letter/p/da6949/32.png) [@Pratham](https://discuss.gradle.org/u/Pratham)
#### Post date: [May 26, 2017, 7:41am UTC](https://discuss.gradle.org/t/multi-project-cross-platform-gradle-build/22733/5 "2017-05-26T07:41:40Z")

</div>

Thank you some much…
