Ticket #5025 (closed feature request: fixed)
GHC should support -x objective-c
|Reported by:||guest||Owned by:|
|Operating System:||MacOS X||Architecture:||Unknown/Multiple|
|Type of failure:||None/Unknown||Difficulty:||Easy (less than 1 hour)|
|Test Case:||Blocked By:|
On OSX, gcc accepts .m files as objective-c source. It can even trivially compile .c and .m files in the same program or library.
Unfortunately, ghc treats .m files as input to the linker step. GHC supports -x as a means of saying what language a file is, except that unlike gcc it lacks support for "objective-c". For example, if I told ghc, -x c foo.my-c, then ghc would invoke gcc as gcc -x c foo.my-c and gcc would then treat foo.my-c as C source code.
Cabal gives all C files to ghc and lets ghc invoke gcc. This means that specifying objective-c files as "c-sources" results in GHC complaining about linker input. Even setting -pgmc is not sufficient to trick cabal. I spent several hours trying everything I could think of here to trick cabal, like setting my PATH and write wrapper scripts for gcc, but it seems that cabal always hands these files to ghc first.
Therefore, I propose that GHC adds support for -x objective-c foo.m. Even better would be for GHC to accept .m files on OSX without the extra -x flag. The new -x flag would be sufficient to write .cabal files that use objective-c to get access to OSX specific APIs, much like C can be used on other platforms.
I think even if cabal adds an "objective-c-sources" line in the .cabal file that the above solution is a nice-to-have for ghc. I also hope that it is super easy to implement, but I haven't looked at the ghc sources to see if that's the case.
Here is the relevant section of the gcc manpage http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man1/gcc.1.html:
You can specify the input language explicitly with the -x option: -x language Specify explicitly the language for the following input files (rather than letting the compiler choose a default based on the file name suffix). This option applies to all following input files until the next -x option. Possible values for language are: c c-header c-cpp-output c++ c++-header c++-cpp-output objective-c objective-c-header objective-c-cpp-output objective-c++ objective-c++-header objective-c++-cpp-output assembler assembler-with-cpp ada f95 f95-cpp-input java treelang -x none Turn off any specification of a language, so that subsequent files are handled according to their file name suffixes (as they are if -x has not been used at all).
Having ghc support all of gcc -x flags would make me super happy! Unfortunately, I found that the order you pass -x to gcc matters (it must be passed before the corresponding input files are specified), and when I added "-optc-x -optcobjective-c" to the ghc commandline I found that it passed the -x flag too late.