Module aliases are the encouraged way of grouping modules together. They have worked fine up until the point where I tried to use ocamldebug with them.
Module aliases allow development in the large, by permitting namespacing. I couldn't imagine building anything but a toy project with a few engineers with the restriction that no two files have the same basename! Module aliases to the rescue (thanks to Leo White for the suggestion). But, it seems that module aliases with namespacing make ocamldebug completely unusable. Here's a minimal repro case below. There are two simple namespaces each with a submodules in files named "
test.ml". I am using module aliases to namespace them so that there are no collisions. Again, this works fine with everything except the debugger.
I hope I'm just doing something incorrect - if that is the case, I thank you in advance for your patience.
# Compile project using module aliases
mkdir ~/Desktop/testOne/
mkdir ~/Desktop/testTwo/
echo "let x () = print_string \"hello from test one\"" > ~/Desktop/testOne/
test.ml echo "let x () = print_string \"hello from test two\"" > ~/Desktop/testTwo/
test.ml echo "module Test = NamespaceOne_test" > ~/Desktop/testOne/namespaceOne.ml
echo "module Test = NamespaceOne_test" > ~/Desktop/testOne/namespaceOne.mli
echo "module Test = NamespaceTwo_test" > ~/Desktop/testTwo/namespaceTwo.ml
echo "module Test = NamespaceTwo_test" > ~/Desktop/testTwo/namespaceTwo.mli
echo 'NamespaceOne.Test.x (); NamespaceTwo.Test.x ()' > ~/Desktop/
prog.ml
# Generate namespaced module aliases
ocamlc -g -c -no-alias-deps -w -49 -I ~/Desktop/testOne/ -o ~/Desktop/testOne/namespaceOne -intf ~/Desktop/testOne/namespaceOne.mli -o ~/Desktop/testOne/namespaceOne -impl ~/Desktop/testOne/namespaceOne.ml
ocamlc -g -c -no-alias-deps -w -49 -I ~/Desktop/testTwo/ -o ~/Desktop/testTwo/namespaceTwo -intf ~/Desktop/testTwo/namespaceTwo.mli -o ~/Desktop/testTwo/namespaceTwo -impl ~/Desktop/testTwo/namespaceTwo.ml
ocamlc -g -c -I ~/Desktop/testOne/ -open NamespaceOne -o ~/Desktop/testOne/namespaceOne_test -impl ~/Desktop/testOne/
test.ml ocamlc -g -c -I ~/Desktop/testTwo/ -open NamespaceTwo -o ~/Desktop/testTwo/namespaceTwo_test -impl ~/Desktop/testTwo/
test.ml ocamlc -g -c -I ~/Desktop -I ~/Desktop/testOne/ -I ~/Desktop/testTwo/ -o ~/Desktop/prog.cmo -impl ~/Desktop/
prog.ml
ocamlc -g -I ~/Desktop/testTwo/ -I ~/Desktop/testOne/ ~/Desktop/testOne/namespaceOne.cmo ~/Desktop/testTwo/namespaceTwo.cmo ~/Desktop/testOne/namespaceOne_test.cmo ~/Desktop/testTwo/namespaceTwo_test.cmo ~/Desktop/prog.cmo -o ~/Desktop/prog.out
# Start ocamldebug
ocamldebug ~/Desktop/prog.out
# Run these commands inside of ocamldebug
directory ~/Desktop/
directory ~/Desktop/testOne/
directory ~/Desktop/testTwo/
# This doesn't work but that makes sense - there aren't any modules named
# "Test", there's one named NamespaceOne_test and one named
# NamespaceTwo_test.
break @Test 1
# But - neither of the namespaced modules work either!
# -----------------------------------------------------------------------
break @NamespaceOne_test 1
break @NamespaceTwo_test 1
Here is proof that ocamldebug works correctly without namespacing/module aliases:
# Working project without module aliases:
mkdir ~/Desktop/testOne/
mkdir ~/Desktop/testTwo/
echo "let x () = print_string \"hello from test one\"" > ~/Desktop/testOne/testOneNamespaceNotNeeded.ml
echo "let x () = print_string \"hello from test two\"" > ~/Desktop/testTwo/testTwoNamespaceNotNeeded.ml
echo 'TestOneNamespaceNotNeeded.x (); TestTwoNamespaceNotNeeded.x ()' > ~/Desktop/
prog.ml
ocamlc -g -c -I ~/Desktop/testOne/ -o ~/Desktop/testOne/testOneNamespaceNotNeeded -impl ~/Desktop/testOne/testOneNamespaceNotNeeded.ml
ocamlc -g -c -I ~/Desktop/testTwo/ -o ~/Desktop/testTwo/testTwoNamespaceNotNeeded -impl ~/Desktop/testTwo/testTwoNamespaceNotNeeded.ml
ocamlc -g -c -I ~/Desktop -I ~/Desktop/testOne/ -I ~/Desktop/testTwo/ -o ~/Desktop/prog.cmo -impl ~/Desktop/
prog.ml
ocamlc -g -I ~/Desktop/testTwo/ -I ~/Desktop/testOne/ ~/Desktop/testOne/testOneNamespaceNotNeeded.cmo ~/Desktop/testTwo/testTwoNamespaceNotNeeded.cmo ~/Desktop/prog.cmo -o ~/Desktop/prog.out
ocamldebug ~/Desktop/prog.out
# Run these commands inside of ocamldebug. Working correctly.
directory ~/Desktop/
directory ~/Desktop/testOne/
directory ~/Desktop/testTwo/
break @TestOneNamespaceNotNeeded 1