-
Notifications
You must be signed in to change notification settings - Fork 2
/
FindMono.cmake
162 lines (147 loc) · 8 KB
/
FindMono.cmake
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#
# A CMake Module for finding Mono.
#
# The following variables are set:
# CSHARP_MONO_FOUND
# CSHARP_MONO_COMPILER_${version} eg. "CSHARP_MONO_COMPILER_2.10.2"
# CSHARP_MONO_INTERPRETOR_${version} eg. "CSHARP_MONO_INTERPRETOR_2.10.2"
# CSHARP_MONO_VERSION eg. "2.10.2"
# CSHARP_MONO_VERSIONS eg. "2.10.2, 2.6.7"
#
# Additional references can be found here:
# http://www.mono-project.com/Main_Page
# http://www.mono-project.com/CSharp_Compiler
# http://mono-project.com/FAQ:_Technical (How can I tell where the Mono runtime is installed)
#
# This file is based on the work of GDCM:
# http://gdcm.svn.sf.net/viewvc/gdcm/trunk/CMake/FindMono.cmake
# Copyright (c) 2006-2010 Mathieu Malaterre <[email protected]>
#
set( csharp_mono_valid 1 )
if( DEFINED CSHARP_MONO_FOUND )
# The Mono compiler has already been found
# It may have been reset by the user, verify it is correct
if( NOT DEFINED CSHARP_MONO_COMPILER_${CSHARP_MONO_VERSION} )
set( csharp_mono_version_user ${CSHARP_MONO_VERSION} )
set( csharp_mono_valid 0 )
set( CSHARP_MONO_FOUND 0 )
set( CSHARP_MONO_VERSION "CSHARP_MONO_VERSION-NOTVALID" CACHE STRING "C# Mono compiler version, choices: ${CSHARP_MONO_VERSIONS}" FORCE )
message( FATAL_ERROR "The C# Mono version '${csharp_mono_version_user}' is not valid. Please enter one of the following: ${CSHARP_MONO_VERSIONS}" )
endif( NOT DEFINED CSHARP_MONO_COMPILER_${CSHARP_MONO_VERSION} )
endif( DEFINED CSHARP_MONO_FOUND )
unset( CSHARP_MONO_VERSIONS CACHE ) # Clear versions
if( WIN32 )
# Search for Mono on Win32 systems
# See http://mono-project.com/OldReleases and http://www.go-mono.com/mono-downloads/download.html
set( csharp_mono_bin_dirs )
set( csharp_mono_search_hints
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.11.2;SdkInstallRoot]/bin"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.10.9;SdkInstallRoot]/bin"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.10.8;SdkInstallRoot]/bin"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.10.7;SdkInstallRoot]/bin"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.10.6;SdkInstallRoot]/bin"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.10.5;SdkInstallRoot]/bin"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.10.4;SdkInstallRoot]/bin"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.10.3;SdkInstallRoot]/bin"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.10.2;SdkInstallRoot]/bin"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.10.1;SdkInstallRoot]/bin"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.10;SdkInstallRoot]/bin"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.8;SdkInstallRoot]/bin"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.6.7;SdkInstallRoot]/bin"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.6.4;SdkInstallRoot]/bin"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.6.3;SdkInstallRoot]/bin"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.6.1;SdkInstallRoot]/bin"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.6;SdkInstallRoot]/bin"
)
foreach( csharp_mono_search_hint ${csharp_mono_search_hints} )
get_filename_component( csharp_mono_bin_dir "${csharp_mono_search_hint}" ABSOLUTE )
if ( EXISTS "${csharp_mono_bin_dir}" )
set( csharp_mono_bin_dirs ${csharp_mono_bin_dirs} ${csharp_mono_bin_dir} )
endif ( EXISTS "${csharp_mono_bin_dir}" )
endforeach( csharp_mono_search_hint )
# TODO: Use HKLM_LOCAL_MACHINE\Software\Novell\Mono\DefaultCLR to specify default version
# get_filename_component( test "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono;DefaultCLR]" NAME )
foreach ( csharp_mono_bin_dir ${csharp_mono_bin_dirs} )
string( REPLACE "\\" "/" csharp_mono_bin_dir ${csharp_mono_bin_dir} )
if (EXISTS "${csharp_mono_bin_dir}/dmcs.bat")
set( csharp_mono_executable "${csharp_mono_bin_dir}/dmcs.bat")
elseif (EXISTS "${csharp_mono_bin_dir}/gmcs.bat")
set( csharp_mono_executable "${csharp_mono_bin_dir}/gmcs.bat")
elseif (EXISTS "${csharp_mono_bin_dir}/mcs.bat")
set( csharp_mono_executable "${csharp_mono_bin_dir}/mcs.bat")
endif (EXISTS "${csharp_mono_bin_dir}/dmcs.bat")
if( csharp_mono_valid )
# Extract version number (eg. 2.10.2)
string(REGEX MATCH "([0-9]*)([.])([0-9]*)([.]*)([0-9]*)" csharp_mono_version_temp ${csharp_mono_bin_dir})
set( CSHARP_MONO_VERSION ${csharp_mono_version_temp} CACHE STRING "C# Mono compiler version" )
mark_as_advanced( CSHARP_MONO_VERSION )
# Add variable holding executable
set( CSHARP_MONO_COMPILER_${csharp_mono_version_temp} ${csharp_mono_executable} CACHE STRING "C# Mono compiler ${csharp_mono_version_temp}" FORCE )
mark_as_advanced( CSHARP_MONO_COMPILER_${csharp_mono_version_temp} )
# Set interpreter
if (EXISTS "${csharp_mono_bin_dir}/mono.exe")
set( CSHARP_MONO_INTERPRETER_${csharp_mono_version_temp} "${csharp_mono_bin_dir}/mono.exe" CACHE STRING "C# Mono interpreter ${csharp_mono_version_temp}" FORCE )
mark_as_advanced( CSHARP_MONO_INTERPRETER_${csharp_mono_version_temp} )
endif (EXISTS "${csharp_mono_bin_dir}/mono.exe")
endif( csharp_mono_valid )
# Create a list of supported compiler versions
if( NOT DEFINED CSHARP_MONO_VERSIONS )
set( CSHARP_MONO_VERSIONS "${csharp_mono_version_temp}" CACHE STRING "Available C# Mono compiler versions" FORCE )
else( NOT DEFINED CSHARP_MONO_VERSIONS )
set( CSHARP_MONO_VERSIONS "${CSHARP_MONO_VERSIONS}, ${csharp_mono_version_temp}" CACHE STRING "Available C# Mono versions" FORCE )
endif( NOT DEFINED CSHARP_MONO_VERSIONS )
mark_as_advanced( CSHARP_MONO_VERSIONS )
# We found at least one Mono compiler version
set( CSHARP_MONO_FOUND 1 CACHE INTERNAL "Boolean indicating if C# Mono was found" )
endforeach( csharp_mono_bin_dir )
else( UNIX )
# Search for Mono on non-Win32 systems
set( chsarp_mono_names "mcs" "mcs.exe" "dmcs" "dmcs.exe" "smcs" "smcs.exe" "gmcs" "gmcs.exe" )
set(
csharp_mono_paths
"/usr/bin/"
"/usr/local/bin/"
"/usr/lib/mono/2.0"
"/opt/novell/mono/bin"
)
find_program(
csharp_mono_compiler # variable is added to the cache, we removed it below
NAMES ${chsarp_mono_names}
PATHS ${csharp_mono_paths}
)
if( EXISTS ${csharp_mono_compiler} )
# Determine version
find_program(
csharp_mono_interpreter # variable is added to the cache, we removed it below
NAMES mono
PATHS ${csharp_mono_paths}
)
if ( EXISTS ${csharp_mono_interpreter} )
execute_process(
COMMAND ${csharp_mono_interpreter} -V
OUTPUT_VARIABLE csharp_mono_version_string
)
string( REGEX MATCH "([0-9]*)([.])([0-9]*)([.]*)([0-9]*)" csharp_mono_version_temp ${csharp_mono_version_string} )
set( CSHARP_MONO_INTERPRETER_${CSHARP_MONO_VERSION} ${csharp_mono_interpreter} CACHE STRING "C# Mono interpreter ${csharp_mono_version_temp}" FORCE )
mark_as_advanced( CSHARP_MONO_INTERPRETER_${CSHARP_MONO_VERSION} )
endif ( EXISTS ${csharp_mono_interpreter} )
unset( csharp_mono_interpreter CACHE )
# We found Mono compiler
set( CSHARP_MONO_VERSION ${csharp_mono_version_temp} CACHE STRING "C# Mono compiler version" )
mark_as_advanced( CSHARP_MONO_VERSION )
set( CSHARP_MONO_COMPILER_${CSHARP_MONO_VERSION} ${csharp_mono_compiler} CACHE STRING "C# Mono compiler ${CSHARP_MONO_VERSION}" FORCE )
mark_as_advanced( CSHARP_MONO_COMPILER_${CSHARP_MONO_VERSION} )
set( CSHARP_MONO_VERSIONS ${CSHARP_MONO_VERSION} CACHE STRING "Available C# Mono compiler versions" FORCE )
mark_as_advanced( CSHARP_MONO_VERSIONS )
set( CSHARP_MONO_FOUND 1 CACHE INTERNAL "Boolean indicating if C# Mono was found" )
endif( EXISTS ${csharp_mono_compiler} )
# Remove temp variable from cache
unset( csharp_mono_compiler CACHE )
endif( WIN32 )
if( CSHARP_MONO_FOUND )
# Report the found versions
message( STATUS "Found the following C# Mono versions: ${CSHARP_MONO_VERSIONS}" )
endif( CSHARP_MONO_FOUND )
# Set USE_FILE
get_filename_component( current_list_path ${CMAKE_CURRENT_LIST_FILE} PATH )
set( Mono_USE_FILE ${current_list_path}/UseMono.cmake )