#!/bin/sh
#$Id: make_prog_lib,v 1.17 2025/10/07 01:48:53 marcum Exp $
#FUNCTION

#===============================================================================
# Function to create combined library of all code used by a given program.
#===============================================================================

make_prog_lib ()
{
	if [ "$1" = "" ]; then
		return
	fi

	program_name="$1"

	if [ ! -d ${src_dir}/${program_name} ]; then
		return
	fi

	echo "Make combined library for all code used by ${program_name} ..."

	start_dir="`pwd`"

	tmp_dir="${TMPDIR}/${USER}_`basename $0`_$$"

	if [ -d "${tmp_dir}" ]; then

		/bin/rm -rf ${tmp_dir}
	fi

	mkdir ${tmp_dir}

	cd ${tmp_dir}

	prog_lib_names="${program_name}_main"

	prog_lib_list_files="${src_dir}/${program_name}/*.lib_list"

	lib_names_1=
	lib_names_2=
	lib_names_3=

	for prog_lib_list_file in ${prog_lib_list_files}; do

		if [ -r "${prog_lib_list_file}" ]; then

			. ${prog_lib_list_file}
			break
		fi
	done

	if [ "${lib_names_1}" = "" ] && [ "${lib_names_2}" = "" ] && [ "${lib_names_3}" = "" ]; then
		lib_names_1="${program_name}"
	fi

	prog_lib_names="${prog_lib_names} ${lib_names_1}"
	if [ "${lib_names_2}" ]; then
		prog_lib_names="${prog_lib_names} ${lib_names_2}"
	fi
	if [ "${lib_names_3}" ]; then
		prog_lib_names="${prog_lib_names} ${lib_names_3}"
	fi

	list=

	for name in ${prog_lib_names}; do

		if [ "`echo ${list} | grep :${name}:`" = "" ] && [ "${name}" != "xplt2" ] && [ "${name}" != "XW" ]; then
			list="${list}:${name}:"
		fi
	done

	echo "extracting object code from all libs used by ${program_name} ..."

	for name in ${prog_lib_names}; do
		ar x ${sys_lib_dir}/${lib_prefix}${name}${compile_suffix}.${static_lib_suffix} > /dev/null 2>&1
	done

	if [ "${program_name}" = "aflr2c" ]; then

		${c_compiler_opt0} ${src_dir}/dftr2/dftr2_3d_api.c
	fi

	if [ "${program_name}" = "aflr43" ]; then

		program_name="aflr"
	fi

	echo "adding all object code to ${lib_prefix}${program_name}_all${compile_suffix}.${static_lib_suffix} ..."

	ar r ${lib_prefix}${program_name}_all${compile_suffix}.${static_lib_suffix} *.o > /dev/null 2>&1

	if [ "${debug_flag}" = "" ]; then

		if [ "${program_name}" = "aflr4" ] || [ "${program_name}" = "aflr" ]; then

			if [ "${arch_type}" = "WIN64" ]; then

				egads_lib="${sys_shared_lib_dir}/${lib_prefix}egads.${shared_lib_suffix}"
			else
				egads_lib="-legads"
			fi

		else
			egads_lib=
		fi

		if [ "${arch_type}" = "MacOSX-x86-64" ] || [ "${arch_type}" = "MacOSX-arm64" ]; then

			echo "adding all object code to ${lib_prefix}${program_name}_all${compile_suffix}.${shared_lib_suffix} ..."

			${shared_lib_linker} -o ${lib_prefix}${program_name}_all.${shared_lib_suffix} *.o -L${sys_shared_lib_dir} ${egads_lib} -lstdc++ -rpath ${sys_shared_lib_dir} -rpath @loader_path/ -install_name @rpath/${lib_prefix}${program_name}_all.${shared_lib_suffix}

		elif [ "${arch_type}" = "Linux-x86-64" ] || [ "${arch_type}" = "Linux-arm64" ]; then

			echo "adding all object code to ${lib_prefix}${program_name}_all${compile_suffix}.${shared_lib_suffix} ..."

			${shared_lib_linker} -o ${lib_prefix}${program_name}_all.${shared_lib_suffix} *.o -L${sys_shared_lib_dir} ${egads_lib} -lstdc++

		elif [ "${arch_type}" = "WIN64" ]; then

			echo "creating DEF file for ${lib_prefix}${program_name}_all.def ..."

			echo "\
LIBRARY ${lib_prefix}${program_name}_all.${shared_lib_suffix}
EXPORTS
`nm ${lib_prefix}${program_name}_all.${static_lib_suffix} | grep ' T '`
" > ${lib_prefix}${program_name}_all.def

			/bin/rm -f ${lib_prefix}${program_name}_all.${static_lib_suffix}

			ex ${lib_prefix}${program_name}_all.def << END_EX
g/................ T _/ .d
g/ T / .s/................ T //
g/_cpp_/ .s/_cpp_/_SAVE_THESE_/g
g/_cpp/ .d
g/_SAVE_THESE_/ .s/_SAVE_THESE_/_cpp_/g
wq
END_EX

			echo "creating DLL ${lib_prefix}${program_name}_all.${shared_lib_suffix} ..."

			${shared_lib_linker} -o ${lib_prefix}${program_name}_all.${shared_lib_suffix} *.o ${lib_prefix}${program_name}_all.def ${egads_lib} -static -lstdc++ -Wl,--out-implib,${lib_prefix}${program_name}_all${compile_suffix}.${static_lib_suffix}

			chmod 0644 ${lib_prefix}${program_name}_all.def

			/bin/mv -f ${lib_prefix}${program_name}_all.def ${sys_shared_lib_dir}/${lib_prefix}${program_name}_all.def 
		fi
	fi

	if [ "${debug_flag}" = "" ]; then
		chmod 0755 ${lib_prefix}${program_name}_all.${shared_lib_suffix}
	fi

	chmod 0644 ${lib_prefix}${program_name}_all${compile_suffix}.${static_lib_suffix}

	/bin/mv -f ${lib_prefix}${program_name}_all.${shared_lib_suffix} ${sys_shared_lib_dir}/${lib_prefix}${program_name}_all.${shared_lib_suffix} 

	/bin/mv -f ${lib_prefix}${program_name}_all${compile_suffix}.${static_lib_suffix} ${sys_lib_dir}/${lib_prefix}${program_name}_all${compile_suffix}.${static_lib_suffix} 

	if [ "${program_name}" = "aflr" ]; then

		program_name="aflr43"
	fi

	/bin/rm -rf ${tmp_dir}

	cd ${start_dir}
}
