From e70271af6813dbb129d9d29fbc01194129d7ee98 Mon Sep 17 00:00:00 2001 From: Chris Li Date: Tue, 21 Jun 2016 14:00:18 -0400 Subject: [PATCH] Add build script and objc++ bridge --- .gitignore | 8 +- Kiwix/libkiwix/ZimIndexer.h | 24 ++ Kiwix/libkiwix/ZimIndexer.mm | 45 ++++ Kiwix/libkiwix/ZimReader.h | 58 +++++ Kiwix/libkiwix/ZimReader.mm | 345 +++++++++++++++++++++++++++ Kiwix/libkiwix/build/build-icu.sh | 116 +++++++++ Kiwix/libkiwix/build/build-xapian.sh | 99 ++++++++ Kiwix/libkiwix/build/build-xz.sh | 101 ++++++++ Kiwix/libkiwix/build/build-zim.sh | 100 ++++++++ Kiwix/libkiwix/build/installname.sh | 14 ++ 10 files changed, 907 insertions(+), 3 deletions(-) create mode 100644 Kiwix/libkiwix/ZimIndexer.h create mode 100644 Kiwix/libkiwix/ZimIndexer.mm create mode 100755 Kiwix/libkiwix/ZimReader.h create mode 100755 Kiwix/libkiwix/ZimReader.mm create mode 100755 Kiwix/libkiwix/build/build-icu.sh create mode 100755 Kiwix/libkiwix/build/build-xapian.sh create mode 100755 Kiwix/libkiwix/build/build-xz.sh create mode 100755 Kiwix/libkiwix/build/build-zim.sh create mode 100755 Kiwix/libkiwix/build/installname.sh diff --git a/.gitignore b/.gitignore index 7ce54ff0..3641bab6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ - *.xcuserstate -Kiwix/libkiwix -Pods \ No newline at end of file +Pods +Kiwix/libkiwix/C&C++ +Kiwix/libkiwix/include +Kiwix/libkiwix/shared +Kiwix/libkiwix/static \ No newline at end of file diff --git a/Kiwix/libkiwix/ZimIndexer.h b/Kiwix/libkiwix/ZimIndexer.h new file mode 100644 index 00000000..bfe7b663 --- /dev/null +++ b/Kiwix/libkiwix/ZimIndexer.h @@ -0,0 +1,24 @@ +// +// ZimIndexer.h +// Kiwix +// +// Created by Chris Li on 6/3/16. +// Copyright © 2016 Chris. All rights reserved. +// + +#import + +@protocol ZimIndexerDelegate +@optional + +- (void)didProcessArticle:(NSUInteger)processedArticleCount totalArticleCount:(NSUInteger)totalArticleCount; + +@end + +@interface ZimIndexer : NSObject + +@property (nonatomic, weak) id delegate; +- (void)start:(NSURL *)zimFileURL indexFolderURL:(NSURL *)indexFolderURL; + +@end + diff --git a/Kiwix/libkiwix/ZimIndexer.mm b/Kiwix/libkiwix/ZimIndexer.mm new file mode 100644 index 00000000..ff489b36 --- /dev/null +++ b/Kiwix/libkiwix/ZimIndexer.mm @@ -0,0 +1,45 @@ +// +// ZimIndexer.m +// Kiwix +// +// Created by Chris Li on 6/3/16. +// Copyright © 2016 Chris. All rights reserved. +// + +#include "xapianIndexer.h" +#import "ZimIndexer.h" + +@interface ZimIndexer () { + kiwix::XapianIndexer *_indexer; +} +@end + +@implementation ZimIndexer + +static id staticInstance = nil; + +- (instancetype)init { + self = [super init]; + if (self) { + _indexer = new kiwix::XapianIndexer(); + _indexer->setVerboseFlag(true); + } + staticInstance = self; + return self; +} + +- (void)start:(NSURL *)zimFileURL indexFolderURL:(NSURL *)indexFolderURL { + _indexer->start([zimFileURL fileSystemRepresentation], [indexFolderURL fileSystemRepresentation], ProgressCallback); +} + +void ProgressCallback(const UInt processedArticleCount, const UInt totalArticleCount) { + [staticInstance progressUpdate: processedArticleCount totalArticleCount: totalArticleCount]; +} + +- (void)progressUpdate:(UInt)processedArticleCount totalArticleCount:(UInt)totalArticleCount { + if ([self.delegate respondsToSelector:@selector(didProcessArticle:totalArticleCount:)]) { + [self.delegate didProcessArticle:processedArticleCount totalArticleCount:totalArticleCount]; + } +} + +@end diff --git a/Kiwix/libkiwix/ZimReader.h b/Kiwix/libkiwix/ZimReader.h new file mode 100755 index 00000000..e549db53 --- /dev/null +++ b/Kiwix/libkiwix/ZimReader.h @@ -0,0 +1,58 @@ +// +// ZimReader.h +// KiwixTest +// +// Created by Chris Li on 8/1/14. +// Copyright (c) 2014 Chris. All rights reserved. +// +// This is the wrapper class that converts all C++ functions in reader.h to Objective-C methods + +#import + +@interface ZimReader : NSObject + +- (instancetype)initWithZIMFileURL:(NSURL *)url; +@property NSURL *fileURL; + +#pragma mark - index +- (BOOL)hasIndex; + +#pragma mark - validation +- (BOOL)isCorrupted; + +#pragma mark - getData +- (NSDictionary *)dataWithContentURLString:(NSString *)contentURLString; + +#pragma mark - getURLs +- (NSString *)pageURLFromTitle:(NSString *)title;//Will return nil if there is no such page with the specific title +- (NSString *)mainPageURL;//Will return nil if the zim file have no main page, not sure if this will ever happen(Does every zim file have a main page?) +- (NSString *)getRandomPageUrl; + +#pragma mark - search +- (NSArray *)search:(NSString *)searchTerm; +- (NSArray *)searchSuggestionsSmart:(NSString *)searchTerm; +- (NSArray *)searchUsingIndex:(NSString *)searchTerm; + +#pragma mark - get meta data +- (NSString *)getArticleCount; +- (NSString *)getMediaCount; +- (NSString *)getGlobalCount; + +- (NSString *)getID; +- (NSString *)getTitle; +- (NSString *)getDesc; +- (NSString *)getLanguage; +- (NSString *)getDate; +- (NSString *)getCreator; +- (NSString *)getPublisher; +- (NSString *)getOriginID; +- (NSString *)getFileSize; +- (NSData *)getFavicon; + +- (NSString *)parseURL:(NSString *)urlPath; + +- (void)dealloc; + +- (NSURL *)fileURL; + +@end diff --git a/Kiwix/libkiwix/ZimReader.mm b/Kiwix/libkiwix/ZimReader.mm new file mode 100755 index 00000000..e74b53c0 --- /dev/null +++ b/Kiwix/libkiwix/ZimReader.mm @@ -0,0 +1,345 @@ +// +// ZimReader.m +// KiwixTest +// +// Created by Chris Li on 8/1/14. +// Copyright (c) 2014 Chris. All rights reserved. +// + +#include "reader.h" +#include "xapian.h" +#include +#import "ZimReader.h" + +#define SEARCH_SUGGESTIONS_COUNT 10 + +@interface ZimReader () { + kiwix::Reader *_reader; + Xapian::Database *_db; +} +@end + +@implementation ZimReader + +- (instancetype)initWithZIMFileURL:(NSURL *)url { + self = [super init]; + if (self) { + try { + _reader = new kiwix::Reader([url fileSystemRepresentation]); + } catch (const std::exception &e) { + return nil; + } + + try { + NSString *zimPath = [url absoluteString]; + zimPath = [zimPath stringByReplacingOccurrencesOfString:@".zimaa" withString:@".zim"]; + NSURL *xapianURl = [[NSURL fileURLWithPath:zimPath] URLByAppendingPathExtension:@"idx"]; + _db = new Xapian::Database([xapianURl fileSystemRepresentation]); + } catch (const Xapian::DatabaseOpeningError &e) {} + + self.fileURL = url; + } + + return self; +} + +#pragma mark - search + +- (NSArray *)search:(NSString *)searchTerm { + if(_db == nil) { + return [self searchSuggestionsSmart:searchTerm]; + } else { + return [self searchUsingIndex:searchTerm]; + } +} + +- (NSArray *)searchSuggestionsSmart:(NSString *)searchTerm { + string searchTermC = [searchTerm cStringUsingEncoding:NSUTF8StringEncoding]; + int count = SEARCH_SUGGESTIONS_COUNT; + NSString *bookID = [self getID]; + NSMutableArray *results = [[NSMutableArray alloc] init]; + + if(_reader->searchSuggestionsSmart(searchTermC, count)) { + string titleC; + while (_reader->getNextSuggestion(titleC)) { + NSString *title = [NSString stringWithUTF8String:titleC.c_str()]; + NSNumber *distance = [NSNumber numberWithInteger:[self levenshteinDistance:searchTerm andString:title]]; + [results addObject:@{@"title": title, + @"bookID": bookID, + @"distance": distance}]; + } + } + return results; +} + +- (NSArray *)searchUsingIndex:(NSString *)searchTerm { + try { + NSArray *searchTerms = [searchTerm componentsSeparatedByString:@" "]; + NSString *bookID = [self getID]; + Xapian::Enquire enquire(*_db); + NSMutableArray *results = [[NSMutableArray alloc] init]; + + vector queryTerms; + for (NSString *searchTerm in searchTerms) { + string searchTermC = [searchTerm cStringUsingEncoding:NSUTF8StringEncoding]; + queryTerms.push_back(searchTermC); + } + + Xapian::Query query(Xapian::Query::OP_OR, queryTerms.begin(), queryTerms.end()); + enquire.set_query(query); + + + Xapian::MSet matches = enquire.get_mset(0, SEARCH_SUGGESTIONS_COUNT); + Xapian::MSetIterator i; + for (i = matches.begin(); i != matches.end(); ++i) { + Xapian::Document doc = i.get_document(); + + NSNumber *percent = [[NSNumber alloc] initWithInt:i.get_percent()]; + NSString *path = [NSString stringWithUTF8String:doc.get_data().c_str()]; + NSString *title = [NSString stringWithUTF8String:doc.get_value(0).c_str()]; + NSString *snippet = [NSString stringWithUTF8String:doc.get_value(1).c_str()]; + NSNumber *distance = [NSNumber numberWithInteger:[self levenshteinDistance:searchTerm andString:title]]; + + NSDictionary *result = @{@"percent": percent, + @"path": path, + @"title": title, + @"snippet": snippet, + @"bookID": bookID, + @"distance": distance}; + [results addObject:result]; + } + return results; + } catch(const Xapian::Error &error) { + cout << "Xapian Exception: " << error.get_msg() << endl; + return nil; + } +} + +- (NSInteger)levenshteinDistance:(NSString *)strA andString:(NSString *)strB { + const string str1 = [strA cStringUsingEncoding:NSUTF8StringEncoding]; + const string str2 = [strB cStringUsingEncoding:NSUTF8StringEncoding]; + return levenshtein_distance(str1, str2); +} + +// Source: https://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance#C.2B.2B +int levenshtein_distance(const std::string &s1, const std::string &s2) +{ + // To change the type this function manipulates and returns, change + // the return type and the types of the two variables below. + int s1len = (int)s1.size(); + int s2len = (int)s2.size(); + + auto column_start = (decltype(s1len))1; + + auto column = new decltype(s1len)[s1len + 1]; + std::iota(column + column_start, column + s1len + 1, column_start); + + for (auto x = column_start; x <= s2len; x++) { + column[0] = x; + auto last_diagonal = x - column_start; + for (auto y = column_start; y <= s1len; y++) { + auto old_diagonal = column[y]; + auto possibilities = { + column[y] + 1, + column[y - 1] + 1, + last_diagonal + (s1[y - 1] == s2[x - 1]? 0 : 1) + }; + column[y] = std::min(possibilities); + last_diagonal = old_diagonal; + } + } + auto result = column[s1len]; + delete[] column; + return result; +} + +#pragma mark - index + +- (BOOL)hasIndex { + return _db != nil; +} + +#pragma mark - validation + +- (BOOL)isCorrupted { + return _reader->isCorrupted(); +} + +#pragma mark - getContents +- (NSDictionary *)dataWithContentURLString:(NSString *)contentURLString { + NSData *contentData; + NSString *mimeType; + NSNumber *dataLength; + + string pageURLStringC = [contentURLString cStringUsingEncoding:NSUTF8StringEncoding]; + string content; + string contentType; + unsigned int contentLength = 0; + if (_reader->getContentByUrl(pageURLStringC, content, contentLength, contentType)) { + contentData = [NSData dataWithBytes:content.data() length:contentLength]; + mimeType = [NSString stringWithUTF8String:contentType.c_str()]; + dataLength = [NSNumber numberWithUnsignedInt:contentLength]; + return @{@"data": contentData, @"mime": mimeType, @"length": dataLength}; + } else { + return @{}; + } +} + +#pragma mark - getURLs +- (NSString *)pageURLFromTitle:(NSString *)title { + NSString *pageURL = nil; + + string url; + if (_reader->getPageUrlFromTitle([title cStringUsingEncoding:NSUTF8StringEncoding], url)) { + pageURL = [NSString stringWithUTF8String:url.c_str()]; + } + if (!pageURL) NSLog(@"zimReader: Cannot find URL of a page titled %@", title); + return pageURL; +} + +- (NSString *)mainPageURL { + NSString *mainPageURL = nil; + + string mainPageURLC; + mainPageURLC = _reader->getMainPageUrl(); + mainPageURL = [NSString stringWithCString:mainPageURLC.c_str() encoding:NSUTF8StringEncoding]; + if (!mainPageURL) NSLog(@"zimReader: Cannot find URL of main page"); + return mainPageURL; +} + +- (NSString *)getRandomPageUrl { + string url = _reader->getRandomPageUrl(); + return [NSString stringWithUTF8String:url.c_str()]; +} + +#pragma mark - getCounts + +- (NSString *)getArticleCount { + return [NSString stringWithFormat:@"%u", _reader->getArticleCount()]; +} + +- (NSString *)getMediaCount { + return [NSString stringWithFormat:@"%u", _reader->getMediaCount()]; +} + +- (NSString *)getGlobalCount { + return [NSString stringWithFormat:@"%u", _reader->getGlobalCount()]; +} + +#pragma mark - get File Attributes + +- (NSString *)getID { + NSString *id = nil; + + string idC; + idC = _reader->getId(); + id = [NSString stringWithCString:idC.c_str() encoding:NSUTF8StringEncoding]; + + return id; +} + +- (NSString *)getTitle { + NSString *title = nil; + + string titleC; + titleC = _reader->getTitle(); + title = [NSString stringWithCString:titleC.c_str() encoding:NSUTF8StringEncoding]; + + return title; +} + +- (NSString *)getDesc { + NSString *description = nil; + + string descriptionC; + descriptionC = _reader->getDescription(); + description = [NSString stringWithCString:descriptionC.c_str() encoding:NSUTF8StringEncoding]; + + return description; +} + +- (NSString *)getLanguage { + NSString *language = nil; + + string languageC; + languageC = _reader->getLanguage(); + language = [NSString stringWithCString:languageC.c_str() encoding:NSUTF8StringEncoding]; + + return language; +} + +- (NSString *)getDate { + string dateC; + dateC = _reader->getDate(); + NSString *dateString = [NSString stringWithCString:dateC.c_str() encoding:NSUTF8StringEncoding]; + + return dateString; +} + +- (NSString *)getCreator { + NSString *creator = nil; + + string creatorC; + creatorC = _reader->getCreator(); + creator = [NSString stringWithCString:creatorC.c_str() encoding:NSUTF8StringEncoding]; + + return creator; +} + +- (NSString *)getPublisher { + NSString *publisher = nil; + + string publisherC; + publisherC = _reader->getOrigId(); + publisher = [NSString stringWithCString:publisherC.c_str() encoding:NSUTF8StringEncoding]; + + return publisher; +} + +- (NSString *)getOriginID { + NSString *originID = nil; + + string originIDC; + originIDC = _reader->getOrigId(); + originID = [NSString stringWithCString:originIDC.c_str() encoding:NSUTF8StringEncoding]; + + return originID; +} + +- (NSString *)getFileSize { + return [NSString stringWithFormat:@"%u", _reader->getFileSize()]; +} + +- (NSData *)getFavicon { + NSData *data; + string content; + string mimeType; + if (_reader->getFavicon(content, mimeType)) { + data = [NSData dataWithBytes:content.c_str() length:content.length()]; + } + return data; +} + +- (NSString *)parseURL:(NSString *)urlPath { + NSString *title; + string cURL = [urlPath cStringUsingEncoding:NSUTF8StringEncoding]; + char ns; + string cTitle; + if (_reader->parseUrl(cURL, &ns, cTitle)) { + title = [NSString stringWithUTF8String:cTitle.c_str()]; + } + return title; +} + +#pragma mark - dealloc +- (void)dealloc { + if (_reader != NULL) { + _reader->~Reader(); + } + + if (_db != NULL) { + _db->~Database(); + } +} + +@end diff --git a/Kiwix/libkiwix/build/build-icu.sh b/Kiwix/libkiwix/build/build-icu.sh new file mode 100755 index 00000000..434a51db --- /dev/null +++ b/Kiwix/libkiwix/build/build-icu.sh @@ -0,0 +1,116 @@ +#!/bin/bash + +ROOT=$(pwd) + +########################## ZIM ########################## + +cd icu +ICU_PATH="$(pwd)" +ICU_SOURCE_PATH=$ICU_PATH/source +ICU_FLAGS="-I$ICU_PATH/source/common/ -I$ICU_PATH/source/tools/tzcode/" + +build_iOS() +{ + cd $ROOT + ARCH=$1 + + if [ $ARCH == "i386" ] || [ $ARCH == "x86_64" ]; + then + SDKROOT="$(xcodebuild -version -sdk iphonesimulator | grep -E '^Path' | sed 's/Path: //')" + else + SDKROOT="$(xcodebuild -version -sdk iphoneos | grep -E '^Path' | sed 's/Path: //')" + fi + + export CC="$(xcrun -sdk iphoneos -find clang)" + export CFLAGS="-fembed-bitcode -isysroot $SDKROOT -I$SDKROOT/usr/include/ -I./include/ -arch $ARCH -miphoneos-version-min=7.0 $ICU_FLAGS" + + export CXX="$(xcrun -sdk iphoneos -find clang++)" + export CXXFLAGS="$CFLAGS -stdlib=libc++ -std=c++11" + + #export CPP="$CC -E" + #export CPPFLAGS="$CFLAGS" + + export LDFLAGS="-arch ${ARCH} -isysroot $SDKROOT" + + mkdir -p build-$ARCH && cd build-$ARCH + [ -e Makefile ] && make distclean + + if [ $ARCH == "i386" ] || [ $ARCH == "x86_64" ]; + then + $ICU_PATH/source/configure --prefix=$ROOT/build-$ARCH --host=i686-apple-darwin11 --enable-static --disable-shared + else + $ICU_PATH/source/configure --prefix=$ROOT/build-$ARCH --host=arm-apple-darwin --enable-static --disable-shared -with-cross-build=$ROOT/build-i386 + fi + + make +} + +build_OSX() +{ + ARCH=$1 + + cd $ICU_SOURCE_PATH + + SDKROOT="$(xcodebuild -version -sdk macosx10.11 | grep -E '^Path' | sed 's/Path: //')" + + export CC="$(xcrun -sdk macosx10.11 -find clang)" + export CFLAGS="-fembed-bitcode -isysroot $SDKROOT -arch ${ARCH} -mmacosx-version-min=10.10 $ICU_FLAGS" + + export CPP="$CC -E" + export CPPFLAGS="$CFLAGS" + + export LDFLAGS="-arch ${ARCH} -isysroot $SDKROOT" + + ./configure --prefix=$(pwd)/build/OSX/$ARCH --host=i686-apple-darwin11 --disable-static --enable-shared + + make && make install && make clean +} + +distribute() { + cd $ICU_SOURCE_PATH/build + mkdir -p Universal/iOS/lib + mkdir -p Universal/OSX/lib + + # cd iOS/armv7/lib + # for file in *.a + # do + # cd $ICU_SOURCE_PATH/build + # lipo -create iOS/armv7/lib/$file iOS/armv7s/lib/$file iOS/arm64/lib/$file iOS/x86_64/lib/$file iOS/i386/lib/$file -output Universal/iOS/lib/$file + # done + + cd OSX/i386/lib + for file in *.dylib + do + cd $ICU_SOURCE_PATH/build + lipo -create OSX/x86_64/lib/$file OSX/i386/lib/$file -output Universal/OSX/lib/$file + done + + # cd $ICU_SOURCE_PATH/build + # mkdir -p Universal/include + # cp -r iOS/armv7/include Universal +} + +# build_iOS i386 +# build_iOS x86_64 +# build_iOS armv7 +# build_iOS armv7s +# build_iOS arm64 + +# build_OSX i386 +# build_OSX x86_64 + +distribute + +# cd $ROOT +# mkdir -p build-universal/lib + +# cd build-armv7s/lib +# for file in *.a +# do +# cd $ROOT +# lipo -create build-armv7/lib/$file build-armv7s/lib/$file build-arm64/lib/$file build-i386/lib/$file build-x86_64/lib/$file -output build-universal/lib/$file +# done + +# cd $ROOT/build-armv7 +# make install +# cp -r $ROOT/build-armv7/include/unicode $ROOT/build-universal/unicode \ No newline at end of file diff --git a/Kiwix/libkiwix/build/build-xapian.sh b/Kiwix/libkiwix/build/build-xapian.sh new file mode 100755 index 00000000..d449f3f6 --- /dev/null +++ b/Kiwix/libkiwix/build/build-xapian.sh @@ -0,0 +1,99 @@ +#!/bin/bash + +ROOT=$(pwd) + +######################## XAPIAN ######################## + +XAPIANPATH=$ROOT/xapian-core-1.2.23 +cd $XAPIANPATH + +# ./autogen.sh + +build_iOS() +{ + ARCH=$1 + + if [ $ARCH == "i386" ] || [ $ARCH == "x86_64" ]; + then + SDKROOT="$(xcodebuild -version -sdk iphonesimulator | grep -E '^Path' | sed 's/Path: //')" + else + SDKROOT="$(xcodebuild -version -sdk iphoneos | grep -E '^Path' | sed 's/Path: //')" + fi + + export CC="$(xcrun -sdk iphoneos -find clang)" + export CFLAGS="-fembed-bitcode -isysroot $SDKROOT -arch ${ARCH} -miphoneos-version-min=9.0 -I$LZMAHEADERPATH" + + export CPP="$CC -E" + export CPPFLAGS="$CFLAGS" + + export LDFLAGS="-arch ${ARCH} -isysroot $SDKROOT" + + if [ $ARCH == "i386" ] || [ $ARCH == "x86_64" ]; + then + ./configure --prefix=$(pwd)/build/iOS/$ARCH --host=i686-apple-darwin11 --enable-static --disable-shared + else + ./configure --prefix=$(pwd)/build/iOS/$ARCH --host=arm-apple-darwin --enable-static --disable-shared + fi + + make && make install && make clean +} + +build_OSX() +{ + ARCH=$1 + + SDKROOT="$(xcodebuild -version -sdk macosx10.11 | grep -E '^Path' | sed 's/Path: //')" + + export MACOSX_DEPLOYMENT_TARGET="10.10" + + export CC="$(xcrun -sdk macosx10.11 -find clang)" + export CFLAGS="-fembed-bitcode -isysroot $SDKROOT -arch ${ARCH} -mmacosx-version-min=10.10" + + # export CPP="$CC -E" + # export CPPFLAGS="$CFLAGS -stdlib=libc++ -std=c++11" + + export CXX="$(xcrun -sdk iphoneos -find clang++)" + export CXXFLAGS="$CFLAGS -stdlib=libc++ -std=gnu++11" + + export LDFLAGS="-arch ${ARCH} -isysroot $SDKROOT" + + ./configure --prefix=$(pwd)/build/OSX/$ARCH --host=i686-apple-darwin11 --disable-static --enable-shared + + make && make install && make clean +} + +distribute() { + cd $XAPIANPATH/build + mkdir -p Universal/iOS/lib + mkdir -p Universal/OSX/lib + + # cd iOS/armv7/lib + # for file in *.a + # do + # cd $XAPIANPATH/build + # lipo -create iOS/armv7/lib/$file iOS/armv7s/lib/$file iOS/arm64/lib/$file iOS/x86_64/lib/$file iOS/i386/lib/$file -output Universal/iOS/lib/$file + # done + + cd OSX/i386/lib + for file in *.dylib + do + cd $XAPIANPATH/build + lipo -create OSX/x86_64/lib/$file OSX/i386/lib/$file -output Universal/OSX/lib/$file + done + + # cd $XAPIANPATH/build + # mkdir -p Universal/include + # cp -r iOS/armv7/include Universal +} + +# build_iOS i386 +# build_iOS x86_64 +# build_iOS armv7 +# build_iOS armv7s +# build_iOS arm64 + +build_OSX i386 +# build_OSX x86_64 + +distribute + diff --git a/Kiwix/libkiwix/build/build-xz.sh b/Kiwix/libkiwix/build/build-xz.sh new file mode 100755 index 00000000..b690c890 --- /dev/null +++ b/Kiwix/libkiwix/build/build-xz.sh @@ -0,0 +1,101 @@ +#!/bin/bash +ROOT=$(pwd) +XZ_FOLDER_NAME='xz-5.2.2' +########################## XZ ########################## + +curl -O 'http://tukaani.org/xz/xz-5.2.2.tar.gz' +tar -xvzf xz-5.2.2.tar.gz + +XZPATH=$ROOT/$XZ_FOLDER_NAME +cd $XZPATH + +./autogen.sh + +build_iOS() +{ + ARCH=$1 + + if [ $ARCH == "i386" ] || [ $ARCH == "x86_64" ]; + then + SDKROOT="$(xcodebuild -version -sdk iphonesimulator | grep -E '^Path' | sed 's/Path: //')" + else + SDKROOT="$(xcodebuild -version -sdk iphoneos | grep -E '^Path' | sed 's/Path: //')" + fi + + export CC="$(xcrun -sdk iphoneos -find clang)" + export CFLAGS="-fembed-bitcode -isysroot $SDKROOT -arch ${ARCH} -miphoneos-version-min=9.0" + export LDFLAGS="-arch ${ARCH} -isysroot $SDKROOT" + + if [ $ARCH == "i386" ] || [ $ARCH == "x86_64" ]; + then + ./configure --prefix=$XZPATH/build/iOS/$ARCH --host=i686-apple-darwin11 --disable-static --enable-shared + else + ./configure --prefix=$XZPATH/build/iOS/$ARCH --host=arm-apple-darwin --disable-static --enable-shared + fi + + make && make install && make clean +} + +build_OSX() +{ + ARCH=$1 + + SDKROOT="$(xcodebuild -version -sdk macosx10.11 | grep -E '^Path' | sed 's/Path: //')" + + export CC="$(xcrun -sdk macosx10.11 -find clang)" + export CFLAGS="-fembed-bitcode -isysroot $SDKROOT -arch ${ARCH} -mmacosx-version-min=10.6" + export LDFLAGS="-arch ${ARCH} -isysroot $SDKROOT" + + ./configure --prefix=$XZPATH/build/OSX/$ARCH --host=i686-apple-darwin11 --disable-static --enable-shared + + make && make install && make clean +} + +distribute() { + cd $XZPATH/build + + # iOS + mkdir -p iOS/Universal/lib + + cd iOS/armv7/lib + for file in *.a + do + cd $XZPATH/build + lipo -create iOS/armv7/lib/$file iOS/armv7s/lib/$file iOS/arm64/lib/$file iOS/x86_64/lib/$file iOS/i386/lib/$file -output iOS/Universal/lib/$file + done + + cd iOS/armv7/lib + for file in *.dylib + do + cd $XZPATH/build + lipo -create iOS/armv7/lib/$file iOS/armv7s/lib/$file iOS/arm64/lib/$file iOS/x86_64/lib/$file iOS/i386/lib/$file -output iOS/Universal/lib/$file + done + + cd $XZPATH/build + cp -r iOS/armv7/include iOS/Universal + + # OS X + mkdir -p OSX/Universal/lib + + cd OSX/i386/lib + for file in *.dylib + do + cd $XZPATH/build + lipo -create OSX/x86_64/lib/$file OSX/i386/lib/$file -output OSX/Universal/lib/$file + done + + cd $XZPATH/build + cp -r OSX/x86_64/include OSX/Universal +} + +build_iOS i386 +build_iOS x86_64 +build_iOS armv7 +build_iOS armv7s +build_iOS arm64 + +build_OSX i386 +build_OSX x86_64 + +distribute + diff --git a/Kiwix/libkiwix/build/build-zim.sh b/Kiwix/libkiwix/build/build-zim.sh new file mode 100755 index 00000000..e61f6aa0 --- /dev/null +++ b/Kiwix/libkiwix/build/build-zim.sh @@ -0,0 +1,100 @@ +#!/bin/bash + +ROOT=$(pwd) + +########################## ZIM ########################## + +# git clone https://gerrit.wikimedia.org/r/p/openzim.git +# modify ffstream.cpp, replace stat64 with stat + +LZMAHEADERPATH="/Volumes/Data/Developer/build/xz-5.2.2/build/Universal/include" +ZIMREADERPATH=$ROOT/openzim/zimlib +cd $ZIMREADERPATH + +# ./autogen.sh + +build_iOS() +{ + ARCH=$1 + + if [ $ARCH == "i386" ] || [ $ARCH == "x86_64" ]; + then + SDKROOT="$(xcodebuild -version -sdk iphonesimulator | grep -E '^Path' | sed 's/Path: //')" + else + SDKROOT="$(xcodebuild -version -sdk iphoneos | grep -E '^Path' | sed 's/Path: //')" + fi + + export CC="$(xcrun -sdk iphoneos -find clang)" + export CFLAGS="-fembed-bitcode -isysroot $SDKROOT -arch ${ARCH} -miphoneos-version-min=9.0 -I$LZMAHEADERPATH" + + export CPP="$CC -E" + export CPPFLAGS="$CFLAGS" + + export LDFLAGS="-arch ${ARCH} -isysroot $SDKROOT" + + if [ $ARCH == "i386" ] || [ $ARCH == "x86_64" ]; + then + ./configure --prefix=$(pwd)/build/iOS/$ARCH --host=i686-apple-darwin11 --enable-static --disable-shared + else + ./configure --prefix=$(pwd)/build/iOS/$ARCH --host=arm-apple-darwin --enable-static --disable-shared + fi + + make && make install && make clean +} + +build_OSX() +{ + ARCH=$1 + + SDKROOT="$(xcodebuild -version -sdk macosx10.11 | grep -E '^Path' | sed 's/Path: //')" + + export MACOSX_DEPLOYMENT_TARGET="10.10" + + export CC="$(xcrun -sdk macosx10.11 -find clang)" + export CFLAGS="-fembed-bitcode -isysroot $SDKROOT -arch ${ARCH} -mmacosx-version-min=10.10 -I$LZMAHEADERPATH" + + export CXX="$(xcrun -sdk iphoneos -find clang++)" + export CXXFLAGS="$CFLAGS -stdlib=libc++ -std=c++11" + + export LDFLAGS="-arch ${ARCH} -isysroot $SDKROOT" + + ./configure --prefix=$(pwd)/build/OSX/$ARCH --host=i686-apple-darwin11 --disable-static --enable-shared + + make && make install && make clean +} + +distribute() { + cd $ZIMREADERPATH/build + mkdir -p Universal/iOS/lib + mkdir -p Universal/OSX/lib + + # cd iOS/armv7/lib + # for file in *.a + # do + # cd $ZIMREADERPATH/build + # lipo -create iOS/armv7/lib/$file iOS/armv7s/lib/$file iOS/arm64/lib/$file iOS/x86_64/lib/$file iOS/i386/lib/$file -output Universal/iOS/lib/$file + # done + + cd OSX/i386/lib + for file in *.dylib + do + cd $ZIMREADERPATH/build + lipo -create OSX/x86_64/lib/$file OSX/i386/lib/$file -output Universal/OSX/lib/$file + done + + # cd $ZIMREADERPATH/build + # mkdir -p Universal/include + # cp -r iOS/armv7/include Universal +} + +# build_iOS i386 +# build_iOS x86_64 +# build_iOS armv7 +# build_iOS armv7s +# build_iOS arm64 + +# build_OSX i386 +# build_OSX x86_64 + +distribute + diff --git a/Kiwix/libkiwix/build/installname.sh b/Kiwix/libkiwix/build/installname.sh new file mode 100755 index 00000000..cf5049df --- /dev/null +++ b/Kiwix/libkiwix/build/installname.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +dylibs=*.dylib + +for file in $dylibs +do + install_name_tool -id @rpath/$file $file + for dependency in $dylibs + do + install_name_tool -change $dependency @rpath/$dependency $file + done + install_name_tool -change /usr/lib/liblzma.5.dylib @rpath/liblzma.5.dylib $file + otool -L $file +done \ No newline at end of file