# This testcase is part of GDB, the GNU debugger.

# Copyright 2022-2025 Free Software Foundation, Inc.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

# Compile a source file using different ways of passing the path to the
# compiler.  Then, verify that we can print a macro defined in that file.

standard_testfile

# If the host is remote, source files are uploaded to the host and compiled
# there, but without the directory structure we expect, making the test
# pointless.  Skip the test in that case.
require {!is_remote host}

# Copy the source file at these locations in the output directory ($out):
#
#   $out/cwd/macro-source-path.c
#   $out/other/macro-source-path.c
#
# Set the current working directory to $out/cwd, so that we can test compiling
# using relative paths.

set out_dir [build_standard_output_file ""]
file mkdir $out_dir/cwd
file mkdir $out_dir/other
file copy -force $srcdir/$subdir/$srcfile $out_dir/cwd
file copy -force $srcdir/$subdir/$srcfile $out_dir/other

# Run one test.
#
# SRC is the path to the source file, to be passed to the compiler as-is.
# NAME is the name of the test.

proc test { src name } {
    with_test_prefix $name {
	set binfile $::out_dir/$name

	if { [gdb_compile $src $binfile executable {debug macros additional_flags=-DONE=1}] != "" } {
	    fail "could not compile"
	    return
	}

	clean_restart
	gdb_load [host_file_normalize $binfile]

	if { ![runto_main] } {
	    return
	}

	# Print the macro that is defined on the command-line.
	gdb_test "print ONE" " = 1"

	# Print the macro that is defined in the main file.
	gdb_test "print TWO" " = 2"
    }
}

# When adding a test here, please consider adding an equivalent case to the test
# of the same name in gdb.dwarf2.

with_cwd "$out_dir/cwd" {
    test $testfile.c filename
    test ./$testfile.c dot-filename
    test ../cwd/$testfile.c dot-dot-filename
    test [file normalize $testfile.c] absolute-cwd
    test ../other/$testfile.c dot-dot-other
    test [file normalize ../other/$testfile.c] absolute-other
}
