У меня есть скрипт сборки, который создает собственный исполняемый файл с использованием плагина C. Когда я пытаюсь добавить зависимую задачу (которая создает файл вывода flex из файла ввода flex), я либо получаю сообщение об ошибке, либо моя задача не выполняется. Я думаю, что происходит то, что объявление о добавлении зависимой задачи оценивается до того, как модель создает свои задачи. Если это так, то мне нужно знать, как сделать объявление зависимой задачи более ленивым (или, возможно, добавить что-то к модели, которую я еще не понимаю). Я должен сделать это с отдельным проектом?
Вот что я считаю важной частью сценария сборки. Я прокомментировал мои попытки объявить зависимость.
$ cat build.gradle
apply plugin: 'c'
model {
components {
test(NativeExecutableSpec) {
sources {
c {
source {
srcDir "."
include "*.c"
}
}
}
}
}
}
task compileLang (type: Exec) {
inputs.file(project.file('test.l'))
outputs.file(project.file('lex.test.c'))
commandLine 'flex', '-f', '-L', '-8', '-i', '-P', 'test', 'test.l'
}
//buildDependentsTestExecutable.dependsOn compileLang
//project.task('buildDependentsTestExecutable').dependsOn compileLang
//project.tasks.getByName('buildDependentsTestExecutable').dependsOn compileLang
//tasks['buildDependentsTestExecutable'].dependsOn compileLang
Это, я думаю, релевантные задачи, настроенные при выполнении «заданий gradle»:
Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
clean - Deletes the build directory.
installTestExecutable - Installs a development image of executable 'test:executable'
testExecutable - Assembles executable 'test:executable'.
Build Dependents tasks
----------------------
assembleDependentsTest - Assemble dependents of native executable 'test'.
assembleDependentsTestExecutable - Assemble dependents of executable 'test:executable'.
buildDependentsTest - Build dependents of native executable 'test'.
buildDependentsTestExecutable - Build dependents of executable 'test:executable'.
В случае, если test.c и test.l нужны кому-то, чтобы легче ответить на вопрос ...
$ cat test.c
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char *argv[]) {
puts("hello, world");
testwrap();
}
$ cat test.l
%s OLC
%%
<INITIAL>-- {
BEGIN(OLC);
}
<OLC>\n\r? {
BEGIN(INITIAL);
}
<OLC>. {
}
%%
int yywrap () {
return 1;
}
Я использую Gradle 5.1.1.