makeruntime.sh.in 5.48 KB
#!/bin/bash
#
# SPDX-License-Identifier: LGPL-3.0-or-later
#
#  Copyright (C) 2021 Perry Werneck <perry.werneck@gmail.com>
#
#  This program is free software: you can redistribute it and/or modify
#  it under the terms of the GNU Lesser General Public License as published
#  by the Free Software Foundation, either version 3 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 Lesser General Public License
#  along with this program.  If not, see <https://www.gnu.org/licenses/>.
#

#
# Referencias:
#
# https://www.gtk.org/docs/installations/windows/
# http://drup.org/gtk-warning-error-loading-icon-couldnt-recognize-image-file-format
#

# Setup default paths
srcdir="$(dirname $(dirname $(readlink -f "${0}")))"
prefix="@prefix@"

buildroot=.build
bindir="${buildroot}${prefix}/bin"

if [ -z "${WIN_ROOT}" ]; then
	WIN_ROOT="/c/Windows"
fi

export LANG=C

install_bin() {

	mkdir -p "${bindir}"

	AGAIN=1
	until [ $AGAIN = 0 ]; do

		SOURCES=$(mktemp)
		REQUIRES=$(mktemp)

		find "${buildroot}${prefix}" -iname "*.dll" >	${SOURCES}
		find "${buildroot}${prefix}" -iname "*.exe" >>	${SOURCES}
	
		while read FILENAME
		do
			objdump -p ${FILENAME} | grep "DLL Name:" | cut -d: -f2 | tr "[:upper:]" "[:lower:]" >> ${REQUIRES}
		done < ${SOURCES}

		libs_to_exclude="
			advapi32
			cfgmgr32
			comctl32
			comdlg32
			crypt32
			d3d8
			d3d9
			ddraw
			dnsapi
			dsound
			dwmapi
			gdi32
			gdiplus
			glu32
			glut32
			imm32
			iphlpapi
			kernel32
			ksuser
			mpr
			mscms
			mscoree
			msimg32
			msvcr71
			msvcr80
			msvcr90
			msvcrt
			mswsock
			netapi32
			odbc32
			ole32
			oleacc
			oleaut32
			opengl32
			psapi
			rpcrt4
			secur32
			setupapi
			shell32
			shlwapi
			user32
			usp10
			version
			wininet
			winmm
			wldap32
			ws2_32
			wsock32
			winspool.drv
			ntdll
			winhttp
			hid
		"

		# Remove system DLLs from list
		for i in $libs_to_exclude; do
			sed -i -e "/${i}/d" ${REQUIRES}
		done

		AGAIN=0
		while read FILENAME
		do

			if [ ! -e "${bindir}/${FILENAME}" ]; then

				if [ -e ${prefix}/bin/${FILENAME} ]; then

					AGAIN=1
					cp -v "${prefix}/bin/${FILENAME}" "${bindir}/${FILENAME}"
					if [ "$?" != "0" ]; then
						exit -1
					fi

				elif [ -e ${prefix}/lib/${FILENAME} ]; then

					AGAIN=1
					cp -v "${prefix}/lib/${FILENAME}" "${bindir}/${FILENAME}"
					if [ "$?" != "0" ]; then
						exit -1
					fi

				elif [ -e  "${WIN_ROOT}/System32/${FILENAME}" ]; then

					echo "Ignoring ${WIN_ROOT}/System32/${FILENAME}"

				else 

					echo "Can't find ${prefix}/bin/${FILENAME} or ${WIN_ROOT}/System32/${FILENAME}"
					find "${prefix}" -iname "${FILENAME}"
					exit -1

				fi
			
			fi
		
		done < ${REQUIRES}

		rm -f ${SOURCES}
		rm -f ${REQUIRES}
		
	done

}

install_locale() {		

        mkdir -p ${buildroot}${prefix}/share/locale/pt_BR/LC_MESSAGES

        locales="
                gettext-runtime.mo
                gettext-tools.mo
                glib20.mo
                gtk30.mo
                gtk30-properties.mo
        "

		FILENAMES=$(mktemp)
        for i in ${locales}
		do
 			find "${prefix}/share/locale" -name ${i} >> ${FILENAMES}
		done

		while read FILENAME
		do
			mkdir -p $(dirname "${buildroot}${FILENAME}")
			cp -v "${FILENAME}" "${buildroot}${FILENAME}"
			if [ "$?" != "0" ]; then
				exit -1
			fi
		done < ${FILENAMES}
		rm -f ${FILENAMES}
}

install_schemas() {		

        mkdir -p ${buildroot}${prefix}/share/glib-2.0/schemas

        schemas="
            org.gtk.Settings.FileChooser.gschema.xml
			gschema.dtd
        "

		for schema in ${schemas}
		do
        	cp -v "${prefix}/share/glib-2.0/schemas/${schema}" "${buildroot}${prefix}/share/glib-2.0/schemas"
			if [ "$?" != "0" ]; then
				exit -1
			fi
		done

		glib-compile-schemas \
                --targetdir="${buildroot}${prefix}/share/glib-2.0/schemas" \
                "${buildroot}${prefix}/share/glib-2.0/schemas"

		if [ "$?" != "0" ]; then
			exit -1
		fi
}

install_theme() {		

	mkdir -p "${buildroot}${prefix}/etc"
	cp -rv "${prefix}/etc/gtk-3.0" "${buildroot}${prefix}/etc"
	if [ "$?" != "0" ]; then
		exit -1
	fi

	# https://stackoverflow.com/questions/37035936/how-to-get-native-windows-decorations-on-gtk3-on-windows-7-and-msys2
	mkdir -p ${buildroot}${prefix}/etc/gtk-3.0
	rm -f ${buildroot}${prefix}/etc/gtk-3.0/settings.ini
	rm -f ${buildroot}${prefix}/etc/gtk-3.0/gtkrc

	echo "[Settings]" > ${buildroot}${prefix}/etc/gtk-3.0/settings.ini
	echo "gtk-theme-name=${1}" >> ${buildroot}${prefix}/etc/gtk-3.0/settings.ini

	if [ -e "${srcdir}/win/gtk.css" ]; then
		mkdir -p "${buildroot}${prefix}/share/themes/Default/gtk-3.0"
		cp "${srcdir}/win/gtk.css" "${buildroot}${prefix}/share/themes/Default/gtk-3.0/gtk.css"
	fi

}

install_icons() {

	mkdir -p "${buildroot}${prefix}/share/icons"

	if [ -d "${prefix}/share/icons/${1}" ]; then

		cp -rv "${prefix}/share/icons/${1}" "${buildroot}${prefix}/share/icons"
		if [ "$?" != 0 ]; then
			echo "Can´t copy ${1} icons"
			exit -1
		fi

	elif [ -d "/usr/share/icons/${1}" ]; then

		cp -rv "/usr/share/icons/${1}" "${buildroot}${prefix}/share/icons"
		if [ "$?" != 0 ]; then
			echo "Can´t copy ${1} icons"
			exit -1
		fi

	else

		echo "Can´t find ${1} icons"
		exit -1
	
	fi
	
}

install_bin
install_locale
install_schemas
install_theme "Adwaita"
install_icons "Adwaita"