}
gdb_test "python print (gdb.parameter ('directories'))" $directories
+# Check we can correctly read the data-directory parameter. First,
+# grab the value as read directly from the GDB CLI.
+set dd ""
+gdb_test_multiple "show data-directory" \
+ "find the initial data-directory value" {
+ -re -wrap "GDB's data directory is \"(\[^\r\n\]+)\"\\." {
+ set dd $expect_out(1,string)
+ pass $gdb_test_name
+ }
+ }
+
+# Now print the data-directory from Python.
+gdb_test "python print (gdb.parameter ('data-directory'))" $dd
+
+# Next change the data-directory to a relative path. Internally GDB
+# will resolve this to an absolute path, which Python should then see.
+#
+# GDB is currently running in '...../build/gdb/testsuite/' and the
+# test output is being written to:
+# ...../build/gdb/testsuite/outputs/gdb.python/py-parameter/
+#
+# So create the relative path './outputs/gdb.python/py-parameter/' and
+# set the data-directory to that, we should then see the absolute path.
+
+set abs_path_to_output_dir [standard_output_file ""]
+set abs_path_to_cwd $objdir
+set rel_path_to_output_dir \
+ [file join "." [string replace ${abs_path_to_output_dir} 0 \
+ [string length ${abs_path_to_cwd}] ""]]
+gdb_test_no_output "set data-directory ${rel_path_to_output_dir}"
+
+gdb_test "python print (gdb.parameter ('data-directory'))" \
+ ${abs_path_to_output_dir} \
+ "python sees absolute version of data-directory path"
+
+# While we're here, check we see the correct path at GDB's CLI.
+gdb_test "show data-directory" \
+ "GDB's data directory is \"${abs_path_to_output_dir}\"\\." \
+ "check modified data-directory at the CLI"
+
+# Now lets set the data-directory back to what it was initially.
+gdb_test_no_output "set data-directory ${dd}"
+
+# And check we see the restored value at CLI and from Python.
+gdb_test "show data-directory" \
+ "GDB's data directory is \"${dd}\"\\." \
+ "check original data-directory was restored at the CLI"
+
+gdb_test "python print (gdb.parameter ('data-directory'))" ${dd} \
+ "python sees restored data-directory value"
+
# Test a simple boolean parameter.
with_test_prefix "boolean parameter" {
gdb_test_multiline "Simple gdb booleanparameter" \
value);
}
-/* New values of the "data-directory" parameter are staged here. */
+/* New values of the "data-directory" parameter are staged here.
+ Extension languages, for example Python's gdb.parameter API, will read
+ the value directory from this variable, so we must ensure that this
+ always contains the correct value. */
static char *staged_gdb_datadir;
/* "set" command for the gdb_datadir configuration variable. */
set_gdb_datadir (const char *args, int from_tty, struct cmd_list_element *c)
{
set_gdb_data_directory (staged_gdb_datadir);
+
+ /* SET_GDB_DATA_DIRECTORY will resolve relative paths in
+ STAGED_GDB_DATADIR, so we now copy the value from GDB_DATADIR
+ back into STAGED_GDB_DATADIR so the extension languages can read the
+ correct value. */
+ free (staged_gdb_datadir);
+ staged_gdb_datadir = strdup (gdb_datadir.c_str ());
+
gdb::observers::gdb_datadir_changed.notify ();
}
When set, GDB uses the specified path to search for data files."),
set_gdb_datadir, show_gdb_datadir,
&setlist,
- &showlist);
+ &showlist);
+ /* Prime the initial value for data-directory. */
+ staged_gdb_datadir = strdup (gdb_datadir.c_str ());
add_setshow_auto_boolean_cmd ("interactive-mode", class_support,
&interactive_mode, _("\