diff --git a/CMakeLists.txt b/CMakeLists.txt index a87675b35..e05a55fe5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -66,11 +66,19 @@ else() set(CGV_LTO_ON_RELEASE OFF CACHE INTERNAL "" FORCE) endif() if (NOT CMAKE_SOURCE_DIR STREQUAL CGV_DIR) - option(CGV_EXCLUDE_UNUSED_TARGETS "When the CGV Framework is used as a dependency from an external project, this option will exclude all CGV targets not needed by the external project form the \"build all\" operation" ON) + option(CGV_EXCLUDE_UNUSED_TARGETS + "When the CGV Framework is used as a dependency from an external project, this option will exclude all CGV targets not needed by the external project form the \"build all\" operation" + ON + ) else() # this option makes no sense when stand-alone building the CGV Framework directly set(CGV_EXCLUDE_UNUSED_TARGETS OFF CACHE INTERNAL "" FORCE) endif() +if (UNIX) + option(CGV_DEBUG_ON_NVIDIA_GPU + "Adds environment variables to IDE debug configs that should cause the viewer application to run on an NVIDIA GPU if present." OFF + ) +endif() # customize build directory # - customize executable/DLL/SO and link library locations diff --git a/tool/cgv_target_creation.cmake b/tool/cgv_target_creation.cmake index 997fa1991..e8994d107 100644 --- a/tool/cgv_target_creation.cmake +++ b/tool/cgv_target_creation.cmake @@ -312,9 +312,11 @@ function(cgv_do_deferred_ops TARGET_NAME CONFIGURING_CGV) if (NO_EXECUTABLE) set(NO_EXE_FLAG "NO_EXECUTABLE") endif() + cgv_query_property(INVOCATION_PROXY ${TARGET_NAME} CGVPROP_INVOCATION_PROXY) concat_vscode_launch_json_content( VSCODE_TARGET_LAUNCH_JSON_CONFIGS ${TARGET_NAME} ${NO_EXE_FLAG} WORKING_DIR ${WORKING_DIR} PLUGIN_ARGS ${AUTOGEN_CMD_LINE_ARGS};${ADDITIONAL_ARGS} EXE_ARGS ${ADDITIONAL_ARGS} + INVOCATION_PROXY ${INVOCATION_PROXY} ) if (NOT VSCODE_LAUNCH_JSON_CONFIG_LIST OR VSCODE_LAUNCH_JSON_CONFIG_LIST STREQUAL "") set(VSCODE_LAUNCH_JSON_CONFIG_LIST "${VSCODE_TARGET_LAUNCH_JSON_CONFIGS}" PARENT_SCOPE) @@ -432,7 +434,7 @@ function(cgv_add_target NAME) cmake_parse_arguments( PARSE_ARGV 1 CGVARG_ "NO_EXECUTABLE" "TYPE;OVERRIDE_SHARED_EXPORT_DEFINE;OVERRIDE_FORCE_STATIC_DEFINE;WORKING_DIR" - "SOURCES;PPP_SOURCES;HEADERS;RESOURCES;AUDIO_RESOURCES;SHADER_SOURCES;ADDITIONAL_PRIVATE_DEFINES;ADDITIONAL_PUBLIC_DEFINES;DEPENDENCIES;LINKTIME_PLUGIN_DEPENDENCIES;ADDITIONAL_INCLUDE_PATHS;ADDITIONAL_LINKER_PATHS;ADDITIONAL_CMDLINE_ARGS" + "SOURCES;PPP_SOURCES;HEADERS;RESOURCES;AUDIO_RESOURCES;SHADER_SOURCES;ADDITIONAL_PRIVATE_DEFINES;ADDITIONAL_PUBLIC_DEFINES;DEPENDENCIES;LINKTIME_PLUGIN_DEPENDENCIES;ADDITIONAL_INCLUDE_PATHS;ADDITIONAL_LINKER_PATHS;ADDITIONAL_CMDLINE_ARGS;INVOCATION_PROXY" ) # prelude @@ -667,6 +669,11 @@ function(cgv_add_target NAME) set_target_properties(${NAME} PROPERTIES CGVPROP_ADDITIONAL_CMDLINE_ARGS "${CGVARG__ADDITIONAL_CMDLINE_ARGS}") endif() + # commit invocation proxy program/script if requested + if (IS_PLUGIN AND CGVARG__INVOCATION_PROXY) + set_target_properties(${NAME} PROPERTIES CGVPROP_INVOCATION_PROXY "${CGVARG__INVOCATION_PROXY}") + endif() + # commit custom run/debug working directory if requested if (IS_PLUGIN AND CGVARG__WORKING_DIR) set_target_properties(${NAME} PROPERTIES CGVPROP_WORKING_DIR "${CGVARG__WORKING_DIR}") diff --git a/tool/set_plugin_execution_params.cmake b/tool/set_plugin_execution_params.cmake index 61a28c40e..6ff470a70 100644 --- a/tool/set_plugin_execution_params.cmake +++ b/tool/set_plugin_execution_params.cmake @@ -32,6 +32,13 @@ function(format_vscode_launch_json_entry CONTENT_VAR TARGET_NAME) endif() # - generate entry content if (CGVARG__DEBUGGER_TYPE STREQUAL "cppdbg") + set(ADDITIONAL_ENV_VARS "") + if(CGV_DEBUG_ON_NVIDIA_GPU) + set(ADDITIONAL_ENV_VARS ", + { \"name\": \"__NV_PRIME_RENDER_OFFLOAD\", \"value\": \"1\" }, + { \"name\": \"__GLX_VENDOR_LIBRARY_NAME\", \"value\": \"nvidia\" }" + ) + endif() set(CONTENT_LOCAL "${CONTENT_LOCAL} { \"name\": \"Debug '${TARGET_NAME}' (cppdbg)\", \"type\": \"cppdbg\", @@ -42,7 +49,7 @@ function(format_vscode_launch_json_entry CONTENT_VAR TARGET_NAME) \"cwd\": \"${CGVARG__WORKING_DIR}\", \"environment\": [ { \"name\": \"CGV_DIR\", \"value\": \"${CGV_DIR}\" }, - { \"name\": \"CGV_OPTIONS\", \"value\": \"${CGV_OPTIONS}\" } + { \"name\": \"CGV_OPTIONS\", \"value\": \"${CGV_OPTIONS}\" }${ADDITIONAL_ENV_VARS} ], \"externalConsole\": false, \"MIMode\": \"gdb\", @@ -60,6 +67,10 @@ function(format_vscode_launch_json_entry CONTENT_VAR TARGET_NAME) ] }") elseif (CGVARG__DEBUGGER_TYPE STREQUAL "CodeLLDB") + set(ADDITIONAL_ENV_VARS "") + if(CGV_DEBUG_ON_NVIDIA_GPU) + set(ADDITIONAL_ENV_VARS ", \"__NV_PRIME_RENDER_OFFLOAD\": \"1\", \"__GLX_VENDOR_LIBRARY_NAME\": \"nvidia\"") + endif() set(CONTENT_LOCAL "${CONTENT_LOCAL} { \"name\": \"Debug '${TARGET_NAME}' (CodeLLDB)\", \"type\": \"lldb\", @@ -68,7 +79,7 @@ function(format_vscode_launch_json_entry CONTENT_VAR TARGET_NAME) format_vscode_launch_json_args(CONTENT_LOCAL ARGUMENT_LIST ${CGVARG__CMD_ARGS}) set(CONTENT_LOCAL "${CONTENT_LOCAL}, \"cwd\": \"${CGVARG__WORKING_DIR}\", - \"env\": { \"CGV_DIR\": \"${CGV_DIR}\", \"CGV_OPTIONS\": \"${CGV_OPTIONS}\" } + \"env\": { \"CGV_DIR\": \"${CGV_DIR}\", \"CGV_OPTIONS\": \"${CGV_OPTIONS}\"${ADDITIONAL_ENV_VARS} } }") else() message(FATAL_ERROR "format_vscode_launch_json_entry(): unknown debugger type \"${CGVARG__DEBUGGER_TYPE}\"") @@ -80,23 +91,36 @@ endfunction() function(concat_vscode_launch_json_content LAUNCH_JSON_CONFIG_VAR TARGET_NAME) cmake_parse_arguments( - PARSE_ARGV 2 CGVARG_ "NO_EXECUTABLE" "WORKING_DIR" "PLUGIN_ARGS;EXE_ARGS" + PARSE_ARGV 2 CGVARG_ "NO_EXECUTABLE" "INVOCATION_PROXY;WORKING_DIR" "PLUGIN_ARGS;EXE_ARGS" ) # determine target names cgv_get_static_or_exe_name(NAME_STATIC NAME_EXE ${TARGET_NAME} TRUE) + # devide what the program to invoke will be + if (CGVARG__INVOCATION_PROXY) + set(LAUNCH_PROGRAM_PLUGIN "${CGVARG__INVOCATION_PROXY}") + set(LAUNCH_PROGRAM_EXE "${CGVARG__INVOCATION_PROXY}") + set(CMD_ARGS_PLUGIN $ "${CGVARG__PLUGIN_ARGS}") + set(CMD_ARGS_EXE $ "${CGVARG__EXE_ARGS}") + else() + set(LAUNCH_PROGRAM_PLUGIN $) + set(LAUNCH_PROGRAM_EXE $) + set(CMD_ARGS_PLUGIN "${CGVARG__PLUGIN_ARGS}") + set(CMD_ARGS_EXE "${CGVARG__EXE_ARGS}") + endif() + # compose JSON list for both plugin and executable variants # - plugin build, standard VS Code C++ debugging format_vscode_launch_json_entry(JSON_LIST_STRING ${TARGET_NAME} DEBUGGER_TYPE cppdbg - LAUNCH_PROGRAM $ CMD_ARGS ${CGVARG__PLUGIN_ARGS} + LAUNCH_PROGRAM ${LAUNCH_PROGRAM_PLUGIN} CMD_ARGS ${CMD_ARGS_PLUGIN} WORKING_DIR ${CGVARG__WORKING_DIR} ) # - plugin build, CodeLLDB debugging format_vscode_launch_json_entry(JSON_LIST_STRING ${TARGET_NAME} DEBUGGER_TYPE CodeLLDB - LAUNCH_PROGRAM $ CMD_ARGS ${CGVARG__PLUGIN_ARGS} + LAUNCH_PROGRAM ${LAUNCH_PROGRAM_PLUGIN} CMD_ARGS ${CMD_ARGS_PLUGIN} WORKING_DIR ${CGVARG__WORKING_DIR} ) # - single executable build if not disabled @@ -104,13 +128,13 @@ function(concat_vscode_launch_json_content LAUNCH_JSON_CONFIG_VAR TARGET_NAME) # standard VS Code C++ debugging format_vscode_launch_json_entry(JSON_LIST_STRING ${NAME_EXE} DEBUGGER_TYPE cppdbg - LAUNCH_PROGRAM $ CMD_ARGS ${CGVARG__EXE_ARGS} + LAUNCH_PROGRAM ${LAUNCH_PROGRAM_EXE} CMD_ARGS ${CMD_ARGS_EXE} WORKING_DIR ${CGVARG__WORKING_DIR} ) # CodeLLDB debugging format_vscode_launch_json_entry(JSON_LIST_STRING ${NAME_EXE} DEBUGGER_TYPE CodeLLDB - LAUNCH_PROGRAM $ CMD_ARGS ${CGVARG__EXE_ARGS} + LAUNCH_PROGRAM ${LAUNCH_PROGRAM_EXE} CMD_ARGS ${CMD_ARGS_EXE} WORKING_DIR ${CGVARG__WORKING_DIR} ) endif()