Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ jobs:
glm `
libpng `
libxml2 `
libnetcdf `
libnetcdf

- name: Get additional sources
run: |
Expand All @@ -100,7 +100,6 @@ jobs:
Copy-Item -Recurse -Path mmtf-cpp/include\* -Destination "$env:CONDA_PREFIX\Library\include"
git clone --depth 1 --single-branch --branch cpp_master https://github.com/msgpack/msgpack-c.git
Copy-Item -Recurse -Path msgpack-c/include\* -Destination "$env:CONDA_PREFIX\Library\include"
dir $env:CONDA_PREFIX\Library\include

- name: Build PyMOL
run: |
Expand Down
52 changes: 38 additions & 14 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,31 +1,55 @@
cmake_minimum_required(VERSION 3.13)
cmake_minimum_required(VERSION 3.15)

project(${TARGET_NAME})

set(CMAKE_VERBOSE_MAKEFILE on)
set(Python_FIND_VIRTUALENV FIRST)
set(Python_FIND_STRATEGY LOCATION)

add_library(${TARGET_NAME} SHARED ${ALL_SRC})

target_compile_options(${TARGET_NAME} PRIVATE ${ALL_COMP_ARGS})
foreach(FOLDER_NAME IN ITEMS layer0 layer1 layer2 layer3 layer4 layer5 ov)
include(${CMAKE_CURRENT_SOURCE_DIR}/${FOLDER_NAME}/sources.cmake)
endforeach()

set_target_properties(${TARGET_NAME} PROPERTIES SUFFIX ${SHARED_SUFFIX})
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
include(Helpers)
include(Dependencies)
# Darwin, Windows, Linux
include(platform/${CMAKE_SYSTEM_NAME})
# MSVC, GCC, Clang
include(compiler/${CMAKE_CXX_COMPILER_FRONTEND_VARIANT})

target_compile_features(${TARGET_NAME} PRIVATE cxx_std_17)

set_target_properties(${TARGET_NAME} PROPERTIES PREFIX "")
target_compile_options(${TARGET_NAME} PRIVATE
${PYMOL_COMPILE_OPTIONS}
)

target_include_directories(${TARGET_NAME} PUBLIC ${ALL_INC_DIR})
execute_process(
COMMAND ${Python_EXECUTABLE} -c "import sysconfig; print(sysconfig.get_config_var('EXT_SUFFIX'))"
OUTPUT_VARIABLE PYTHON_MODULE_SUFFIX
OUTPUT_STRIP_TRAILING_WHITESPACE
)

target_link_directories(${TARGET_NAME} PUBLIC ${ALL_LIB_DIR})
set_output_path(${TARGET_NAME} "${Python_SITEARCH}/pymol")

target_compile_features(${TARGET_NAME} PRIVATE cxx_std_17)

if(APPLE)
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -undefined dynamic_lookup")
endif()
target_include_directories(${TARGET_NAME} PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/include
${CMAKE_CURRENT_SOURCE_DIR}/contrib/pocketfft
${ALL_INC_DIR}
${Python_INCLUDE_DIRS}
${Python_NumPy_INCLUDE_DIRS}
${PYMOL_INC_DIRS}
)

target_link_libraries(${TARGET_NAME}
${ALL_LIB}
${ALL_EXT_LINK}
${PYMOL_LIBS}
)

target_compile_definitions(${TARGET_NAME} PUBLIC
${PYMOL_DEF_MACROS}
_PYMOL_NUMPY
)

target_compile_definitions(${TARGET_NAME} PUBLIC ${ALL_DEF})
add_subdirectory(contrib/champ)
2 changes: 1 addition & 1 deletion INSTALL
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ See also: http://pymolwiki.org/index.php/Linux_Install
REQUIREMENTS

