#
# LDASTools frameCPP - A library implementing the LIGO/Virgo frame specification
#
# Copyright (C) 2018 California Institute of Technology
#
# LDASTools frameCPP is free software; you may redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 (GPLv2) of the
# License or at your discretion, any later version.
#
# LDASTools frameCPP is distributed in the hope that it will be useful, but
# without any warranty or even the implied warranty of merchantability
# or fitness for a particular purpose. See the GNU General Public
# License (GPLv2) for more details.
#
# Neither the names of the California Institute of Technology (Caltech),
# The Massachusetts Institute of Technology (M.I.T), The Laser
# Interferometer Gravitational-Wave Observatory (LIGO), nor the names
# of its contributors may be used to endorse or promote products derived
# from this software without specific prior written permission.
#
# You should have received a copy of the licensing terms for this
# software included in the file LICENSE located in the top-level
# directory of this package. If you did not, you can view a copy at
# http://dcc.ligo.org/M1500244/LICENSE
#
function( framecpp_target_executable target )
  set(options
    )
  set(oneValueArgs
    )
  set(multiValueArgs
    INCLUDES
    LDADD
    SOURCES
    )

  cmake_parse_arguments( ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )

  if ( NOT ARG_INCLUDES)
    set( ARG_INCLUDES ${AM_CPPFLAGS} )
  endif( )
  if ( NOT ARG_LDADD )
    set( ARG_LDADD ${LDADD} )
  endif( )
  cx_target_executable( ${target}
    SOURCES ${ARG_SOURCES}
    LDADD ${ARG_LDADD}
    INCLUDE_DIRECTORIES BEFORE PRIVATE
      ${ARG_INCLUDES}
  )
endfunction( )

function( framecpp_target_test target )
  set(options
    )
  set(oneValueArgs
    )
  set(multiValueArgs
    SOURCES
    LDADD
    COMMAND_ARGS
    )

  cmake_parse_arguments( ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )

  if ( NOT ARG_LDADD )
    set( ARG_LDADD ${LDADD} )
  endif( )
  if ( NOT ARG_INCLUDES )
    set( ARG_INCLUDES ${AM_CPPFLAGS} )
  endif( )

  cx_target_executable(
    ${target}
    NOINST
    SOURCES ${ARG_SOURCES}
    LDADD ${ARG_LDADD}
    INCLUDE_DIRECTORIES BEFORE PRIVATE
      ${ARG_INCLUDES}
    )
  cx_target_test( ${target}
    COMMAND ${target} ${ARG_COMMAND_ARGS}
    ENVIRONMENT ${TESTS_ENVIRONMENT}
    )
endfunction( )

set( LDAS_DIRECTORY_BUILD_LIB_FRAMECPP ${CMAKE_BINARY_DIR} )

set( AM_CFLAGS -std=c99 )

set( AM_CPPFLAGS
  ${CMAKE_SOURCE_DIR}/src/Utilities
	${CMAKE_BINARY_DIR}/include
  ${LDASTOOLS_INCLUDE_DIRS}
	# $(BOOST_CPPFLAGS)
  )

#COMPRESSION_FRAME_PREFIX = /scratch/frames/compression
#
set( LDADD
  framecpp
  #LDADD = $(top_builddir)/src/OOInterface/libframecpp.la
  #LDADD += $(top_builddir)/src/Version8/libframecpp8.la
  #LDADD += $(top_builddir)/src/Version7/libframecpp7.la
  #LDADD += $(top_builddir)/src/Version6/libframecpp6.la
  #LDADD += $(top_builddir)/src/Version4/libframecpp4.la
  #LDADD += $(top_builddir)/src/Version3/libframecpp3.la
  #LDADD += $(top_builddir)/src/Common/libframecppcmn.la
  #LDADD += $(LDASTOOLSAL_LIBS)
  #if HAVE_LIBZ
  #LDADD += -lz
  #endif
  )

set( EXTRA_DIST =
	test.hh
	.ccmalloc
  )

