Встряхните каталоги захвата сборки

Недавно я преобразовал свою систему сборки на основе работы в Shake. Теперь я пытаюсь сделать тряску немного более устойчивой к изменениям в структуре каталогов, чтобы мне не приходилось регенерировать систему сборки.

Каждый из моих проектов основан на C и имеет следующую структуру каталогов.

  • src
    • source folder 1
    • исходная папка 2
  • inc
    • inc folder 1
    • папка 2

Я могу захватить все исходные файлы, но я не могу работать с включенными папками. Корневая папка inc и подпапки, которые я пытаюсь записать в переменную в системе сборки. Я использовал следующую настройку

includes = getDirectoryDir "inc"

Это даст мне включенные подпапки, но не корневую папку, вкл. Я думал, что смогу обойти это, но inc не будет отслеживаться.

Я хотел бы иметь что-то вроде

includes = getDirectoryDirAndRoot "inc"

Который будет захватывать каждый из подкаталогов и корневой каталог и отслеживать их в системе сборки.

Помимо того, что я также пытался использовать

gcc -o out includes

Но мне нужно, чтобы к каждому элементу во включенном состоянии добавлялся «-I», который я не могу понять.

Я думаю, как можно было бы сделать это в встряхивании, в make я могу выполнить все это, используя функцию оболочки make и пару функций манипуляции со строками.


person Oceanofthelost    schedule 14.04.2018    source источник


Ответы (2)


Я думаю, что вопрос можно интерпретировать двояко, и оба способа полезны (вы даже можете захотеть оба), поэтому я дам два ответа:

Ответ 1: Вы хотите, чтобы файл C был перекомпилирован, если какой-либо файл в каталоге inc изменится.

"*.c" *> \out -> do headerFiles <- getDirectoryFiles "inc" "**/*.h" need headerFiles ...

Этот фрагмент получает список всех файлов заголовков в каталоге inc (или его подкаталогах) и вводит зависимость от них. Если какой-либо заголовочный файл изменится, это правило будет запущено повторно.

Ответ 2: вы хотите получить список каталогов, которые нужно передать gcc.

"*.c" *> \out -> do includeDirs <- getDirectoryDirs "inc" cmd "gcc -c" [out] "-Iinc" (map ("-Iinc/" ++) includeDirs) ...

Этот фрагмент получает имена каталогов под inc, а затем использует map для добавления к ним -Iinc/. Он также проходит напрямую через -Iinc. Если список каталогов под inc изменится, это правило будет перестроено. Однако, если файлы заголовков, содержащиеся в этих каталогах, изменятся, ничего не будет перестроено. Вы можете добавить зависимости от используемых заголовочных файлов с помощью семейства флагов gcc -MD, как описано в руководстве пользователя Shake, или по методике из ответа 1.

person Neil Mitchell    schedule 01.05.2018

Взгляните на addOracle и его кузен addOracleCache. Это должно позволить вам полагаться не только на сами файлы, но и на другие данные, например, на включаемые каталоги.

Но мне нужно, чтобы к каждому элементу во включенном состоянии добавлялся «-I», который я не могу понять.

Вы можете использовать Haskell здесь. Если у вас есть список каталогов directories :: [FilePath], вы можете превратить их в флаги компилятора с помощью

asIncludes :: [FilePath] -> [String]
asIncludes = fmap ("I" ++)
person Community    schedule 14.04.2018