cmake: Как мне правильно установить переменные, предшествующие make во внешнем проекте?

#linux #cmake #environment-variables #external-project

#linux #cmake #переменные среды #external-project

Вопрос:

Я работаю над настройкой проекта кросс-компиляции для библиотек, которые мне нужны в проекте pi. Я хочу пересечь последнюю библиотеку mosquitto, и я выяснил, что мне нужно передать, чтобы make правильно ее построил. К сожалению, когда я определяю свою BUILD_COMMAND, я, похоже, не могу правильно установить переменные, предшествующие вызову make .

Вот внешний проект, определенный в моем CMakeLists.txt:

 ExternalProject_Add(mosquitto
    URL ${SRC_URL} URL_MD5 ${SRC_MD5}
    BUILD_IN_SOURCE 1
    CONFIGURE_COMMAND echo "No configuration necessary."
    BUILD_COMMAND cd <SOURCE_DIR>/lib amp;amp; export CC=gcc amp;amp; export CXX=g   amp;amp; export CROSS_COMPILE=${CROSS_COMPILE_TRIPLE} amp;amp; export CFLAGS=--sysroot=${CMAKE_SYSROOT} amp;amp; export LDFLAGS="--sysroot=${CMAKE_SYSROOT} -Wl,-rpath-link,${CMAKE_SYSROOT}/lib/arm-linux-gnueabihf -Wl,-rpath-link,${CMAKE_SYSROOT}/usr/lib/arm-linux-gnueabihf -L${CMAKE_SYSROOT}/usr/lib/arm-linux-gnueabihf" amp;amp; make --trace
  

Вот результат выполнения шага, который завершается с ошибкой:

 arm-linux-gnueabihf-gcc -shared "--sysroot=/home/heardg/pi/system/devroot -Wl,-rpath-link,/home/heardg/pi/system/devroot/lib/arm-linux-gnueabihf -Wl,-rpath-link,/home/heardg/pi/system/devroot/usr/lib/arm-linux-gnueabihf -L/home/heardg/pi/system/devroot/usr/lib/arm-linux-gnueabihf" -Wl,--version-script=linker.version -Wl,-soname,libmosquitto.so.1 mosquitto.o logging_mosq.o memory_mosq.o messages_mosq.o net_mosq.o read_handle.o read_handle_client.o read_handle_shared.o send_mosq.o send_client_mosq.o socks_mosq.o srv_mosq.o thread_mosq.o time_mosq.o tls_mosq.o util_mosq.o will_mosq.o -o libmosquitto.so.1  -lrt -lssl -lcrypto -lpthread -lcares
/home/heardg/pi/linaro/gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/4.9.4/../../../../arm-linux-gnueabihf/bin/ld: cannot find crti.o: No such file or directory
/home/heardg/pi/linaro/gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/4.9.4/../../../../arm-linux-gnueabihf/bin/ld: cannot find -lrt
/home/heardg/pi/linaro/gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/4.9.4/../../../../arm-linux-gnueabihf/bin/ld: cannot find -lssl
/home/heardg/pi/linaro/gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/4.9.4/../../../../arm-linux-gnueabihf/bin/ld: cannot find -lcrypto
/home/heardg/pi/linaro/gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/4.9.4/../../../../arm-linux-gnueabihf/bin/ld: cannot find -lpthread
/home/heardg/pi/linaro/gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/4.9.4/../../../../arm-linux-gnueabihf/bin/ld: cannot find -lcares
collect2: error: ld returned 1 exit status
Makefile:46: recipe for target 'libmosquitto.so.1' failed`
  

Я обнаружил, что проблема заключается в кавычках вокруг LDFLAGS.

 "--sysroot=/home/heardg/pi/system/devroot -Wl,-rpath-link,/home/heardg/pi/system/devroot/lib/arm-linux-gnueabihf -Wl,-rpath-link,/home/heardg/pi/system/devroot/usr/lib/arm-linux-gnueabihf -L/home/heardg/pi/system/devroot/usr/lib/arm-linux-gnueabihf"
  

Если я выполню команду link вручную и удалю двойные кавычки выше, она завершится успешно.

Как я могу лучше сформировать аргументы в BUILD_COMMAND, чтобы избавиться от кавычек?

Ответ №1:

Когда существует много команд ExternalProject_Add , было бы разумно использовать script , который их выполняет. Что касается передачи переменных CMake в скрипт, их можно передавать через аргументы скрипта или через конфигурацию самого скрипта:

build_mosquitto.sh.in:

 # The only argument to the script is mosquitto's source directory.
source_dir=$1

exports CC=gcc
export CXX=g  
export CROSS_COMPILE=@CROSS_COMPILE_TRIPLE@
# ... other exports

cd ${source_dir}/lib amp;amp; make
  

CMakeLists.txt:

 configure_file("build_mosquitto.sh.in" "build_mosquitto.sh" @ONLY)

ExternalProject_Add(mosquitto
    URL ${SRC_URL} URL_MD5 ${SRC_MD5}
    BUILD_IN_SOURCE 1
    CONFIGURE_COMMAND echo "No configuration necessary."
    BUILD_COMMAND sh "${CMAKE_CURRENT_BINARY_DIR}/build_mosquitto.sh" <SOURCE_DIR>
)