That's a general problem with the shaders: have one, huge uber-shader and just set the flags: - enableTexturing, enableNormalMap, enableLights and then in the code
if (enableTexturing) {
}
if (enableLights) {
}
Or have separated shaders like in your case. I would not go into a separate pass because it can hurt the performance much.
In glsl you can implement shadowing inside a function and attach this function as another shader to the program. That way it will be visible by other shaders in the program.
here are another similar questions: