#!/bin/sh
# Copyright (C) 2016 J.F.Dockes
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the
# Free Software Foundation, Inc.,
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
# Helper script for building the openhome libs prior to building
# sc2mpd and mpd2sc.
#
# Read about Openhome ohNet here: http://www.openhome.org/wiki/OhNet
#
# The source code we process is:
# Copyright 2011-14, Linn Products Ltd. All rights reserved.
# See the license files under the different subdirs. In a nutshell: BSD
#
# This is far from foolproof or knowledgeable, but it seems to get me
# usable (static) libs.
# There are 3 modes of operation:
# -c: clone, adjust, trim the source directories and produce a tar file
# -b: clone, adjust the source dirs and build
# -t: extract tar file and build.
#
# When cloning, we checkout a known ok version (it's more or less
# random, based on the last date I tried this, sometimes more recent
# versions don't build versions don't build), then build the different
# dirs.
#
# When producing the tar file, we get rid of the .git directory and a
# bunch of other things to reduce the size
fatal()
{
echo $*; exit 1
}
usage()
{
echo "Usage:"
echo "ohbuild.sh -c <topdir> : clone and adjust openhome directories"
echo " from the git repositories, and produce tar file in /tmp"
echo "ohbuild.sh -t <tarfile> <topdir> : extract tar file in top dir and"
echo " build openhome in there"
echo "ohbuild.sh -b <topdir> : clone and build, no cleaning up of unused"
echo " files, no tar file"
echo "ohbuild.sh <topdir> : just build, don't change the tree"
exit 1
}
opt_t=0
opt_c=0
opt_b=0
tarfile=''
opts=`getopt -n ohbuild.sh -o t:cb -- "$@"`
eval set -- "$opts"
while true ; do
case "$1" in
-t) opt_t=1; tarfile=$2 ; shift 2 ;;
-b) opt_b=1; shift ;;
-c) opt_c=1; shift ;;
--) shift ; break ;;
*) usage ;;
esac
done
echo opt_t $opt_t
echo opt_c $opt_c
echo opt_b $opt_b
echo tarfile $tarfile
test $# -eq 1 || usage
topdir=$1
echo topdir $topdir
# Only one of -tcb
tot=`expr $opt_t + $opt_c + $opt_b`
test $tot -le 1 || usage
arch=
debug=
test -d $topdir || mkdir $topdir || fatal "Can't create $topdir"
cd $topdir || exit 1
# Make topdir an absolute path
topdir=`pwd`
otherfiles=`echo *.*`
test "$otherfiles" != '*.*' && fatal topdir should not contain files
clone_oh()
{
echo "Cloning OpenHome from git repos into $topdir"
cd $topdir
for rep in \
https://github.com/openhome/ohNet.git \
https://github.com/openhome/ohdevtools.git \
https://github.com/openhome/ohNetGenerated.git \
https://github.com/openhome/ohTopology.git \
https://github.com/openhome/ohSongcast.git \
; do
dir=`echo $rep | sed -e 's+https://github.com/openhome/++' \
-e 's/\.git$//'`
echo $dir
test ! -d $dir && git clone $rep
done
cd $topdir/ohNet
# Mon Apr 24 15:23:27 2017
git checkout 1dd6411ffbe59fe09517162fb88e2405adb4990f || exit 1
git checkout Makefile
# Note: the 'make: o: Command not found' errors originate in
# common.mak and are due to variable t4 being undefined. t4 is
# normally defined as 'mono' in T4Linux.mak, included in Makefile
# only if 'uset4' is set (which it is not by default). Common.mak
# should heed uset4, but it does not. This does not seem to have
# consequences, and the errors are suppressed by defining t4 as 'echo'
# odroid64: aarch64-linux-gnu.
# odroid32,rasp30: arm-linux-gnueabihf,
# cubox: armv7hl-redhat-linux-gnueabi
patch -p1 << "EOF"
diff --git a/Makefile b/Makefile
index 29f2d6a..038b05e 100644
--- a/Makefile
+++ b/Makefile
@@ -82,12 +82,19 @@ else
ifneq (,$(findstring arm,$(gcc_machine)))
ifneq (,$(findstring linux-gnueabihf,$(gcc_machine)))
detected_openhome_architecture = armhf
+ else ifneq (,$(findstring armv7hl,$(gcc_machine)))
+ # cubox: armv7hl-redhat-linux-gnueabi
+ detected_openhome_architecture = armhf
else ifeq (${detected_openhome_system},Qnap)
detected_openhome_architecture = x19
else
detected_openhome_architecture = armel
endif
endif
+ ifneq (,$(findstring aarch64,$(gcc_machine)))
+ # odroid64: aarch64-linux-gnu
+ detected_openhome_architecture = arm64
+ endif
ifneq (,$(findstring i686,$(gcc_machine)))
detected_openhome_architecture = x86
endif
@@ -375,6 +382,10 @@ mkdir = mkdir -p
rmdir = rm -rf
uset4 = no
+# This avoids errors in Generated/Devices.mak (they apparently have no
+# consequences anyway because we use make native_only=yes)
+t4 = echo
+
ifeq ($(managed_only), yes)
build_targets_base = make_obj_dir ohNet.net.dll CpProxyDotNetAssemblies DvDeviceDotNetAssemblies
else
EOF
git checkout OpenHome/TestFramework/OptionParser.cpp
patch -p1 << "EOF"
diff --git a/OpenHome/TestFramework/OptionParser.cpp b/OpenHome/TestFramework/OptionParser.cpp
index fe90233..644fc0b 100644
--- a/OpenHome/TestFramework/OptionParser.cpp
+++ b/OpenHome/TestFramework/OptionParser.cpp
@@ -282,7 +282,7 @@ void OptionParser::SetUsage(const TChar* aUsage)
{
delete iUsage;
iUsage = NULL;
- iUsage = new TChar[strlen(iUsage)];
+ iUsage = new TChar[strlen(aUsage)];
(void)strcpy(iUsage, aUsage);
}
EOF
cd $topdir/ohNetGenerated
# Tue May 9 08:54:47 2017
git checkout e3edb912410d4c5a4d5323bb1e9c27660a42d78f || exit 1
git checkout Makefile
patch -p1 << "EOF"
diff --git a/Makefile b/Makefile
index bf7a1ba..49bffaf 100644
--- a/Makefile
+++ b/Makefile
@@ -70,14 +70,17 @@ else
else ifneq (,$(findstring linux,$(gcc_machine)))
detected_openhome_system = Linux
endif
- ifeq ($(gcc_machine),arm-none-linux-gnueabi)
- detected_openhome_architecture = armel
- endif
- ifeq ($(gcc_machine),arm-linux-gnueabi)
- detected_openhome_architecture = armel
- endif
- ifeq ($(gcc_machine),arm-linux-gnueabihf)
- detected_openhome_architecture = armhf
+ ifneq (,$(findstring arm,$(gcc_machine)))
+ ifneq (,$(findstring linux-gnueabihf,$(gcc_machine)))
+ detected_openhome_architecture = armhf
+ else ifneq (,$(findstring armv7hl,$(gcc_machine)))
+ # cubox: armv7hl-redhat-linux-gnueabi
+ detected_openhome_architecture = armhf
+ else ifeq (${detected_openhome_system},Qnap)
+ detected_openhome_architecture = x19
+ else
+ detected_openhome_architecture = armel
+ endif
endif
ifneq (,$(findstring i686,$(gcc_machine)))
detected_openhome_architecture = x86
EOF
patch -p1 << "EOF"
diff -u ./Common.mak ../../openhome/ohNetGenerated/Common.mak
--- ./Common.mak 2017-09-19 10:51:13.000000000 +0200
+++ ../../openhome/ohNetGenerated/Common.mak 2017-09-19 13:21:25.984071432 +0200
@@ -17,20 +17,6 @@
$(objdir)ohnet-generated.jar : CpProxyJavaClasses DvDeviceJavaClasses
$(jar) $(jarflags) $(objdir)ohnet-generated.jar -C $(objdir) org
-Generated$(dirsep)GenerateSourceFiles.mak : $(tt) OpenHome$(dirsep)Net$(dirsep)Service$(dirsep)Services.xml OpenHome/Net/T4/Templates/UpnpMakeT4.tt
- $(mkdir) Generated
- $(t4) -o Generated$(dirsep)GenerateSourceFiles.mak OpenHome/Net/T4/Templates/UpnpMakeT4.tt -a xml:OpenHome/Net/Service/Services.xml
- @echo Attention: a makefile has been re-generated.
-
-Generated$(dirsep)Proxies.mak : $(tt) OpenHome$(dirsep)Net$(dirsep)Service$(dirsep)Services.xml OpenHome/Net/T4/Templates/CpUpnpMakeProxies.tt
- $(mkdir) Generated
- $(t4) -o Generated$(dirsep)Proxies.mak OpenHome/Net/T4/Templates/CpUpnpMakeProxies.tt -a xml:OpenHome/Net/Service/Services.xml
- @echo Attention: a makefile has been re-generated.
-
-Generated$(dirsep)Devices.mak : $(tt) OpenHome$(dirsep)Net$(dirsep)Service$(dirsep)Services.xml OpenHome/Net/T4/Templates/DvUpnpMakeDevices.tt
- $(mkdir) Generated
- $(t4) -o Generated$(dirsep)Devices.mak OpenHome/Net/T4/Templates/DvUpnpMakeDevices.tt -a xml:OpenHome/Net/Service/Services.xml
- @echo Attention: a makefile has been re-generated.
native_targets = make_obj_dir copy_build_includes proxies devices
EOF
cd $topdir/ohTopology
# Wed Mar 22 11:15:28 2017 +0000
git checkout cc09c09da4be8d3d04adae5b8f0daaf8450906a3 || exit 1
cd $topdir/ohSongcast
# Tue Oct 18 08:34:33 2016 +0100
git checkout 3299eaedfea34993b79e6d30444792d4fb12a110 || exit 1
}
make_tarfile()
{
cd $topdir || exit 1
# Make space: get rid of the .git and other not useful data, then
# produce a tar file for reproduction
for dir in ohNet ohNetGenerated ohdevtools ohTopology ohSongcast;do
test -d $dir || fatal no "'$dir'" in "'$topdir'"
done
#rm -rf $topdir/ohNet/thirdparty
rm -rf $topdir/ohNetGenerated/OpenHome/Net/Bindings/Cs
rm -rf $topdir/ohNetGenerated/OpenHome/Net/Bindings/Java
rm -rf $topdir/ohNetGenerated/OpenHome/Net/Bindings/Js
rm -rf $topdir/ohNetGenerated/OpenHome/Net/T4/
rm -rf $topdir/ohSongcast/Docs/
rm -rf $topdir/ohSongcast/ohSongcast/Mac
rm -rf $topdir/ohSongcast/ohSongcast/Windows
rm -rf $topdir/ohTopology/waf
rm -rf $topdir/ohdevtools/nuget
dt=`date +%Y%m%d`
tar --exclude='.git' -czf $tarfile/tmp/openhome-sc2-${dt}.tar.gz .
}
build_ohNet()
{
dir=ohNet
echo;echo building $dir
cd $topdir/$dir || exit 1
make native_only=yes || exit 1
cd ..
}
build_ohNetGenerated()
{
dir=ohNetGenerated
echo;echo building $dir
cd $topdir/$dir || exit 1
# e.g. Linux-x64, Linux-armhf
arch=`basename $topdir/ohNet/Build/Bundles/ohNet-*-*.tar.gz | \
sed -e s/ohNet-// -e s/-[A-Z][a-z][a-z]*\.tar\.gz$//`
# e.g. Debug, Release
debug=`basename $topdir/ohNet/Build/Bundles/ohNet-*-*.tar.gz | \
sed -e s/.*-// -e s/\.tar\.gz$//`
sd=dependencies/${arch}
mkdir -p "$sd"
(cd $sd;
tar xvzf $topdir/ohNet/Build/Bundles/ohNet-${arch}-${debug}.tar.gz
) || exit 1
make native_only=yes
# Expect error here, but the relevant bits have been built
# Copy the includes from here to the ohNet dir where ohTopology
# will want them
tar cf - Build/Include | (cd $topdir/ohNet/;tar xvf -) || exit 1
}
build_ohdevtools()
{
dir=ohdevtools
echo;echo building $dir
cd $topdir/$dir || exit 1
# Nothing to build
}
# It appears that nothing compiled in topology is needed for Receivers
# or Senders, only managers of those. Some of the include files are
# needed (or at least used) though.
build_ohTopology()
{
dir=ohTopology
echo;echo building $dir
cd $topdir/$dir || exit 1
#./go fetch --all --clean
#./waf configure --ohnet=../ohNet --dest-platform=Linux-x86
# The build fails because of mono issues (trying to generate
# include files from templates, this is probably fixable as the e
# actual includes may exist somewhere).
#./waf build
mkdir -p build/Include/OpenHome/Av
cp -p OpenHome/Av/*.h build/Include/OpenHome/Av/
}
build_ohSongcast()
{
dir=ohSongcast
echo;echo building $dir
cd $topdir/$dir || exit 1
make release=1 Receiver WavSender
}
official_way()
{
# from README, actually Does not work, for reference. Issues probably have
# something to do with lacking mono or wrong version
cd ohNet
make ohNetCore proxies devices TestFramework
cd ../ohNetGenerated
./go fetch --all
make
cd ../ohNetmon
./go fetch --all
./waf configure --ohnet=../ohNet
./waf build
cd ../ohTopology
./go fetch --all
./waf configure --ohnet=../ohNet
./waf build
cd ../ohSongcast
make release=1
}
buildall()
{
echo "Building all in $topdir"
build_ohNet
build_ohNetGenerated
build_ohdevtools
build_ohTopology
build_ohSongcast
}
if test $opt_c -ne 0; then
test -d $topdir/ohNet && fatal target dir should be initially empty \
for producing a tar distribution
clone_oh || fatal clone failed
make_tarfile || fatal make_tarfile failed
exit 0
fi
# Extract tar, or clone git repos
if test $opt_t -eq 1; then
echo "Extracting tarfile in $topdir"
cd $topdir || exit 1
tar xf $tarfile
elif test $opt_b -eq 1; then
clone_oh
fi
buildall