Os pipelines não funcionam para o código-fonte porque você não pode processar a entrada à medida que ela entra. Você precisa do arquivo inteiro carregado antes do início do processamento. Isso fica ainda pior quando você precisa de vários arquivos para compilação (arquivos .h, por exemplo). Se você estivesse lendo stdin, você precisaria transmitir em todos os arquivos necessários algum método de especificar quebras de arquivos entre os arquivos que você inseriu. Os problemas crescem a partir daí.
A ideia por trás do pipeline era que seria uma série de tarefas simples. A compilação de código é NOT uma tarefa simples e, portanto, nunca foi projetada para fazer parte de um pipeline. Também a teoria de oleodutos disse que toda a comunicação entre os processos no pipeline deve estar em texto simples para facilitar a portabilidade de componentes individuais. Por definição, a saída de cc
ou yacc
ou ld
ou qualquer outra coisa envolvida na compilação de código são dados binários que não se encaixam no modelo.