Bug fix: compile was not actually compiling the correct functions
[maxima.git] / crosscompile-windows / CMakeLists.txt
blob12a7b8b8e900dad4e3767a705cc75b4b1c54278b
1 # CMake file for crosscompiling Maxima/wxMaxima for Windows
2 # Copyright (C) by Wolfgang Dautermann
3 # License GPLv2+: GNU GPL version 2 or later <http://gnu.org/licenses/gpl.html>
4 # This is free software: you are free to change and redistribute it.
5 # There is NO WARRANTY, to the extent permitted by law.
7 set(CMAKE_SYSTEM_NAME Windows)
9 option(BUILD_64BIT "Build a 64 bit installer." NO)
11 if(BUILD_64BIT)
12     set(HOST x86_64-w64-mingw32)
13     set(INSTALLERSUFFIX "win64")
14 else()
15     set(HOST i686-w64-mingw32)
16     set(INSTALLERSUFFIX "win32")
17 endif()
19 set(CMAKE_C_COMPILER   ${HOST}-gcc)
20 set(CMAKE_CXX_COMPILER ${HOST}-g++)
21 set(CMAKE_RC_COMPILER  ${HOST}-windres)
22 project(maxima)
23 cmake_minimum_required(VERSION 3.7)
25 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/ ${CMAKE_BINARY_DIR}/)
28 # On which windows drive (C:, D:, ...) will be the default installation path?
29 set(WINDOWS_DRIVELETTER "C")
32 # What is the build system?
33 execute_process(COMMAND gcc -dumpmachine OUTPUT_VARIABLE BUILDHOST OUTPUT_STRIP_TRAILING_WHITESPACE)
34 message(STATUS "Build system: ${BUILDHOST}")
36 # Output the host system, for which we are compiling
37 message(STATUS "Host system: ${HOST}")
39 find_file (NSISTEMPLATE_IN  NAMES "NSIS.template.in"
40     PATHS "${CMAKE_ROOT}/Modules/" "${CMAKE_ROOT}/Modules/Internal/CPack")
41 file(READ "${NSISTEMPLATE_IN}" MYNSISTEMPLATE)
42 string(REPLACE "RequestExecutionLevel admin" "RequestExecutionLevel user
43 !include \"${CMAKE_SOURCE_DIR}\\\\\\\\FileAssociation.nsh\"
44 !include FileFunc.nsh
45 !include LogicLib.nsh
46 " MYNSISTEMPLATE "${MYNSISTEMPLATE}")
48 string(REPLACE "Function .onInit" "Function .onInit
49 \${GetParameters} \$0
50 \${GetOptions} \$0 \"/no_vtk\" \$1
51 \${IfNot} \${Errors}
52     !insertmacro UnselectSection \${vtk}
53 \${EndIf}
54 \${GetOptions} \$0 \"/no_gnuplot\" \$1
55 \${IfNot} \${Errors}
56     !insertmacro UnselectSection \${gnuplot}
57 \${EndIf}
58 \${GetOptions} \$0 \"/no_wxmaxima\" \$1
59 \${IfNot} \${Errors}
60     !insertmacro UnselectSection \${wxmaxima}
61 \${EndIf}
62 \${GetOptions} \$0 \"/?\" \$1
63 \${IfNot} \${Errors}
64         MessageBox MB_OK \"Installer for Maxima\$\\n\$\\nThis installer allows the following command line options:\$\\n        /S - silent install\$\\n        /D=<path> - select the install path\$\\n        /no_vtk - do not select VTK\$\\n        /no_gnuplot - do not select Gnuplot\$\\n        /no_wxmaxima - do not select wxMaxima\$\\n        /? - this help message\$\\n\$\\nMaxima Website: http://maxima.sourceforge.net\"
65         Abort
66 \${EndIf}
68 " MYNSISTEMPLATE "${MYNSISTEMPLATE}")
69 file(WRITE ${CMAKE_BINARY_DIR}/NSIS.template.in "${MYNSISTEMPLATE}")
70 message(STATUS "Copied and patched ${CMAKE_ROOT}/Modules/NSIS.template.in to ${CMAKE_BINARY_DIR}/NSIS.template.in")
72 option(USE_WXMAXIMA_GIT "Use wxMaxima development snapshot." NO)
73 option(USE_VTK "Use VTK." YES)
74 # the following option is used for nightly builds of the installer.
75 # it builds the current Maxima/wxMaxima Git versions and also
76 # sets the installation directory to ${WINDOWS_DRIVELETTER}:\maxima-current
77 option(BUILD_CURRENT "Build a installer for current Maxima/wxMaxima." NO)
79 option(WITH_ABCL "Include ABCL in the installer." NO)
81 # SBCL and CLISP have both advantages and disadvantages:
82 #  - SBCL is fast, but sometimes runs out of memory in places it really shouldn't
83 #    (Loading LAPACK on IA32, for example) and isn't too happy with changing to
84 #    non-ascii-non-unicode pathnames (which wxMaxima works around by now, though,
85 #    and which Xmaxima doesn't evven try to do)
86 #  - CLISP is slow. And version 2.49 only sends valid output over the network
87 #    if the front-end is slow enough. Test cases: Running a demo, all commands
88 #    with loads of compiler output (load("draw"); for the first time) or just
89 #    receiving a batch of new autocompletion symbols. Since the libraries the
90 #    front-ends use have evolved in the last years it has become easy to
91 #    trigger this => Setting SBCL to be the default.
92 #  - ABCL (optional) is a Java based Lisp.
93 if(WITH_ABCL)
94     set(WITH_DEFAULT_LISP "sbcl" CACHE STRING "Which Lisp should be used by default (clisp/sbcl/abcl)?")
95     set_property(CACHE WITH_DEFAULT_LISP PROPERTY STRINGS "clisp" "sbcl" "abcl")
96     set(ABCL_LICENSE_INFORMATION "<li><a href=\"http://www.abcl.org/\">ABCL Website</a>, <a href=\"https://abcl.org/faq.shtml#license\">ABCL license</a></li>")
97     set(ABCL_ENABLED 1)
98 else()
99     set(WITH_DEFAULT_LISP "sbcl" CACHE STRING "Which Lisp should be used by default (clisp/sbcl)?")
100     set_property(CACHE WITH_DEFAULT_LISP PROPERTY STRINGS "clisp" "sbcl")
101     set(ABCL_ENABLED 0)
102 endif()
104 # If you want to use a updated version of a program,
105 # update the version number and the checksum.
106 # If no further patches are needed, you should get a
107 # updated setup-file automatically.
109 # current program versions
110 set(CLISPVERSION 2.49)
113 # MD5 checksums for the current program versions.
114 set(CLISP_MD5 "8d58d64f83dd7ad01c054aecc16c1f52")
116 if(BUILD_CURRENT)
117     set(USE_WXMAXIMA_GIT YES)
118     set(MAXIMAVERSION "current")
119 else()
120     # Get Maxima version from configure.ac
121     file(STRINGS "${CMAKE_SOURCE_DIR}/../configure.ac" CONFIGUREAC REGEX "AC_INIT\\(.*\\)")
122     string(REGEX REPLACE "AC_INIT\\(\\[maxima\\], \\[(.*)\\]\\)" "\\1" MAXIMAVERSION ${CONFIGUREAC})
123     message(STATUS "Maxima version (from configure.ac): ${MAXIMAVERSION}")
124 endif()
128 # download URLs
129 set(CLISP_URL "http://downloads.sourceforge.net/project/clisp/clisp/${CLISPVERSION}/clisp-${CLISPVERSION}-win32-mingw-big.zip")
132 # Where are libgcc and libstdc++?
133 if(BUILD_64BIT)
134     execute_process(COMMAND "${CMAKE_CXX_COMPILER}" -print-file-name=libgcc_s_seh-1.dll OUTPUT_VARIABLE MINGW_LIBGCC    OUTPUT_STRIP_TRAILING_WHITESPACE)
135 else()
136     execute_process(COMMAND "${CMAKE_CXX_COMPILER}" -print-file-name=libgcc_s_sjlj-1.dll OUTPUT_VARIABLE MINGW_LIBGCC    OUTPUT_STRIP_TRAILING_WHITESPACE)
137 endif()
139 execute_process(COMMAND "${CMAKE_CXX_COMPILER}" -print-file-name=libstdc++-6.dll     OUTPUT_VARIABLE MINGW_LIBSTDCPP OUTPUT_STRIP_TRAILING_WHITESPACE)
141 message(STATUS "Found libstdc++ at ${MINGW_LIBSTDCPP}")
143 message(STATUS "Found libgcc at ${MINGW_LIBGCC}")
145 add_subdirectory("wine/")
147 find_program(SEVENZIP_EXE NAMES 7z)
149 if(SEVENZIP_EXE)
150     message(STATUS "Found 7z at ${SEVENZIP_EXE}")
151 else()
152     message(FATAL_ERROR "7z not found. It is required for crosscompiling Maxima.")
153 endif()
155 include(ExternalProject)
158 # Clisp (already a binary package just extract it...)
160 # What is the difference between clisp-2.49-win32-mingw-big.zip and clisp-2.49-win32-mingw-small.zip?
161 # What should be used for running Maxima?
162 externalproject_add(clisp
163   URL "${CLISP_URL}"
164   DOWNLOAD_DIR ${CMAKE_SOURCE_DIR}/downloads
165   URL_MD5 ${CLISP_MD5}
166   CONFIGURE_COMMAND ""
167   BUILD_COMMAND ""
168   INSTALL_COMMAND ""
170 install(DIRECTORY ${CMAKE_BINARY_DIR}/clisp-prefix/src/clisp/ DESTINATION clisp-${CLISPVERSION} COMPONENT Clisp)
172 add_subdirectory("sbcl/")
174 add_subdirectory("gnuplot/")
176 add_subdirectory("tcltk/")
178 add_subdirectory("wxwidgets/")
180 add_subdirectory("wxmaxima/")
182 if(USE_VTK)
183     add_subdirectory("vtk/")
184 endif()
186 if(WITH_ABCL)
187     add_subdirectory("abcl/")
188     set(ABCL_ENABLE "--enable-abcl")
189     set(ABCL_DEPENDS "abcl")
190     set(ABCL_JAR "--with-abcl-jar=${CMAKE_BINARY_DIR}/abcl/abcl-prefix/src/abcl/abcl.jar")
191     set(ABCL_INSTALLER "-abcl")
192 else()
193     set(ABCL_ENABLE "")
194     set(ABCL_DEPENDS "")
195     set(ABCL_JAR "")
196     set(ABCL_INSTALLER "")
197 endif()
199 configure_file("${CMAKE_SOURCE_DIR}/wine-clisp.sh.tmpl" "${CMAKE_BINARY_DIR}/wine-clisp.sh")
200 configure_file("${CMAKE_SOURCE_DIR}/wine-lisp.sh.tmpl" "${CMAKE_BINARY_DIR}/wine-lisp.sh")
201 configure_file("${CMAKE_SOURCE_DIR}/wine-sbcl.sh.tmpl" "${CMAKE_BINARY_DIR}/wine-sbcl.sh")
203 externalproject_add(maxima
204   # first copy the maxima source to a build directory, since out-of-source-builds do not work
205   DOWNLOAD_COMMAND rsync -a --exclude=crosscompile-windows/build/ "${CMAKE_SOURCE_DIR}/../"  "${CMAKE_BINARY_DIR}/maxima-prefix/src/maxima"
206   DEPENDS clisp sbcl tcl tk ${ABCL_DEPENDS}
207   BUILD_IN_SOURCE 1
208   CONFIGURE_COMMAND sh -c "test -x ./bootstrap && ./bootstrap || return 0"
209             COMMAND ./configure --host=${HOST} --enable-clisp --with-clisp=${CMAKE_BINARY_DIR}/wine-clisp.sh --with-clisp-runtime=${CMAKE_BINARY_DIR}/wine-lisp.sh --enable-sbcl --with-sbcl=${CMAKE_BINARY_DIR}/wine-sbcl.sh ${ABCL_ENABLE} "${ABCL_JAR}" --with-default-lisp=${WITH_DEFAULT_LISP} --prefix=${WINDOWS_DRIVELETTER}:/maxima-${MAXIMAVERSION}
210   # clisp-depends.mk is generated with "\" as path seperator, not "/" - correct that...
211   BUILD_COMMAND LANG=C $(MAKE) -C src clisp-depends.mk
212         COMMAND sed -i s+\\\\+/+g src/clisp-depends.mk
213         COMMAND LANG=C $(MAKE)
214         COMMAND LANG=C $(MAKE) pdf
215   INSTALL_COMMAND LANG=C $(MAKE) install DESTDIR=${CMAKE_BINARY_DIR}/maxima-installroot/
218 # crosscompiling winkill with autoconf does not work, compile it using CMake.
219 add_library(winkill_lib SHARED ${CMAKE_SOURCE_DIR}/../interfaces/xmaxima/win32/winkill_lib.c)
220 add_executable(winkill ${CMAKE_SOURCE_DIR}/../interfaces/xmaxima/win32/winkill.c)
221 set_target_properties(winkill_lib PROPERTIES PREFIX "") # remove 'lib' prefix from libwinkill_lib.dll
222 target_link_libraries(winkill winkill_lib)
223 install(TARGETS winkill winkill_lib COMPONENT Maxima RUNTIME DESTINATION bin LIBRARY DESTINATION bin/)
224 install(FILES "${CMAKE_SOURCE_DIR}/../interfaces/xmaxima/win32/win_signals.lisp" DESTINATION bin/ COMPONENT Maxima)
226 # convert windows short names to long names (e.g.
227 # "C:/Users/TESTTE~1/AppData/Local/Temp" to "C:/Users/test test/AppData/Local/Temp")
228 # CLISP can (currently not handle short names.
229 add_executable(maxima_longnames maxima_longnames.c)
230 install(FILES "${CMAKE_BINARY_DIR}/maxima_longnames.exe" DESTINATION bin/ COMPONENT Maxima)
233 install(DIRECTORY ${CMAKE_BINARY_DIR}/maxima-installroot/${WINDOWS_DRIVELETTER}:/maxima-${MAXIMAVERSION}/
234         DESTINATION . COMPONENT Maxima PATTERN "binary-abcl" EXCLUDE)
235 if(WITH_ABCL)
236     install(DIRECTORY ${CMAKE_BINARY_DIR}/maxima-installroot/${WINDOWS_DRIVELETTER}:/maxima-${MAXIMAVERSION}/
237             DESTINATION . COMPONENT ABCL PATTERN "binary-abcl")
238 endif()
240 install(FILES "${CMAKE_SOURCE_DIR}/xmaxima.bat" DESTINATION bin/ COMPONENT Maxima)
241 install(FILES "${CMAKE_BINARY_DIR}/maxima-prefix/src/maxima/doc/info/maxima.pdf" DESTINATION share/doc/ COMPONENT Maxima)
242 configure_file("${CMAKE_SOURCE_DIR}/lispselector.tcl" "${CMAKE_BINARY_DIR}/lispselector.tcl")
243 install(FILES "${CMAKE_BINARY_DIR}/lispselector.tcl" DESTINATION bin/ COMPONENT Maxima)
244 install(FILES "${CMAKE_SOURCE_DIR}/lispselector.bat" DESTINATION bin/ COMPONENT Maxima)
248 # Include DLLs from the current Mingw environment.
249 install(FILES "${MINGW_LIBSTDCPP}" "${MINGW_LIBGCC}" DESTINATION bin/ COMPONENT Maxima)
251 configure_file("${CMAKE_SOURCE_DIR}/licenses.html" "${CMAKE_BINARY_DIR}/licenses.html")
252 install(FILES "${CMAKE_BINARY_DIR}/licenses.html" DESTINATION share/doc/ COMPONENT Maxima)
255 set(CPACK_GENERATOR "NSIS;ZIP")
256 set(CPACK_PACKAGE_VERSION "${MAXIMAVERSION}")
257 set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Maxima")
258 set(CPACK_PACKAGE_VENDOR "Maxima Team")
259 set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/../README")
260 set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/../COPYING")
261 set(CPACK_PACKAGE_INSTALL_DIRECTORY "maxima-${CPACK_PACKAGE_VERSION}")
262 set(CPACK_NSIS_INSTALL_ROOT "${WINDOWS_DRIVELETTER}:")
263 set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON)
264 set(CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/maxima-icon.bmp")
265 set(CPACK_NSIS_MUI_ICON "${CMAKE_SOURCE_DIR}/../interfaces/xmaxima\\\\maxima-icon.ico")
266 set(CPACK_NSIS_MUI_UNIICON "${CPACK_NSIS_MUI_ICON}")
267 set(CPACK_PACKAGE_EXECUTABLES "..\\\\bin\\\\wxmaxima" "wxMaxima (GUI for Maxima)")
268 set(CPACK_NSIS_URL_INFO_ABOUT "http://maxima.sourceforge.net")
269 set(CPACK_NSIS_MENU_LINKS "bin/maxima.bat" "Maxima (command line)" "bin/xmaxima.bat" "XMaxima (simple GUI)" "http://maxima.sourceforge.net" "About Maxima" "http://wxmaxima-developers.github.io/wxmaxima/" "About wxMaxima" "share/doc/maxima.pdf" "Maxima documentation"  "share/doc/licenses.html" "Maxima and included software licenses" "bin/lispselector.bat" "Configure default LISP for Maxima")
270 set(CPACK_PACKAGE_FILE_NAME "maxima-clisp-sbcl${ABCL_INSTALLER}-${CPACK_PACKAGE_VERSION}-${INSTALLERSUFFIX}")
271 set(CPACK_NSIS_COMPRESSOR "/SOLID lzma")
273 if("${CMAKE_INSTALL_COMPONENT}" STREQUAL "wxMaxima")
274     # include NSIS Plugin
275     set(CPACK_NSIS_EXTRA_PREINSTALL_COMMANDS "!include \\\"${path_to_plugins}\\\\fileassoc.nsh\\\"")
276     #File associations:
277     set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "
278     \\\${registerExtension} \\\"$INSTDIR\\\\bin\\\\wxmaxima.exe\\\" \\\".wxm\\\" \\\"wxMaxima Document\\\"
279     \\\${registerExtension} \\\"$INSTDIR\\\\bin\\\\wxmaxima.exe\\\" \\\".wxmx\\\" \\\"wxMaxima XML Document\\\"
280     \\\${registerExtension} \\\"$INSTDIR\\\\bin\\\\wxmaxima.exe\\\" \\\".mac\\\" \\\"Maxima Batch file\\\"
281     WriteRegStr HKCR \\\".wxmx\\\\ShellNew\\\" \\\"NullFile\\\" \\\"\\\"
282     ")
283     set(CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS "
284     \\\${unregisterExtension} \\\".wxm\\\" \\\"wxMaxima Document\\\"
285     \\\${unregisterExtension} \\\".wxmx\\\" \\\"wxMaxima XML Document\\\"
286     \\\${unregisterExtension} \\\".mac\\\" \\\"Maxima Batch File\\\"
287     DeleteRegKey HKCR \\\".wxmx\\\\ShellNew\\\"
288     ")
289 endif()
291 set(CPACK_NSIS_INSTALLER_MUI_ICON_CODE "
292   !define MUI_WELCOMEFINISHPAGE_BITMAP \\\"${CMAKE_SOURCE_DIR}/maxima-installerimage.bmp\\\"")
293 include(CPack)
295 cpack_add_component(Maxima
296                     DESCRIPTION "The Maxima computer algebra system.\nRequired."
297                     REQUIRED)
299 if(USE_VTK)
300     cpack_add_component(VTK
301                         DESCRIPTION "VTK is an advanced graphic toolkit for draw().\nOptional.")
302 endif()
304 cpack_add_component(Gnuplot
305                     DESCRIPTION "Gnuplot is the main graphic toolkit.\nInstallation is strongly recommended.")
307 cpack_add_component(wxMaxima
308                     DESCRIPTION "wxMaxima is an advanced GUI for Maxima based on wxWidgets.\nInstallation is strongly recommended.")
310 cpack_add_component(Clisp
311                     DESCRIPTION "The CLISP Lisp compiler.\nRequired."
312                     REQUIRED)
314 cpack_add_component(SBCL
315                     DESCRIPTION "The SBCL Lisp compiler.\nRequired."
316                     REQUIRED)
318 cpack_add_component(TclTk
319                     DISPLAY_NAME "Tcl/Tk"
320                     DESCRIPTION "The TCL/TK scripting language.\nRequired."
321                     REQUIRED)
322 if(WITH_ABCL)
323     cpack_add_component(ABCL
324                         DESCRIPTION "The ABCL Lisp compiler.\nA Java installation is required.\nOptional.")
325 endif()