blob: 2ca603866d4fa16242d527f5304520c17f972ad6 [file] [log] [blame]
Brian Silverman8fce7482020-01-05 13:18:21 -08001import org.gradle.language.base.internal.ProjectLayout
2
3apply plugin: 'cpp'
4apply plugin: 'c'
Austin Schuh812d0d12021-11-04 20:16:48 -07005apply plugin: 'google-test-test-suite'
Brian Silverman8fce7482020-01-05 13:18:21 -08006apply plugin: 'visual-studio'
7apply plugin: 'edu.wpi.first.NativeUtils'
8apply plugin: ExtraTasks
9
10evaluationDependsOn(':hal')
11
12apply from: '../shared/config.gradle'
Austin Schuh812d0d12021-11-04 20:16:48 -070013apply from: "${rootDir}/shared/googletest.gradle"
Brian Silverman8fce7482020-01-05 13:18:21 -080014
15ext.examplesMap = [:]
16ext.templatesMap = [:]
17
18File examplesTree = file("$projectDir/src/main/cpp/examples")
19examplesTree.list(new FilenameFilter() {
Austin Schuh812d0d12021-11-04 20:16:48 -070020 @Override
21 public boolean accept(File current, String name) {
22 return new File(current, name).isDirectory();
23 }
24 }).each {
25 examplesMap.put(it, [])
26 }
Brian Silverman8fce7482020-01-05 13:18:21 -080027File templatesTree = file("$projectDir/src/main/cpp/templates")
28templatesTree.list(new FilenameFilter() {
Austin Schuh812d0d12021-11-04 20:16:48 -070029 @Override
30 public boolean accept(File current, String name) {
31 return new File(current, name).isDirectory();
32 }
33 }).each {
34 templatesMap.put(it, [])
35 }
Brian Silverman8fce7482020-01-05 13:18:21 -080036
Austin Schuh75263e32022-02-22 18:05:32 -080037nativeUtils.platformConfigs.named(nativeUtils.wpi.platforms.windowsx64).configure {
38 linker.args.remove('/DEBUG:FULL')
39 cppCompiler.debugArgs.remove('/Zi')
40 cCompiler.debugArgs.remove('/Zi')
41}
42
Brian Silverman8fce7482020-01-05 13:18:21 -080043ext {
44 sharedCvConfigs = examplesMap + templatesMap + [commands: []]
45 staticCvConfigs = [:]
46 useJava = false
47 useCpp = true
48}
49
Austin Schuh812d0d12021-11-04 20:16:48 -070050def simModules = ["halsim_gui"]
51
Brian Silverman8fce7482020-01-05 13:18:21 -080052apply from: "${rootDir}/shared/opencv.gradle"
53
54model {
55 components {
56 commands(NativeLibrarySpec) {
57 binaries.all { binary ->
58 if (binary in StaticLibraryBinarySpec) {
59 binary.buildable = false
60 return
61 }
Brian Silverman8fce7482020-01-05 13:18:21 -080062 lib project: ':wpilibNewCommands', library: 'wpilibNewCommands', linkage: 'shared'
James Kuszmaulcf324122023-01-14 14:07:17 -080063 lib project: ':apriltag', library: 'apriltag', linkage: 'shared'
Brian Silverman8fce7482020-01-05 13:18:21 -080064 lib project: ':wpilibc', library: 'wpilibc', linkage: 'shared'
Austin Schuh1e69f942020-11-14 15:06:14 -080065 lib project: ':wpimath', library: 'wpimath', linkage: 'shared'
James Kuszmaulcf324122023-01-14 14:07:17 -080066 project(':ntcore').addNtcoreDependency(binary, 'shared')
Brian Silverman8fce7482020-01-05 13:18:21 -080067 lib project: ':cscore', library: 'cscore', linkage: 'shared'
68 project(':hal').addHalDependency(binary, 'shared')
69 lib project: ':cameraserver', library: 'cameraserver', linkage: 'shared'
James Kuszmaulcf324122023-01-14 14:07:17 -080070 lib project: ':wpinet', library: 'wpinet', linkage: 'shared'
Brian Silverman8fce7482020-01-05 13:18:21 -080071 lib project: ':wpiutil', library: 'wpiutil', linkage: 'shared'
72 }
73 sources {
74 cpp {
75 source {
76 srcDirs = ['src/main/cpp/commands']
77 include '**/*.cpp'
78 }
79 exportedHeaders {
80 srcDirs 'src/main/cpp/commands'
81 include '**/*.h'
82 }
83 }
84 }
85 }
86
87 examplesMap.each { key, value ->
88 "${key}"(NativeExecutableSpec) {
89 targetBuildTypes 'debug'
90 binaries.all { binary ->
Brian Silverman8fce7482020-01-05 13:18:21 -080091 lib project: ':wpilibNewCommands', library: 'wpilibNewCommands', linkage: 'shared'
92 lib project: ':wpilibc', library: 'wpilibc', linkage: 'shared'
James Kuszmaulcf324122023-01-14 14:07:17 -080093 lib project: ':apriltag', library: 'apriltag', linkage: 'shared'
Austin Schuh1e69f942020-11-14 15:06:14 -080094 lib project: ':wpimath', library: 'wpimath', linkage: 'shared'
James Kuszmaulcf324122023-01-14 14:07:17 -080095 project(':ntcore').addNtcoreDependency(binary, 'shared')
Brian Silverman8fce7482020-01-05 13:18:21 -080096 lib project: ':cscore', library: 'cscore', linkage: 'shared'
97 project(':hal').addHalDependency(binary, 'shared')
98 lib project: ':cameraserver', library: 'cameraserver', linkage: 'shared'
James Kuszmaulcf324122023-01-14 14:07:17 -080099 lib project: ':wpinet', library: 'wpinet', linkage: 'shared'
Brian Silverman8fce7482020-01-05 13:18:21 -0800100 lib project: ':wpiutil', library: 'wpiutil', linkage: 'shared'
Brian Silverman8fce7482020-01-05 13:18:21 -0800101 if (binary.targetPlatform.name == nativeUtils.wpi.platforms.roborio) {
Austin Schuh812d0d12021-11-04 20:16:48 -0700102 nativeUtils.useRequiredLibrary(binary, 'ni_link_libraries', 'ni_runtime_libraries')
103 }
104 if (binary.targetPlatform.name == getCurrentArch()) {
105 simModules.each {
106 lib project: ":simulation:$it", library: it, linkage: 'shared'
107 }
Brian Silverman8fce7482020-01-05 13:18:21 -0800108 }
109 }
110 sources {
111 cpp {
112 source {
113 srcDirs 'src/main/cpp/examples/' + "${key}" + "/cpp"
114 include '**/*.cpp'
115 }
116 exportedHeaders {
117 srcDirs 'src/main/cpp/examples/' + "${key}" + "/include"
118 include '**/*.h'
119 }
120 }
121 }
122 sources {
123 c {
124 source {
125 srcDirs 'src/main/cpp/examples/' + "${key}" + "/c"
126 include '**/*.c'
127 }
128 exportedHeaders {
129 srcDirs 'src/main/cpp/examples/' + "${key}" + "/include"
130 include '**/*.h'
131 }
132 }
133 }
134 }
135 }
136 templatesMap.each { key, value ->
137 "${key}"(NativeExecutableSpec) {
138 targetBuildTypes 'debug'
139 binaries.all { binary ->
Brian Silverman8fce7482020-01-05 13:18:21 -0800140 lib project: ':wpilibNewCommands', library: 'wpilibNewCommands', linkage: 'shared'
141 lib project: ':wpilibc', library: 'wpilibc', linkage: 'shared'
James Kuszmaulcf324122023-01-14 14:07:17 -0800142 lib project: ':apriltag', library: 'apriltag', linkage: 'shared'
Austin Schuh1e69f942020-11-14 15:06:14 -0800143 lib project: ':wpimath', library: 'wpimath', linkage: 'shared'
James Kuszmaulcf324122023-01-14 14:07:17 -0800144 project(':ntcore').addNtcoreDependency(binary, 'shared')
Brian Silverman8fce7482020-01-05 13:18:21 -0800145 lib project: ':cscore', library: 'cscore', linkage: 'shared'
146 project(':hal').addHalDependency(binary, 'shared')
147 lib project: ':cameraserver', library: 'cameraserver', linkage: 'shared'
James Kuszmaulcf324122023-01-14 14:07:17 -0800148 lib project: ':wpinet', library: 'wpinet', linkage: 'shared'
Brian Silverman8fce7482020-01-05 13:18:21 -0800149 lib project: ':wpiutil', library: 'wpiutil', linkage: 'shared'
Brian Silverman8fce7482020-01-05 13:18:21 -0800150 if (binary.targetPlatform.name == nativeUtils.wpi.platforms.roborio) {
Austin Schuh812d0d12021-11-04 20:16:48 -0700151 nativeUtils.useRequiredLibrary(binary, 'ni_link_libraries', 'ni_runtime_libraries')
Brian Silverman8fce7482020-01-05 13:18:21 -0800152 }
153 }
154 sources {
155 cpp {
156 source {
157 srcDirs 'src/main/cpp/templates/' + "${key}" + "/cpp"
158 include '**/*.cpp'
159 }
160 exportedHeaders {
161 srcDirs 'src/main/cpp/templates/' + "${key}" + "/include"
162 include '**/*.h'
163 }
164 }
165 }
166 }
167 }
168 }
Austin Schuh812d0d12021-11-04 20:16:48 -0700169 testSuites {
170 examplesMap.each { key, value ->
171 def testFolder = new File("${rootDir}/wpilibcExamples/src/test/cpp/examples/${key}")
172 if (testFolder.exists()) {
173 "${key}Test"(GoogleTestTestSuiteSpec) {
174 for (NativeComponentSpec c : $.components) {
175 if (c.name == key) {
176 testing c
177 break
Brian Silverman8fce7482020-01-05 13:18:21 -0800178 }
Austin Schuh812d0d12021-11-04 20:16:48 -0700179 }
180 sources {
181 cpp {
182 source {
183 srcDirs "src/test/cpp/examples/${key}/cpp"
184 include '**/*.cpp'
185 }
186 exportedHeaders {
187 srcDirs "src/test/cpp/examples/${key}/include"
188 }
189 }
190 c {
191 source {
192 srcDirs "src/test/cpp/examples/${key}/c"
193 include '**/*.c'
194 }
195 exportedHeaders {
196 srcDirs "src/test/cpp/examples/${key}/include"
197 }
Brian Silverman8fce7482020-01-05 13:18:21 -0800198 }
199 }
200 }
Brian Silverman8fce7482020-01-05 13:18:21 -0800201 }
202 }
203 }
Austin Schuh812d0d12021-11-04 20:16:48 -0700204 binaries {
205 withType(GoogleTestTestSuiteBinarySpec) {
206 lib project: ':wpilibNewCommands', library: 'wpilibNewCommands', linkage: 'shared'
207 lib project: ':wpilibc', library: 'wpilibc', linkage: 'shared'
James Kuszmaulcf324122023-01-14 14:07:17 -0800208 lib project: ':apriltag', library: 'apriltag', linkage: 'shared'
Austin Schuh812d0d12021-11-04 20:16:48 -0700209 lib project: ':wpimath', library: 'wpimath', linkage: 'shared'
James Kuszmaulcf324122023-01-14 14:07:17 -0800210 project(':ntcore').addNtcoreDependency(it, 'shared')
Austin Schuh812d0d12021-11-04 20:16:48 -0700211 lib project: ':cscore', library: 'cscore', linkage: 'shared'
212 project(':hal').addHalDependency(it, 'shared')
213 lib project: ':cameraserver', library: 'cameraserver', linkage: 'shared'
James Kuszmaulcf324122023-01-14 14:07:17 -0800214 lib project: ':wpinet', library: 'wpinet', linkage: 'shared'
Austin Schuh812d0d12021-11-04 20:16:48 -0700215 lib project: ':wpiutil', library: 'wpiutil', linkage: 'shared'
216 if (it.targetPlatform.name == nativeUtils.wpi.platforms.roborio) {
217 nativeUtils.useRequiredLibrary(it, 'ni_link_libraries', 'ni_runtime_libraries')
218 }
219 nativeUtils.useRequiredLibrary(it, 'opencv_shared')
220
221 it.cppCompiler.define('RUNNING_FRC_TESTS')
222 it.cCompiler.define('RUNNING_FRC_TESTS')
223 }
224 }
Brian Silverman8fce7482020-01-05 13:18:21 -0800225}
Austin Schuh812d0d12021-11-04 20:16:48 -0700226
Brian Silverman8fce7482020-01-05 13:18:21 -0800227apply from: 'publish.gradle'
228
229model {
230 tasks {
231 def c = $.components
232 project.tasks.register('buildDesktopCpp') { compileTask->
233 def systemArch = getCurrentArch()
234 c.each {
235 if (it in NativeExecutableSpec && it.name) {
236 it.binaries.each {
237 def arch = it.targetPlatform.name
238 if (arch == systemArch && it.buildType.name == 'debug') {
239 compileTask.dependsOn it.tasks.link
240 }
241 }
242 }
243 }
244 }
245 }
246}
247
248ext {
249 templateDirectory = new File("$projectDir/src/main/cpp/templates/")
250 templateFile = new File("$projectDir/src/main/cpp/templates/templates.json")
251 exampleDirectory = new File("$projectDir/src/main/cpp/examples/")
252 exampleFile = new File("$projectDir/src/main/cpp/examples/examples.json")
253 commandDirectory = new File("$projectDir/src/main/cpp/commands/")
254 commandFile = new File("$projectDir/src/main/cpp/commands/commands.json")
255}
256
Austin Schuh812d0d12021-11-04 20:16:48 -0700257model {
258 // Create run tasks for all examples.
259 tasks {
260 // Iterate through the components and check if it is an example.
261 $.components.each { component ->
262 if (examplesMap.containsKey(component.name)) {
263 // Get the appropriate binary and create the run task.
264 component.binaries.each { binary ->
265 if (binary.targetPlatform.name == getCurrentArch() && binary.buildType.name == "debug") {
266 project.tasks.create("run${component.name}", Exec) {
267 // Add simulation modules to HALSIM_EXTENSIONS environment variable.
268 def setupEnv = {
269 String extensions = ""
270 binary.tasks.install.installDirectory.get().getAsFile().eachFileRecurse {
271 def name = it.name
272
273 // If we don't have a shared library, skip.
274 if (!(name.endsWith('.dll') || name.endsWith('.so') || name.endsWith('.dylib')))
275 return
276
277 def file = it
278 simModules.each {
279 if (name.startsWith(it) || name.startsWith("lib$it".toString())) {
280 extensions += file.absolutePath + File.pathSeparator
281 }
282 }
283 }
284
285 if (extensions != '') {
286 environment 'HALSIM_EXTENSIONS', extensions
287 }
288 }
289
290 // Create the task dependency and run the executable.
291 doFirst { setupEnv() }
292 dependsOn binary.tasks.install
293 commandLine binary.tasks.install.runScriptFile.get().asFile.toString()
294
295 group = "application"
296 }
297 }
298 }
299 }
300 }
301 }
302}
303
304
Brian Silverman8fce7482020-01-05 13:18:21 -0800305ext {
306 isCppCommands = true
307}
308apply from: "${rootDir}/shared/examplecheck.gradle"