cmake_minimum_required(VERSION 2.6.4)
+# To keep this in sync with the autoconf based system:
+# git log -n --format=oneline CMakeLists.txt
+# git diff <commit displayed by previous line>..HEAD configure.in Makefile.am
+
# FIXME: Sanitize the variables, no need for the duplicate am conditionals
# - It would be nice to rename 'CMakeFiles' to something like '.cmake'
# - It would be nice to have a per-target VERBOSE setting
# - or a way to change the setting name to 'V' and the output to CC <src>
# to be similar to the current build output
+# - Add a cache to the manual checks
# We use lowercase commands as advocated by the kde cmake coding style
# The lines commented out using ### are the stuff from configure.in which still
# need to be ported to cmake
-# The svn revision of the configure.in used is r132691
-ac_define_unquoted(VERSION 2.5 "Version number of package")
-###
-###set(API_VER 1.0)
-###AC_SUBST(API_VER)
+set(VERSION 2.7)
+ac_define_unquoted(VERSION ${VERSION} "Version number of package")
+set(API_VER 1.0)
###
###AC_PROG_LN_S
###
###case "$host" in
### *-*-mingw*|*-*-cygwin*)
### set(platform_win32 yes)
-### ac_define(PLATFORM_WIN32,1,[Platform is Win32])
+### AC_DEFINE(PLATFORM_WIN32,1,[Host Platform is Win32])
+### AC_DEFINE(TARGET_WIN32,1,[Target OS is Win32])
### ac_define(DISABLE_PORTABILITY,1,[Disable the io-portability layer])
### ac_define(PLATFORM_NO_SYMLINKS,1,[This platform does not support symlinks])
### if test "x$cross_compiling" = "xno"; then
set(PLATFORM_SIGPOSIX 1)
endif()
if(platform_win32)
- set(PLATFORM_WIN32 yes)
+ set(HOST_WIN32 yes)
+ set(TARGET_WIN32 yes)
endif()
if(${target_os} MATCHES "*linux*")
set(PLATFORM_LINUX yes)
void main () {}
" GCC)
-ac_msg_checking("for isinf")
-set(compiles)
-check_c_source_compiles("
+if(NOT HAVE_ISINF)
+ ac_msg_checking("for isinf")
+ set(compiles)
+ check_c_source_compiles("
#include <math.h>
void main () {
int f = isinf (1);
}
" compiles)
-if(compiles)
- ac_msg_result(yes)
- ac_define(HAVE_ISINF 1 "isinf available")
-else()
- ac_msg_result(no)
+ if(compiles)
+ ac_msg_result(yes)
+ ac_define(HAVE_ISINF 1 "isinf available")
+ set(HAVE_ISINF 1 CACHE BOOL "Have the isinf function")
+ else()
+ ac_msg_result(no)
+ endif()
endif()
# not 64 bit clean in cross-compile
set(srcdir ${CMAKE_SOURCE_DIR})
set(top_srcdir ${CMAKE_SOURCE_DIR})
+set(abs_top_srcdir ${top_srcdir})
# FIXME:
set(top_builddir ${CMAKE_BINARY_DIR})
# A sanity check to catch cases where the package was unpacked
# with an ancient tar program (Solaris)
#
-ac_msg_checking("integrity of package")
-if(EXISTS ${srcdir}/${mcsdir}/class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/SoapTypeMapper.cs)
- ac_msg_result(ok)
-else()
- set(errorm "Your mono distribution is incomplete; if unpacking from a tar file, make sure you use GNU tar; see http://www.mono-project.com/IncompletePackage for more details")
- ac_msg_error(${errorm})
+set(solaris-tar-check yes CACHE BOOL "Enable/disable solaris tar check")
+
+if(solaris-tar-check)
+ ac_msg_checking("integrity of package")
+ if(EXISTS ${srcdir}/${mcsdir}/class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/SoapTypeMapper.cs)
+ ac_msg_result(ok)
+ else()
+ set(errorm "Your mono distribution is incomplete; if unpacking from a tar file, make sure you use GNU tar; see http://www.mono-project.com/IncompletePackage for more details")
+ ac_msg_error(${errorm})
+ endif()
endif()
set(mcs_topdir ${top_srcdir}/${mcsdir})
if(with_static_mono)
set(STATIC_MONO yes)
endif()
+set(enable_mcs_build yes)
###AC_ARG_ENABLE(mcs-build, [ --disable-mcs-build disable the build of the mcs directory], set(try_mcs_build $enableval, enable_mcs_build=yes))
###
###set(xen_opt, [ --with-set(xen_opt yes,no Enable Xen-specific behaviour (defaults to yes)],[],[with_xen_opt=yes]))
ac_define_unquoted(DISABLED_FEATURES "${DISABLED_FEATURES}" "String of disabled features")
###
###if test "x$mono_feature_disable_aot" = "xyes"; then
-### ac_define(DISABLE_AOT, 1, [Disable AOT support])
+### AC_DEFINE(DISABLE_AOT_COMPILER, 1, [Disable AOT Compiler])
+### AC_MSG_NOTICE([Disabled AOT compiler])
###fi
###
###if test "x$mono_feature_disable_profiler" = "xyes"; then
### set(LLVM_CXXFLAGS `$LLVM_CONFIG --cflags`)
### set(LLVM_LDFLAGS `$LLVM_CONFIG --ldflags`)
-### set(LLVM_LIBS `$LLVM_CONFIG --libs core engine`)
+### LLVM_LIBS=`$LLVM_CONFIG --libs core bitwriter jit x86codegen`
### set(LLVM_LIBS "$LLVM_LDFLAGS $LLVM_LIBS -lstdc++")
### AC_SUBST(LLVM_CXXFLAGS)
### AC_SUBST(LLVM_LIBS)
+### AC_SUBST(LLVM_LDFLAGS)
### ac_define(ENABLE_LLVM, 1, [Enable the LLVM back end])
###fi
set(ACCESS_UNALIGNED no)
set(JIT_SUPPORTED yes)
set(jit_wanted true)
+elseif(host MATCHES "mips.*")
+ set(TARGET MIPS)
+ set(arch_target mips)
+ set(ACCESS_UNALIGNED no)
+ set(JIT_SUPPORTED yes)
+ set(jit_wanted true)
+### ac_msg_checking(for mips n32)
+### AC_TRY_COMPILE([], [
+### void main () {
+### #if _MIPS_SIM != _ABIN32
+### #error Not mips n32
+### #endif
+### }
+### ],[
+### ac_msg_result(yes)
+### set(sizeof_register 8)
+### ],[
+### ac_msg_result(no)
+### ])
+### ;;
else()
message(FATAL_ERROR "Host ${host} not yet supported by the cmake build.")
endif()
# set(TARGET MIPS;)
# set(ACCESS_UNALIGNED "no")
# ;;
-### mips*)
-### set(TARGET MIPS;)
-### set(arch_target mips;)
-### set(ACCESS_UNALIGNED "no")
-### set(JIT_SUPPORTED yes)
-### set(jit_wanted true)
-
-### ac_msg_checking(for mips n32)
-### AC_TRY_COMPILE([], [
-### void main () {
-### #if _MIPS_SIM != _ABIN32
-### #error Not mips n32
-### #endif
-### }
-### ],[
-### ac_msg_result(yes)
-### set(sizeof_register 8)
-### ],[
-### ac_msg_result(no)
-### ])
-### ;;
### i*86-*-*)
### set(TARGET X86;)
### set(arch_target x86;)
ac_define(SIZEOF_REGISTER SIZEOF_VOID_P "size of machine integer registers")
endif()
+###if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then
+### AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target])
+###elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then
+### AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target])
+###else
+### AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target])
+###fi
+
###if (${have_visibility_hidden" = "xyes"; then
### ac_define(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute])
###fi
if (host MATCHES ".*-.*-.*linux.*")
set(mono_debugger_supported yes)
endif()
+ if (host MATCHES ".*86-apple-darwin.*")
+ set(mono_debugger_supported yes)
+ endif()
endif()
endif()
ac_define(HAVE_KW_THREAD 1 "Have __thread keyword")
ac_define(USE_COMPILER_TLS 1 "Use __thread for TLS access")
# Pass the information to libgc
-### set(CPPFLAGS "$CPPFLAGS -DUSE_COMPILER_TLS")
+set(CPPFLAGS "${CPPFLAGS} -DUSE_COMPILER_TLS")
### ac_msg_checking(if the tls_model attribute is supported)
### AC_TRY_COMPILE([static __thread int foo __attribute__((tls_model("initial-exec")));], [
### ], [
### ;;
###esac
-set(preview yes CACHE BOOL "If you want to install the 2.0 FX preview (defaults to yes)")
-set(PREVIEW ${preview})
-set(moonlight yes CACHE BOOL "If you want to build the Moonlight 2.1 assemblies (defaults to yes)")
-set(MOONLIGHT ${moonlight})
-set(OPROFILE no)
-set(oprofile no CACHE STRING "<oprofile install dir> or 'no' to disable oprofile support (defaults to no)")
-if (NOT oprofile STREQUAL no)
+set(with_moonlight yes CACHE BOOL "If you want to build the Moonlight 2.1 assemblies (defaults to yes)")
+set(with_profile4 no CACHE BOOL "If you want to install the 4.0 FX (defaults to no)")
+set(with_monotouch no CACHE BOOL "If you want to build the raw MonoTouch 2.1 assemblies (defaults to no)")
+set(with_oprofile no)
+set(with_oprofile no CACHE STRING "<oprofile install dir> or 'no' to disable oprofile support (defaults to no)")
+if (NOT with_oprofile STREQUAL no)
### if test x$with_oprofile != xno; then
### set(oprofile_include $with_oprofile/include)
### if test ! -f $oprofile_include/opagent.h; then
if(NOT mcs_docs)
set(DISABLE_MCS_DOCS yes)
endif()
-if(OPROFILE)
+if(with_oprofile)
set(HAVE_OPROFILE yes)
endif()
###AC_SUBST(OPROFILE_CFLAGS)
###AC_SUBST(OPROFILE_LIBS)
-###set(libmono_ldflags "$libmono_ldflags $LIBS")
+set(libs_list)
+foreach(lib ${LIBS})
+ set(libs_list "${libs_list} ${lib}")
+endforeach()
+set(libmono_ldflags "${libmono_ldflags} ${libs_list}")
if(PREVIEW)
set(INSTALL_2_0 yes)
set(INSTALL_2_1 yes)
endif()
+###AM_CONDITIONAL(INSTALL_2_1, [test "x$with_moonlight" = xyes])
+###AM_CONDITIONAL(INSTALL_4_0, [test "x$with_profile4" = xyes])
+###AM_CONDITIONAL(INSTALL_MONOTOUCH, [test "x$with_monotouch" = xyes])
+
###AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
###AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
# Define a variable for the target
### cd $depth
###],[set(LN_S '$LN_S']))
+
+###AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/machine.config],
+###[ depth=../../../..
+### case $srcdir in
+### [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
+### .) reldir=$depth ;;
+### *) reldir=$depth/$srcdir ;;
+### esac
+### $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
+### cd runtime/etc/mono/4.0
+### rm -f machine.config
+### $LN_S $reldir/data/net_4_0/machine.config machine.config
+### cd $depth
+###],[LN_S='$LN_S'])
+###
+###AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/web.config],
+###[ depth=../../../..
+### case $srcdir in
+### [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
+### .) reldir=$depth ;;
+### *) reldir=$depth/$srcdir ;;
+### esac
+### $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
+### cd runtime/etc/mono/4.0
+### rm -f web.config
+### $LN_S $reldir/data/net_4_0/web.config web.config
+### cd $depth
+###],[LN_S='$LN_S'])
+###
+
###if test x$enable_quiet_build = xyes; then
### AC_CONFIG_COMMANDS([quiet], [for i in `find mono libgc support -name Makefile.in | sed -e 's/Makefile.in/Makefile/g'`; do if test -f $i; then $srcdir/scripts/patch-quiet.sh $i; fi; done], [set(shell $SHELL]))
### AC_CONFIG_COMMANDS([quiet-libtool], [sed -e 's/$echo "copying selected/$show "copying selected/g' < libtool > libtool.tmp && mv libtool.tmp libtool && chmod a+x libtool; sed -e 's/$ECHO "copying selected/# "copying selected/g' < libtool > libtool.tmp && mv libtool.tmp libtool && chmod a+x libtool])
###fi
+if("${prefix}" STREQUAL "")
+ set(prefix /usr/local)
+endif()
+if("${exec_prefix}" STREQUAL "")
+ set(exec_prefix "\${prefix}")
+ set(exec_prefix_full "${prefix}")
+else()
+ set(exec_prefix_full "${exec_prefix}")
+endif()
+
+# FIXME: Make these overridable
+set(bindir "\${exec_prefix}/bin")
+set(bindir_full "${exec_prefix_full}/bin")
+set(sbindir "\${exec_prefix}/sbin")
+set(libexecdir "\${exec_prefix}/libexec")
+set(datarootdir "\${prefix}/share")
+set(datadir "\${datarootdir}")
+set(sysconfdir "\${prefix}/etc")
+set(sharedstatedir "\${prefix}/com")
+set(localstatedir "\${prefix}/var")
+set(includedir "\${prefix}/include")
+set(oldincludedir "/usr/include")
+set(docdir "\${datarootdir}/doc/\${PACKAGE}")
+set(infodir "\${datarootdir}/info")
+set(htmldir "\${docdir}")
+set(dvidir "\${docdir}")
+set(pdfdir "\${docdir}")
+set(psdir "\${docdir}")
+set(libdir "\${exec_prefix}/lib")
+set(localedir "\${datarootdir}/locale")
+set(mandir "\${datarootdir}/man")
autoheader("config.h" autoheader_vars)
add_subdirectory(${dir})
endforeach()
+# Implementation of AC_OUTPUT for cmake
+function(ac_output outputs)
+ foreach (output ${ARGV})
+ configure_file ("${output}.in" "${output}" @ONLY)
+ endforeach()
+endfunction()
+
+ac_output(
+mono-uninstalled.pc
+scripts/mono-find-provides
+scripts/mono-find-requires
+mono/tests/tests-config
+data/mint.pc
+data/mono.pc
+data/mono-cairo.pc
+data/mono-nunit.pc
+data/mono-options.pc
+data/mono-lineeditor.pc
+data/monodoc.pc
+data/mono.web.pc
+data/dotnet.pc
+data/dotnet35.pc
+data/wcf.pc
+data/cecil.pc
+data/system.web.extensions_1.0.pc
+data/system.web.extensions.design_1.0.pc
+data/system.web.mvc.pc
+data/config
+)
+
###AC_OUTPUT([
+###mono-core.spec
###mono-uninstalled.pc
###scripts/mono-find-provides
###scripts/mono-find-requires
-###mono/Makefile
-###mono/utils/Makefile
-###mono/metadata/Makefile
###mono/dis/Makefile
###mono/cil/Makefile
###mono/arch/Makefile
###mono/tests/cas/threads/Makefile
###mono/benchmark/Makefile
###mono/monograph/Makefile
-###mono/io-layer/Makefile
-###mono/mini/Makefile
###mono/profiler/Makefile
###ikvm-native/Makefile
###scripts/Makefile
###web/Makefile
###docs/Makefile
###data/Makefile
-###data/net_1_1/Makefile
###data/net_2_0/Makefile
+###data/net_4_0/Makefile
###data/net_2_0/Browsers/Makefile
###data/mint.pc
###data/mono.pc
### sed -e "s,-mno-cygwin,,g" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
###fi
-###(
-### case $prefix in
-### NONE) set(prefix $ac_default_prefix ;;)
-### esac
-### case $exec_prefix in
-### NONE) set(exec_prefix '${prefix}' ;;)
-### esac
-
-### test -w $srcdir/$mcsdir/build || chmod +w $srcdir/$mcsdir/build
-
-### #
-### # If we are cross compiling, we don't build in the mcs/ tree. Let us not clobber
-### # any existing config.make. This allows people to share the same source tree
-### # with different build directories, one native and one cross
-### #
-### if test x$cross_compiling = xno && test x$enable_mcs_build != xno; then
-### echo "set(prefix $prefix" > $srcdir/$mcsdir/build/config.make)
-### echo "set(exec_prefix $exec_prefix" >> $srcdir/$mcsdir/build/config.make)
-### echo "set(sysconfdir $sysconfdir" >> $srcdir/$mcsdir/build/config.make)
-### echo 'set(mono_libdir ${exec_prefix}/lib' >> $srcdir/$mcsdir/build/config.make)
-### echo 'MCS_FLAGS = $(PLATFORM_DEBUG_FLAGS)' >> $srcdir/$mcsdir/build/config.make
-### echo 'IL_FLAGS = /debug' >> $srcdir/$mcsdir/build/config.make
-### echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $srcdir/$mcsdir/build/config.make
-### echo "ILDISASM = $mono_build_root/runtime/monodis-wrapper" >> $srcdir/$mcsdir/build/config.make
+# FIXME:
+set(mcs_INSTALL ${mono_build_root}/install-sh)
+
### case $INSTALL in
### [[\\/$]]* | ?:[[\\/]]* ) set(mcs_INSTALL $INSTALL ;;)
### *) set(mcs_INSTALL $mono_build_root/$INSTALL ;;)
### esac
-### echo "INSTALL = $mcs_INSTALL" >> $srcdir/$mcsdir/build/config.make
+# Compute a 4 part version number into myver from ${mono_version}
+string(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)\\.([0-9]+).*" "\\1.\\2.\\3.\\4" myver "${mono_version}.0.0.0")
-### export VERSION
-### [set(myver $($AWK 'BEGIN {)
-### split (ENVIRON["VERSION"] ".0.0.0", vsplit, ".")
-### if(length(vsplit [1]) > 4) {
-### split (substr(ENVIRON["VERSION"], 0, 4) "." substr(ENVIRON["VERSION"], 5) ".0.0", vsplit, ".")
-### }
-### print vsplit [1] "." vsplit [2] "." vsplit [3] "." vsplit [4]
-### }')]
+set(config.make ${srcdir}/${mcsdir}/build/config.make)
+#
+# If we are cross compiling, we don't build in the mcs/ tree. Let us not clobber
+# any existing config.make. This allows people to share the same source tree
+# with different build directories, one native and one cross
+#
+if(NOT cross_compiling)
+ set(not_cross_compiling yes)
+endif()
+if(not_cross_compiling AND enable_mcs_build)
+ file(WRITE ${config.make} "prefix=${prefix}
+exec_prefix=${exec_prefix}
+sysconfdir=${sysconfdir}
+mono_libdir=\${exec_prefix}/lib
+MCS_FLAGS=$(PLATFORM_DEBUG_FLAGS)
+IL_FLAGS=/debug
+RUNTIME=${mono_build_root}/runtime/mono-wrapper
+ILDISASM=${mono_build_root}/runtime/monodis-wrapper
+INSTALL=${mcs_INSTALL}
+MONO_VERSION=${myver}
+")
+endif()
-### echo "MONO_VERSION = $myver" >> $srcdir/$mcsdir/build/config.make
-### fi
+if(platform_darwin)
+ file(APPEND ${config.make} "PLATFORM=darwin\n")
+endif()
-### if test x$platform_darwin = xyes; then
-### echo "PLATFORM = darwin" >> $srcdir/$mcsdir/build/config.make
-### fi
+if (${TARGET} STREQUAL "AMD64" AND ${platform_win32} STREQUAL "no" AND AOT_SUPPORTED)
+ file(APPEND ${config.make} "ENABLE_AOT=1\n")
+endif()
-### if test x$TARGET = xAMD64 -a x$platform_win32 = xno -a "x$AOT_SUPPORTED" = "xyes"; then
-### echo "ENABLE_AOT = 1" >> $srcdir/$mcsdir/build/config.make
-### fi
+if (DISABLE_MCS_DOCS)
+ file(APPEND ${config.make} "DISABLE_MCS_DOCS=yes\n")
+endif()
### # if we have an olive folder, override the default settings
### if test -d $olivedir; then
### fi
### fi
-### if test x$DISABLE_MCS_DOCS = xyes; then
-### echo "DISABLE_MCS_DOCS = yes" >> $srcdir/$mcsdir/build/config.make
-### fi
-###)
-
if(NOT libgdiplus_loc)
set(libgdiplus_msg "assumed to be installed")
else()
TLS: ${with_tls}
SIGALTSTACK: ${with_sigaltstack}
Engine: ${jit_status}
- 2.0 Beta: ${PREVIEW}
- 2.1 Alpha: ${MOONLIGHT}
+ Moon Profile: ${with_moonlight}
+ 4.0 Alpha: ${with_profile4}
+ MonoTouch: ${with_monotouch}
JNI support: ${jdk_headers_found}
libgdiplus: ${libgdiplus_msg}
zlib: ${zlib_msg}
- oprofile: ${OPROFILE}
+ oprofile: ${with_oprofile}
BigArrays: ${enable_big_arrays}
DTrace: ${enable_dtrace}
Parallel Mark: ${enable_parallel_mark}
#### Distribute the 'mcs' tree too
###dist-hook:
### test -d $(distdir)/mcs || mkdir $(distdir)/mcs
-### d=`cd $(distdir)/mcs && pwd`; cd $(mcs_topdir) && $(MAKE) PROFILE=net_1_1 distdir=$$d dist-recursive
-### d=`cd $(distdir)/mcs && pwd`; cd $(mcs_topdir) && $(MAKE) PROFILE=net_2_0 distdir=$$d dist-recursive
+### d=`cd $(distdir)/mcs && pwd`; cd $(mcs_topdir) && $(MAKE) distdir=$$d dist-recursive
###pkgconfigdir = $(libdir)/pkgconfig
###noinst_DATA = mono-uninstalled.pc