From 2b5a4c6fa0d90c586eb4da84263b75786772eda6 Mon Sep 17 00:00:00 2001 From: Andrew Karpow Date: Sun, 19 Oct 2014 22:57:22 +0200 Subject: [PATCH] added mkdata.pl generator for cross-compiling, fixes #31 --- CMakeLists.txt | 15 +++++++---- htdocs/mkdata.pl | 65 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 5 deletions(-) create mode 100755 htdocs/mkdata.pl diff --git a/CMakeLists.txt b/CMakeLists.txt index 174508f..4839c84 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,13 +32,18 @@ file(GLOB RESOURCES htdocs/index.html ) -add_executable(mkdata htdocs/mkdata.c) -set(MKDATA_EXE $) +if(CMAKE_CROSSCOMPILING) + set(MKDATA_EXE ${PROJECT_SOURCE_DIR}/htdocs/mkdata.pl) +else() + set(MKDATA_EXE $) + 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 index 0000000..c1bea88 --- /dev/null +++ b/htdocs/mkdata.pl @@ -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 [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 < +#include +#include +#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 <name != NULL; p++) + if (!strcmp(p->name, name)) + return p; + return NULL; +} + +EOS