В другом инструменте make, таком как CMake, вы можете выразить нечто подобное гораздо проще.
Например, вы могли бы сделать
set(sources ABC.cpp DEF.cpp XYZ.cpp)
ADD_LIBRARY(mylib STATIC ${sources})
add_executable(myExecutable ${sources} main.cpp)
Или вы можете многократно создавать один и тот же каталог с разными флагами, включая его несколько раз из логического родителя каталога, т.е.
set(MyTweakFlag 2)
add_subdirectory("libDir" "libDir2")
set(MyTweakFlag 3)
add_subdirectory("libDir" "libDir3")
... и затем используйте if()
или еще много чего в дочернем каталоге, чтобы установить правильные флаги.
В частности, если у вас много таких конфигураций, использование make становится довольно хрупким; make не сможет правильно найти транзитивное закрытие рекурсивных зависимостей make (и, конечно, не сможет правильно найти зависимость от самого make-файла - скажем, если вы измените флаги), так что если вы собираетесь делать сложную магию make-файла: сделайте это с лучший инструмент!
(CMake просто оказывается тем, чем я заменил, с помощью make, но, конечно, возможны и другие замены)