link.c: Add flag __gnat_separate_run_path_options.
2009-04-22 Nicolas Setton <setton@adacore.com> * link.c: Add flag __gnat_separate_run_path_options. * mlib.adb (Separate_Run_Path_Options): New subprogram. * mlib.ads (Separate_Run_Path_Options): Declare. * gnatcmd.adb (Process_Link): Add support for emitting one "rpath" switch per directory, rather than one "rpath" switch listing all directories. * gnatlink.adb (Process_Binder_File): Likewise. * make.adb (Gnatmake): Likewise. From-SVN: r146561
This commit is contained in:
parent
3a69b5ffe6
commit
3b81743f89
@ -1,3 +1,19 @@
|
||||
2009-04-22 Nicolas Setton <setton@adacore.com>
|
||||
|
||||
* link.c: Add flag __gnat_separate_run_path_options.
|
||||
|
||||
* mlib.adb (Separate_Run_Path_Options): New subprogram.
|
||||
|
||||
* mlib.ads (Separate_Run_Path_Options): Declare.
|
||||
|
||||
* gnatcmd.adb (Process_Link): Add support for emitting one "rpath"
|
||||
switch per directory, rather than one "rpath" switch listing all
|
||||
directories.
|
||||
|
||||
* gnatlink.adb (Process_Binder_File): Likewise.
|
||||
|
||||
* make.adb (Gnatmake): Likewise.
|
||||
|
||||
2009-04-22 Hristian Kirtchev <kirtchev@adacore.com>
|
||||
|
||||
* exp_ch6.adb (Make_Build_In_Place_Call_In_Assignment): Code cleanup.
|
||||
|
@ -6,7 +6,7 @@
|
||||
-- --
|
||||
-- B o d y --
|
||||
-- --
|
||||
-- Copyright (C) 1996-2008, Free Software Foundation, Inc. --
|
||||
-- Copyright (C) 1996-2009, Free Software Foundation, Inc. --
|
||||
-- --
|
||||
-- GNAT is free software; you can redistribute it and/or modify it under --
|
||||
-- terms of the GNU General Public License as published by the Free Soft- --
|
||||
@ -976,6 +976,31 @@ procedure GNATCmd is
|
||||
Current : Natural;
|
||||
|
||||
begin
|
||||
if MLib.Separate_Run_Path_Options then
|
||||
|
||||
-- We are going to create one switch of the form
|
||||
-- "-Wl,-rpath,dir_N" for each directory to consider.
|
||||
|
||||
-- One switch for each library directory
|
||||
|
||||
for Index in
|
||||
Library_Paths.First .. Library_Paths.Last
|
||||
loop
|
||||
Last_Switches.Increment_Last;
|
||||
Last_Switches.Table
|
||||
(Last_Switches.Last) := new String'
|
||||
(Path_Option.all &
|
||||
Last_Switches.Table (Index).all);
|
||||
end loop;
|
||||
|
||||
-- One switch for the standard GNAT library dir.
|
||||
|
||||
Last_Switches.Increment_Last;
|
||||
Last_Switches.Table
|
||||
(Last_Switches.Last) := new String'
|
||||
(Path_Option.all & MLib.Utl.Lib_Directory);
|
||||
|
||||
else
|
||||
-- First, compute the exact length for the switch
|
||||
|
||||
for Index in
|
||||
@ -1024,6 +1049,7 @@ procedure GNATCmd is
|
||||
Last_Switches.Increment_Last;
|
||||
Last_Switches.Table (Last_Switches.Last) :=
|
||||
Option;
|
||||
end if;
|
||||
end;
|
||||
end if;
|
||||
end if;
|
||||
|
@ -6,7 +6,7 @@
|
||||
-- --
|
||||
-- B o d y --
|
||||
-- --
|
||||
-- Copyright (C) 1996-2008, Free Software Foundation, Inc. --
|
||||
-- Copyright (C) 1996-2009, Free Software Foundation, Inc. --
|
||||
-- --
|
||||
-- GNAT is free software; you can redistribute it and/or modify it under --
|
||||
-- terms of the GNU General Public License as published by the Free Soft- --
|
||||
@ -761,6 +761,12 @@ procedure Gnatlink is
|
||||
-- Predicate indicating whether this target uses the GNU linker. In
|
||||
-- this case we must output a GNU linker compatible response file.
|
||||
|
||||
Separate_Run_Path_Options : Boolean;
|
||||
for Separate_Run_Path_Options'Size use Character'Size;
|
||||
pragma Import
|
||||
(C, Separate_Run_Path_Options, "__gnat_separate_run_path_options");
|
||||
-- Whether separate rpath options should be emitted for each directory
|
||||
|
||||
Opening : aliased constant String := """";
|
||||
Closing : aliased constant String := '"' & ASCII.LF;
|
||||
-- Needed to quote object paths in object list files when GNU linker
|
||||
@ -1255,7 +1261,28 @@ procedure Gnatlink is
|
||||
-- Look for an eventual run_path_option in
|
||||
-- the linker switches.
|
||||
|
||||
for J in reverse 1 .. Linker_Options.Last loop
|
||||
if Separate_Run_Path_Options then
|
||||
Linker_Options.Increment_Last;
|
||||
Linker_Options.Table
|
||||
(Linker_Options.Last) :=
|
||||
new String'
|
||||
(Run_Path_Opt
|
||||
& File_Path
|
||||
(1 .. File_Path'Length
|
||||
- File_Name'Length));
|
||||
|
||||
if GCC_Index /= 0 then
|
||||
Linker_Options.Increment_Last;
|
||||
Linker_Options.Table
|
||||
(Linker_Options.Last) :=
|
||||
new String'
|
||||
(Run_Path_Opt
|
||||
& File_Path (1 .. GCC_Index));
|
||||
end if;
|
||||
else
|
||||
for J in reverse
|
||||
1 .. Linker_Options.Last
|
||||
loop
|
||||
if Linker_Options.Table (J) /= null
|
||||
and then
|
||||
Linker_Options.Table (J)'Length
|
||||
@ -1266,9 +1293,10 @@ procedure Gnatlink is
|
||||
Run_Path_Opt
|
||||
then
|
||||
-- We have found a already specified
|
||||
-- run_path_option: we will add to this
|
||||
-- switch, because only one
|
||||
-- run_path_option should be specified.
|
||||
-- run_path_option: we will add to
|
||||
-- this switch, because only one
|
||||
-- run_path_option should be
|
||||
-- specified.
|
||||
|
||||
Run_Path_Opt_Index := J;
|
||||
exit;
|
||||
@ -1331,6 +1359,7 @@ procedure Gnatlink is
|
||||
end if;
|
||||
end if;
|
||||
end if;
|
||||
end if;
|
||||
|
||||
-- Then we add the appropriate -l switch
|
||||
|
||||
|
@ -65,6 +65,9 @@
|
||||
/* using_gnu_linker is set to 1 when the GNU linker is used under this */
|
||||
/* target. */
|
||||
|
||||
/* separate_run_path_options is set to 1 when separate "rpath" arguments */
|
||||
/* must be passed to the linker for each directory in the rpath. */
|
||||
|
||||
/* RESPONSE FILE & GNU LINKER */
|
||||
/* -------------------------- */
|
||||
/* objlist_file_supported and using_gnu_link used together tell gnatlink */
|
||||
@ -88,6 +91,7 @@ unsigned char __gnat_objlist_file_supported = 1;
|
||||
char __gnat_shared_libgnat_default = STATIC;
|
||||
unsigned char __gnat_using_gnu_linker = 0;
|
||||
const char *__gnat_object_library_extension = ".a";
|
||||
unsigned char __gnat_separate_run_path_options = 0;
|
||||
|
||||
#elif defined (sgi)
|
||||
const char *__gnat_object_file_option = "-Wl,-objectlist,";
|
||||
@ -97,6 +101,7 @@ unsigned char __gnat_objlist_file_supported = 1;
|
||||
char __gnat_shared_libgnat_default = STATIC;
|
||||
unsigned char __gnat_using_gnu_linker = 0;
|
||||
const char *__gnat_object_library_extension = ".a";
|
||||
unsigned char __gnat_separate_run_path_options = 0;
|
||||
|
||||
#elif defined (__WIN32)
|
||||
const char *__gnat_object_file_option = "";
|
||||
@ -106,6 +111,7 @@ unsigned char __gnat_objlist_file_supported = 1;
|
||||
char __gnat_shared_libgnat_default = STATIC;
|
||||
unsigned char __gnat_using_gnu_linker = 1;
|
||||
const char *__gnat_object_library_extension = ".a";
|
||||
unsigned char __gnat_separate_run_path_options = 0;
|
||||
|
||||
#elif defined (__hpux__)
|
||||
const char *__gnat_object_file_option = "-Wl,-c,";
|
||||
@ -115,6 +121,7 @@ unsigned char __gnat_objlist_file_supported = 1;
|
||||
char __gnat_shared_libgnat_default = STATIC;
|
||||
unsigned char __gnat_using_gnu_linker = 0;
|
||||
const char *__gnat_object_library_extension = ".a";
|
||||
unsigned char __gnat_separate_run_path_options = 0;
|
||||
|
||||
#elif defined (_AIX)
|
||||
const char *__gnat_object_file_option = "-Wl,-f,";
|
||||
@ -124,6 +131,7 @@ const unsigned char __gnat_objlist_file_supported = 1;
|
||||
char __gnat_shared_libgnat_default = STATIC;
|
||||
unsigned char __gnat_using_gnu_linker = 0;
|
||||
const char *__gnat_object_library_extension = ".a";
|
||||
unsigned char __gnat_separate_run_path_options = 0;
|
||||
|
||||
#elif defined (VMS)
|
||||
const char *__gnat_object_file_option = "";
|
||||
@ -133,6 +141,7 @@ int __gnat_link_max = 2147483647;
|
||||
unsigned char __gnat_objlist_file_supported = 0;
|
||||
unsigned char __gnat_using_gnu_linker = 0;
|
||||
const char *__gnat_object_library_extension = ".olb";
|
||||
unsigned char __gnat_separate_run_path_options = 0;
|
||||
|
||||
#elif defined (sun)
|
||||
const char *__gnat_object_file_option = "";
|
||||
@ -142,6 +151,7 @@ int __gnat_link_max = 2147483647;
|
||||
unsigned char __gnat_objlist_file_supported = 0;
|
||||
unsigned char __gnat_using_gnu_linker = 0;
|
||||
const char *__gnat_object_library_extension = ".a";
|
||||
unsigned char __gnat_separate_run_path_options = 0;
|
||||
|
||||
#elif defined (__FreeBSD__)
|
||||
const char *__gnat_object_file_option = "";
|
||||
@ -151,6 +161,7 @@ int __gnat_link_max = 8192;
|
||||
unsigned char __gnat_objlist_file_supported = 1;
|
||||
unsigned char __gnat_using_gnu_linker = 1;
|
||||
const char *__gnat_object_library_extension = ".a";
|
||||
unsigned char __gnat_separate_run_path_options = 0;
|
||||
|
||||
#elif defined (__APPLE__)
|
||||
const char *__gnat_object_file_option = "-Wl,-filelist,";
|
||||
@ -160,6 +171,7 @@ int __gnat_link_max = 262144;
|
||||
unsigned char __gnat_objlist_file_supported = 1;
|
||||
unsigned char __gnat_using_gnu_linker = 0;
|
||||
const char *__gnat_object_library_extension = ".a";
|
||||
unsigned char __gnat_separate_run_path_options = 1;
|
||||
|
||||
#elif defined (linux) || defined(__GLIBC__)
|
||||
const char *__gnat_object_file_option = "";
|
||||
@ -169,6 +181,7 @@ int __gnat_link_max = 8192;
|
||||
unsigned char __gnat_objlist_file_supported = 1;
|
||||
unsigned char __gnat_using_gnu_linker = 1;
|
||||
const char *__gnat_object_library_extension = ".a";
|
||||
unsigned char __gnat_separate_run_path_options = 0;
|
||||
|
||||
#elif defined (__svr4__) && defined (i386)
|
||||
const char *__gnat_object_file_option = "";
|
||||
@ -178,6 +191,7 @@ int __gnat_link_max = 2147483647;
|
||||
unsigned char __gnat_objlist_file_supported = 0;
|
||||
unsigned char __gnat_using_gnu_linker = 0;
|
||||
const char *__gnat_object_library_extension = ".a";
|
||||
unsigned char __gnat_separate_run_path_options = 0;
|
||||
|
||||
#else
|
||||
|
||||
@ -190,4 +204,5 @@ int __gnat_link_max = 2147483647;
|
||||
unsigned char __gnat_objlist_file_supported = 0;
|
||||
unsigned char __gnat_using_gnu_linker = 0;
|
||||
const char *__gnat_object_library_extension = ".a";
|
||||
unsigned char __gnat_separate_run_path_options = 0;
|
||||
#endif
|
||||
|
@ -36,6 +36,7 @@ with Gnatvsn; use Gnatvsn;
|
||||
with Hostparm; use Hostparm;
|
||||
with Makeusg;
|
||||
with Makeutl; use Makeutl;
|
||||
with MLib;
|
||||
with MLib.Prj;
|
||||
with MLib.Tgt; use MLib.Tgt;
|
||||
with MLib.Utl;
|
||||
@ -6361,6 +6362,35 @@ package body Make is
|
||||
Current : Natural;
|
||||
|
||||
begin
|
||||
if MLib.Separate_Run_Path_Options then
|
||||
|
||||
-- We are going to create one switch of the form
|
||||
-- "-Wl,-rpath,dir_N" for each directory to
|
||||
-- consider.
|
||||
|
||||
-- One switch for each library directory
|
||||
|
||||
for Index in
|
||||
Library_Paths.First .. Library_Paths.Last
|
||||
loop
|
||||
Linker_Switches.Increment_Last;
|
||||
Linker_Switches.Table
|
||||
(Linker_Switches.Last) := new String'
|
||||
(Path_Option.all &
|
||||
Library_Paths.Table (Index).all);
|
||||
end loop;
|
||||
|
||||
-- One switch for the standard GNAT library dir.
|
||||
|
||||
Linker_Switches.Increment_Last;
|
||||
Linker_Switches.Table
|
||||
(Linker_Switches.Last) := new String'
|
||||
(Path_Option.all & MLib.Utl.Lib_Directory);
|
||||
|
||||
else
|
||||
-- We are going to create one switch of the form
|
||||
-- "-Wl,-rpath,dir_1:dir_2:dir_3"
|
||||
|
||||
for Index in
|
||||
Library_Paths.First .. Library_Paths.Last
|
||||
loop
|
||||
@ -6377,10 +6407,12 @@ package body Make is
|
||||
|
||||
Length := Length + MLib.Utl.Lib_Directory'Length;
|
||||
Option := new String (1 .. Length);
|
||||
Option (1 .. Path_Option'Length) := Path_Option.all;
|
||||
Option (1 .. Path_Option'Length) :=
|
||||
Path_Option.all;
|
||||
Current := Path_Option'Length;
|
||||
|
||||
-- Put each library dir followed by a dir separator
|
||||
-- Put each library dir followed by a dir
|
||||
-- separator.
|
||||
|
||||
for Index in
|
||||
Library_Paths.First .. Library_Paths.Last
|
||||
@ -6408,6 +6440,7 @@ package body Make is
|
||||
Linker_Switches.Increment_Last;
|
||||
Linker_Switches.Table (Linker_Switches.Last) :=
|
||||
Option;
|
||||
end if;
|
||||
end;
|
||||
end if;
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
-- --
|
||||
-- B o d y --
|
||||
-- --
|
||||
-- Copyright (C) 1999-2008, AdaCore --
|
||||
-- Copyright (C) 1999-2009, AdaCore --
|
||||
-- --
|
||||
-- GNAT is free software; you can redistribute it and/or modify it under --
|
||||
-- terms of the GNU General Public License as published by the Free Soft- --
|
||||
@ -442,6 +442,19 @@ package body MLib is
|
||||
end if;
|
||||
end Major_Id_Name;
|
||||
|
||||
-------------------------------
|
||||
-- Separate_Run_Path_Options --
|
||||
-------------------------------
|
||||
|
||||
function Separate_Run_Path_Options return Boolean is
|
||||
Separate_Paths : Boolean;
|
||||
for Separate_Paths'Size use Character'Size;
|
||||
pragma Import (C, Separate_Paths, "__gnat_separate_run_path_options");
|
||||
|
||||
begin
|
||||
return Separate_Paths;
|
||||
end Separate_Run_Path_Options;
|
||||
|
||||
-- Package elaboration
|
||||
|
||||
begin
|
||||
|
@ -6,7 +6,7 @@
|
||||
-- --
|
||||
-- S p e c --
|
||||
-- --
|
||||
-- Copyright (C) 1999-2008, AdaCore --
|
||||
-- Copyright (C) 1999-2009, AdaCore --
|
||||
-- --
|
||||
-- GNAT is free software; you can redistribute it and/or modify it under --
|
||||
-- terms of the GNU General Public License as published by the Free Soft- --
|
||||
@ -84,6 +84,10 @@ package MLib is
|
||||
-- For example, if Lib_Filename is "libtoto.so" and Lib_Version is
|
||||
-- "libtoto.so.1.2", then "libtoto.so.1" is returned.
|
||||
|
||||
function Separate_Run_Path_Options return Boolean;
|
||||
-- Return True if separate rpath arguments must be passed to the linker
|
||||
-- for each directory in the rpath.
|
||||
|
||||
private
|
||||
|
||||
Preserve : Attribute := Time_Stamps;
|
||||
|
Loading…
Reference in New Issue
Block a user