Условно используя расширение.exe с системой сборки Shake.

Используя замечательную систему сборки Shake, я хочу скомпилировать проект способом, не зависящим от операционной системы хоста.

У меня проблемы с обнаружением двоичных файлов, потому что они имеют разные расширения в разных системах (например, Windows использует .exe).

Если я использую need чтобы определить, присутствуют ли требуемые двоичные файлы, как я могу проверить Main или же Main.exe в зависимости от того, является ли хост Linux или Windows?

1 ответ

Решение

Функция, которую вы ищете Development.Shake.FilePath.exe, который оценивается в "exe" на Windows и "" на всех других платформах. Вы обычно пишете:

want ["MyExecutable" <.> exe]
"MyExecutable" <.> exe *> \out ->
    cmd "MyCompiler" "-o" [out]

Для примера см. Examples.Self.Main, который строит Main в Linux и Main.exe на винде.

Единственным потенциальным препятствием является то, что все шаблоны файлов слева от *> Должно быть уникальным. Если вы определите "//*" <.> exe *> ... затем в Windows, которая будет соответствовать только исполняемым файлам (хорошо), но в Linux, которая будет соответствовать каждому файлу, конфликтуя со всеми другими шаблонами (плохо). Решение состоит в том, чтобы сделать исполняемые имена различными, например, поместить их в специальный выходной каталог, жестко закодировать имена как "Main" <.> exe и т.д. В качестве альтернативы вы можете полагаться на тот факт, что только исполняемые файлы не имеют расширения в Linux с помощью:

(\x -> drop 1 (takeExtension x) == exe) ?> \out ->
    ...
Другие вопросы по тегам