[erlang-questions] Case insensitivity - Windows trap or bug?

Doug Edmunds dae@REDACTED
Tue Jan 15 22:14:04 CET 2008


The Erlang compiler assumes that filenames are
case sensitive.  It does not check the existence
of a file based on a case-sensitive spelling.
But Windows filenames are not case sensitive.
This can lead to unexpected results.

(I don't have a *nix system to check this on. I
assume this is a Windows-only problem.)

------
Assume this scenario:
(note the spelling, a capital T in both file name and module).

a file named:   myTest.erl
containing a module:  -module(myTest).

 > compile:file(myTest).
produces myTest.beam

So far so good.

------

An inadvertent typo can cause unexpected results
which are not flagged by the compiler (in Windows):

1.

 > compile:file(mytest).   %% case insensitive input accepted.
{ok,myTest}             %% note difference between input and output

What is the filename just created?
'mytest.beam', not 'myTest.beam'

Any errors or warnings?  No.


----

2. Having done step 1, things can become very strange:
Remember, the name of the beam file is mytest.beam.
There is no myTest.beam.

 > code:file_load(myTest).
{module,myTest}  %% loads


3. But this doesn't work:

 >code:file_load(mytest).

=ERROR REPORT==== 15-Jan-2008::09:56:50 ===
beam/beam_load.c(1035): Error loading module mytest:
   module name in object code is myTest


=ERROR REPORT==== 15-Jan-2008::09:56:50 ===
Loading of c:/erl_dae2/compile sensitivity bugs/mytest.beam failed: badfile
{error,badfile}

---------

Running erlc from a DOS shell, has the same problems.
erlc ignores case, and compiles a beam
file that does not match the internal module name.

erlc mytest.erl  %% erlc accepts this filename in Windows

produces mytest.beam from myTest.erl without any warning.
The mytest.beam will have the same usage issues as indicated
above (it will contain a module name 'myTest' and will not load.

-------------------
I think of these as bugs.  Other Erlang functions
can capture/retain filename case sensitivity in Windows.
(c:ls/0, for example reports myTest.erl).  You won't change
Windows. The Erlang compiler functions need to test
for file existence based on case-sensitivity.

Doug Edmunds





More information about the erlang-questions mailing list