summaryrefslogtreecommitdiff
path: root/tools/mcc
blob: e0296b623be784bda9545348748558dada2828aa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#! /bin/sh
# this script jumps in if there is no working mcc on the path:
# - on Mac OS it (hopefully) figures out the location of mcc,
# - on Cygwin it substitutes mcc completely
# last modified 19 Jul 11 th


sdkpath()
{
  mathcmd="$1"
  shift
  mathcmd=`IFS=:
    PATH="$PATH:$*" which $mathcmd`
  
  eval `"$mathcmd" -run '
    Print["sysid=\"", $SystemID, "\""];
    Print["topdir=\"", $TopDirectory, "\""];
    Exit[]' < /dev/null | tr '\r' ' ' | tail -2`

	# check whether Cygwin's dlltool can handle 64-bit DLLs
  test "$sysid" = Windows-x86-64 && {
    ${DLLTOOL:-dlltool} --help | grep x86-64 > /dev/null || sysid=Windows
  }

  topdir=`cd "$topdir" ; echo $PWD`

  for sdk in \
    "$topdir/SystemFiles/Links/MathLink/DeveloperKit/$sysid/CompilerAdditions" \
    "$topdir/SystemFiles/Links/MathLink/DeveloperKit/CompilerAdditions" \
    "$topdir/AddOns/MathLink/DeveloperKit/$sysid/CompilerAdditions" ; do
    test -d "$sdk" && return
  done

  echo "MathLink SDK not found" 1>&2
  exit 1
}


cygmcc()
{
  sdkpath math \
    "`cygpath '$ProgramW6432'`/Wolfram Research/Mathematica"/* \
    "`cygpath '$PROGRAMFILES'`/Wolfram Research/Mathematica"/*

  for sdk in "$sdk"/m* ; do
    break
  done

  cache=MLcyg-cache
  test -d $cache || mkdir $cache

  MLversion=3
  for OSbits in 32 64 ; do
    dllname=ml${OSbits}i$MLversion
    libname="$sdk/lib/${dllname}m.lib"
    test -f "$libname" && break
  done

  lib="$cache/${dllname}m"
  test -f "$lib.a" || {
    ( echo "EXPORTS"
      ${NM:-nm} -C --defined-only "$libname" | awk '/ T [^.]/ { print $3 }'
    ) > "$lib.def"
    ${DLLTOOL:-dlltool} -k --dllname "$dllname.dll" \
      --def "$lib.def" --output-lib "$lib.a"
  }

  tmp=
  args="-DWIN$OSbits -I'$sdk/include'"
  for arg in "$@" ; do
    case "$arg" in
    *.tm)
	cp "$arg" "$arg.tm"
	"$sdk"/bin/mprep -lines -o "$arg.c" "$arg.tm"
	tmp="$tmp '$arg.c' '$arg.tm'"
	args="$args '$arg.c'" ;;
    *)
	args="$args '$arg'" ;;
    esac
  done

  trap "rm -f $tmp" 0 1 2 3 15
  eval "set -x ; ${CC:-gcc} $args $lib.a -mwindows"
}


macmcc()
{
  sdkpath MathKernel \
    /Applications/Mathematica*/Contents/MacOS \
    $HOME/Desktop/Mathematica*/Contents/MacOS
  exec "$sdk/mcc" "$@"
}


defaultmcc()
{
  sdkpath math \
    /usr/local/bin \
    /usr/local/Wolfram/bin \
    /usr/local/Wolfram/Mathematica/*/Executables \
    /opt/Wolfram/bin \
    /opt/Wolfram/Mathematica/*/Executables
  exec "$sdk/mcc" "$@"
}


shopt -s nullglob 2> /dev/null

case `uname -s` in
Darwin) macmcc "$@" ;;
CYG*)   cygmcc "$@" ;;
*)      defaultmcc "$@" ;;
esac