# build_win bash script to build qsas on a windows machine
# SJS March 2014
# AJA Sept 2014
# SJS Nov 2014 add more dll's to RELEASE
# SJS Apr 2015 added copying examples and other things to RELEASE
# SJS May 2015 move to MSYS2 + Qt5
# SJS June 2015 added local_plugin option to use same script for everything
# SJS Dec 2015 added qt5 platforms to release bin directory
# SJS Jan 2016 some tweaks in "release" to exit if make qsas fails
# SJS Apr 2016 - this is modified version for QSAS 2.4.16 ONLY.
#
# see README_windows_qsas.txt in doc directory for instructions
# usage:
#   build_win empty   - cleans out qsas including copied system (Qt, etc.) libs
#   build_win qsas    - builds qsas = clean install version
#   build_win version - partial rebuild with changed elements (I think)
#   bulid_win install - installs includes and such to prepare for building
#   build_win core    - builds core qsas - no plugins
#   build_win plugins - builds only plugins (in EXT)
#   build_win clean   - removes object and temporary files
#   build_win release - performs empty, qsas, clean and packages up release ready for zipping
#   build_win local_plugin - sets up qsas environment and invokes local Makefile_local.win

# top level environments:
export QS_HOME="/home/steve/QSAS_build/QSAS24"
export QS_BUILD_V="QSAS64"
export CDF_INSTALLATION="/home/steve/cdf36_0-dist/"
# Qt needs windows format for most things plus *nix for moc and shareable dll's
export QT_DIR_WIN="C:\\msys64\\mingw64"
export QT_DIR_NIX="/mingw64"

export MINGW="/mingw64"
export REGEX_INC=" ."
#export REGEX_INC=\"C:\\Qt\\ported32\\include\"
# for release building only - will create and build in this DIR - fails if already exists :
export RELEASE_DIR="/home/steve/QSAS_build/RELEASES/QSAS2416rc1/"
export DBUG_FLAG="-g"
#export DBUG_FLAG=" "
# no changes should be needed below this line
#################################################################
export TARGET_PATH="${QS_HOME}/bin"
export TARGET_LIB="${QS_HOME}/lib"
export TARGET_INC="${QS_HOME}/include"
export TARGET="${TARGET_PATH}/qsas_exe.exe"
export CDF_INC="${CDF_INSTALLATION}/include"
export CDF_LIB="${CDF_INSTALLATION}/lib"

export QT_INCLUDE_CORE=\"${QT_DIR_WIN}\\include\\QtCore\"
export QT_INCLUDE_GUI=\"${QT_DIR_WIN}\\include\\QtGui\"
export QT_INCLUDE_SVG=\"${QT_DIR_WIN}\\include\\QtSvg\"
export QT_INCLUDE_XML=\"${QT_DIR_WIN}\\include\\QtXml\"
export QT_INCLUDE_WIDGETS=\"${QT_DIR_WIN}\\include\\QtWidgets\"
export QT_INCLUDE_PRINT=\"${QT_DIR_WIN}\\include\\QtPrintSupport\"
export QT_INCLUDE=\"${QT_DIR_WIN}\\include\"
export QT_LIB_DIR=\"${QT_DIR_WIN}\\lib\"
#export QT_LIB_DIR=\"${QT_DIR_WIN}\\bin\"
# \lib has the dll.a versions of the libs, 
# which is so gcc can see them as -lxyz - I think

export MOC="${QT_DIR_NIX}/bin/moc"

