Republié depuis : http://www.cnblogs.com/nanvann/p/3913880.html
Traduit de https://code.google.com/p/gyp/wiki/GypLanguageSpecification
but et contexte
Google a utilisé de nombreux systèmes de création de projets indépendants de la plate-forme, tels que Scons et CMake . Ceux-ci ne peuvent pas répondre aux exigences en utilisation réelle. Lors du développement d'applications complexes, Xcode est plus adapté sur Mac et Visual Studio sur Windows est le meilleur choix.
gyp est un outil de génération de projet créé pour les projets Chromium, qui peut générer des fichiers de projet Visual Studio, Xcode et Makefile dépendant de la plate-forme à partir de configurations indépendantes de la plate-forme. De cette façon, nous n'avons pas besoin de passer plus de temps à gérer différentes configurations de projet pour chaque plate-forme et les dépendances entre les projets.
aperçu
Gyp a grosso modo les caractéristiques suivantes :
- Les fichiers de configuration se terminent par .gyp
- Chaque fichier .gyp décrit comment construire le projet
-
Chaque fichier .gyp génère plusieurs fichiers de projet spécifiques à la plate-forme :
- Sur Mac, le fichier .gyp génère le fichier de projet Xcode, qui contient comment construire le projet. Un fichier .gyp générera un .xcodeproj
- Sous Windows, les fichiers .gyp génèrent des fichiers de projet Visual Studio. Un fichier .gyp génère un .sln et un .vcproj pour chaque cible
- Sous Linux, le fichier .gyp génère le Makefile
- La syntaxe du fichier .gyp est le format de données Python (format Json)
- Le fichier .gypi peut être inclus par le fichier .gyp , ce qui est pratique pour les paramètres unifiés
-
Les données de la configuration se présentent sous la forme de paires clé-valeur
conception détaillée
Directives de conception :
- Cohérence des mots clés : tous les mots clés sont identiques aux champs de configuration de projet du projet de plate-forme
- La plate-forme spécifique à laquelle appartient la configuration est indiquée par un préfixe. Par exemple :
msvs_disabled_warnings
,xcode_framework_dirs
goûter
{
'target_defaults': {
'defines': [
'U_STATIC_IMPLEMENTATION',
['LOGFILE', 'foo.log',],
],
'include_dirs': [
'..',
],
},
'targets': [
{
'target_name': 'foo',
'type': 'static_library',
'sources': [
'foo/src/foo.cc',
'foo/src/foo_main.cc',
],
'include_dirs': [
'foo',
'foo/include',
],
'conditions': [
[ 'OS==mac', { 'sources': [ 'platform_test_mac.mm' ] } ]
],
'direct_dependent_settings': {
'defines': [
'UNIT_TEST',
],
'include_dirs': [
'foo',
'foo/include',
],
},
},
],
}
Élément structurel
Certaines cibles et règles de construction sont définies dans le fichier .gyp .
Les mots clés suivants peuvent être définis au niveau supérieur :
- conditions : définition de la condition. Voir *****conditions*****
- inclut : liste des fichiers .gypi inclus
{ 'targets':[ { 'target_name': 'Thread', 'type': 'executable', 'includes': [ '../common.gypi', './thread.gypi', ] ... } ], }
- target_defaults : la configuration de projet par défaut, la configuration de chaque projet (cibles) doit hériter de cette configuration
- cibles : liste des projets
{ 'targets': [ { 'target_name': 'hello1', 'product_extension': 'stuff', 'type': 'executable', 'sources': [ 'hello.c', ], }, { 'target_name': 'hello2', 'target_extension': 'stuff', 'type': 'executable', 'sources': [ 'hello.c', ], } ] }
- variables : définit les paires clé-valeur, qui peuvent être
<(varname)
référencées ailleurs{ 'variables': { 'pi': 'import math; print math.pi', 'third_letters': "<(other_letters)HIJK", 'letters_list': 'ABCD', 'other_letters': '<(letters_list)EFG', 'check_included': '<(included_variable)', 'check_lists': [ '<(included_variable)', '<(third_letters)', ], 'check_int': 5, 'check_str_int': '6', 'check_list_int': [ 7, '8', 9, ], 'not_int_1': ' 10', 'not_int_2': '11 ', 'not_int_3': '012', 'not_int_4': '13.0', 'not_int_5': '+14', 'negative_int': '-15', 'zero_int': '0', }, ... }
projet (cibles)
Un fichier .gyp définit un ensemble de règles pour la construction d'un projet. Les cibles peuvent également contenir includes
, conditions
et variables
. Voici quelques-uns des champs propriétaires dans les cibles :
- target_name : spécifiez le nom de la cible définie
- type : le type de cible. Prise en charge de
executable
, et . Parmi eux, les types sont également utiles et peuvent être utilisés comme types pour traiter des ressources, des documents et d'autres éléments spéciaux. Par exemple, sous Windows, existerait en tant que projet de type ensemble d'outilsstatic_library
shared_library
none
none
none
- product_extension : Spécifie l'extension de la cible cible générée, ne contient pas de '.'
- product_name : spécifiez le nom de fichier de la cible générée cible et
product_extension
formez un nom de fichier complet - dépendances : spécifiez les autres cibles dont dépend la cible
{ 'targets': [ { 'target_name': 'a', 'type': 'static_library', 'dependencies': [ 'b/b.gyp:b', 'c/c.gyp:*' ], 'sources': [ 'a.c', ], }, ], }
- Définit : définit les macros de prétraitement. Semblable à l'option -D ou /D dans la compilation de ligne de commande C/C++
{ 'targets': [ { 'target_name': 'defines', 'type': 'executable', 'defines': [ 'FOO', 'VALUE=1', 'PAREN_VALUE=(1+2+3)', 'HASH_VALUE="a#1"', ], 'sources': [ 'defines.c', ], }, ] }
- include_dirs : spécifie le répertoire dans lequel rechercher les fichiers d'inclusion. Semblable à l'option -I ou /I dans la compilation de ligne de commande C/C++
{ 'targets': [ { 'target_name': 'includes', 'type': 'executable', 'dependencies': [ 'subdir/subdir_includes.gyp:subdir_includes', ], 'cflags': [ '-Ishadow1', ], 'include_dirs': [ '.', 'inc1', 'shadow2', 'subdir/inc2', ], 'sources': [ 'includes.c', ], }, ], }
- sources : répertorie les fichiers de code du projet et certains fichiers liés au projet.
sources!
Les fichiers exclus peuvent être spécifiés dans la section - configurations : un ensemble de configurations de construction définies pour les cibles. voir *****configurations*****
- link_settings : spécifiez la bibliothèque que la cible doit lier.
executable
Etshared_library
le type de cible doit spécifier la bibliothèque de liens. Dans cette section, vous pouvez spécifier toutes les configurations pouvant être incluses dans la cible, à l'exception deconfigurations
,target_name
et .type
peut être comparéall_dependent_setting
avecdirect_dependent_setting
- direct_dependent_settings : spécifiez les paramètres cibles qui dépendent de cette cible. Dans cette section, vous pouvez spécifier toutes les configurations pouvant être incluses dans la cible, à l'exception de
configurations
,target_name
et .type
peut être comparéall_dependent_setting
aveclink_settings
- all_dependent_settings :
- bibliothèques : spécifiez les bibliothèques dont dépend la cible, voir
link_settings>libraries
... 'link_settings': { 'libraries': [ 'libiconv.dylib', '<(ZLIB_DIR)contrib/minizip/libminizip.a', 'libcurl.dylib', ], }, ...
- actions : définit un ensemble d'actions de construction personnalisées pour les fichiers d'entrée. Voir *****actions*****
- copies : définit un ensemble d'actions de copie. voir *****copies*****
- règles: Voir *****règles (règles)*****
- conditions_cibles : similaire aux conditions, mais l'heure de début est postérieure aux conditions
- msvs_precompiled_header : spécifie le fichier d'en-tête précompilé. Uniquement pour Visual Studio
- msvs_precompiled_source : spécifie le fichier source précompilé. Uniquement pour Visual Studio
- msvs_prebuild : avant les événements de génération. Uniquement pour Visual Studio
- msvs_postbuild : événement de post-construction. Uniquement pour Visual Studio
'msvs_postbuild': r'copy "$(OutDir)$(TargetName)" "C:\$(TargetName)"
- msvs_props : spécifie le fichier de page de propriétés (.vsprops) de la cible. Uniquement pour Visual Studio
- msvs_cygwin_shell : spécifie que l'action s'exécute sous cygwin. Uniquement pour Visual Studio
- msvs_cygwin_dirs : spécifiez le répertoire de cygwin. Uniquement pour Visual Studio
- xcode_config_file : dans xcode, spécifiez le fichier de configuration cible (.xcconfig). uniquement pour xcode
- xcode_framework_dirs : dans xcode, spécifiez le répertoire du framework. uniquement pour xcode
configurations
configurations
Les segments peuvent être dans targets
et target_defaults
segments. configurations
Impossible de remplacer l'élément spécifié target_defaults
par .
Parfois, nous devons spécifier plusieurs configurations pour le projet, telles que Debug
, Release
. Le paragraphe suivant est la configuration générale sous Windows :
...
'configurations': {
'Debug': {
'msvs_settings': {
'VCCLCompilerTool': {
# 多线程调试 DLL (/MDd)
'RuntimeLibrary': '3',
# 不优化 /Od
'Optimization': '0',
# 用于“编辑并继续”的程序数据库 (/ZI)
'DebugInformationFormat': '4',
},
'VCLinkerTool': {
'GenerateDebugInformation': 'true',
'GenerateMapFile': 'false',
# 'SubSystem': '1',
},
},
}, # Debug
'Release': {
'msvs_settings': {
'VCCLCompilerTool': {
# 多线程 DLL (/MD)
'RuntimeLibrary': '2',
# 完全优化 /Os
'Optimization': '2',
# 使用内部函数 /Oi
'EnableIntrinsicFunctions': 'true',
# 程序数据库 (/Zi)
'DebugInformationFormat': '3',
},
'VCLinkerTool': {
'GenerateDebugInformation': 'true',
'GenerateMapFile': 'false',
},
},
}, # Release
},
...
conditions
conditions
et target_conditons
peut apparaître .gyp文件
n'importe où. conditions
Les instructions .gyp
sont traitées dès que le fichier est chargé target_conditions
et les instructions sont traitées une fois que toutes les dépendances ont été traitées. Après avoir chargé les données complètes et partielles, utilisez la fonction eval()
de Python pour traiter la chaîne de condition.
Actions
actions
Fournit des fonctions pour le traitement personnalisé des entrées et sorties, chacune comportant les champs suivants :
- action_name : le nom de l'action, certaines plateformes peuvent ignorer ce champ
- entrées : informations d'entrée, utilisées comme build incrémentiel
- outputs : informations de sortie, utilisées comme build incrémentiel
- action : commande de construction
- message : le message affiché lors de la construction
Le système de construction comparera inputs
si outputs
les fichiers dans et ont été modifiés, et ne s'exécutera que s'ils ont été modifiés action
.
Dans Xcode, il est implémenté via un script shell ; dans Visual Studio, une implémentation personnalisée de VCCustomBuildTool est incluse via FileConfiguration.
'sources': [
# libraries.cc is generated by the js2c action below.
'<(INTERMEDIATE_DIR)/libraries.cc',
],
'actions': [
{
'variables': {
'core_library_files': [
'src/runtime.js',
'src/v8natives.js',
'src/macros.py',
],
},
'action_name': 'js2c',
'inputs': [
'tools/js2c.py',
'<@(core_library_files)',
],
'outputs': [
'<(INTERMEDIATE_DIR)/libraries.cc',
'<(INTERMEDIATE_DIR)/libraries-empty.cc',
],
'action': ['python', 'tools/js2c.py', '<@(outputs)', 'CORE', '<@(corelibrary_files)'],
},
],
règles
rules
La fonction de construction personnalisée est fournie, et chaque élément comporte les champs suivants :
- rule_name : le nom de la règle, certaines plateformes peuvent ignorer ce champ
- extension : Dans ce livre
target
, tous les fichiers source avec cette extension utilisent cette règle lors de la construction - entrées : règles de construction dépendantes
- outputs : informations de sortie, utilisées comme build incrémentiel.
RULE_INPUT_*
Les variables suivantes sont accessibles - action : commande de construction.
RULE_INPUT_*
Les variables suivantes sont accessibles - message : Le message affiché lors de la construction.
RULE_INPUT_*
Les variables suivantes sont accessibles
Cette variable est accessible dans outputs
, action
et message
:
- RULE_INPUT_PATH : le chemin complet de l'entrée actuelle
- RULE_INPUT_DIRNAME : répertoire d'entrée actuel
- RULE_INPUT_NAME : le nom de l'entrée actuelle
- RULE_INPUT_ROOT : l'entrée actuelle supprime l'extension
- RULE_INPUT_EXT : l'extension de l'entrée actuelle
{
'targets': [
{
'target_name': 'program',
'type': 'executable',
'msvs_cygwin_shell': 0,
'sources': [
'main.c',
'prog1.in',
'prog2.in',
],
'rules': [
{
'rule_name': 'make_sources',
'extension': 'in',
'inputs': [
'make-sources.py',
],
'outputs': [
'<(INTERMEDIATE_DIR)/<(RULE_INPUT_ROOT).c',
'<(INTERMEDIATE_DIR)/<(RULE_INPUT_ROOT).h',
],
'action': [
'python', '<(_inputs)', '<(RULE_INPUT_NAME)', '<@(_outputs)',
],
'process_outputs_as_sources': 1,
},
],
},
],
}
rules
a quelques similitudes avec actions
.
copie
copies
Fournit une fonction de copie de fichier simple, chaque élément a les champs suivants :
- destination : le dossier de destination de la copie
- fichiers : liste des fichiers à copier
copies
destination
Un fichier portant le même nom sera créé.
{
'targets': [
{
'target_name': 'copies1',
'type': 'none',
'copies': [
{
'destination': 'copies-out',
'files': [
'file1',
],
},
],
},
{
'target_name': 'copies2',
'type': 'none',
'copies': [
{
'destination': '<(PRODUCT_DIR)/copies-out',
'files': [
'file2',
],
},
],
},
# 拷贝目录
{
'target_name': 'copies3',
'type': 'none',
'copies': [
{
'destination': '<(PRODUCT_DIR)/copies-out',
'files': [
'directory/',
],
},
],
},
],
}
Dénomination du fichier de code
Les règles de nommage des fichiers dépendant de la plate-forme sont *_win.{ext}
, et . Par exemple:*_mac.{ext}
*_linux.{ext}
*_posix.{ext}
- _win : foo_win.cpp
- _mac : foo_mac.cpp,foo_mac.mm
- _linux : foo_linux.cpp
- _posix : foo_posix.cpp
code source gyp
Pour certains endroits non répertoriés et controversés dans la documentation, le plus fiable est de regarder gyp
le code source et les exemples. gyp
Le code de test est très détaillé et peut être utilisé comme référence pour apprendre des exemples.
Utiliser l'IDE pour déboguer le projet Makefile généré
Le débogage sous Linux utilise généralement gdb, mais il n'est pas facile de s'y mettre directement si vous ne le connaissez pas. QtCreator est recommandé ici Bien sûr, Netbeans et Eclipse CDT sont également disponibles, mais ce n'est pas aussi pratique et efficace que QtCreator.
configuration commune common.gypi
{
'includes': [
'env.gypi'
],
'include_dirs': [
'.',
],
'configurations': {
'Debug': {
'defines': [
'DEBUG',
],
},
'Release': {
'defines': [
'NDEBUG',
],
},
}, # configurations
'conditions': [
['OS=="win"', {
'defines': [
'WIN32',
'UNICODE',
'_UNICODE',
'OS_WIN',
],
'msbuild_configuration_attributes': {
'IntermediateDirectory': '$(OutDir)__BuildTemp\\$(ProjectName)\\',
},
'msbuild_toolset': {
#'PlatformToolset': 'v100'
}, # msbuild_toolset
'msvs_settings': {
'VCCLCompilerTool': {
'WarningLevel': '3',
'DisableSpecificWarnings': ['4251','4996'],
'WarnAsError': 'true',
},
'VCLinkerTool': {
'AdditionalDependencies': [
'kernel32.lib',
'user32.lib',
],
'AdditionalLibraryDirectories': [],
},
}, # msvs_settings
'configurations': {
'Debug': {
'msvs_settings': {
'VCCLCompilerTool': {
# 多线程调试 DLL (/MDd)
'RuntimeLibrary': '3',
# 不优化 /Od
'Optimization': '0',
# 用于“编辑并继续”的程序数据库 (/ZI)
'DebugInformationFormat': '4',
},
'VCLinkerTool': {
'GenerateDebugInformation': 'true',
'GenerateMapFile': 'false',
# 'SubSystem': '1',
},
}, # msvs_settings
}, # Debug
'Release': {
'msvs_settings': {
'VCCLCompilerTool': {
# 多线程 DLL (/MD)
'RuntimeLibrary': '2',
# 完全优化 /Os
'Optimization': '2',
# 使用内部函数 /Oi
'EnableIntrinsicFunctions': 'true',
# 程序数据库 (/Zi)
'DebugInformationFormat': '3',
},
'VCLinkerTool': {
'GenerateDebugInformation': 'true',
'GenerateMapFile': 'false',
},
}, # msvs_settings
}, # Release
}, # configurations
}], # Windows
['OS=="mac"', {
'make_global_settings': [
['CC', '/usr/bin/clang'],
['CXX', '/usr/bin/clang++'],
],
'defines': [
'OS_POSIX',
'OS_MACOSX',
],
'xcode_settings': {
'ALWAYS_SEARCH_USER_PATHS': 'NO',
#'i386', 'x86_64'
'ARCHS': [ 'x86_64' ],
'MACOSX_DEPLOYMENT_TARGET': '10.6',
'CC': 'clang',
'GCC_VERSION': 'com.apple.compilers.llvm.clang.1_0',
'CLANG_CXX_LANGUAGE_STANDARD': 'c++0x',
# libstdc++, c++11, libc++
'CLANG_CXX_LIBRARY': 'libstdc++',
'GCC_ENABLE_OBJC_GC': 'unsupported',
#'LIBRARY_SEARCH_PATHS': [],
'GCC_ENABLE_CPP_EXCEPTIONS': 'YES',
'GCC_SYMBOLS_PRIVATE_EXTERN': 'NO',
'DEBUG_INFORMATION_FORMAT': 'dwarf-with-dsym',
#'DEPLOYMENT_POSTPROCESSING': 'YES',
'OTHER_CFLAGS': [
'-fno-eliminate-unused-debug-symbols',
'-mmacosx-version-min=10.6',
# compile use oc++
'-x objective-c++',
],
'WARNING_CFLAGS': ['-Wno-deprecated-declarations'],
'WARNING_CFLAGS!': ['-Wall', '-Wextra',],
'WARNING_CXXFLAGS': ['-Wstrict-aliasing', '-Wno-deprecated',],
}, # xcode_settings
'link_settings': {
'libraries': [
'$(SDKROOT)/System/Library/Frameworks/Foundation.framework',
],
},
'libraries': [],
'mac_framework_dirs': [],
'configurations': {
'Debug': {
'xcode_settings': {
'GCC_DEBUGGING_SYMBOLS': 'full',
'STRIP_INSTALLED_PRODUCT': 'YES',
'GCC_OPTIMIZATION_LEVEL': '0',
'OTHER_CFLAGS': ['-g',],
'OTHER_CXXFLAGS': ['-g',],
}, # xcode_settings
}, # Debug
'Release': {
'xcode_settings': {
'GCC_OPTIMIZATION_LEVEL': 's',
}, # xcode_settings
}, # Release
}, # configurations
}], # Mac
['OS=="linux"', {
'defines': [
'OS_POSIX',
'OS_LINUX',
],
'cflags': [
# Support 64-bit shared libs (also works fine for 32-bit).
'-fPIC',
'-std=c++11',
'-fstrict-aliasing',
'-Wall',
'-Wextra',
'-Wshadow',
'-Wconversion',
#'-Wpadded',
'-Wstrict-aliasing=2',
'-Wstrict-overflow=4',
],
'ldflags': [],
'configurations': {
'Debug': {
'cflags': [
'-g',
'-C',
],
},
'Release': {
'cflags': [
'-O2',
],
},
}, # configurations
}], # Linux
], # conditions
}
ligne de commande gyp
--depth
: Problèmes d'historique de chrome, doivent être réglés sur.
--generator-out
: Définir le dossier de sortie du projet généré--f
: Définir le type de projet généré, s'il n'est pas défini, le type de projet généré sera déterminé en fonction de la plateforme. Les valeurs disponibles sont :msvs
,xcode
,make
-
--G
: Définissez les autres paramètres d'indicateur générés, cette valeur est liée à la plate-forme spécifique.- msvs_version : spécifie la version du projet Visual Studio généré. Si elle n'est pas définie, le projet sera généré en fonction de la dernière version de Visual Studio installée sur le système. Les valeurs disponibles sont
2005
,2005e
,2008
,2008e
,2010
, ,2010e
,2012
,2012e
,2013
.2013e
Par exemple:--Gmsvs_version=2010
- msvs_version : spécifie la version du projet Visual Studio généré. Si elle n'est pas définie, le projet sera généré en fonction de la dernière version de Visual Studio installée sur le système. Les valeurs disponibles sont
--toplevel-dir
: Définissez le répertoire racine du code source, la valeur par défaut prendra--depth
la valeur spécifiée-D
: Passez des variables à .gyp, qui peuvent être<(varname)
lues de cette façon. Par exemple:-Dbuildtype=share_library
-
--no-circular-check
:
L'écriture de la documentation de l'API est une chose très pénible, et je continuerai à l'ajouter à l'avenir.