diff options
Diffstat (limited to 'source/creator')
-rw-r--r-- | source/creator/CMakeLists.txt | 534 | ||||
-rw-r--r-- | source/creator/creator.c | 49 | ||||
-rw-r--r-- | source/creator/creator_intern.h | 12 | ||||
-rw-r--r-- | source/creator/creator_signals.c | 7 |
4 files changed, 352 insertions, 250 deletions
diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt index b9912929a54..05577406b48 100644 --- a/source/creator/CMakeLists.txt +++ b/source/creator/CMakeLists.txt @@ -1,9 +1,8 @@ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright 2006 Blender Foundation. All rights reserved. -blender_include_dirs( +set(INC ../../intern/clog - ../../intern/glew-mx ../../intern/guardedalloc ../blender/blenkernel ../blender/blenlib @@ -22,10 +21,13 @@ set(LIB bf_windowmanager ) +if(HAVE_FEENABLEEXCEPT) + add_definitions(-DHAVE_FEENABLEEXCEPT) +endif() + if(WITH_TBB) - # Force TBB libraries to be in front of MKL (part of OpenImageDenoise), so - # that it is initialized before MKL and static library initialization order - # issues are avoided. + # Force TBB libraries to be in front of MKL (part of `OpenImageDenoise`), so + # that it is initialized before MKL and static library initialization order issues are avoided. # # This isn't fully robust but seems to work. list(INSERT LIB 0 ${TBB_LIBRARIES}) @@ -33,17 +35,17 @@ if(WITH_TBB) endif() if(WIN32) - blender_include_dirs(../../intern/utfconv) + list(APPEND INC ../../intern/utfconv) endif() if(WITH_LIBMV) - blender_include_dirs(../../intern/libmv) + list(APPEND INC ../../intern/libmv) add_definitions(-DWITH_LIBMV) endif() if(WITH_CYCLES) if(WITH_CYCLES_LOGGING) - blender_include_dirs(../../intern/cycles/blender) + list(APPEND INC ../../intern/cycles/blender) add_definitions(-DWITH_CYCLES_LOGGING) endif() endif() @@ -53,16 +55,16 @@ if(WITH_CODEC_FFMPEG) endif() if(WITH_TBB) - blender_include_dirs(${TBB_INCLUDE_DIRS}) + list(APPEND INC ${TBB_INCLUDE_DIRS}) if(WIN32) - # For pragma that links tbbmalloc_proxy.lib + # For `pragma` that links `tbbmalloc_proxy.lib`. link_directories(${LIBDIR}/tbb/lib) endif() endif() if(WITH_PYTHON) - blender_include_dirs(../blender/python) + list(APPEND INC ../blender/python) add_definitions(-DWITH_PYTHON) if(WITH_PYTHON_SECURITY) @@ -76,19 +78,19 @@ endif() if(WITH_SDL) if(WITH_SDL_DYNLOAD) - blender_include_dirs(../../extern/sdlew/include) + list(APPEND INC ../../extern/sdlew/include) add_definitions(-DWITH_SDL_DYNLOAD) endif() add_definitions(-DWITH_SDL) endif() if(WITH_BINRELOC) - blender_include_dirs(${BINRELOC_INCLUDE_DIRS}) + list(APPEND INC ${BINRELOC_INCLUDE_DIRS}) add_definitions(-DWITH_BINRELOC) endif() if(WITH_FREESTYLE) - blender_include_dirs(../blender/freestyle) + list(APPEND INC ../blender/freestyle) add_definitions(-DWITH_FREESTYLE) endif() @@ -97,7 +99,7 @@ if(WITH_XR_OPENXR) endif() if(WITH_GMP) - blender_include_dirs(${GMP_INCLUDE_DIRS}) + list(APPEND INC ${GMP_INCLUDE_DIRS}) add_definitions(-DWITH_GMP) endif() @@ -105,7 +107,7 @@ if(WITH_OPENCOLORIO) add_definitions(-DWITH_OCIO) endif() -# Setup the exe sources and buildinfo +# Setup the EXE sources and `buildinfo`. set(SRC creator.c creator_args.c @@ -114,7 +116,7 @@ set(SRC creator_intern.h ) -# MSVC 2010 gives linking errors with the manifest +# MSVC 2010 gives linking errors with the manifest. if(WIN32 AND NOT UNIX) add_definitions( -DBLEN_VER_RC_STR="${BLENDER_VERSION}" @@ -170,19 +172,20 @@ if(WITH_BUILDINFO) unset(BUILD_SYSTEM) # -------------------------------------------------------------------------- - # write header for values that change each build - # note, generated file is in build dir's source/creator - # except when used as an include path. + # Write header for values that change each build + # + # NOTE: generated file is in build directory `source/creator` + # except when used as an include path. add_definitions(-DWITH_BUILDINFO_HEADER) - # include the output directory, where the buildinfo.h file is generated + # Include the output directory, where the `buildinfo.h` file is generated. include_directories(${CMAKE_CURRENT_BINARY_DIR}) - # XXX, ${buildinfo_h_fake} is used here, + # XXX: `${buildinfo_h_fake}` is used here, # because we rely on that file being detected as missing - # every build so that the real header "buildinfo.h" is updated. + # every build so that the real header `buildinfo.h` is updated. # # Keep this until we find a better way to resolve! @@ -190,14 +193,18 @@ if(WITH_BUILDINFO) set(buildinfo_h_fake "${CMAKE_CURRENT_BINARY_DIR}/buildinfo.h_fake") if(EXISTS ${buildinfo_h_fake}) - message(FATAL_ERROR "File \"${buildinfo_h_fake}\" found, this should never be created, remove!") + message( + FATAL_ERROR + "File \"${buildinfo_h_fake}\" found, this should never be created, remove!" + ) endif() - # From the cmake documentation "If the output of the custom command is not actually created as a + # From the CMAKE documentation "If the output of the custom command is not actually created as a # file on disk it should be marked with the SYMBOLIC source file property." # - # Not doing this leads to build warnings for the not generated file on windows when using msbuild - SET_SOURCE_FILES_PROPERTIES(${buildinfo_h_fake} PROPERTIES SYMBOLIC TRUE) + # Not doing this leads to build warnings for the not generated file on + # MS-Windows when using `msbuild`. + set_source_files_properties(${buildinfo_h_fake} PROPERTIES SYMBOLIC TRUE) # a custom target that is always built add_custom_target( @@ -205,19 +212,21 @@ if(WITH_BUILDINFO) DEPENDS ${buildinfo_h_fake} ) - # creates buildinfo.h using cmake script + # Creates `buildinfo.h` using CMAKE script. add_custom_command( OUTPUT ${buildinfo_h_fake} # ensure we always run ${buildinfo_h_real} - COMMAND ${CMAKE_COMMAND} - -DSOURCE_DIR=${CMAKE_SOURCE_DIR} - # overrides only used when non-empty strings - -DBUILD_DATE=${BUILDINFO_OVERRIDE_DATE} - -DBUILD_TIME=${BUILDINFO_OVERRIDE_TIME} - -P ${CMAKE_SOURCE_DIR}/build_files/cmake/buildinfo.cmake) - - # buildinfo.h is a generated file + COMMAND + ${CMAKE_COMMAND} + -DSOURCE_DIR=${CMAKE_SOURCE_DIR} + # Overrides only used when non-empty strings. + -DBUILD_DATE=${BUILDINFO_OVERRIDE_DATE} + -DBUILD_TIME=${BUILDINFO_OVERRIDE_TIME} + -P ${CMAKE_SOURCE_DIR}/build_files/cmake/buildinfo.cmake + ) + + # `buildinfo.h` is a generated file. set_source_files_properties( ${buildinfo_h_real} PROPERTIES GENERATED TRUE @@ -226,7 +235,7 @@ if(WITH_BUILDINFO) unset(buildinfo_h_real) unset(buildinfo_h_fake) - # add deps below, after adding blender + # Add dependencies below, after adding Blender # -------------- done with header values. list(APPEND SRC @@ -244,26 +253,35 @@ add_cc_flags_custom_test(blender) if(WITH_PYTHON_MODULE) add_definitions(-DWITH_PYTHON_MODULE) - # creates ./bin/bpy.so which can be imported as a python module. + # Creates `./bpy/__init__.so` which can be imported as a Python module. # - # note that 'SHARED' works on Linux and Windows, - # but not OSX which _must_ be 'MODULE' + # Note that 'SHARED' works on Linux and Windows, but not MACOS which _must_ be 'MODULE'. add_library(blender MODULE ${SRC}) + + + get_property(GENERATOR_IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) + if(GENERATOR_IS_MULTI_CONFIG) + set(BPY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/$<CONFIG>/bpy) + else() + set(BPY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/bpy) + endif() + set_target_properties( blender PROPERTIES PREFIX "" - OUTPUT_NAME bpy - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin # only needed on windows + OUTPUT_NAME __init__ + LIBRARY_OUTPUT_DIRECTORY ${BPY_OUTPUT_DIRECTORY} + RUNTIME_OUTPUT_DIRECTORY ${BPY_OUTPUT_DIRECTORY} ) + unset(BPY_OUTPUT_DIRECTORY) if(APPLE) set_target_properties(blender PROPERTIES MACOSX_BUNDLE TRUE) endif() if(WIN32) - # python modules use this + # Python modules use this. set_target_properties( blender PROPERTIES @@ -285,61 +303,76 @@ else() endif() if(WITH_BUILDINFO) - # explicitly say that the executable depends on the buildinfo + # Explicitly say that the executable depends on the `buildinfo`. add_dependencies(blender buildinfo) endif() set(BLENDER_TEXT_FILES ${CMAKE_SOURCE_DIR}/release/text/copyright.txt - # generate this file - # ${CMAKE_SOURCE_DIR}/release/text/readme.html + # Generate this file: + # `${CMAKE_SOURCE_DIR}/release/text/readme.html` ) # ----------------------------------------------------------------------------- -# Platform Specific Var: TARGETDIR_VER +# Platform specific target destinations +# +# Setup version directory, libraries, `bpy` & text files. if(UNIX AND NOT APPLE) if(WITH_PYTHON_MODULE) if(WITH_INSTALL_PORTABLE) - set(TARGETDIR_VER ${BLENDER_VERSION}) + set(TARGETDIR_BPY bpy) + set(TARGETDIR_VER bpy/${BLENDER_VERSION}) + set(TARGETDIR_LIB bpy/lib) else() - set(TARGETDIR_VER ${PYTHON_SITE_PACKAGES}/${BLENDER_VERSION}) + set(TARGETDIR_BPY ${PYTHON_SITE_PACKAGES}/bpy) + set(TARGETDIR_VER ${PYTHON_SITE_PACKAGES}/bpy/${BLENDER_VERSION}) + set(TARGETDIR_LIB ${PYTHON_SITE_PACKAGES}/bpy/lib) endif() else() if(WITH_INSTALL_PORTABLE) set(TARGETDIR_VER ${BLENDER_VERSION}) + set(TARGETDIR_TEXT .) + set(TARGETDIR_LIB lib) else() set(TARGETDIR_VER share/blender/${BLENDER_VERSION}) + set(TARGETDIR_TEXT share/doc/blender) endif() endif() elseif(WIN32) - set(TARGETDIR_VER ${BLENDER_VERSION}) - + if(WITH_PYTHON_MODULE) + set(TARGETDIR_BPY ${CMAKE_INSTALL_PREFIX_WITH_CONFIG}/bpy) + set(TARGETDIR_VER ${CMAKE_INSTALL_PREFIX_WITH_CONFIG}/bpy/${BLENDER_VERSION}) + # Important the DLL's are next to `__init__.pyd` otherwise it won't load. + set(TARGETDIR_LIB ${CMAKE_INSTALL_PREFIX_WITH_CONFIG}/bpy) + else() + set(TARGETDIR_VER ${BLENDER_VERSION}) + set(TARGETDIR_TEXT .) + set(TARGETDIR_LIB .) + endif() elseif(APPLE) if(WITH_PYTHON_MODULE) if(WITH_INSTALL_PORTABLE) - set(BPY_INSTALL_DIR) - set(TARGETDIR_VER $<TARGET_FILE_DIR:blender>/../Resources/${BLENDER_VERSION}) - # Keep the `BLENDER_VERSION` folder and bpy.so in the build folder. - set(INSTALL_BPY_TO_SITE_PACKAGES OFF) + set(TARGETDIR_BPY bpy) + set(TARGETDIR_VER bpy/${BLENDER_VERSION}) + set(TARGETDIR_LIB bpy/lib) else() - # Parent directory of bpy.so for installation. - set(BPY_INSTALL_DIR ${PYTHON_LIBPATH}/site-packages) - # Defined in terms of site-packages since the site-packages + # Paths defined in terms of site-packages since the site-packages # directory can be a symlink (brew for example). - set(TARGETDIR_VER "${BPY_INSTALL_DIR}/../Resources/${BLENDER_VERSION}") - set(INSTALL_BPY_TO_SITE_PACKAGES ON) + set(TARGETDIR_BPY ${PYTHON_SITE_PACKAGES}/bpy) + set(TARGETDIR_VER ${PYTHON_SITE_PACKAGES}/bpy/${BLENDER_VERSION}) + set(TARGETDIR_LIB ${PYTHON_SITE_PACKAGES}/bpy/lib) endif() else() set(TARGETDIR_VER Blender.app/Contents/Resources/${BLENDER_VERSION}) + set(TARGETDIR_LIB Blender.app/Contents/Resources/lib) + set(TARGETDIR_TEXT Blender.app/Contents/Resources/text) endif() - # License, copyright, readme files. - set(BLENDER_TEXT_FILES_DESTINATION "${TARGETDIR_VER}/../text") - set(MAC_BLENDER_TARGET_DYLIBS_DIR "${TARGETDIR_VER}/lib") - # Skip relinking on cpack / install + + # Skip re-linking on CPACK / install. set_target_properties(blender PROPERTIES BUILD_WITH_INSTALL_RPATH true) endif() @@ -362,14 +395,14 @@ if(WITH_PYTHON) "${BLENDER_VERSION_CYCLE}" STREQUAL "rc") set(ADDON_EXCLUDE_CONDITIONAL "addons_contrib/*") else() - set(ADDON_EXCLUDE_CONDITIONAL "_addons_contrib/*") # dummy, won't do anything + set(ADDON_EXCLUDE_CONDITIONAL "_addons_contrib/*") # Dummy, won't do anything. endif() # do not install freestyle dir if disabled if(NOT WITH_FREESTYLE) set(FREESTYLE_EXCLUDE_CONDITIONAL "freestyle/*") else() - set(FREESTYLE_EXCLUDE_CONDITIONAL "_freestyle/*") # dummy, won't do anything + set(FREESTYLE_EXCLUDE_CONDITIONAL "_freestyle/*") # Dummy, won't do anything. endif() install( @@ -377,6 +410,7 @@ if(WITH_PYTHON) DESTINATION ${TARGETDIR_VER} PATTERN ".git" EXCLUDE PATTERN ".gitignore" EXCLUDE + PATTERN ".github" EXCLUDE PATTERN ".arcconfig" EXCLUDE PATTERN "__pycache__" EXCLUDE PATTERN "${ADDON_EXCLUDE_CONDITIONAL}" EXCLUDE @@ -389,8 +423,7 @@ endif() # fonts install( - DIRECTORY - ${CMAKE_SOURCE_DIR}/release/datafiles/fonts + DIRECTORY ${CMAKE_SOURCE_DIR}/release/datafiles/fonts DESTINATION ${TARGETDIR_VER}/datafiles ) @@ -404,14 +437,14 @@ if(WITH_INTERNATIONAL) msgfmt_simple(${_po_file} _all_mo_files) endforeach() - # Create a custom target which will compile all po to mo + # Create a custom target which will compile all `*.po` to `*.mo`. add_custom_target( locales DEPENDS ${_all_mo_files} ) add_dependencies(blender locales) - # Generate INSTALL rules + # Generate INSTALL rules. install( FILES ${_locale_dir}/languages DESTINATION ${_locale_target_dir} @@ -436,7 +469,7 @@ if(WITH_INTERNATIONAL) unset(_locale_dir) endif() -# color management +# Color management. if(WITH_OPENCOLORIO) install( DIRECTORY ${CMAKE_SOURCE_DIR}/release/datafiles/colormanagement @@ -444,13 +477,14 @@ if(WITH_OPENCOLORIO) ) endif() -# helpful tip when using make +# Helpful tip when using make. if("${CMAKE_GENERATOR}" MATCHES ".*Makefiles.*") - # message after building. + # Message to display after building. add_custom_command( TARGET blender POST_BUILD MAIN_DEPENDENCY blender - COMMAND ${CMAKE_COMMAND} -E - echo 'now run: \"make install\" to copy runtime files and scripts to ${TARGETDIR_VER}' + COMMAND + ${CMAKE_COMMAND} -E + echo 'now run: \"make install\" to copy runtime files and scripts to ${TARGETDIR_VER}' ) endif() @@ -464,25 +498,33 @@ if(UNIX AND NOT APPLE) if(WITH_DOC_MANPAGE) add_custom_target( blender_man_page ALL - COMMAND ${CMAKE_SOURCE_DIR}/doc/manpage/blender.1.py - --blender ${EXECUTABLE_OUTPUT_PATH}/blender - --output ${CMAKE_CURRENT_BINARY_DIR}/blender.1 + COMMAND + ${CMAKE_SOURCE_DIR}/doc/manpage/blender.1.py + --blender ${EXECUTABLE_OUTPUT_PATH}/blender + --output ${CMAKE_CURRENT_BINARY_DIR}/blender.1 ) add_dependencies(blender_man_page blender) endif() endif() - # there are a few differences between portable and system install + if(PLATFORM_BUNDLED_LIBRARIES AND TARGETDIR_LIB) + install( + FILES ${PLATFORM_BUNDLED_LIBRARIES} + DESTINATION ${TARGETDIR_LIB} + ) + endif() + + # There are a few differences between portable and system install. if(WITH_PYTHON_MODULE) if(WITH_INSTALL_PORTABLE) install( TARGETS blender - DESTINATION "." + DESTINATION ${TARGETDIR_BPY} ) else() install( TARGETS blender - LIBRARY DESTINATION ${PYTHON_SITE_PACKAGES} + LIBRARY DESTINATION ${TARGETDIR_BPY} ) endif() # none of the other files are needed currently @@ -521,9 +563,23 @@ if(UNIX AND NOT APPLE) ${CMAKE_SOURCE_DIR}/release/bin/blender-softwaregl DESTINATION "." ) - endif() - set(BLENDER_TEXT_FILES_DESTINATION ".") + # Remove from old location, so existing builds don't start with software + # OpenGL now that the lib/ folder is used for other libraries. + install( + CODE + "file(REMOVE ${CMAKE_BINARY_DIR}/bin/lib/libGL.so)\n + file(REMOVE ${CMAKE_BINARY_DIR}/bin/lib/libGL.so.1)\n + file(REMOVE ${CMAKE_BINARY_DIR}/bin/lib/libGL.so.1.5.0)\n + file(REMOVE ${CMAKE_BINARY_DIR}/bin/lib/libGLU.so)\n + file(REMOVE ${CMAKE_BINARY_DIR}/bin/lib/libGLU.so.1)\n + file(REMOVE ${CMAKE_BINARY_DIR}/bin/lib/libGLU.so.1.3.1)\n + file(REMOVE ${CMAKE_BINARY_DIR}/bin/lib/libglapi.so)\n + file(REMOVE ${CMAKE_BINARY_DIR}/bin/lib/libglapi.so.0)\n + file(REMOVE ${CMAKE_BINARY_DIR}/bin/lib/libglapi.so.0.0.0)\n + " + ) + endif() else() # main blender binary install( @@ -531,14 +587,14 @@ if(UNIX AND NOT APPLE) DESTINATION bin ) if(WITH_DOC_MANPAGE) - # manpage only with 'blender' binary + # Manual page (only with `blender` binary). install( FILES ${CMAKE_CURRENT_BINARY_DIR}/blender.1 DESTINATION share/man/man1 ) endif() - # misc files + # Misc files. install( FILES ${CMAKE_SOURCE_DIR}/release/freedesktop/blender.desktop DESTINATION share/applications @@ -557,7 +613,6 @@ if(UNIX AND NOT APPLE) DESTINATION bin ) endif() - set(BLENDER_TEXT_FILES_DESTINATION share/doc/blender) endif() if(WITH_PYTHON) @@ -568,11 +623,9 @@ if(UNIX AND NOT APPLE) DESTINATION ${TARGETDIR_VER}/python/bin ) - # on some platforms (like openSUSE) Python is linked - # to be used from lib64 folder. - # determine this from Python's libraries path - # - # ugh, its possible 'lib64' is just a symlink to 'lib' which causes incorrect use of 'lib64' + # On some platforms (like openSUSE) Python is linked to be used from `lib64` directory. + # determine this from Python's libraries path. + # Ugh, its possible `lib64` is just a symlink to 'lib' which causes incorrect use of `lib64`. get_filename_component(_pypath_real ${PYTHON_LIBPATH} REALPATH) if(${_pypath_real} MATCHES "lib64$") set(_target_LIB "lib64") @@ -581,7 +634,7 @@ if(UNIX AND NOT APPLE) endif() unset(_pypath_real) - # Copy the systems python into the install directory + # Copy the systems python into the install directory: # install(CODE "message(\"copying a subset of the systems python...\")") install( DIRECTORY ${PYTHON_LIBPATH}/python${PYTHON_VERSION} @@ -599,8 +652,8 @@ if(UNIX AND NOT APPLE) PATTERN "wininst*.exe" EXCLUDE # from distutils, avoid malware false positive ) - # Needed for distutils/pip - # get the last part of the include dir, will be 'python{version}{abiflag}', + # Needed for `distutils/pip`. + # Get the last part of the include dir, will be `python{version}{abiflag}`. get_filename_component(_py_inc_suffix ${PYTHON_INCLUDE_DIR} NAME) install( FILES ${PYTHON_INCLUDE_DIR}/pyconfig.h @@ -610,7 +663,7 @@ if(UNIX AND NOT APPLE) if(WITH_PYTHON_INSTALL_NUMPY) # Install to the same directory as the source, so debian-like - # distros are happy with their policy. + # distributions are happy with their policy. set(_suffix "site-packages") if(${PYTHON_NUMPY_PATH} MATCHES "dist-packages") set(_suffix "dist-packages") @@ -647,7 +700,7 @@ if(UNIX AND NOT APPLE) if(WITH_PYTHON_INSTALL_ZSTANDARD) # Install to the same directory as the source, so debian-like - # distros are happy with their policy. + # distributions are happy with their policy. set(_suffix "site-packages") if(${PYTHON_ZSTANDARD_PATH} MATCHES "dist-packages") set(_suffix "dist-packages") @@ -663,7 +716,7 @@ if(UNIX AND NOT APPLE) unset(_suffix) endif() - # Copy requests, we need to generalize site-packages + # Copy requests, we need to generalize site-packages. if(WITH_PYTHON_INSTALL_REQUESTS) set(_suffix "site-packages") if(${PYTHON_REQUESTS_PATH} MATCHES "dist-packages") @@ -679,9 +732,8 @@ if(UNIX AND NOT APPLE) ) # On some platforms requests does have extra dependencies. # - # Either 'chardet' or 'charset_normalizer" is used, depending on the - # version of Python. The code below silently skips the one that's not - # available, so we can just list both here. + # Either `chardet` or `charset_normalizer` is used, depending on the version of Python. + # The code below silently skips the one that's not available, so we can list both here. set(_requests_deps "certifi" "chardet" "charset_normalizer" "idna" "urllib3") foreach(_requests_dep ${_requests_deps}) if(EXISTS ${PYTHON_REQUESTS_PATH}/${_requests_dep}) @@ -717,37 +769,44 @@ if(UNIX AND NOT APPLE) ) endif() elseif(WIN32) - - set(BLENDER_TEXT_FILES_DESTINATION ".") + install( + FILES ${LIBDIR}/epoxy/bin/epoxy-0.dll + DESTINATION ${TARGETDIR_LIB} + ) if(WITH_OPENMP AND MSVC_CLANG) install( FILES ${CLANG_OPENMP_DLL} - DESTINATION "." + DESTINATION ${TARGETDIR_LIB} ) endif() if(WITH_FFTW3) install( FILES ${LIBDIR}/fftw3/lib/libfftw3-3.dll - DESTINATION "." + DESTINATION ${TARGETDIR_LIB} ) endif() if(MSVC_ASAN) - # The asan dll's can be found in the same folder as the compiler, this is the easiest way to find these. + # The ASAN DLL's can be found in the same folder as the compiler, + # this is the easiest way to find these. string(REPLACE "cl.exe" "clang_rt.asan_dynamic-x86_64.dll" ASAN_DLL ${CMAKE_C_COMPILER}) string(REPLACE "cl.exe" "clang_rt.asan_dbg_dynamic-x86_64.dll" ASAN_DEBUG_DLL ${CMAKE_C_COMPILER}) if(NOT EXISTS "${ASAN_DLL}") - message(FATAL_ERROR "Asan is enabled, but the ASAN runtime is not detected, this is an optional component during the MSVC install, please install it") + message( + FATAL_ERROR + "ASAN is enabled, but the ASAN runtime is not detected, " + "this is an optional component during the MSVC install, please install it" + ) endif() install( FILES ${ASAN_DLL} - DESTINATION "." + DESTINATION ${TARGETDIR_LIB} CONFIGURATIONS Release;RelWithDebInfo;MinSizeRel ) install( FILES ${ASAN_DEBUG_DLL} - DESTINATION "." + DESTINATION ${TARGETDIR_LIB} CONFIGURATIONS Debug ) unset(ASAN_DLL) @@ -757,26 +816,30 @@ elseif(WIN32) if(WITH_GMP) install( FILES ${LIBDIR}/gmp/lib/libgmp-10.dll - DESTINATION "." + DESTINATION ${TARGETDIR_LIB} ) install( FILES ${LIBDIR}/gmp/lib/libgmpxx.dll - DESTINATION "." + DESTINATION ${TARGETDIR_LIB} CONFIGURATIONS Release;RelWithDebInfo;MinSizeRel ) install( FILES ${LIBDIR}/gmp/lib/libgmpxx_d.dll - DESTINATION "." + DESTINATION ${TARGETDIR_LIB} CONFIGURATIONS Debug ) endif() if(WITH_WINDOWS_PDB) if(WITH_WINDOWS_STRIPPED_PDB) - # Icky hack for older cmake from https://stackoverflow.com/a/21198501 - # $<CONFIG> will work in newer cmake but the version currently (3.12) - # on the buildbot does not support this endavour. - install(FILES ${CMAKE_CURRENT_BINARY_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}/blender_public.pdb DESTINATION . RENAME blender.pdb) + # Icky hack for older CMAKE from https://stackoverflow.com/a/21198501 + # `$<CONFIG>` will work in newer CMAKE but the version currently (3.12) + # on the build-bot does not support this endeavor. + install( + FILES ${CMAKE_CURRENT_BINARY_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}/blender_public.pdb + DESTINATION . + RENAME blender.pdb + ) else() install(FILES $<TARGET_PDB_FILE:blender> DESTINATION . RENAME blender.pdb) endif() @@ -785,12 +848,12 @@ elseif(WIN32) if(WITH_OPENVDB) install( FILES ${LIBDIR}/openvdb/bin/openvdb.dll - DESTINATION "." + DESTINATION ${TARGETDIR_LIB} CONFIGURATIONS Release;RelWithDebInfo;MinSizeRel ) install( FILES ${LIBDIR}/openvdb/bin/openvdb_d.dll - DESTINATION "." + DESTINATION ${TARGETDIR_LIB} CONFIGURATIONS Debug ) endif() @@ -798,24 +861,29 @@ elseif(WIN32) if(WITH_PYTHON) string(REPLACE "." "" _PYTHON_VERSION_NO_DOTS ${PYTHON_VERSION}) - if(NOT CMAKE_COMPILER_IS_GNUCC) - install( - FILES ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}/bin/python${_PYTHON_VERSION_NO_DOTS}.dll - ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}/bin/python3.dll - DESTINATION "." - CONFIGURATIONS Release;RelWithDebInfo;MinSizeRel - ) + if(NOT WITH_PYTHON_MODULE) + if(NOT CMAKE_COMPILER_IS_GNUCC) + install( + FILES + ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}/bin/python${_PYTHON_VERSION_NO_DOTS}.dll + ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}/bin/python3.dll + DESTINATION ${TARGETDIR_LIB} + CONFIGURATIONS Release;RelWithDebInfo;MinSizeRel + ) - install( - FILES ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}/bin/python${_PYTHON_VERSION_NO_DOTS}_d.dll - ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}/bin/python3_d.dll - DESTINATION "." - CONFIGURATIONS Debug - ) + install( + FILES + ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}/bin/python${_PYTHON_VERSION_NO_DOTS}_d.dll + ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}/bin/python3_d.dll + DESTINATION ${TARGETDIR_LIB} + CONFIGURATIONS Debug + ) + endif() endif() if(WITH_PYTHON_INSTALL) - # note, as far as python is concerned 'RelWithDebInfo' is not debug since its without debug flags. + # NOTE: as far as python is concerned `RelWithDebInfo` + # is not debug since its without debug flags. install(DIRECTORY DESTINATION ${TARGETDIR_VER}/python) install(DIRECTORY DESTINATION ${TARGETDIR_VER}/python/lib) @@ -825,7 +893,7 @@ elseif(WIN32) DESTINATION ${BLENDER_VERSION}/python/ CONFIGURATIONS Release;RelWithDebInfo;MinSizeRel PATTERN ".svn" EXCLUDE - PATTERN "*_d.*" EXCLUDE # * debug libraries * + PATTERN "*_d.*" EXCLUDE # * debug libraries * PATTERN "__pycache__" EXCLUDE # * any cache * PATTERN "*.pyc" EXCLUDE # * any cache * PATTERN "*.pyo" EXCLUDE # * any cache * @@ -856,28 +924,32 @@ elseif(WIN32) ) install( - FILES ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}/bin/python${_PYTHON_VERSION_NO_DOTS}.dll - ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}/bin/python.exe + FILES + ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}/bin/python${_PYTHON_VERSION_NO_DOTS}.dll + ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}/bin/python.exe DESTINATION ${BLENDER_VERSION}/python/bin CONFIGURATIONS Release;RelWithDebInfo;MinSizeRel ) install( - FILES ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}/bin/python${_PYTHON_VERSION_NO_DOTS}_d.dll - ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}/bin/python_d.exe + FILES + ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}/bin/python${_PYTHON_VERSION_NO_DOTS}_d.dll + ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}/bin/python_d.exe DESTINATION ${BLENDER_VERSION}/python/bin CONFIGURATIONS Debug ) if(WINDOWS_PYTHON_DEBUG) install( - FILES ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}/libs/python${_PYTHON_VERSION_NO_DOTS}.pdb - DESTINATION "." + FILES + ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}/libs/python${_PYTHON_VERSION_NO_DOTS}.pdb + DESTINATION ${TARGETDIR_LIB} CONFIGURATIONS Release;RelWithDebInfo;MinSizeRel ) install( - FILES ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}/libs/python${_PYTHON_VERSION_NO_DOTS}_d.pdb - DESTINATION "." + FILES + ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}/libs/python${_PYTHON_VERSION_NO_DOTS}_d.pdb + DESTINATION ${TARGETDIR_LIB} CONFIGURATIONS Debug ) endif() @@ -886,22 +958,9 @@ elseif(WIN32) unset(_PYTHON_VERSION_NO_DOTS) endif() - # EGL Runtime Components - if(WITH_GL_EGL) - if(WIN32) - install(FILES "${OPENGLES_DLL}" DESTINATION ".") - install(FILES "${OPENGLES_EGL_DLL}" DESTINATION ".") - - if(WITH_GL_ANGLE) - install(FILES "${D3DCOMPILER_DLL}" DESTINATION ".") - endif() - endif() - endif() - if(WITH_CODEC_FFMPEG) - # Filenames change slightly between ffmpeg versions - # check both 5.0 and fallback to 4.4 to ease the transition - # between versions. + # Filenames change slightly between FFMPEG versions check both 5.0 and fallback to 4.4 + # to ease the transition between versions. if(EXISTS "${LIBDIR}/ffmpeg/lib/avcodec-59.dll") install( FILES @@ -911,7 +970,7 @@ elseif(WIN32) ${LIBDIR}/ffmpeg/lib/avutil-57.dll ${LIBDIR}/ffmpeg/lib/swscale-6.dll ${LIBDIR}/ffmpeg/lib/swresample-4.dll - DESTINATION "." + DESTINATION ${TARGETDIR_LIB} ) else() install( @@ -922,7 +981,7 @@ elseif(WIN32) ${LIBDIR}/ffmpeg/lib/avutil-56.dll ${LIBDIR}/ffmpeg/lib/swscale-5.dll ${LIBDIR}/ffmpeg/lib/swresample-3.dll - DESTINATION "." + DESTINATION ${TARGETDIR_LIB} ) endif() endif() @@ -930,13 +989,13 @@ elseif(WIN32) install( FILES ${LIBDIR}/tbb/bin/tbb.dll - DESTINATION "." + DESTINATION ${TARGETDIR_LIB} CONFIGURATIONS Release;RelWithDebInfo;MinSizeRel ) install( FILES ${LIBDIR}/tbb/bin/tbb_debug.dll - DESTINATION "." + DESTINATION ${TARGETDIR_LIB} CONFIGURATIONS Debug ) endif() @@ -945,14 +1004,14 @@ elseif(WIN32) FILES ${LIBDIR}/tbb/bin/tbbmalloc.dll ${LIBDIR}/tbb/bin/tbbmalloc_proxy.dll - DESTINATION "." + DESTINATION ${TARGETDIR_LIB} CONFIGURATIONS Release;RelWithDebInfo;MinSizeRel ) install( FILES ${LIBDIR}/tbb/bin/tbbmalloc_debug.dll ${LIBDIR}/tbb/bin/tbbmalloc_proxy_debug.dll - DESTINATION "." + DESTINATION ${TARGETDIR_LIB} CONFIGURATIONS Debug ) list(APPEND LIB ${TBB_MALLOC_LIBRARIES}) @@ -961,7 +1020,7 @@ elseif(WIN32) if(WITH_CODEC_SNDFILE) install( FILES ${LIBDIR}/sndfile/lib/libsndfile-1.dll - DESTINATION "." + DESTINATION ${TARGETDIR_LIB} ) endif() @@ -969,14 +1028,14 @@ elseif(WIN32) install( FILES ${LIBDIR}/openal/lib/OpenAL32.dll - DESTINATION "." + DESTINATION ${TARGETDIR_LIB} ) endif() if(WITH_SDL) install( FILES ${LIBDIR}/sdl/lib/SDL2.dll - DESTINATION "." + DESTINATION ${TARGETDIR_LIB} ) endif() @@ -986,20 +1045,23 @@ elseif(WIN32) ${LIBDIR}/audaspace/lib/audaspace.dll ${LIBDIR}/audaspace/lib/audaspace-c.dll ${LIBDIR}/audaspace/lib/audaspace-py.dll - DESTINATION "." + DESTINATION ${TARGETDIR_LIB} ) endif() - install( - FILES - ${CMAKE_SOURCE_DIR}/release/windows/batch/blender_debug_gpu.cmd - ${CMAKE_SOURCE_DIR}/release/windows/batch/blender_debug_gpu_glitchworkaround.cmd - ${CMAKE_SOURCE_DIR}/release/windows/batch/blender_debug_log.cmd - ${CMAKE_SOURCE_DIR}/release/windows/batch/blender_factory_startup.cmd - ${CMAKE_SOURCE_DIR}/release/windows/batch/blender_oculus.cmd - ${CMAKE_SOURCE_DIR}/release/windows/batch/oculus.json - DESTINATION "." - ) + + if(NOT WITH_PYTHON_MODULE) + install( + FILES + ${CMAKE_SOURCE_DIR}/release/windows/batch/blender_debug_gpu.cmd + ${CMAKE_SOURCE_DIR}/release/windows/batch/blender_debug_gpu_glitchworkaround.cmd + ${CMAKE_SOURCE_DIR}/release/windows/batch/blender_debug_log.cmd + ${CMAKE_SOURCE_DIR}/release/windows/batch/blender_factory_startup.cmd + ${CMAKE_SOURCE_DIR}/release/windows/batch/blender_oculus.cmd + ${CMAKE_SOURCE_DIR}/release/windows/batch/oculus.json + DESTINATION ${TARGETDIR_LIB} + ) + endif() if(WITH_BLENDER_THUMBNAILER) install( @@ -1016,12 +1078,12 @@ elseif(WIN32) endif() elseif(APPLE) if(NOT WITH_PYTHON_MODULE) - # Uppercase name for app bundle + # Uppercase name for app bundle. set_target_properties(blender PROPERTIES OUTPUT_NAME Blender) endif() - # handy install macro to exclude files, we use \$ escape for the "to" - # argument when calling so ${BUILD_TYPE} does not get expanded + # Handy install macro to exclude files, we use \$ escape for the "to" + # argument when calling so `${BUILD_TYPE}` does not get expanded. macro(install_dir from to) install( DIRECTORY ${from} @@ -1049,10 +1111,12 @@ elseif(APPLE) set(OSX_APP_SOURCEDIR ${CMAKE_SOURCE_DIR}/release/darwin/Blender.app) - # setup Info.plist - execute_process(COMMAND date "+%Y-%m-%d" - OUTPUT_VARIABLE BLENDER_DATE - OUTPUT_STRIP_TRAILING_WHITESPACE) + # Setup `Info.plist`. + execute_process( + COMMAND date "+%Y-%m-%d" + OUTPUT_VARIABLE BLENDER_DATE + OUTPUT_STRIP_TRAILING_WHITESPACE + ) set_target_properties(blender PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${OSX_APP_SOURCEDIR}/Contents/Info.plist @@ -1060,19 +1124,22 @@ elseif(APPLE) MACOSX_BUNDLE_LONG_VERSION_STRING "${BLENDER_VERSION}.${BLENDER_VERSION_PATCH} ${BLENDER_DATE}" ) - # Gather the date in finder-style - execute_process(COMMAND date "+%m/%d/%Y/%H:%M" - OUTPUT_VARIABLE SETFILE_DATE - OUTPUT_STRIP_TRAILING_WHITESPACE) + # Gather the date in finder-style. + execute_process( + COMMAND date "+%m/%d/%Y/%H:%M" + OUTPUT_VARIABLE SETFILE_DATE + OUTPUT_STRIP_TRAILING_WHITESPACE + ) - # Give the bundle actual creation/modification date + # Give the bundle actual creation/modification date. # - # Note that the directory might not yet exist, which happens when CMake is first run. + # Note that the directory might not yet exist, which happens when CMAKE is first run. if(NOT EXISTS ${EXECUTABLE_OUTPUT_PATH}/Blender.app) file(MAKE_DIRECTORY ${EXECUTABLE_OUTPUT_PATH}/Blender.app) endif() - execute_process(COMMAND SetFile -d ${SETFILE_DATE} -m ${SETFILE_DATE} - ${EXECUTABLE_OUTPUT_PATH}/Blender.app) + execute_process( + COMMAND SetFile -d ${SETFILE_DATE} -m ${SETFILE_DATE} ${EXECUTABLE_OUTPUT_PATH}/Blender.app + ) install( TARGETS blender @@ -1096,35 +1163,29 @@ elseif(APPLE) ) endif() - if(WITH_OPENMP AND OPENMP_CUSTOM) + if(PLATFORM_BUNDLED_LIBRARIES AND TARGETDIR_LIB) install( - FILES "${OpenMP_LIBRARY}" - DESTINATION "${MAC_BLENDER_TARGET_DYLIBS_DIR}" + FILES ${PLATFORM_BUNDLED_LIBRARIES} + DESTINATION ${TARGETDIR_LIB} ) endif() - if(WITH_COMPILER_ASAN) - install( - FILES "${COMPILER_ASAN_LIBRARY}" - DESTINATION "${MAC_BLENDER_TARGET_DYLIBS_DIR}" - ) - endif() - - # python + # Python. if(WITH_PYTHON AND NOT WITH_PYTHON_MODULE AND NOT WITH_PYTHON_FRAMEWORK) - # Copy the python libs into the install directory + # Copy the python libraries into the install directory. install_dir( - ${PYTHON_LIBPATH} + ${PYTHON_LIBPATH}/python${PYTHON_VERSION} ${TARGETDIR_VER}/python/lib ) + # Install Python executable. install( PROGRAMS ${PYTHON_EXECUTABLE} DESTINATION ${TARGETDIR_VER}/python/bin ) - # Needed for distutils/pip - # get the last part of the include dir, will be 'python{version}{abiflag}', + # Needed for `distutils/pip`. + # Get the last part of the include dir, will be `python{version}{abiflag}`. get_filename_component(_py_inc_suffix ${PYTHON_INCLUDE_DIR} NAME) install( FILES ${PYTHON_INCLUDE_DIR}/pyconfig.h @@ -1133,13 +1194,11 @@ elseif(APPLE) unset(_py_inc_suffix) endif() - if(WITH_PYTHON_MODULE) - if(INSTALL_BPY_TO_SITE_PACKAGES) - install( - TARGETS blender - LIBRARY DESTINATION ${BPY_INSTALL_DIR} - ) - endif() + if(WITH_PYTHON_MODULE AND TARGETDIR_BPY) + install( + TARGETS blender + LIBRARY DESTINATION ${TARGETDIR_BPY} + ) endif() if(WITH_DRACO) @@ -1153,7 +1212,7 @@ endif() # ----------------------------------------------------------------------------- # Generic Install, for all targets -if(DEFINED BLENDER_TEXT_FILES_DESTINATION) +if(DEFINED TARGETDIR_TEXT) configure_file( ${CMAKE_SOURCE_DIR}/release/text/readme.html @@ -1166,21 +1225,20 @@ if(DEFINED BLENDER_TEXT_FILES_DESTINATION) install( FILES ${BLENDER_TEXT_FILES} - DESTINATION "${BLENDER_TEXT_FILES_DESTINATION}" + DESTINATION "${TARGETDIR_TEXT}" ) install( - DIRECTORY - ${CMAKE_SOURCE_DIR}/release/license - DESTINATION "${BLENDER_TEXT_FILES_DESTINATION}" + DIRECTORY ${CMAKE_SOURCE_DIR}/release/license + DESTINATION "${TARGETDIR_TEXT}" ) endif() -# install more files specified elsewhere +# Install more files specified elsewhere. delayed_do_install(${TARGETDIR_VER}) unset(BLENDER_TEXT_FILES) -unset(BLENDER_TEXT_FILES_DESTINATION) +unset(TARGETDIR_TEXT) # ----------------------------------------------------------------------------- @@ -1203,16 +1261,18 @@ unset(_icon_names) unset(_icon_files) unset(_f) + # ----------------------------------------------------------------------------- # Studio Lights + install( - DIRECTORY - ${CMAKE_SOURCE_DIR}/release/datafiles/studiolights + DIRECTORY ${CMAKE_SOURCE_DIR}/release/datafiles/studiolights DESTINATION ${TARGETDIR_VER}/datafiles ) + # ----------------------------------------------------------------------------- -# Setup link libs +# Setup link libraries add_dependencies(blender makesdna) target_link_libraries(blender ${LIB}) @@ -1225,22 +1285,24 @@ if(DEFINED PLATFORM_SYMBOLS_MAP) set_target_properties(blender PROPERTIES LINK_DEPENDS ${PLATFORM_SYMBOLS_MAP}) endif() +blender_target_include_dirs(blender ${INC}) + # ----------------------------------------------------------------------------- # USD registry. -# USD requires a set of JSON files that define the standard schemas. These -# files are required at runtime. + +# USD requires a set of JSON files that define the standard schemas. +# These files are required at runtime. if(WITH_USD) add_definitions(-DWITH_USD) - install(DIRECTORY - ${USD_LIBRARY_DIR}/usd + install( + DIRECTORY ${USD_LIBRARY_DIR}/usd DESTINATION "${TARGETDIR_VER}/datafiles" ) endif() -# vcpkg substitutes our libs with theirs, which will cause issues when you -# you run these builds on other systems due to missing dlls. So we opt out -# the use of vcpkg +# `vcpkg` substitutes our libraries with theirs, which will cause issues when you you run +# these builds on other systems due to missing DLL's. So we opt out the use of `vcpkg`. if(WIN32) set_target_properties(blender PROPERTIES VS_GLOBAL_VcpkgEnabled "false") set_target_properties(blender PROPERTIES @@ -1250,12 +1312,18 @@ if(WIN32) if(WITH_WINDOWS_PDB AND WITH_WINDOWS_STRIPPED_PDB) # This is slightly messy, but single target generators like ninja will not have the # `CMAKE_CFG_INTDIR` variable and multi-target generators like `msbuild` will not have - # `CMAKE_BUILD_TYPE`. This can be simplified by target_link_options and the `$<CONFIG>` + # `CMAKE_BUILD_TYPE`. This can be simplified by `target_link_options` and the `$<CONFIG>` # generator expression in newer CMAKE (2.13+) but until that time this fill have suffice. if(CMAKE_BUILD_TYPE) - set_property(TARGET blender APPEND_STRING PROPERTY LINK_FLAGS " /PDBSTRIPPED:${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE}/blender_public.pdb") + set_property( + TARGET blender APPEND_STRING PROPERTY LINK_FLAGS + " /PDBSTRIPPED:${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE}/blender_public.pdb" + ) else() - set_property(TARGET blender APPEND_STRING PROPERTY LINK_FLAGS " /PDBSTRIPPED:${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/blender_public.pdb") + set_property( + TARGET blender APPEND_STRING PROPERTY LINK_FLAGS + " /PDBSTRIPPED:${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/blender_public.pdb" + ) endif() endif() endif() diff --git a/source/creator/creator.c b/source/creator/creator.c index e7a803d383f..2cd54deeab5 100644 --- a/source/creator/creator.c +++ b/source/creator/creator.c @@ -24,7 +24,6 @@ #include "DNA_genfile.h" -#include "BLI_args.h" #include "BLI_string.h" #include "BLI_system.h" #include "BLI_task.h" @@ -51,6 +50,10 @@ #include "BKE_vfont.h" #include "BKE_volume.h" +#ifndef WITH_PYTHON_MODULE +# include "BLI_args.h" +#endif + #include "DEG_depsgraph.h" #include "IMB_imbuf.h" /* For #IMB_init. */ @@ -94,6 +97,18 @@ #include "creator_intern.h" /* Own include. */ /* -------------------------------------------------------------------- */ +/** \name Local Defines + * \{ */ + +/* When building as a Python module, don't use special argument handling + * so the module loading logic can control the `argv` & `argc`. */ +#if defined(WIN32) && !defined(WITH_PYTHON_MODULE) +# define USE_WIN32_UNICODE_ARGS +#endif + +/** \} */ + +/* -------------------------------------------------------------------- */ /** \name Local Application State * \{ */ @@ -132,23 +147,34 @@ static void main_callback_setup(void) /* free data on early exit (if Python calls 'sys.exit()' while parsing args for eg). */ struct CreatorAtExitData { +#ifndef WITH_PYTHON_MODULE bArgs *ba; -#ifdef WIN32 +#endif + +#ifdef USE_WIN32_UNICODE_ARGS const char **argv; int argv_num; #endif + +#if defined(WITH_PYTHON_MODULE) && !defined(USE_WIN32_UNICODE_ARGS) + void *_empty; /* Prevent empty struct error with MSVC. */ +#endif }; static void callback_main_atexit(void *user_data) { struct CreatorAtExitData *app_init_data = user_data; +#ifndef WITH_PYTHON_MODULE if (app_init_data->ba) { BLI_args_destroy(app_init_data->ba); app_init_data->ba = NULL; } +#else + UNUSED_VARS(app_init_data); /* May be unused. */ +#endif -#ifdef WIN32 +#ifdef USE_WIN32_UNICODE_ARGS if (app_init_data->argv) { while (app_init_data->argv_num) { free((void *)app_init_data->argv[--app_init_data->argv_num]); @@ -156,6 +182,8 @@ static void callback_main_atexit(void *user_data) free((void *)app_init_data->argv); app_init_data->argv = NULL; } +#else + UNUSED_VARS(app_init_data); /* May be unused. */ #endif } @@ -241,7 +269,7 @@ void gmp_blender_init_allocator() * or exit immediately when running in background-mode. */ int main(int argc, -#ifdef WIN32 +#ifdef USE_WIN32_UNICODE_ARGS const char **UNUSED(argv_c) #else const char **argv @@ -254,7 +282,7 @@ int main(int argc, bArgs *ba; #endif -#ifdef WIN32 +#ifdef USE_WIN32_UNICODE_ARGS char **argv; int argv_num; #endif @@ -280,11 +308,11 @@ int main(int argc, _putenv_s("OMP_WAIT_POLICY", "PASSIVE"); # endif +# ifdef USE_WIN32_UNICODE_ARGS /* Win32 Unicode Arguments. */ - /* NOTE: cannot use `guardedalloc` allocation here, as it's not yet initialized - * (it depends on the arguments passed in, which is what we're getting here!) - */ { + /* NOTE: Can't use `guardedalloc` allocation here, as it's not yet initialized + * (it depends on the arguments passed in, which is what we're getting here!) */ wchar_t **argv_16 = CommandLineToArgvW(GetCommandLineW(), &argc); argv = malloc(argc * sizeof(char *)); for (argv_num = 0; argv_num < argc; argv_num++) { @@ -296,7 +324,8 @@ int main(int argc, app_init_data.argv = argv; app_init_data.argv_num = argv_num; } -#endif /* WIN32 */ +# endif /* USE_WIN32_UNICODE_ARGS */ +#endif /* WIN32 */ /* NOTE: Special exception for guarded allocator type switch: * we need to perform switch from lock-free to fully @@ -527,7 +556,7 @@ int main(int argc, (void)ba; #endif -#ifdef WIN32 +#ifdef USE_WIN32_UNICODE_ARGS argv = NULL; (void)argv; #endif diff --git a/source/creator/creator_intern.h b/source/creator/creator_intern.h index c9519f78af9..29ef6d96f15 100644 --- a/source/creator/creator_intern.h +++ b/source/creator/creator_intern.h @@ -11,6 +11,10 @@ struct bArgs; struct bContext; +#ifdef __cplusplus +extern "C" { +#endif + #ifndef WITH_PYTHON_MODULE /* creator_args.c */ @@ -68,14 +72,14 @@ enum { # define BUILD_DATE #endif -/* from buildinfo.c */ +/* From `buildinfo.c`. */ #ifdef BUILD_DATE extern char build_date[]; extern char build_time[]; extern char build_hash[]; extern unsigned long build_commit_timestamp; -/* TODO(sergey): ideally size need to be in sync with buildinfo.c */ +/* TODO(@sergey): ideally size need to be in sync with `buildinfo.c`. */ extern char build_commit_date[16]; extern char build_commit_time[16]; @@ -87,3 +91,7 @@ extern char build_cxxflags[]; extern char build_linkflags[]; extern char build_system[]; #endif /* BUILD_DATE */ + +#ifdef __cplusplus +} +#endif diff --git a/source/creator/creator_signals.c b/source/creator/creator_signals.c index 76423d7ba43..c016372e6b0 100644 --- a/source/creator/creator_signals.c +++ b/source/creator/creator_signals.c @@ -69,11 +69,10 @@ static void sig_handle_fpe(int UNUSED(sig)) # if !defined(WITH_HEADLESS) static void sig_handle_blender_esc(int sig) { - static int count = 0; - G.is_break = true; /* forces render loop to read queue, not sure if its needed */ if (sig == 2) { + static int count = 0; if (count) { printf("\nBlender killed\n"); exit(2); @@ -244,11 +243,9 @@ void main_signal_setup_background(void) /* for all platforms, even windows has it! */ BLI_assert(G.background); -# if !defined(WITH_HEADLESS) /* Support pressing `Ctrl-C` to close Blender in background-mode. * Useful to be able to cancel a render operation. */ signal(SIGINT, sig_handle_blender_esc); -# endif } void main_signal_setup_fpe(void) @@ -258,7 +255,7 @@ void main_signal_setup_fpe(void) * set breakpoints on sig_handle_fpe */ signal(SIGFPE, sig_handle_fpe); -# if defined(__linux__) && defined(__GNUC__) +# if defined(__linux__) && defined(__GNUC__) && defined(HAVE_FEENABLEEXCEPT) feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW); # endif /* defined(__linux__) && defined(__GNUC__) */ # if defined(OSX_SSE_FPE) |