LINUX.ORG.RU

CMake не собирает проект из автозапуска (crontab), но собирает при ручном запуске

 ,


0

1

Здравствуйте,

Имеется скрипт sh, который сначала запускает CMake, а потом make, собирая таким образом пусковой файл проекта. Всё это вполне хорошо работало ровно до того момента, пока я не поместил этот скрипт в автозапуск через crontab. В результате таким способом проект не собирается, так как CMake выдает ошибку в стиле «некорректная конфигурация». Непонятно, каким образом рабочая конфигурация при автозапуске становится некорректной. Везде стоят абсолютные пути, пауза на запуск скрипта в 30 секунд имеется, дабы OS успела стартануть (пробовал ставить паузу полторы минуты, но толку нет).

CMake версии 3.30.3. В качестве OS используется Fedora на виртуалке. Результат в виде лога с ошибкой, который выдает CMake, можно увидеть здесь: https://www.astralax.com/temp/CMakeOutput.log

Сам CMakeLists.txt выглядит так:

cmake_minimum_required(VERSION 3.8)

set(CMAKE_C_FLAGS "-m64")
set(CMAKE_CXX_FLAGS "-m64")

project("mgcore")


SET(SOURCE "Backup.cpp" "Component.cpp" "Core.cpp" "Editor.cpp" "Graphics.cpp" "Magl.cpp" "Root.cpp" "stdafx.cpp" "Surface16.cpp" "Surface32.cpp" "Theme.cpp" "ThemeWindows.cpp" "utils.cpp" "VirtualDrive.cpp" "font/Font.cpp")

SET(HEADER "Backup.h" "Component.h" "Core.h" "dcrt.h" "Graphics.h" "Magl.h" "mgdv.h" "Root.h" "stb_image.h" "stb_image_write.h" "stdafx.h" "Surface16.h" "Surface32.h" "targetver.h" "Theme.h" "ThemeWindows.h" "utils.h" "VirtualDrive.h" "font/Font.h" "font/ft2build.h")

add_library(${PROJECT_NAME} ${SOURCE} ${HEADER})

include_directories(include)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED on)
add_definitions(-D_LIB -D_UTF8_ -DFREETYPE -DMD_APPLICATION -DMD_UNIX -DMD_CMAKE -DMD_X64)

target_compile_definitions(${PROJECT_NAME} PRIVATE
PUBLIC
$<$<CONFIG:Debug>:MD_DEBUG _DEBUG>
$<$<CONFIG:Release>:MD_RELEASE>
$<$<CONFIG:RelWithDebInfo>:MD_DEBUG _DEBUG>
$<$<CONFIG:MinSizeRel>:MD_RELEASE>
)
target_include_directories(${PROJECT_NAME} PRIVATE ./ font)

target_link_directories(${PROJECT_NAME} PRIVATE ${CMAKE_SOURCE_DIR})

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

Переменные окружения?

Я не использую переменные окружения, да и они же просто так не меняются при перезапуске OS.

Пути к файлам? Вот стартующий скрипт:

cd /mnt/vmware/mdev_unix_x64
/mnt/vmware/mdev_unix_x64/buildDebug.sh

Вот то, что он запускает buildDebug.sh:

mkdir buildDebug
cd buildDebug
cmake -DCMAKE_BUILD_TYPE=Debug ..
make
strip -s libmgcore.a

Права пользователя, от которого проихсодит запуск?

А вот это, честно говоря, не знаю. Запускаю строкой: @reboot sleep 30 && /mnt/vmware/build.sh

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

Приведенные тобой логи не соответствуют тому что здесь описано.

CMake выдает ошибку в стиле «некорректная конфигурация»

И если ты хочешь чтобы тебе помогли, перестать играть в сломанный телефон

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

Приведенные тобой логи не соответствуют тому что здесь описано.

Возможно, я не точно объяснил. Так как я не вижу того, что выводит мой скрипт при запуске через crontab, то я дублирую полученную информацию в файл через tee. Таким образом для отладки я вызываю сборочный скрипт так:

cd /mnt/vmware/mdev_unix_x64
/mnt/vmware/mdev_unix_x64/buildDebug.sh | tee /mnt/vmware/log_mdev_unix_x64_debug.txt

В результате в файл пишется следующее:

-- The C compiler identification is GNU 6.4.1
-- The CXX compiler identification is GNU 6.4.1
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring incomplete, errors occurred!
See also "/mnt/vmware/lib_unix_x64_CMake/buildDebug/CMakeFiles/CMakeOutput.log".

А то, что в результате попадает в CMakeOutput.log я показал. Я честно не знаю, как там должна выглядеть ошибка, но вот то что он логировал, то я и показываю.

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

/mnt/vmware/mdev_unix_x64/buildDebug.sh | tee /mnt/vmware/log_mdev_unix_x64_debug.txt

Попробуй логировать и stdout, и stderr:

/mnt/vmware/mdev_unix_x64/buildDebug.sh > /mnt/vmware/log_mdev_unix_x64_debug.txt 2> /mnt/vmware/log_mdev_unix_x64_debug_error.txt
static_lab ★★★★★
()
Ответ на: комментарий от Odin_KG

У тебя в скриптах написано

cd /mnt/vmware/mdev_unix_x64
...
mkdir buildDebug
...
cmake -DCMAKE_BUILD_TYPE=Debug
...

