The first thing to keep in mind is that source code has value separate from the binaries.  It is perfectly reasonable to either refuse to sign a contract that requires source code delivery, or to insist on extra payments for source code delivery.  Contracts are two-way documents.  Do not let the other part dictate what is required just because they are "big companies" and "do this all the time".  First, decide what *you* are willing to deliver and how *you* want to be compensated.  Then take their contract to a lawyer and work out what needs to change.  Then, you negotiate.

Don't do what a lot of young people do when they start contracting.  Don't just sign because it seems like they have lots of experience and you don't.  That's a good way to get ripped off.

Look into *why* they want the source.  They may want it so they have the option of using another developer later on.  Or they may want it just because they are afraid you might get hit by a bus and suddenly they'll be left with binaries that they cannot improve.  If it is this second case, look into a [Software Code Escrow Service][1].  These services hold the source code in case you go bankrupt or otherwise are unable to maintain the software.  This may satisfy both your desire to keep your code proprietary to service other customers and their desire not to be left holding the bag with an unmaintainable set of binaries if something bad happens.


  [1]: http://en.wikipedia.org/wiki/Source_code_escrow