Могут ли модули Pascal быть скомпилированы как исполняемые файлы?
Мне нравится, что мои библиотеки дублируются как исполняемые файлы. Желаемое поведение:
$ ./scriptedmain
Main: The meaning of life is: 42
$ ./test
Test: The meaning of life is: 42
Как я могу:
- Получить
scriptedmain.p
скомпилировать вscriptedmain
двоичная? - Предотвращать
test.p
от запуска кода, который находится вscriptedmain.p
"sbegin
/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 ответа
Благодаря Ager и Жирову в списке рассылки 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
Я не знаю, какой вариант Pascal вы используете, но некоторые варианты поддерживают условную компиляцию с {$IFC condition} ... {$ENDC}
, Возможно, вы могли бы использовать это вместе с определением времени компиляции, чтобы включить / исключить код, который вам нужен или не нужен в данной версии.