"#", "(C) 2014-2017 FrankHB.",
"NPLA1 script for build YSLib using SHBuild.";

"XXX:", "'SHBuild_2*' depend on 'cygpath' optionally.";
"XXX:", "'SHBuild_CheckUName_*' depend on 'uname'";

load (env-get "SHBuild_Common");

$env-de! AR "gcc-ar";
$def! YSLib_BuildDir env-get "YSLib_BuildDir";
$assert-nonempty YSLib_BuildDir;
SHBuild_EnsureDirectory_ YSLib_BuildDir;
$env-de! SHBuild_Env_OS ($set-system-var! SHBuild_Env_uname "uname";
	SHBuild_CheckUName_Case_ SHBuild_Env_uname);
$env-de! SHBuild_Env_Arch ($set-system-var! SHBuild_Env_uname_m "uname -m";
	SHBuild_CheckUNameM_Case_ SHBuild_Env_uname_m);
$defl! SHBuild_EchoVar_E (env var) SHBuild_EchoVar var
	(eval (string->symbol (SHBuild_SDot_ var)) env);
$defl! skip-or-build (nskip dynamic) $let
(
	(debug not? (env-empty? "debug"))
	(lname ++ ($if dynamic "dynamic " "static ") "libraries")
)
(
	$def! YSLib_BaseDir env-get "YSLib_BaseDir";
	$assert-nonempty YSLib_BaseDir;
	$if debug ($redef! lname ++ "debug " lname);
	$if nskip ($let*
	(
		(env-os SHBuild_Env_OS)
		(SHBuild_Host_Platform $if (win32? env-os) "MinGW32" env-os)
		(repo-base SHBuild_2m env-os YSLib_BaseDir)
		(YF_SystemLibs
			$if (win32? env-os) "-lgdi32 -limm32" "-lxcb -lpthread")
		(DIR_YFramework ++ repo-base "/YFramework")
		(LIBS_YFramework SHBuild_TrimOptions_ (++ " -L\"" (SHBuild_2m env-os
			(++ DIR_YFramework "/" SHBuild_Host_Platform "/lib-"
			SHBuild_Env_Arch)) "\" -lFreeImage -lfreetype " YF_SystemLibs))
	)
	(
		$defl! incsub (dir) ++ "-I\"" (SHBuild_2m env-os dir) "\"";
		$def! INCLUDES_YBase SHBuild_TrimOptions_
			(incsub (++ repo-base "/YBase/include"));
		$def! INCLUDES_YFramework SHBuild_TrimOptions_ (++
			(foldr1 ++ "" (map1 ($lambda (n) ++ (incsub (++ DIR_YFramework n
				"/include")) " ") (list "" "/Android" "/DS" "/Win32")))
			(incsub (++ repo-base "/3rdparty/include")) " "
			(env-get "INCLUDES_freetype") " " INCLUDES_YBase);
		for-each-ltr SHBuild_EchoVar_N (list "SHBuild");
		for-each-ltr ($lambda (var) SHBuild_EchoVar_E
			(() get-current-environment) var)
			(list "SHBuild_Host_Platform" "INCLUDES_YBase"
			"INCLUDES_YFramework" "LIBS_YFramework");
		$let
		(
			(shbuild env-get "SHBuild")
			(outdir ++ ".shbuild" ($if dynamic "-dll" "")
				($if debug "-debug" ""))
		)
		(
			putss "Building " lname " ...";
			build-with-conf-opt outdir env-os debug dynamic
				"-xid,alternative -xid,data -xid,include -xid,Android"
				($lambda (CXX CXXFLAGS SHBOPT LIBPFX)
				(
					$if (env-empty? "SHBuild_NoPCH")
					(
						SHBuild_BuildGCH
							(++ repo-base "/YBase/include/stdinc.h")
							(++ outdir "/stdinc.h")
							(++ CXX " -xc++-header " CXXFLAGS);
						$def! inc-pch list "-include"
							(++ "\"" outdir "/stdinc.h" "\"")
					)
					(
						puts "Skipped building precompiled file.";
						$def! inc-pch ()
					);
					$defl! libdname (lib) ++ lib ($if debug "d" "");
					$def! DFLAG_B_YB $if dynamic "-DYB_BUILD_DLL" "";
					$defl! build-lib (lib-name opt-list)
						system-check (apply cons-cmd (append (list shbuild
						SHBOPT (++ "-xn," LIBPFX (libdname lib-name))) (rest
						(() cmd-get-args)) (list (++ repo-base "/" lib-name)
						CXXFLAGS) opt-list inc-pch));
					build-lib "YBase" (list DFLAG_B_YB INCLUDES_YBase);
					$if dynamic (env-set "LIBS" (cons-cmd (++ "-L" outdir)
						(++ "-l" (libdname "YBase")) LIBS_YFramework));
					build-lib "YFramework"
						(list ($if debug ($if dynamic "-DYB_DLL" "") DFLAG_B_YB)
						($if dynamic "-DYF_BUILD_DLL" "") "-DFREEIMAGE_LIB"
						(SHBuild_TrimOptions_ INCLUDES_YFramework))
				)
			);
			putss "Finished building " lname "."
		)
	))
	(putss "Skipped " lname ".")
);
skip-or-build (env-empty? "SHBuild_NoStatic") #f;
skip-or-build (env-empty? "SHBuild_NoDynamic") #t;

