Почему я получаю сообщение об ошибке при попытке добавить зависимую задачу в задачу, созданную плагином C? - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть скрипт сборки, который создает собственный исполняемый файл с использованием плагина 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.

Ответы [ 2 ]

1 голос
/ 21 апреля 2019

Задание, похоже, создано на более позднем этапе настройки Gradle.

Я предлагаю добавить слушателя в контейнере задач, и он работал для меня на вашем примере:

project.tasks.whenObjectAdded { Task t -> 
    println 'Task added: ' + t.name
    if ('buildDependentsTestExecutable'.equals(t.name)) {
        t.dependsOn compileLang
    }
}

Я не знаком с плагином 'c' или с конфигурацией модели {}, поэтому мое предложение основано на общем знакомстве с Gradle.

0 голосов
/ 18 апреля 2019

Мне не нужно было определять несколько проектов, но мне нужно было определить два сценария сборки.Конечно, есть хрупкость, но, по крайней мере, это работает.

Это build.gradle:

task LC (type: Exec) {
    inputs.file(project.file('test.l'))
    outputs.dir(buildDir)
    outputs.file("$buildDir/lex.test.c")
    commandLine 'flex', '-f', '-L', '-8', '-i', '-P', 'test', '-o', "$buildDir/lex.test.c", 'test.l'
}

task copyC (type: Copy) {
    from "."
    into buildDir
    include "*.c"
}

task build (type: GradleBuild) {
    dependsOn 'LC', 'copyC'
    buildFile = 'compileC.gradle'
    tasks = ['build']
}

И это compileC.gradle:

apply plugin: 'c'

model {
    components {
        test(NativeExecutableSpec) {
            sources {
                c {
                    source {
                        srcDir buildDir
                        include "*.c"
                    }
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...