From e12c08e8d170b7ca40f204a5b0423c23a9fbc2c1 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 17 Apr 2019 06:17:24 +0200 Subject: ClangFormat: apply to source, most of intern Apply clang format as proposed in T53211. For details on usage and instructions for migrating branches without conflicts, see: https://wiki.blender.org/wiki/Tools/ClangFormat --- source/creator/CMakeLists.txt | 1760 ++++++++++---------- source/creator/buildinfo.c | 9 +- source/creator/creator.c | 461 +++--- source/creator/creator_args.c | 3375 ++++++++++++++++++++------------------ source/creator/creator_intern.h | 34 +- source/creator/creator_signals.c | 546 +++--- 6 files changed, 3154 insertions(+), 3031 deletions(-) (limited to 'source/creator') diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt index 25de22a29f8..877d9c971a3 100644 --- a/source/creator/CMakeLists.txt +++ b/source/creator/CMakeLists.txt @@ -21,298 +21,298 @@ setup_libdirs() blender_include_dirs( - ../../intern/clog - ../../intern/guardedalloc - ../../intern/glew-mx - ../blender/blenlib - ../blender/blenkernel - ../blender/blenloader - ../blender/depsgraph - ../blender/editors/include - ../blender/makesrna - ../blender/imbuf - ../blender/render/extern/include - ../blender/makesdna - ../blender/gpu - ../blender/windowmanager + ../../intern/clog + ../../intern/guardedalloc + ../../intern/glew-mx + ../blender/blenlib + ../blender/blenkernel + ../blender/blenloader + ../blender/depsgraph + ../blender/editors/include + ../blender/makesrna + ../blender/imbuf + ../blender/render/extern/include + ../blender/makesdna + ../blender/gpu + ../blender/windowmanager ) set(LIB - bf_blenfont - bf_blenkernel - bf_blenlib - bf_blenloader - bf_depsgraph - bf_dna - bf_editor_datafiles - bf_imbuf - bf_intern_clog - bf_intern_guardedalloc - bf_intern_memutil - bf_intern_opencolorio - bf_python - bf_render - bf_rna - bf_windowmanager + bf_blenfont + bf_blenkernel + bf_blenlib + bf_blenloader + bf_depsgraph + bf_dna + bf_editor_datafiles + bf_imbuf + bf_intern_clog + bf_intern_guardedalloc + bf_intern_memutil + bf_intern_opencolorio + bf_python + bf_render + bf_rna + bf_windowmanager ) add_definitions(${GL_DEFINITIONS}) blender_include_dirs("${GLEW_INCLUDE_PATH}") if(WIN32) - blender_include_dirs(../../intern/utfconv) + blender_include_dirs(../../intern/utfconv) endif() if(WITH_LIBMV) - blender_include_dirs(../../intern/libmv) - add_definitions(-DWITH_LIBMV) + blender_include_dirs(../../intern/libmv) + add_definitions(-DWITH_LIBMV) endif() if(WITH_CYCLES) - if(WITH_CYCLES_LOGGING) - blender_include_dirs(../../intern/cycles/blender) - add_definitions(-DWITH_CYCLES_LOGGING) - endif() - list(APPEND LIB - bf_intern_cycles - ) + if(WITH_CYCLES_LOGGING) + blender_include_dirs(../../intern/cycles/blender) + add_definitions(-DWITH_CYCLES_LOGGING) + endif() + list(APPEND LIB + bf_intern_cycles + ) endif() if(WITH_CODEC_FFMPEG) - add_definitions(-DWITH_FFMPEG) + add_definitions(-DWITH_FFMPEG) endif() if(WITH_PYTHON) - blender_include_dirs(../blender/python) - add_definitions(-DWITH_PYTHON) + blender_include_dirs(../blender/python) + add_definitions(-DWITH_PYTHON) - if(WITH_PYTHON_SECURITY) - add_definitions(-DWITH_PYTHON_SECURITY) - endif() + if(WITH_PYTHON_SECURITY) + add_definitions(-DWITH_PYTHON_SECURITY) + endif() endif() if(WITH_HEADLESS) - add_definitions(-DWITH_HEADLESS) + add_definitions(-DWITH_HEADLESS) endif() if(WITH_SDL) - if(WITH_SDL_DYNLOAD) - blender_include_dirs(../../extern/sdlew/include) - add_definitions(-DWITH_SDL_DYNLOAD) - endif() - add_definitions(-DWITH_SDL) + if(WITH_SDL_DYNLOAD) + blender_include_dirs(../../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 LIB - extern_binreloc - ) - add_definitions(-DWITH_BINRELOC) + blender_include_dirs(${BINRELOC_INCLUDE_DIRS}) + list(APPEND LIB + extern_binreloc + ) + add_definitions(-DWITH_BINRELOC) endif() if(WITH_FREESTYLE) - blender_include_dirs(../blender/freestyle) - list(APPEND LIB - bf_freestyle - ) - add_definitions(-DWITH_FREESTYLE) + blender_include_dirs(../blender/freestyle) + list(APPEND LIB + bf_freestyle + ) + add_definitions(-DWITH_FREESTYLE) endif() # Setup the exe sources and buildinfo set(SRC - creator.c - creator_args.c - creator_signals.c + creator.c + creator_args.c + creator_signals.c - creator_intern.h + creator_intern.h ) # MSVC 2010 gives linking errors with the manifest if(WIN32 AND NOT UNIX) - string(SUBSTRING ${BLENDER_VERSION} 0 1 bver1) - string(SUBSTRING ${BLENDER_VERSION} 2 1 bver2) - string(SUBSTRING ${BLENDER_VERSION} 3 1 bver3) - add_definitions( - -DBLEN_VER_RC_STR=${BLENDER_VERSION} - -DBLEN_VER_RC_1=${bver1} - -DBLEN_VER_RC_2=${bver2} - -DBLEN_VER_RC_3=${bver3} - -DBLEN_VER_RC_4=0 - ) - - - list(APPEND SRC - ${CMAKE_SOURCE_DIR}/release/windows/icons/winblender.rc - ) + string(SUBSTRING ${BLENDER_VERSION} 0 1 bver1) + string(SUBSTRING ${BLENDER_VERSION} 2 1 bver2) + string(SUBSTRING ${BLENDER_VERSION} 3 1 bver3) + add_definitions( + -DBLEN_VER_RC_STR=${BLENDER_VERSION} + -DBLEN_VER_RC_1=${bver1} + -DBLEN_VER_RC_2=${bver2} + -DBLEN_VER_RC_3=${bver3} + -DBLEN_VER_RC_4=0 + ) + + + list(APPEND SRC + ${CMAKE_SOURCE_DIR}/release/windows/icons/winblender.rc + ) endif() if(WITH_BUILDINFO) - add_definitions(-DWITH_BUILDINFO) - # -------------------------------------------------------------------------- - # These defines could all be moved into the header below - string(REPLACE " " "\ " BUILDINFO_CFLAGS "${CMAKE_C_FLAGS}") - string(REPLACE " " "\ " BUILDINFO_CXXFLAGS "${CMAKE_CXX_FLAGS}") - string(REPLACE " " "\ " BUILDINFO_LINKFLAGS "${PLATFORM_LINKFLAGS}") - add_definitions( - # # define in header now, else these get out of date on rebuilds. - # -DBUILD_DATE="${BUILD_DATE}" - # -DBUILD_TIME="${BUILD_TIME}" - # -DBUILD_COMMIT_TIMESTAMP="${BUILD_COMMIT_TIMESTAMP}" - # -DBUILD_COMMIT_TIME="${BUILD_COMMIT_TIME}" - # -DBUILD_COMMIT_DATE="${BUILD_COMMIT_DATE}" - # -DBUILD_HASH="${BUILD_HASH}" - # -DBUILD_BRANCH="${BUILD_BRANCH}" - -DWITH_BUILDINFO_HEADER # alternative to lines above - -DBUILD_PLATFORM="${CMAKE_SYSTEM_NAME}" - -DBUILD_TYPE="${CMAKE_BUILD_TYPE}" - -DBUILD_CFLAGS="${BUILDINFO_CFLAGS}" - -DBUILD_CXXFLAGS="${BUILDINFO_CXXFLAGS}" - -DBUILD_LINKFLAGS="${BUILDINFO_LINKFLAGS}" - -DBUILD_SYSTEM="CMake" - ) - - # -------------------------------------------------------------------------- - # write header for values that change each build - # note, generaed file is in build dir's source/creator - # except when used as an include path. - - # include the output directory, where the buildinfo.h file is generated - include_directories(${CMAKE_CURRENT_BINARY_DIR}) - - - # 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. - # - # Keep this until we find a better way to resolve! - - set(buildinfo_h_real "${CMAKE_CURRENT_BINARY_DIR}/buildinfo.h") - 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!") - endif() - - # a custom target that is always built - add_custom_target(buildinfo ALL - DEPENDS ${buildinfo_h_fake}) - - # 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 - set_source_files_properties( - ${buildinfo_h_real} - PROPERTIES GENERATED TRUE - HEADER_FILE_ONLY TRUE) - - unset(buildinfo_h_real) - unset(buildinfo_h_fake) - - # add deps below, after adding blender - # -------------- done with header values. - - list(APPEND SRC - buildinfo.c - ) - - # make an object library so can load with it in tests - add_library(buildinfoobj OBJECT buildinfo.c) - add_dependencies(buildinfoobj buildinfo) + add_definitions(-DWITH_BUILDINFO) + # -------------------------------------------------------------------------- + # These defines could all be moved into the header below + string(REPLACE " " "\ " BUILDINFO_CFLAGS "${CMAKE_C_FLAGS}") + string(REPLACE " " "\ " BUILDINFO_CXXFLAGS "${CMAKE_CXX_FLAGS}") + string(REPLACE " " "\ " BUILDINFO_LINKFLAGS "${PLATFORM_LINKFLAGS}") + add_definitions( + # # define in header now, else these get out of date on rebuilds. + # -DBUILD_DATE="${BUILD_DATE}" + # -DBUILD_TIME="${BUILD_TIME}" + # -DBUILD_COMMIT_TIMESTAMP="${BUILD_COMMIT_TIMESTAMP}" + # -DBUILD_COMMIT_TIME="${BUILD_COMMIT_TIME}" + # -DBUILD_COMMIT_DATE="${BUILD_COMMIT_DATE}" + # -DBUILD_HASH="${BUILD_HASH}" + # -DBUILD_BRANCH="${BUILD_BRANCH}" + -DWITH_BUILDINFO_HEADER # alternative to lines above + -DBUILD_PLATFORM="${CMAKE_SYSTEM_NAME}" + -DBUILD_TYPE="${CMAKE_BUILD_TYPE}" + -DBUILD_CFLAGS="${BUILDINFO_CFLAGS}" + -DBUILD_CXXFLAGS="${BUILDINFO_CXXFLAGS}" + -DBUILD_LINKFLAGS="${BUILDINFO_LINKFLAGS}" + -DBUILD_SYSTEM="CMake" + ) + + # -------------------------------------------------------------------------- + # write header for values that change each build + # note, generaed file is in build dir's source/creator + # except when used as an include path. + + # include the output directory, where the buildinfo.h file is generated + include_directories(${CMAKE_CURRENT_BINARY_DIR}) + + + # 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. + # + # Keep this until we find a better way to resolve! + + set(buildinfo_h_real "${CMAKE_CURRENT_BINARY_DIR}/buildinfo.h") + 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!") + endif() + + # a custom target that is always built + add_custom_target(buildinfo ALL + DEPENDS ${buildinfo_h_fake}) + + # 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 + set_source_files_properties( + ${buildinfo_h_real} + PROPERTIES GENERATED TRUE + HEADER_FILE_ONLY TRUE) + + unset(buildinfo_h_real) + unset(buildinfo_h_fake) + + # add deps below, after adding blender + # -------------- done with header values. + + list(APPEND SRC + buildinfo.c + ) + + # make an object library so can load with it in tests + add_library(buildinfoobj OBJECT buildinfo.c) + add_dependencies(buildinfoobj buildinfo) endif() add_cc_flags_custom_test(blender) # message(STATUS "Configuring blender") if(WITH_PYTHON_MODULE) - add_definitions(-DWITH_PYTHON_MODULE) - - # creates ./bin/bpy.so which can be imported as a python module. - # - # note that 'SHARED' works on Linux and Windows, - # but not OSX which _must_ be 'MODULE' - add_library(blender MODULE ${SRC}) - 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 - ) - - if(APPLE) - set_target_properties( - blender - PROPERTIES - MACOSX_BUNDLE TRUE - LINK_FLAGS_RELEASE "${PLATFORM_LINKFLAGS}" - LINK_FLAGS_DEBUG "${PLATFORM_LINKFLAGS_DEBUG}" - ) - endif() - - if(WIN32) - # python modules use this - set_target_properties( - blender - PROPERTIES - SUFFIX ".pyd" - ) - endif() + add_definitions(-DWITH_PYTHON_MODULE) + + # creates ./bin/bpy.so which can be imported as a python module. + # + # note that 'SHARED' works on Linux and Windows, + # but not OSX which _must_ be 'MODULE' + add_library(blender MODULE ${SRC}) + 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 + ) + + if(APPLE) + set_target_properties( + blender + PROPERTIES + MACOSX_BUNDLE TRUE + LINK_FLAGS_RELEASE "${PLATFORM_LINKFLAGS}" + LINK_FLAGS_DEBUG "${PLATFORM_LINKFLAGS_DEBUG}" + ) + endif() + + if(WIN32) + # python modules use this + set_target_properties( + blender + PROPERTIES + SUFFIX ".pyd" + ) + endif() else() - add_executable(blender ${EXETYPE} ${SRC}) - WINDOWS_SIGN_TARGET(blender) + add_executable(blender ${EXETYPE} ${SRC}) + WINDOWS_SIGN_TARGET(blender) endif() if(WITH_BUILDINFO) - # explicitly say that the executable depends on the buildinfo - add_dependencies(blender buildinfo) + # explicitly say that the executable depends on the buildinfo + add_dependencies(blender buildinfo) endif() set(BLENDER_TEXT_FILES - ${CMAKE_SOURCE_DIR}/release/text/GPL-license.txt - ${CMAKE_SOURCE_DIR}/release/text/GPL3-license.txt - ${CMAKE_SOURCE_DIR}/release/text/copyright.txt - # generate this file - # ${CMAKE_SOURCE_DIR}/release/text/readme.html - ${CMAKE_SOURCE_DIR}/release/datafiles/LICENSE-bfont.ttf.txt + ${CMAKE_SOURCE_DIR}/release/text/GPL-license.txt + ${CMAKE_SOURCE_DIR}/release/text/GPL3-license.txt + ${CMAKE_SOURCE_DIR}/release/text/copyright.txt + # generate this file + # ${CMAKE_SOURCE_DIR}/release/text/readme.html + ${CMAKE_SOURCE_DIR}/release/datafiles/LICENSE-bfont.ttf.txt ) if(WITH_PYTHON) - list(APPEND BLENDER_TEXT_FILES - ${CMAKE_SOURCE_DIR}/release/text/Python-license.txt - ) + list(APPEND BLENDER_TEXT_FILES + ${CMAKE_SOURCE_DIR}/release/text/Python-license.txt + ) endif() if(WITH_OPENCOLORIO) - list(APPEND BLENDER_TEXT_FILES - ${CMAKE_SOURCE_DIR}/release/text/ocio-license.txt - ) + list(APPEND BLENDER_TEXT_FILES + ${CMAKE_SOURCE_DIR}/release/text/ocio-license.txt + ) endif() if(WITH_MEM_JEMALLOC) - list(APPEND BLENDER_TEXT_FILES - ${CMAKE_SOURCE_DIR}/release/text/jemalloc-license.txt - ) + list(APPEND BLENDER_TEXT_FILES + ${CMAKE_SOURCE_DIR}/release/text/jemalloc-license.txt + ) endif() if(WITH_INTERNATIONAL) - list(APPEND BLENDER_TEXT_FILES - ${CMAKE_SOURCE_DIR}/release/datafiles/LICENSE-droidsans.ttf.txt - ${CMAKE_SOURCE_DIR}/release/datafiles/LICENSE-bmonofont-i18n.ttf.txt - ) + list(APPEND BLENDER_TEXT_FILES + ${CMAKE_SOURCE_DIR}/release/datafiles/LICENSE-droidsans.ttf.txt + ${CMAKE_SOURCE_DIR}/release/datafiles/LICENSE-bmonofont-i18n.ttf.txt + ) endif() @@ -320,31 +320,31 @@ endif() # Platform Specific Var: TARGETDIR_VER if(UNIX AND NOT APPLE) - if(WITH_PYTHON_MODULE) - if(WITH_INSTALL_PORTABLE) - set(TARGETDIR_VER ${BLENDER_VERSION}) - else() - set(TARGETDIR_VER ${PYTHON_SITE_PACKAGES}/${BLENDER_VERSION}) - endif() - else() - if(WITH_INSTALL_PORTABLE) - set(TARGETDIR_VER ${BLENDER_VERSION}) - else() - set(TARGETDIR_VER share/blender/${BLENDER_VERSION}) - endif() - endif() + if(WITH_PYTHON_MODULE) + if(WITH_INSTALL_PORTABLE) + set(TARGETDIR_VER ${BLENDER_VERSION}) + else() + set(TARGETDIR_VER ${PYTHON_SITE_PACKAGES}/${BLENDER_VERSION}) + endif() + else() + if(WITH_INSTALL_PORTABLE) + set(TARGETDIR_VER ${BLENDER_VERSION}) + else() + set(TARGETDIR_VER share/blender/${BLENDER_VERSION}) + endif() + endif() elseif(WIN32) - set(TARGETDIR_VER ${BLENDER_VERSION}) + set(TARGETDIR_VER ${BLENDER_VERSION}) elseif(APPLE) - if(WITH_PYTHON_MODULE) - set(TARGETDIR_VER ${BLENDER_VERSION}) - else() - set(TARGETDIR_VER blender.app/Contents/Resources/${BLENDER_VERSION}) - endif() - # Skip relinking on cpack / install - set_target_properties(blender PROPERTIES BUILD_WITH_INSTALL_RPATH true) + if(WITH_PYTHON_MODULE) + set(TARGETDIR_VER ${BLENDER_VERSION}) + else() + set(TARGETDIR_VER blender.app/Contents/Resources/${BLENDER_VERSION}) + endif() + # Skip relinking on cpack / install + set_target_properties(blender PROPERTIES BUILD_WITH_INSTALL_RPATH true) endif() @@ -354,107 +354,107 @@ endif() # important to make a clean install each time, else old scripts get loaded. install( - CODE - "file(REMOVE_RECURSE ${TARGETDIR_VER})" + CODE + "file(REMOVE_RECURSE ${TARGETDIR_VER})" ) if(WITH_PYTHON) - # install(CODE "message(\"copying blender scripts...\")") - - # exclude addons_contrib if release - if("${BLENDER_VERSION_CYCLE}" STREQUAL "release" OR - "${BLENDER_VERSION_CYCLE}" STREQUAL "rc") - set(ADDON_EXCLUDE_CONDITIONAL "addons_contrib/*") - else() - set(ADDON_EXCLUDE_CONDITIONAL "_addons_contrib/*") # dummy, wont 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, wont do anything - endif() - - install( - DIRECTORY ${CMAKE_SOURCE_DIR}/release/scripts - DESTINATION ${TARGETDIR_VER} - PATTERN ".git" EXCLUDE - PATTERN ".gitignore" EXCLUDE - PATTERN ".arcconfig" EXCLUDE - PATTERN "__pycache__" EXCLUDE - PATTERN "${ADDON_EXCLUDE_CONDITIONAL}" EXCLUDE - PATTERN "${FREESTYLE_EXCLUDE_CONDITIONAL}" EXCLUDE - ) - - unset(ADDON_EXCLUDE_CONDITIONAL) - unset(FREESTYLE_EXCLUDE_CONDITIONAL) + # install(CODE "message(\"copying blender scripts...\")") + + # exclude addons_contrib if release + if("${BLENDER_VERSION_CYCLE}" STREQUAL "release" OR + "${BLENDER_VERSION_CYCLE}" STREQUAL "rc") + set(ADDON_EXCLUDE_CONDITIONAL "addons_contrib/*") + else() + set(ADDON_EXCLUDE_CONDITIONAL "_addons_contrib/*") # dummy, wont 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, wont do anything + endif() + + install( + DIRECTORY ${CMAKE_SOURCE_DIR}/release/scripts + DESTINATION ${TARGETDIR_VER} + PATTERN ".git" EXCLUDE + PATTERN ".gitignore" EXCLUDE + PATTERN ".arcconfig" EXCLUDE + PATTERN "__pycache__" EXCLUDE + PATTERN "${ADDON_EXCLUDE_CONDITIONAL}" EXCLUDE + PATTERN "${FREESTYLE_EXCLUDE_CONDITIONAL}" EXCLUDE + ) + + unset(ADDON_EXCLUDE_CONDITIONAL) + unset(FREESTYLE_EXCLUDE_CONDITIONAL) endif() # localization if(WITH_INTERNATIONAL) - install( - DIRECTORY - ${CMAKE_SOURCE_DIR}/release/datafiles/fonts - DESTINATION ${TARGETDIR_VER}/datafiles - ) - - set(_locale_dir "${CMAKE_SOURCE_DIR}/release/datafiles/locale") - set(_locale_target_dir ${TARGETDIR_VER}/datafiles/locale) - - file(GLOB _po_files "${_locale_dir}/po/*.po") - foreach(_po_file ${_po_files}) - msgfmt_simple(${_po_file} _all_mo_files) - endforeach() - - # 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 - install( - FILES ${_locale_dir}/languages - DESTINATION ${_locale_target_dir} - ) - - foreach(_mo_file ${_all_mo_files}) - get_filename_component(_locale_name ${_mo_file} NAME_WE) - install( - FILES ${_mo_file} - DESTINATION ${_locale_target_dir}/${_locale_name}/LC_MESSAGES - RENAME blender.mo - ) - unset(_locale_name) - endforeach() - - unset(_all_mo_files) - unset(_po_files) - unset(_po_file) - unset(_mo_file) - unset(_locale_target_dir) - - unset(_locale_dir) + install( + DIRECTORY + ${CMAKE_SOURCE_DIR}/release/datafiles/fonts + DESTINATION ${TARGETDIR_VER}/datafiles + ) + + set(_locale_dir "${CMAKE_SOURCE_DIR}/release/datafiles/locale") + set(_locale_target_dir ${TARGETDIR_VER}/datafiles/locale) + + file(GLOB _po_files "${_locale_dir}/po/*.po") + foreach(_po_file ${_po_files}) + msgfmt_simple(${_po_file} _all_mo_files) + endforeach() + + # 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 + install( + FILES ${_locale_dir}/languages + DESTINATION ${_locale_target_dir} + ) + + foreach(_mo_file ${_all_mo_files}) + get_filename_component(_locale_name ${_mo_file} NAME_WE) + install( + FILES ${_mo_file} + DESTINATION ${_locale_target_dir}/${_locale_name}/LC_MESSAGES + RENAME blender.mo + ) + unset(_locale_name) + endforeach() + + unset(_all_mo_files) + unset(_po_files) + unset(_po_file) + unset(_mo_file) + unset(_locale_target_dir) + + unset(_locale_dir) endif() # color management if(WITH_OPENCOLORIO) - install( - DIRECTORY ${CMAKE_SOURCE_DIR}/release/datafiles/colormanagement - DESTINATION ${TARGETDIR_VER}/datafiles - ) + install( + DIRECTORY ${CMAKE_SOURCE_DIR}/release/datafiles/colormanagement + DESTINATION ${TARGETDIR_VER}/datafiles + ) endif() # helpful tip when using make if("${CMAKE_GENERATOR}" MATCHES ".*Makefiles.*") - # message 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}' - ) + # message 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}' + ) endif() @@ -463,528 +463,528 @@ endif() if(UNIX AND NOT APPLE) - if(NOT WITH_PYTHON_MODULE) - if(WITH_DOC_MANPAGE) - add_custom_target( - blender_man_page ALL - COMMAND ${CMAKE_SOURCE_DIR}/doc/manpage/blender.1.py - ${EXECUTABLE_OUTPUT_PATH}/blender - ${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(WITH_PYTHON_MODULE) - if(WITH_INSTALL_PORTABLE) - install( - TARGETS blender - DESTINATION "." - ) - else() - install( - TARGETS blender - LIBRARY DESTINATION ${PYTHON_SITE_PACKAGES} - ) - endif() - # none of the other files are needed currently - elseif(WITH_INSTALL_PORTABLE) - install( - TARGETS blender - DESTINATION "." - ) - - if(WITH_DOC_MANPAGE) - install( - FILES ${CMAKE_CURRENT_BINARY_DIR}/blender.1 - DESTINATION "." - ) - endif() - install( - FILES - ${CMAKE_SOURCE_DIR}/release/freedesktop/blender.desktop - ${CMAKE_SOURCE_DIR}/release/freedesktop/icons/scalable/apps/blender.svg - ${CMAKE_SOURCE_DIR}/release/freedesktop/icons/symbolic/apps/blender-symbolic.svg - DESTINATION "." - ) - - install( - PROGRAMS - ${CMAKE_SOURCE_DIR}/release/bin/blender-thumbnailer.py - DESTINATION "." - ) - - set(BLENDER_TEXT_FILES_DESTINATION ".") - else() - # main blender binary - install( - TARGETS blender - DESTINATION bin - ) - if(WITH_DOC_MANPAGE) - # manpage only with 'blender' binary - install( - FILES ${CMAKE_CURRENT_BINARY_DIR}/blender.1 - DESTINATION share/man/man1 - ) - endif() - - # misc files - install( - FILES ${CMAKE_SOURCE_DIR}/release/freedesktop/blender.desktop - DESTINATION share/applications - ) - install( - FILES ${CMAKE_SOURCE_DIR}/release/freedesktop/icons/scalable/apps/blender.svg - DESTINATION share/icons/hicolor/scalable/apps - ) - install( - FILES ${CMAKE_SOURCE_DIR}/release/freedesktop/icons/symbolic/apps/blender-symbolic.svg - DESTINATION share/icons/hicolor/symbolic/apps - ) - install( - PROGRAMS ${CMAKE_SOURCE_DIR}/release/bin/blender-thumbnailer.py - DESTINATION bin - ) - set(BLENDER_TEXT_FILES_DESTINATION share/doc/blender) - endif() - - if(WITH_PYTHON) - if(WITH_PYTHON_INSTALL) - - install( - PROGRAMS ${PYTHON_EXECUTABLE} - 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' - get_filename_component(_pypath_real ${PYTHON_LIBPATH} REALPATH) - if(${_pypath_real} MATCHES "lib64$") - set(_target_LIB "lib64") - else() - set(_target_LIB "lib") - endif() - unset(_pypath_real) - - # 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} - DESTINATION ${TARGETDIR_VER}/python/${_target_LIB} - PATTERN "__pycache__" EXCLUDE # * any cache * - PATTERN "config-${PYTHON_VERSION}m/*.a" EXCLUDE # static lib - PATTERN "lib2to3" EXCLUDE # ./lib2to3 - PATTERN "site-packages/*" EXCLUDE # ./site-packages/* - PATTERN "tkinter" EXCLUDE # ./tkinter - PATTERN "lib-dynload/_tkinter.*" EXCLUDE # ./lib-dynload/_tkinter.co - PATTERN "idlelib" EXCLUDE # ./idlelib - PATTERN "test" EXCLUDE # ./test - PATTERN "turtledemo" EXCLUDE # ./turtledemo - PATTERN "turtle.py" EXCLUDE # ./turtle.py - ) - - # 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 - DESTINATION ${TARGETDIR_VER}/python/include/${_py_inc_suffix} - ) - unset(_py_inc_suffix) - - if(WITH_PYTHON_INSTALL_NUMPY) - # Install to the same directory as the source, so debian-like - # distros are happy with their policy. - set(_suffix "site-packages") - if(${PYTHON_NUMPY_PATH} MATCHES "dist-packages") - set(_suffix "dist-packages") - endif() - install( - DIRECTORY ${PYTHON_NUMPY_PATH}/numpy - DESTINATION ${TARGETDIR_VER}/python/${_target_LIB}/python${PYTHON_VERSION}/${_suffix} - PATTERN ".svn" EXCLUDE - PATTERN "__pycache__" EXCLUDE # * any cache * - PATTERN "*.pyc" EXCLUDE # * any cache * - PATTERN "*.pyo" EXCLUDE # * any cache * - PATTERN "oldnumeric" EXCLUDE # ./oldnumeric - PATTERN "doc" EXCLUDE # ./doc - PATTERN "tests" EXCLUDE # ./tests - PATTERN "f2py" EXCLUDE # ./f2py - fortran/python interface code, not for blender. - PATTERN "include" EXCLUDE # include dirs all over, we wont use NumPy/CAPI - PATTERN "*.h" EXCLUDE # some includes are not in include dirs - PATTERN "*.a" EXCLUDE # ./core/lib/libnpymath.a - for linking, we dont need. - ) - unset(_suffix) - endif() - - # Copy requests, we need to generalize site-packages - if(WITH_PYTHON_INSTALL_REQUESTS) - set(_suffix "site-packages") - if(${PYTHON_REQUESTS_PATH} MATCHES "dist-packages") - set(_suffix "dist-packages") - endif() - install( - DIRECTORY ${PYTHON_REQUESTS_PATH}/requests - DESTINATION ${TARGETDIR_VER}/python/${_target_LIB}/python${PYTHON_VERSION}/${_suffix} - PATTERN ".svn" EXCLUDE - PATTERN "__pycache__" EXCLUDE # * any cache * - PATTERN "*.pyc" EXCLUDE # * any cache * - PATTERN "*.pyo" EXCLUDE # * any cache * - ) - # On some platforms requests does have extra dependencies. - set(_requests_deps "certifi" "chardet" "idna" "urllib3") - foreach(_requests_dep ${_requests_deps}) - if(EXISTS ${PYTHON_REQUESTS_PATH}/${_requests_dep}) - install( - DIRECTORY ${PYTHON_REQUESTS_PATH}/${_requests_dep} - DESTINATION ${TARGETDIR_VER}/python/${_target_LIB}/python${PYTHON_VERSION}/${_suffix} - PATTERN ".svn" EXCLUDE - PATTERN "__pycache__" EXCLUDE # * any cache * - PATTERN "*.pyc" EXCLUDE # * any cache * - PATTERN "*.pyo" EXCLUDE # * any cache * - ) - endif() - endforeach() - if(EXISTS ${PYTHON_REQUESTS_PATH}/six.py) - install( - FILES ${PYTHON_REQUESTS_PATH}/six.py - DESTINATION ${TARGETDIR_VER}/python/${_target_LIB}/python${PYTHON_VERSION}/${_suffix} - ) - endif() - unset(_requests_dep) - unset(_requests_deps) - unset(_suffix) - endif() - unset(_target_LIB) - - endif() - endif() - - if(WITH_DRACO) - install( - PROGRAMS $ - DESTINATION ${TARGETDIR_VER}/python/lib/python${PYTHON_VERSION}/site-packages - ) - endif() + if(NOT WITH_PYTHON_MODULE) + if(WITH_DOC_MANPAGE) + add_custom_target( + blender_man_page ALL + COMMAND ${CMAKE_SOURCE_DIR}/doc/manpage/blender.1.py + ${EXECUTABLE_OUTPUT_PATH}/blender + ${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(WITH_PYTHON_MODULE) + if(WITH_INSTALL_PORTABLE) + install( + TARGETS blender + DESTINATION "." + ) + else() + install( + TARGETS blender + LIBRARY DESTINATION ${PYTHON_SITE_PACKAGES} + ) + endif() + # none of the other files are needed currently + elseif(WITH_INSTALL_PORTABLE) + install( + TARGETS blender + DESTINATION "." + ) + + if(WITH_DOC_MANPAGE) + install( + FILES ${CMAKE_CURRENT_BINARY_DIR}/blender.1 + DESTINATION "." + ) + endif() + install( + FILES + ${CMAKE_SOURCE_DIR}/release/freedesktop/blender.desktop + ${CMAKE_SOURCE_DIR}/release/freedesktop/icons/scalable/apps/blender.svg + ${CMAKE_SOURCE_DIR}/release/freedesktop/icons/symbolic/apps/blender-symbolic.svg + DESTINATION "." + ) + + install( + PROGRAMS + ${CMAKE_SOURCE_DIR}/release/bin/blender-thumbnailer.py + DESTINATION "." + ) + + set(BLENDER_TEXT_FILES_DESTINATION ".") + else() + # main blender binary + install( + TARGETS blender + DESTINATION bin + ) + if(WITH_DOC_MANPAGE) + # manpage only with 'blender' binary + install( + FILES ${CMAKE_CURRENT_BINARY_DIR}/blender.1 + DESTINATION share/man/man1 + ) + endif() + + # misc files + install( + FILES ${CMAKE_SOURCE_DIR}/release/freedesktop/blender.desktop + DESTINATION share/applications + ) + install( + FILES ${CMAKE_SOURCE_DIR}/release/freedesktop/icons/scalable/apps/blender.svg + DESTINATION share/icons/hicolor/scalable/apps + ) + install( + FILES ${CMAKE_SOURCE_DIR}/release/freedesktop/icons/symbolic/apps/blender-symbolic.svg + DESTINATION share/icons/hicolor/symbolic/apps + ) + install( + PROGRAMS ${CMAKE_SOURCE_DIR}/release/bin/blender-thumbnailer.py + DESTINATION bin + ) + set(BLENDER_TEXT_FILES_DESTINATION share/doc/blender) + endif() + + if(WITH_PYTHON) + if(WITH_PYTHON_INSTALL) + + install( + PROGRAMS ${PYTHON_EXECUTABLE} + 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' + get_filename_component(_pypath_real ${PYTHON_LIBPATH} REALPATH) + if(${_pypath_real} MATCHES "lib64$") + set(_target_LIB "lib64") + else() + set(_target_LIB "lib") + endif() + unset(_pypath_real) + + # 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} + DESTINATION ${TARGETDIR_VER}/python/${_target_LIB} + PATTERN "__pycache__" EXCLUDE # * any cache * + PATTERN "config-${PYTHON_VERSION}m/*.a" EXCLUDE # static lib + PATTERN "lib2to3" EXCLUDE # ./lib2to3 + PATTERN "site-packages/*" EXCLUDE # ./site-packages/* + PATTERN "tkinter" EXCLUDE # ./tkinter + PATTERN "lib-dynload/_tkinter.*" EXCLUDE # ./lib-dynload/_tkinter.co + PATTERN "idlelib" EXCLUDE # ./idlelib + PATTERN "test" EXCLUDE # ./test + PATTERN "turtledemo" EXCLUDE # ./turtledemo + PATTERN "turtle.py" EXCLUDE # ./turtle.py + ) + + # 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 + DESTINATION ${TARGETDIR_VER}/python/include/${_py_inc_suffix} + ) + unset(_py_inc_suffix) + + if(WITH_PYTHON_INSTALL_NUMPY) + # Install to the same directory as the source, so debian-like + # distros are happy with their policy. + set(_suffix "site-packages") + if(${PYTHON_NUMPY_PATH} MATCHES "dist-packages") + set(_suffix "dist-packages") + endif() + install( + DIRECTORY ${PYTHON_NUMPY_PATH}/numpy + DESTINATION ${TARGETDIR_VER}/python/${_target_LIB}/python${PYTHON_VERSION}/${_suffix} + PATTERN ".svn" EXCLUDE + PATTERN "__pycache__" EXCLUDE # * any cache * + PATTERN "*.pyc" EXCLUDE # * any cache * + PATTERN "*.pyo" EXCLUDE # * any cache * + PATTERN "oldnumeric" EXCLUDE # ./oldnumeric + PATTERN "doc" EXCLUDE # ./doc + PATTERN "tests" EXCLUDE # ./tests + PATTERN "f2py" EXCLUDE # ./f2py - fortran/python interface code, not for blender. + PATTERN "include" EXCLUDE # include dirs all over, we wont use NumPy/CAPI + PATTERN "*.h" EXCLUDE # some includes are not in include dirs + PATTERN "*.a" EXCLUDE # ./core/lib/libnpymath.a - for linking, we dont need. + ) + unset(_suffix) + endif() + + # Copy requests, we need to generalize site-packages + if(WITH_PYTHON_INSTALL_REQUESTS) + set(_suffix "site-packages") + if(${PYTHON_REQUESTS_PATH} MATCHES "dist-packages") + set(_suffix "dist-packages") + endif() + install( + DIRECTORY ${PYTHON_REQUESTS_PATH}/requests + DESTINATION ${TARGETDIR_VER}/python/${_target_LIB}/python${PYTHON_VERSION}/${_suffix} + PATTERN ".svn" EXCLUDE + PATTERN "__pycache__" EXCLUDE # * any cache * + PATTERN "*.pyc" EXCLUDE # * any cache * + PATTERN "*.pyo" EXCLUDE # * any cache * + ) + # On some platforms requests does have extra dependencies. + set(_requests_deps "certifi" "chardet" "idna" "urllib3") + foreach(_requests_dep ${_requests_deps}) + if(EXISTS ${PYTHON_REQUESTS_PATH}/${_requests_dep}) + install( + DIRECTORY ${PYTHON_REQUESTS_PATH}/${_requests_dep} + DESTINATION ${TARGETDIR_VER}/python/${_target_LIB}/python${PYTHON_VERSION}/${_suffix} + PATTERN ".svn" EXCLUDE + PATTERN "__pycache__" EXCLUDE # * any cache * + PATTERN "*.pyc" EXCLUDE # * any cache * + PATTERN "*.pyo" EXCLUDE # * any cache * + ) + endif() + endforeach() + if(EXISTS ${PYTHON_REQUESTS_PATH}/six.py) + install( + FILES ${PYTHON_REQUESTS_PATH}/six.py + DESTINATION ${TARGETDIR_VER}/python/${_target_LIB}/python${PYTHON_VERSION}/${_suffix} + ) + endif() + unset(_requests_dep) + unset(_requests_deps) + unset(_suffix) + endif() + unset(_target_LIB) + + endif() + endif() + + if(WITH_DRACO) + install( + PROGRAMS $ + DESTINATION ${TARGETDIR_VER}/python/lib/python${PYTHON_VERSION}/site-packages + ) + endif() elseif(WIN32) - set(BLENDER_TEXT_FILES_DESTINATION ".") - - if(WITH_PYTHON) - string(REPLACE "." "" _PYTHON_VERSION_NO_DOTS ${PYTHON_VERSION}) - - if(NOT CMAKE_COMPILER_IS_GNUCC) - install( - FILES ${LIBDIR}/python/lib/python${_PYTHON_VERSION_NO_DOTS}.dll - DESTINATION "." - CONFIGURATIONS Release;RelWithDebInfo;MinSizeRel - ) - - install( - FILES ${LIBDIR}/python/lib/python${_PYTHON_VERSION_NO_DOTS}_d.dll - DESTINATION "." - CONFIGURATIONS Debug - ) - endif() - - if(WITH_PYTHON_INSTALL) - # 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) - - # WARNING: its important that 'CMAKE_INSTALL_CONFIG_NAME' is evaluated at build time - # and _NOT_ configuration time, when modifying the lines below, - # check it works in both Release & Debug mode. - # - # Edit with extreme care! - Campbell - - # extract python - install( - CODE - " - message(STATUS \"Extracting Python to: \${CMAKE_INSTALL_PREFIX}/${BLENDER_VERSION}/python\") - if(\"\${CMAKE_INSTALL_CONFIG_NAME}\" MATCHES \"^([Dd][Ee][Bb][Uu][Gg])$\") - set(PYTHON_ZIP \"${LIBDIR}/release/python${_PYTHON_VERSION_NO_DOTS}_d.tar.gz\") - else() - set(PYTHON_ZIP \"${LIBDIR}/release/python${_PYTHON_VERSION_NO_DOTS}.tar.gz\") - endif() - - execute_process( - COMMAND \${CMAKE_COMMAND} -E make_directory - \"\${CMAKE_INSTALL_PREFIX}/${BLENDER_VERSION}/python\" - COMMAND \${CMAKE_COMMAND} -E - chdir \"\${CMAKE_INSTALL_PREFIX}/${BLENDER_VERSION}/python\" - \${CMAKE_COMMAND} -E - tar xzfv \"\${PYTHON_ZIP}\" - ) - unset(PYTHON_ZIP) - " - ) - - # release/site-packages - install( - DIRECTORY ${LIBDIR}/release/site-packages - DESTINATION ${BLENDER_VERSION}/python/lib - PATTERN ".svn" EXCLUDE - PATTERN "__pycache__" EXCLUDE # * any cache * - PATTERN "*.pyc" EXCLUDE # * any cache * - PATTERN "*.pyo" EXCLUDE # * any cache *) - ) - - if(WITH_PYTHON_INSTALL_NUMPY) - set(PYTHON_NUMPY_VERSION 1.15) - add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${BLENDER_VERSION}/python/lib/site-packages - COMMAND ${CMAKE_COMMAND} -E - make_directory ${CMAKE_CURRENT_BINARY_DIR}/${BLENDER_VERSION}/python/lib/site-packages) - - add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${BLENDER_VERSION}/python/lib/site-packages/numpy - COMMAND ${CMAKE_COMMAND} -E - tar xzvf "${LIBDIR}/release/python${_PYTHON_VERSION_NO_DOTS}_numpy_${PYTHON_NUMPY_VERSION}$<$:d>.tar.gz" - DEPENDS - ${LIBDIR}/release/python${_PYTHON_VERSION_NO_DOTS}_numpy_${PYTHON_NUMPY_VERSION}$<$:d>.tar.gz - ${CMAKE_CURRENT_BINARY_DIR}/${BLENDER_VERSION}/python/lib/site-packages - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${BLENDER_VERSION}/python/lib/site-packages - ) - add_custom_target( - python_numpy ALL - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${BLENDER_VERSION}/python/lib/site-packages/numpy - ) - install( - DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${BLENDER_VERSION}/python/lib/site-packages/numpy - DESTINATION ${BLENDER_VERSION}/python/lib/site-packages - ) - endif() - - - # TODO(sergey): For unti we've got better way to deal with python binary - install( - FILES ${LIBDIR}/python/lib/python${_PYTHON_VERSION_NO_DOTS}.dll - DESTINATION ${BLENDER_VERSION}/python/bin - CONFIGURATIONS Release;RelWithDebInfo;MinSizeRel - ) - install( - FILES ${LIBDIR}/python/lib/python${_PYTHON_VERSION_NO_DOTS}_d.dll - DESTINATION ${BLENDER_VERSION}/python/bin - CONFIGURATIONS Debug - ) - if(WINDOWS_PYTHON_DEBUG) - install( - FILES ${LIBDIR}/python/lib/python${_PYTHON_VERSION_NO_DOTS}.pdb - DESTINATION "." - CONFIGURATIONS Release;RelWithDebInfo;MinSizeRel - ) - - install( - FILES ${LIBDIR}/python/lib/python${_PYTHON_VERSION_NO_DOTS}_d.pdb - DESTINATION "." - CONFIGURATIONS Debug - ) - endif() - endif() - - 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) - install( - FILES - ${LIBDIR}/ffmpeg/lib/avcodec-58.dll - ${LIBDIR}/ffmpeg/lib/avformat-58.dll - ${LIBDIR}/ffmpeg/lib/avdevice-58.dll - ${LIBDIR}/ffmpeg/lib/avutil-56.dll - ${LIBDIR}/ffmpeg/lib/swscale-5.dll - ${LIBDIR}/ffmpeg/lib/swresample-3.dll - DESTINATION "." - ) - endif() - - if(WITH_CODEC_SNDFILE) - install( - FILES ${LIBDIR}/sndfile/lib/libsndfile-1.dll - DESTINATION "." - ) - endif() - - if(WITH_OPENAL) - install( - FILES - ${LIBDIR}/openal/lib/OpenAL32.dll - DESTINATION "." - ) - endif() - - if(WITH_SDL) - install( - FILES ${LIBDIR}/sdl/lib/SDL2.dll - DESTINATION "." - ) - endif() - - if(WITH_SYSTEM_AUDASPACE) - install( - FILES - ${LIBDIR}/audaspace/lib/audaspace.dll - ${LIBDIR}/audaspace/lib/audaspace-c.dll - ${LIBDIR}/audaspace/lib/audaspace-py.dll - DESTINATION "." - ) - endif() - - if(NOT CMAKE_CL_64) - install( - FILES ${LIBDIR}/thumbhandler/lib/BlendThumb.dll - DESTINATION "." - ) - endif() - - install( # x86 builds can run on x64 Windows, so this is required at all times - FILES ${LIBDIR}/thumbhandler/lib/BlendThumb64.dll - DESTINATION "." - ) - - 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 - DESTINATION "." - ) - - if(WITH_DRACO) - install( - PROGRAMS $ - DESTINATION ${TARGETDIR_VER}/python/lib/site-packages - ) - endif() + set(BLENDER_TEXT_FILES_DESTINATION ".") + + if(WITH_PYTHON) + string(REPLACE "." "" _PYTHON_VERSION_NO_DOTS ${PYTHON_VERSION}) + + if(NOT CMAKE_COMPILER_IS_GNUCC) + install( + FILES ${LIBDIR}/python/lib/python${_PYTHON_VERSION_NO_DOTS}.dll + DESTINATION "." + CONFIGURATIONS Release;RelWithDebInfo;MinSizeRel + ) + + install( + FILES ${LIBDIR}/python/lib/python${_PYTHON_VERSION_NO_DOTS}_d.dll + DESTINATION "." + CONFIGURATIONS Debug + ) + endif() + + if(WITH_PYTHON_INSTALL) + # 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) + + # WARNING: its important that 'CMAKE_INSTALL_CONFIG_NAME' is evaluated at build time + # and _NOT_ configuration time, when modifying the lines below, + # check it works in both Release & Debug mode. + # + # Edit with extreme care! - Campbell + + # extract python + install( + CODE + " + message(STATUS \"Extracting Python to: \${CMAKE_INSTALL_PREFIX}/${BLENDER_VERSION}/python\") + if(\"\${CMAKE_INSTALL_CONFIG_NAME}\" MATCHES \"^([Dd][Ee][Bb][Uu][Gg])$\") + set(PYTHON_ZIP \"${LIBDIR}/release/python${_PYTHON_VERSION_NO_DOTS}_d.tar.gz\") + else() + set(PYTHON_ZIP \"${LIBDIR}/release/python${_PYTHON_VERSION_NO_DOTS}.tar.gz\") + endif() + + execute_process( + COMMAND \${CMAKE_COMMAND} -E make_directory + \"\${CMAKE_INSTALL_PREFIX}/${BLENDER_VERSION}/python\" + COMMAND \${CMAKE_COMMAND} -E + chdir \"\${CMAKE_INSTALL_PREFIX}/${BLENDER_VERSION}/python\" + \${CMAKE_COMMAND} -E + tar xzfv \"\${PYTHON_ZIP}\" + ) + unset(PYTHON_ZIP) + " + ) + + # release/site-packages + install( + DIRECTORY ${LIBDIR}/release/site-packages + DESTINATION ${BLENDER_VERSION}/python/lib + PATTERN ".svn" EXCLUDE + PATTERN "__pycache__" EXCLUDE # * any cache * + PATTERN "*.pyc" EXCLUDE # * any cache * + PATTERN "*.pyo" EXCLUDE # * any cache *) + ) + + if(WITH_PYTHON_INSTALL_NUMPY) + set(PYTHON_NUMPY_VERSION 1.15) + add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${BLENDER_VERSION}/python/lib/site-packages + COMMAND ${CMAKE_COMMAND} -E + make_directory ${CMAKE_CURRENT_BINARY_DIR}/${BLENDER_VERSION}/python/lib/site-packages) + + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${BLENDER_VERSION}/python/lib/site-packages/numpy + COMMAND ${CMAKE_COMMAND} -E + tar xzvf "${LIBDIR}/release/python${_PYTHON_VERSION_NO_DOTS}_numpy_${PYTHON_NUMPY_VERSION}$<$:d>.tar.gz" + DEPENDS + ${LIBDIR}/release/python${_PYTHON_VERSION_NO_DOTS}_numpy_${PYTHON_NUMPY_VERSION}$<$:d>.tar.gz + ${CMAKE_CURRENT_BINARY_DIR}/${BLENDER_VERSION}/python/lib/site-packages + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${BLENDER_VERSION}/python/lib/site-packages + ) + add_custom_target( + python_numpy ALL + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${BLENDER_VERSION}/python/lib/site-packages/numpy + ) + install( + DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${BLENDER_VERSION}/python/lib/site-packages/numpy + DESTINATION ${BLENDER_VERSION}/python/lib/site-packages + ) + endif() + + + # TODO(sergey): For unti we've got better way to deal with python binary + install( + FILES ${LIBDIR}/python/lib/python${_PYTHON_VERSION_NO_DOTS}.dll + DESTINATION ${BLENDER_VERSION}/python/bin + CONFIGURATIONS Release;RelWithDebInfo;MinSizeRel + ) + install( + FILES ${LIBDIR}/python/lib/python${_PYTHON_VERSION_NO_DOTS}_d.dll + DESTINATION ${BLENDER_VERSION}/python/bin + CONFIGURATIONS Debug + ) + if(WINDOWS_PYTHON_DEBUG) + install( + FILES ${LIBDIR}/python/lib/python${_PYTHON_VERSION_NO_DOTS}.pdb + DESTINATION "." + CONFIGURATIONS Release;RelWithDebInfo;MinSizeRel + ) + + install( + FILES ${LIBDIR}/python/lib/python${_PYTHON_VERSION_NO_DOTS}_d.pdb + DESTINATION "." + CONFIGURATIONS Debug + ) + endif() + endif() + + 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) + install( + FILES + ${LIBDIR}/ffmpeg/lib/avcodec-58.dll + ${LIBDIR}/ffmpeg/lib/avformat-58.dll + ${LIBDIR}/ffmpeg/lib/avdevice-58.dll + ${LIBDIR}/ffmpeg/lib/avutil-56.dll + ${LIBDIR}/ffmpeg/lib/swscale-5.dll + ${LIBDIR}/ffmpeg/lib/swresample-3.dll + DESTINATION "." + ) + endif() + + if(WITH_CODEC_SNDFILE) + install( + FILES ${LIBDIR}/sndfile/lib/libsndfile-1.dll + DESTINATION "." + ) + endif() + + if(WITH_OPENAL) + install( + FILES + ${LIBDIR}/openal/lib/OpenAL32.dll + DESTINATION "." + ) + endif() + + if(WITH_SDL) + install( + FILES ${LIBDIR}/sdl/lib/SDL2.dll + DESTINATION "." + ) + endif() + + if(WITH_SYSTEM_AUDASPACE) + install( + FILES + ${LIBDIR}/audaspace/lib/audaspace.dll + ${LIBDIR}/audaspace/lib/audaspace-c.dll + ${LIBDIR}/audaspace/lib/audaspace-py.dll + DESTINATION "." + ) + endif() + + if(NOT CMAKE_CL_64) + install( + FILES ${LIBDIR}/thumbhandler/lib/BlendThumb.dll + DESTINATION "." + ) + endif() + + install( # x86 builds can run on x64 Windows, so this is required at all times + FILES ${LIBDIR}/thumbhandler/lib/BlendThumb64.dll + DESTINATION "." + ) + + 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 + DESTINATION "." + ) + + if(WITH_DRACO) + install( + PROGRAMS $ + DESTINATION ${TARGETDIR_VER}/python/lib/site-packages + ) + endif() elseif(APPLE) - # 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} - DESTINATION ${to} - PATTERN ".git" EXCLUDE - PATTERN ".svn" EXCLUDE - PATTERN "*.pyc" EXCLUDE - PATTERN "*.pyo" EXCLUDE - PATTERN "*.orig" EXCLUDE - PATTERN "*.rej" EXCLUDE - PATTERN "__pycache__" EXCLUDE - PATTERN "__MACOSX" EXCLUDE - PATTERN ".DS_Store" EXCLUDE - PATTERN "config-${PYTHON_VERSION}m/*.a" EXCLUDE # static lib - PATTERN "lib2to3" EXCLUDE # ./lib2to3 - PATTERN "tkinter" EXCLUDE # ./tkinter - PATTERN "lib-dynload/_tkinter.*" EXCLUDE # ./lib-dynload/_tkinter.co - PATTERN "idlelib" EXCLUDE # ./idlelib - PATTERN "test" EXCLUDE # ./test - PATTERN "turtledemo" EXCLUDE # ./turtledemo - PATTERN "turtle.py" EXCLUDE # ./turtle.py - ) - endmacro() - - 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) - - set_target_properties(blender PROPERTIES - MACOSX_BUNDLE_INFO_PLIST ${OSX_APP_SOURCEDIR}/Contents/Info.plist - MACOSX_BUNDLE_SHORT_VERSION_STRING "${BLENDER_VERSION}${BLENDER_VERSION_CHAR}" - MACOSX_BUNDLE_LONG_VERSION_STRING "${BLENDER_VERSION}${BLENDER_VERSION_CHAR} ${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) - - # Give the bundle actual creation/modification date - execute_process(COMMAND SetFile -d ${SETFILE_DATE} -m ${SETFILE_DATE} - ${EXECUTABLE_OUTPUT_PATH}/blender.app) - - install( - TARGETS blender - DESTINATION "." - ) - - # install release and app files - set(BLENDER_TEXT_FILES_DESTINATION ".") - - install( - FILES ${OSX_APP_SOURCEDIR}/Contents/PkgInfo - DESTINATION blender.app/Contents - ) - - install_dir( - ${OSX_APP_SOURCEDIR}/Contents/Resources - blender.app/Contents/ - ) - - if(WITH_OPENMP AND OPENMP_CUSTOM) - install( - FILES ${LIBDIR}/openmp/lib/libomp.dylib - DESTINATION blender.app/Contents/Resources/lib - ) - endif() - - if(WITH_LLVM AND NOT LLVM_STATIC) - install( - FILES ${LIBDIR}/llvm/lib/libLLVM-3.4.dylib - DESTINATION blender.app/Contents/MacOS - ) - endif() - - # python - if(WITH_PYTHON AND NOT WITH_PYTHON_MODULE AND NOT WITH_PYTHON_FRAMEWORK) - # Copy the python libs into the install directory - install_dir( - ${PYTHON_LIBPATH} - ${TARGETDIR_VER}/python/lib - ) - - install(DIRECTORY ${LIBDIR}/python/bin - DESTINATION ${TARGETDIR_VER}/python - USE_SOURCE_PERMISSIONS - ) - - # 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 - DESTINATION ${TARGETDIR_VER}/python/include/${_py_inc_suffix} - ) - unset(_py_inc_suffix) - endif() - - if(WITH_DRACO) - install( - PROGRAMS $ - DESTINATION ${TARGETDIR_VER}/python/lib/python${PYTHON_VERSION}/site-packages - ) - endif() + # 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} + DESTINATION ${to} + PATTERN ".git" EXCLUDE + PATTERN ".svn" EXCLUDE + PATTERN "*.pyc" EXCLUDE + PATTERN "*.pyo" EXCLUDE + PATTERN "*.orig" EXCLUDE + PATTERN "*.rej" EXCLUDE + PATTERN "__pycache__" EXCLUDE + PATTERN "__MACOSX" EXCLUDE + PATTERN ".DS_Store" EXCLUDE + PATTERN "config-${PYTHON_VERSION}m/*.a" EXCLUDE # static lib + PATTERN "lib2to3" EXCLUDE # ./lib2to3 + PATTERN "tkinter" EXCLUDE # ./tkinter + PATTERN "lib-dynload/_tkinter.*" EXCLUDE # ./lib-dynload/_tkinter.co + PATTERN "idlelib" EXCLUDE # ./idlelib + PATTERN "test" EXCLUDE # ./test + PATTERN "turtledemo" EXCLUDE # ./turtledemo + PATTERN "turtle.py" EXCLUDE # ./turtle.py + ) + endmacro() + + 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) + + set_target_properties(blender PROPERTIES + MACOSX_BUNDLE_INFO_PLIST ${OSX_APP_SOURCEDIR}/Contents/Info.plist + MACOSX_BUNDLE_SHORT_VERSION_STRING "${BLENDER_VERSION}${BLENDER_VERSION_CHAR}" + MACOSX_BUNDLE_LONG_VERSION_STRING "${BLENDER_VERSION}${BLENDER_VERSION_CHAR} ${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) + + # Give the bundle actual creation/modification date + execute_process(COMMAND SetFile -d ${SETFILE_DATE} -m ${SETFILE_DATE} + ${EXECUTABLE_OUTPUT_PATH}/blender.app) + + install( + TARGETS blender + DESTINATION "." + ) + + # install release and app files + set(BLENDER_TEXT_FILES_DESTINATION ".") + + install( + FILES ${OSX_APP_SOURCEDIR}/Contents/PkgInfo + DESTINATION blender.app/Contents + ) + + install_dir( + ${OSX_APP_SOURCEDIR}/Contents/Resources + blender.app/Contents/ + ) + + if(WITH_OPENMP AND OPENMP_CUSTOM) + install( + FILES ${LIBDIR}/openmp/lib/libomp.dylib + DESTINATION blender.app/Contents/Resources/lib + ) + endif() + + if(WITH_LLVM AND NOT LLVM_STATIC) + install( + FILES ${LIBDIR}/llvm/lib/libLLVM-3.4.dylib + DESTINATION blender.app/Contents/MacOS + ) + endif() + + # python + if(WITH_PYTHON AND NOT WITH_PYTHON_MODULE AND NOT WITH_PYTHON_FRAMEWORK) + # Copy the python libs into the install directory + install_dir( + ${PYTHON_LIBPATH} + ${TARGETDIR_VER}/python/lib + ) + + install(DIRECTORY ${LIBDIR}/python/bin + DESTINATION ${TARGETDIR_VER}/python + USE_SOURCE_PERMISSIONS + ) + + # 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 + DESTINATION ${TARGETDIR_VER}/python/include/${_py_inc_suffix} + ) + unset(_py_inc_suffix) + endif() + + if(WITH_DRACO) + install( + PROGRAMS $ + DESTINATION ${TARGETDIR_VER}/python/lib/python${PYTHON_VERSION}/site-packages + ) + endif() endif() # ----------------------------------------------------------------------------- @@ -992,24 +992,24 @@ endif() if(DEFINED BLENDER_TEXT_FILES_DESTINATION) - install( - CODE - " - file(READ \"${CMAKE_SOURCE_DIR}/release/text/readme.html\" DATA_SRC) - string(REGEX REPLACE \"BLENDER_VERSION\" \"${BLENDER_VERSION}\" DATA_DST \"\${DATA_SRC}\") - file(WRITE \"${CMAKE_BINARY_DIR}/release/text/readme.html\" \"\${DATA_DST}\") - unset(DATA_SRC) - unset(DATA_DST) - " - ) - list(APPEND BLENDER_TEXT_FILES - ${CMAKE_BINARY_DIR}/release/text/readme.html - ) - - install( - FILES ${BLENDER_TEXT_FILES} - DESTINATION "${BLENDER_TEXT_FILES_DESTINATION}" - ) + install( + CODE + " + file(READ \"${CMAKE_SOURCE_DIR}/release/text/readme.html\" DATA_SRC) + string(REGEX REPLACE \"BLENDER_VERSION\" \"${BLENDER_VERSION}\" DATA_DST \"\${DATA_SRC}\") + file(WRITE \"${CMAKE_BINARY_DIR}/release/text/readme.html\" \"\${DATA_DST}\") + unset(DATA_SRC) + unset(DATA_DST) + " + ) + list(APPEND BLENDER_TEXT_FILES + ${CMAKE_BINARY_DIR}/release/text/readme.html + ) + + install( + FILES ${BLENDER_TEXT_FILES} + DESTINATION "${BLENDER_TEXT_FILES_DESTINATION}" + ) endif() # install more files specified elsewhere @@ -1026,13 +1026,13 @@ unset(BLENDER_TEXT_FILES_DESTINATION) get_property(_icon_names GLOBAL PROPERTY ICON_GEOM_NAMES) set(_icon_files) foreach(_f ${_icon_names}) - list(APPEND _icon_files - "${CMAKE_SOURCE_DIR}/release/datafiles/icons/${_f}.dat" - ) + list(APPEND _icon_files + "${CMAKE_SOURCE_DIR}/release/datafiles/icons/${_f}.dat" + ) endforeach() install( - FILES ${_icon_files} - DESTINATION ${TARGETDIR_VER}/datafiles/icons + FILES ${_icon_files} + DESTINATION ${TARGETDIR_VER}/datafiles/icons ) unset(_icon_names) @@ -1042,9 +1042,9 @@ unset(_f) # ----------------------------------------------------------------------------- # Studio Lights install( - DIRECTORY - ${CMAKE_SOURCE_DIR}/release/datafiles/studiolights - DESTINATION ${TARGETDIR_VER}/datafiles + DIRECTORY + ${CMAKE_SOURCE_DIR}/release/datafiles/studiolights + DESTINATION ${TARGETDIR_VER}/datafiles ) # ----------------------------------------------------------------------------- @@ -1061,14 +1061,14 @@ setup_liblinks(blender) # Setup launcher if(WIN32 AND NOT WITH_PYTHON_MODULE) - install( - TARGETS blender - COMPONENT Blender - DESTINATION "." - ) - set_target_properties( - blender - PROPERTIES - VS_USER_PROPS "blender.Cpp.user.props" - ) + install( + TARGETS blender + COMPONENT Blender + DESTINATION "." + ) + set_target_properties( + blender + PROPERTIES + VS_USER_PROPS "blender.Cpp.user.props" + ) endif() diff --git a/source/creator/buildinfo.c b/source/creator/buildinfo.c index 6f3948ada55..7843a25c037 100644 --- a/source/creator/buildinfo.c +++ b/source/creator/buildinfo.c @@ -21,7 +21,6 @@ * \ingroup creator */ - #ifdef WITH_BUILDINFO_HEADER # include "buildinfo.h" #endif @@ -40,16 +39,16 @@ char build_branch[] = BUILD_BRANCH; char build_platform[] = BUILD_PLATFORM; char build_type[] = BUILD_TYPE; -#ifdef BUILD_CFLAGS +# ifdef BUILD_CFLAGS char build_cflags[] = BUILD_CFLAGS; char build_cxxflags[] = BUILD_CXXFLAGS; char build_linkflags[] = BUILD_LINKFLAGS; char build_system[] = BUILD_SYSTEM; -#else +# else char build_cflags[] = "unmaintained buildsystem alert!"; char build_cxxflags[] = "unmaintained buildsystem alert!"; char build_linkflags[] = "unmaintained buildsystem alert!"; char build_system[] = "unmaintained buildsystem alert!"; -#endif +# endif -#endif // BUILD_DATE +#endif // BUILD_DATE diff --git a/source/creator/creator.c b/source/creator/creator.c index f44c1d1303a..713ebdaadec 100644 --- a/source/creator/creator.c +++ b/source/creator/creator.c @@ -64,7 +64,7 @@ #include "DEG_depsgraph.h" -#include "IMB_imbuf.h" /* for IMB_init */ +#include "IMB_imbuf.h" /* for IMB_init */ #include "RE_engine.h" #include "RE_render_ext.h" @@ -102,24 +102,25 @@ # include "sdlew.h" #endif -#include "creator_intern.h" /* own include */ +#include "creator_intern.h" /* own include */ - -/* Local Function prototypes */ +/* Local Function prototypes */ #ifdef WITH_PYTHON_MODULE -int main_python_enter(int argc, const char **argv); +int main_python_enter(int argc, const char **argv); void main_python_exit(void); #endif /* written to by 'creator_args.c' */ struct ApplicationState app_state = { - .signal = { - .use_crash_handler = true, - .use_abort_handler = true, - }, - .exit_code_on_error = { - .python = 0, - }, + .signal = + { + .use_crash_handler = true, + .use_abort_handler = true, + }, + .exit_code_on_error = + { + .python = 0, + }, }; /* -------------------------------------------------------------------- */ @@ -131,53 +132,52 @@ struct ApplicationState app_state = { static void callback_mem_error(const char *errorStr) { - fputs(errorStr, stderr); - fflush(stderr); + fputs(errorStr, stderr); + fflush(stderr); } static void main_callback_setup(void) { - /* Error output from the alloc routines: */ - MEM_set_error_callback(callback_mem_error); + /* Error output from the alloc routines: */ + MEM_set_error_callback(callback_mem_error); } /* free data on early exit (if Python calls 'sys.exit()' while parsing args for eg). */ struct CreatorAtExitData { - bArgs *ba; + bArgs *ba; #ifdef WIN32 - const char **argv; - int argv_num; + const char **argv; + int argv_num; #endif }; static void callback_main_atexit(void *user_data) { - struct CreatorAtExitData *app_init_data = user_data; + struct CreatorAtExitData *app_init_data = user_data; - if (app_init_data->ba) { - BLI_argsFree(app_init_data->ba); - app_init_data->ba = NULL; - } + if (app_init_data->ba) { + BLI_argsFree(app_init_data->ba); + app_init_data->ba = NULL; + } #ifdef WIN32 - if (app_init_data->argv) { - while (app_init_data->argv_num) { - free((void *)app_init_data->argv[--app_init_data->argv_num]); - } - free((void *)app_init_data->argv); - app_init_data->argv = NULL; - } + if (app_init_data->argv) { + while (app_init_data->argv_num) { + free((void *)app_init_data->argv[--app_init_data->argv_num]); + } + free((void *)app_init_data->argv); + app_init_data->argv = NULL; + } #endif } static void callback_clg_fatal(void *fp) { - BLI_system_backtrace(fp); + BLI_system_backtrace(fp); } /** \} */ - /* -------------------------------------------------------------------- */ /** \name Main Function * \{ */ @@ -188,7 +188,7 @@ static void callback_clg_fatal(void *fp) static void *evil_C = NULL; # ifdef __APPLE__ - /* environ is not available in mac shared libraries */ +/* environ is not available in mac shared libraries */ # include char **environ = NULL; # endif @@ -201,315 +201,312 @@ char **environ = NULL; * - run #WM_main() event loop, * or exit immediately when running in background mode. */ -int main( - int argc, +int main(int argc, #ifdef WIN32 - const char **UNUSED(argv_c) + const char **UNUSED(argv_c) #else - const char **argv + const char **argv #endif - ) +) { - bContext *C; + bContext *C; #ifndef WITH_PYTHON_MODULE - bArgs *ba; + bArgs *ba; #endif #ifdef WIN32 - char **argv; - int argv_num; + char **argv; + int argv_num; #endif - /* --- end declarations --- */ + /* --- end declarations --- */ - /* ensure we free data on early-exit */ - struct CreatorAtExitData app_init_data = {NULL}; - BKE_blender_atexit_register(callback_main_atexit, &app_init_data); + /* ensure we free data on early-exit */ + struct CreatorAtExitData app_init_data = {NULL}; + BKE_blender_atexit_register(callback_main_atexit, &app_init_data); - /* Unbuffered stdout makes stdout and stderr better synchronized, and helps - * when stepping through code in a debugger (prints are immediately - * visible). */ - setvbuf(stdout, NULL, _IONBF, 0); + /* Unbuffered stdout makes stdout and stderr better synchronized, and helps + * when stepping through code in a debugger (prints are immediately + * visible). */ + setvbuf(stdout, NULL, _IONBF, 0); #ifdef WIN32 - /* We delay loading of openmp so we can set the policy here. */ -# if defined(_MSC_VER) - _putenv_s("OMP_WAIT_POLICY", "PASSIVE"); -# endif + /* We delay loading of openmp so we can set the policy here. */ +# if defined(_MSC_VER) + _putenv_s("OMP_WAIT_POLICY", "PASSIVE"); +# endif - /* FMA3 support in the 2013 CRT is broken on Vista and Windows 7 RTM - * (fixed in SP1). Just disable it. */ + /* FMA3 support in the 2013 CRT is broken on Vista and Windows 7 RTM + * (fixed in SP1). Just disable it. */ # if defined(_MSC_VER) && defined(_M_X64) - _set_FMA3_enable(0); + _set_FMA3_enable(0); # endif - /* Win32 Unicode Args */ - /* NOTE: cannot use guardedalloc malloc here, as it's not yet initialized - * (it depends on the args 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++) { - argv[argv_num] = alloc_utf_8_from_16(argv_16[argv_num], 0); - } - LocalFree(argv_16); - - /* free on early-exit */ - app_init_data.argv = argv; - app_init_data.argv_num = argv_num; - } -#endif /* WIN32 */ - - /* NOTE: Special exception for guarded allocator type switch: - * we need to perform switch from lock-free to fully - * guarded allocator before any allocation happened. - */ - { - int i; - for (i = 0; i < argc; i++) { - if (STR_ELEM(argv[i], "-d", "--debug", "--debug-memory", "--debug-all")) { - printf("Switching to fully guarded memory allocator.\n"); - MEM_use_guarded_allocator(); - break; - } - else if (STREQ(argv[i], "--")) { - break; - } - } - } + /* Win32 Unicode Args */ + /* NOTE: cannot use guardedalloc malloc here, as it's not yet initialized + * (it depends on the args 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++) { + argv[argv_num] = alloc_utf_8_from_16(argv_16[argv_num], 0); + } + LocalFree(argv_16); + + /* free on early-exit */ + app_init_data.argv = argv; + app_init_data.argv_num = argv_num; + } +#endif /* WIN32 */ + + /* NOTE: Special exception for guarded allocator type switch: + * we need to perform switch from lock-free to fully + * guarded allocator before any allocation happened. + */ + { + int i; + for (i = 0; i < argc; i++) { + if (STR_ELEM(argv[i], "-d", "--debug", "--debug-memory", "--debug-all")) { + printf("Switching to fully guarded memory allocator.\n"); + MEM_use_guarded_allocator(); + break; + } + else if (STREQ(argv[i], "--")) { + break; + } + } + } #ifdef BUILD_DATE - { - time_t temp_time = build_commit_timestamp; - struct tm *tm = gmtime(&temp_time); - if (LIKELY(tm)) { - strftime(build_commit_date, sizeof(build_commit_date), "%Y-%m-%d", tm); - strftime(build_commit_time, sizeof(build_commit_time), "%H:%M", tm); - } - else { - const char *unknown = "date-unknown"; - BLI_strncpy(build_commit_date, unknown, sizeof(build_commit_date)); - BLI_strncpy(build_commit_time, unknown, sizeof(build_commit_time)); - } - } + { + time_t temp_time = build_commit_timestamp; + struct tm *tm = gmtime(&temp_time); + if (LIKELY(tm)) { + strftime(build_commit_date, sizeof(build_commit_date), "%Y-%m-%d", tm); + strftime(build_commit_time, sizeof(build_commit_time), "%H:%M", tm); + } + else { + const char *unknown = "date-unknown"; + BLI_strncpy(build_commit_date, unknown, sizeof(build_commit_date)); + BLI_strncpy(build_commit_time, unknown, sizeof(build_commit_time)); + } + } #endif #ifdef WITH_SDL_DYNLOAD - sdlewInit(); + sdlewInit(); #endif - /* Initialize logging */ - CLG_init(); - CLG_fatal_fn_set(callback_clg_fatal); + /* Initialize logging */ + CLG_init(); + CLG_fatal_fn_set(callback_clg_fatal); - C = CTX_create(); + C = CTX_create(); #ifdef WITH_PYTHON_MODULE -#ifdef __APPLE__ - environ = *_NSGetEnviron(); -#endif +# ifdef __APPLE__ + environ = *_NSGetEnviron(); +# endif -#undef main - evil_C = C; +# undef main + evil_C = C; #endif - - #ifdef WITH_BINRELOC - br_init(NULL); + br_init(NULL); #endif #ifdef WITH_LIBMV - libmv_initLogging(argv[0]); + libmv_initLogging(argv[0]); #elif defined(WITH_CYCLES_LOGGING) - CCL_init_logging(argv[0]); + CCL_init_logging(argv[0]); #endif - main_callback_setup(); + main_callback_setup(); #if defined(__APPLE__) && !defined(WITH_PYTHON_MODULE) - /* patch to ignore argument finder gives us (pid?) */ - if (argc == 2 && STREQLEN(argv[1], "-psn_", 5)) { - extern int GHOST_HACK_getFirstFile(char buf[]); - static char firstfilebuf[512]; + /* patch to ignore argument finder gives us (pid?) */ + if (argc == 2 && STREQLEN(argv[1], "-psn_", 5)) { + extern int GHOST_HACK_getFirstFile(char buf[]); + static char firstfilebuf[512]; - argc = 1; + argc = 1; - if (GHOST_HACK_getFirstFile(firstfilebuf)) { - argc = 2; - argv[1] = firstfilebuf; - } - } + if (GHOST_HACK_getFirstFile(firstfilebuf)) { + argc = 2; + argv[1] = firstfilebuf; + } + } #endif #ifdef __FreeBSD__ - fpsetmask(0); + fpsetmask(0); #endif - /* initialize path to executable */ - BKE_appdir_program_path_init(argv[0]); + /* initialize path to executable */ + BKE_appdir_program_path_init(argv[0]); - BLI_threadapi_init(); - BLI_thread_put_process_on_fast_node(); + BLI_threadapi_init(); + BLI_thread_put_process_on_fast_node(); - DNA_sdna_current_init(); + DNA_sdna_current_init(); - BKE_blender_globals_init(); /* blender.c */ + BKE_blender_globals_init(); /* blender.c */ - IMB_init(); - BKE_cachefiles_init(); - BKE_images_init(); - BKE_modifier_init(); - BKE_gpencil_modifier_init(); - BKE_shaderfx_init(); - DEG_register_node_types(); + IMB_init(); + BKE_cachefiles_init(); + BKE_images_init(); + BKE_modifier_init(); + BKE_gpencil_modifier_init(); + BKE_shaderfx_init(); + DEG_register_node_types(); - BKE_brush_system_init(); - RE_texture_rng_init(); + BKE_brush_system_init(); + RE_texture_rng_init(); + BLI_callback_global_init(); - BLI_callback_global_init(); - - /* first test for background */ + /* first test for background */ #ifndef WITH_PYTHON_MODULE - ba = BLI_argsInit(argc, (const char **)argv); /* skip binary path */ + ba = BLI_argsInit(argc, (const char **)argv); /* skip binary path */ - /* ensure we free on early exit */ - app_init_data.ba = ba; + /* ensure we free on early exit */ + app_init_data.ba = ba; - main_args_setup(C, ba); + main_args_setup(C, ba); - BLI_argsParse(ba, 1, NULL, NULL); + BLI_argsParse(ba, 1, NULL, NULL); - main_signal_setup(); + main_signal_setup(); #else - /* using preferences or user startup makes no sense for py-as-module */ - G.factory_startup = true; + /* using preferences or user startup makes no sense for py-as-module */ + G.factory_startup = true; #endif #ifdef WITH_FFMPEG - IMB_ffmpeg_init(); + IMB_ffmpeg_init(); #endif - /* after level 1 args, this is so playanim skips RNA init */ - RNA_init(); - - RE_engines_init(); - init_nodesystem(); - psys_init_rng(); - /* end second init */ + /* after level 1 args, this is so playanim skips RNA init */ + RNA_init(); + RE_engines_init(); + init_nodesystem(); + psys_init_rng(); + /* end second init */ #if defined(WITH_PYTHON_MODULE) || defined(WITH_HEADLESS) - G.background = true; /* python module mode ALWAYS runs in background mode (for now) */ + G.background = true; /* python module mode ALWAYS runs in background mode (for now) */ #else - if (G.background) { - main_signal_setup_background(); - } + if (G.background) { + main_signal_setup_background(); + } #endif - /* background render uses this font too */ - BKE_vfont_builtin_register(datatoc_bfont_pfb, datatoc_bfont_pfb_size); + /* background render uses this font too */ + BKE_vfont_builtin_register(datatoc_bfont_pfb, datatoc_bfont_pfb_size); - /* Initialize ffmpeg if built in, also needed for bg mode if videos are - * rendered via ffmpeg */ - BKE_sound_init_once(); + /* Initialize ffmpeg if built in, also needed for bg mode if videos are + * rendered via ffmpeg */ + BKE_sound_init_once(); - init_def_material(); + init_def_material(); - if (G.background == 0) { + if (G.background == 0) { #ifndef WITH_PYTHON_MODULE - BLI_argsParse(ba, 2, NULL, NULL); - BLI_argsParse(ba, 3, NULL, NULL); + BLI_argsParse(ba, 2, NULL, NULL); + BLI_argsParse(ba, 3, NULL, NULL); #endif - WM_init(C, argc, (const char **)argv); + WM_init(C, argc, (const char **)argv); - /* this is properly initialized with user defs, but this is default */ - /* call after loading the startup.blend so we can read U.tempdir */ - BKE_tempdir_init(U.tempdir); - } - else { + /* this is properly initialized with user defs, but this is default */ + /* call after loading the startup.blend so we can read U.tempdir */ + BKE_tempdir_init(U.tempdir); + } + else { #ifndef WITH_PYTHON_MODULE - BLI_argsParse(ba, 3, NULL, NULL); + BLI_argsParse(ba, 3, NULL, NULL); #endif - WM_init(C, argc, (const char **)argv); + WM_init(C, argc, (const char **)argv); - /* don't use user preferences temp dir */ - BKE_tempdir_init(NULL); - } + /* don't use user preferences temp dir */ + BKE_tempdir_init(NULL); + } #ifdef WITH_PYTHON - /** - * NOTE: the U.pythondir string is NULL until WM_init() is executed, - * so we provide the BPY_ function below to append the user defined - * python-dir to Python's sys.path at this point. Simply putting - * WM_init() before #BPY_python_start() crashes Blender at startup. - */ - - /* TODO - U.pythondir */ + /** + * NOTE: the U.pythondir string is NULL until WM_init() is executed, + * so we provide the BPY_ function below to append the user defined + * python-dir to Python's sys.path at this point. Simply putting + * WM_init() before #BPY_python_start() crashes Blender at startup. + */ + + /* TODO - U.pythondir */ #else - printf("\n* WARNING * - Blender compiled without Python!\nthis is not intended for typical usage\n\n"); + printf( + "\n* WARNING * - Blender compiled without Python!\nthis is not intended for typical " + "usage\n\n"); #endif - CTX_py_init_set(C, 1); - WM_keyconfig_init(C); + CTX_py_init_set(C, 1); + WM_keyconfig_init(C); #ifdef WITH_FREESTYLE - /* initialize Freestyle */ - FRS_initialize(); - FRS_set_context(C); + /* initialize Freestyle */ + FRS_initialize(); + FRS_set_context(C); #endif - /* OK we are ready for it */ + /* OK we are ready for it */ #ifndef WITH_PYTHON_MODULE - main_args_setup_post(C, ba); + main_args_setup_post(C, ba); #endif - /* Explicitly free data allocated for argument parsing: - * - 'ba' - * - 'argv' on WIN32. - */ - callback_main_atexit(&app_init_data); - BKE_blender_atexit_unregister(callback_main_atexit, &app_init_data); + /* Explicitly free data allocated for argument parsing: + * - 'ba' + * - 'argv' on WIN32. + */ + callback_main_atexit(&app_init_data); + BKE_blender_atexit_unregister(callback_main_atexit, &app_init_data); - /* paranoid, avoid accidental re-use */ + /* paranoid, avoid accidental re-use */ #ifndef WITH_PYTHON_MODULE - ba = NULL; - (void)ba; + ba = NULL; + (void)ba; #endif #ifdef WIN32 - argv = NULL; - (void)argv; + argv = NULL; + (void)argv; #endif #ifdef WITH_PYTHON_MODULE - return 0; /* keep blender in background mode running */ + return 0; /* keep blender in background mode running */ #endif - if (G.background) { - /* Using window-manager API in background mode is a bit odd, but works fine. */ - WM_exit(C); - } - else { - if (!G.file_loaded) { - WM_init_splash(C); - } - } + if (G.background) { + /* Using window-manager API in background mode is a bit odd, but works fine. */ + WM_exit(C); + } + else { + if (!G.file_loaded) { + WM_init_splash(C); + } + } - WM_main(C); + WM_main(C); - return 0; + return 0; } /* end of int main(argc, argv) */ #ifdef WITH_PYTHON_MODULE void main_python_exit(void) { - WM_exit_ext((bContext *)evil_C, true); - evil_C = NULL; + WM_exit_ext((bContext *)evil_C, true); + evil_C = NULL; } #endif diff --git a/source/creator/creator_args.c b/source/creator/creator_args.c index 659a2a91175..afe9a135c79 100644 --- a/source/creator/creator_args.c +++ b/source/creator/creator_args.c @@ -20,133 +20,134 @@ #ifndef WITH_PYTHON_MODULE -#include -#include -#include +# include +# include +# include -#include "MEM_guardedalloc.h" +# include "MEM_guardedalloc.h" -#include "CLG_log.h" +# include "CLG_log.h" -#ifdef WIN32 -# include "BLI_winstuff.h" -#endif +# ifdef WIN32 +# include "BLI_winstuff.h" +# endif -#include "BLI_args.h" -#include "BLI_threads.h" -#include "BLI_utildefines.h" -#include "BLI_listbase.h" -#include "BLI_string.h" -#include "BLI_string_utf8.h" -#include "BLI_path_util.h" -#include "BLI_fileops.h" -#include "BLI_mempool.h" -#include "BLI_system.h" +# include "BLI_args.h" +# include "BLI_threads.h" +# include "BLI_utildefines.h" +# include "BLI_listbase.h" +# include "BLI_string.h" +# include "BLI_string_utf8.h" +# include "BLI_path_util.h" +# include "BLI_fileops.h" +# include "BLI_mempool.h" +# include "BLI_system.h" -#include "BLO_readfile.h" /* only for BLO_has_bfile_extension */ +# include "BLO_readfile.h" /* only for BLO_has_bfile_extension */ -#include "BKE_blender_version.h" -#include "BKE_context.h" +# include "BKE_blender_version.h" +# include "BKE_context.h" -#include "BKE_global.h" -#include "BKE_image.h" -#include "BKE_library.h" -#include "BKE_library_override.h" -#include "BKE_main.h" -#include "BKE_report.h" -#include "BKE_scene.h" -#include "BKE_sound.h" +# include "BKE_global.h" +# include "BKE_image.h" +# include "BKE_library.h" +# include "BKE_library_override.h" +# include "BKE_main.h" +# include "BKE_report.h" +# include "BKE_scene.h" +# include "BKE_sound.h" -#ifdef WITH_FFMPEG -#include "IMB_imbuf.h" -#endif +# ifdef WITH_FFMPEG +# include "IMB_imbuf.h" +# endif -#ifdef WITH_PYTHON -#include "BPY_extern.h" -#endif +# ifdef WITH_PYTHON +# include "BPY_extern.h" +# endif -#include "RE_engine.h" -#include "RE_pipeline.h" +# include "RE_engine.h" +# include "RE_pipeline.h" -#include "ED_datafiles.h" +# include "ED_datafiles.h" -#include "WM_api.h" +# include "WM_api.h" -#include "GPU_draw.h" +# include "GPU_draw.h" -#ifdef WITH_LIBMV -# include "libmv-capi.h" -#endif +# ifdef WITH_LIBMV +# include "libmv-capi.h" +# endif -#ifdef WITH_CYCLES_LOGGING -# include "CCL_api.h" -#endif +# ifdef WITH_CYCLES_LOGGING +# include "CCL_api.h" +# endif -#include "DEG_depsgraph.h" -#include "DEG_depsgraph_build.h" -#include "DEG_depsgraph_debug.h" - -#include "creator_intern.h" /* own include */ +# include "DEG_depsgraph.h" +# include "DEG_depsgraph_build.h" +# include "DEG_depsgraph_debug.h" +# include "creator_intern.h" /* own include */ /* -------------------------------------------------------------------- */ /** \name Utility String Parsing * \{ */ -static bool parse_int_relative( - const char *str, const char *str_end_test, int pos, int neg, - int *r_value, const char **r_err_msg) -{ - char *str_end = NULL; - long value; - - errno = 0; - - switch (*str) { - case '+': - value = pos + strtol(str + 1, &str_end, 10); - break; - case '-': - value = (neg - strtol(str + 1, &str_end, 10)) + 1; - break; - default: - value = strtol(str, &str_end, 10); - break; - } - - - if (*str_end != '\0' && (str_end != str_end_test)) { - static const char *msg = "not a number"; - *r_err_msg = msg; - return false; - } - else if ((errno == ERANGE) || ((value < INT_MIN || value > INT_MAX))) { - static const char *msg = "exceeds range"; - *r_err_msg = msg; - return false; - } - else { - *r_value = (int)value; - return true; - } +static bool parse_int_relative(const char *str, + const char *str_end_test, + int pos, + int neg, + int *r_value, + const char **r_err_msg) +{ + char *str_end = NULL; + long value; + + errno = 0; + + switch (*str) { + case '+': + value = pos + strtol(str + 1, &str_end, 10); + break; + case '-': + value = (neg - strtol(str + 1, &str_end, 10)) + 1; + break; + default: + value = strtol(str, &str_end, 10); + break; + } + + if (*str_end != '\0' && (str_end != str_end_test)) { + static const char *msg = "not a number"; + *r_err_msg = msg; + return false; + } + else if ((errno == ERANGE) || ((value < INT_MIN || value > INT_MAX))) { + static const char *msg = "exceeds range"; + *r_err_msg = msg; + return false; + } + else { + *r_value = (int)value; + return true; + } } static const char *parse_int_range_sep_search(const char *str, const char *str_end_test) { - const char *str_end_range = NULL; - if (str_end_test) { - str_end_range = memchr(str, '.', (str_end_test - str) - 1); - if (str_end_range && (str_end_range[1] != '.')) { - str_end_range = NULL; - } - } - else { - str_end_range = strstr(str, ".."); - if (str_end_range && (str_end_range[2] == '\0')) { - str_end_range = NULL; - } - } - return str_end_range; + const char *str_end_range = NULL; + if (str_end_test) { + str_end_range = memchr(str, '.', (str_end_test - str) - 1); + if (str_end_range && (str_end_range[1] != '.')) { + str_end_range = NULL; + } + } + else { + str_end_range = strstr(str, ".."); + if (str_end_range && (str_end_range[2] == '\0')) { + str_end_range = NULL; + } + } + return str_end_range; } /** @@ -154,97 +155,120 @@ static const char *parse_int_range_sep_search(const char *str, const char *str_e * * The \a str_end_range argument is a result of #parse_int_range_sep_search. */ -static bool parse_int_range_relative( - const char *str, const char *str_end_range, const char *str_end_test, int pos, int neg, - int r_value_range[2], const char **r_err_msg) -{ - if (parse_int_relative(str, str_end_range, pos, neg, &r_value_range[0], r_err_msg) && - parse_int_relative(str_end_range + 2, str_end_test, pos, neg, &r_value_range[1], r_err_msg)) - { - return true; - } - else { - return false; - } -} - -static bool parse_int_relative_clamp( - const char *str, const char *str_end_test, int pos, int neg, int min, int max, - int *r_value, const char **r_err_msg) -{ - if (parse_int_relative(str, str_end_test, pos, neg, r_value, r_err_msg)) { - CLAMP(*r_value, min, max); - return true; - } - else { - return false; - } -} - -static bool parse_int_range_relative_clamp( - const char *str, const char *str_end_range, const char *str_end_test, int pos, int neg, int min, int max, - int r_value_range[2], const char **r_err_msg) -{ - if (parse_int_range_relative(str, str_end_range, str_end_test, pos, neg, r_value_range, r_err_msg)) { - CLAMP(r_value_range[0], min, max); - CLAMP(r_value_range[1], min, max); - return true; - } - else { - return false; - } +static bool parse_int_range_relative(const char *str, + const char *str_end_range, + const char *str_end_test, + int pos, + int neg, + int r_value_range[2], + const char **r_err_msg) +{ + if (parse_int_relative(str, str_end_range, pos, neg, &r_value_range[0], r_err_msg) && + parse_int_relative( + str_end_range + 2, str_end_test, pos, neg, &r_value_range[1], r_err_msg)) { + return true; + } + else { + return false; + } +} + +static bool parse_int_relative_clamp(const char *str, + const char *str_end_test, + int pos, + int neg, + int min, + int max, + int *r_value, + const char **r_err_msg) +{ + if (parse_int_relative(str, str_end_test, pos, neg, r_value, r_err_msg)) { + CLAMP(*r_value, min, max); + return true; + } + else { + return false; + } +} + +static bool parse_int_range_relative_clamp(const char *str, + const char *str_end_range, + const char *str_end_test, + int pos, + int neg, + int min, + int max, + int r_value_range[2], + const char **r_err_msg) +{ + if (parse_int_range_relative( + str, str_end_range, str_end_test, pos, neg, r_value_range, r_err_msg)) { + CLAMP(r_value_range[0], min, max); + CLAMP(r_value_range[1], min, max); + return true; + } + else { + return false; + } } /** * No clamping, fails with any number outside the range. */ -static bool parse_int_strict_range( - const char *str, const char *str_end_test, const int min, const int max, - int *r_value, const char **r_err_msg) -{ - char *str_end = NULL; - long value; - - errno = 0; - value = strtol(str, &str_end, 10); - - if (*str_end != '\0' && (str_end != str_end_test)) { - static const char *msg = "not a number"; - *r_err_msg = msg; - return false; - } - else if ((errno == ERANGE) || ((value < min || value > max))) { - static const char *msg = "exceeds range"; - *r_err_msg = msg; - return false; - } - else { - *r_value = (int)value; - return true; - } -} - -static bool parse_int( - const char *str, const char *str_end_test, - int *r_value, const char **r_err_msg) -{ - return parse_int_strict_range(str, str_end_test, INT_MIN, INT_MAX, r_value, r_err_msg); -} - -static bool parse_int_clamp( - const char *str, const char *str_end_test, int min, int max, - int *r_value, const char **r_err_msg) -{ - if (parse_int(str, str_end_test, r_value, r_err_msg)) { - CLAMP(*r_value, min, max); - return true; - } - else { - return false; - } -} - -#if 0 +static bool parse_int_strict_range(const char *str, + const char *str_end_test, + const int min, + const int max, + int *r_value, + const char **r_err_msg) +{ + char *str_end = NULL; + long value; + + errno = 0; + value = strtol(str, &str_end, 10); + + if (*str_end != '\0' && (str_end != str_end_test)) { + static const char *msg = "not a number"; + *r_err_msg = msg; + return false; + } + else if ((errno == ERANGE) || ((value < min || value > max))) { + static const char *msg = "exceeds range"; + *r_err_msg = msg; + return false; + } + else { + *r_value = (int)value; + return true; + } +} + +static bool parse_int(const char *str, + const char *str_end_test, + int *r_value, + const char **r_err_msg) +{ + return parse_int_strict_range(str, str_end_test, INT_MIN, INT_MAX, r_value, r_err_msg); +} + +static bool parse_int_clamp(const char *str, + const char *str_end_test, + int min, + int max, + int *r_value, + const char **r_err_msg) +{ + if (parse_int(str, str_end_test, r_value, r_err_msg)) { + CLAMP(*r_value, min, max); + return true; + } + else { + return false; + } +} + +# if 0 /** * Version of #parse_int_relative_clamp * that parses a comma separated list of numbers. @@ -253,48 +277,48 @@ static int *parse_int_relative_clamp_n( const char *str, int pos, int neg, int min, int max, int *r_value_len, const char **r_err_msg) { - const char sep = ','; - int len = 1; - for (int i = 0; str[i]; i++) { - if (str[i] == sep) { - len++; - } - } - - int *values = MEM_mallocN(sizeof(*values) * len, __func__); - int i = 0; - while (true) { - const char *str_end = strchr(str, sep); - if ((*str == sep) || (*str == '\0')) { - static const char *msg = "incorrect comma use"; - *r_err_msg = msg; - goto fail; - - } - else if (parse_int_relative_clamp(str, str_end, pos, neg, min, max, &values[i], r_err_msg)) { - i++; - } - else { - goto fail; /* error message already set */ - } - - if (str_end) { /* next */ - str = str_end + 1; - } - else { /* finished */ - break; - } - } - - *r_value_len = i; - return values; + const char sep = ','; + int len = 1; + for (int i = 0; str[i]; i++) { + if (str[i] == sep) { + len++; + } + } + + int *values = MEM_mallocN(sizeof(*values) * len, __func__); + int i = 0; + while (true) { + const char *str_end = strchr(str, sep); + if ((*str == sep) || (*str == '\0')) { + static const char *msg = "incorrect comma use"; + *r_err_msg = msg; + goto fail; + + } + else if (parse_int_relative_clamp(str, str_end, pos, neg, min, max, &values[i], r_err_msg)) { + i++; + } + else { + goto fail; /* error message already set */ + } + + if (str_end) { /* next */ + str = str_end + 1; + } + else { /* finished */ + break; + } + } + + *r_value_len = i; + return values; fail: - MEM_freeN(values); - return NULL; + MEM_freeN(values); + return NULL; } -#endif +# endif /** * Version of #parse_int_relative_clamp & #parse_int_range_relative_clamp @@ -302,121 +326,125 @@ fail: * * \note single values are evaluated as a range with matching start/end. */ -static int (*parse_int_range_relative_clamp_n( - const char *str, int pos, int neg, int min, int max, - int *r_value_len, const char **r_err_msg))[2] -{ - const char sep = ','; - int len = 1; - for (int i = 0; str[i]; i++) { - if (str[i] == sep) { - len++; - } - } - - int (*values)[2] = MEM_mallocN(sizeof(*values) * len, __func__); - int i = 0; - while (true) { - const char *str_end_range; - const char *str_end = strchr(str, sep); - if ((*str == sep) || (*str == '\0')) { - static const char *msg = "incorrect comma use"; - *r_err_msg = msg; - goto fail; - } - else if ((str_end_range = parse_int_range_sep_search(str, str_end)) ? - parse_int_range_relative_clamp(str, str_end_range, str_end, pos, neg, min, max, values[i], r_err_msg) : - parse_int_relative_clamp(str, str_end, pos, neg, min, max, &values[i][0], r_err_msg)) - { - if (str_end_range == NULL) { - values[i][1] = values[i][0]; - } - i++; - } - else { - goto fail; /* error message already set */ - } - - if (str_end) { /* next */ - str = str_end + 1; - } - else { /* finished */ - break; - } - } - - *r_value_len = i; - return values; +static int (*parse_int_range_relative_clamp_n(const char *str, + int pos, + int neg, + int min, + int max, + int *r_value_len, + const char **r_err_msg))[2] +{ + const char sep = ','; + int len = 1; + for (int i = 0; str[i]; i++) { + if (str[i] == sep) { + len++; + } + } + + int(*values)[2] = MEM_mallocN(sizeof(*values) * len, __func__); + int i = 0; + while (true) { + const char *str_end_range; + const char *str_end = strchr(str, sep); + if ((*str == sep) || (*str == '\0')) { + static const char *msg = "incorrect comma use"; + *r_err_msg = msg; + goto fail; + } + else if ((str_end_range = parse_int_range_sep_search(str, str_end)) ? + parse_int_range_relative_clamp( + str, str_end_range, str_end, pos, neg, min, max, values[i], r_err_msg) : + parse_int_relative_clamp( + str, str_end, pos, neg, min, max, &values[i][0], r_err_msg)) { + if (str_end_range == NULL) { + values[i][1] = values[i][0]; + } + i++; + } + else { + goto fail; /* error message already set */ + } + + if (str_end) { /* next */ + str = str_end + 1; + } + else { /* finished */ + break; + } + } + + *r_value_len = i; + return values; fail: - MEM_freeN(values); - return NULL; + MEM_freeN(values); + return NULL; } /** \} */ - /* -------------------------------------------------------------------- */ -#ifdef WITH_PYTHON +# ifdef WITH_PYTHON /** \name Utilities Python Context Macro (#BPY_CTX_SETUP) * \{ */ struct BlendePyContextStore { - wmWindowManager *wm; - Scene *scene; - wmWindow *win; - bool has_win; + wmWindowManager *wm; + Scene *scene; + wmWindow *win; + bool has_win; }; -static void arg_py_context_backup( - bContext *C, struct BlendePyContextStore *c_py, - const char *script_id) -{ - c_py->wm = CTX_wm_manager(C); - c_py->scene = CTX_data_scene(C); - c_py->has_win = !BLI_listbase_is_empty(&c_py->wm->windows); - if (c_py->has_win) { - c_py->win = CTX_wm_window(C); - CTX_wm_window_set(C, c_py->wm->windows.first); - } - else { - c_py->win = NULL; - fprintf(stderr, "Python script \"%s\" " - "running with missing context data.\n", script_id); - } -} - -static void arg_py_context_restore( - bContext *C, struct BlendePyContextStore *c_py) -{ - /* script may load a file, check old data is valid before using */ - if (c_py->has_win) { - if ((c_py->win == NULL) || - ((BLI_findindex(&G_MAIN->wm, c_py->wm) != -1) && - (BLI_findindex(&c_py->wm->windows, c_py->win) != -1))) - { - CTX_wm_window_set(C, c_py->win); - } - } - - if ((c_py->scene == NULL) || - BLI_findindex(&G_MAIN->scenes, c_py->scene) != -1) - { - CTX_data_scene_set(C, c_py->scene); - } +static void arg_py_context_backup(bContext *C, + struct BlendePyContextStore *c_py, + const char *script_id) +{ + c_py->wm = CTX_wm_manager(C); + c_py->scene = CTX_data_scene(C); + c_py->has_win = !BLI_listbase_is_empty(&c_py->wm->windows); + if (c_py->has_win) { + c_py->win = CTX_wm_window(C); + CTX_wm_window_set(C, c_py->wm->windows.first); + } + else { + c_py->win = NULL; + fprintf(stderr, + "Python script \"%s\" " + "running with missing context data.\n", + script_id); + } +} + +static void arg_py_context_restore(bContext *C, struct BlendePyContextStore *c_py) +{ + /* script may load a file, check old data is valid before using */ + if (c_py->has_win) { + if ((c_py->win == NULL) || ((BLI_findindex(&G_MAIN->wm, c_py->wm) != -1) && + (BLI_findindex(&c_py->wm->windows, c_py->win) != -1))) { + CTX_wm_window_set(C, c_py->win); + } + } + + if ((c_py->scene == NULL) || BLI_findindex(&G_MAIN->scenes, c_py->scene) != -1) { + CTX_data_scene_set(C, c_py->scene); + } } /* macro for context setup/reset */ -#define BPY_CTX_SETUP(_cmd) \ - { \ - struct BlendePyContextStore py_c; \ - arg_py_context_backup(C, &py_c, argv[1]); \ - { _cmd; } \ - arg_py_context_restore(C, &py_c); \ - } ((void)0) - -#endif /* WITH_PYTHON */ +# define BPY_CTX_SETUP(_cmd) \ + { \ + struct BlendePyContextStore py_c; \ + arg_py_context_backup(C, &py_c, argv[1]); \ + { \ + _cmd; \ + } \ + arg_py_context_restore(C, &py_c); \ + } \ + ((void)0) + +# endif /* WITH_PYTHON */ /** \} */ @@ -436,1605 +464,1700 @@ static void arg_py_context_restore( static void print_version_full(void) { - printf(BLEND_VERSION_STRING_FMT); -#ifdef BUILD_DATE - printf("\tbuild date: %s\n", build_date); - printf("\tbuild time: %s\n", build_time); - printf("\tbuild commit date: %s\n", build_commit_date); - printf("\tbuild commit time: %s\n", build_commit_time); - printf("\tbuild hash: %s\n", build_hash); - printf("\tbuild platform: %s\n", build_platform); - printf("\tbuild type: %s\n", build_type); - printf("\tbuild c flags: %s\n", build_cflags); - printf("\tbuild c++ flags: %s\n", build_cxxflags); - printf("\tbuild link flags: %s\n", build_linkflags); - printf("\tbuild system: %s\n", build_system); -#endif + printf(BLEND_VERSION_STRING_FMT); +# ifdef BUILD_DATE + printf("\tbuild date: %s\n", build_date); + printf("\tbuild time: %s\n", build_time); + printf("\tbuild commit date: %s\n", build_commit_date); + printf("\tbuild commit time: %s\n", build_commit_time); + printf("\tbuild hash: %s\n", build_hash); + printf("\tbuild platform: %s\n", build_platform); + printf("\tbuild type: %s\n", build_type); + printf("\tbuild c flags: %s\n", build_cflags); + printf("\tbuild c++ flags: %s\n", build_cxxflags); + printf("\tbuild link flags: %s\n", build_linkflags); + printf("\tbuild system: %s\n", build_system); +# endif } static void print_version_short(void) { -#ifdef BUILD_DATE - /* NOTE: We include built time since sometimes we need to tell broken from - * working built of the same hash. */ - printf(BLEND_VERSION_FMT " (hash %s built %s %s)\n", - BLEND_VERSION_ARG, build_hash, build_date, build_time); -#else - printf(BLEND_VERSION_STRING_FMT); -#endif +# ifdef BUILD_DATE + /* NOTE: We include built time since sometimes we need to tell broken from + * working built of the same hash. */ + printf(BLEND_VERSION_FMT " (hash %s built %s %s)\n", + BLEND_VERSION_ARG, + build_hash, + build_date, + build_time); +# else + printf(BLEND_VERSION_STRING_FMT); +# endif } -static const char arg_handle_print_version_doc[] = -"\n\tPrint Blender version and exit." -; -static int arg_handle_print_version(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data)) +static const char arg_handle_print_version_doc[] = "\n\tPrint Blender version and exit."; +static int arg_handle_print_version(int UNUSED(argc), + const char **UNUSED(argv), + void *UNUSED(data)) { - print_version_full(); - exit(0); - return 0; + print_version_full(); + exit(0); + return 0; } -static const char arg_handle_print_help_doc[] = -"\n\tPrint this help text and exit." -; +static const char arg_handle_print_help_doc[] = "\n\tPrint this help text and exit."; static const char arg_handle_print_help_doc_win32[] = -"\n\tPrint this help text and exit (windows only)." -; + "\n\tPrint this help text and exit (windows only)."; static int arg_handle_print_help(int UNUSED(argc), const char **UNUSED(argv), void *data) { - bArgs *ba = (bArgs *)data; - - printf(BLEND_VERSION_STRING_FMT); - printf("Usage: blender [args ...] [file] [args ...]\n\n"); - - printf("Render Options:\n"); - BLI_argsPrintArgDoc(ba, "--background"); - BLI_argsPrintArgDoc(ba, "--render-anim"); - BLI_argsPrintArgDoc(ba, "--scene"); - BLI_argsPrintArgDoc(ba, "--render-frame"); - BLI_argsPrintArgDoc(ba, "--frame-start"); - BLI_argsPrintArgDoc(ba, "--frame-end"); - BLI_argsPrintArgDoc(ba, "--frame-jump"); - BLI_argsPrintArgDoc(ba, "--render-output"); - BLI_argsPrintArgDoc(ba, "--engine"); - BLI_argsPrintArgDoc(ba, "--threads"); - - printf("\n"); - printf("Format Options:\n"); - BLI_argsPrintArgDoc(ba, "--render-format"); - BLI_argsPrintArgDoc(ba, "--use-extension"); - - printf("\n"); - printf("Animation Playback Options:\n"); - BLI_argsPrintArgDoc(ba, "-a"); - - printf("\n"); - printf("Window Options:\n"); - BLI_argsPrintArgDoc(ba, "--window-border"); - BLI_argsPrintArgDoc(ba, "--window-fullscreen"); - BLI_argsPrintArgDoc(ba, "--window-geometry"); - BLI_argsPrintArgDoc(ba, "--window-maximized"); - BLI_argsPrintArgDoc(ba, "--start-console"); - BLI_argsPrintArgDoc(ba, "--no-native-pixels"); - BLI_argsPrintArgDoc(ba, "--no-window-focus"); - - printf("\n"); - printf("Python Options:\n"); - BLI_argsPrintArgDoc(ba, "--enable-autoexec"); - BLI_argsPrintArgDoc(ba, "--disable-autoexec"); - - printf("\n"); - - BLI_argsPrintArgDoc(ba, "--python"); - BLI_argsPrintArgDoc(ba, "--python-text"); - BLI_argsPrintArgDoc(ba, "--python-expr"); - BLI_argsPrintArgDoc(ba, "--python-console"); - BLI_argsPrintArgDoc(ba, "--python-exit-code"); - BLI_argsPrintArgDoc(ba, "--addons"); - - printf("\n"); - printf("Logging Options:\n"); - BLI_argsPrintArgDoc(ba, "--log"); - BLI_argsPrintArgDoc(ba, "--log-level"); - BLI_argsPrintArgDoc(ba, "--log-show-basename"); - BLI_argsPrintArgDoc(ba, "--log-show-backtrace"); - BLI_argsPrintArgDoc(ba, "--log-show-timestamp"); - BLI_argsPrintArgDoc(ba, "--log-file"); - - printf("\n"); - printf("Debug Options:\n"); - BLI_argsPrintArgDoc(ba, "--debug"); - BLI_argsPrintArgDoc(ba, "--debug-value"); - - printf("\n"); - BLI_argsPrintArgDoc(ba, "--debug-events"); -#ifdef WITH_FFMPEG - BLI_argsPrintArgDoc(ba, "--debug-ffmpeg"); -#endif - BLI_argsPrintArgDoc(ba, "--debug-handlers"); -#ifdef WITH_LIBMV - BLI_argsPrintArgDoc(ba, "--debug-libmv"); -#endif -#ifdef WITH_CYCLES_LOGGING - BLI_argsPrintArgDoc(ba, "--debug-cycles"); -#endif - BLI_argsPrintArgDoc(ba, "--debug-memory"); - BLI_argsPrintArgDoc(ba, "--debug-jobs"); - BLI_argsPrintArgDoc(ba, "--debug-python"); - BLI_argsPrintArgDoc(ba, "--debug-depsgraph"); - BLI_argsPrintArgDoc(ba, "--debug-depsgraph-eval"); - BLI_argsPrintArgDoc(ba, "--debug-depsgraph-build"); - BLI_argsPrintArgDoc(ba, "--debug-depsgraph-tag"); - BLI_argsPrintArgDoc(ba, "--debug-depsgraph-no-threads"); - BLI_argsPrintArgDoc(ba, "--debug-depsgraph-time"); - BLI_argsPrintArgDoc(ba, "--debug-depsgraph-pretty"); - BLI_argsPrintArgDoc(ba, "--debug-gpu"); - BLI_argsPrintArgDoc(ba, "--debug-gpumem"); - BLI_argsPrintArgDoc(ba, "--debug-gpu-shaders"); - BLI_argsPrintArgDoc(ba, "--debug-gpu-force-workarounds"); - BLI_argsPrintArgDoc(ba, "--debug-wm"); - BLI_argsPrintArgDoc(ba, "--debug-all"); - BLI_argsPrintArgDoc(ba, "--debug-io"); - - printf("\n"); - BLI_argsPrintArgDoc(ba, "--debug-fpe"); - BLI_argsPrintArgDoc(ba, "--disable-crash-handler"); - BLI_argsPrintArgDoc(ba, "--disable-abort-handler"); - - printf("\n"); - printf("Misc Options:\n"); - BLI_argsPrintArgDoc(ba, "--app-template"); - BLI_argsPrintArgDoc(ba, "--factory-startup"); - BLI_argsPrintArgDoc(ba, "--enable-static-override"); - BLI_argsPrintArgDoc(ba, "--enable-event-simulate"); - printf("\n"); - BLI_argsPrintArgDoc(ba, "--env-system-datafiles"); - BLI_argsPrintArgDoc(ba, "--env-system-scripts"); - BLI_argsPrintArgDoc(ba, "--env-system-python"); - printf("\n"); - BLI_argsPrintArgDoc(ba, "-noaudio"); - BLI_argsPrintArgDoc(ba, "-setaudio"); - - printf("\n"); - - BLI_argsPrintArgDoc(ba, "--help"); - - /* WIN32 only (ignored for non-win32) */ - BLI_argsPrintArgDoc(ba, "-R"); - BLI_argsPrintArgDoc(ba, "-r"); - - BLI_argsPrintArgDoc(ba, "--version"); - - BLI_argsPrintArgDoc(ba, "--"); - - //printf("\n"); - //printf("Experimental Features:\n"); - - /* Other options _must_ be last (anything not handled will show here) */ - printf("\n"); - printf("Other Options:\n"); - BLI_argsPrintOtherDoc(ba); - - printf("\n"); - printf("Argument Parsing:\n"); - printf("\tArguments must be separated by white space, eg:\n"); - printf("\t# blender -ba test.blend\n"); - printf("\t...will ignore the 'a'.\n"); - printf("\t# blender -b test.blend -f8\n"); - printf("\t...will ignore '8' because there is no space between the '-f' and the frame value.\n\n"); - - printf("Argument Order:\n"); - printf("\tArguments are executed in the order they are given. eg:\n"); - printf("\t# blender --background test.blend --render-frame 1 --render-output '/tmp'\n"); - printf("\t...will not render to '/tmp' because '--render-frame 1' renders before the output path is set.\n"); - printf("\t# blender --background --render-output /tmp test.blend --render-frame 1\n"); - printf("\t...will not render to '/tmp' because loading the blend-file overwrites the render output that was set.\n"); - printf("\t# blender --background test.blend --render-output /tmp --render-frame 1\n"); - printf("\t...works as expected.\n\n"); - - printf("Environment Variables:\n"); - printf(" $BLENDER_USER_CONFIG Directory for user configuration files.\n"); - printf(" $BLENDER_USER_SCRIPTS Directory for user scripts.\n"); - printf(" $BLENDER_SYSTEM_SCRIPTS Directory for system wide scripts.\n"); - printf(" $BLENDER_USER_DATAFILES Directory for user data files (icons, translations, ..).\n"); - printf(" $BLENDER_SYSTEM_DATAFILES Directory for system wide data files.\n"); - printf(" $BLENDER_SYSTEM_PYTHON Directory for system Python libraries.\n"); -#ifdef WIN32 - printf(" $TEMP Store temporary files here.\n"); -#else - printf(" $TMP or $TMPDIR Store temporary files here.\n"); -#endif -#ifdef WITH_SDL - printf(" $SDL_AUDIODRIVER LibSDL audio driver - alsa, esd, dma.\n"); -#endif - printf(" $PYTHONHOME Path to the Python directory, eg. /usr/lib/python.\n\n"); - - exit(0); - - return 0; + bArgs *ba = (bArgs *)data; + + printf(BLEND_VERSION_STRING_FMT); + printf("Usage: blender [args ...] [file] [args ...]\n\n"); + + printf("Render Options:\n"); + BLI_argsPrintArgDoc(ba, "--background"); + BLI_argsPrintArgDoc(ba, "--render-anim"); + BLI_argsPrintArgDoc(ba, "--scene"); + BLI_argsPrintArgDoc(ba, "--render-frame"); + BLI_argsPrintArgDoc(ba, "--frame-start"); + BLI_argsPrintArgDoc(ba, "--frame-end"); + BLI_argsPrintArgDoc(ba, "--frame-jump"); + BLI_argsPrintArgDoc(ba, "--render-output"); + BLI_argsPrintArgDoc(ba, "--engine"); + BLI_argsPrintArgDoc(ba, "--threads"); + + printf("\n"); + printf("Format Options:\n"); + BLI_argsPrintArgDoc(ba, "--render-format"); + BLI_argsPrintArgDoc(ba, "--use-extension"); + + printf("\n"); + printf("Animation Playback Options:\n"); + BLI_argsPrintArgDoc(ba, "-a"); + + printf("\n"); + printf("Window Options:\n"); + BLI_argsPrintArgDoc(ba, "--window-border"); + BLI_argsPrintArgDoc(ba, "--window-fullscreen"); + BLI_argsPrintArgDoc(ba, "--window-geometry"); + BLI_argsPrintArgDoc(ba, "--window-maximized"); + BLI_argsPrintArgDoc(ba, "--start-console"); + BLI_argsPrintArgDoc(ba, "--no-native-pixels"); + BLI_argsPrintArgDoc(ba, "--no-window-focus"); + + printf("\n"); + printf("Python Options:\n"); + BLI_argsPrintArgDoc(ba, "--enable-autoexec"); + BLI_argsPrintArgDoc(ba, "--disable-autoexec"); + + printf("\n"); + + BLI_argsPrintArgDoc(ba, "--python"); + BLI_argsPrintArgDoc(ba, "--python-text"); + BLI_argsPrintArgDoc(ba, "--python-expr"); + BLI_argsPrintArgDoc(ba, "--python-console"); + BLI_argsPrintArgDoc(ba, "--python-exit-code"); + BLI_argsPrintArgDoc(ba, "--addons"); + + printf("\n"); + printf("Logging Options:\n"); + BLI_argsPrintArgDoc(ba, "--log"); + BLI_argsPrintArgDoc(ba, "--log-level"); + BLI_argsPrintArgDoc(ba, "--log-show-basename"); + BLI_argsPrintArgDoc(ba, "--log-show-backtrace"); + BLI_argsPrintArgDoc(ba, "--log-show-timestamp"); + BLI_argsPrintArgDoc(ba, "--log-file"); + + printf("\n"); + printf("Debug Options:\n"); + BLI_argsPrintArgDoc(ba, "--debug"); + BLI_argsPrintArgDoc(ba, "--debug-value"); + + printf("\n"); + BLI_argsPrintArgDoc(ba, "--debug-events"); +# ifdef WITH_FFMPEG + BLI_argsPrintArgDoc(ba, "--debug-ffmpeg"); +# endif + BLI_argsPrintArgDoc(ba, "--debug-handlers"); +# ifdef WITH_LIBMV + BLI_argsPrintArgDoc(ba, "--debug-libmv"); +# endif +# ifdef WITH_CYCLES_LOGGING + BLI_argsPrintArgDoc(ba, "--debug-cycles"); +# endif + BLI_argsPrintArgDoc(ba, "--debug-memory"); + BLI_argsPrintArgDoc(ba, "--debug-jobs"); + BLI_argsPrintArgDoc(ba, "--debug-python"); + BLI_argsPrintArgDoc(ba, "--debug-depsgraph"); + BLI_argsPrintArgDoc(ba, "--debug-depsgraph-eval"); + BLI_argsPrintArgDoc(ba, "--debug-depsgraph-build"); + BLI_argsPrintArgDoc(ba, "--debug-depsgraph-tag"); + BLI_argsPrintArgDoc(ba, "--debug-depsgraph-no-threads"); + BLI_argsPrintArgDoc(ba, "--debug-depsgraph-time"); + BLI_argsPrintArgDoc(ba, "--debug-depsgraph-pretty"); + BLI_argsPrintArgDoc(ba, "--debug-gpu"); + BLI_argsPrintArgDoc(ba, "--debug-gpumem"); + BLI_argsPrintArgDoc(ba, "--debug-gpu-shaders"); + BLI_argsPrintArgDoc(ba, "--debug-gpu-force-workarounds"); + BLI_argsPrintArgDoc(ba, "--debug-wm"); + BLI_argsPrintArgDoc(ba, "--debug-all"); + BLI_argsPrintArgDoc(ba, "--debug-io"); + + printf("\n"); + BLI_argsPrintArgDoc(ba, "--debug-fpe"); + BLI_argsPrintArgDoc(ba, "--disable-crash-handler"); + BLI_argsPrintArgDoc(ba, "--disable-abort-handler"); + + printf("\n"); + printf("Misc Options:\n"); + BLI_argsPrintArgDoc(ba, "--app-template"); + BLI_argsPrintArgDoc(ba, "--factory-startup"); + BLI_argsPrintArgDoc(ba, "--enable-static-override"); + BLI_argsPrintArgDoc(ba, "--enable-event-simulate"); + printf("\n"); + BLI_argsPrintArgDoc(ba, "--env-system-datafiles"); + BLI_argsPrintArgDoc(ba, "--env-system-scripts"); + BLI_argsPrintArgDoc(ba, "--env-system-python"); + printf("\n"); + BLI_argsPrintArgDoc(ba, "-noaudio"); + BLI_argsPrintArgDoc(ba, "-setaudio"); + + printf("\n"); + + BLI_argsPrintArgDoc(ba, "--help"); + + /* WIN32 only (ignored for non-win32) */ + BLI_argsPrintArgDoc(ba, "-R"); + BLI_argsPrintArgDoc(ba, "-r"); + + BLI_argsPrintArgDoc(ba, "--version"); + + BLI_argsPrintArgDoc(ba, "--"); + + //printf("\n"); + //printf("Experimental Features:\n"); + + /* Other options _must_ be last (anything not handled will show here) */ + printf("\n"); + printf("Other Options:\n"); + BLI_argsPrintOtherDoc(ba); + + printf("\n"); + printf("Argument Parsing:\n"); + printf("\tArguments must be separated by white space, eg:\n"); + printf("\t# blender -ba test.blend\n"); + printf("\t...will ignore the 'a'.\n"); + printf("\t# blender -b test.blend -f8\n"); + printf( + "\t...will ignore '8' because there is no space between the '-f' and the frame value.\n\n"); + + printf("Argument Order:\n"); + printf("\tArguments are executed in the order they are given. eg:\n"); + printf("\t# blender --background test.blend --render-frame 1 --render-output '/tmp'\n"); + printf( + "\t...will not render to '/tmp' because '--render-frame 1' renders before the output path " + "is set.\n"); + printf("\t# blender --background --render-output /tmp test.blend --render-frame 1\n"); + printf( + "\t...will not render to '/tmp' because loading the blend-file overwrites the render output " + "that was set.\n"); + printf("\t# blender --background test.blend --render-output /tmp --render-frame 1\n"); + printf("\t...works as expected.\n\n"); + + printf("Environment Variables:\n"); + printf(" $BLENDER_USER_CONFIG Directory for user configuration files.\n"); + printf(" $BLENDER_USER_SCRIPTS Directory for user scripts.\n"); + printf(" $BLENDER_SYSTEM_SCRIPTS Directory for system wide scripts.\n"); + printf(" $BLENDER_USER_DATAFILES Directory for user data files (icons, translations, ..).\n"); + printf(" $BLENDER_SYSTEM_DATAFILES Directory for system wide data files.\n"); + printf(" $BLENDER_SYSTEM_PYTHON Directory for system Python libraries.\n"); +# ifdef WIN32 + printf(" $TEMP Store temporary files here.\n"); +# else + printf(" $TMP or $TMPDIR Store temporary files here.\n"); +# endif +# ifdef WITH_SDL + printf(" $SDL_AUDIODRIVER LibSDL audio driver - alsa, esd, dma.\n"); +# endif + printf(" $PYTHONHOME Path to the Python directory, eg. /usr/lib/python.\n\n"); + + exit(0); + + return 0; } static const char arg_handle_arguments_end_doc[] = -"\n\tEnd option processing, following arguments passed unchanged. Access via Python's 'sys.argv'." -; -static int arg_handle_arguments_end(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data)) + "\n\tEnd option processing, following arguments passed unchanged. Access via Python's " + "'sys.argv'."; +static int arg_handle_arguments_end(int UNUSED(argc), + const char **UNUSED(argv), + void *UNUSED(data)) { - return -1; + return -1; } /* only to give help message */ -#ifndef WITH_PYTHON_SECURITY /* default */ -# define PY_ENABLE_AUTO ", (default)" -# define PY_DISABLE_AUTO "" -#else -# define PY_ENABLE_AUTO "" -# define PY_DISABLE_AUTO ", (compiled as non-standard default)" -#endif +# ifndef WITH_PYTHON_SECURITY /* default */ +# define PY_ENABLE_AUTO ", (default)" +# define PY_DISABLE_AUTO "" +# else +# define PY_ENABLE_AUTO "" +# define PY_DISABLE_AUTO ", (compiled as non-standard default)" +# endif static const char arg_handle_python_set_doc_enable[] = -"\n\tEnable automatic Python script execution" PY_ENABLE_AUTO "." -; + "\n\tEnable automatic Python script execution" PY_ENABLE_AUTO "."; static const char arg_handle_python_set_doc_disable[] = -"\n\tDisable automatic Python script execution (pydrivers & startup scripts)" PY_DISABLE_AUTO "." -; -#undef PY_ENABLE_AUTO -#undef PY_DISABLE_AUTO + "\n\tDisable automatic Python script execution (pydrivers & startup scripts)" PY_DISABLE_AUTO + "."; +# undef PY_ENABLE_AUTO +# undef PY_DISABLE_AUTO static int arg_handle_python_set(int UNUSED(argc), const char **UNUSED(argv), void *data) { - if ((bool)data) { - G.f |= G_FLAG_SCRIPT_AUTOEXEC; - } - else { - G.f &= ~G_FLAG_SCRIPT_AUTOEXEC; - } - G.f |= G_FLAG_SCRIPT_OVERRIDE_PREF; - return 0; + if ((bool)data) { + G.f |= G_FLAG_SCRIPT_AUTOEXEC; + } + else { + G.f &= ~G_FLAG_SCRIPT_AUTOEXEC; + } + G.f |= G_FLAG_SCRIPT_OVERRIDE_PREF; + return 0; } -static const char arg_handle_crash_handler_disable_doc[] = -"\n\tDisable the crash handler." -; -static int arg_handle_crash_handler_disable(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data)) +static const char arg_handle_crash_handler_disable_doc[] = "\n\tDisable the crash handler."; +static int arg_handle_crash_handler_disable(int UNUSED(argc), + const char **UNUSED(argv), + void *UNUSED(data)) { - app_state.signal.use_crash_handler = false; - return 0; + app_state.signal.use_crash_handler = false; + return 0; } -static const char arg_handle_abort_handler_disable_doc[] = -"\n\tDisable the abort handler." -; -static int arg_handle_abort_handler_disable(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data)) +static const char arg_handle_abort_handler_disable_doc[] = "\n\tDisable the abort handler."; +static int arg_handle_abort_handler_disable(int UNUSED(argc), + const char **UNUSED(argv), + void *UNUSED(data)) { - app_state.signal.use_abort_handler = false; - return 0; + app_state.signal.use_abort_handler = false; + return 0; } static const char arg_handle_background_mode_set_doc[] = -"\n\tRun in background (often used for UI-less rendering)." -; -static int arg_handle_background_mode_set(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data)) + "\n\tRun in background (often used for UI-less rendering)."; +static int arg_handle_background_mode_set(int UNUSED(argc), + const char **UNUSED(argv), + void *UNUSED(data)) { - print_version_short(); - G.background = 1; - return 0; + print_version_short(); + G.background = 1; + return 0; } static const char arg_handle_log_level_set_doc[] = -"\n" -"\n" -"\tSet the logging verbosity level (higher for more details) defaults to 1, use -1 to log all levels." -; + "\n" + "\n" + "\tSet the logging verbosity level (higher for more details) defaults to 1, use -1 to log all " + "levels."; static int arg_handle_log_level_set(int argc, const char **argv, void *UNUSED(data)) { - const char *arg_id = "--log-level"; - if (argc > 1) { - const char *err_msg = NULL; - if (!parse_int_clamp(argv[1], NULL, -1, INT_MAX, &G.log.level, &err_msg)) { - printf("\nError: %s '%s %s'.\n", err_msg, arg_id, argv[1]); - } - else { - if (G.log.level == -1) { - G.log.level = INT_MAX; - } - CLG_level_set(G.log.level); - } - return 1; - } - else { - printf("\nError: '%s' no args given.\n", arg_id); - return 0; - } + const char *arg_id = "--log-level"; + if (argc > 1) { + const char *err_msg = NULL; + if (!parse_int_clamp(argv[1], NULL, -1, INT_MAX, &G.log.level, &err_msg)) { + printf("\nError: %s '%s %s'.\n", err_msg, arg_id, argv[1]); + } + else { + if (G.log.level == -1) { + G.log.level = INT_MAX; + } + CLG_level_set(G.log.level); + } + return 1; + } + else { + printf("\nError: '%s' no args given.\n", arg_id); + return 0; + } } static const char arg_handle_log_show_basename_set_doc[] = -"\n\tOnly show file name in output (not the leading path)." -; -static int arg_handle_log_show_basename_set(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data)) + "\n\tOnly show file name in output (not the leading path)."; +static int arg_handle_log_show_basename_set(int UNUSED(argc), + const char **UNUSED(argv), + void *UNUSED(data)) { - CLG_output_use_basename_set(true); - return 0; + CLG_output_use_basename_set(true); + return 0; } static const char arg_handle_log_show_backtrace_set_doc[] = -"\n\tShow a back trace for each log message (debug builds only)." -; -static int arg_handle_log_show_backtrace_set(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data)) + "\n\tShow a back trace for each log message (debug builds only)."; +static int arg_handle_log_show_backtrace_set(int UNUSED(argc), + const char **UNUSED(argv), + void *UNUSED(data)) { - /* Ensure types don't become incompatible. */ - void (*fn)(FILE *fp) = BLI_system_backtrace; - CLG_backtrace_fn_set((void (*)(void *))fn); - return 0; + /* Ensure types don't become incompatible. */ + void (*fn)(FILE * fp) = BLI_system_backtrace; + CLG_backtrace_fn_set((void (*)(void *))fn); + return 0; } static const char arg_handle_log_show_timestamp_set_doc[] = -"\n\tShow a timestamp for each log message in seconds since start." -; -static int arg_handle_log_show_timestamp_set(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data)) + "\n\tShow a timestamp for each log message in seconds since start."; +static int arg_handle_log_show_timestamp_set(int UNUSED(argc), + const char **UNUSED(argv), + void *UNUSED(data)) { - CLG_output_use_timestamp_set(true); - return 0; + CLG_output_use_timestamp_set(true); + return 0; } static const char arg_handle_log_file_set_doc[] = -"\n" -"\n" -"\tSet a file to output the log to." -; + "\n" + "\n" + "\tSet a file to output the log to."; static int arg_handle_log_file_set(int argc, const char **argv, void *UNUSED(data)) { - const char *arg_id = "--log-file"; - if (argc > 1) { - errno = 0; - FILE *fp = BLI_fopen(argv[1], "w"); - if (fp == NULL) { - const char *err_msg = errno ? strerror(errno) : "unknown"; - printf("\nError: %s '%s %s'.\n", err_msg, arg_id, argv[1]); - } - else { - if (UNLIKELY(G.log.file != NULL)) { - fclose(G.log.file); - } - G.log.file = fp; - CLG_output_set(G.log.file); - } - return 1; - } - else { - printf("\nError: '%s' no args given.\n", arg_id); - return 0; - } + const char *arg_id = "--log-file"; + if (argc > 1) { + errno = 0; + FILE *fp = BLI_fopen(argv[1], "w"); + if (fp == NULL) { + const char *err_msg = errno ? strerror(errno) : "unknown"; + printf("\nError: %s '%s %s'.\n", err_msg, arg_id, argv[1]); + } + else { + if (UNLIKELY(G.log.file != NULL)) { + fclose(G.log.file); + } + G.log.file = fp; + CLG_output_set(G.log.file); + } + return 1; + } + else { + printf("\nError: '%s' no args given.\n", arg_id); + return 0; + } } static const char arg_handle_log_set_doc[] = -"\n" -"\tEnable logging categories, taking a single comma separated argument.\n" -"\tMultiple categories can be matched using a '.*' suffix,\n" -"\tso '--log \"wm.*\"' logs every kind of window-manager message.\n" -"\tUse \"^\" prefix to ignore, so '--log \"*,^wm.operator.*\"' logs all except for 'wm.operators.*'\n" -"\tUse \"*\" to log everything." -; + "\n" + "\tEnable logging categories, taking a single comma separated argument.\n" + "\tMultiple categories can be matched using a '.*' suffix,\n" + "\tso '--log \"wm.*\"' logs every kind of window-manager message.\n" + "\tUse \"^\" prefix to ignore, so '--log \"*,^wm.operator.*\"' logs all except for " + "'wm.operators.*'\n" + "\tUse \"*\" to log everything."; static int arg_handle_log_set(int argc, const char **argv, void *UNUSED(data)) { - const char *arg_id = "--log"; - if (argc > 1) { - const char *str_step = argv[1]; - while (*str_step) { - const char *str_step_end = strchr(str_step, ','); - int str_step_len = str_step_end ? (str_step_end - str_step) : strlen(str_step); - - if (str_step[0] == '^') { - CLG_type_filter_exclude(str_step + 1, str_step_len - 1); - } - else { - CLG_type_filter_include(str_step, str_step_len); - } - - if (str_step_end) { - /* typically only be one, but don't fail on multiple.*/ - while (*str_step_end == ',') { - str_step_end++; - } - str_step = str_step_end; - } - else { - break; - } - } - return 1; - } - else { - printf("\nError: '%s' no args given.\n", arg_id); - return 0; - } + const char *arg_id = "--log"; + if (argc > 1) { + const char *str_step = argv[1]; + while (*str_step) { + const char *str_step_end = strchr(str_step, ','); + int str_step_len = str_step_end ? (str_step_end - str_step) : strlen(str_step); + + if (str_step[0] == '^') { + CLG_type_filter_exclude(str_step + 1, str_step_len - 1); + } + else { + CLG_type_filter_include(str_step, str_step_len); + } + + if (str_step_end) { + /* typically only be one, but don't fail on multiple.*/ + while (*str_step_end == ',') { + str_step_end++; + } + str_step = str_step_end; + } + else { + break; + } + } + return 1; + } + else { + printf("\nError: '%s' no args given.\n", arg_id); + return 0; + } } static const char arg_handle_debug_mode_set_doc[] = -"\n" -"\tTurn debugging on.\n" -"\n" -"\t* Enables memory error detection\n" -"\t* Disables mouse grab (to interact with a debugger in some cases)\n" -"\t* Keeps Python's 'sys.stdin' rather than setting it to None" -; + "\n" + "\tTurn debugging on.\n" + "\n" + "\t* Enables memory error detection\n" + "\t* Disables mouse grab (to interact with a debugger in some cases)\n" + "\t* Keeps Python's 'sys.stdin' rather than setting it to None"; static int arg_handle_debug_mode_set(int UNUSED(argc), const char **UNUSED(argv), void *data) { - G.debug |= G_DEBUG; /* std output printf's */ - printf(BLEND_VERSION_STRING_FMT); - MEM_set_memory_debug(); -#ifndef NDEBUG - BLI_mempool_set_memory_debug(); -#endif + G.debug |= G_DEBUG; /* std output printf's */ + printf(BLEND_VERSION_STRING_FMT); + MEM_set_memory_debug(); +# ifndef NDEBUG + BLI_mempool_set_memory_debug(); +# endif -#ifdef WITH_BUILDINFO - printf("Build: %s %s %s %s\n", build_date, build_time, build_platform, build_type); -#endif +# ifdef WITH_BUILDINFO + printf("Build: %s %s %s %s\n", build_date, build_time, build_platform, build_type); +# endif - BLI_argsPrint(data); - return 0; + BLI_argsPrint(data); + return 0; } -#ifdef WITH_FFMPEG +# ifdef WITH_FFMPEG static const char arg_handle_debug_mode_generic_set_doc_ffmpeg[] = -"\n\tEnable debug messages from FFmpeg library."; -#endif -#ifdef WITH_FREESTYLE + "\n\tEnable debug messages from FFmpeg library."; +# endif +# ifdef WITH_FREESTYLE static const char arg_handle_debug_mode_generic_set_doc_freestyle[] = -"\n\tEnable debug messages for FreeStyle."; -#endif + "\n\tEnable debug messages for FreeStyle."; +# endif static const char arg_handle_debug_mode_generic_set_doc_python[] = -"\n\tEnable debug messages for Python."; + "\n\tEnable debug messages for Python."; static const char arg_handle_debug_mode_generic_set_doc_events[] = -"\n\tEnable debug messages for the event system."; + "\n\tEnable debug messages for the event system."; static const char arg_handle_debug_mode_generic_set_doc_handlers[] = -"\n\tEnable debug messages for event handling."; + "\n\tEnable debug messages for event handling."; static const char arg_handle_debug_mode_generic_set_doc_wm[] = -"\n\tEnable debug messages for the window manager, shows all operators in search, shows keymap errors."; + "\n\tEnable debug messages for the window manager, shows all operators in search, shows " + "keymap errors."; static const char arg_handle_debug_mode_generic_set_doc_jobs[] = -"\n\tEnable time profiling for background jobs."; + "\n\tEnable time profiling for background jobs."; static const char arg_handle_debug_mode_generic_set_doc_gpu[] = -"\n\tEnable gpu debug context and information for OpenGL 4.3+."; + "\n\tEnable gpu debug context and information for OpenGL 4.3+."; static const char arg_handle_debug_mode_generic_set_doc_depsgraph[] = -"\n\tEnable all debug messages from dependency graph."; + "\n\tEnable all debug messages from dependency graph."; static const char arg_handle_debug_mode_generic_set_doc_depsgraph_build[] = -"\n\tEnable debug messages from dependency graph related on graph construction."; + "\n\tEnable debug messages from dependency graph related on graph construction."; static const char arg_handle_debug_mode_generic_set_doc_depsgraph_tag[] = -"\n\tEnable debug messages from dependency graph related on tagging."; + "\n\tEnable debug messages from dependency graph related on tagging."; static const char arg_handle_debug_mode_generic_set_doc_depsgraph_time[] = -"\n\tEnable debug messages from dependency graph related on timing."; + "\n\tEnable debug messages from dependency graph related on timing."; static const char arg_handle_debug_mode_generic_set_doc_depsgraph_eval[] = -"\n\tEnable debug messages from dependency graph related on evaluation."; + "\n\tEnable debug messages from dependency graph related on evaluation."; static const char arg_handle_debug_mode_generic_set_doc_depsgraph_no_threads[] = -"\n\tSwitch dependency graph to a single threaded evaluation."; + "\n\tSwitch dependency graph to a single threaded evaluation."; static const char arg_handle_debug_mode_generic_set_doc_depsgraph_pretty[] = -"\n\tEnable colors for dependency graph debug messages."; + "\n\tEnable colors for dependency graph debug messages."; static const char arg_handle_debug_mode_generic_set_doc_gpumem[] = -"\n\tEnable GPU memory stats in status bar."; + "\n\tEnable GPU memory stats in status bar."; -static int arg_handle_debug_mode_generic_set(int UNUSED(argc), const char **UNUSED(argv), void *data) +static int arg_handle_debug_mode_generic_set(int UNUSED(argc), + const char **UNUSED(argv), + void *data) { - G.debug |= POINTER_AS_INT(data); - return 0; + G.debug |= POINTER_AS_INT(data); + return 0; } static const char arg_handle_debug_mode_io_doc[] = -"\n\tEnable debug messages for I/O (collada, ...)."; -static int arg_handle_debug_mode_io(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data)) + "\n\tEnable debug messages for I/O (collada, ...)."; +static int arg_handle_debug_mode_io(int UNUSED(argc), + const char **UNUSED(argv), + void *UNUSED(data)) { - G.debug |= G_DEBUG_IO; - return 0; + G.debug |= G_DEBUG_IO; + return 0; } -static const char arg_handle_debug_mode_all_doc[] = -"\n\tEnable all debug messages."; -static int arg_handle_debug_mode_all(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data)) +static const char arg_handle_debug_mode_all_doc[] = "\n\tEnable all debug messages."; +static int arg_handle_debug_mode_all(int UNUSED(argc), + const char **UNUSED(argv), + void *UNUSED(data)) { - G.debug |= G_DEBUG_ALL; -#ifdef WITH_LIBMV - libmv_startDebugLogging(); -#endif -#ifdef WITH_CYCLES_LOGGING - CCL_start_debug_logging(); -#endif - return 0; + G.debug |= G_DEBUG_ALL; +# ifdef WITH_LIBMV + libmv_startDebugLogging(); +# endif +# ifdef WITH_CYCLES_LOGGING + CCL_start_debug_logging(); +# endif + return 0; } -#ifdef WITH_LIBMV +# ifdef WITH_LIBMV static const char arg_handle_debug_mode_libmv_doc[] = -"\n\tEnable debug messages from libmv library." -; -static int arg_handle_debug_mode_libmv(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data)) + "\n\tEnable debug messages from libmv library."; +static int arg_handle_debug_mode_libmv(int UNUSED(argc), + const char **UNUSED(argv), + void *UNUSED(data)) { - libmv_startDebugLogging(); + libmv_startDebugLogging(); - return 0; + return 0; } -#endif +# endif -#ifdef WITH_CYCLES_LOGGING -static const char arg_handle_debug_mode_cycles_doc[] = -"\n\tEnable debug messages from Cycles." -; -static int arg_handle_debug_mode_cycles(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data)) +# ifdef WITH_CYCLES_LOGGING +static const char arg_handle_debug_mode_cycles_doc[] = "\n\tEnable debug messages from Cycles."; +static int arg_handle_debug_mode_cycles(int UNUSED(argc), + const char **UNUSED(argv), + void *UNUSED(data)) { - CCL_start_debug_logging(); - return 0; + CCL_start_debug_logging(); + return 0; } -#endif +# endif static const char arg_handle_debug_mode_memory_set_doc[] = -"\n\tEnable fully guarded memory allocation and debugging." -; -static int arg_handle_debug_mode_memory_set(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data)) + "\n\tEnable fully guarded memory allocation and debugging."; +static int arg_handle_debug_mode_memory_set(int UNUSED(argc), + const char **UNUSED(argv), + void *UNUSED(data)) { - MEM_set_memory_debug(); - return 0; + MEM_set_memory_debug(); + return 0; } static const char arg_handle_debug_value_set_doc[] = -"\n" -"\tSet debug value of on startup." -; + "\n" + "\tSet debug value of on startup."; static int arg_handle_debug_value_set(int argc, const char **argv, void *UNUSED(data)) { - const char *arg_id = "--debug-value"; - if (argc > 1) { - const char *err_msg = NULL; - int value; - if (!parse_int(argv[1], NULL, &value, &err_msg)) { - printf("\nError: %s '%s %s'.\n", err_msg, arg_id, argv[1]); - return 1; - } + const char *arg_id = "--debug-value"; + if (argc > 1) { + const char *err_msg = NULL; + int value; + if (!parse_int(argv[1], NULL, &value, &err_msg)) { + printf("\nError: %s '%s %s'.\n", err_msg, arg_id, argv[1]); + return 1; + } - G.debug_value = value; + G.debug_value = value; - return 1; - } - else { - printf("\nError: you must specify debug value to set.\n"); - return 0; - } + return 1; + } + else { + printf("\nError: you must specify debug value to set.\n"); + return 0; + } } -static const char arg_handle_debug_fpe_set_doc[] = -"\n\tEnable floating point exceptions." -; -static int arg_handle_debug_fpe_set(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data)) +static const char arg_handle_debug_fpe_set_doc[] = "\n\tEnable floating point exceptions."; +static int arg_handle_debug_fpe_set(int UNUSED(argc), + const char **UNUSED(argv), + void *UNUSED(data)) { - main_signal_setup_fpe(); - return 0; + main_signal_setup_fpe(); + return 0; } static const char arg_handle_app_template_doc[] = -"\n\tSet the application template, use 'default' for none." -; + "\n\tSet the application template, use 'default' for none."; static int arg_handle_app_template(int argc, const char **argv, void *UNUSED(data)) { - if (argc > 1) { - const char *app_template = STREQ(argv[1], "default") ? "" : argv[1]; - WM_init_state_app_template_set(app_template); - return 1; - } - else { - printf("\nError: App template must follow '--app-template'.\n"); - return 0; - } + if (argc > 1) { + const char *app_template = STREQ(argv[1], "default") ? "" : argv[1]; + WM_init_state_app_template_set(app_template); + return 1; + } + else { + printf("\nError: App template must follow '--app-template'.\n"); + return 0; + } } -static const char arg_handle_factory_startup_set_doc[] = -"\n\tSkip reading the " STRINGIFY(BLENDER_STARTUP_FILE) " in the users home directory." -; -static int arg_handle_factory_startup_set(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data)) +static const char arg_handle_factory_startup_set_doc[] = "\n\tSkip reading the " STRINGIFY( + BLENDER_STARTUP_FILE) " in the users home directory."; +static int arg_handle_factory_startup_set(int UNUSED(argc), + const char **UNUSED(argv), + void *UNUSED(data)) { - G.factory_startup = 1; - return 0; + G.factory_startup = 1; + return 0; } static const char arg_handle_enable_static_override_doc[] = -"\n\tEnable Static Override features in the UI." -; -static int arg_handle_enable_static_override(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data)) + "\n\tEnable Static Override features in the UI."; +static int arg_handle_enable_static_override(int UNUSED(argc), + const char **UNUSED(argv), + void *UNUSED(data)) { - BKE_override_static_enable(true); - return 0; + BKE_override_static_enable(true); + return 0; } static const char arg_handle_enable_event_simulate_doc[] = -"\n\tEnable event simulation testing feature 'bpy.types.Window.event_simulate'." -; -static int arg_handle_enable_event_simulate(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data)) + "\n\tEnable event simulation testing feature 'bpy.types.Window.event_simulate'."; +static int arg_handle_enable_event_simulate(int UNUSED(argc), + const char **UNUSED(argv), + void *UNUSED(data)) { - G.f |= G_FLAG_EVENT_SIMULATE; - return 0; + G.f |= G_FLAG_EVENT_SIMULATE; + return 0; } -static const char arg_handle_env_system_set_doc_datafiles[] = -"\n\tSet the "STRINGIFY_ARG (BLENDER_SYSTEM_DATAFILES)" environment variable."; -static const char arg_handle_env_system_set_doc_scripts[] = -"\n\tSet the "STRINGIFY_ARG (BLENDER_SYSTEM_SCRIPTS)" environment variable."; -static const char arg_handle_env_system_set_doc_python[] = -"\n\tSet the "STRINGIFY_ARG (BLENDER_SYSTEM_PYTHON)" environment variable."; +static const char arg_handle_env_system_set_doc_datafiles[] = "\n\tSet the " STRINGIFY_ARG( + BLENDER_SYSTEM_DATAFILES) " environment variable."; +static const char arg_handle_env_system_set_doc_scripts[] = "\n\tSet the " STRINGIFY_ARG( + BLENDER_SYSTEM_SCRIPTS) " environment variable."; +static const char arg_handle_env_system_set_doc_python[] = "\n\tSet the " STRINGIFY_ARG( + BLENDER_SYSTEM_PYTHON) " environment variable."; static int arg_handle_env_system_set(int argc, const char **argv, void *UNUSED(data)) { - /* "--env-system-scripts" --> "BLENDER_SYSTEM_SCRIPTS" */ + /* "--env-system-scripts" --> "BLENDER_SYSTEM_SCRIPTS" */ - char env[64] = "BLENDER"; - char *ch_dst = env + 7; /* skip BLENDER */ - const char *ch_src = argv[0] + 5; /* skip --env */ + char env[64] = "BLENDER"; + char *ch_dst = env + 7; /* skip BLENDER */ + const char *ch_src = argv[0] + 5; /* skip --env */ - if (argc < 2) { - printf("%s requires one argument\n", argv[0]); - exit(1); - } + if (argc < 2) { + printf("%s requires one argument\n", argv[0]); + exit(1); + } - for (; *ch_src; ch_src++, ch_dst++) { - *ch_dst = (*ch_src == '-') ? '_' : (*ch_src) - 32; /* toupper() */ - } + for (; *ch_src; ch_src++, ch_dst++) { + *ch_dst = (*ch_src == '-') ? '_' : (*ch_src) - 32; /* toupper() */ + } - *ch_dst = '\0'; - BLI_setenv(env, argv[1]); - return 1; + *ch_dst = '\0'; + BLI_setenv(env, argv[1]); + return 1; } static const char arg_handle_playback_mode_doc[] = -" \n" -"\tPlayback , only operates this way when not running in background.\n\n" -"\t-p \n" -"\t\tOpen with lower left corner at , .\n" -"\t-m\n" -"\t\tRead from disk (Do not buffer).\n" -"\t-f \n" -"\t\tSpecify FPS to start with.\n" -"\t-j \n" -"\t\tSet frame step to .\n" -"\t-s \n" -"\t\tPlay from .\n" -"\t-e \n" -"\t\tPlay until ." -; + " \n" + "\tPlayback , only operates this way when not running in background.\n\n" + "\t-p \n" + "\t\tOpen with lower left corner at , .\n" + "\t-m\n" + "\t\tRead from disk (Do not buffer).\n" + "\t-f \n" + "\t\tSpecify FPS to start with.\n" + "\t-j \n" + "\t\tSet frame step to .\n" + "\t-s \n" + "\t\tPlay from .\n" + "\t-e \n" + "\t\tPlay until ."; static int arg_handle_playback_mode(int argc, const char **argv, void *UNUSED(data)) { - /* not if -b was given first */ - if (G.background == 0) { -#ifdef WITH_FFMPEG - /* Setup FFmpeg with current debug flags. */ - IMB_ffmpeg_init(); -#endif + /* not if -b was given first */ + if (G.background == 0) { +# ifdef WITH_FFMPEG + /* Setup FFmpeg with current debug flags. */ + IMB_ffmpeg_init(); +# endif - WM_main_playanim(argc, argv); /* not the same argc and argv as before */ - exit(0); /* 2.4x didn't do this */ - } + WM_main_playanim(argc, argv); /* not the same argc and argv as before */ + exit(0); /* 2.4x didn't do this */ + } - return -2; + return -2; } static const char arg_handle_window_geometry_doc[] = -" \n" -"\tOpen with lower left corner at , and width and height as , ." -; + " \n" + "\tOpen with lower left corner at , and width and height as , ."; static int arg_handle_window_geometry(int argc, const char **argv, void *UNUSED(data)) { - const char *arg_id = "-p / --window-geometry"; - int params[4], i; + const char *arg_id = "-p / --window-geometry"; + int params[4], i; - if (argc < 5) { - fprintf(stderr, "Error: requires four arguments '%s'\n", arg_id); - exit(1); - } + if (argc < 5) { + fprintf(stderr, "Error: requires four arguments '%s'\n", arg_id); + exit(1); + } - for (i = 0; i < 4; i++) { - const char *err_msg = NULL; - if (!parse_int(argv[i + 1], NULL, ¶ms[i], &err_msg)) { - printf("\nError: %s '%s %s'.\n", err_msg, arg_id, argv[1]); - exit(1); - } - } + for (i = 0; i < 4; i++) { + const char *err_msg = NULL; + if (!parse_int(argv[i + 1], NULL, ¶ms[i], &err_msg)) { + printf("\nError: %s '%s %s'.\n", err_msg, arg_id, argv[1]); + exit(1); + } + } - WM_init_state_size_set(UNPACK4(params)); + WM_init_state_size_set(UNPACK4(params)); - return 4; + return 4; } static const char arg_handle_native_pixels_set_doc[] = -"\n\tDo not use native pixel size, for high resolution displays (MacBook 'Retina')." -; -static int arg_handle_native_pixels_set(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data)) + "\n\tDo not use native pixel size, for high resolution displays (MacBook 'Retina')."; +static int arg_handle_native_pixels_set(int UNUSED(argc), + const char **UNUSED(argv), + void *UNUSED(data)) { - WM_init_native_pixels(false); - return 0; + WM_init_native_pixels(false); + return 0; } -static const char arg_handle_with_borders_doc[] = -"\n\tForce opening with borders." -; +static const char arg_handle_with_borders_doc[] = "\n\tForce opening with borders."; static int arg_handle_with_borders(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data)) { - WM_init_state_normal_set(); - return 0; + WM_init_state_normal_set(); + return 0; } -static const char arg_handle_without_borders_doc[] = -"\n\tForce opening in fullscreen mode." -; -static int arg_handle_without_borders(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data)) +static const char arg_handle_without_borders_doc[] = "\n\tForce opening in fullscreen mode."; +static int arg_handle_without_borders(int UNUSED(argc), + const char **UNUSED(argv), + void *UNUSED(data)) { - WM_init_state_fullscreen_set(); - return 0; + WM_init_state_fullscreen_set(); + return 0; } -static const char arg_handle_window_maximized_doc[] = -"\n\tForce opening maximized." -; -static int arg_handle_window_maximized(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data)) +static const char arg_handle_window_maximized_doc[] = "\n\tForce opening maximized."; +static int arg_handle_window_maximized(int UNUSED(argc), + const char **UNUSED(argv), + void *UNUSED(data)) { - WM_init_state_maximized_set(); - return 0; + WM_init_state_maximized_set(); + return 0; } static const char arg_handle_no_window_focus_doc[] = -"\n\tOpen behind other windows and without taking focus." -; -static int arg_handle_no_window_focus(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data)) + "\n\tOpen behind other windows and without taking focus."; +static int arg_handle_no_window_focus(int UNUSED(argc), + const char **UNUSED(argv), + void *UNUSED(data)) { - WM_init_window_focus_set(false); - return 0; + WM_init_window_focus_set(false); + return 0; } static const char arg_handle_start_with_console_doc[] = -"\n\tStart with the console window open (ignored if -b is set), (Windows only)." -; -static int arg_handle_start_with_console(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data)) + "\n\tStart with the console window open (ignored if -b is set), (Windows only)."; +static int arg_handle_start_with_console(int UNUSED(argc), + const char **UNUSED(argv), + void *UNUSED(data)) { - WM_init_state_start_with_console_set(true); - return 0; + WM_init_state_start_with_console_set(true); + return 0; } static const char arg_handle_register_extension_doc[] = -"\n\tRegister blend-file extension, then exit (Windows only)." -; + "\n\tRegister blend-file extension, then exit (Windows only)."; static const char arg_handle_register_extension_doc_silent[] = -"\n\tSilently register blend-file extension, then exit (Windows only)." -; + "\n\tSilently register blend-file extension, then exit (Windows only)."; static int arg_handle_register_extension(int UNUSED(argc), const char **UNUSED(argv), void *data) { -#ifdef WIN32 - if (data) - G.background = 1; - RegisterBlendExtension(); -#else - (void)data; /* unused */ -#endif - return 0; +# ifdef WIN32 + if (data) + G.background = 1; + RegisterBlendExtension(); +# else + (void)data; /* unused */ +# endif + return 0; } -static const char arg_handle_audio_disable_doc[] = -"\n\tForce sound system to None." -; -static int arg_handle_audio_disable(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data)) +static const char arg_handle_audio_disable_doc[] = "\n\tForce sound system to None."; +static int arg_handle_audio_disable(int UNUSED(argc), + const char **UNUSED(argv), + void *UNUSED(data)) { - BKE_sound_force_device("Null"); - return 0; + BKE_sound_force_device("Null"); + return 0; } static const char arg_handle_audio_set_doc[] = -"\n\tForce sound system to a specific device.\n\t'NULL' 'SDL' 'OPENAL' 'JACK'." -; + "\n\tForce sound system to a specific device.\n\t'NULL' 'SDL' 'OPENAL' 'JACK'."; static int arg_handle_audio_set(int argc, const char **argv, void *UNUSED(data)) { - if (argc < 1) { - fprintf(stderr, "-setaudio require one argument\n"); - exit(1); - } + if (argc < 1) { + fprintf(stderr, "-setaudio require one argument\n"); + exit(1); + } - BKE_sound_force_device(argv[1]); - return 1; + BKE_sound_force_device(argv[1]); + return 1; } static const char arg_handle_output_set_doc[] = -"\n" -"\tSet the render path and file name.\n" -"\tUse '//' at the start of the path to render relative to the blend-file.\n" -"\n" -"\tThe '#' characters are replaced by the frame number, and used to define zero padding.\n" -"\n" -"\t* 'ani_##_test.png' becomes 'ani_01_test.png'\n" -"\t* 'test-######.png' becomes 'test-000001.png'\n" -"\n" -"\tWhen the filename does not contain '#', The suffix '####' is added to the filename.\n" -"\n" -"\tThe frame number will be added at the end of the filename, eg:\n" -"\t# blender -b foobar.blend -o //render_ -F PNG -x 1 -a\n" -"\t'//render_' becomes '//render_####', writing frames as '//render_0001.png'" -; + "\n" + "\tSet the render path and file name.\n" + "\tUse '//' at the start of the path to render relative to the blend-file.\n" + "\n" + "\tThe '#' characters are replaced by the frame number, and used to define zero padding.\n" + "\n" + "\t* 'ani_##_test.png' becomes 'ani_01_test.png'\n" + "\t* 'test-######.png' becomes 'test-000001.png'\n" + "\n" + "\tWhen the filename does not contain '#', The suffix '####' is added to the filename.\n" + "\n" + "\tThe frame number will be added at the end of the filename, eg:\n" + "\t# blender -b foobar.blend -o //render_ -F PNG -x 1 -a\n" + "\t'//render_' becomes '//render_####', writing frames as '//render_0001.png'"; static int arg_handle_output_set(int argc, const char **argv, void *data) { - bContext *C = data; - if (argc > 1) { - Scene *scene = CTX_data_scene(C); - if (scene) { - BLI_strncpy(scene->r.pic, argv[1], sizeof(scene->r.pic)); - } - else { - printf("\nError: no blend loaded. cannot use '-o / --render-output'.\n"); - } - return 1; - } - else { - printf("\nError: you must specify a path after '-o / --render-output'.\n"); - return 0; - } + bContext *C = data; + if (argc > 1) { + Scene *scene = CTX_data_scene(C); + if (scene) { + BLI_strncpy(scene->r.pic, argv[1], sizeof(scene->r.pic)); + } + else { + printf("\nError: no blend loaded. cannot use '-o / --render-output'.\n"); + } + return 1; + } + else { + printf("\nError: you must specify a path after '-o / --render-output'.\n"); + return 0; + } } static const char arg_handle_engine_set_doc[] = -"\n" -"\tSpecify the render engine.\n\tUse -E help to list available engines." -; + "\n" + "\tSpecify the render engine.\n\tUse -E help to list available engines."; static int arg_handle_engine_set(int argc, const char **argv, void *data) { - bContext *C = data; - if (argc >= 2) { - if (STREQ(argv[1], "help")) { - RenderEngineType *type = NULL; - printf("Blender Engine Listing:\n"); - for (type = R_engines.first; type; type = type->next) { - printf("\t%s\n", type->idname); - } - exit(0); - } - else { - Scene *scene = CTX_data_scene(C); - if (scene) { - if (BLI_findstring(&R_engines, argv[1], offsetof(RenderEngineType, idname))) { - BLI_strncpy_utf8(scene->r.engine, argv[1], sizeof(scene->r.engine)); - } - else { - printf("\nError: engine not found '%s'\n", argv[1]); - exit(1); - } - } - else { - printf("\nError: no blend loaded. " - "order the arguments so '-E / --engine ' is after a blend is loaded.\n"); - } - } - - return 1; - } - else { - printf("\nEngine not specified, give 'help' for a list of available engines.\n"); - return 0; - } + bContext *C = data; + if (argc >= 2) { + if (STREQ(argv[1], "help")) { + RenderEngineType *type = NULL; + printf("Blender Engine Listing:\n"); + for (type = R_engines.first; type; type = type->next) { + printf("\t%s\n", type->idname); + } + exit(0); + } + else { + Scene *scene = CTX_data_scene(C); + if (scene) { + if (BLI_findstring(&R_engines, argv[1], offsetof(RenderEngineType, idname))) { + BLI_strncpy_utf8(scene->r.engine, argv[1], sizeof(scene->r.engine)); + } + else { + printf("\nError: engine not found '%s'\n", argv[1]); + exit(1); + } + } + else { + printf( + "\nError: no blend loaded. " + "order the arguments so '-E / --engine ' is after a blend is loaded.\n"); + } + } + + return 1; + } + else { + printf("\nEngine not specified, give 'help' for a list of available engines.\n"); + return 0; + } } static const char arg_handle_image_type_set_doc[] = -"\n" -"\tSet the render format.\n" -"\tValid options are 'TGA' 'RAWTGA' 'JPEG' 'IRIS' 'IRIZ' 'AVIRAW' 'AVIJPEG' 'PNG' 'BMP'\n" -"\n" -"\tFormats that can be compiled into Blender, not available on all systems: 'HDR' 'TIFF' 'OPEN_EXR'\n" -"\t'OPEN_EXR_MULTILAYER' 'MPEG' 'CINEON' 'DPX' 'DDS' 'JP2'" -; + "\n" + "\tSet the render format.\n" + "\tValid options are 'TGA' 'RAWTGA' 'JPEG' 'IRIS' 'IRIZ' 'AVIRAW' 'AVIJPEG' 'PNG' 'BMP'\n" + "\n" + "\tFormats that can be compiled into Blender, not available on all systems: 'HDR' 'TIFF' " + "'OPEN_EXR'\n" + "\t'OPEN_EXR_MULTILAYER' 'MPEG' 'CINEON' 'DPX' 'DDS' 'JP2'"; static int arg_handle_image_type_set(int argc, const char **argv, void *data) { - bContext *C = data; - if (argc > 1) { - const char *imtype = argv[1]; - Scene *scene = CTX_data_scene(C); - if (scene) { - const char imtype_new = BKE_imtype_from_arg(imtype); - - if (imtype_new == R_IMF_IMTYPE_INVALID) { - printf("\nError: Format from '-F / --render-format' not known or not compiled in this release.\n"); - } - else { - scene->r.im_format.imtype = imtype_new; - } - } - else { - printf("\nError: no blend loaded. " - "order the arguments so '-F / --render-format' is after the blend is loaded.\n"); - } - return 1; - } - else { - printf("\nError: you must specify a format after '-F / --render-foramt'.\n"); - return 0; - } + bContext *C = data; + if (argc > 1) { + const char *imtype = argv[1]; + Scene *scene = CTX_data_scene(C); + if (scene) { + const char imtype_new = BKE_imtype_from_arg(imtype); + + if (imtype_new == R_IMF_IMTYPE_INVALID) { + printf( + "\nError: Format from '-F / --render-format' not known or not compiled in this " + "release.\n"); + } + else { + scene->r.im_format.imtype = imtype_new; + } + } + else { + printf( + "\nError: no blend loaded. " + "order the arguments so '-F / --render-format' is after the blend is loaded.\n"); + } + return 1; + } + else { + printf("\nError: you must specify a format after '-F / --render-foramt'.\n"); + return 0; + } } static const char arg_handle_threads_set_doc[] = -"\n" -"\tUse amount of for rendering and other operations\n" -"\t[1-" STRINGIFY(BLENDER_MAX_THREADS) "], 0 for systems processor count." -; + "\n" + "\tUse amount of for rendering and other operations\n" + "\t[1-" STRINGIFY(BLENDER_MAX_THREADS) "], 0 for systems processor count."; static int arg_handle_threads_set(int argc, const char **argv, void *UNUSED(data)) { - const char *arg_id = "-t / --threads"; - const int min = 0, max = BLENDER_MAX_THREADS; - if (argc > 1) { - const char *err_msg = NULL; - int threads; - if (!parse_int_strict_range(argv[1], NULL, min, max, &threads, &err_msg)) { - printf("\nError: %s '%s %s', expected number in [%d..%d].\n", err_msg, arg_id, argv[1], min, max); - return 1; - } - - BLI_system_num_threads_override_set(threads); - return 1; - } - else { - printf("\nError: you must specify a number of threads in [%d..%d] '%s'.\n", min, max, arg_id); - return 0; - } + const char *arg_id = "-t / --threads"; + const int min = 0, max = BLENDER_MAX_THREADS; + if (argc > 1) { + const char *err_msg = NULL; + int threads; + if (!parse_int_strict_range(argv[1], NULL, min, max, &threads, &err_msg)) { + printf("\nError: %s '%s %s', expected number in [%d..%d].\n", + err_msg, + arg_id, + argv[1], + min, + max); + return 1; + } + + BLI_system_num_threads_override_set(threads); + return 1; + } + else { + printf("\nError: you must specify a number of threads in [%d..%d] '%s'.\n", min, max, arg_id); + return 0; + } } static const char arg_handle_verbosity_set_doc[] = -"\n" -"\tSet logging verbosity level." -; + "\n" + "\tSet logging verbosity level."; static int arg_handle_verbosity_set(int argc, const char **argv, void *UNUSED(data)) { - const char *arg_id = "--verbose"; - if (argc > 1) { - const char *err_msg = NULL; - int level; - if (!parse_int(argv[1], NULL, &level, &err_msg)) { - printf("\nError: %s '%s %s'.\n", err_msg, arg_id, argv[1]); - } - -#ifdef WITH_LIBMV - libmv_setLoggingVerbosity(level); -#elif defined(WITH_CYCLES_LOGGING) - CCL_logging_verbosity_set(level); -#else - (void)level; -#endif - - return 1; - } - else { - printf("\nError: you must specify a verbosity level.\n"); - return 0; - } + const char *arg_id = "--verbose"; + if (argc > 1) { + const char *err_msg = NULL; + int level; + if (!parse_int(argv[1], NULL, &level, &err_msg)) { + printf("\nError: %s '%s %s'.\n", err_msg, arg_id, argv[1]); + } + +# ifdef WITH_LIBMV + libmv_setLoggingVerbosity(level); +# elif defined(WITH_CYCLES_LOGGING) + CCL_logging_verbosity_set(level); +# else + (void)level; +# endif + + return 1; + } + else { + printf("\nError: you must specify a verbosity level.\n"); + return 0; + } } static const char arg_handle_extension_set_doc[] = -"\n" -"\tSet option to add the file extension to the end of the file." -; + "\n" + "\tSet option to add the file extension to the end of the file."; static int arg_handle_extension_set(int argc, const char **argv, void *data) { - bContext *C = data; - if (argc > 1) { - Scene *scene = CTX_data_scene(C); - if (scene) { - if (argv[1][0] == '0') { - scene->r.scemode &= ~R_EXTENSION; - } - else if (argv[1][0] == '1') { - scene->r.scemode |= R_EXTENSION; - } - else { - printf("\nError: Use '-x 1 / -x 0' To set the extension option or '--use-extension'\n"); - } - } - else { - printf("\nError: no blend loaded. " - "order the arguments so '-o ' is after '-x '.\n"); - } - return 1; - } - else { - printf("\nError: you must specify a path after '- '.\n"); - return 0; - } + bContext *C = data; + if (argc > 1) { + Scene *scene = CTX_data_scene(C); + if (scene) { + if (argv[1][0] == '0') { + scene->r.scemode &= ~R_EXTENSION; + } + else if (argv[1][0] == '1') { + scene->r.scemode |= R_EXTENSION; + } + else { + printf("\nError: Use '-x 1 / -x 0' To set the extension option or '--use-extension'\n"); + } + } + else { + printf( + "\nError: no blend loaded. " + "order the arguments so '-o ' is after '-x '.\n"); + } + return 1; + } + else { + printf("\nError: you must specify a path after '- '.\n"); + return 0; + } } static const char arg_handle_render_frame_doc[] = -"\n" -"\tRender frame and save it.\n" -"\n" -"\t* + start frame relative, - end frame relative.\n" -"\t* A comma separated list of frames can also be used (no spaces).\n" -"\t* A range of frames can be expressed using '..' separator between the first and last frames (inclusive).\n" -; + "\n" + "\tRender frame and save it.\n" + "\n" + "\t* + start frame relative, - end frame relative.\n" + "\t* A comma separated list of frames can also be used (no spaces).\n" + "\t* A range of frames can be expressed using '..' separator between the first and last " + "frames (inclusive).\n"; static int arg_handle_render_frame(int argc, const char **argv, void *data) { - const char *arg_id = "-f / --render-frame"; - bContext *C = data; - Scene *scene = CTX_data_scene(C); - if (scene) { - Main *bmain = CTX_data_main(C); - - if (argc > 1) { - const char *err_msg = NULL; - Render *re; - ReportList reports; - - int (*frame_range_arr)[2], frames_range_len; - if ((frame_range_arr = parse_int_range_relative_clamp_n( - argv[1], scene->r.sfra, scene->r.efra, MINAFRAME, MAXFRAME, - &frames_range_len, &err_msg)) == NULL) - { - printf("\nError: %s '%s %s'.\n", err_msg, arg_id, argv[1]); - return 1; - } - - re = RE_NewSceneRender(scene); - BLI_threaded_malloc_begin(); - BKE_reports_init(&reports, RPT_STORE); - RE_SetReports(re, &reports); - for (int i = 0; i < frames_range_len; i++) { - /* We could pass in frame ranges, - * but prefer having exact behavior as passing in multiple frames */ - if ((frame_range_arr[i][0] <= frame_range_arr[i][1]) == 0) { - printf("\nWarning: negative range ignored '%s %s'.\n", arg_id, argv[1]); - } - - for (int frame = frame_range_arr[i][0]; frame <= frame_range_arr[i][1]; frame++) { - RE_BlenderAnim(re, bmain, scene, NULL, NULL, frame, frame, scene->r.frame_step); - } - } - RE_SetReports(re, NULL); - BKE_reports_clear(&reports); - BLI_threaded_malloc_end(); - MEM_freeN(frame_range_arr); - return 1; - } - else { - printf("\nError: frame number must follow '%s'.\n", arg_id); - return 0; - } - } - else { - printf("\nError: no blend loaded. cannot use '%s'.\n", arg_id); - return 0; - } + const char *arg_id = "-f / --render-frame"; + bContext *C = data; + Scene *scene = CTX_data_scene(C); + if (scene) { + Main *bmain = CTX_data_main(C); + + if (argc > 1) { + const char *err_msg = NULL; + Render *re; + ReportList reports; + + int(*frame_range_arr)[2], frames_range_len; + if ((frame_range_arr = parse_int_range_relative_clamp_n(argv[1], + scene->r.sfra, + scene->r.efra, + MINAFRAME, + MAXFRAME, + &frames_range_len, + &err_msg)) == NULL) { + printf("\nError: %s '%s %s'.\n", err_msg, arg_id, argv[1]); + return 1; + } + + re = RE_NewSceneRender(scene); + BLI_threaded_malloc_begin(); + BKE_reports_init(&reports, RPT_STORE); + RE_SetReports(re, &reports); + for (int i = 0; i < frames_range_len; i++) { + /* We could pass in frame ranges, + * but prefer having exact behavior as passing in multiple frames */ + if ((frame_range_arr[i][0] <= frame_range_arr[i][1]) == 0) { + printf("\nWarning: negative range ignored '%s %s'.\n", arg_id, argv[1]); + } + + for (int frame = frame_range_arr[i][0]; frame <= frame_range_arr[i][1]; frame++) { + RE_BlenderAnim(re, bmain, scene, NULL, NULL, frame, frame, scene->r.frame_step); + } + } + RE_SetReports(re, NULL); + BKE_reports_clear(&reports); + BLI_threaded_malloc_end(); + MEM_freeN(frame_range_arr); + return 1; + } + else { + printf("\nError: frame number must follow '%s'.\n", arg_id); + return 0; + } + } + else { + printf("\nError: no blend loaded. cannot use '%s'.\n", arg_id); + return 0; + } } static const char arg_handle_render_animation_doc[] = -"\n\tRender frames from start to end (inclusive)." -; + "\n\tRender frames from start to end (inclusive)."; static int arg_handle_render_animation(int UNUSED(argc), const char **UNUSED(argv), void *data) { - bContext *C = data; - Scene *scene = CTX_data_scene(C); - if (scene) { - Main *bmain = CTX_data_main(C); - Render *re = RE_NewSceneRender(scene); - ReportList reports; - BLI_threaded_malloc_begin(); - BKE_reports_init(&reports, RPT_STORE); - RE_SetReports(re, &reports); - RE_BlenderAnim(re, bmain, scene, NULL, NULL, scene->r.sfra, scene->r.efra, scene->r.frame_step); - RE_SetReports(re, NULL); - BKE_reports_clear(&reports); - BLI_threaded_malloc_end(); - } - else { - printf("\nError: no blend loaded. cannot use '-a'.\n"); - } - return 0; + bContext *C = data; + Scene *scene = CTX_data_scene(C); + if (scene) { + Main *bmain = CTX_data_main(C); + Render *re = RE_NewSceneRender(scene); + ReportList reports; + BLI_threaded_malloc_begin(); + BKE_reports_init(&reports, RPT_STORE); + RE_SetReports(re, &reports); + RE_BlenderAnim( + re, bmain, scene, NULL, NULL, scene->r.sfra, scene->r.efra, scene->r.frame_step); + RE_SetReports(re, NULL); + BKE_reports_clear(&reports); + BLI_threaded_malloc_end(); + } + else { + printf("\nError: no blend loaded. cannot use '-a'.\n"); + } + return 0; } static const char arg_handle_scene_set_doc[] = -"\n" -"\tSet the active scene for rendering." -; + "\n" + "\tSet the active scene for rendering."; static int arg_handle_scene_set(int argc, const char **argv, void *data) { - if (argc > 1) { - bContext *C = data; - Scene *scene = BKE_scene_set_name(CTX_data_main(C), argv[1]); - if (scene) { - CTX_data_scene_set(C, scene); - - /* Set the scene of the first window, see: T55991, - * otherwise scrips that run later won't get this scene back from the context. */ - wmWindow *win = CTX_wm_window(C); - if (win == NULL) { - win = CTX_wm_manager(C)->windows.first; - } - if (win != NULL) { - WM_window_set_active_scene(CTX_data_main(C), C, win, scene); - } - } - return 1; - } - else { - printf("\nError: Scene name must follow '-S / --scene'.\n"); - return 0; - } + if (argc > 1) { + bContext *C = data; + Scene *scene = BKE_scene_set_name(CTX_data_main(C), argv[1]); + if (scene) { + CTX_data_scene_set(C, scene); + + /* Set the scene of the first window, see: T55991, + * otherwise scrips that run later won't get this scene back from the context. */ + wmWindow *win = CTX_wm_window(C); + if (win == NULL) { + win = CTX_wm_manager(C)->windows.first; + } + if (win != NULL) { + WM_window_set_active_scene(CTX_data_main(C), C, win, scene); + } + } + return 1; + } + else { + printf("\nError: Scene name must follow '-S / --scene'.\n"); + return 0; + } } static const char arg_handle_frame_start_set_doc[] = -"\n" -"\tSet start to frame , supports +/- for relative frames too." -; + "\n" + "\tSet start to frame , supports +/- for relative frames too."; static int arg_handle_frame_start_set(int argc, const char **argv, void *data) { - const char *arg_id = "-s / --frame-start"; - bContext *C = data; - Scene *scene = CTX_data_scene(C); - if (scene) { - if (argc > 1) { - const char *err_msg = NULL; - if (!parse_int_relative_clamp( - argv[1], NULL, scene->r.sfra, scene->r.sfra - 1, MINAFRAME, MAXFRAME, - &scene->r.sfra, &err_msg)) - { - printf("\nError: %s '%s %s'.\n", err_msg, arg_id, argv[1]); - } - return 1; - } - else { - printf("\nError: frame number must follow '%s'.\n", arg_id); - return 0; - } - } - else { - printf("\nError: no blend loaded. cannot use '%s'.\n", arg_id); - return 0; - } + const char *arg_id = "-s / --frame-start"; + bContext *C = data; + Scene *scene = CTX_data_scene(C); + if (scene) { + if (argc > 1) { + const char *err_msg = NULL; + if (!parse_int_relative_clamp(argv[1], + NULL, + scene->r.sfra, + scene->r.sfra - 1, + MINAFRAME, + MAXFRAME, + &scene->r.sfra, + &err_msg)) { + printf("\nError: %s '%s %s'.\n", err_msg, arg_id, argv[1]); + } + return 1; + } + else { + printf("\nError: frame number must follow '%s'.\n", arg_id); + return 0; + } + } + else { + printf("\nError: no blend loaded. cannot use '%s'.\n", arg_id); + return 0; + } } static const char arg_handle_frame_end_set_doc[] = -"\n" -"\tSet end to frame , supports +/- for relative frames too." -; + "\n" + "\tSet end to frame , supports +/- for relative frames too."; static int arg_handle_frame_end_set(int argc, const char **argv, void *data) { - const char *arg_id = "-e / --frame-end"; - bContext *C = data; - Scene *scene = CTX_data_scene(C); - if (scene) { - if (argc > 1) { - const char *err_msg = NULL; - if (!parse_int_relative_clamp( - argv[1], NULL, scene->r.efra, scene->r.efra - 1, MINAFRAME, MAXFRAME, - &scene->r.efra, &err_msg)) - { - printf("\nError: %s '%s %s'.\n", err_msg, arg_id, argv[1]); - } - return 1; - } - else { - printf("\nError: frame number must follow '%s'.\n", arg_id); - return 0; - } - } - else { - printf("\nError: no blend loaded. cannot use '%s'.\n", arg_id); - return 0; - } + const char *arg_id = "-e / --frame-end"; + bContext *C = data; + Scene *scene = CTX_data_scene(C); + if (scene) { + if (argc > 1) { + const char *err_msg = NULL; + if (!parse_int_relative_clamp(argv[1], + NULL, + scene->r.efra, + scene->r.efra - 1, + MINAFRAME, + MAXFRAME, + &scene->r.efra, + &err_msg)) { + printf("\nError: %s '%s %s'.\n", err_msg, arg_id, argv[1]); + } + return 1; + } + else { + printf("\nError: frame number must follow '%s'.\n", arg_id); + return 0; + } + } + else { + printf("\nError: no blend loaded. cannot use '%s'.\n", arg_id); + return 0; + } } static const char arg_handle_frame_skip_set_doc[] = -"\n" -"\tSet number of frames to step forward after each rendered frame." -; + "\n" + "\tSet number of frames to step forward after each rendered frame."; static int arg_handle_frame_skip_set(int argc, const char **argv, void *data) { - const char *arg_id = "-j / --frame-jump"; - bContext *C = data; - Scene *scene = CTX_data_scene(C); - if (scene) { - if (argc > 1) { - const char *err_msg = NULL; - if (!parse_int_clamp(argv[1], NULL, 1, MAXFRAME, &scene->r.frame_step, &err_msg)) { - printf("\nError: %s '%s %s'.\n", err_msg, arg_id, argv[1]); - } - return 1; - } - else { - printf("\nError: number of frames to step must follow '%s'.\n", arg_id); - return 0; - } - } - else { - printf("\nError: no blend loaded. cannot use '%s'.\n", arg_id); - return 0; - } + const char *arg_id = "-j / --frame-jump"; + bContext *C = data; + Scene *scene = CTX_data_scene(C); + if (scene) { + if (argc > 1) { + const char *err_msg = NULL; + if (!parse_int_clamp(argv[1], NULL, 1, MAXFRAME, &scene->r.frame_step, &err_msg)) { + printf("\nError: %s '%s %s'.\n", err_msg, arg_id, argv[1]); + } + return 1; + } + else { + printf("\nError: number of frames to step must follow '%s'.\n", arg_id); + return 0; + } + } + else { + printf("\nError: no blend loaded. cannot use '%s'.\n", arg_id); + return 0; + } } static const char arg_handle_python_file_run_doc[] = -"\n" -"\tRun the given Python script file." -; + "\n" + "\tRun the given Python script file."; static int arg_handle_python_file_run(int argc, const char **argv, void *data) { -#ifdef WITH_PYTHON - bContext *C = data; - - /* workaround for scripts not getting a bpy.context.scene, causes internal errors elsewhere */ - if (argc > 1) { - /* Make the path absolute because its needed for relative linked blends to be found */ - char filename[FILE_MAX]; - BLI_strncpy(filename, argv[1], sizeof(filename)); - BLI_path_cwd(filename, sizeof(filename)); - - bool ok; - BPY_CTX_SETUP(ok = BPY_execute_filepath(C, filename, NULL)); - if (!ok && app_state.exit_code_on_error.python) { - printf("\nError: script failed, file: '%s', exiting.\n", argv[1]); - BPY_python_end(); - exit(app_state.exit_code_on_error.python); - } - return 1; - } - else { - printf("\nError: you must specify a filepath after '%s'.\n", argv[0]); - return 0; - } -#else - UNUSED_VARS(argc, argv, data); - printf("This Blender was built without Python support\n"); - return 0; -#endif /* WITH_PYTHON */ +# ifdef WITH_PYTHON + bContext *C = data; + + /* workaround for scripts not getting a bpy.context.scene, causes internal errors elsewhere */ + if (argc > 1) { + /* Make the path absolute because its needed for relative linked blends to be found */ + char filename[FILE_MAX]; + BLI_strncpy(filename, argv[1], sizeof(filename)); + BLI_path_cwd(filename, sizeof(filename)); + + bool ok; + BPY_CTX_SETUP(ok = BPY_execute_filepath(C, filename, NULL)); + if (!ok && app_state.exit_code_on_error.python) { + printf("\nError: script failed, file: '%s', exiting.\n", argv[1]); + BPY_python_end(); + exit(app_state.exit_code_on_error.python); + } + return 1; + } + else { + printf("\nError: you must specify a filepath after '%s'.\n", argv[0]); + return 0; + } +# else + UNUSED_VARS(argc, argv, data); + printf("This Blender was built without Python support\n"); + return 0; +# endif /* WITH_PYTHON */ } static const char arg_handle_python_text_run_doc[] = -"\n" -"\tRun the given Python script text block." -; + "\n" + "\tRun the given Python script text block."; static int arg_handle_python_text_run(int argc, const char **argv, void *data) { -#ifdef WITH_PYTHON - bContext *C = data; - - /* workaround for scripts not getting a bpy.context.scene, causes internal errors elsewhere */ - if (argc > 1) { - Main *bmain = CTX_data_main(C); - /* Make the path absolute because its needed for relative linked blends to be found */ - struct Text *text = (struct Text *)BKE_libblock_find_name(bmain, ID_TXT, argv[1]); - bool ok; - - if (text) { - BPY_CTX_SETUP(ok = BPY_execute_text(C, text, NULL, false)); - } - else { - printf("\nError: text block not found %s.\n", argv[1]); - ok = false; - } - - if (!ok && app_state.exit_code_on_error.python) { - printf("\nError: script failed, text: '%s', exiting.\n", argv[1]); - BPY_python_end(); - exit(app_state.exit_code_on_error.python); - } - - return 1; - } - else { - printf("\nError: you must specify a text block after '%s'.\n", argv[0]); - return 0; - } -#else - UNUSED_VARS(argc, argv, data); - printf("This Blender was built without Python support\n"); - return 0; -#endif /* WITH_PYTHON */ +# ifdef WITH_PYTHON + bContext *C = data; + + /* workaround for scripts not getting a bpy.context.scene, causes internal errors elsewhere */ + if (argc > 1) { + Main *bmain = CTX_data_main(C); + /* Make the path absolute because its needed for relative linked blends to be found */ + struct Text *text = (struct Text *)BKE_libblock_find_name(bmain, ID_TXT, argv[1]); + bool ok; + + if (text) { + BPY_CTX_SETUP(ok = BPY_execute_text(C, text, NULL, false)); + } + else { + printf("\nError: text block not found %s.\n", argv[1]); + ok = false; + } + + if (!ok && app_state.exit_code_on_error.python) { + printf("\nError: script failed, text: '%s', exiting.\n", argv[1]); + BPY_python_end(); + exit(app_state.exit_code_on_error.python); + } + + return 1; + } + else { + printf("\nError: you must specify a text block after '%s'.\n", argv[0]); + return 0; + } +# else + UNUSED_VARS(argc, argv, data); + printf("This Blender was built without Python support\n"); + return 0; +# endif /* WITH_PYTHON */ } static const char arg_handle_python_expr_run_doc[] = -"\n" -"\tRun the given expression as a Python script." -; + "\n" + "\tRun the given expression as a Python script."; static int arg_handle_python_expr_run(int argc, const char **argv, void *data) { -#ifdef WITH_PYTHON - bContext *C = data; - - /* workaround for scripts not getting a bpy.context.scene, causes internal errors elsewhere */ - if (argc > 1) { - bool ok; - BPY_CTX_SETUP(ok = BPY_execute_string_ex(C, NULL, argv[1], false)); - if (!ok && app_state.exit_code_on_error.python) { - printf("\nError: script failed, expr: '%s', exiting.\n", argv[1]); - BPY_python_end(); - exit(app_state.exit_code_on_error.python); - } - return 1; - } - else { - printf("\nError: you must specify a Python expression after '%s'.\n", argv[0]); - return 0; - } -#else - UNUSED_VARS(argc, argv, data); - printf("This Blender was built without Python support\n"); - return 0; -#endif /* WITH_PYTHON */ +# ifdef WITH_PYTHON + bContext *C = data; + + /* workaround for scripts not getting a bpy.context.scene, causes internal errors elsewhere */ + if (argc > 1) { + bool ok; + BPY_CTX_SETUP(ok = BPY_execute_string_ex(C, NULL, argv[1], false)); + if (!ok && app_state.exit_code_on_error.python) { + printf("\nError: script failed, expr: '%s', exiting.\n", argv[1]); + BPY_python_end(); + exit(app_state.exit_code_on_error.python); + } + return 1; + } + else { + printf("\nError: you must specify a Python expression after '%s'.\n", argv[0]); + return 0; + } +# else + UNUSED_VARS(argc, argv, data); + printf("This Blender was built without Python support\n"); + return 0; +# endif /* WITH_PYTHON */ } static const char arg_handle_python_console_run_doc[] = -"\n\tRun Blender with an interactive console." -; + "\n\tRun Blender with an interactive console."; static int arg_handle_python_console_run(int UNUSED(argc), const char **argv, void *data) { -#ifdef WITH_PYTHON - bContext *C = data; +# ifdef WITH_PYTHON + bContext *C = data; - BPY_CTX_SETUP(BPY_execute_string(C, (const char *[]){"code", NULL}, "code.interact()")); + BPY_CTX_SETUP(BPY_execute_string(C, (const char *[]){"code", NULL}, "code.interact()")); - return 0; -#else - UNUSED_VARS(argv, data); - printf("This Blender was built without python support\n"); - return 0; -#endif /* WITH_PYTHON */ + return 0; +# else + UNUSED_VARS(argv, data); + printf("This Blender was built without python support\n"); + return 0; +# endif /* WITH_PYTHON */ } static const char arg_handle_python_exit_code_set_doc[] = -"\n" -"\tSet the exit-code in [0..255] to exit if a Python exception is raised\n" -"\t(only for scripts executed from the command line), zero disables." -; + "\n" + "\tSet the exit-code in [0..255] to exit if a Python exception is raised\n" + "\t(only for scripts executed from the command line), zero disables."; static int arg_handle_python_exit_code_set(int argc, const char **argv, void *UNUSED(data)) { - const char *arg_id = "--python-exit-code"; - if (argc > 1) { - const char *err_msg = NULL; - const int min = 0, max = 255; - int exit_code; - if (!parse_int_strict_range(argv[1], NULL, min, max, &exit_code, &err_msg)) { - printf("\nError: %s '%s %s', expected number in [%d..%d].\n", err_msg, arg_id, argv[1], min, max); - return 1; - } - - app_state.exit_code_on_error.python = (unsigned char)exit_code; - return 1; - } - else { - printf("\nError: you must specify an exit code number '%s'.\n", arg_id); - return 0; - } + const char *arg_id = "--python-exit-code"; + if (argc > 1) { + const char *err_msg = NULL; + const int min = 0, max = 255; + int exit_code; + if (!parse_int_strict_range(argv[1], NULL, min, max, &exit_code, &err_msg)) { + printf("\nError: %s '%s %s', expected number in [%d..%d].\n", + err_msg, + arg_id, + argv[1], + min, + max); + return 1; + } + + app_state.exit_code_on_error.python = (unsigned char)exit_code; + return 1; + } + else { + printf("\nError: you must specify an exit code number '%s'.\n", arg_id); + return 0; + } } static const char arg_handle_addons_set_doc[] = -"\n" -"\tComma separated list of add-ons (no spaces)." -; + "\n" + "\tComma separated list of add-ons (no spaces)."; static int arg_handle_addons_set(int argc, const char **argv, void *data) { - /* workaround for scripts not getting a bpy.context.scene, causes internal errors elsewhere */ - if (argc > 1) { -#ifdef WITH_PYTHON - const char script_str[] = - "from addon_utils import check, enable\n" - "for m in '%s'.split(','):\n" - " if check(m)[1] is False:\n" - " enable(m, persistent=True)"; - const int slen = strlen(argv[1]) + (sizeof(script_str) - 2); - char *str = malloc(slen); - bContext *C = data; - BLI_snprintf(str, slen, script_str, argv[1]); - - BLI_assert(strlen(str) + 1 == slen); - BPY_CTX_SETUP(BPY_execute_string_ex(C, NULL, str, false)); - free(str); -#else - UNUSED_VARS(argv, data); -#endif /* WITH_PYTHON */ - return 1; - } - else { - printf("\nError: you must specify a comma separated list after '--addons'.\n"); - return 0; - } + /* workaround for scripts not getting a bpy.context.scene, causes internal errors elsewhere */ + if (argc > 1) { +# ifdef WITH_PYTHON + const char script_str[] = + "from addon_utils import check, enable\n" + "for m in '%s'.split(','):\n" + " if check(m)[1] is False:\n" + " enable(m, persistent=True)"; + const int slen = strlen(argv[1]) + (sizeof(script_str) - 2); + char *str = malloc(slen); + bContext *C = data; + BLI_snprintf(str, slen, script_str, argv[1]); + + BLI_assert(strlen(str) + 1 == slen); + BPY_CTX_SETUP(BPY_execute_string_ex(C, NULL, str, false)); + free(str); +# else + UNUSED_VARS(argv, data); +# endif /* WITH_PYTHON */ + return 1; + } + else { + printf("\nError: you must specify a comma separated list after '--addons'.\n"); + return 0; + } } static int arg_handle_load_file(int UNUSED(argc), const char **argv, void *data) { - bContext *C = data; - ReportList reports; - bool success; - - /* Make the path absolute because its needed for relative linked blends to be found */ - char filename[FILE_MAX]; - - /* note, we could skip these, but so far we always tried to load these files */ - if (argv[0][0] == '-') { - fprintf(stderr, "unknown argument, loading as file: %s\n", argv[0]); - } - - BLI_strncpy(filename, argv[0], sizeof(filename)); - BLI_path_cwd(filename, sizeof(filename)); - - /* load the file */ - BKE_reports_init(&reports, RPT_PRINT); - WM_file_autoexec_init(filename); - success = WM_file_read(C, filename, &reports); - BKE_reports_clear(&reports); - - if (success) { - if (G.background) { - /* ensuer we use 'C->data.scene' for background render */ - CTX_wm_window_set(C, NULL); - } - } - else { - /* failed to load file, stop processing arguments if running in background mode */ - if (G.background) { - /* Set is_break if running in the background mode so - * blender will return non-zero exit code which then - * could be used in automated script to control how - * good or bad things are. - */ - G.is_break = true; - return -1; - } - - if (BLO_has_bfile_extension(filename)) { - /* Just pretend a file was loaded, so the user can press Save and it'll - * save at the filename from the CLI. */ - BLI_strncpy(G_MAIN->name, filename, FILE_MAX); - G.relbase_valid = true; - G.save_over = true; - printf("... opened default scene instead; saving will write to: %s\n", filename); - } - else { - printf("Error: argument has no '.blend' file extension, not using as new file, exiting! %s\n", filename); - G.is_break = true; - WM_exit(C); - } - } - - G.file_loaded = 1; - - return 0; + bContext *C = data; + ReportList reports; + bool success; + + /* Make the path absolute because its needed for relative linked blends to be found */ + char filename[FILE_MAX]; + + /* note, we could skip these, but so far we always tried to load these files */ + if (argv[0][0] == '-') { + fprintf(stderr, "unknown argument, loading as file: %s\n", argv[0]); + } + + BLI_strncpy(filename, argv[0], sizeof(filename)); + BLI_path_cwd(filename, sizeof(filename)); + + /* load the file */ + BKE_reports_init(&reports, RPT_PRINT); + WM_file_autoexec_init(filename); + success = WM_file_read(C, filename, &reports); + BKE_reports_clear(&reports); + + if (success) { + if (G.background) { + /* ensuer we use 'C->data.scene' for background render */ + CTX_wm_window_set(C, NULL); + } + } + else { + /* failed to load file, stop processing arguments if running in background mode */ + if (G.background) { + /* Set is_break if running in the background mode so + * blender will return non-zero exit code which then + * could be used in automated script to control how + * good or bad things are. + */ + G.is_break = true; + return -1; + } + + if (BLO_has_bfile_extension(filename)) { + /* Just pretend a file was loaded, so the user can press Save and it'll + * save at the filename from the CLI. */ + BLI_strncpy(G_MAIN->name, filename, FILE_MAX); + G.relbase_valid = true; + G.save_over = true; + printf("... opened default scene instead; saving will write to: %s\n", filename); + } + else { + printf( + "Error: argument has no '.blend' file extension, not using as new file, exiting! %s\n", + filename); + G.is_break = true; + WM_exit(C); + } + } + + G.file_loaded = 1; + + return 0; } - void main_args_setup(bContext *C, bArgs *ba) { -#define CB(a) a##_doc, a -#define CB_EX(a, b) a##_doc_##b, a - - //BLI_argsAdd(ba, pass, short_arg, long_arg, doc, cb, C); - - /* end argument processing after -- */ - BLI_argsAdd(ba, -1, "--", NULL, CB(arg_handle_arguments_end), NULL); - - /* first pass: background mode, disable python and commands that exit after usage */ - BLI_argsAdd(ba, 1, "-h", "--help", CB(arg_handle_print_help), ba); - /* Windows only */ - BLI_argsAdd(ba, 1, "/?", NULL, CB_EX(arg_handle_print_help, win32), ba); - - BLI_argsAdd(ba, 1, "-v", "--version", CB(arg_handle_print_version), NULL); - - BLI_argsAdd(ba, 1, "-y", "--enable-autoexec", CB_EX(arg_handle_python_set, enable), (void *)true); - BLI_argsAdd(ba, 1, "-Y", "--disable-autoexec", CB_EX(arg_handle_python_set, disable), (void *)false); - - BLI_argsAdd(ba, 1, NULL, "--disable-crash-handler", CB(arg_handle_crash_handler_disable), NULL); - BLI_argsAdd(ba, 1, NULL, "--disable-abort-handler", CB(arg_handle_abort_handler_disable), NULL); - - BLI_argsAdd(ba, 1, "-b", "--background", CB(arg_handle_background_mode_set), NULL); - - BLI_argsAdd(ba, 1, "-a", NULL, CB(arg_handle_playback_mode), NULL); - - BLI_argsAdd(ba, 1, NULL, "--log", CB(arg_handle_log_set), ba); - BLI_argsAdd(ba, 1, NULL, "--log-level", CB(arg_handle_log_level_set), ba); - BLI_argsAdd(ba, 1, NULL, "--log-show-basename", CB(arg_handle_log_show_basename_set), ba); - BLI_argsAdd(ba, 1, NULL, "--log-show-backtrace", CB(arg_handle_log_show_backtrace_set), ba); - BLI_argsAdd(ba, 1, NULL, "--log-show-timestamp", CB(arg_handle_log_show_timestamp_set), ba); - BLI_argsAdd(ba, 1, NULL, "--log-file", CB(arg_handle_log_file_set), ba); - - BLI_argsAdd(ba, 1, "-d", "--debug", CB(arg_handle_debug_mode_set), ba); - -#ifdef WITH_FFMPEG - BLI_argsAdd(ba, 1, NULL, "--debug-ffmpeg", - CB_EX(arg_handle_debug_mode_generic_set, ffmpeg), (void *)G_DEBUG_FFMPEG); -#endif - -#ifdef WITH_FREESTYLE - BLI_argsAdd(ba, 1, NULL, "--debug-freestyle", - CB_EX(arg_handle_debug_mode_generic_set, freestyle), (void *)G_DEBUG_FREESTYLE); -#endif - - BLI_argsAdd(ba, 1, NULL, "--debug-python", - CB_EX(arg_handle_debug_mode_generic_set, python), (void *)G_DEBUG_PYTHON); - BLI_argsAdd(ba, 1, NULL, "--debug-events", - CB_EX(arg_handle_debug_mode_generic_set, events), (void *)G_DEBUG_EVENTS); - BLI_argsAdd(ba, 1, NULL, "--debug-handlers", - CB_EX(arg_handle_debug_mode_generic_set, handlers), (void *)G_DEBUG_HANDLERS); - BLI_argsAdd(ba, 1, NULL, "--debug-wm", - CB_EX(arg_handle_debug_mode_generic_set, wm), (void *)G_DEBUG_WM); - BLI_argsAdd(ba, 1, NULL, "--debug-all", CB(arg_handle_debug_mode_all), NULL); - - BLI_argsAdd(ba, 1, NULL, "--debug-io", CB(arg_handle_debug_mode_io), NULL); - - BLI_argsAdd(ba, 1, NULL, "--debug-fpe", - CB(arg_handle_debug_fpe_set), NULL); - -#ifdef WITH_LIBMV - BLI_argsAdd(ba, 1, NULL, "--debug-libmv", CB(arg_handle_debug_mode_libmv), NULL); -#endif -#ifdef WITH_CYCLES_LOGGING - BLI_argsAdd(ba, 1, NULL, "--debug-cycles", CB(arg_handle_debug_mode_cycles), NULL); -#endif - BLI_argsAdd(ba, 1, NULL, "--debug-memory", CB(arg_handle_debug_mode_memory_set), NULL); - - BLI_argsAdd(ba, 1, NULL, "--debug-value", - CB(arg_handle_debug_value_set), NULL); - BLI_argsAdd(ba, 1, NULL, "--debug-jobs", - CB_EX(arg_handle_debug_mode_generic_set, jobs), (void *)G_DEBUG_JOBS); - BLI_argsAdd(ba, 1, NULL, "--debug-gpu", - CB_EX(arg_handle_debug_mode_generic_set, gpu), (void *)G_DEBUG_GPU); - BLI_argsAdd(ba, 1, NULL, "--debug-depsgraph", - CB_EX(arg_handle_debug_mode_generic_set, depsgraph), (void *)G_DEBUG_DEPSGRAPH); - BLI_argsAdd(ba, 1, NULL, "--debug-depsgraph-build", - CB_EX(arg_handle_debug_mode_generic_set, depsgraph_build), (void *)G_DEBUG_DEPSGRAPH_BUILD); - BLI_argsAdd(ba, 1, NULL, "--debug-depsgraph-eval", - CB_EX(arg_handle_debug_mode_generic_set, depsgraph_eval), (void *)G_DEBUG_DEPSGRAPH_EVAL); - BLI_argsAdd(ba, 1, NULL, "--debug-depsgraph-tag", - CB_EX(arg_handle_debug_mode_generic_set, depsgraph_tag), (void *)G_DEBUG_DEPSGRAPH_TAG); - BLI_argsAdd(ba, 1, NULL, "--debug-depsgraph-time", - CB_EX(arg_handle_debug_mode_generic_set, depsgraph_time), (void *)G_DEBUG_DEPSGRAPH_TIME); - BLI_argsAdd(ba, 1, NULL, "--debug-depsgraph-no-threads", - CB_EX(arg_handle_debug_mode_generic_set, depsgraph_no_threads), (void *)G_DEBUG_DEPSGRAPH_NO_THREADS); - BLI_argsAdd(ba, 1, NULL, "--debug-depsgraph-pretty", - CB_EX(arg_handle_debug_mode_generic_set, depsgraph_pretty), (void *)G_DEBUG_DEPSGRAPH_PRETTY); - BLI_argsAdd(ba, 1, NULL, "--debug-gpumem", - CB_EX(arg_handle_debug_mode_generic_set, gpumem), (void *)G_DEBUG_GPU_MEM); - BLI_argsAdd(ba, 1, NULL, "--debug-gpu-shaders", - CB_EX(arg_handle_debug_mode_generic_set, gpumem), (void *)G_DEBUG_GPU_SHADERS); - BLI_argsAdd(ba, 1, NULL, "--debug-gpu-force-workarounds", - CB_EX(arg_handle_debug_mode_generic_set, gpumem), (void *)G_DEBUG_GPU_FORCE_WORKAROUNDS); - - BLI_argsAdd(ba, 1, NULL, "--verbose", CB(arg_handle_verbosity_set), NULL); - - BLI_argsAdd(ba, 1, NULL, "--app-template", CB(arg_handle_app_template), NULL); - BLI_argsAdd(ba, 1, NULL, "--factory-startup", CB(arg_handle_factory_startup_set), NULL); - BLI_argsAdd(ba, 1, NULL, "--enable-static-override", CB(arg_handle_enable_static_override), NULL); - BLI_argsAdd(ba, 1, NULL, "--enable-event-simulate", CB(arg_handle_enable_event_simulate), NULL); - - /* TODO, add user env vars? */ - BLI_argsAdd(ba, 1, NULL, "--env-system-datafiles", CB_EX(arg_handle_env_system_set, datafiles), NULL); - BLI_argsAdd(ba, 1, NULL, "--env-system-scripts", CB_EX(arg_handle_env_system_set, scripts), NULL); - BLI_argsAdd(ba, 1, NULL, "--env-system-python", CB_EX(arg_handle_env_system_set, python), NULL); - - /* second pass: custom window stuff */ - BLI_argsAdd(ba, 2, "-p", "--window-geometry", CB(arg_handle_window_geometry), NULL); - BLI_argsAdd(ba, 2, "-w", "--window-border", CB(arg_handle_with_borders), NULL); - BLI_argsAdd(ba, 2, "-W", "--window-fullscreen", CB(arg_handle_without_borders), NULL); - BLI_argsAdd(ba, 2, "-M", "--window-maximized", CB(arg_handle_window_maximized), NULL); - BLI_argsAdd(ba, 2, NULL, "--no-window-focus", CB(arg_handle_no_window_focus), NULL); - BLI_argsAdd(ba, 2, "-con", "--start-console", CB(arg_handle_start_with_console), NULL); - BLI_argsAdd(ba, 2, "-R", NULL, CB(arg_handle_register_extension), NULL); - BLI_argsAdd(ba, 2, "-r", NULL, CB_EX(arg_handle_register_extension, silent), ba); - BLI_argsAdd(ba, 2, NULL, "--no-native-pixels", CB(arg_handle_native_pixels_set), ba); - - /* third pass: disabling things and forcing settings */ - BLI_argsAddCase(ba, 3, "-noaudio", 1, NULL, 0, CB(arg_handle_audio_disable), NULL); - BLI_argsAddCase(ba, 3, "-setaudio", 1, NULL, 0, CB(arg_handle_audio_set), NULL); - - /* fourth pass: processing arguments */ - BLI_argsAdd(ba, 4, "-f", "--render-frame", CB(arg_handle_render_frame), C); - BLI_argsAdd(ba, 4, "-a", "--render-anim", CB(arg_handle_render_animation), C); - BLI_argsAdd(ba, 4, "-S", "--scene", CB(arg_handle_scene_set), C); - BLI_argsAdd(ba, 4, "-s", "--frame-start", CB(arg_handle_frame_start_set), C); - BLI_argsAdd(ba, 4, "-e", "--frame-end", CB(arg_handle_frame_end_set), C); - BLI_argsAdd(ba, 4, "-j", "--frame-jump", CB(arg_handle_frame_skip_set), C); - BLI_argsAdd(ba, 4, "-P", "--python", CB(arg_handle_python_file_run), C); - BLI_argsAdd(ba, 4, NULL, "--python-text", CB(arg_handle_python_text_run), C); - BLI_argsAdd(ba, 4, NULL, "--python-expr", CB(arg_handle_python_expr_run), C); - BLI_argsAdd(ba, 4, NULL, "--python-console", CB(arg_handle_python_console_run), C); - BLI_argsAdd(ba, 4, NULL, "--python-exit-code", CB(arg_handle_python_exit_code_set), NULL); - BLI_argsAdd(ba, 4, NULL, "--addons", CB(arg_handle_addons_set), C); - - BLI_argsAdd(ba, 4, "-o", "--render-output", CB(arg_handle_output_set), C); - BLI_argsAdd(ba, 4, "-E", "--engine", CB(arg_handle_engine_set), C); - - BLI_argsAdd(ba, 4, "-F", "--render-format", CB(arg_handle_image_type_set), C); - BLI_argsAdd(ba, 1, "-t", "--threads", CB(arg_handle_threads_set), NULL); - BLI_argsAdd(ba, 4, "-x", "--use-extension", CB(arg_handle_extension_set), C); - -#undef CB -#undef CB_EX - +# define CB(a) a##_doc, a +# define CB_EX(a, b) a##_doc_##b, a + + //BLI_argsAdd(ba, pass, short_arg, long_arg, doc, cb, C); + + /* end argument processing after -- */ + BLI_argsAdd(ba, -1, "--", NULL, CB(arg_handle_arguments_end), NULL); + + /* first pass: background mode, disable python and commands that exit after usage */ + BLI_argsAdd(ba, 1, "-h", "--help", CB(arg_handle_print_help), ba); + /* Windows only */ + BLI_argsAdd(ba, 1, "/?", NULL, CB_EX(arg_handle_print_help, win32), ba); + + BLI_argsAdd(ba, 1, "-v", "--version", CB(arg_handle_print_version), NULL); + + BLI_argsAdd( + ba, 1, "-y", "--enable-autoexec", CB_EX(arg_handle_python_set, enable), (void *)true); + BLI_argsAdd( + ba, 1, "-Y", "--disable-autoexec", CB_EX(arg_handle_python_set, disable), (void *)false); + + BLI_argsAdd(ba, 1, NULL, "--disable-crash-handler", CB(arg_handle_crash_handler_disable), NULL); + BLI_argsAdd(ba, 1, NULL, "--disable-abort-handler", CB(arg_handle_abort_handler_disable), NULL); + + BLI_argsAdd(ba, 1, "-b", "--background", CB(arg_handle_background_mode_set), NULL); + + BLI_argsAdd(ba, 1, "-a", NULL, CB(arg_handle_playback_mode), NULL); + + BLI_argsAdd(ba, 1, NULL, "--log", CB(arg_handle_log_set), ba); + BLI_argsAdd(ba, 1, NULL, "--log-level", CB(arg_handle_log_level_set), ba); + BLI_argsAdd(ba, 1, NULL, "--log-show-basename", CB(arg_handle_log_show_basename_set), ba); + BLI_argsAdd(ba, 1, NULL, "--log-show-backtrace", CB(arg_handle_log_show_backtrace_set), ba); + BLI_argsAdd(ba, 1, NULL, "--log-show-timestamp", CB(arg_handle_log_show_timestamp_set), ba); + BLI_argsAdd(ba, 1, NULL, "--log-file", CB(arg_handle_log_file_set), ba); + + BLI_argsAdd(ba, 1, "-d", "--debug", CB(arg_handle_debug_mode_set), ba); + +# ifdef WITH_FFMPEG + BLI_argsAdd(ba, + 1, + NULL, + "--debug-ffmpeg", + CB_EX(arg_handle_debug_mode_generic_set, ffmpeg), + (void *)G_DEBUG_FFMPEG); +# endif + +# ifdef WITH_FREESTYLE + BLI_argsAdd(ba, + 1, + NULL, + "--debug-freestyle", + CB_EX(arg_handle_debug_mode_generic_set, freestyle), + (void *)G_DEBUG_FREESTYLE); +# endif + + BLI_argsAdd(ba, + 1, + NULL, + "--debug-python", + CB_EX(arg_handle_debug_mode_generic_set, python), + (void *)G_DEBUG_PYTHON); + BLI_argsAdd(ba, + 1, + NULL, + "--debug-events", + CB_EX(arg_handle_debug_mode_generic_set, events), + (void *)G_DEBUG_EVENTS); + BLI_argsAdd(ba, + 1, + NULL, + "--debug-handlers", + CB_EX(arg_handle_debug_mode_generic_set, handlers), + (void *)G_DEBUG_HANDLERS); + BLI_argsAdd( + ba, 1, NULL, "--debug-wm", CB_EX(arg_handle_debug_mode_generic_set, wm), (void *)G_DEBUG_WM); + BLI_argsAdd(ba, 1, NULL, "--debug-all", CB(arg_handle_debug_mode_all), NULL); + + BLI_argsAdd(ba, 1, NULL, "--debug-io", CB(arg_handle_debug_mode_io), NULL); + + BLI_argsAdd(ba, 1, NULL, "--debug-fpe", CB(arg_handle_debug_fpe_set), NULL); + +# ifdef WITH_LIBMV + BLI_argsAdd(ba, 1, NULL, "--debug-libmv", CB(arg_handle_debug_mode_libmv), NULL); +# endif +# ifdef WITH_CYCLES_LOGGING + BLI_argsAdd(ba, 1, NULL, "--debug-cycles", CB(arg_handle_debug_mode_cycles), NULL); +# endif + BLI_argsAdd(ba, 1, NULL, "--debug-memory", CB(arg_handle_debug_mode_memory_set), NULL); + + BLI_argsAdd(ba, 1, NULL, "--debug-value", CB(arg_handle_debug_value_set), NULL); + BLI_argsAdd(ba, + 1, + NULL, + "--debug-jobs", + CB_EX(arg_handle_debug_mode_generic_set, jobs), + (void *)G_DEBUG_JOBS); + BLI_argsAdd(ba, + 1, + NULL, + "--debug-gpu", + CB_EX(arg_handle_debug_mode_generic_set, gpu), + (void *)G_DEBUG_GPU); + BLI_argsAdd(ba, + 1, + NULL, + "--debug-depsgraph", + CB_EX(arg_handle_debug_mode_generic_set, depsgraph), + (void *)G_DEBUG_DEPSGRAPH); + BLI_argsAdd(ba, + 1, + NULL, + "--debug-depsgraph-build", + CB_EX(arg_handle_debug_mode_generic_set, depsgraph_build), + (void *)G_DEBUG_DEPSGRAPH_BUILD); + BLI_argsAdd(ba, + 1, + NULL, + "--debug-depsgraph-eval", + CB_EX(arg_handle_debug_mode_generic_set, depsgraph_eval), + (void *)G_DEBUG_DEPSGRAPH_EVAL); + BLI_argsAdd(ba, + 1, + NULL, + "--debug-depsgraph-tag", + CB_EX(arg_handle_debug_mode_generic_set, depsgraph_tag), + (void *)G_DEBUG_DEPSGRAPH_TAG); + BLI_argsAdd(ba, + 1, + NULL, + "--debug-depsgraph-time", + CB_EX(arg_handle_debug_mode_generic_set, depsgraph_time), + (void *)G_DEBUG_DEPSGRAPH_TIME); + BLI_argsAdd(ba, + 1, + NULL, + "--debug-depsgraph-no-threads", + CB_EX(arg_handle_debug_mode_generic_set, depsgraph_no_threads), + (void *)G_DEBUG_DEPSGRAPH_NO_THREADS); + BLI_argsAdd(ba, + 1, + NULL, + "--debug-depsgraph-pretty", + CB_EX(arg_handle_debug_mode_generic_set, depsgraph_pretty), + (void *)G_DEBUG_DEPSGRAPH_PRETTY); + BLI_argsAdd(ba, + 1, + NULL, + "--debug-gpumem", + CB_EX(arg_handle_debug_mode_generic_set, gpumem), + (void *)G_DEBUG_GPU_MEM); + BLI_argsAdd(ba, + 1, + NULL, + "--debug-gpu-shaders", + CB_EX(arg_handle_debug_mode_generic_set, gpumem), + (void *)G_DEBUG_GPU_SHADERS); + BLI_argsAdd(ba, + 1, + NULL, + "--debug-gpu-force-workarounds", + CB_EX(arg_handle_debug_mode_generic_set, gpumem), + (void *)G_DEBUG_GPU_FORCE_WORKAROUNDS); + + BLI_argsAdd(ba, 1, NULL, "--verbose", CB(arg_handle_verbosity_set), NULL); + + BLI_argsAdd(ba, 1, NULL, "--app-template", CB(arg_handle_app_template), NULL); + BLI_argsAdd(ba, 1, NULL, "--factory-startup", CB(arg_handle_factory_startup_set), NULL); + BLI_argsAdd( + ba, 1, NULL, "--enable-static-override", CB(arg_handle_enable_static_override), NULL); + BLI_argsAdd(ba, 1, NULL, "--enable-event-simulate", CB(arg_handle_enable_event_simulate), NULL); + + /* TODO, add user env vars? */ + BLI_argsAdd( + ba, 1, NULL, "--env-system-datafiles", CB_EX(arg_handle_env_system_set, datafiles), NULL); + BLI_argsAdd( + ba, 1, NULL, "--env-system-scripts", CB_EX(arg_handle_env_system_set, scripts), NULL); + BLI_argsAdd(ba, 1, NULL, "--env-system-python", CB_EX(arg_handle_env_system_set, python), NULL); + + /* second pass: custom window stuff */ + BLI_argsAdd(ba, 2, "-p", "--window-geometry", CB(arg_handle_window_geometry), NULL); + BLI_argsAdd(ba, 2, "-w", "--window-border", CB(arg_handle_with_borders), NULL); + BLI_argsAdd(ba, 2, "-W", "--window-fullscreen", CB(arg_handle_without_borders), NULL); + BLI_argsAdd(ba, 2, "-M", "--window-maximized", CB(arg_handle_window_maximized), NULL); + BLI_argsAdd(ba, 2, NULL, "--no-window-focus", CB(arg_handle_no_window_focus), NULL); + BLI_argsAdd(ba, 2, "-con", "--start-console", CB(arg_handle_start_with_console), NULL); + BLI_argsAdd(ba, 2, "-R", NULL, CB(arg_handle_register_extension), NULL); + BLI_argsAdd(ba, 2, "-r", NULL, CB_EX(arg_handle_register_extension, silent), ba); + BLI_argsAdd(ba, 2, NULL, "--no-native-pixels", CB(arg_handle_native_pixels_set), ba); + + /* third pass: disabling things and forcing settings */ + BLI_argsAddCase(ba, 3, "-noaudio", 1, NULL, 0, CB(arg_handle_audio_disable), NULL); + BLI_argsAddCase(ba, 3, "-setaudio", 1, NULL, 0, CB(arg_handle_audio_set), NULL); + + /* fourth pass: processing arguments */ + BLI_argsAdd(ba, 4, "-f", "--render-frame", CB(arg_handle_render_frame), C); + BLI_argsAdd(ba, 4, "-a", "--render-anim", CB(arg_handle_render_animation), C); + BLI_argsAdd(ba, 4, "-S", "--scene", CB(arg_handle_scene_set), C); + BLI_argsAdd(ba, 4, "-s", "--frame-start", CB(arg_handle_frame_start_set), C); + BLI_argsAdd(ba, 4, "-e", "--frame-end", CB(arg_handle_frame_end_set), C); + BLI_argsAdd(ba, 4, "-j", "--frame-jump", CB(arg_handle_frame_skip_set), C); + BLI_argsAdd(ba, 4, "-P", "--python", CB(arg_handle_python_file_run), C); + BLI_argsAdd(ba, 4, NULL, "--python-text", CB(arg_handle_python_text_run), C); + BLI_argsAdd(ba, 4, NULL, "--python-expr", CB(arg_handle_python_expr_run), C); + BLI_argsAdd(ba, 4, NULL, "--python-console", CB(arg_handle_python_console_run), C); + BLI_argsAdd(ba, 4, NULL, "--python-exit-code", CB(arg_handle_python_exit_code_set), NULL); + BLI_argsAdd(ba, 4, NULL, "--addons", CB(arg_handle_addons_set), C); + + BLI_argsAdd(ba, 4, "-o", "--render-output", CB(arg_handle_output_set), C); + BLI_argsAdd(ba, 4, "-E", "--engine", CB(arg_handle_engine_set), C); + + BLI_argsAdd(ba, 4, "-F", "--render-format", CB(arg_handle_image_type_set), C); + BLI_argsAdd(ba, 1, "-t", "--threads", CB(arg_handle_threads_set), NULL); + BLI_argsAdd(ba, 4, "-x", "--use-extension", CB(arg_handle_extension_set), C); + +# undef CB +# undef CB_EX } /** @@ -2042,7 +2165,7 @@ void main_args_setup(bContext *C, bArgs *ba) */ void main_args_setup_post(bContext *C, bArgs *ba) { - BLI_argsParse(ba, 4, arg_handle_load_file, C); + BLI_argsParse(ba, 4, arg_handle_load_file, C); } /** \} */ diff --git a/source/creator/creator_intern.h b/source/creator/creator_intern.h index c2500c2ac06..959fb71d218 100644 --- a/source/creator/creator_intern.h +++ b/source/creator/creator_intern.h @@ -32,35 +32,33 @@ struct bContext; void main_args_setup(struct bContext *C, struct bArgs *ba); void main_args_setup_post(struct bContext *C, struct bArgs *ba); - /* creator_signals.c */ void main_signal_setup(void); void main_signal_setup_background(void); void main_signal_setup_fpe(void); -#endif /* WITH_PYTHON_MODULE */ - +#endif /* WITH_PYTHON_MODULE */ /* Shared data for argument handlers to store state in */ struct ApplicationState { - struct { - bool use_crash_handler; - bool use_abort_handler; - } signal; - - /* we may want to set different exit codes for other kinds of errors */ - struct { - unsigned char python; - } exit_code_on_error; + struct { + bool use_crash_handler; + bool use_abort_handler; + } signal; + + /* we may want to set different exit codes for other kinds of errors */ + struct { + unsigned char python; + } exit_code_on_error; }; -extern struct ApplicationState app_state; /* creator.c */ +extern struct ApplicationState app_state; /* creator.c */ /* for the callbacks: */ #ifndef WITH_PYTHON_MODULE -#define BLEND_VERSION_FMT "Blender %d.%02d (sub %d)" -#define BLEND_VERSION_ARG BLENDER_VERSION / 100, BLENDER_VERSION % 100, BLENDER_SUBVERSION +# define BLEND_VERSION_FMT "Blender %d.%02d (sub %d)" +# define BLEND_VERSION_ARG BLENDER_VERSION / 100, BLENDER_VERSION % 100, BLENDER_SUBVERSION /* pass directly to printf */ -#define BLEND_VERSION_STRING_FMT BLEND_VERSION_FMT "\n", BLEND_VERSION_ARG +# define BLEND_VERSION_STRING_FMT BLEND_VERSION_FMT "\n", BLEND_VERSION_ARG #endif #ifdef WITH_BUILDINFO_HEADER @@ -69,7 +67,7 @@ extern struct ApplicationState app_state; /* creator.c */ /* from buildinfo.c */ #ifdef BUILD_DATE - extern char build_date[]; +extern char build_date[]; extern char build_time[]; extern char build_hash[]; extern unsigned long build_commit_timestamp; @@ -87,4 +85,4 @@ extern char build_linkflags[]; extern char build_system[]; #endif -#endif /* __CREATOR_INTERN_H__ */ +#endif /* __CREATOR_INTERN_H__ */ diff --git a/source/creator/creator_signals.c b/source/creator/creator_signals.c index a3d3dc4b870..5dae5c5d808 100644 --- a/source/creator/creator_signals.c +++ b/source/creator/creator_signals.c @@ -20,322 +20,328 @@ #ifndef WITH_PYTHON_MODULE -#if defined(__linux__) && defined(__GNUC__) -# define _GNU_SOURCE -# include -#endif - -#if (defined(__APPLE__) && (defined(__i386__) || defined(__x86_64__))) -# define OSX_SSE_FPE -# include -#endif - -#ifdef WIN32 -# if defined(_MSC_VER) && defined(_M_X64) -# include /* needed for _set_FMA3_enable */ +# if defined(__linux__) && defined(__GNUC__) +# define _GNU_SOURCE +# include # endif -# include -# include -#endif -#include -#include -#include +# if (defined(__APPLE__) && (defined(__i386__) || defined(__x86_64__))) +# define OSX_SSE_FPE +# include +# endif + +# ifdef WIN32 +# if defined(_MSC_VER) && defined(_M_X64) +# include /* needed for _set_FMA3_enable */ +# endif +# include +# include +# endif -#include "BLI_sys_types.h" +# include +# include +# include -#ifdef WIN32 -# include "BLI_winstuff.h" -#endif -#include "BLI_utildefines.h" -#include "BLI_string.h" -#include "BLI_path_util.h" -#include "BLI_fileops.h" -#include "BLI_system.h" -#include BLI_SYSTEM_PID_H +# include "BLI_sys_types.h" + +# ifdef WIN32 +# include "BLI_winstuff.h" +# endif +# include "BLI_utildefines.h" +# include "BLI_string.h" +# include "BLI_path_util.h" +# include "BLI_fileops.h" +# include "BLI_system.h" +# include BLI_SYSTEM_PID_H -#include "BKE_appdir.h" /* BKE_tempdir_base */ -#include "BKE_blender_version.h" -#include "BKE_global.h" -#include "BKE_main.h" -#include "BKE_report.h" +# include "BKE_appdir.h" /* BKE_tempdir_base */ +# include "BKE_blender_version.h" +# include "BKE_global.h" +# include "BKE_main.h" +# include "BKE_report.h" -#include +# include -#include "creator_intern.h" /* own include */ +# include "creator_intern.h" /* own include */ // #define USE_WRITE_CRASH_BLEND -#ifdef USE_WRITE_CRASH_BLEND -# include "BKE_undo_system.h" -# include "BLO_undofile.h" -#endif +# ifdef USE_WRITE_CRASH_BLEND +# include "BKE_undo_system.h" +# include "BLO_undofile.h" +# endif /* set breakpoints here when running in debug mode, useful to catch floating point errors */ -#if defined(__linux__) || defined(_WIN32) || defined(OSX_SSE_FPE) +# if defined(__linux__) || defined(_WIN32) || defined(OSX_SSE_FPE) static void sig_handle_fpe(int UNUSED(sig)) { - fprintf(stderr, "debug: SIGFPE trapped\n"); + fprintf(stderr, "debug: SIGFPE trapped\n"); } -#endif +# endif /* handling ctrl-c event in console */ -#if !defined(WITH_HEADLESS) +# 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) { - if (count) { - printf("\nBlender killed\n"); - exit(2); - } - printf("\nSent an internal break event. Press ^C again to kill Blender\n"); - count++; - } + static int count = 0; + + G.is_break = true; /* forces render loop to read queue, not sure if its needed */ + + if (sig == 2) { + if (count) { + printf("\nBlender killed\n"); + exit(2); + } + printf("\nSent an internal break event. Press ^C again to kill Blender\n"); + count++; + } } -#endif +# endif static void sig_handle_crash_backtrace(FILE *fp) { - fputs("\n# backtrace\n", fp); - BLI_system_backtrace(fp); + fputs("\n# backtrace\n", fp); + BLI_system_backtrace(fp); } static void sig_handle_crash(int signum) { - wmWindowManager *wm = G_MAIN->wm.first; - -#ifdef USE_WRITE_CRASH_BLEND - if (wm->undo_stack) { - struct MemFile *memfile = BKE_undosys_stack_memfile_get_active(wm->undo_stack); - if (memfile) { - char fname[FILE_MAX]; - - if (!G_MAIN->name[0]) { - BLI_make_file_string("/", fname, BKE_tempdir_base(), "crash.blend"); - } - else { - BLI_strncpy(fname, G_MAIN->name, sizeof(fname)); - BLI_path_extension_replace(fname, sizeof(fname), ".crash.blend"); - } - - printf("Writing: %s\n", fname); - fflush(stdout); - - BLO_memfile_write_file(memfile, fname); - } - } -#endif - - FILE *fp; - char header[512]; - - char fname[FILE_MAX]; - - if (!G_MAIN->name[0]) { - BLI_join_dirfile(fname, sizeof(fname), BKE_tempdir_base(), "blender.crash.txt"); - } - else { - BLI_join_dirfile(fname, sizeof(fname), BKE_tempdir_base(), BLI_path_basename(G_MAIN->name)); - BLI_path_extension_replace(fname, sizeof(fname), ".crash.txt"); - } - - printf("Writing: %s\n", fname); - fflush(stdout); - -#ifndef BUILD_DATE - BLI_snprintf(header, sizeof(header), "# " BLEND_VERSION_FMT ", Unknown revision\n", BLEND_VERSION_ARG); -#else - BLI_snprintf(header, sizeof(header), "# " BLEND_VERSION_FMT ", Commit date: %s %s, Hash %s\n", - BLEND_VERSION_ARG, build_commit_date, build_commit_time, build_hash); -#endif - - /* open the crash log */ - errno = 0; - fp = BLI_fopen(fname, "wb"); - if (fp == NULL) { - fprintf(stderr, "Unable to save '%s': %s\n", - fname, errno ? strerror(errno) : "Unknown error opening file"); - } - else { - if (wm) { - BKE_report_write_file_fp(fp, &wm->reports, header); - } - - sig_handle_crash_backtrace(fp); - - fclose(fp); - } - - /* Delete content of temp dir! */ - BKE_tempdir_session_purge(); - - /* really crash */ - signal(signum, SIG_DFL); -#ifndef WIN32 - kill(getpid(), signum); -#else - TerminateProcess(GetCurrentProcess(), signum); -#endif + wmWindowManager *wm = G_MAIN->wm.first; + +# ifdef USE_WRITE_CRASH_BLEND + if (wm->undo_stack) { + struct MemFile *memfile = BKE_undosys_stack_memfile_get_active(wm->undo_stack); + if (memfile) { + char fname[FILE_MAX]; + + if (!G_MAIN->name[0]) { + BLI_make_file_string("/", fname, BKE_tempdir_base(), "crash.blend"); + } + else { + BLI_strncpy(fname, G_MAIN->name, sizeof(fname)); + BLI_path_extension_replace(fname, sizeof(fname), ".crash.blend"); + } + + printf("Writing: %s\n", fname); + fflush(stdout); + + BLO_memfile_write_file(memfile, fname); + } + } +# endif + + FILE *fp; + char header[512]; + + char fname[FILE_MAX]; + + if (!G_MAIN->name[0]) { + BLI_join_dirfile(fname, sizeof(fname), BKE_tempdir_base(), "blender.crash.txt"); + } + else { + BLI_join_dirfile(fname, sizeof(fname), BKE_tempdir_base(), BLI_path_basename(G_MAIN->name)); + BLI_path_extension_replace(fname, sizeof(fname), ".crash.txt"); + } + + printf("Writing: %s\n", fname); + fflush(stdout); + +# ifndef BUILD_DATE + BLI_snprintf( + header, sizeof(header), "# " BLEND_VERSION_FMT ", Unknown revision\n", BLEND_VERSION_ARG); +# else + BLI_snprintf(header, + sizeof(header), + "# " BLEND_VERSION_FMT ", Commit date: %s %s, Hash %s\n", + BLEND_VERSION_ARG, + build_commit_date, + build_commit_time, + build_hash); +# endif + + /* open the crash log */ + errno = 0; + fp = BLI_fopen(fname, "wb"); + if (fp == NULL) { + fprintf(stderr, + "Unable to save '%s': %s\n", + fname, + errno ? strerror(errno) : "Unknown error opening file"); + } + else { + if (wm) { + BKE_report_write_file_fp(fp, &wm->reports, header); + } + + sig_handle_crash_backtrace(fp); + + fclose(fp); + } + + /* Delete content of temp dir! */ + BKE_tempdir_session_purge(); + + /* really crash */ + signal(signum, SIG_DFL); +# ifndef WIN32 + kill(getpid(), signum); +# else + TerminateProcess(GetCurrentProcess(), signum); +# endif } -#ifdef WIN32 +# ifdef WIN32 LONG WINAPI windows_exception_handler(EXCEPTION_POINTERS *ExceptionInfo) { - switch (ExceptionInfo->ExceptionRecord->ExceptionCode) { - case EXCEPTION_ACCESS_VIOLATION: - fputs("Error : EXCEPTION_ACCESS_VIOLATION\n", stderr); - break; - case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: - fputs("Error : EXCEPTION_ARRAY_BOUNDS_EXCEEDED\n", stderr); - break; - case EXCEPTION_BREAKPOINT: - fputs("Error : EXCEPTION_BREAKPOINT\n", stderr); - break; - case EXCEPTION_DATATYPE_MISALIGNMENT: - fputs("Error : EXCEPTION_DATATYPE_MISALIGNMENT\n", stderr); - break; - case EXCEPTION_FLT_DENORMAL_OPERAND: - fputs("Error : EXCEPTION_FLT_DENORMAL_OPERAND\n", stderr); - break; - case EXCEPTION_FLT_DIVIDE_BY_ZERO: - fputs("Error : EXCEPTION_FLT_DIVIDE_BY_ZERO\n", stderr); - break; - case EXCEPTION_FLT_INEXACT_RESULT: - fputs("Error : EXCEPTION_FLT_INEXACT_RESULT\n", stderr); - break; - case EXCEPTION_FLT_INVALID_OPERATION: - fputs("Error : EXCEPTION_FLT_INVALID_OPERATION\n", stderr); - break; - case EXCEPTION_FLT_OVERFLOW: - fputs("Error : EXCEPTION_FLT_OVERFLOW\n", stderr); - break; - case EXCEPTION_FLT_STACK_CHECK: - fputs("Error : EXCEPTION_FLT_STACK_CHECK\n", stderr); - break; - case EXCEPTION_FLT_UNDERFLOW: - fputs("Error : EXCEPTION_FLT_UNDERFLOW\n", stderr); - break; - case EXCEPTION_ILLEGAL_INSTRUCTION: - fputs("Error : EXCEPTION_ILLEGAL_INSTRUCTION\n", stderr); - break; - case EXCEPTION_IN_PAGE_ERROR: - fputs("Error : EXCEPTION_IN_PAGE_ERROR\n", stderr); - break; - case EXCEPTION_INT_DIVIDE_BY_ZERO: - fputs("Error : EXCEPTION_INT_DIVIDE_BY_ZERO\n", stderr); - break; - case EXCEPTION_INT_OVERFLOW: - fputs("Error : EXCEPTION_INT_OVERFLOW\n", stderr); - break; - case EXCEPTION_INVALID_DISPOSITION: - fputs("Error : EXCEPTION_INVALID_DISPOSITION\n", stderr); - break; - case EXCEPTION_NONCONTINUABLE_EXCEPTION: - fputs("Error : EXCEPTION_NONCONTINUABLE_EXCEPTION\n", stderr); - break; - case EXCEPTION_PRIV_INSTRUCTION: - fputs("Error : EXCEPTION_PRIV_INSTRUCTION\n", stderr); - break; - case EXCEPTION_SINGLE_STEP: - fputs("Error : EXCEPTION_SINGLE_STEP\n", stderr); - break; - case EXCEPTION_STACK_OVERFLOW: - fputs("Error : EXCEPTION_STACK_OVERFLOW\n", stderr); - break; - default: - fputs("Error : Unrecognized Exception\n", stderr); - break; - } - - fflush(stderr); - - /* If this is a stack overflow then we can't walk the stack, so just show - * where the error happened */ - if (EXCEPTION_STACK_OVERFLOW != ExceptionInfo->ExceptionRecord->ExceptionCode) { - HMODULE mod; - CHAR modulename[MAX_PATH]; - LPVOID address = ExceptionInfo->ExceptionRecord->ExceptionAddress; - - fprintf(stderr, "Address : 0x%p\n", address); - if (GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, address, &mod)) { - if (GetModuleFileName(mod, modulename, MAX_PATH)) { - fprintf(stderr, "Module : %s\n", modulename); - } - } - - fflush(stderr); - -#ifdef NDEBUG - TerminateProcess(GetCurrentProcess(), SIGSEGV); -#else - sig_handle_crash(SIGSEGV); -#endif - } - - return EXCEPTION_EXECUTE_HANDLER; + switch (ExceptionInfo->ExceptionRecord->ExceptionCode) { + case EXCEPTION_ACCESS_VIOLATION: + fputs("Error : EXCEPTION_ACCESS_VIOLATION\n", stderr); + break; + case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: + fputs("Error : EXCEPTION_ARRAY_BOUNDS_EXCEEDED\n", stderr); + break; + case EXCEPTION_BREAKPOINT: + fputs("Error : EXCEPTION_BREAKPOINT\n", stderr); + break; + case EXCEPTION_DATATYPE_MISALIGNMENT: + fputs("Error : EXCEPTION_DATATYPE_MISALIGNMENT\n", stderr); + break; + case EXCEPTION_FLT_DENORMAL_OPERAND: + fputs("Error : EXCEPTION_FLT_DENORMAL_OPERAND\n", stderr); + break; + case EXCEPTION_FLT_DIVIDE_BY_ZERO: + fputs("Error : EXCEPTION_FLT_DIVIDE_BY_ZERO\n", stderr); + break; + case EXCEPTION_FLT_INEXACT_RESULT: + fputs("Error : EXCEPTION_FLT_INEXACT_RESULT\n", stderr); + break; + case EXCEPTION_FLT_INVALID_OPERATION: + fputs("Error : EXCEPTION_FLT_INVALID_OPERATION\n", stderr); + break; + case EXCEPTION_FLT_OVERFLOW: + fputs("Error : EXCEPTION_FLT_OVERFLOW\n", stderr); + break; + case EXCEPTION_FLT_STACK_CHECK: + fputs("Error : EXCEPTION_FLT_STACK_CHECK\n", stderr); + break; + case EXCEPTION_FLT_UNDERFLOW: + fputs("Error : EXCEPTION_FLT_UNDERFLOW\n", stderr); + break; + case EXCEPTION_ILLEGAL_INSTRUCTION: + fputs("Error : EXCEPTION_ILLEGAL_INSTRUCTION\n", stderr); + break; + case EXCEPTION_IN_PAGE_ERROR: + fputs("Error : EXCEPTION_IN_PAGE_ERROR\n", stderr); + break; + case EXCEPTION_INT_DIVIDE_BY_ZERO: + fputs("Error : EXCEPTION_INT_DIVIDE_BY_ZERO\n", stderr); + break; + case EXCEPTION_INT_OVERFLOW: + fputs("Error : EXCEPTION_INT_OVERFLOW\n", stderr); + break; + case EXCEPTION_INVALID_DISPOSITION: + fputs("Error : EXCEPTION_INVALID_DISPOSITION\n", stderr); + break; + case EXCEPTION_NONCONTINUABLE_EXCEPTION: + fputs("Error : EXCEPTION_NONCONTINUABLE_EXCEPTION\n", stderr); + break; + case EXCEPTION_PRIV_INSTRUCTION: + fputs("Error : EXCEPTION_PRIV_INSTRUCTION\n", stderr); + break; + case EXCEPTION_SINGLE_STEP: + fputs("Error : EXCEPTION_SINGLE_STEP\n", stderr); + break; + case EXCEPTION_STACK_OVERFLOW: + fputs("Error : EXCEPTION_STACK_OVERFLOW\n", stderr); + break; + default: + fputs("Error : Unrecognized Exception\n", stderr); + break; + } + + fflush(stderr); + + /* If this is a stack overflow then we can't walk the stack, so just show + * where the error happened */ + if (EXCEPTION_STACK_OVERFLOW != ExceptionInfo->ExceptionRecord->ExceptionCode) { + HMODULE mod; + CHAR modulename[MAX_PATH]; + LPVOID address = ExceptionInfo->ExceptionRecord->ExceptionAddress; + + fprintf(stderr, "Address : 0x%p\n", address); + if (GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, address, &mod)) { + if (GetModuleFileName(mod, modulename, MAX_PATH)) { + fprintf(stderr, "Module : %s\n", modulename); + } + } + + fflush(stderr); + +# ifdef NDEBUG + TerminateProcess(GetCurrentProcess(), SIGSEGV); +# else + sig_handle_crash(SIGSEGV); +# endif + } + + return EXCEPTION_EXECUTE_HANDLER; } -#endif +# endif static void sig_handle_abort(int UNUSED(signum)) { - /* Delete content of temp dir! */ - BKE_tempdir_session_purge(); + /* Delete content of temp dir! */ + BKE_tempdir_session_purge(); } - void main_signal_setup(void) { - if (app_state.signal.use_crash_handler) { -#ifdef WIN32 - SetUnhandledExceptionFilter(windows_exception_handler); -#else - /* after parsing args */ - signal(SIGSEGV, sig_handle_crash); -#endif - } - - if (app_state.signal.use_abort_handler) { - signal(SIGABRT, sig_handle_abort); - } + if (app_state.signal.use_crash_handler) { +# ifdef WIN32 + SetUnhandledExceptionFilter(windows_exception_handler); +# else + /* after parsing args */ + signal(SIGSEGV, sig_handle_crash); +# endif + } + + if (app_state.signal.use_abort_handler) { + signal(SIGABRT, sig_handle_abort); + } } void main_signal_setup_background(void) { - /* for all platforms, even windos has it! */ - BLI_assert(G.background); + /* for all platforms, even windos has it! */ + BLI_assert(G.background); -#if !defined(WITH_HEADLESS) - signal(SIGINT, sig_handle_blender_esc); /* ctrl c out bg render */ -#endif +# if !defined(WITH_HEADLESS) + signal(SIGINT, sig_handle_blender_esc); /* ctrl c out bg render */ +# endif } - void main_signal_setup_fpe(void) { -#if defined(__linux__) || defined(_WIN32) || defined(OSX_SSE_FPE) - /* zealous but makes float issues a heck of a lot easier to find! - * set breakpoints on sig_handle_fpe */ - signal(SIGFPE, sig_handle_fpe); - -# if defined(__linux__) && defined(__GNUC__) - feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW); -# endif /* defined(__linux__) && defined(__GNUC__) */ -# if defined(OSX_SSE_FPE) - /* OSX uses SSE for floating point by default, so here - * use SSE instructions to throw floating point exceptions */ - _MM_SET_EXCEPTION_MASK(_MM_MASK_MASK & ~ - (_MM_MASK_OVERFLOW | _MM_MASK_INVALID | _MM_MASK_DIV_ZERO)); -# endif /* OSX_SSE_FPE */ -# if defined(_WIN32) && defined(_MSC_VER) - /* enables all fp exceptions */ - _controlfp_s(NULL, 0, _MCW_EM); - /* hide the ones we don't care about */ - _controlfp_s(NULL, _EM_DENORMAL | _EM_UNDERFLOW | _EM_INEXACT, _MCW_EM); -# endif /* _WIN32 && _MSC_VER */ -#endif +# if defined(__linux__) || defined(_WIN32) || defined(OSX_SSE_FPE) + /* zealous but makes float issues a heck of a lot easier to find! + * set breakpoints on sig_handle_fpe */ + signal(SIGFPE, sig_handle_fpe); + +# if defined(__linux__) && defined(__GNUC__) + feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW); +# endif /* defined(__linux__) && defined(__GNUC__) */ +# if defined(OSX_SSE_FPE) + /* OSX uses SSE for floating point by default, so here + * use SSE instructions to throw floating point exceptions */ + _MM_SET_EXCEPTION_MASK(_MM_MASK_MASK & + ~(_MM_MASK_OVERFLOW | _MM_MASK_INVALID | _MM_MASK_DIV_ZERO)); +# endif /* OSX_SSE_FPE */ +# if defined(_WIN32) && defined(_MSC_VER) + /* enables all fp exceptions */ + _controlfp_s(NULL, 0, _MCW_EM); + /* hide the ones we don't care about */ + _controlfp_s(NULL, _EM_DENORMAL | _EM_UNDERFLOW | _EM_INEXACT, _MCW_EM); +# endif /* _WIN32 && _MSC_VER */ +# endif } -#endif /* WITH_PYTHON_MODULE */ +#endif /* WITH_PYTHON_MODULE */ -- cgit v1.2.3