Crossovers, CLJX, and Feature Expressions (from oldest to newest) have some overlap of features useful for compiling to clojure and clojurescript. Cljx and Features Expressions hold promise for more than just clojurescript, though, and make it possible to maintain more than just clojure-java and clojure-js, such as .net (clr, mono). Cljx and Feature Expressions enable arbitrary "features" such as enabling tracing or special "debug" builds.
Options (past, present, and future)
Crossovers (part of lein-cljsbuild)
lein-cljsbuild has deprecated the Crossovers feature. (See https://github.com/emezeske/lein-cljsbuild)
(cljsbuild crossovers are deprecated, and will be removed in v2.x [coming later in 2014].)
CLJX
I've used CLJX to target Clojure, ClojureClr, ClojureScript (for browsers), and ClojureScript for NodeJS. It works well enough - certainly better than maintaining 4 separate codebases. I haven't used CLJX to do dependencies of dependencies, though once you've packaged a library, it shouldn't matter that it was originally cljx.
Feature Expressions (hopefully coming soon from clojure core)
This idea borrows from Common Lisp's feature expressions and looks much like cljx.
As of November 2014, this is in the Release.Next, so that sounds promising. It seems that CLJX and LISP's feature expressions are the inspiration for this anticipated feature of Clojure.
Personal Experience
I used Crossovers for one project a couple years ago, but since CLJX came out, I've been using CLJX with great success. It takes a little adjustments to tooling and editors, but I believe it is so much better than making the same code change for all the platforms.
I plan to use CLJX until feature expressions are available, and then re-evaluate.