Skip to content

Commit

Permalink
Merge aa29cc1 into 18fb385
Browse files Browse the repository at this point in the history
  • Loading branch information
dbrnz committed Oct 16, 2019
2 parents 18fb385 + aa29cc1 commit 86fa48f
Show file tree
Hide file tree
Showing 157 changed files with 10,671 additions and 474 deletions.
164 changes: 150 additions & 14 deletions CMakeLists.txt
Expand Up @@ -31,6 +31,7 @@ option(USE_PREBUILT_LLVMCLANG_PACKAGE "Use the pre-built version of the LLVMClan
option(USE_PREBUILT_OAUTH_PACKAGE "Use the pre-built version of the OAuth package" ON)
option(USE_PREBUILT_OPENSSL_PACKAGE "Use the pre-built version of the OpenSSL package" ON)
option(USE_PREBUILT_PYTHON_PACKAGES_PACKAGE "Use the pre-built version of various Python packages" ON)
option(USE_PREBUILT_PYTHONQT_PACKAGE "Use the pre-built version of the PythonQt package" ON)
option(USE_PREBUILT_QSCINTILLA_PACKAGE "Use the pre-built version of the QScintilla package" ON)
option(USE_PREBUILT_QWT_PACKAGE "Use the pre-built version of the Qwt package" ON)
option(USE_PREBUILT_SUNDIALS_PACKAGE "Use the pre-built version of the SUNDIALS package" ON)
Expand Down Expand Up @@ -272,6 +273,11 @@ endif()

set(PLATFORM_DIR ${PLATFORM})

# Location of our distribution files

set(DISTRIB_DIR ${CMAKE_SOURCE_DIR}/distrib)
set(PLATFORM_DISTRIB_DIR ${DISTRIB_DIR}/${PLATFORM})

# Default location of external binaries and packages

if(WIN32)
Expand Down Expand Up @@ -368,8 +374,8 @@ if(USE_PREBUILT_PYTHON_AND_QTWEBKIT_PACKAGES)
if(WIN32)
set(ICU_VERSION 57)
elseif(NOT APPLE)
add_subdirectory(${CMAKE_SOURCE_DIR}/distrib/linux/icu)
add_subdirectory(${CMAKE_SOURCE_DIR}/distrib/linux/mesa)
add_subdirectory(${PLATFORM_DISTRIB_DIR}/icu)
add_subdirectory(${PLATFORM_DISTRIB_DIR}/mesa)
endif()
endif()

Expand Down Expand Up @@ -620,6 +626,13 @@ configure_file(${CMAKE_SOURCE_DIR}/res/common.qrc.in
configure_file(${CMAKE_SOURCE_DIR}/res/i18n.qrc.in
${I18N_QRC_FILENAME})

# The Python interface depends on Python headers, so we only include it if we
# are using the prebuilt version of our Python and QtWebKit packages

if(USE_PREBUILT_PYTHON_AND_QTWEBKIT_PACKAGES)
set(PYTHON_INTERFACE_FILENAME src/plugins/pythoninterface.cpp)
endif()

# Files that make up the GUI version of OpenCOR

set(SOURCES
Expand Down Expand Up @@ -648,6 +661,7 @@ set(SOURCES
src/plugins/plugininterface.cpp
src/plugins/pluginmanager.cpp
src/plugins/preferencesinterface.cpp
${PYTHON_INTERFACE_FILENAME}
src/plugins/solverinterface.cpp
src/plugins/viewinterface.cpp
src/plugins/windowinterface.cpp
Expand Down Expand Up @@ -685,6 +699,7 @@ if(WIN32)
src/plugins/plugininfo.cpp
src/plugins/plugininterface.cpp
src/plugins/pluginmanager.cpp
${PYTHON_INTERFACE_FILENAME}
src/plugins/solverinterface.cpp

src/windows/main.cpp
Expand Down Expand Up @@ -865,6 +880,7 @@ if(USE_PREBUILT_QTWEBKIT_PACKAGE)
list(APPEND PLUGINS
thirdParty/libSBML
thirdParty/PythonPackages
thirdParty/PythonQtAPI

dataStore/BioSignalMLDataStore
dataStore/CSVDataStore
Expand All @@ -882,6 +898,9 @@ if(USE_PREBUILT_QTWEBKIT_PACKAGE)
miscellaneous/Compiler
miscellaneous/Core
miscellaneous/HelpWindow
miscellaneous/JupyterKernel
miscellaneous/PythonConsoleWindow
miscellaneous/PythonShell
miscellaneous/WebBrowserWindow

organisation/FileBrowserWindow
Expand All @@ -901,6 +920,8 @@ if(USE_PREBUILT_QTWEBKIT_PACKAGE)
support/CellMLSupport
support/COMBINESupport
support/PMRSupport
support/PythonSupport
support/PythonQtSupport
support/SEDMLSupport
support/SimulationSupport
support/StandardSupport
Expand Down Expand Up @@ -958,6 +979,10 @@ if(USE_PREBUILT_QTWEBKIT_PACKAGE)
add_definitions(-DENABLE_TEST_PLUGINS)
endif()

# Let OpenCOR know that we want Python support

add_definitions(-DPYTHON_SUPPORT)

# Let OpenCOR know about the prebuilt version of our QtWebKit package
# being used

Expand Down Expand Up @@ -1023,6 +1048,7 @@ configure_clang_and_clang_tidy(${CMAKE_PROJECT_NAME})
if(WIN32)
target_link_libraries(${CMAKE_PROJECT_NAME}
${Qt5Core_QTMAIN_LIBRARIES}
${PYTHON_LIBRARY}
)
endif()

Expand All @@ -1032,6 +1058,27 @@ foreach(REQUIRED_QT_MODULE ${REQUIRED_QT_MODULES})
)
endforeach()

# We can't compile Python interface code until after the Python headers are in
# place

if(NOT "${PYTHON_DEPENDENCIES}" STREQUAL "")
add_dependencies(${CMAKE_PROJECT_NAME} ${PYTHON_DEPENDENCIES})
endif()

# On Linux, the Python package needs to be directly linked to the executable
# otherwise extension DSOs (which are loaded using dlopen()) can't find symbols
# (see https://www.akkadia.org/drepper/dsohowto.pdf for details)

if(NOT WIN32 AND NOT APPLE)
include_directories(${PYTHON_INCLUDE_DIR})

target_link_libraries(${CMAKE_PROJECT_NAME}
${PYTHON_LIBRARY}
)

add_dependencies(${CMAKE_PROJECT_NAME} PythonPlugin)
endif()

# Build the CLI version of OpenCOR (Windows specific)
# Note: when it comes to WINDOWS_CLI_PROJECT_NAME, we used to have it set to
# ${CMAKE_PROJECT_NAME}.com, but Ninja found a duplicate rule (from a copy
Expand All @@ -1054,7 +1101,12 @@ if(WIN32)
target_link_libraries(${WINDOWS_CLI_PROJECT_NAME}
Qt5::Core
Qt5::Network
${PYTHON_LIBRARY}
)

if(NOT "${PYTHON_DEPENDENCIES}" STREQUAL "")
add_dependencies(${WINDOWS_CLI_PROJECT_NAME} ${PYTHON_DEPENDENCIES})
endif()
endif()

# Some post-processing specific stuff
Expand All @@ -1067,8 +1119,7 @@ if(APPLE)

set(INFO_PLIST_FILENAME ${PROJECT_BUILD_DIR}/Info.plist)

configure_file(${CMAKE_SOURCE_DIR}/distrib/macos/Info.plist.in
${INFO_PLIST_FILENAME})
configure_file(${PLATFORM_DISTRIB_DIR}/Info.plist.in ${INFO_PLIST_FILENAME})

set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES
MACOSX_BUNDLE_INFO_PLIST ${INFO_PLIST_FILENAME}
Expand Down Expand Up @@ -1198,7 +1249,7 @@ endif()
set(CPACK_PACKAGE_NAME "${CMAKE_PROJECT_NAME}")
set(CPACK_PACKAGE_CONTACT "Team OpenCOR (team@opencor.ws)")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${PROJECT_DESCRIPTION}")
set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/distrib/readMe.txt")
set(CPACK_PACKAGE_DESCRIPTION_FILE "${DISTRIB_DIR}/readMe.txt")
set(CPACK_PACKAGE_INSTALL_DIRECTORY "${CMAKE_PROJECT_NAME}")
set(CPACK_PACKAGE_EXECUTABLES "${CMAKE_PROJECT_NAME}" "${CMAKE_PROJECT_NAME}")
set(CPACK_PACKAGE_VENDOR "Physiome Project")
Expand Down Expand Up @@ -1273,16 +1324,46 @@ if(WIN32)
set(BAT_FILENAME "${PROJECT_BUILD_DIR}/${CMAKE_PROJECT_NAME}.bat")
set(VBS_FILENAME "${PROJECT_BUILD_DIR}/${CMAKE_PROJECT_NAME}.vbs")

configure_file(${CMAKE_SOURCE_DIR}/distrib/windows/application.bat.in
${BAT_FILENAME})
configure_file(${CMAKE_SOURCE_DIR}/distrib/windows/application.vbs.in
${VBS_FILENAME})
configure_file(${PLATFORM_DISTRIB_DIR}/application.bat.in ${BAT_FILENAME})
configure_file(${PLATFORM_DISTRIB_DIR}/application.vbs.in ${VBS_FILENAME})

install(FILES ${BAT_FILENAME}
DESTINATION .)
install(FILES ${VBS_FILENAME}
DESTINATION .)

# Python runtime libraries and utilities

install(DIRECTORY ${PROJECT_BUILD_DIR}/Python
DESTINATION .)

# Batch files to setup and run Python and Jupyter

set(IPYTHON_CONSOLE_FILENAME "${PROJECT_BUILD_DIR}/ipythonconsole.bat")
set(RUN_PYTHON_FILENAME "${PROJECT_BUILD_DIR}/runpython.bat")

configure_file(${PLATFORM_DISTRIB_DIR}/ipythonconsole.bat.in ${IPYTHON_CONSOLE_FILENAME})
copy_file_to_build_dir(DIRECT ${PLATFORM_DISTRIB_DIR} . jupyterlab.bat)
copy_file_to_build_dir(DIRECT ${PLATFORM_DISTRIB_DIR} . jupyterlab.vbs)
copy_file_to_build_dir(DIRECT ${PLATFORM_DISTRIB_DIR} . jupyternotebook.bat)
copy_file_to_build_dir(DIRECT ${PLATFORM_DISTRIB_DIR} . jupyternotebook.vbs)
copy_file_to_build_dir(DIRECT ${PLATFORM_DISTRIB_DIR} . runjupyter.bat)
configure_file(${PLATFORM_DISTRIB_DIR}/runpython.bat.in ${RUN_PYTHON_FILENAME})
copy_file_to_build_dir(DIRECT ${PLATFORM_DISTRIB_DIR} . setpythonpath.bat)

install(FILES ${IPYTHON_CONSOLE_FILENAME}
${PLATFORM_DISTRIB_DIR}/jupyterlab.bat
${PLATFORM_DISTRIB_DIR}/jupyterlab.vbs
${PLATFORM_DISTRIB_DIR}/jupyternotebook.bat
${PLATFORM_DISTRIB_DIR}/jupyternotebook.vbs
${PLATFORM_DISTRIB_DIR}/runjupyter.bat
${RUN_PYTHON_FILENAME}
${PLATFORM_DISTRIB_DIR}/setpythonpath.bat
DESTINATION .)

install(FILES ${PLATFORM_DISTRIB_DIR}/start_jupyter.py
DESTINATION ./Python/Scripts)

# File type association
# Note: the calls to SHChangeNotify are to ensure that Windows refreshes
# file icons (so that it is clear to the user that an extension has
Expand All @@ -1299,6 +1380,12 @@ if(WIN32)
\\\${UnregisterExtension} \\\".cellml\\\" \\\"CellML File\\\"
System::Call \\\"Shell32::SHChangeNotify(i 0x08000000, i 0, i 0, i 0)\\\"
")

# Update Python scripts to refer to our installed Python

set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS
"${CPACK_NSIS_EXTRA_INSTALL_COMMANDS} Exec '\\\"\\\$INSTDIR\\\\Python\\\\bin\\\\python.exe\\\" \\\"\\\$INSTDIR\\\\Python\\\\Scripts\\\\setpythonpath.py\\\" \\\"\\\$INSTDIR\\\\Python\\\" -s'
")
endif()
elseif(APPLE)
# Select PackageMaker and ZIP as the packagers on macOS
Expand All @@ -1308,8 +1395,8 @@ elseif(APPLE)

set(CPACK_SYSTEM_NAME "macOS")

set(CPACK_RESOURCE_FILE_WELCOME "${CMAKE_SOURCE_DIR}/distrib/macos/welcome.txt")
set(CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/distrib/readMe.txt")
set(CPACK_RESOURCE_FILE_WELCOME "${PLATFORM_DISTRIB_DIR}/welcome.txt")
set(CPACK_RESOURCE_FILE_README "${DISTRIB_DIR}/readMe.txt")
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE.txt")

set(CPACK_SET_DESTDIR TRUE)
Expand All @@ -1322,13 +1409,35 @@ elseif(APPLE)

set(SH_FILENAME ${PROJECT_BUILD_DIR}/${CMAKE_PROJECT_NAME}.sh)

configure_file(${CMAKE_SOURCE_DIR}/distrib/macos/application.sh.in
${SH_FILENAME} @ONLY)
configure_file(${PLATFORM_DISTRIB_DIR}/application.sh.in ${SH_FILENAME} @ONLY)

install(FILES ${SH_FILENAME}
DESTINATION .
RENAME ${CMAKE_PROJECT_NAME}
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)

# Shell scripts to setup and run Python and Jupyter

set(IPYTHON_CONSOLE_FILENAME ${PROJECT_BUILD_DIR}/ipythonconsole.sh)
set(RUN_JUPYTER_FILENAME ${PROJECT_BUILD_DIR}/runjupyter.sh)
set(RUN_PYTHON_FILENAME ${PROJECT_BUILD_DIR}/runpython.sh)
set(SET_PYTHON_PATH_FILENAME ${PROJECT_BUILD_DIR}/setpythonpath.sh)

configure_file(${PLATFORM_DISTRIB_DIR}/ipythonconsole.sh.in ${IPYTHON_CONSOLE_FILENAME} @ONLY)
copy_file_to_build_dir(DIRECT ${PLATFORM_DISTRIB_DIR} . jupyterlab.sh)
copy_file_to_build_dir(DIRECT ${PLATFORM_DISTRIB_DIR} . jupyternotebook.sh)
configure_file(${PLATFORM_DISTRIB_DIR}/runjupyter.sh.in ${RUN_JUPYTER_FILENAME} @ONLY)
configure_file(${PLATFORM_DISTRIB_DIR}/runpython.sh.in ${RUN_PYTHON_FILENAME} @ONLY)
configure_file(${PLATFORM_DISTRIB_DIR}/setpythonpath.sh.in ${SET_PYTHON_PATH_FILENAME} @ONLY)

install(FILES ${IPYTHON_CONSOLE_FILENAME}
${PLATFORM_DISTRIB_DIR}/jupyterlab.sh
${PLATFORM_DISTRIB_DIR}/jupyternotebook.sh
${RUN_JUPYTER_FILENAME}
${RUN_PYTHON_FILENAME}
${SET_PYTHON_PATH_FILENAME}
DESTINATION .
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
else()
# Select TGZ as the packager on Linux

Expand Down Expand Up @@ -1388,13 +1497,40 @@ else()

set(SH_FILENAME ${PROJECT_BUILD_DIR}/${CMAKE_PROJECT_NAME}.sh)

configure_file(${CMAKE_SOURCE_DIR}/distrib/linux/application.sh.in
configure_file(${PLATFORM_DISTRIB_DIR}/application.sh.in
${SH_FILENAME} @ONLY)

install(FILES ${SH_FILENAME}
DESTINATION .
RENAME ${CMAKE_PROJECT_NAME}
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)

# Python runtime libraries and utilities

install(DIRECTORY ${PROJECT_BUILD_DIR}/python
DESTINATION .
USE_SOURCE_PERMISSIONS)

# Shell scripts to setup and run Python and Jupyter

set(IPYTHON_CONSOLE_FILENAME ${PROJECT_BUILD_DIR}/ipythonconsole.sh)
set(RUN_PYTHON_FILENAME ${PROJECT_BUILD_DIR}/runpython.sh)

configure_file(${PLATFORM_DISTRIB_DIR}/ipythonconsole.sh.in ${IPYTHON_CONSOLE_FILENAME} @ONLY)
copy_file_to_build_dir(DIRECT ${PLATFORM_DISTRIB_DIR} . jupyterlab.sh)
copy_file_to_build_dir(DIRECT ${PLATFORM_DISTRIB_DIR} . jupyternotebook.sh)
copy_file_to_build_dir(DIRECT ${PLATFORM_DISTRIB_DIR} . runjupyter.sh)
configure_file(${PLATFORM_DISTRIB_DIR}/runpython.sh.in ${RUN_PYTHON_FILENAME} @ONLY)
copy_file_to_build_dir(DIRECT ${PLATFORM_DISTRIB_DIR} . setpythonpath.sh)

install(FILES ${IPYTHON_CONSOLE_FILENAME}
${PLATFORM_DISTRIB_DIR}/jupyterlab.sh
${PLATFORM_DISTRIB_DIR}/jupyternotebook.sh
${PLATFORM_DISTRIB_DIR}/runjupyter.sh
${RUN_PYTHON_FILENAME}
${PLATFORM_DISTRIB_DIR}/setpythonpath.sh
DESTINATION .
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
endif()

# Specify the package file name, depending on whether we are generating a
Expand Down

0 comments on commit 86fa48f

Please sign in to comment.