We use the tools provided by Khronos to make our own compiler that is part of a larger tool providing lots of specific functionality. Like handing out binding numbers, compiling spirv into linkable objects (with the restriction noted above), and others to numerous to mention here. If linking smaller SPIRV code snippets into a larger SPIRV program is something you really need then these tools could support the type of environment you are talking about, but it would take some programming. We haven't needed to go there...yet...because:
Or, you could use the google include directive:
#extension GL_GOOGLE_include_directive : enable
If that extension is available in your environment, which you can find out just by throwing at the top of a shader that already compiles correctly then recompiling. Then that might be "good enough". But if your environment is a long term project then it may be worth the effort to dig into the tools....happy programming!
If there is interest in this question I will add more specifics on using the khronos tools. Like linking, getting info about shaders, setting info in shaders, the list is long and mighty. Also Khronos provides tutorials for using the tools on GitHub at the link above, though some of them are a bit hard to follow, but all in all these tools are outstanding.
Also spirv-link.exe will combine existing SPIRV modules into a library with the --create-library option. The entry points need to have unique names and can't all be "main". Then when loaded the code specifies the entry point for the module. Here is an example command line to help get anyone reading this going:
spirv-link.exe -o libraryname.spv --target-env spv1.5 input1.spv input2.spv
Add --create-library to make an spv library.(which requires unique entry point names)
Here is a link explaining how to set the entry points in opengl.