3 votes

Y a-t-il une règle dans CMake qui fait que les propriétés définies dans le fichier toolchain ne sont pas persistantes dans CMakeLists ?

J'essaie de construire OpenAL avec le NDK Android. La licence exige que la bibliothèque soit chargée dynamiquement. Je reçois le message suivant lors de la tentative de compilation :

CMake Warning (dev) at CMakeLists.txt:1032 (ADD_LIBRARY):
  ADD_LIBRARY called with SHARED option but the target platform does not
  support dynamic linking.  Building a STATIC library instead.  This may lead
  to problems.

Mon fichier toolchain comprend SET_PROPERTY(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS true) et ressemble à ceci :

SET(CMAKE_SYSTEM_NAME Generic)
SET(CMAKE_C_COMPILER "${HOST}-gcc")
SET(CMAKE_CXX_COMPILER "${HOST}-g++")

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

set(ENV{PKG_CONFIG_LIBDIR} "${CMAKE_INSTALL_PREFIX}/lib/pkgconfig")
set(ENV{PKG_CONFIG_PATH} "")

SET_PROPERTY(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS true)

Je crée un build dans la source et invoquez cmake avec ce qui suit :

cmake .. -DALSOFT_BACKEND_WAVE=0 -DALSOFT_REQUIRE_OPENSL=1 -DALSOFT_NO_CONFIG_UTIL=1 -DALSOFT_EXAMPLES=0 -DALSOFT_UTILS=0 -DALSOFT_CONFIG=0 -DCMAKE_INSTALL_PREFIX=$ANDROID_DEV/opt -DCMAKE_INSTALL_RPATH=$ANDROID_DEV/opt -DHOST= -DCMAKE_TOOLCHAIN_FILE=../../android-toolchain.cmake

J'ai vérifié que le fichier de la chaîne d'outils est chargé en y ajoutant des déchets et en voyant la commande cmake donner lieu à une erreur.

Le site CMakeLists.txt commence comme ceci :

# CMake build file list for OpenAL

CMAKE_MINIMUM_REQUIRED(VERSION 2.6)

PROJECT(OpenAL)

IF(COMMAND CMAKE_POLICY)
  CMAKE_POLICY(SET CMP0003 NEW)
  CMAKE_POLICY(SET CMP0005 NEW)
ENDIF(COMMAND CMAKE_POLICY)

SET(CMAKE_MODULE_PATH "${OpenAL_SOURCE_DIR}/cmake")

J'ai réussi à construire la bibliothèque comme un module dynamique en plaçant SET_PROPERTY(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS true) en CMakeList.txt immédiatement après le PROJECT(OpenAL) . Si je le place avant, le résultat de la construction est une bibliothèque statique avec l'avertissement mentionné précédemment.

Il semble que la propriété TARGET_SUPPORTS_SHARED_LIBS est remis à zéro après PROJECT(OpenAL) . J'ai lu la documetnation pour PROJECT , TARGET_SUPPORTS_SHARED_LIBS et incluant un fichier toolchain mais je n'ai rien trouvé qui mentionne explicitement la réinitialisation des variables toolchain cibles.

Est-ce que CMake a des règles qui font que cette variable est réinitialisée entre le fichier toolchain et le traitement de CMakeLists.txt, ou peut-être avant et après le traitement de CMakeLists.txt ? PROJECT commande ?

J'utilise CMake 2.8.12.2. Chaque fois que je lance la commande CMake, je le fais avec une nouvelle copie du répertoire source pour m'assurer qu'il n'y a pas de problème de cache.

0voto

Digicrat Points 115

Le problème se situe au niveau de la ligne "SET(CMAKE_SYSTEM_NAME Generic)".

La plate-forme Generic remplace la propriété TARGET_SUPPORTS_SHARED_LIBS par false. Si vous remplacez Generic par Android dans ce cas, cela devrait fonctionner, mais vous recevrez des avertissements. Dans ce cas, utiliser simplement Linux comme nom de système est probablement un meilleur choix (Android est techniquement une variante du noyau Linux).

Je viens de rencontrer le même problème en essayant de faire une compilation croisée pour une plateforme VxWorks. Dans mon cas, je mets maintenant le nom à VxWorks et je vis avec les avertissements ennuyeux pour le moment.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X