set( TESTS_ENVIRONMENT
  BOOST_TEST_LOG_LEVEL=all
  COMPRESSION_FRAME_PREFIX=${COMPRESSION_FRAME_PREFIX}
  BIN_PROGRAMS=${bin_PROGRAMS}
  TEST_DIR=${CMAKE_BINARY_DIR}/src/Utilities
  )


#========================================================================
# Programs based on the latest supported frame spec
#========================================================================

set( noinst_HEADERS
	DumpObjects6.cc
	DumpObjects7.tcc
	DumpObjects8.tcc
	FrameQuery.tcc
	FrStruct.hh
	FrStruct3.tcc
	FrStruct4.tcc
        FrStruct6.tcc
	FrStruct7.tcc
	FrStruct8.tcc
	StandardOptions.hh
	toc.hh
	toc4.tcc
 toc6.tcc
	toc8.tcc
)

list( APPEND bin_PROGRAMS
	framecpp_checksum
	framecpp_compressor
	framecpp_dump_channel
	framecpp_dump_objects
	framecpp_dump_toc
	framecpp_fix_metadata
	framecpp_query
	framecpp_transform
	      framecpp_verify
        )

list( APPEND noinst_PROGRAMS
  framecpp_fracfg
  )

set( framecpp_query_SOURCES
	FrQuery.cc
  )
#
## OLD: FrQuery_SOURCES =
##	IFrameStream.cc
#
list( APPEND EXTRA_DIST  IFrameStream.hh )
#
framecpp_target_executable( framecpp_compressor
  SOURCES Compressor.cc
  )
framecpp_target_executable( framecpp_dump_channel
  SOURCES FrDumpChannel.cc
  )
framecpp_target_executable( framecpp_dump_objects
  SOURCES FrDumpObjects.cc
  )
framecpp_target_executable( framecpp_dump_toc
  SOURCES dump_toc.cc
  )
framecpp_target_executable( framecpp_fix_metadata
  SOURCES FixMetadata.cc
  )
framecpp_target_executable( framecpp_fracfg
  SOURCES framecpp_fracfg.cc
  )
framecpp_target_executable( framecpp_transform
  SOURCES FrTransform.cc
  )
framecpp_target_executable( framecpp_verify
  SOURCES FrVerify.cc
  )
framecpp_target_executable( framecpp_checksum
  SOURCES FrVerifyChecksums.cc
  )

##-----------------------------------------------------------------------
#
#if LDAS_SHARED_BUILD
#noinst_PROGRAMS +=
#	CIDump
#
#CIDump_LDADD= $(top_builddir)/src/CInterface/libframecppc.la
#CIDump_LDADD+= $(LDADD)
#
#TESTS += test_frameCPP_c
#
#test_frameCPP_c_LDADD= $(top_builddir)/src/CInterface/libframecppc.la
#test_frameCPP_c_LDADD+= $(LDADD)
#
#endif # LDAS_SHARED_BUILD
framecpp_target_test( test_frameCPP_c
  SOURCES test_frameCPP_c.c
  LDADD framecppc
  )
#
##========================================================================
## Standard testing of core api via C++
##========================================================================

framecpp_target_test( test_frameCPP_cpp SOURCES test_frameCPP_cpp.cc )
framecpp_target_test( TestCompression SOURCES TestCompression.cc )
# framecpp_target_test( framecpp_compression_beta SOURCES compression_beta.cc )

##-----------------------------------------------------------------------
#
#if LDAS_NEVER_BUILD
#TESTS += Ramp cds_1
#endif
#
#Ramp_SOURCES = Ramp.cc
#cds_1_SOURCES = cds_1.cc
#
##========================================================================
#
#
##------------------------------------------------------------------------
#
#if LDAS_NEVER_BUILD
#TESTS += DeepCopyTest
#DeepCopyTest_SOURCES = DeepCopy.cc
#framecpp_target_test( IOSteamTest SOURCES IOStream.cc )
#
#endif
#
#
framecpp_target_test( ChecksumValidator SOURCES ChecksumValidator.cc )
#
#if LDAS_SHARED_BUILD
#TESTS += CInterface
#endif # LDAS_SHARED_BUILD
#
#CInterface_LDADD= $(top_builddir)/src/CInterface/libframecppc.la
#CInterface_LDADD+= $(LDADD)
#
framecpp_target_test( FrameFilenameTest SOURCES FrameFilename.cc )
framecpp_target_test( FrameStreamTest
  SOURCES FrameStream.cc
  COMMAND_ARGS --log_level=all
  )
