Re: [Lazarus] How to find out why a unit is used in a project?

2020-09-24 Thread Sven Barth via lazarus
Bo Berglund via lazarus  schrieb am Do., 24.
Sep. 2020, 15:22:

> On Thu, 24 Sep 2020 14:22:13 +0200, Sven Barth via lazarus
>  wrote:
>
> >Well, Bo could always split the data type declarations into a separate
> >unit.
>
> But I cannot wrap my head around this (constructed example):
>
> interface
>
> type
>  TMyRecord = packed record
>Item1: word;
>Item2: Cardinal;
>   end;
>
>
> TMyController = class
>   private
> FGPIO_driver: TIoDriver;
> FGpF: TIoPort;
> function CheckValidRelay(Relay: byte): boolean;
>   public
> constructor Create;
> destructor Destroy; override;
> procedure ClearRelays;
> function PulseRelay(Relay: byte; PulseTime: LongWord): boolean;
> function RelayOff(Relay: byte): boolean;
> function RelayOn(Relay: byte): boolean;
> function RelayState(Relay: byte): boolean;
> procedure Delay(T: LongWord);
>   end;
>
> implementation
>   ...All of the methods here...
>
> AFAIK the records could be declared elsewhere but the objects not
> since their methods, constructor, destructor etc reside in the same
> file below implementation, right?
>

Would your code require the hypothetical TMyController or only the
TMyRecord? If it only requires the later then you could indeed solve this
by moving the record into a separate unit. If your code requires
TMyController as well, then it can't be left out anyway (though the
compiler will leave out any non-virtual method of that class which isn't
used).


> Just specifying a uses file with everything above the implementation
> will not cut it, right?
>

No, that will not help.

Regards,
Sven
-- 
___
lazarus mailing list
lazarus@lists.lazarus-ide.org
https://lists.lazarus-ide.org/listinfo/lazarus


Re: [Lazarus] How to find out why a unit is used in a project?

2020-09-24 Thread Bo Berglund via lazarus
On Thu, 24 Sep 2020 14:22:13 +0200, Sven Barth via lazarus
 wrote:

>Well, Bo could always split the data type declarations into a separate
>unit.

But I cannot wrap my head around this (constructed example):

interface

type
 TMyRecord = packed record
   Item1: word;
   Item2: Cardinal;
  end;


TMyController = class
  private
FGPIO_driver: TIoDriver;
FGpF: TIoPort;
function CheckValidRelay(Relay: byte): boolean;
  public
constructor Create;
destructor Destroy; override;
procedure ClearRelays;
function PulseRelay(Relay: byte; PulseTime: LongWord): boolean;
function RelayOff(Relay: byte): boolean;
function RelayOn(Relay: byte): boolean;
function RelayState(Relay: byte): boolean;
procedure Delay(T: LongWord);
  end;

implementation
  ...All of the methods here...

AFAIK the records could be declared elsewhere but the objects not
since their methods, constructor, destructor etc reside in the same
file below implementation, right?

Just specifying a uses file with everything above the implementation
will not cut it, right?

But as I indicated I have just moved on and I am leaving this because
it seems to do more harm than good and is a lot of work too.


-- 
Bo Berglund
Developer in Sweden

-- 
___
lazarus mailing list
lazarus@lists.lazarus-ide.org
https://lists.lazarus-ide.org/listinfo/lazarus


Re: [Lazarus] How to find out why a unit is used in a project?

2020-09-24 Thread Sven Barth via lazarus
R.Smith via lazarus  schrieb am Do., 24.
Sep. 2020, 12:19:

>
> On 2020/09/24 11:04, Sven Barth via lazarus wrote:
>
> Bo Berglund via lazarus  schrieb am Do.,
> 24. Sep. 2020, 08:08:
>
>>
>> >If course there is. That's how the unit system is supposed to work after
>> >all.
>> >
>> Yes, I realize that now.
>>
>> It means that the client even though it will not interface to the
>> hardware will have all of the code used to do that included in the
>> app, right?
>>
>
> The compiler (and linker) only includes code that is used. Thus as long as
> you don't call the hardware functions anywhere in your program (this
> includes indirectly or through initialization/finalization sections) then
> the code won't be in the final binary either.
>
> Regards,
> Sven
>
>
> Sven, I believe Bo's problem is that even though he won't need the Code
> (which the linker/compiler will surely cleverly disregard), he also do not
> even wish to "need" the physical Unit files to be in view of the compiler -
> at least not the secondary-dependency units - when he references a unit
> file in which he only needs a few declarations visible.
>

Well, Bo could always split the data type declarations into a separate
unit.

Regards,
Sven
-- 
___
lazarus mailing list
lazarus@lists.lazarus-ide.org
https://lists.lazarus-ide.org/listinfo/lazarus


Re: [Lazarus] How to find out why a unit is used in a project?

2020-09-24 Thread R.Smith via lazarus


On 2020/09/24 11:04, Sven Barth via lazarus wrote:
Bo Berglund via lazarus > schrieb am Do., 24. Sep. 2020, 
08:08:



>If course there is. That's how the unit system is supposed to
work after
>all.
>
Yes, I realize that now.

It means that the client even though it will not interface to the
hardware will have all of the code used to do that included in the
app, right?


The compiler (and linker) only includes code that is used. Thus as 
long as you don't call the hardware functions anywhere in your program 
(this includes indirectly or through initialization/finalization 
sections) then the code won't be in the final binary either.


Regards,
Sven



Sven, I believe Bo's problem is that even though he won't need the Code 
(which the linker/compiler will surely cleverly disregard), he also do 
not even wish to "need" the physical Unit files to be in view of the 
compiler - at least not the secondary-dependency units - when he 
references a unit file in which he only needs a few declarations visible.


Sadly Bo, the entire premise of the Unit system is that every dependency 
will be in view, the compiler cannot decide BEFORE compiling that it 
would or wouldn't need a unit which appears in a "unit" clause lower 
down the dependency tree. Consider that a used unit may well declare a 
global variable that overrides one from a higher-up unit, for instance. 
So even though the program has all the participating symbols at hand 
without looking at this depended unit with the override, it will produce 
a different program (than when that override IS considered) and so 
cannot simply decide to ignore/not require a unit preemptively before 
actually parsing the physical file.


All units you use, pluse every dependent unit they use, must be 
available and visible to the compiler. That rule is absolute.



-- 
___
lazarus mailing list
lazarus@lists.lazarus-ide.org
https://lists.lazarus-ide.org/listinfo/lazarus


Re: [Lazarus] How to find out why a unit is used in a project?

2020-09-24 Thread Sven Barth via lazarus
Bo Berglund via lazarus  schrieb am Do., 24.
Sep. 2020, 08:08:

> On Thu, 24 Sep 2020 07:53:24 +0200, Sven Barth via lazarus
>  wrote:
>
> >Bo Berglund via lazarus  schrieb am Mi.,
> 23.
> >Sep. 2020, 21:13:
> >
> >> So there seems to be a chain reaction concerning units involved in the
> >> application
> >>
> >
> >If course there is. That's how the unit system is supposed to work after
> >all.
> >
> Yes, I realize that now.
>
> It means that the client even though it will not interface to the
> hardware will have all of the code used to do that included in the
> app, right?
>

The compiler (and linker) only includes code that is used. Thus as long as
you don't call the hardware functions anywhere in your program (this
includes indirectly or through initialization/finalization sections) then
the code won't be in the final binary either.

Regards,
Sven
-- 
___
lazarus mailing list
lazarus@lists.lazarus-ide.org
https://lists.lazarus-ide.org/listinfo/lazarus