i spent a bit of time on this same thing before, and it really depends on the results you are looking for, and how deep you want to make them match.
if you just want to be aware of differences, you could use an EXCEPT query against each database, comparing it to the "perfect" customer model, and for things like sys.tables + sys.columns.
if you need the script to be generated to change the database to match the "perfect" customer model, that's where it gets tougher...
there's functionally equivalent, and that gets involved;
for example, views/functions/stored procedure definitions might be different due to white space and comments, but are actually the same ; in a programming language you can strip out comments, then white space, and compare the results to see if they really are the different or functionally the same.
Also for table definitions , maybe you don't care about constraint names, but you do care about that the constraints exist; and whether there's the desire for exact matches, where renaming of matching-but-wrongly-named constraints is required.
I've created my own crap-tastic app to do that for myself, and it gets bigger all the time as i peel back the next layer of making databases match to another.
It makes me appreciate just how much effort and man hours Redgate must have poured into their Compare product.
Lowell