if [ $QS_BUILD_V == "QSAS64" ]; then
####################
# orig directives SJS 23 Oct 2015
#  export REGEX_LIB=" "
#  export LD_FLAGS=" -shared -Wl,--enable-stdcall-fixup -Wl,--enable-auto-import -Wl,--enable-runtime-pseudo-reloc -mthreads -Wl,-subsystem,windows "
#  export CPLFLAGS=" -O0 -fno-keep-inline-dllexport -Wno-deprecated -I\$(TARGET_INC) -I\$(CDF_INC) -I\$(QT_INCLUDE)  -I\$(QT_INCLUDE_CORE) -I\$(QT_INCLUDE_GUI) -I\$(QT_INCLUDE_SVG) -I\$(QT_INCLUDE_XML) -I\$(QT_INCLUDE_WIDGETS) -I\$(QT_INCLUDE_PRINT) -DWINDOWS -DQT_SHARED -DQT_GUI_LIB -DQT_CORE_LIB -DQT_NO_MEMBER_TEMPLATES=0 "
#  export CFLAGS=" -O0 -fno-keep-inline-dllexport -enable-stdcall-fixup -I\$(TARGET_INC) -I\$(CDF_INC) -I\$(QT_INCLUDE)  -I\$(QT_INCLUDE_CORE) -I\$(QT_INCLUDE_GUI)  -I\$(QT_INCLUDE_SVG) -I\$(QT_INCLUDE_XML) -DWINDOWS -DQT_SHARED -DQT_GUI_LIB -DQT_CORE_LIB -DQT_NO_MEMBER_TEMPLATES=0 "
#####################
  export REGEX_LIB=" "
  export MAIN_FLAGS="-Wl,--enable-auto-import -Wl,--enable-runtime-pseudo-reloc -mthreads -Wl,-subsystem,windows -Wl,--stack,800000000"
  export LD_FLAGS=" -shared  -Wl,--enable-auto-import -Wl,--enable-runtime-pseudo-reloc -mthreads -Wl,-subsystem,windows -Wl,--stack,800000000 "
  export CPLFLAGS=" -O3 -fno-keep-inline-dllexport -Wno-deprecated -mthreads -I\$(TARGET_INC) -I\$(CDF_INC) -I\$(QT_INCLUDE)  -I\$(QT_INCLUDE_CORE) -I\$(QT_INCLUDE_GUI) -I\$(QT_INCLUDE_SVG) -I\$(QT_INCLUDE_XML) -I\$(QT_INCLUDE_WIDGETS) -I\$(QT_INCLUDE_PRINT) -DWINDOWS -DQT_SHARED -DQT_GUI_LIB -DQT_CORE_LIB -DQT_NO_MEMBER_TEMPLATES=0 "
  export CFLAGS=" -O3 -fno-keep-inline-dllexport -enable-stdcall-fixup -mthreads -I\$(TARGET_INC) -I\$(CDF_INC) -I\$(QT_INCLUDE)  -I\$(QT_INCLUDE_CORE) -I\$(QT_INCLUDE_GUI)  -I\$(QT_INCLUDE_SVG) -I\$(QT_INCLUDE_XML) -DWINDOWS -DQT_SHARED -DQT_GUI_LIB -DQT_CORE_LIB -DQT_NO_MEMBER_TEMPLATES=0 "
else
  # REGEX is used only by QDOS
  export REGEX_LIB=" \$(MINGW)/../ported32/lib/libregex.dll.a "
  export LD_FLAGS=" -shared -Wl,--enable-auto-import -Wl,--enable-runtime-pseudo-reloc -mthreads -Wl,-subsystem,windows "
  export CPLFLAGS=" -O3 -fno-keep-inline-dllexport -Wno-deprecated -enable-stdcall-fixup -I\$(REGEX_INC) -I\$(TARGET_INC) -I\$(CDF_INC) -I\$(QT_INCLUDE)  -I\$(QT_INCLUDE_CORE) -I\$(QT_INCLUDE_GUI) -I\$(QT_INCLUDE_SVG) -I\$(QT_INCLUDE_XML) -DWINDOWS -DQT_SHARED -DQT_GUI_LIB -DQT_CORE_LIB -DQT_NO_MEMBER_TEMPLATES=0 "
  export CFLAGS=" -O3 -fno-keep-inline-dllexport -I\$(TARGET_INC) -I\$(CDF_INC) -I\$(QT_INCLUDE)  -I\$(QT_INCLUDE_CORE) -I\$(QT_INCLUDE_GUI)  -I\$(QT_INCLUDE_SVG) -I\$(QT_INCLUDE_XML) -DWINDOWS -DQT_SHARED -DQT_GUI_LIB -DQT_CORE_LIB -DQT_NO_MEMBER_TEMPLATES=0 "
