Вы можете использовать свой make-файл для определения действий для различных типов целей. Для типов C (например, foo.c) вызывается компилятор C. Для файлов ASM вызовите ассемблер. Выходными данными любого из них должен быть объектный файл (например, .o), который может быть скомпилирован компоновщиком.
Если у вас есть небольшая сборка, продолжайте. В противном случае я рекомендую отдельные модули и функциональную декомпозицию как лучший способ управлять всем. Особенно, если вам нужно поддерживать разные цели (например, кросс-платформенная разработка).