Могут ли модули Pascal быть скомпилированы как исполняемые файлы? - PullRequest
0 голосов
/ 13 октября 2011

Мне нравится, что мои библиотеки дублируются как исполняемые файлы.Желаемое поведение:

$ ./scriptedmain
Main: The meaning of life is: 42
$ ./test
Test: The meaning of life is: 42

Как я могу:

  • Получить scriptedmain.p для компиляции в scriptedmain двоичный файл?
  • Предотвратить test.pот запуска кода, который находится в scriptedmain.p begin / end разделе?

scriptedmain.p:

unit ScriptedMain;
    interface

    function MeaningOfLife () : integer;

    implementation

    function MeaningOfLife () : integer;
    begin
        MeaningOfLife := 42
    end;
begin
    write('Main: The meaning of life is: ');
    writeln(MeaningOfLife())
end.

Когда я компилирую scriptedmain.p с fpc scriptedmain.p, исполняемый файл не создается, потому что Паскаль обнаруживает, что это юнит.Но я хочу, чтобы это был исполняемый файл в дополнение к библиотеке.

$ ./scriptedmain
-bash: ./scriptedmain: No such file or directory

test.p:

program Test;
uses
    ScriptedMain;
begin
    write('Test: The meaning of life is: ');
    writeln(MeaningOfLife())
end.

Когда я компилирую test.p с fpc test.p, полученный исполняемый файлобъединяет два объявления begin / end (НЕ желаемое поведение).

$ ./test 
Main: The meaning of life is: 42
Test: The meaning of life is: 42

Ответы [ 2 ]

0 голосов
/ 15 октября 2011

Благодаря Ажеру и Жирову в списке рассылки Free Pascal я смог создать работающий сценарий основного примера с минимальным количеством взломов.Также размещено в RosettaCode .

Makefile:

all: scriptedmain

scriptedmain: scriptedmain.pas
    fpc -dscriptedmain scriptedmain.pas

test: test.pas scriptedmain
    fpc test.pas

clean:
    -rm test
    -rm scriptedmain
    -rm *.o
    -rm *.ppu

scriptedmain.pas:

{$IFDEF scriptedmain}
program ScriptedMain;
{$ELSE}
unit ScriptedMain;
interface
function MeaningOfLife () : integer;
implementation
{$ENDIF}
    function MeaningOfLife () : integer;
    begin
        MeaningOfLife := 42
    end;
{$IFDEF scriptedmain}
begin
    write('Main: The meaning of life is: ');
    writeln(MeaningOfLife())
{$ENDIF}
end.

test.pas:

program Test;
uses
    ScriptedMain;
begin
    write('Test: The meaning of life is: ');
    writeln(MeaningOfLife())
end.

Пример:

$ make
$ ./scriptedmain 
Main: The meaning of life is: 42
$ make test
$ ./test 
Test: The meaning of life is: 42
0 голосов
/ 14 октября 2011

Я не знаю, какой вариант Pascal вы используете, но некоторые варианты поддерживают условную компиляцию с {$IFC condition} ... {$ENDC}.Возможно, вы могли бы использовать это вместе с определением времени компиляции, чтобы включить / исключить код, который вам нужен или не нужен в данной версии.

...