fi

export LD="${MINGW}/bin/g++ \$(DBUG_FLAG) "
export CPL="${MINGW}/bin/g++ \$(DBUG_FLAG) -fpermissive"
export CC="${MINGW}/bin/gcc \$(DBUG_FLAG) -fpermissive"
export QT_LIBS="-L${QT_LIB_DIR} -lQt5Core -lQt5Gui -lQt5Svg -lQt5Xml -lQt5Widgets -lQt5PrintSupport"

export STRIP_SO=" ls "
export INSTALL="install -m 0664 "
export MAKE="make  -f Makefile.win "

if [ $# != 1 ]; then
   echo "Script requires one, and only one, argument. One of:";
   echo "   build_win empty   - cleans out qsas including copied system (Qt, etc.) libs";
   echo "   build_win qsas    - builds qsas = clean install version";
   echo "   build_win version - partial rebuild with changed elements (I think)";
   echo "   bulid_win install - installs includes and such to prepare for building";
   echo "   build_win core    - builds core qsas - no plugins";
   echo "   build_win plugins - builds only plugins (in EXT)";
   echo "   build_win clean   - removes object and temporary files";
   echo "   build_win release - performs empty, qsas, clean and packages up release ready for zipping";
   echo "   build_win local_plugin - sets up qsas environment and invokes local Makefile_local.win";
   exit;
fi   

if [ $1 == "local_plugin" ]; then
	make -f Makefile_local.win;
# adding "local_plugin" requires protection against mistake rebuild of QSAS
# so check build options one by one:
elif [ $1 == "empty" ] || [ $1 == "qsas" ] || [ $1 == "version" ] || \
    [ $1 == "install" ] || [ $1 == "core" ] || [ $1 == "plugins" ] || [ $1 == "clean" ]; then
    echo "performing build_win $1";
    make -f ${QS_HOME}/src/Makefile.win $1;
elif [ $1 == "release" ]; then
  echo "making release in ${RELEASE_DIR}";
  if [ -d "$RELEASE_DIR" ]; then
     echo "${RELEASE_DIR} exists; delete first and re-run. Exiting...";
  else
		echo " emptying "
    make -f ${QS_HOME}/src/Makefile.win empty
	if [ -f "${QS_HOME}/bin/qsas_exe.exe" ]; then
		echo " removing qsas_exe.exe to ensure make completes"
		rm ${QS_HOME}/bin/qsas_exe.exe
	fi
		echo " making qsas "
    make -f ${QS_HOME}/src/Makefile.win qsas
	if [ ! -f "${QS_HOME}/bin/qsas_exe.exe" ]; then
		echo " qsas_exe.exe not found => make did not complete"
		echo "exiting ..."
		exit 1
	fi	
		echo " cleaning "
    make -f ${QS_HOME}/src/Makefile.win clean
		echo "copying to ${RELEASE_DIR}"
	mkdir "$RELEASE_DIR"
		echo "$RELEASE_DIR created; copying qtpl"
	cp -R ../qtpl  ${RELEASE_DIR}
		echo "copying tmp"
	cp -R ../tmp   ${RELEASE_DIR}
		echo "copying individual files in bin"
	mkdir ${RELEASE_DIR}/bin
		cp ../bin/build_win   ${RELEASE_DIR}/bin
		cp ../bin/buildPlugin   ${RELEASE_DIR}/bin
		cp ../bin/cmap0_default.pal   ${RELEASE_DIR}/bin
		cp ../bin/cmap1_default.pal   ${RELEASE_DIR}/bin
		cp ../bin/disp.exe   ${RELEASE_DIR}/bin
		cp ../bin/QSAS.bat   ${RELEASE_DIR}/bin
		cp ../bin/QSAS_win   ${RELEASE_DIR}/bin
		cp ../bin/qsas_exe.exe   ${RELEASE_DIR}/bin
		cp ../bin/plstnd5.fnt   ${RELEASE_DIR}/bin
		cp ../bin/plxtnd5.fnt   ${RELEASE_DIR}/bin
		cp ../bin/qsas_exe.exe   ${RELEASE_DIR}/bin
		cp ../bin/README_Build_Windows.txt   ${RELEASE_DIR}/bin
		mkdir ${RELEASE_DIR}/bin/platforms
		cp ${QT_DIR_NIX}/share/qt5/plugins/platforms/qwindows.dll ${RELEASE_DIR}/bin/platforms
		cp ${QT_DIR_NIX}/share/qt5/plugins/platforms/qwindowsd.dll ${RELEASE_DIR}/bin/platforms		
#	
		echo "copying lib"
	cp -R ../lib   ${RELEASE_DIR}
		echo "copying src"
	cp -R ../src   ${RELEASE_DIR}
		echo "copying doc"
	cp -R ../doc   ${RELEASE_DIR}
	cp  ../README.txt  ${RELEASE_DIR}
		echo "copying black_boxes"
	cp -R ../black_boxes ${RELEASE_DIR}/black_boxes
		echo "copying include"
	cp -R ../include ${RELEASE_DIR}
		echo "copying examples"
	cp -R ../examples ${RELEASE_DIR}
		echo "copying SampleClusterData"
	cp -R ../SampleClusterData ${RELEASE_DIR}

# needs libstdc++-6.dll and a few others - Use Dependency Walker if you build on a different system :
    cp ${MINGW}/bin/libstdc++-6.dll ${RELEASE_DIR}/lib
	cp ${MINGW}/bin/libgcc_s_seh-1.dll ${RELEASE_DIR}/lib
	cp ${MINGW}/bin/libwinpthread-1.dll ${RELEASE_DIR}/lib
	cp ${MINGW}/bin/libicudt55.dll ${RELEASE_DIR}/lib
	cp ${MINGW}/bin/libicuin55.dll ${RELEASE_DIR}/lib
	cp ${MINGW}/bin/libicuuc55.dll ${RELEASE_DIR}/lib
	cp ${MINGW}/bin/libpcre16-0.dll ${RELEASE_DIR}/lib
	cp ${MINGW}/bin/zlib1.dll ${RELEASE_DIR}/lib
	cp ${MINGW}/bin/libharfbuzz-0.dll ${RELEASE_DIR}/lib
	cp ${MINGW}/bin/libfreetype-6.dll ${RELEASE_DIR}/lib
	cp ${MINGW}/bin/libbz2-1.dll ${RELEASE_DIR}/lib
	cp ${MINGW}/bin/libpng16-16.dll ${RELEASE_DIR}/lib
	cp ${MINGW}/bin/libglib-2.0-0.dll ${RELEASE_DIR}/lib
	cp ${MINGW}/bin/libintl-8.dll ${RELEASE_DIR}/lib
	cp ${MINGW}/bin/libiconv-2.dll ${RELEASE_DIR}/lib
	cp ${QT_DIR_NIX}/bin/Qt5Core.dll ${RELEASE_DIR}/lib
	cp ${QT_DIR_NIX}/bin/Qt5GUI.dll ${RELEASE_DIR}/lib
	cp ${QT_DIR_NIX}/bin/Qt5Network.dll ${RELEASE_DIR}/lib
	cp ${QT_DIR_NIX}/bin/Qt5Xml.dll ${RELEASE_DIR}/lib
	cp ${QT_DIR_NIX}/bin/Qt5Svg.dll ${RELEASE_DIR}/lib
 	cp ${QT_DIR_NIX}/bin/Qt5Widgets.dll ${RELEASE_DIR}/lib
	cp ${QT_DIR_NIX}/bin/Qt5PrintSupport.dll ${RELEASE_DIR}/lib
   fi
else
    echo "unrecognised build option $1"
fi
echo "done performing build_win $1"

#  -fno-keep-inline-dllexport -wl,--enable-stdcall-fixup   ! remove from CFLAGS and CPLFLAGS for some systems
