J'utilise SCons pour construire un projet et j'ai besoin d'ajouter un lien symbolique vers un fichier qu'il installe via env.Install. Quelle commande (s) fera un lien qui est l'équivalent de courir ln -s
sur la ligne de commande?Comment créer un lien symbolique avec SCons?
Répondre
SCons n'a pas une commande de lien symbolique dédié, mais vous pouvez utiliser os.symlink(src, dst)
du module os
Python:
import os
env = Environment()
def SymLink(target, source, env):
os.symlink(os.path.abspath(str(source[0])), os.path.abspath(str(target[0])))
env.Command("file.out", "file.in", SymLink)
Cela peut ne pas fonctionner correctement sur Windows, je ne l'ai essayé sur Linux.
Cela crée un constructeur pour effectuer le travail:
mylib = env.SharedLibrary("foobar", SRCS)
builder = Builder(action = "ln -s ${SOURCE.file} ${TARGET.file}", chdir = True)
env.Append(BUILDERS = {"Symlink" : builder})
mylib_link = env.Symlink("_foobar.so", mylib)
env.Default(mylib)
env.Default(mylib_link)
Encore une fois, cette solution est pour Linux.
Malheureusement, il ne fonctionne pas bien (du tout) sur les répertoires: "TypeError: Répertoire/home/septi/Dropbox/Code/StreetCleaner/src/Ressources trouvées où le fichier attendu .: " – Septagram
@Septagram: Comment réparer le problème de répertoire? –
@ Nordlöw, désolé, mais cela fait un moment et je ne sais pas :(S'il vous plaît essayer d'autres réponses et commenter si vous trouvez quelque chose – Septagram
Il semble y avoir peu de progrès dans le code de base SCons pour le support de lien symbolique et je n'ai pas été satisfait d'une solution que j'ai trouvée sur le web. Voici un générateur potentiel qui incorpore des aspects des réponses de Nick et Richq. En outre, il va attraper les changements de nom (en raison de la méthode de l'émetteur) et est aussi agnostique que possible.
Je préfère ce générateur car il fera des liens par rapport au répertoire dans lequel ils sont installés. On pourrait ajouter une option pour forcer le lien à être absolu je suppose, mais je n'ai pas besoin ou je voulais encore.
Actuellement, si le système d'exploitation ne supporte pas les liens symboliques, je passe et je ne fais rien, mais on pourrait utiliser os.copytree() par exemple mais la dépendance devient désordonnée si la source est un répertoire donc l'émetteur devrait faire quelque chose de fantaisie. Je suis prêt pour toute suggestion ici.
On peut mettre le code suivant dans le fichier site_scons/site_tools/symlink.py (avec blanc _ initialisation _.py fichiers dans les endroits appropriés). Ensuite, faites ceci dans le fichier SConstruct:
SConstruct:
env = Environment()
env.Tool('symlink')
env.SymLink('link_name.txt', 'real_file.txt')
symlink.py:
import os
from os import path
from SCons.Node import FS
from SCons.Script import Action, Builder
def generate(env):
'''
SymLink(link_name,source)
env.SymLink(link_name,source)
Makes a symbolic link named "link_name" that points to the
real file or directory "source". The link produced is always
relative.
'''
bldr = Builder(action = Action(symlink_builder,symlink_print),
target_factory = FS.File,
source_factory = FS.Entry,
single_target = True,
single_source = True,
emitter = symlink_emitter)
env.Append(BUILDERS = {'SymLink' : bldr})
def exists(env):
'''
we could test if the OS supports symlinks here, or we could
use copytree as an alternative in the builder.
'''
return True
def symlink_print(target, source, env):
lnk = path.basename(target[0].abspath)
src = path.basename(source[0].abspath)
return 'Link: '+lnk+' points to '+src
def symlink_emitter(target, source, env):
'''
This emitter removes the link if the source file name has changed
since scons does not seem to catch this case.
'''
lnk = target[0].abspath
src = source[0].abspath
lnkdir,lnkname = path.split(lnk)
srcrel = path.relpath(src,lnkdir)
if int(env.get('verbose',0)) > 3:
ldir = path.relpath(lnkdir,env.Dir('#').abspath)
if rellnkdir[:2] == '..':
ldir = path.abspath(ldir)
print ' symbolic link in directory: %s' % ldir
print ' %s -> %s' % (lnkname,srcrel)
try:
if path.exists(lnk):
if os.readlink(lnk) != srcrel:
os.remove(lnk)
except AttributeError:
# no symlink available, so we remove the whole tree? (or pass)
#os.rmtree(lnk)
print 'no os.symlink capability on this system?'
return (target, source)
def symlink_builder(target, source, env):
lnk = target[0].abspath
src = source[0].abspath
lnkdir,lnkname = path.split(lnk)
srcrel = path.relpath(src,lnkdir)
if int(env.get('verbose',0)) > 4:
print 'target:', target
print 'source:', source
print 'lnk:', lnk
print 'src:', src
print 'lnkdir,lnkname:', lnkdir, lnkname
print 'srcrel:', srcrel
if int(env.get('verbose',0)) > 4:
print 'in directory: %s' % path.relpath(lnkdir,env.Dir('#').abspath)
print ' symlink: %s -> %s' % (lnkname,srcrel)
try:
os.symlink(srcrel,lnk)
except AttributeError:
# no symlink available, so we make a (deep) copy? (or pass)
#os.copytree(srcrel,lnk)
print 'no os.symlink capability on this system?'
return None
plus Avez-vous écrit un variante pour les liens durs, aussi? Je veux la même interface que builtin 'Install' où le premier argument est un répertoire. –
- 1. Créer un lien symbolique vers un programme
- 2. Problème avec lien symbolique
- 3. Création d'un lien symbolique rompu avec Python
- 4. Comment faire un lien symbolique avec cygwin dans Windows 7
- 5. Lien symbolique Diapositives PowerPoint
- 6. Comment créer un nouveau dossier dans Eclipse Helios CDT avec lien symbolique?
- 7. Vérifie si un lien symbolique a changé
- 8. dossiers dans un lien symbolique bash
- 9. Comment puis-je créer un nouveau lien symbolique pour l'application RoR dans le dossier public_html?
- 10. lien symbolique vers le compartiment de bits
- 11. Comment utiliser les modèles BlankSlate et Proxy pour créer un lien symbolique entre les enregistrements?
- 12. SVN ignorer un lien symbolique vers un répertoire
- 13. Problème de lien ACL et symbolique
- 14. Comment dissocier un lien symbolique créé avec l'outil linkd.exe de Microsoft?
- 15. Puis-je créer un lien symbolique entre plusieurs répertoires en un?
- 16. python - Importer un fichier qui est un lien symbolique
- 17. Cygwin SVN lien symbolique checkout cassé
- 18. SVN un lien symbolique pointant vers mon répertoire personnel
- 19. Utilisation de Git avec des répertoires partagés (lien symbolique)
- 20. Copier le lien symbolique dans Solaris
- 21. Comment puis-je créer un alias (ou un raccourci, ou un lien symbolique) dans un référentiel subversion?
- 22. Détermine si le processus Windows a le privilège de créer un lien symbolique
- 23. Supprimer un lien symbolique lorsque le dossier d'origine est supprimé
- 24. Créer un lien jqGrid avec juste l'ID
- 25. Comment accéder à ctime, mtime, ... d'un lien symbolique?
- 26. Créer un lien permanent avec JavaScript
- 27. Comment vérifier où pointe le lien symbolique dans Ant
- 28. Comment créer un lien pour ouvrir une connexion SSH
- 29. Créer un lien avec Ruby on Rails
- 30. Essayer de créer un lien avec NSTextField
Pour une raison quelconque, il ne fonctionne pas lorsque vous essayez de créer un lien symbolique dans un subdir, comme "env.Command (saveur + '/ Ressources', 'src/Ressources', SymLink)" où saveur est 'debug' ou 'release'. – Septagram
@Septagram s'il vous plaît voir mon edit –
Ne fonctionne pas pour les fichiers installés – RzR