2010-03-11 9 views
3

Nous utilisons SCons + swtoolkit pour notre système de compilation sur Mac, Linux et Windows. Nous avons un référentiel svn qui contient toutes nos dépendances de bibliothèques externes, dont le chemin se trouve dans la variable d'environnement EXTERNAL_SDKS.SCons: Copie des bibliothèques externes pour créer le répertoire de sortie

Dans chacun de nos SConscripts cibles, j'aimerais trouver une méthode qui recherchera les bibliothèques situées sous le chemin EXTERNAL_SDKS auquel la cible est liée et la copiera dans le dossier de sortie de construction lorsque la cible elle-même sera construite. placé là.

J'ai trouvé une méthode en utilisant des composants ajoutés dans swtoolkit, mais cela ralentit l'analyse des sconscripts par tonne (15+ secondes sur mac, 1 minute + sur windows !!).

Quelqu'un sait-il d'une manière efficace de faire cela?

Répondre

2

J'ai trouvé une réponse via Randall Spangler, le développeur de Google qui a créé swtoolkit. Cette réponse est donc spécifique à l'utilisation de swtoolkit avec SCons.

Auparavant, nous analysions nos cibles pour les dépendances, puis nous déterminions les bibliothèques externes à copier à partir de cette analyse de dépendance. C'est ce qui causait le ralentissement sévère. Swtoolkit a une méthode env.Publish() qui enregistre les cibles afin qu'elles puissent être utilisées comme dépendances pour d'autres cibles. Une fois les bibliothèques externes publiées, elles seront automatiquement copiées dans le dossier de sortie de génération via l'appel ReplicatePublished() utilisé dans swtoolkit lorsqu'une cible est créée.

Il a donné l'exemple de code suivant:

thirdparty_libs = [] 
for dir in env.SubstList2('$THIRDPARTY_LIB_DIRS'): 
    thirdparty_libs += env.Glob(dir + '/lib*.dylib') 
    thirdparty_libs += env.Glob(dir + '/lib*.a') 

import os 
for lib in thirdparty_libs: 
    name_parts = os.path.splitext(lib.name) 
    if name_parts[1] == '.dylib': 
    # TODO: Need to publish 'libfoo.dylib' or 'libfoo.a' as both 
    # 'libfoo' and 'foo'. Need to clean up sconscripts to remove 'lib' prefix 
    # from all libs for mac, linux. 
    lib_basename = name_parts[0] 
    env.Publish(lib_basename, 'run', lib) 
    env.Publish(lib_basename[3:], 'run', lib) 

Nous avons modifié ce pour répondre à nos besoins et l'a placé dans les scripts qui permettent de configurer l'utilisation de nos bibliothèques externes. Par exemple, dans notre module BoostSettings, ceci trouve et publie toutes les bibliothèques de boost. Si l'un d'eux est requis par une cible, il est automatiquement copié dans le dossier de sortie de construction.