ocamlbuild создает пустой файл архива, а не исполняемый файл.

Работая с дистрибутивом Linux на основе Debian (PopOS), у меня есть папка с файлами и Makefile, содержащий

MODULES=move score main draw setup
OBJECTS=$(MODULES:=.cmo)
TEST=test.byte
OCAMLBUILD=ocamlbuild -use-ocamlfind
MAIN=main.byte

# Recipes 
default: build #first build (dependies) then run utop (command)
    utop

build: 
    $(OCAMLBUILD) $(OBJECTS) 

test:
    $(OCAMLBUILD) -tag 'debug' $(TEST) && ./$(TEST)

play:
    $(OCAMLBUILD) $(MAIN) && ./$(MAIN)

clean:
    ocamlbuild -clean

Когда я вызываю make build, кажется, что все работает нормально, но результирующие файлы .byte не запускаются. В терминале они отображаются красным цветом, что указывает на то, что компьютер воспринимает их как архивные файлы, а не как исполняемые файлы. Когда я пытаюсь запустить ./main.byte, он говорит, что файл не может быть найден, хотя файл указан в каталоге.

Более того, когда я создаю это на Mac, он работает просто отлично. Он строит программу и запускает ее правильно.

Есть мысли что это может быть?


person Addem    schedule 12.11.2019    source источник


Ответы (2)


Я не совсем уверен, почему это работает на Mac, но не на моей машине с Linux, но мне удалось поиграть с этим достаточно, чтобы найти решение. Если я изменю Makefile на

MODULES=move score main draw setup
OBJECTS=$(MODULES:=.cmo)
TEST=test.byte
OCAMLBUILD=ocamlbuild -use-ocamlfind
MAIN=main.byte


default: build 
    utop

build: 
    $(OCAMLBUILD) $(OBJECTS) $(MAIN)

test:
    $(OCAMLBUILD) -tag 'debug' $(TEST) && ./$(TEST)

play:
    $(OCAMLBUILD) $(MAIN) && ./$(MAIN)

clean:
    ocamlbuild -clean

затем компьютер распознает исполняемый файл.

person Addem    schedule 12.11.2019

В исходном Makefile make build не выполняется команда ocamlbuild $(MAIN), которая должна создать исполняемый файл байт-кода. Вы должны запустить make play для сборки исполняемого файла байт-кода. В измененном Makefile вы включили $(MAIN) в список целей, переданных ocamlbuild в вашей цели build Makefile, так что теперь он собирается make build.

person gasche    schedule 12.11.2019