2017-03-21 2 views
0

Mon projet CMake compile un module d'extension Python .so/.dylib lié à une grande bibliothèque statique. Je veux compiler la bibliothèque statique du sous-projet avec une visibilité cachée pour les symboles: cela permettrait à l'éditeur de liens (ou à l'optimiseur LTO) de rejeter les symboles inutilisés par mon module python. La meilleure façon d'y parvenir serait d'utiliser CXX_VISIBILITY_PRESET et des amis sur la cible de bibliothèque statique du sous-projet. Cependant, les politiques d'utilisation des sous-projets de 3.1.0 en déclarant:Stratégie de remplacement CMake pour le sous-projet

cmake_minimum_required (VERSION 3.1.0) 

La politique CMP0063 NEW: Honor visibility properties for all target types. est introduit uniquement de la version 3.3 et donc, les set_target_properties n'a pas d'effet.

Mon projet nécessite CMake 3.3, mais je n'ai aucun contrôle sur le sous-projet.

Je voudrais éviter de patcher le sous-projet CMakeLists.txt, mais actuellement je ne vois pas d'autre moyen.

Une idée?

+0

Au lieu d'utiliser la propriété, vous pouvez simplement ajuster les drapeaux de l'éditeur de liens [CMAKE_STATIC_LINKER_FLAGS] (https://cmake.org/cmake/help/v3.7/variable/CMAKE_STATIC_LINKER_FLAGS.html). – Tsyvarev

+0

C'est une option de compilation. Idéalement, je définirais CXX_VISIBILITY_PRESET à "caché" globalement, puis 'set_target_properties (python_module PROPRIETES CXX_VISIBILITY_PRESET par défaut)'. En effet, il définit '-fvisibility = hidden' sur les drapeaux du compilateur pour la source déclarant les symboles privés. – Piezoid

+0

Si vous êtes sûr que le sous-projet fonctionnerait avec la règle 'CMP0063', vous pouvez remplacer la fonction' cmake_minimum_required' pour le sous-projet, donc cela activera la politique donnée. Voir [cette réponse] (http://stackoverflow.com/a/35345933/3440745) à propos du remplacement de la fonction CMake. – Tsyvarev

Répondre

1

Le cmake_minimum_required() a les effets suivants sur les politiques CMake:

  • Toutes les politiques introduites dans la version spécifiée ou version antérieure seront mis à utiliser un nouveau comportement.
  • Toutes les règles introduites après la version spécifiée seront désactivées.

Mais vous pouvez utiliser CMAKE_POLICY_DEFAULT_CMP<NNNN> variables globales de CMake à « défaut de CMake politique CMP lorsqu'il est par ailleurs laissé non. »

Voici un exemple:

set(CMAKE_POLICY_DEFAULT_CMP0063 NEW) 
add_subdirectory(MySubProjDir) 

Référence

0

Vous pouvez utiliser add_compile_option pour spécifier l'option de compilateur appropriée.

+0

Actuellement, j'utilise 'target_compile_options ($ {TARGET_NAME} PRIVATE -fvisibility = hidden)' sur toutes mes cibles à l'exception du module python. Comme le suggère le titre, je m'intéresse plus à une méthode générale pour tirer parti des fonctionnalités de CMake (politiques en langage CMake) à partir de la version cmake_minimum du projet top, dans les sous-projets nécessitant une version inférieure. – Piezoid