Вы можете установить свойство пути сборки как относительную разницу между рабочей папкой и корневым каталогом проекта, прежде чем включать ваши общие файлы включения. Итак, в \ project \ foo \ foo.build:
<property name="build.dir" value="..\" />
<include buildfile="..\default.include" />
Если вы хотите сослаться на вещи, относящиеся к корню проекта, просто создайте пути из build.dir. Допустим, у вас есть папка \ project \ utilities \, в которую вы положили несколько пользовательских инструментов для сборки или что-то еще, тогда вы можете ссылаться на эту папку как:
<property name="utils.dir" value="${build.dir}utilities\" />
utils.dir будет .. \ utilities \, которое будет правильным значением из вашей рабочей папки (в данном случае \ project \ foo \).
Лично я делаю все наоборот - у меня есть основной файл сборки в корне проекта, и он включает файл сборки для каждого подпроекта. Физически сборка распределяется по проектам, но логически все выполняется так, как если бы это был один большой скрипт в корне проекта. Недостатком является то, что глобальные имена свойств и целевые имена могут конфликтовать, поэтому вам нужно соглашение об именах, чтобы этого не происходило.