LINUX.ORG.RU

cmake - зависимости для сборки инструмента, как?


0

1

В проекте используется свой язык (оправдано). Соответственно, для этого языка в составе того-же проекта есть компилятор, в виде исходников.

Как cmake (@#$%!) объяснить, что сначала нужно собрать компилятор, а потом им компилировать другие сорцы.

Пока тупо внес путь к получаемому компилятору в зависимости custom-command.

Работает костыльно - cmake генерит часть make-файлов, но обламывается на поиске компилятора, считая его исходным текстом. Но запущенный make уже все разруливает, так как построение компилятора уже определено.


Ответ на: комментарий от Nao

> А разнести отдельно компилятор и проект никак?

Ну конечно я могу сделать два вызова cmake + make. Но мне важно освоить инструмент (cmake).

Я бы даже не спрашивал здесь, я сам «копал», но только сейчас нужно другим занимать.

ly
() автор топика
Ответ на: комментарий от GArik

> Хм. А как сейчас то сделано, я не понимаю? add_dependencies() вы делали?

Да, но (как и предполагал) не помогло. Это создает зависимость для конечной цели (например библиотеки). А нужно чтобы при обновлении компилятора cmake знал, что нужно заново сгенерировать h-файлы (которые создает компилятор).

Поэтому add_dependencies() позволяет собрать компилятор «раньше» библиотеки. Но не позволяет определить, что для получения такого-то h-файла необходимо вызвать компилятор, для чего его необходимо собрать как target.

Это то что (иногда) называют «ранними» зависимостями. В make это как «два пальца», а в cmake #$@#$^...

ly
() автор топика
Ответ на: комментарий от ly

так чего у тебя конкретно не работает? я за минуту написал тестовый проектик, всё корректно у меня отрабатывает


//cmakelists.txt
MACRO(ADD_HUI_FILES _sources )

    FOREACH (_current_FILE ${ARGN})
      GET_FILENAME_COMPONENT(_in ${_current_FILE} ABSOLUTE)
      GET_FILENAME_COMPONENT(_basename ${_current_FILE} NAME_WE)

      SET(_out ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.c)

      ADD_CUSTOM_COMMAND(
         OUTPUT ${_out}
         COMMAND ${CMAKE_CURRENT_BINARY_DIR}/hui
         ARGS
         -o ${_out}
         -i ${_in}
         DEPENDS ${_in} ${CMAKE_CURRENT_BINARY_DIR}/hui
      )

      SET(${_sources} ${${_sources}} ${_out} )
   ENDFOREACH (_current_FILE)
ENDMACRO()

add_executable(hui hui.c)
set(source test.c)
add_hui_files(source t.hui)
add_executable(test ${source})

//hui.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char ** argv)
{
        const char * in, * out;
        char buf[1024];
        size_t size;
        FILE * fin, *fout;
        int i;
        for (i = 0; i < argc; ++i)
        {
                if (!strcmp(argv[i], "-o"))
                {
                        out = argv[i + 1];
                } else if (!strcmp(argv[i], "-i")) {
                        in = argv[i + 1];
                }
        }

        fin  = fopen(in, "rb");
        fout = fopen(out, "wb");

        while ((size = fread(buf, 1, 1024, fin)))
        {
                fwrite(buf, 1, size, fout);
        }
        fclose(fin);
        fclose(fout);
}

//test.c
int main()
{
}

//t.hui
const char * jopa = 0;

Reset ★★★★★
()
Ответ на: комментарий от Reset

У меня пока чуть проще:

add_custom_command(
        OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/hui.h ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/hui.bin
        MAIN_DEPENDENCY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/hui-compiler
        DEPENDS source.hui
        COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/hui-compiler source.hui
        COMMENT "Compiling bla-bla-bla"
)

Получаем:

CMake Error in hui/CMakeLists.txt:
  Cannot find source file "hui-compiler ".  Tried extensions .c .C .c++ .cc
  .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp .hxx .in .txx

ly
() автор топика
Ответ на: комментарий от Reset

Всё, нашел.

Из-за MAIN_DEPENDENCY его тошнило.

ly
() автор топика
Ответ на: комментарий от Reset

За пример спасибо. Поиск отличий быстро вывел на MAIN_DEPENDENCY.

ly
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.