blob: 4fecb17f8f60a77c61d178d063712d8c877d2cff [file] [log] [blame]
import groovy.io.FileType
ext.createGenerateResourcesTask = { name, prefix, namespace, project ->
def generatedOutputDir = file("$buildDir/generated/$name/cpp")
def inputDir = file("$projectDir/src/$name/native/resources")
if (!prefix.isEmpty()) prefix += '_'
def task = project.tasks.create("generateResources-$name") {
outputs.dir generatedOutputDir
inputs.dir inputDir
doLast {
generatedOutputDir.mkdirs()
inputDir.eachFileRecurse (FileType.FILES) { inputFile ->
if (inputFile.name.startsWith('.')) return
def fileBytes = inputFile.bytes
def outputFile = file("$generatedOutputDir/${inputFile.name}.cpp")
def funcName = "GetResource_" + inputFile.name.replaceAll('[^a-zA-Z0-9]', '_')
outputFile.withWriter { out ->
def inputBytes = inputFile.bytes
out.print '''#include <stddef.h>
#include <string_view>
extern "C" {
static const unsigned char contents[] = { '''
for (int i = 0; i < fileBytes.size(); i++) {
out.print String.format('0x%02x', (int) fileBytes[i] & 0xff)
out.print ', '
}
out.println """};
const unsigned char* ${prefix}${funcName}(size_t* len) {
*len = ${fileBytes.size()};
return contents;
}
}"""
if (!namespace.isEmpty()) {
out.println "namespace ${namespace} {"
}
out.println """std::string_view ${funcName}() {
return std::string_view(reinterpret_cast<const char*>(contents), ${fileBytes.size()});
}"""
if (!namespace.isEmpty()) {
out.println '}'
}
}
}
}
}
return task
}