0

ライブラリが実行可能ファイルを兼ねるのが好きです。望ましい動作は次のとおりです。

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

どうやって:

  • バイナリscriptedmain.pにコンパイルしscriptedmainますか?
  • 's /セクションにtest.pあるコードを実行しないようにしますか?scriptedmain.pbeginend

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でコンパイルすると、Pascalがユニットであることを検出するため、実行可能ファイルは作成されません。しかし、ライブラリに加えて実行可能ファイルにしたいのです。

$ ./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、結果の実行可能ファイルは2つのbegin/end宣言を結合します(望ましい動作ではありません)。

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

2 に答える 2

0

使用しているPascalのフレーバーはわかりませんが、一部のバリアントは。を使用した条件付きコンパイルをサポートしています{$IFC condition} ... {$ENDC}。これをコンパイル時の定義と組み合わせて使用​​して、特定のバージョンで必要なコードまたは不要なコードを含める/除外することができます。

于 2011-10-13T20:40:54.087 に答える
0

Free PascalメーリングリストのAgerとZhirovのおかげで、最小限のハックで実用的なスクリプト化されたメインの例を作成することができました。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
于 2011-10-14T22:14:19.887 に答える