Skip to content

Commit

Permalink
Add option to force use of NVIDIA GPUs in IDE debug configurations ge…
Browse files Browse the repository at this point in the history
…nerated on UNIX systems
  • Loading branch information
brussig-tud committed Dec 5, 2023
1 parent f4f2d1c commit 3fb582a
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 9 deletions.
10 changes: 9 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
9 changes: 8 additions & 1 deletion tool/cgv_target_creation.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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}")
Expand Down
38 changes: 31 additions & 7 deletions tool/set_plugin_execution_params.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -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\",
Expand All @@ -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\",
Expand All @@ -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\",
Expand All @@ -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}\"")
Expand All @@ -80,37 +91,50 @@ 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 $<TARGET_FILE:cgv_viewer> "${CGVARG__PLUGIN_ARGS}")
set(CMD_ARGS_EXE $<TARGET_FILE:${NAME_EXE}> "${CGVARG__EXE_ARGS}")
else()
set(LAUNCH_PROGRAM_PLUGIN $<TARGET_FILE:cgv_viewer>)
set(LAUNCH_PROGRAM_EXE $<TARGET_FILE:${NAME_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 $<TARGET_FILE:cgv_viewer> 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 $<TARGET_FILE:cgv_viewer> 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
if(NOT CGVARG__NO_EXECUTABLE)
# standard VS Code C++ debugging
format_vscode_launch_json_entry(JSON_LIST_STRING
${NAME_EXE} DEBUGGER_TYPE cppdbg
LAUNCH_PROGRAM $<TARGET_FILE:${NAME_EXE}> 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 $<TARGET_FILE:${NAME_EXE}> CMD_ARGS ${CGVARG__EXE_ARGS}
LAUNCH_PROGRAM ${LAUNCH_PROGRAM_EXE} CMD_ARGS ${CMD_ARGS_EXE}
WORKING_DIR ${CGVARG__WORKING_DIR}
)
endif()
Expand Down

0 comments on commit 3fb582a

Please sign in to comment.