SubDir P4 zlib ;

local CCFLAGS = $(CCFLAGS) [ FDefines Z_PREFIX ] ;
CCFLAGS = [ FRemoveAny $(CCFLAGS) : -Wparentheses ] ;

if $(OS) != NT
{
	CCFLAGS += -Wno-unused-variable ;
}

if $(CLANGVER)
{
	CCFLAGS += -Wno-pointer-sign ;

	if [ FVersionCmp $(CLANGVER) : 17.0.0 ] >= 0
	{
	    CCFLAGS += -Wno-deprecated-non-prototype ;
	}
}

if $(GCCVER) && [ FVersionCmp $(GCCVER) : 15.1.0 ] >= 0
{
	CCFLAGS += -Wno-old-style-definition ;
}

P4APILibrary $(SUPPORTLIB) : 
	adler32.c
	crc32.c
	inffast.c
	inftrees.c
	trees.c
	zutil.c 
	;

if $(USE_OPTIMIZED_ZLIB) = 1
{
	if $(OS) != NT
	{
	    CCFLAGS += -mpclmul ;

	    if $(OSPLAT) != ARM64
	    {
	        # Clang/ARM64 doesn't know this.
	        CCFLAGS += -msse4.2 ;
	    }
	}

	P4APILibrary $(SUPPORTLIB) : 
	    adler32_simd.c
	    crc_folding.c
	    crc32_simd.c
	    deflate-opt.c
	    inffast_chunk.c
	    inflate-opt.c
	    x86.c
	;


	if $(OSPLAT) != ARM64
	{
	    P4APILibrary $(SUPPORTLIB) :
	        deflate.c ;

	    ObjectDefines deflate.c : NO_SIMD ;
	}


	{
	    local _s ;
	    local _t ;
	    local _extra = inffast_chunk_nossse ;

	    _t =  [ FGristFiles $(_extra:S=$(SUFOBJ)) ] ;
	    _s = [ FGristFiles inffast_chunk.c ] ;
	    if $(OS) != NT
	    {
	        CCFLAGS += -mno-ssse3 ;
	    }
	    Object $(_t) : $(_s) ;
	    MakeLocateWithSubDirectory $(_t) : [ FDirName $(LOCATE_SOURCE[1]) objects $(SUBDIR_TOKENS) ] ;            
	    ObjectDefines $(_t) : INFLATE_CHUNK_SIMD_SSE2 INFLATE_CHUNK_READ_64LE FAST_CHUNK_NOSSSE3 ;
	    local NOARUPDATE = true ;
	    LibraryFromObjects $(SUPPORTLIB) : $(_t) ;
	    LibraryFromObjects $(P4APILIB) : $(_t) ;
	}

	ObjectDefines adler32.c : ADLER32_SIMD_SSSE3 ;
	ObjectDefines adler32_simd.c : ADLER32_SIMD_SSSE3 INFLATE_CHUNK_SIMD_SSE2 ;
	ObjectDefines crc32.c : CRC32_SIMD_SSE42_PCLMUL ;
	ObjectDefines crc32_simd.c : CRC32_SIMD_SSE42_PCLMUL ;
	ObjectDefines inflate-opt.c : INFLATE_CHUNK_SIMD_SSE2 INFLATE_CHUNK_READ_64LE ;
	ObjectDefines inffast_chunk.c : INFLATE_CHUNK_SIMD_SSE2 INFLATE_CHUNK_READ_64LE ;
}
else
{
	P4APILibrary $(SUPPORTLIB) : 
	    deflate.c
	    inflate.c
	    simd_stub.c
	;
}