Смотрим логи (https://www.astralax.com/temp/CMakeOutput.log):

...
Change Dir: /mnt/vmware/lib_unix_x64_CMake/buildRelease/CMakeFiles/CMakeTmp
...

Ты приводишь какие-то левые логи. Из другого проекта и иного типа сборки.

я дублирую полученную информацию в файл через tee

Инфу надо выводить так:

/mnt/vmware/mdev_unix_x64/buildDebug.sh 2>&1 | tee /mnt/vmware/log_mdev_unix_x64_debug.txt

Иначе ошибки в файл не попадут.

И определись какой проект ты собираешь:

cd /mnt/vmware/mdev_unix_x64
...
See also "/mnt/vmware/lib_unix_x64_CMake/buildDebug/CMakeFiles/CMakeOutput.log".

cd идет в mdev_unix_x64, а сборка выдает lib_unix_x64_CMake. Это симлинк?

PRN
()
Последнее исправление: PRN (всего исправлений: 1)
Ответ на: комментарий от PRN

Ты приводишь какие-то левые логи. Из другого проекта и иного типа сборки.

Блин, я действительно перепутал… у меня там 6 сборок выполняются и ни одна не собирается. Но, правда, это в данном случае мало на что влияет, так как что debug, что release не собираются. Я заменил лог-файл на debug-версию.

Инфу надо выводить так:

Это очень полезная подсказка. Спасибо! Появилась новая информация:

-- The C compiler identification is GNU 6.4.1
-- The CXX compiler identification is GNU 6.4.1
-- Check for working C compiler: /bin/cc
-- Check for working C compiler: /bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /bin/c++
-- Check for working CXX compiler: /bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
CMake Error at CMakeLists.txt:29 (target_link_directories):
  Unknown CMake command "target_link_directories".


-- Configuring incomplete, errors occurred!
See also "/mnt/vmware/lib_unix_x64_CMake/buildDebug/CMakeFiles/CMakeOutput.log".
make: *** No targets specified and no makefile found.  Stop.
strip: 'libmgcore.a': No such file

Почему-то CMake стал думать, что у него нет команды target_link_directories. Единственное, что мне пока приходит в голову, что где-то в системе есть другой CMake более старый.

Odin_KG
() автор топика
cmake_minimum_required(VERSION 3.8)

target_include_directories(${PROJECT_NAME} PRIVATE ./ font)

target_include_directories появился в версии 3.13

Строчка из логов по ссылке

The C compiler identification is GNU, found in "/mnt/vmware/lib_unix_x64_CMake/buildDebug/CMakeFiles/3.9.1/CompilerIdC/a.out"

выдает что используется cmake версии 3.9.1

asaks
()
Ответ на: комментарий от Odin_KG

Тут написано:

CMake Error at CMakeLists.txt:29 (target_link_directories):
  Unknown CMake command "target_link_directories".

Смотрим доки (https://cmake.org/cmake/help/latest/command/target_link_directories.html):

target_link_directories
Added in version 3.13.
Add link directories to a target.

Смотрим твой cmake файл:

cmake_minimum_required(VERSION 3.8)

Поднимай до 3.13 и обновляй cmake)

PRN
()
Последнее исправление: PRN (всего исправлений: 2)
Ответ на: комментарий от PRN

Поднимай до 3.13

Да, вы правы. Спасибо!

И похоже, что моя догадка про вторую версию тоже верна:

CMake Error at CMakeLists.txt:1 (cmake_minimum_required):
  CMake 3.13 or higher is required.  You are running version 3.9.1

Как мне выпилить старую версию и заставить работать только новую ?

Odin_KG
() автор топика
Последнее исправление: Odin_KG (всего исправлений: 1)
Ответ на: комментарий от Odin_KG

Как мне выпилить старую версию и заставить работать только новую ?

Я хз как это в федоре, я дебианом пользуюсь)) Но самый тупой способ это явно указать путь к бинарю, например: /usr/bin/cmake3.30.3 -DCMAKE_BUILD_TYPE=Debug <src-path>

PRN
()
Ответ на: комментарий от Odin_KG

Если у тебя без крона все работает, то можно посмотреть что в переменной echo $PATH в обоих окружениях. И привести все к одному виду. Но лучше просто удалить старый cmake через пакетный менеджер.

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

Я удалил старый CMake, и вроде бы вписал в $PATH путь к новому (делал по вот этому примеру):

$ vi ~/.bashrc
В конце добавьте следующую строку:
export PATH=/home/user/.cargo/bin/:$PATH),

но… crontab всё равно не видит CMake. В принципе, я могу, конечно, вписать абсолютный путь, но у меня все сборочные скрипты генерируются (там и так куча настроек, ещё одну добавлять не очень хочется, хотя это проблемой не является).

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

Зачем тебе запускать сборку из крона?

Потому что я запускаю программу на Windows, она собирает Windows-версию, потом запускается виртуальная машина Linux-а, которая собирает версию под Linux, потому запускается виртуальная машина под Mac, которая тоже собирает Mac-версию. Результаты копируются через общую сетевую папку назад в Windows, где всё это рассовывается куда надо и превращается в готовый к употреблению вариант.

crontab при старте Fedora-ы запускает скрипт, который всё собирает и выключает виртуальную машину. Меня устроит любой другой способ с автостартом, но пока я нашёл такой.

Odin_KG
() автор топика
Последнее исправление: Odin_KG (всего исправлений: 1)