diff --git a/doc/build-ios-on-linux.md b/doc/build-ios-on-linux.md new file mode 100644 index 00000000..b96f25db --- /dev/null +++ b/doc/build-ios-on-linux.md @@ -0,0 +1,93 @@ +IOS (iPhoneOS) Build Instructions and Notes +=========================================== +This guide will show you how to build twisterd for IOS on a linux machine. + +Notes +----- + +* Compilation, made on a linux +* Application, tested on iPhone4 with IOS 7.1.2 (jailbroken) +* All of the commands should be executed in a Terminal application. + +Preparation +----------- + +You need to install clang and llvm from distribution's repo. Then you need IOS toolchain and SDK. +You can get them from [iOS toolchain based on clang for linux](https://code.google.com/p/ios-toolchain-based-on-clang-for-linux/). + +You need to install [openssl](http://cydia.saurik.com/package/openssl/) ([view in cydia...](cydia://package/openssl)) to your +device and copy headers and libraries to your SDK as well. + +*REQUIRMENTS (leveldb, berkeley db and boost) WILL BE DOWNLOADED AND BUILDED BY `runme-ios-onlinux.sh` * +You need also to build [leveldb](http://github.com/google/leveldb), [Berkeley DB](http://download.oracle.com/otn/berkeley-db/db-5.3.28.tar.gz) +for IOS. + +And you need the [boost sources](http://www.boost.org/users/download/#live). + +Instructions: +------------- + +#### Setting required variable + + You should check variables set in `runme-ios-onlinux.sh` script. + + + export IOS_SDK=/usr/share/iPhoneOS6.0.sdk + export ARCH=armv7 + export TARGET=arm-apple-darwin11 + export LINKER_VER=236.3 + export IPHONEOS_DEPLOYMENT_TARGET=6.0 + export TARGET_OS=IOS + export CC="clang" + export CXX="clang++" + export PJC=2 +#### Building dependecies and `twisterd` + +1. Clone the github tree to get the source code and go into the directory. + + git clone https://github.com/miguelfreitas/twister-core.git + cd twister-core/src + +2. Building + + + ./runme-ios-onlinux.sh + +3. If things go south, before trying again, make sure you clean it up: + + + make clean + +If all went well, you should now have a twisterd executable in the twister-core directory. +See the Running instructions below. + +Running +------- + +It's now available at `./twisterd`, provided that you are still in the `twister-core` +directory. We have to first create the RPC configuration file, though. + +Run `./twisterd` to get the filename where it should be put, or just try these +commands: + + mkdir -p "/User/.twister" + echo -e "rpcuser=user\nrpcpassword=pwd\nrpcallowip=127.0.0.1" > "/User/.twister/twister.conf" + chmod 600 "/User/.twister/twister.conf" + +When next you run it, it will start downloading the blockchain, but it won't +output anything while it's doing this. This process may take several hours. If you see a lonely +`connect: Operation timed out`, don't freak out, it seems to work fine. + +Other commands: + + tail -f ~/.twister/debug.log + ./twisterd --help # for a list of command-line options. + ./twisterd -daemon # to start it as a daemon. + ./twisterd help # When the daemon is running, to get a list of RPC commands + +In order to get the HTML interface, you'll have to download it and link it in .twister: + + git clone https://github.com/miguelfreitas/twister-html.git /User/Library/Application\ Support/twister/html + +Once you do that, it will be available at http://localhost:28332/home.html + diff --git a/libtorrent/src/makefile.ios b/libtorrent/src/makefile.ios new file mode 100755 index 00000000..ae793903 --- /dev/null +++ b/libtorrent/src/makefile.ios @@ -0,0 +1,38 @@ +PROJECTNAME:=libtorrent-rasterbar + +libtorrent_INCLUDE:=../include +twister_INCLUDE:=../../src +boost_SOURCE:=$(twister_INCLUDE)/ios-build/ext/boost_1_58_0 +leveldb_SOURCE:=$(twister_INCLUDE)/ios-build/ext/leveldb-master + +CXXFLAGS += -fobjc-arc +CXXFLAGS += -fblocks +CXXFLAGS += -g0 -O2 -DIOS +CXXFLAGS += -I"$(libtorrent_INCLUDE)" -I"$(twister_INCLUDE)" -I"$(boost_SOURCE)" -I"$(leveldb_SOURCE)/include" +CXXFLAGS += -DBOOST_SPIRIT_THREADSAFE -D_FILE_OFFSET_BITS=64 -DBOOST_ASIO_SEPARATE_COMPILATION -DBOOST_LOCALE_WITH_ICONV +CXXFLAGS += -DBOOST_LOCALE_NO_WINAPI_BACKEND -DBOOST_ASIO_HASH_MAP_BUCKETS=1021 -DBOOST_EXCEPTION_DISABLE=1 -DBOOST_ASIO_ENABLE_CANCELIO=1 +CXXFLAGS += -DTORRENT_DISABLE_GEO_IP -DTORRENT_USE_OPENSSL=1 + +BLDDIR=ios-build +SRCDIR=. +OBJS+=$(patsubst $(SRCDIR)/%.cpp,$(BLDDIR)/%.o,$(wildcard $(SRCDIR)/*.cpp)) +OBJS+=$(patsubst $(SRCDIR)/kademlia/%.cpp,$(BLDDIR)/%.o,$(wildcard $(SRCDIR)/kademlia/*.cpp)) + +all: $(BLDDIR)/$(PROJECTNAME) + +$(BLDDIR)/$(PROJECTNAME): $(OBJS) check + $(AR) cr $@.a $(OBJS) + +$(BLDDIR)/%.o: %.cpp check + $(CXX) -c $(CXXFLAGS) $< -o $@ + +$(BLDDIR)/%.o: kademlia/%.cpp check + $(CXX) -c $(CXXFLAGS) $< -o $@ + +check: + test -d $(BLDDIR) || mkdir $(BLDDIR) + +clean: + rm -fr $(BLDDIR) + +.PHONY: all dist install uninstall clean diff --git a/src/makefile.ios b/src/makefile.ios new file mode 100755 index 00000000..03da90a6 --- /dev/null +++ b/src/makefile.ios @@ -0,0 +1,112 @@ +PROJECTNAME:=twisterd + +BLDDIR:=ios-build +libtorrent_INCLUDE:=../libtorrent/include +boost_SOURCE:=$(BLDDIR)/ext/boost_1_58_0 +leveldb_SOURCE:=$(BLDDIR)/ext/leveldb-master +bdb_SOURCE:=$(BLDDIR)/ext/db-5.3.28 + +CXXFLAGS += -fobjc-arc +CXXFLAGS += -fblocks +CXXFLAGS += -g0 -O2 -DIOS +CXXFLAGS += -I. -I"$(libtorrent_INCLUDE)" -I"$(boost_SOURCE)" -I"$(leveldb_SOURCE)/include" -I"$(leveldb_SOURCE)/helper" -I"$(bdb_SOURCE)/build_unix" +CXXFLAGS += -DBOOST_SPIRIT_THREADSAFE -D_FILE_OFFSET_BITS=64 -DBOOST_ASIO_SEPARATE_COMPILATION -DBOOST_LOCALE_WITH_ICONV +CXXFLAGS += -DBOOST_LOCALE_NO_WINAPI_BACKEND -DBOOST_ASIO_HASH_MAP_BUCKETS=1021 -DBOOST_EXCEPTION_DISABLE=1 -DBOOST_ASIO_ENABLE_CANCELIO=1 +CXXFLAGS += -DTORRENT_DISABLE_GEO_IP -DTORRENT_USE_OPENSSL=1 -DHAVE_CXX_STDHEADERS + +LDFLAGS += -lssl -lcrypto -liconv -lz -ldl +LDFLAGS += -L$(leveldb_SOURCE) -lleveldb -lmemenv +LDFLAGS += -L$(bdb_SOURCE)/build_unix -ldb_cxx-5.3 +LDFLAGS += -L"../libtorrent/src/ios-build" -ltorrent-rasterbar + +SRCDIR=. +OBJS+=$(patsubst $(SRCDIR)/%.cpp,$(BLDDIR)/%.o,$(wildcard $(SRCDIR)/*.cpp)) +OBJS+=$(patsubst $(SRCDIR)/json/%.cpp,$(BLDDIR)/%.o,$(wildcard $(SRCDIR)/json/*.cpp)) + +boostlibs=$(boost_SOURCE)/libs +OBJS+=$(BLDDIR)/boost/system/error_code.o +OBJS+=$(patsubst $(boostlibs)/filesystem/src/%.cpp,$(BLDDIR)/boost/filesystem/%.o,$(wildcard $(boostlibs)/filesystem/src/*.cpp)) +OBJS:=$(subst $(BLDDIR)/scrypt-sse2.o,,$(OBJS)) +OBJS+=$(patsubst $(boostlibs)/program_options/src/%.cpp,$(BLDDIR)/boost/program_options/%.o,$(wildcard $(boostlibs)/program_options/src/*.cpp)) +OBJS+=$(patsubst $(boostlibs)/thread/src/%.cpp,$(BLDDIR)/boost/thread/%.o,$(wildcard $(boostlibs)/thread/src/*.cpp)) +OBJS+=$(patsubst $(boostlibs)/thread/src/pthread/%.cpp,$(BLDDIR)/boost/thread/pthread/%.o,$(wildcard $(boostlibs)/thread/src/pthread/*.cpp)) +OBJS:=$(subst $(BLDDIR)/boost/thread/pthread/once_atomic.o,,$(OBJS)) +OBJS+=$(patsubst $(boostlibs)/locale/src/encoding/%.cpp,$(BLDDIR)/boost/locale/encoding/%.o,$(wildcard $(boostlibs)/locale/src/encoding/*.cpp)) +OBJS+=$(patsubst $(boostlibs)/locale/src/posix/%.cpp,$(BLDDIR)/boost/locale/posix/%.o,$(wildcard $(boostlibs)/locale/src/posix/*.cpp)) +OBJS+=$(patsubst $(boostlibs)/locale/src/shared/%.cpp,$(BLDDIR)/boost/locale/shared/%.o,$(wildcard $(boostlibs)/locale/src/shared/*.cpp)) +OBJS+=$(patsubst $(boostlibs)/locale/src/std/%.cpp,$(BLDDIR)/boost/locale/std/%.o,$(wildcard $(boostlibs)/locale/src/std/*.cpp)) +OBJS+=$(patsubst $(boostlibs)/locale/src/util/%.cpp,$(BLDDIR)/boost/locale/util/%.o,$(wildcard $(boostlibs)/locale/src/util/*.cpp)) +OBJS+=$(patsubst $(boostlibs)/chrono/src/%.cpp,$(BLDDIR)/boost/chrono/%.o,$(wildcard $(boostlibs)/chrono/src/*.cpp)) +OBJS+=$(patsubst $(boostlibs)/regex/src/%.cpp,$(BLDDIR)/boost/regex/%.o,$(wildcard $(boostlibs)/regex/src/*.cpp)) + +all: $(BLDDIR)/$(PROJECTNAME) + +$(BLDDIR)/$(PROJECTNAME): $(OBJS) check + $(CXX) $(CXXFLAGS) $(LDFLAGS) $(OBJS) -o $@ + +$(BLDDIR)/%.o: %.cpp check + $(CXX) -c $(CXXFLAGS) $< -o $@ + +$(BLDDIR)/%.o: json/%.cpp check + $(CXX) -c $(CXXFLAGS) $< -o $@ + +$(BLDDIR)/boost/thread/%.o: $(boostlibs)/thread/src/%.cpp check + $(CXX) -c $(CXXFLAGS) $< -o $@ + +$(BLDDIR)/boost/thread/pthread/%.o: $(boostlibs)/thread/src/pthread/%.cpp check + $(CXX) -c $(CXXFLAGS) $< -o $@ + +$(BLDDIR)/boost/locale/encoding/%.o: $(boostlibs)/locale/src/encoding/%.cpp check + $(CXX) -c $(CXXFLAGS) $< -o $@ + +$(BLDDIR)/boost/locale/shared/%.o: $(boostlibs)/locale/src/shared/%.cpp check + $(CXX) -c $(CXXFLAGS) $< -o $@ + +$(BLDDIR)/boost/locale/util/%.o: $(boostlibs)/locale/src/util/%.cpp check + $(CXX) -c $(CXXFLAGS) $< -o $@ + +$(BLDDIR)/boost/locale/std/%.o: $(boostlibs)/locale/src/std/%.cpp check + $(CXX) -c $(CXXFLAGS) $< -o $@ + +$(BLDDIR)/boost/locale/posix/%.o: $(boostlibs)/locale/src/posix/%.cpp check + $(CXX) -c $(CXXFLAGS) $< -o $@ + +$(BLDDIR)/boost/locale/icu/%.o: $(boostlibs)/locale/src/icu/%.cpp check + $(CXX) -c $(CXXFLAGS) $< -o $@ + +$(BLDDIR)/boost/system/%.o: $(boostlibs)/system/src/%.cpp check + $(CXX) -c $(CXXFLAGS) $< -o $@ + +$(BLDDIR)/boost/filesystem/%.o: $(boostlibs)/filesystem/src/%.cpp check + $(CXX) -c $(CXXFLAGS) $< -o $@ + +$(BLDDIR)/boost/program_options/%.o: $(boostlibs)/program_options/src/%.cpp check + $(CXX) -c $(CXXFLAGS) $< -o $@ + +$(BLDDIR)/boost/chrono/%.o: $(boostlibs)/chrono/src/%.cpp check + $(CXX) -c $(CXXFLAGS) $< -o $@ + +$(BLDDIR)/boost/regex/%.o: $(boostlibs)/regex/src/%.cpp check + $(CXX) -c $(CXXFLAGS) $< -o $@ + +check: + @test -d $(BLDDIR)/boost/system || mkdir -p $(BLDDIR)/boost/system + @test -d $(BLDDIR)/boost/filesystem || mkdir -p $(BLDDIR)/boost/filesystem + @test -d $(BLDDIR)/boost/program_options || mkdir -p $(BLDDIR)/boost/program_options + @test -d $(BLDDIR)/boost/thread/pthread || mkdir -p $(BLDDIR)/boost/thread/pthread + @test -d $(BLDDIR)/boost/locale/encoding || mkdir -p $(BLDDIR)/boost/locale/{encoding,icu,posix,std,shared,util} + @test -d $(BLDDIR)/boost/chrono || mkdir -p $(BLDDIR)/boost/chrono + @test -d $(BLDDIR)/boost/regex || mkdir -p $(BLDDIR)/boost/regex + @if test -z $(boost_SOURCE); then \ + echo "please set the 'boost_SOURCE' variable";\ + exit 1;\ + fi + @if ! test -d $(boost_SOURCE); then \ + echo "please check 'boost_SOURCE=$(boost_SOURCE)', directory not found.";\ + exit 1;\ + fi + +clean: + rm -fr $(BLDDIR) + +.PHONY: all dist install uninstall clean diff --git a/src/runme-ios-onlinux.sh b/src/runme-ios-onlinux.sh new file mode 100755 index 00000000..d40f1089 --- /dev/null +++ b/src/runme-ios-onlinux.sh @@ -0,0 +1,92 @@ +#twister building script for IOS on linux + +export IOS_SDK=/usr/share/iPhoneOS6.0.sdk +export ARCH=armv7 +export TARGET=arm-apple-darwin11 +export LINKER_VER=236.3 +export IPHONEOS_DEPLOYMENT_TARGET=6.0 +export IOS_SIGN_CODE_WHEN_BUILD=1 +export TARGET_OS=IOS +export PJC=2 + +export CC="clang" +export CXX="clang++" +export CFLAGS="-target $TARGET -arch $ARCH -isysroot $IOS_SDK -fblocks -fobjc-arc -g0 -O2 -D$TARGET_OS -mlinker-version=$LINKER_VER" +export CXXFLAGS="$CFLAGS" +export LD="$TARGET-ld" +export AR="$TARGET-ar" + +export LDFLAGS="-L$IOS_SDK/System" + +mkdir -p ios-build/ext +cd ios-build/ext +echo 'Downloading leveldb...' +[ -f leveldb.zip ] || wget https://github.com/google/leveldb/archive/master.zip -O leveldb.zip +[ -d leveldb-master ] || unzip leveldb.zip +cd leveldb-master +cat << _EOF > makefile.ios +SOURCES=db/builder.cc db/c.cc db/dbformat.cc db/db_impl.cc db/db_iter.cc db/dumpfile.cc db/filename.cc db/log_reader.cc db/log_writer.cc db/memtable.cc db/repair.cc db/table_cache.cc db/version_edit.cc db/version_set.cc db/write_batch.cc table/block_builder.cc table/block.cc table/filter_block.cc table/format.cc table/iterator.cc table/merger.cc table/table_builder.cc table/table.cc table/two_level_iterator.cc util/arena.cc util/bloom.cc util/cache.cc util/coding.cc util/comparator.cc util/crc32c.cc util/env.cc util/env_posix.cc util/filter_policy.cc util/hash.cc util/histogram.cc util/logging.cc util/options.cc util/status.cc port/port_posix.cc +MEMENV_SOURCES=helpers/memenv/memenv.cc +PLATFORM_CCFLAGS= -DOS_MACOSX -DLEVELDB_PLATFORM_POSIX +PLATFORM_CXXFLAGS= -DOS_MACOSX -DLEVELDB_PLATFORM_POSIX +CFLAGS += -I. -I./include \$(PLATFORM_CCFLAGS) -O2 -DNDEBUG +CXXFLAGS += -I. -I./include \$(PLATFORM_CXXFLAGS) -O2 -DNDEBUG +LIBOBJECTS = \$(SOURCES:.cc=.o) +MEMENVOBJECTS = \$(MEMENV_SOURCES:.cc=.o) +LIBRARY = libleveldb.a +MEMENVLIBRARY = libmemenv.a + +default: all + +all: \$(LIBRARY) \$(MEMENVLIBRARY) + +clean: + rm -f \$(LIBRARY) \$(MEMENVLIBRARY) */*.o */*/*.o ios-x86/*/*.o ios-arm/*/*.o build_config.mk + rm -rf ios-x86/* ios-arm/* + +\$(LIBRARY): \$(LIBOBJECTS) + rm -f \$@ + \$(AR) -rs \$@ \$(LIBOBJECTS) + +\$(MEMENVLIBRARY) : \$(MEMENVOBJECTS) + rm -f \$@ + \$(AR) -rs \$@ \$(MEMENVOBJECTS) + +.cc.o: + \$(CXX) \$(CXXFLAGS) -c \$< -o \$@ + +.c.o: + \$(CC) \$(CFLAGS) -c \$< -o \$@ +_EOF + +make -f makefile.ios -j$PJC +cd .. + +echo 'Downloading berkeley db...' +[ -f db-5.3.28.tar.gz ] || wget http://download.oracle.com/berkeley-db/db-5.3.28.tar.gz +[ -d db-5.3.28 ] || tar xf db-5.3.28.tar.gz +cd db-5.3.28/build_unix +export _CFLAGS="$CFLAGS" +export _CXXFLAGS="$CXXFLAGS" +export CFLAGS="-pipe -gdwarf-2 -no-cpp-precomp -mthumb $_CFLAGS" +export CXXFLAGS="-pipe -gdwarf-2 -no-cpp-precomp -mthumb $_CXXFLAGS" +../dist/configure --host=$TARGET --prefix=/usr --enable-compat185 --enable-shared=no --enable-static --enable-cxx --enable-dbm --enable-st +make -j$PJC + +export CFLAGS="$_CFLAGS" +export CXXFLAGS="$_CXXFLAGS" + +cd ../.. + +echo 'Downloading boost...' +[ -f boost_1_58_0.tar.bz2 ] || wget https://downloads.sourceforge.net/project/boost/boost/1.58.0/boost_1_58_0.tar.bz2 +[ -d boost_1_58_0 ] || tar xf boost_1_58_0.tar.bz2 + +cd ../.. + +echo 'Building libtorrent...' +[ -f ../libtorrent/src/ios-build/libtorrent-rasterbar.a ] || make -C ../libtorrent/src -f makefile.ios -j$PJC + +echo 'Building twister...' +make -f makefile.ios -j$PJC +