#############################################################
function(set_bundle_dir)
  set(args SOURCES DEST EXCLUDE)
  include(CMakeParseArguments)
  cmake_parse_arguments(BD "" "" "${args}" ${ARGN})

  foreach(_BDIR ${BD_SOURCES}) 
    file(GLOB _DIRCONTENTS ${_BDIR}/*)
    foreach(_BDFILE ${_DIRCONTENTS})
      get_filename_component(_BDFILE_NAME ${_BDFILE} NAME)

      set(PROCESS_FILE 1)
      foreach(EX_FILE ${BD_EXCLUDE})
        string(REGEX MATCH ${EX_FILE} DID_MATCH ${_BDFILE})
        if(NOT "${DID_MATCH}" STREQUAL "")
          set(PROCESS_FILE 0)
        endif(NOT "${DID_MATCH}" STREQUAL "")
      endforeach(EX_FILE ${BD_EXCLUDE})
      
      if(PROCESS_FILE STREQUAL "1")
        if(IS_DIRECTORY ${_BDFILE})
          set_bundle_dir(SOURCES ${_BDFILE} DEST ${BD_DEST}/${_BDFILE_NAME} EXCLUDE ${BD_EXCLUDE})
        else(IS_DIRECTORY ${_BDFILE})
          #message("set_bundle_dir : setting package_location ${_BDFILE} = ${BD_DEST}")
          set_source_files_properties(${_BDFILE} PROPERTIES MACOSX_PACKAGE_LOCATION ${BD_DEST})
          get_property(BUNDLED_FILES GLOBAL PROPERTY CONFIG_BUNDLED_FILES)
          set_property(GLOBAL PROPERTY CONFIG_BUNDLED_FILES ${BUNDLED_FILES} ${_BDFILE})

          string(REPLACE "/" "\\\\" GNAME ${BD_DEST})
          source_group(${GNAME} FILES ${_BDFILE})
        endif(IS_DIRECTORY ${_BDFILE})
      endif()
    endforeach(_BDFILE ${_DIRCONTENTS})
  endforeach(_BDIR ${BD_SOURCES})
endfunction(set_bundle_dir)

#############################################################
macro(find_all_sources DIRECTORY VARIABLE)
  aux_source_directory(${DIRECTORY} ${VARIABLE})
  file(GLOB headers ${DIRECTORY}/*h)
  list(APPEND ${VARIABLE} ${headers})
endmacro()

#############################################################
# function to collect all the sources from sub-directories
# into a single list
function(add_sources)
  get_property(is_defined GLOBAL PROPERTY SRCS_LIST DEFINED)
  if(NOT is_defined)
    define_property(GLOBAL PROPERTY SRCS_LIST
      BRIEF_DOCS "List of source files"
      FULL_DOCS "List of source files to be compiled in one library")
  endif()
  # make absolute paths
  set(SRCS)
  foreach(s IN LISTS ARGN)
    if(NOT IS_ABSOLUTE "${s}")
      get_filename_component(s "${s}" ABSOLUTE)
    endif()
    list(APPEND SRCS "${s}")
  endforeach()

  string(REPLACE ${CMAKE_SOURCE_DIR}/src/ "" SUBDIR ${CMAKE_CURRENT_SOURCE_DIR})
  string(TOLOWER ${SUBDIR} SUBDIR)
  string(REPLACE "/" "\\\\" LIBNAME ${SUBDIR})
  source_group(${LIBNAME} FILES ${SRCS})

  # add it to the global list.
  set_property(GLOBAL APPEND PROPERTY SRCS_LIST ${SRCS})
endfunction(add_sources)