framecpp_target_test( FrameStreamPlanTest SOURCES FrameStreamPlanTest.cc )
#
#noinst_HEADERS +=
#	FrStatData4.icc
#	FrStatData6.icc
#	FrStatData7.icc
#	FrStatData8.icc 
#
framecpp_target_test( CompressionTest
  SOURCES compression.cc
  LDADD ${LIBFRAME} ${LDADD}
  )
framecpp_target_test( DetectorTest SOURCES DetectorTest.cc )
framecpp_target_test( FrStatDataTest SOURCES FrStatData.cc )
framecpp_target_test( FrStructsTest SOURCES FrStructs.cc )
framecpp_target_test( IOStreamTest SOURCES IOStream.cc )
framecpp_target_test( SixtyKTest SOURCES SixtyK.cc )
if( NOT SANITIZER_ENABLED )
  framecpp_target_test( LargeFrameTest SOURCES LargeFrame.cc )
endif( )

##========================================================================
## Setup testing of utilities
##========================================================================
framecpp_target_test( utilities SOURCES test_utilities.cc )
#
#GWF_FILES=$(noinst_DATA)
#
##========================================================================
## Building of compressed frames.
##========================================================================
#.PHONY: install-compressed-frames compressed-frames
#
#compression-frame:
#	env DUMP_DATA=yes $(MAKE) TESTS=CompressionTest check
#
#install-compression-frame:
#	install -d $(COMPRESSION_FRAME_PREFIX)
#	install -m 0644 Z-Compression_*.gwf $(COMPRESSION_FRAME_PREFIX)
#
##========================================================================
## Generate text
##========================================================================
#
#doxygen_INPUT =
#	$(srcdir)/framecpp_compressor.txt
#	$(srcdir)/framecpp_dump_channel.txt
#	$(srcdir)/framecpp_dump_objects.txt
#	$(srcdir)/framecpp_dump_toc.txt
#	$(srcdir)/framecpp_fix_metadata.txt
#	$(srcdir)/framecpp_query.txt
#	$(srcdir)/framecpp_verify.txt
#	$(srcdir)/framecpp_checksum.txt
#
#doxygen_OUTPUT = $(addprefix $(builddir)/,$(notdir $(doxygen_INPUT)))
#doxygen_DIFFS = $(addprefix $(builddir)/,$(addsuffix .diff,$(notdir $(basename $(doxygen_INPUT)))))
#
#$(builddir)/%.txt: $(builddir)/%
#	./$< --doxygen-help > $@
#
#$(builddir)/%.diff: $(builddir)/%.txt $(srcdir)/%.txt
#	diff $^ $(srcdir)/$(notdir $^) > $@ 2>&1
#
#.PHONEY: doxygen-diffs doxygen-update
#
#doxygen-diffs: $(doxygen_DIFFS)
#
#doxygen-update: $(doxygen_OUTPUT)
#	cp $(doxygen_OUTPUT) $(srcdir)
#
##========================================================================
## Valgrind support
##========================================================================
#
#MEMORY_DEBUG_LD_LIBRARY_PATH=$(FRAMESPEC_LIB_PATHS)
#include $(LDAS_DIRECTORY_MAKE_INCLUDE)/recursive.mk
#
#ALL_LOCAL+=doxygen-diffs
#
##========================================================================
## Miscellaneous rules
##========================================================================
#
#$(TESTS): $(REQUIRED_FRAMES)
#
#EXTRA_PROGRAMS += $(TESTS)
#
#all-local: $(ALL_LOCAL)
#
#check-local: $(CHECK_LOCAL)
#
#clean-local:
#	rm -f *.dat *.gwf *.log *.trs foo
#	rm -f $(TESTS) $(bin_PROGRAMS)
#
