# CMake file for crosscompiling ECL for Windows # Copyright (C) by Wolfgang Dautermann # License GPLv2+: GNU GPL version 2 or later # This is free software: you are free to change and redistribute it. # There is NO WARRANTY, to the extent permitted by law. set(CMAKE_SYSTEM_NAME Windows) set(HOST i686-w64-mingw32) set(CMAKE_C_COMPILER ${HOST}-gcc) set(CMAKE_CXX_COMPILER ${HOST}-g++) set(CMAKE_RC_COMPILER ${HOST}-windres) project(ecl) cmake_minimum_required(VERSION 3.3) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/ ${CMAKE_BINARY_DIR}/) # Allow installation als user, do not allow to change the installation directory file(READ ${CMAKE_ROOT}/Modules/NSIS.template.in MYNSISTEMPLATE) string(REPLACE "RequestExecutionLevel admin" "RequestExecutionLevel user" MYNSISTEMPLATE "${MYNSISTEMPLATE}") string(REPLACE "!insertmacro MUI_PAGE_DIRECTORY" "; page directory disabled: !insertmacro MUI_PAGE_DIRECTORY" MYNSISTEMPLATE "${MYNSISTEMPLATE}") file(WRITE ${CMAKE_BINARY_DIR}/NSIS.template.in "${MYNSISTEMPLATE}") message (STATUS "Copied and patched ${CMAKE_ROOT}/Modules/NSIS.template.in to ${CMAKE_BINARY_DIR}/NSIS.template.in") # If you want to use a updated version of a program, # update the version number and the checksum. # If no further patches are needed, you should get a # updated setup-file automatically. # ECL program version. # The program will be installed in C:\ecl-{ECL_VERSION} # The installer will be called ecl-{ECL_VERSION}.exe set(ECL_VERSION 16.1.3) # Other program versions set(GMPLIB_VERSION 6.1.2) set(TDMGCC_VERSION 5.1.0) # MD5 checksums for the current program versions. set(GMPLIB_MD5 "8ddbb26dc3bd4e2302984debba1406a5") set(ECL_MD5 "204e20f3fa875f1dfab96bfee07ecf60") set(TDMGCC_MD5 "bc95bbdb6c4d4487f96c5c2a4d9c1d77") # download URLs set(ECL_URL "https://common-lisp.net/project/ecl/static/files/release/ecl-16.1.3.tgz") set(GMPLIB_URL "http://gmplib.org/download/gmp/gmp-${GMPLIB_VERSION}.tar.bz2") set(TDMGCC_URL "http://downloads.sourceforge.net/project/tdm-gcc/TDM-GCC%205%20series/${TDMGCC_VERSION}-tdm-1%20SJLJ/gcc-${TDMGCC_VERSION}-tdm-1-core.zip") # Where are libgcc_s_sjlj-1.dll, libstdc++-6.dll and libwinpthread-1.dll? execute_process(COMMAND "${CMAKE_CXX_COMPILER}" -print-file-name=libgcc_s_sjlj-1.dll OUTPUT_VARIABLE MINGW_LIBGCC OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process(COMMAND "${CMAKE_CXX_COMPILER}" -print-file-name=libstdc++-6.dll OUTPUT_VARIABLE MINGW_LIBSTDCPP OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process(COMMAND "${CMAKE_CXX_COMPILER}" -print-file-name=libwinpthread-1.dll OUTPUT_VARIABLE MINGW_LIBWINPTHREAD OUTPUT_STRIP_TRAILING_WHITESPACE) message(STATUS "Found libstdc++-6.dll at ${MINGW_LIBSTDCPP}") message(STATUS "Found libgcc_s_sjlj-1.dll at ${MINGW_LIBGCC}") message(STATUS "Found libwinpthread-1.dll at ${MINGW_LIBWINPTHREAD}") include(ExternalProject) configure_file("${CMAKE_SOURCE_DIR}/CROSS-DPP.tmpl" "${CMAKE_BINARY_DIR}/CROSS-DPP") configure_file("${CMAKE_SOURCE_DIR}/CROSS-COMPILER.tmpl" "${CMAKE_BINARY_DIR}/CROSS-COMPILER") # currently we are building bytecode-only, comment out tdm-gcc: # # GCC for Windows (already a binary package just extract it...) # externalproject_add(tdm-gcc # URL "${TDMGCC_URL}" # DOWNLOAD_DIR ${CMAKE_SOURCE_DIR}/downloads # URL_MD5 ${TDMGCC_MD5} # CONFIGURE_COMMAND "" # BUILD_COMMAND "" # INSTALL_COMMAND "" # ) # install(DIRECTORY ${CMAKE_BINARY_DIR}/tdm-gcc-prefix/src/tdm-gcc/ DESTINATION .) externalproject_add(gmplib-host URL ${GMPLIB_URL} DOWNLOAD_DIR ${CMAKE_SOURCE_DIR}/downloads URL_MD5 ${GMPLIB_MD5} CONFIGURE_COMMAND ${CMAKE_BINARY_DIR}/gmplib-host-prefix/src/gmplib-host/configure CFLAGS=-m32 LDFLAGS=-m32 ABI=32 --enable-shared=no --prefix=${CMAKE_BINARY_DIR}/gmplib-host-root BUILD_COMMAND $(MAKE) COMMAND $(MAKE) install INSTALL_COMMAND "" ) externalproject_add(gmplib URL ${GMPLIB_URL} DOWNLOAD_DIR ${CMAKE_SOURCE_DIR}/downloads URL_MD5 ${GMPLIB_MD5} CONFIGURE_COMMAND ${CMAKE_BINARY_DIR}/gmplib-prefix/src/gmplib/configure CFLAGS=-m32 LDFLAGS=-m32 ABI=32 --host=${HOST} --enable-shared=no --prefix=${CMAKE_BINARY_DIR}/gmplib-root BUILD_COMMAND $(MAKE) COMMAND $(MAKE) install INSTALL_COMMAND "" ) externalproject_add(ecl-host URL ${ECL_URL} DOWNLOAD_DIR ${CMAKE_SOURCE_DIR}/downloads URL_MD5 ${ECL_MD5} DEPENDS gmplib-host BUILD_IN_SOURCE 1 CONFIGURE_COMMAND ./configure CFLAGS=-m32 LDFLAGS=-m32 ABI=32 --disable-longdouble --enable-libatomic=included --enable-gmp=system --with-gmp-prefix=${CMAKE_BINARY_DIR}/gmplib-host-root --prefix=${CMAKE_BINARY_DIR}/ecl-host --with-cmp=no BUILD_COMMAND $(MAKE) INSTALL_COMMAND $(MAKE) install ) list(APPEND CMAKE_PROGRAM_PATH "${CMAKE_BINARY_DIR}/ecl-host/bin") # currently we are building bytecode-only: # compiler-patch not used, configure option --with-cmp=no used externalproject_add(ecl URL ${ECL_URL} DOWNLOAD_DIR ${CMAKE_SOURCE_DIR}/downloads URL_MD5 ${ECL_MD5} DEPENDS ecl-host gmplib BUILD_IN_SOURCE 1 CONFIGURE_COMMAND ./configure --host=${HOST} --prefix=C:/ecl-${ECL_VERSION} --enable-libatomic=included --with-cross-config=${CMAKE_SOURCE_DIR}/i686-w64-mingw32.cross_config --enable-gmp=system --with-gmp-prefix=${CMAKE_BINARY_DIR}/gmplib-root --with-cmp=no BUILD_COMMAND cp ${CMAKE_BINARY_DIR}/CROSS-DPP ${CMAKE_BINARY_DIR}/ecl-prefix/src/ecl/build/CROSS-DPP COMMAND chmod +x ${CMAKE_BINARY_DIR}/ecl-prefix/src/ecl/build/CROSS-DPP COMMAND cp ${CMAKE_BINARY_DIR}/CROSS-COMPILER ${CMAKE_BINARY_DIR}/ecl-prefix/src/ecl/build/CROSS-COMPILER COMMAND chmod +x ${CMAKE_BINARY_DIR}/ecl-prefix/src/ecl/build/CROSS-COMPILER COMMAND $(MAKE) INSTALL_COMMAND $(MAKE) install ) install(DIRECTORY ${CMAKE_BINARY_DIR}/ecl-prefix/src/ecl/build/C:/ecl-${ECL_VERSION}/ DESTINATION .) # Include DLLs from the current Mingw environment. install(FILES "${MINGW_LIBSTDCPP}" "${MINGW_LIBGCC}" "${MINGW_LIBWINPTHREAD}" DESTINATION .) set(CPACK_GENERATOR "NSIS") set(CPACK_PACKAGE_VERSION "${ECL_VERSION}") set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Embeddable Common Lisp") set(CPACK_PACKAGE_VENDOR "ECL Team") set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README.md") set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/COPYING") set(CPACK_PACKAGE_INSTALL_DIRECTORY "ecl-${ECL_VERSION}") set(CPACK_NSIS_INSTALL_ROOT "C:") set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON) set(CPACK_PACKAGE_EXECUTABLES "..\\\\ecl" "Embeddable Common Lisp") set(CPACK_NSIS_URL_INFO_ABOUT "https://common-lisp.net/project/ecl/") set(CPACK_NSIS_MENU_LINKS "https://common-lisp.net/project/ecl/" "About ECL" "https://common-lisp.net/project/ecl/static/manual/" "ECL Manual" ) set(CPACK_PACKAGE_FILE_NAME "ecl-${CPACK_PACKAGE_VERSION}") include(CPack)