F #, Linux и makefiles - PullRequest
       11

F #, Linux и makefiles

4 голосов
/ 30 мая 2010

Я намереваюсь распространять программу на F # как двоичную, так и исходную, чтобы у пользователя была возможность перекомпилировать ее при желании. В Windows я понимаю, как это сделать: предоставить файлы .fsproj и .sln, которые могут понять и Visual Studio, и MSBuild.

В Linux традиционным решением для программ на Си является make-файл. Это зависит от того, является ли gcc доступным напрямую, и это всегда так.

Компилятор F # может быть установлен в Linux и работает под Mono, так что пока все хорошо. Однако, насколько я могу судить, он не создает сценарий, в котором fsc запускает компилятор, вместо этого команда mono ...path.../fsc.exe. Это тоже хорошо, за исключением того, что я не знаю, каким будет путь. Таким образом, полная команда для запуска компилятора в моем случае может быть mono ~/FSharp-2.0.0.0/bin/fsc.exe types.fs tptp.fs main.fs -r FSharp.PowerPack.dll, за исключением того, что я не уверен, где на самом деле будет находиться файл fsc.exe на компьютере пользователя.

Есть ли способ выяснить это в make-файле, или было бы лучше прибегнуть к простому объяснению вышеприведенного в документации и полагаться на то, что пользователь изменяет команду в соответствии с его настройкой?

1 Ответ

9 голосов
/ 30 мая 2010

Если вы не хотите использовать autoconf, просто напишите README и сообщите нам, как настроить инструменты для компиляции вашей программы. Например, вы можете потребовать использовать модуль ядра binfmt_misc, чтобы система автоматически использовала правильную стартовую программу для файлов с известным форматом, так как $ PATH должен содержать путь к fsc.exe, поэтому ваш Makefile просто будет выглядеть следующим образом:

FILES=types.fs tptp.fs main.fs

target.exe: ${FILES}
        fsc.exe -o $@  ${FILES} -r FSharp.PowerPack.dll

Или вы можете разрешить пользователю указывать на компилятор с помощью переменных makefile:

MONO=/usr/bin/mono
FSC=/usr/local/fsharp/bin/fsc.exe
COMPILER=${MONO} ${FSC}
FILES=types.fs tptp.fs main.fs

target.exe: ${FILES}
        ${COMPILER} -o $@  ${FILES} -r FSharp.PowerPack.dll
...