blob: 4fecb17f8f60a77c61d178d063712d8c877d2cff [file] [log] [blame]
Austin Schuh75263e32022-02-22 18:05:32 -08001import groovy.io.FileType
2
Brian Silverman8fce7482020-01-05 13:18:21 -08003ext.createGenerateResourcesTask = { name, prefix, namespace, project ->
4 def generatedOutputDir = file("$buildDir/generated/$name/cpp")
5
6 def inputDir = file("$projectDir/src/$name/native/resources")
7
8 if (!prefix.isEmpty()) prefix += '_'
9
10 def task = project.tasks.create("generateResources-$name") {
11 outputs.dir generatedOutputDir
12 inputs.dir inputDir
13
14 doLast {
15 generatedOutputDir.mkdirs()
Austin Schuh75263e32022-02-22 18:05:32 -080016 inputDir.eachFileRecurse (FileType.FILES) { inputFile ->
Brian Silverman8fce7482020-01-05 13:18:21 -080017 if (inputFile.name.startsWith('.')) return
Austin Schuh812d0d12021-11-04 20:16:48 -070018 def fileBytes = inputFile.bytes
Brian Silverman8fce7482020-01-05 13:18:21 -080019 def outputFile = file("$generatedOutputDir/${inputFile.name}.cpp")
20 def funcName = "GetResource_" + inputFile.name.replaceAll('[^a-zA-Z0-9]', '_')
21 outputFile.withWriter { out ->
22 def inputBytes = inputFile.bytes
23 out.print '''#include <stddef.h>
Austin Schuh812d0d12021-11-04 20:16:48 -070024#include <string_view>
Brian Silverman8fce7482020-01-05 13:18:21 -080025extern "C" {
26static const unsigned char contents[] = { '''
27
28 for (int i = 0; i < fileBytes.size(); i++) {
29 out.print String.format('0x%02x', (int) fileBytes[i] & 0xff)
30 out.print ', '
31 }
32 out.println """};
33const unsigned char* ${prefix}${funcName}(size_t* len) {
34 *len = ${fileBytes.size()};
35 return contents;
36}
37}"""
38 if (!namespace.isEmpty()) {
39 out.println "namespace ${namespace} {"
40 }
Austin Schuh812d0d12021-11-04 20:16:48 -070041 out.println """std::string_view ${funcName}() {
42 return std::string_view(reinterpret_cast<const char*>(contents), ${fileBytes.size()});
Brian Silverman8fce7482020-01-05 13:18:21 -080043}"""
44 if (!namespace.isEmpty()) {
45 out.println '}'
46 }
47 }
48 }
49 }
50 }
51 return task
52}