- C++17 compiler (e.g. gcc 8+)
- CMake (3.13+)
- CMake (3.15+)
- Python 3.9+
- pip (with build submodule <pip install build>; conda's package name is python-build)
- Pmw (Python Megawidgets) (optional, for legacy GUI/plugins)
Expand Down
56 changes: 56 additions & 0 deletions cmake/Dependencies.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
include_guard()

set(PYMOL_DEF_MACROS "")
set(PYMOL_INC_DIRS "")
set(PYMOL_LIBS "")
set(PYMOL_COMPILE_OPTIONS "")

if(DEFINED ENV{CONDA_PREFIX})

set(CONDA_PREFIX $ENV{CONDA_PREFIX})
message(STATUS "Found Conda prefix: ${CONDA_PREFIX}")

if(WIN32)
set(CONDA_LIBRARY_DIR ${CONDA_PREFIX}/Library/lib)
set(CONDA_INCLUDE_DIR ${CONDA_PREFIX}/Library/include)
set(CONDA_CMAKE_DIR ${CONDA_PREFIX}/Library/lib/cmake)
else()
set(CONDA_LIBRARY_DIR ${CONDA_PREFIX}/lib)
set(CONDA_INCLUDE_DIR ${CONDA_PREFIX}/include)
set(CONDA_CMAKE_DIR ${CONDA_PREFIX}/lib/cmake)
endif()

list(APPEND CMAKE_PREFIX_PATH ${CONDA_PREFIX} ${CONDA_CMAKE_DIR})
list(APPEND CMAKE_LIBRARY_PATH ${CONDA_LIBRARY_DIR})
list(APPEND CMAKE_INCLUDE_PATH ${CONDA_INCLUDE_DIR})

endif()

find_package(Python REQUIRED COMPONENTS Interpreter Development NumPy)
include(dependencies/Freetype)
include(dependencies/Png)

include(dependencies/GL)
if(PYMOL_LIBXML2)
include(dependencies/XML2)
endif()
if(PYMOL_USE_OPENMP)
include(dependencies/OpenMP)
endif()
if(PYMOL_TESTING)
include(dependencies/Testing)
endif()
if(PYMOL_OPENVR)
include(dependencies/OpenVR)
endif()
if(PYMOL_VMD_PLUGINS)
include(dependencies/VMDPlugins)
endif()
if(PYMOL_USE_VTKM)
include(dependencies/VTKM)
endif()
if(PYMOL_USE_MSGPACKC)
include(dependencies/MsgPack)
else()
list(APPEND PYMOL_DEF_MACROS "_PYMOL_NO_MSGPACKC")
endif()
19 changes: 19 additions & 0 deletions cmake/Helpers.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
include_guard()

function(set_output_path lib path)
set_target_properties(${lib} PROPERTIES
PREFIX ""
SUFFIX "${PYTHON_MODULE_SUFFIX}"
OUTPUT_NAME "${lib}"
LIBRARY_OUTPUT_DIRECTORY "${path}"
RUNTIME_OUTPUT_DIRECTORY "${path}"
)

foreach(CONFIG IN ITEMS RELEASE DEBUG RELWITHDEBINFO MINSIZEREL)
set_target_properties(${lib} PROPERTIES
LIBRARY_OUTPUT_DIRECTORY_${CONFIG} "${path}"
RUNTIME_OUTPUT_DIRECTORY_${CONFIG} "${path}"
)
endforeach()
endfunction()

1 change: 1 addition & 0 deletions cmake/compiler/Clang.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
include(compiler/GCC)
14 changes: 14 additions & 0 deletions cmake/compiler/GNU.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
target_compile_options(${TARGET_NAME} PRIVATE
-Werror=return-type
-Wunused-variable
-Wno-switch
-Wno-narrowing
-Wno-char-subscripts
$<$<CONFIG:Debug>:-Og>
$<$<NOT:$<CONFIG:Debug>>:-O3>
)

target_compile_definitions(${TARGET_NAME} PUBLIC
# bounds checking in STL containers
$<$<CONFIG:Debug>:_GLIBCXX_ASSERTIONS>
)
10 changes: 10 additions & 0 deletions cmake/compiler/MSVC.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
target_compile_options(${TARGET_NAME} PRIVATE
/MP
/std:c++17
$<$<CONFIG:Debug>:/Z7>
)

target_link_libraries(${TARGET_NAME}
# pyconfig.py forces linking against pythonXY.lib on MSVC
$<$<CONFIG:Debug>:/DEBUG>
)
4 changes: 4 additions & 0 deletions cmake/dependencies/Freetype.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
find_package(Freetype REQUIRED)

list(APPEND PYMOL_LIBS Freetype::Freetype)
list(APPEND PYMOL_DEF_MACROS "_PYMOL_FREETYPE")
34 changes: 34 additions & 0 deletions cmake/dependencies/GL.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
if(NOT PYMOL_GLUT)
list(APPEND PYMOL_DEF_MACROS "_PYMOL_NO_MAIN")
endif()

find_package(GLEW REQUIRED)
list(APPEND PYMOL_LIBS GLEW::GLEW)

if(APPLE)
if(PYMOL_OSX_FRAMEWORKS)
list(APPEND PYMOL_LINK_OPTIONS "-framework OpenGL")
if(GLUT)
list(APPEND PYMOL_LINK_OPTIONS "-framework GLUT")
endif()
list(APPEND PYMOL_DEF_MACROS "_PYMOL_OSX")
else()
list(APPEND PYMOL_LIBS "GL")
if(GLUT)
list(APPEND PYMOL_LIBS "glut")
endif()
endif()

elseif(WIN32)
list(APPEND PYMOL_LIBS "Advapi32" "Ws2_32" "opengl32")

if(PYMOL_GLUT)
list(APPEND PYMOL_LIBS "freeglut")
endif()

else()
list(APPEND PYMOL_LIBS "GL")
if(GLUT)
list(APPEND PYMOL_LIBS "glut")
endif()
endif()
69 changes: 69 additions & 0 deletions cmake/dependencies/MsgPack.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
if(PYMOL_USE_MSGPACKC STREQUAL "guess")

find_path(
MSGPACK_CXX_INCLUDE_DIR
NAMES msgpack.hpp
HINTS ${CONDA_INCLUDE_DIR})

if(MSGPACK_CXX_INCLUDE_DIR)
message(STATUS "Found msgpack C++11 headers: ${MSGPACK_CXX_INCLUDE_DIR}")
set(PYMOL_USE_MSGPACKC "c++11")
else()

find_path(
MSGPACK_INCLUDE_DIR
NAMES msgpack.h
HINTS ${CONDA_INCLUDE_DIR})

if(MSGPACK_INCLUDE_DIR)
message(STATUS "Found msgpack C headers: ${MSGPACK_INCLUDE_DIR}")
set(PYMOL_USE_MSGPACKC "c")

else()
message(
FATAL_ERROR
"Could not auto-detect msgpack. Please specify PYMOL_USE_MSGPACKC as 'c' or 'c++11'"
)
endif()

endif()
endif()

if(PYMOL_USE_MSGPACKC STREQUAL "c++11")
list(APPEND PYMOL_DEF_MACROS "MMTF_MSGPACK_USE_CPP11" "MSGPACK_NO_BOOST")

find_path(
MSGPACK_CXX_INCLUDE_DIR
NAMES msgpack.hpp
HINTS ${CONDA_INCLUDE_DIR})

if(NOT MSGPACK_CXX_INCLUDE_DIR)
message(FATAL_ERROR "msgpack C++11 headers not found")
endif()

list(APPEND PYMOL_INC_DIRS ${MSGPACK_CXX_INCLUDE_DIR})

elseif(PYMOL_USE_MSGPACKC STREQUAL "c")
find_path(
MSGPACK_INCLUDE_DIR
NAMES msgpack.h
HINTS ${CONDA_INCLUDE_DIR})

find_library(
MSGPACK_LIBRARY
NAMES msgpack msgpackc msgpack-c
HINTS ${CONDA_LIBRARY_DIR})

if(NOT MSGPACK_INCLUDE_DIR OR NOT MSGPACK_LIBRARY)
message(FATAL_ERROR "msgpack C library not found")
endif()

list(APPEND PYMOL_INC_DIRS ${MSGPACK_INCLUDE_DIR})
list(APPEND PYMOL_LIBS ${MSGPACK_LIBRARY})

else()
message(ERROR "Unknow value for PYMOL_USE_MSGPACKC key")

endif()

include(${PROJECT_SOURCE_DIR}/contrib/mmtf-c/sources.cmake)
28 changes: 28 additions & 0 deletions cmake/dependencies/OpenMP.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
find_package(OpenMP)
list(APPEND PYMOL_DEF_MACROS "PYMOL_OPENMP")

if(OpenMP_C_FOUND)
list(APPEND PYMOL_COMPILE_OPTIONS_C ${OpenMP_C_FLAGS})
list(APPEND PYMOL_LIBS ${OpenMP_C_LIBRARIES})
endif()

if(OpenMP_CXX_FOUND)
list(APPEND PYMOL_COMPILE_OPTIONS_CXX ${OpenMP_CXX_FLAGS})
if(OpenMP_CXX_LIBRARIES AND NOT OpenMP_CXX_LIBRARIES STREQUAL
OpenMP_C_LIBRARIES)
list(APPEND PYMOL_LIBS ${OpenMP_CXX_LIBRARIES})
endif()
endif()

if(APPLE)
list(APPEND PYMOL_COMPILE_OPTIONS "-Xpreprocessor" "-fopenmp")
list(APPEND PYMOL_LIBS "omp")

elseif(WIN32)
list(APPEND PYMOL_COMPILE_OPTIONS "/openmp")

else()
list(APPEND PYMOL_COMPILE_OPTIONS "-fopenmp")
list(APPEND PYMOL_LINK_OPTIONS "-fopenmp")

endif()
5 changes: 5 additions & 0 deletions cmake/dependencies/OpenVR.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
find_package(OpenVR REQUIRED)

include(${PROJECT_SOURCE_DIR}/contrib/vr/sources.cmake)
list(APPEND PYMOL_LIBS OpenVR::OpenVR)
list(APPEND PYMOL_DEF_MACROS "_PYMOL_OPENVR")
13 changes: 13 additions & 0 deletions cmake/dependencies/Optians.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
option(PYMOL_GLUT "Disable GLUT" OFF)
option(PYMOL_LIBXML2 "Enable LIBXML2 support" OFF)
option(PYMOL_OSX_FRAMEWORKS "Enable XQuartz instead of native frameworks" ON)
option(PYMOL_USE_OPENMP "Enable OpenMP support" ON)
option(PYMOL_TESTING "Build C-level tests" OFF)
option(PYMOL_OPENVR "Enable openvr support" OFF)
option(PYMOL_VMD_PLUGINS "Disable VMD molfile plugins (libnetcdf dependency)"
ON)
option(PYMOL_USE_VTKM "Use VTK-m for isosurface generation" OFF)
option(
PYMOL_USE_MSGPACKC
"c++11: use msgpack-c header-only library; c: link against shared library; no: disable fast MMTF load support"
ON)
4 changes: 4 additions & 0 deletions cmake/dependencies/Png.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
find_package(PNG REQUIRED)

list(APPEND PYMOL_LIBS PNG::PNG)
list(APPEND PYMOL_DEF_MACROS "_PYMOL_LIBPNG")
5 changes: 5 additions & 0 deletions cmake/dependencies/Testing.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
find_package(Catch2 REQUIRED)

include(${PROJECT_SOURCE_DIR}/layerCTest/sources.cmake)
list(APPEND PYMOL_LIBS Catch2::Catch2)
list(APPEND PYMOL_DEF_MACROS "_PYMOL_CTEST")
18 changes: 18 additions & 0 deletions cmake/dependencies/VMDPlugins.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
find_package(NetCDF MODULE QUIET)

if(NetCDF_FOUND)
list(APPEND PYMOL_LIBS NetCDF::NetCDF)
else()
find_library(NETCDF_LIB NAMES netcdf)
find_path(NETCDF_INCLUDE_DIR NAMES netcdf.h)

if(NETCDF_LIB AND NETCDF_INCLUDE_DIR)
list(APPEND PYMOL_LIBS ${NETCDF_LIB})
list(APPEND PYMOL_INC_DIRS ${NETCDF_INCLUDE_DIR})
else()
message(FATAL_ERROR "NetCDF not found!")
endif()
endif()

include(${PROJECT_SOURCE_DIR}/contrib/uiuc/plugins/sources.cmake)
list(APPEND PYMOL_DEF_MACROS "_PYMOL_VMD_PLUGINS")
5 changes: 5 additions & 0 deletions cmake/dependencies/VTKM.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
find_package(VTKm)
list(APPEND PYMOL_DEF_MACROS "_PYMOL_VTKM")
list(APPEND PYMOL_INC_DIRS ${VTKm_INCLUDE_DIRS}
${VTKm_THIRDPARTY_DIY_INCLUDE_DIR} ${VTKm_THIRDPARTY_LCL_INCLUDE_DIR})
list(APPEND PYMOL_LIBS vtkm_cont vtkm_filter_contour vtkm_filter_core)
Loading
Loading