added mkdata.pl generator for cross-compiling, fixes #31
authorAndrew Karpow <andy@ndyk.de>
Sun, 19 Oct 2014 20:57:22 +0000 (22:57 +0200)
committerAndrew Karpow <andy@ndyk.de>
Sun, 19 Oct 2014 20:58:03 +0000 (22:58 +0200)
CMakeLists.txt
htdocs/mkdata.pl [new file with mode: 0755]

index 174508f..4839c84 100644 (file)
@@ -32,13 +32,18 @@ file(GLOB RESOURCES
        htdocs/index.html
 )
 
-add_executable(mkdata htdocs/mkdata.c)
-set(MKDATA_EXE $<TARGET_FILE:mkdata>)
+if(CMAKE_CROSSCOMPILING)
+       set(MKDATA_EXE ${PROJECT_SOURCE_DIR}/htdocs/mkdata.pl)
+else()
+       set(MKDATA_EXE $<TARGET_FILE:mkdata>)
+       set(MKDATA_TARGET mkdata)
+       add_executable(mkdata htdocs/mkdata.c)
+endif()
 
 add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/assets.c
-    COMMAND ${MKDATA_EXE} ${RESOURCES} > ${PROJECT_BINARY_DIR}/assets.c
-    WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
-    DEPENDS ${RESOURCES} mkdata
+       COMMAND ${MKDATA_EXE} ${RESOURCES} > ${PROJECT_BINARY_DIR}/assets.c
+       WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+       DEPENDS ${RESOURCES} ${MKDATA_TARGET}
 )
 
 set(SOURCES
diff --git a/htdocs/mkdata.pl b/htdocs/mkdata.pl
new file mode 100755 (executable)
index 0000000..c1bea88
--- /dev/null
@@ -0,0 +1,65 @@
+#!/usr/bin/perl
+# This program is used to embed arbitrary data into a C binary. It takes
+# a list of files as an input, and produces a .c data file that contains
+# contents of all these files as collection of char arrays.
+#
+# Usage: perl <this_file> <file1> [file2, ...] > embedded_data.c
+
+use File::Basename;
+
+%mimetypes = (
+  js => 'application/javascript',
+  css => 'text/css',
+  ico => 'image/vnd.microsoft.icon',
+  woff => 'application/font-woff',
+  ttf => 'application/x-font-ttf',
+  eot => 'application/octet-stream',
+  svg => 'image/svg+xml',
+  html => 'text/html'
+);
+
+foreach my $i (0 .. $#ARGV) {
+  open FD, '<:raw', $ARGV[$i] or die "Cannot open $ARGV[$i]: $!\n";
+  printf("static const unsigned char v%d[] = {", $i);
+  my $byte;
+  my $j = 0;
+  while (read(FD, $byte, 1)) {
+    if (($j % 12) == 0) {
+      print "\n";
+    }
+    printf ' %#04x,', ord($byte);
+    $j++;
+  }
+  print " 0x00\n};\n";
+  close FD;
+}
+
+print <<EOS;
+#include <stddef.h>
+#include <string.h>
+#include <sys/types.h>
+#include "src/http_server.h"
+
+static const struct embedded_file embedded_files[] = {
+EOS
+
+foreach my $i (0 .. $#ARGV) {
+  my ($ext) = $ARGV[$i] =~ /([^.]+)$/;
+  my $mime = $mimetypes{$ext};
+  $ARGV[$i] =~ s/htdocs//;
+  print "  {\"$ARGV[$i]\", v$i, \"$mime\", sizeof(v$i) - 1},\n";
+}
+
+print <<EOS;
+  {NULL, NULL, NULL, 0}
+};
+
+const struct embedded_file *find_embedded_file(const char *name) {
+  const struct embedded_file *p;
+  for (p = embedded_files; p->name != NULL; p++)
+    if (!strcmp(p->name, name))
+      return p;
+  return NULL;
+}
+
+EOS