The only difference I know of is that declare
only works for Emacs Lisp, whereas the put
method works for other languages as well (that is, if they use a similar technique for managing their indentation).
For instance, you can do things like
(put 'match 'clojure-indent-function 2)
To control how clojure-mode
indents particular forms.
It's also worth noting that while indentation levels are most often specified for macros it also works with functions.