Tools and libraries to glue C/C++ APIs to high-level languages
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

262 lines
5.5 KiB

#!/usr/bin/env bash
set -e
builddir=$(cd "$(dirname "$0")"; pwd)
platform=x64
vs=vs2022
configuration=Release
build_only=false
ci=false
target_framework=
verbosity=minimal
rootdir="$builddir/.."
bindir="$rootdir/bin"
objdir="$builddir/obj"
gendir="$builddir/gen"
slnpath="$rootdir/CppSharp.sln"
artifacts="$rootdir/artifacts"
oshost=""
os=""
test=
if [[ $(uname -m) != *"64"* ]]; then
platform=x86
fi
build()
{
if [ $ci = true ]; then
clean
fi
if [ $ci = true ] || [ $build_only = false ]; then
generate
restore
fi
if [ $oshost = "linux" ] || [ $oshost = "macosx" ]; then
config=$(tr '[:upper:]' '[:lower:]' <<< ${configuration}_$platform) make -C "$builddir/gmake/"
fi
find_msbuild
$msbuild "$slnpath" -p:Configuration=$configuration -p:Platform=$platform -v:$verbosity -nologo
if [ $ci = true ]; then
test
fi
}
generate_config()
{
"$builddir/premake.sh" --file="$builddir/premake5.lua" $vs --os=$os --arch=$platform --configuration=$configuration --target-framework=$target_framework --config_only
}
generate()
{
download_llvm
if [ "$os" = "linux" ] || [ "$os" = "macosx" ]; then
"$builddir/premake.sh" --file="$builddir/premake5.lua" gmake2 --os=$os --arch=$platform --configuration=$configuration --target-framework=$target_framework "$@"
fi
"$builddir/premake.sh" --file="$builddir/premake5.lua" $vs --os=$os --arch=$platform --configuration=$configuration --target-framework=$target_framework
}
restore()
{
find_msbuild
$msbuild "$slnpath" -p:Configuration=$configuration -p:Platform=$platform -v:$verbosity -t:restore -nologo
}
prepack()
{
find_msbuild
$msbuild "$slnpath" -t:prepack -p:Configuration=$configuration -p:Platform=$platform -v:$verbosity -nologo
}
pack()
{
find_msbuild
$msbuild -t:restore "$rootdir/src/Package/CppSharp.Package.csproj" -p:Configuration=$configuration -p:Platform=$platform
$msbuild -t:pack "$rootdir/src/Package/CppSharp.Package.csproj" -p:Configuration=$configuration -p:Platform=$platform -p:PackageOutputPath="$rootdir/artifacts"
if [ $oshost = "windows" -a $platform = "x64" ]; then
$msbuild -t:restore "$rootdir/src/Runtime/CppSharp.Runtime.csproj" -p:Configuration=$configuration -p:Platform=$platform
$msbuild -t:pack "$rootdir/src/Runtime/CppSharp.Runtime.csproj" -p:Configuration=$configuration -p:Platform=$platform -p:PackageOutputPath="$rootdir/artifacts"
fi
}
test()
{
dotnet test {"$bindir/${configuration}_$platform","$gendir"/*}/*.Tests*.dll --nologo
}
clean()
{
rm -rf "$objdir"
rm -rf "$gendir"
rm -rf "$bindir"
rm -rf "$builddir/gmake"
rm -rf "$builddir/$vs"
rm -rf "$slnpath"
}
download_premake()
{
premake_dir="$builddir/premake"
premake_filename=premake5
premake_archive_ext=tar.gz
if [ $oshost = "windows" ]; then
premake_filename=$premake_filename.exe
premake_archive_ext=zip
fi
premake_path=$premake_dir/$premake_filename
if ! [ -f "$premake_path" ]; then
echo "Downloading and unpacking Premake..."
premake_version=5.0.0-beta2
premake_archive=premake-$premake_version-$oshost.$premake_archive_ext
premake_url=https://github.com/premake/premake-core/releases/download/v$premake_version/$premake_archive
curl -L -O $premake_url
if [ $oshost = "windows" ]; then
unzip $premake_archive $premake_filename -d "$premake_dir"
else
tar -xf $premake_archive -C "$premake_dir" ./$premake_filename
fi
chmod +x "$premake_path"
rm $premake_archive
fi
}
download_llvm()
{
"$builddir/premake.sh" --file="$builddir/llvm/LLVM.lua" download_llvm --os=$os --arch=$platform --configuration=$configuration
}
clone_llvm()
{
"$builddir/premake.sh" --file="$builddir/llvm/LLVM.lua" clone_llvm --os=$os --arch=$platform --configuration=$configuration
}
build_llvm()
{
"$builddir/premake.sh" --file="$builddir/llvm/LLVM.lua" build_llvm --os=$os --arch=$platform --configuration=$configuration
}
package_llvm()
{
"$builddir/premake.sh" --file="$builddir/llvm/LLVM.lua" package_llvm --os=$os --arch=$platform --configuration=$configuration
}
detect_os()
{
case "$(uname -s)" in
Darwin)
oshost=macosx
;;
Linux)
oshost=linux
;;
CYGWIN*|MINGW32*|MSYS*|MINGW*)
oshost=windows
;;
*)
echo "Unsupported platform"
exit 1
;;
esac
os=$oshost
}
find_msbuild()
{
if [ -x "$(command -v MSBuild.exe)" ]; then
msbuild="MSBuild.exe"
else
msbuild="dotnet msbuild"
fi
}
cmd=$(tr '[:upper:]' '[:lower:]' <<< $1)
detect_os
download_premake
while [[ $# > 0 ]]; do
option=$(tr '[:upper:]' '[:lower:]' <<< "${1/#--/-}")
case "$option" in
-debug)
configuration=Debug
;;
-configuration)
configuration=$2
shift
;;
-platform)
platform=$2
shift
;;
-vs)
vs=vs$2
shift
;;
-os)
os=$2
shift
;;
-target-framework)
target_framework=$2
echo $target_framework
shift
;;
-ci)
ci=true
export CI=true
;;
-build_only)
build_only=true
;;
esac
shift
done
case "$cmd" in
clean)
clean
;;
generate)
generate
;;
generate_config)
generate_config
;;
prepack)
prepack
;;
pack)
pack
;;
restore)
restore
;;
test)
test
;;
download_llvm)
download_llvm
;;
clone_llvm)
clone_llvm
;;
build_llvm)
build_llvm
;;
package_llvm)
package_llvm
;;
install_tools)
download_premake
;;
*)
build
;;
esac