[DEV] basic version
This commit is contained in:
parent
8cf8d949ec
commit
d4a54bbf5b
9
.gitignore
vendored
Normal file
9
.gitignore
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
# Compiled python modules.
|
||||
*.pyc
|
||||
|
||||
# Setuptools distribution folder.
|
||||
/dist/
|
||||
/build/
|
||||
|
||||
# Python egg metadata, regenerated from source files by setuptools.
|
||||
/*.egg-info
|
69
.travis.yml
Normal file
69
.travis.yml
Normal file
@ -0,0 +1,69 @@
|
||||
#language: python
|
||||
|
||||
sudo: false
|
||||
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
- dev
|
||||
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- g++-4.9
|
||||
- expect
|
||||
- binutils-mingw-w64-i686 # 32bit MinGW
|
||||
- gcc-mingw-w64-i686
|
||||
- g++-mingw-w64-i686
|
||||
- binutils-mingw-w64-x86-64 # 64bit MinGW
|
||||
- gcc-mingw-w64-x86-64
|
||||
- g++-mingw-w64-x86-64
|
||||
|
||||
matrix:
|
||||
include:
|
||||
- os: linux
|
||||
env: CONF=release BUILDER=gcc TARGET=Linux TAG=Linux
|
||||
compiler: gcc
|
||||
- os: linux
|
||||
env: CONF=debug BUILDER=clang TARGET=Linux
|
||||
compiler: clang
|
||||
- os: linux
|
||||
env: CONF=release BUILDER=gcc TARGET=Windows TAG=Mingw
|
||||
compiler: gcc
|
||||
- os: linux
|
||||
env: CONF=release BUILDER=gcc TARGET=Android TAG=Android DISABLE_PACKAGE=-p
|
||||
compiler: gcc
|
||||
- os: osx
|
||||
env: CONF=release BUILDER=clang TARGET=MacOs TAG=MacOs
|
||||
compiler: clang
|
||||
- os: osx
|
||||
env: CONF=release BUILDER=clang TARGET=IOs TAG=IOs
|
||||
compiler: clang
|
||||
|
||||
install:
|
||||
- cd ..
|
||||
# download NDK
|
||||
- if [ "$TAG" == "Android" ]; then
|
||||
git clone --depth 1 --branch master https://github.com/HeeroYui/android-download-tool;
|
||||
./android-download-tool/dl-android.sh;
|
||||
fi
|
||||
- git clone --depth 1 --branch master https://github.com/atria-soft/ci.git
|
||||
- cd -
|
||||
|
||||
before_script:
|
||||
- ./setup.py build
|
||||
- export PYTHONPATH=$PYTHONPATH:./lutin/build/lib.linux-x86_64-2.7/:./lutin/build/lib.linux-x86_64-2.7/lutin/:./lutin/build/lib:./lutin/build/lib/lutin/
|
||||
- cd ..
|
||||
- pwd
|
||||
- ls -l *
|
||||
- ./ci/build_send.py --tag=$TAG --status=START;
|
||||
|
||||
script:
|
||||
- ./lutin/build/scripts-2.7/lutin -w -j4 -C -P -t$TARGET -c $BUILDER $COMPILATOR_OPTION $BUS -m $CONF $GCOV $DISABLE_PACKAGE test-c; STATUS=$?
|
||||
- ./ci/build_send.py --tag=$TAG --status="$STATUS";
|
||||
|
||||
notifications:
|
||||
email:
|
||||
- yui.heero@gmail.com
|
13
COPYING
Normal file
13
COPYING
Normal file
@ -0,0 +1,13 @@
|
||||
Copyright doxy Edouard DUPIN
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
2
MANIFEST.in
Normal file
2
MANIFEST.in
Normal file
@ -0,0 +1,2 @@
|
||||
include README.rst
|
||||
include bash-autocompletion/monk
|
186
bin/doxy
Executable file
186
bin/doxy
Executable file
@ -0,0 +1,186 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
##
|
||||
## @author Edouard DUPIN
|
||||
##
|
||||
## @copyright 2012, Edouard DUPIN, all right reserved
|
||||
##
|
||||
## @license APACHE v2.0 (see license file)
|
||||
##
|
||||
|
||||
# for path inspection:
|
||||
import sys
|
||||
import os
|
||||
import copy
|
||||
import doxy
|
||||
import doxy.debug as debug
|
||||
import doxy.arg as arguments
|
||||
import doxy.module as module
|
||||
import doxy.target as target
|
||||
import doxy.env as env
|
||||
import doxy.multiprocess as multiprocess
|
||||
import doxy.tools as tools
|
||||
import doxy.tools as doxyTools
|
||||
|
||||
myArgs = arguments.doxyArg()
|
||||
myArgs.add(arguments.ArgDefine("h", "help", desc="Display this help"))
|
||||
myArgs.add(arguments.ArgDefine("H", "HELP", desc="Display this help (with all compleate information)"))
|
||||
myArgs.add_section("option", "Can be set one time in all case")
|
||||
myArgs.add(arguments.ArgDefine("v", "verbose", list=[["0","None"],["1","error"],["2","warning"],["3","info"],["4","debug"],["5","verbose"],["6","extreme_verbose"]], desc="display makefile debug level (verbose) default =2"))
|
||||
myArgs.add(arguments.ArgDefine("C", "color", desc="Display makefile output in color"))
|
||||
myArgs.add(arguments.ArgDefine("d", "depth", haveParam=True, desc="Depth of the search of sub element doxy_*.py (default=" + str(env.get_parse_depth()) + ")"))
|
||||
|
||||
myArgs.add_section("properties", "keep in the sequency of the cible")
|
||||
myArgs.add(arguments.ArgDefine("m", "mode", list=[["debug",""],["release",""]], desc="Compile in release or debug mode (default release)"))
|
||||
|
||||
myArgs.add_section("cible", "generate in order set")
|
||||
localArgument = myArgs.parse()
|
||||
|
||||
"""
|
||||
display the help of this makefile
|
||||
"""
|
||||
def usage(full=False):
|
||||
color = debug.get_color_set()
|
||||
# generic argument displayed :
|
||||
myArgs.display()
|
||||
print(" All target can finish with '?clean' '?dump' '?gcov' ... ?action (@ can replace ?)" )
|
||||
print(" " + color['green'] + "all" + color['default'])
|
||||
print(" build all (only for the current selected board) (bynary and packages)")
|
||||
print(" " + color['green'] + "clean" + color['default'])
|
||||
print(" clean all (same as previous)")
|
||||
print(" " + color['green'] + "dump" + color['default'])
|
||||
print(" Dump all the module dependency and properties")
|
||||
listOfAllModule = module.list_all_module_with_desc()
|
||||
for mod in listOfAllModule:
|
||||
print(" " + color['green'] + mod["name"] + color['default'])
|
||||
if mod["description"] != "":
|
||||
print(" " + mod["description"])
|
||||
|
||||
print(" ex: " + sys.argv[0] + " all --target=Android all -m debug all")
|
||||
exit(0)
|
||||
|
||||
def check_boolean(value):
|
||||
if value == "" \
|
||||
or value == "1" \
|
||||
or value == "true" \
|
||||
or value == "True" \
|
||||
or value == True:
|
||||
return True
|
||||
return False
|
||||
|
||||
# preparse the argument to get the verbose element for debug mode
|
||||
def parseGenericArg(argument, active):
|
||||
debug.extreme_verbose("parse arg : " + argument.get_option_name() + " " + argument.get_arg() + " active=" + str(active))
|
||||
if argument.get_option_name() == "help":
|
||||
if active==False:
|
||||
usage()
|
||||
return True
|
||||
if argument.get_option_name() == "HELP":
|
||||
if active==False:
|
||||
usage(True)
|
||||
return True
|
||||
elif argument.get_option_name()=="depth":
|
||||
if active==True:
|
||||
env.set_parse_depth(int(argument.get_arg()))
|
||||
return True
|
||||
elif argument.get_option_name() == "verbose":
|
||||
if active==True:
|
||||
debug.set_level(int(argument.get_arg()))
|
||||
return True
|
||||
elif argument.get_option_name() == "color":
|
||||
if active==True:
|
||||
if check_boolean(argument.get_arg()) == True:
|
||||
debug.enable_color()
|
||||
else:
|
||||
debug.disable_color()
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
# open configuration of doxy:
|
||||
config_file_name = "doxyConfig.py"
|
||||
config_file = os.path.join(tools.get_run_path(), config_file_name)
|
||||
if os.path.isfile(config_file) == True:
|
||||
sys.path.append(os.path.dirname(config_file))
|
||||
debug.debug("Find basic configuration file: '" + config_file + "'")
|
||||
# the file exist, we can open it and get the initial configuration:
|
||||
configuration_file = __import__(config_file_name[:-3])
|
||||
if "get_exclude_path" in dir(configuration_file):
|
||||
data = configuration_file.get_exclude_path()
|
||||
debug.debug(" get default config 'get_exclude_path' val='" + str(data) + "'")
|
||||
env.set_exclude_search_path(data)
|
||||
if "get_parsing_depth" in dir(configuration_file):
|
||||
data = configuration_file.get_parsing_depth()
|
||||
debug.debug(" get default config 'get_parsing_depth' val='" + str(data) + "'")
|
||||
parseGenericArg(arguments.ArgElement("depth", str(data)), True)
|
||||
if "get_default_color" in dir(configuration_file):
|
||||
data = configuration_file.get_default_color()
|
||||
debug.debug(" get default config 'get_default_color' val='" + str(data) + "'")
|
||||
parseGenericArg(arguments.ArgElement("color", str(data)), True)
|
||||
if "get_default_debug_level" in dir(configuration_file):
|
||||
data = configuration_file.get_default_debug_level()
|
||||
debug.debug(" get default config 'get_default_debug_level' val='" + str(data) + "'")
|
||||
parseGenericArg(arguments.ArgElement("verbose", str(data)), True)
|
||||
|
||||
# parse default unique argument:
|
||||
for argument in localArgument:
|
||||
parseGenericArg(argument, True)
|
||||
|
||||
# initialize the system ...
|
||||
doxy.init()
|
||||
|
||||
config = {
|
||||
"mode":"release",
|
||||
}
|
||||
# load the default target:
|
||||
my_target = None
|
||||
actionDone = False
|
||||
# parse all argument
|
||||
for argument in localArgument:
|
||||
if parseGenericArg(argument, False) == True:
|
||||
continue
|
||||
elif argument.get_option_name() == "mode":
|
||||
if config["mode"] != argument.get_arg():
|
||||
config["mode"] = argument.get_arg()
|
||||
debug.debug("change mode ==> " + config["mode"])
|
||||
#remove previous target
|
||||
my_target = None
|
||||
else:
|
||||
argument_value = argument.get_arg()
|
||||
debug.debug("something request : '" + argument_value + "'")
|
||||
if argument.get_option_name() != "":
|
||||
debug.warning("Can not understand argument : '" + argument.get_option_name() + "'")
|
||||
usage()
|
||||
break;
|
||||
name2 = argument_value.replace("@", "?")
|
||||
gettedElement = name2.split("?")
|
||||
module_name = gettedElement[0]
|
||||
action_list = gettedElement[1:]
|
||||
if len(action_list) == 0:
|
||||
action_list = "build"
|
||||
debug.debug("requested: '" + module_name + "' ? actions:'" + str(action_list) + "'")
|
||||
multiple_module_list = []
|
||||
if module_name[-1] == "*":
|
||||
base_name = module_name[:-1]
|
||||
for mod in module.list_all_module():
|
||||
if mod[:len(base_name)] == base_name:
|
||||
debug.verbose("need do it for: " + mod);
|
||||
multiple_module_list.append(mod)
|
||||
else:
|
||||
multiple_module_list.append(module_name)
|
||||
debug.debug("Will do: '" + str(multiple_module_list) + "' ? actions:'" + str(action_list) + "'")
|
||||
for module_name in multiple_module_list:
|
||||
#load the target if needed:
|
||||
if my_target == None:
|
||||
my_target = target.Target(copy.deepcopy(config))
|
||||
my_target.build(module_name, actions=action_list)
|
||||
actionDone=True
|
||||
|
||||
# if no action done : we do "all" ...
|
||||
if actionDone==False:
|
||||
#load the target if needed:
|
||||
if my_target == None:
|
||||
my_target = target.Target(config)
|
||||
my_target.build("all")
|
||||
|
||||
|
264
default_doxy_file.dox
Normal file
264
default_doxy_file.dox
Normal file
@ -0,0 +1,264 @@
|
||||
# Doxyfile 1.5.6
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Project related configuration options
|
||||
#---------------------------------------------------------------------------
|
||||
DOXYFILE_ENCODING = UTF-8
|
||||
#PROJECT_NAME = "Etk: Ewol Tool Kit"
|
||||
PROJECT_NUMBER =
|
||||
#OUTPUT_DIRECTORY = "doxygen/"
|
||||
#GENERATE_TAGFILE = doxygen/etk.tag
|
||||
CREATE_SUBDIRS = YES
|
||||
OUTPUT_LANGUAGE = English
|
||||
BRIEF_MEMBER_DESC = YES
|
||||
REPEAT_BRIEF = YES
|
||||
ABBREVIATE_BRIEF = YES
|
||||
ALWAYS_DETAILED_SEC = NO
|
||||
INLINE_INHERITED_MEMB = NO
|
||||
FULL_PATH_NAMES = NO
|
||||
STRIP_FROM_PATH =
|
||||
STRIP_FROM_INC_PATH =
|
||||
SHORT_NAMES = NO
|
||||
JAVADOC_AUTOBRIEF = NO
|
||||
QT_AUTOBRIEF = NO
|
||||
MULTILINE_CPP_IS_BRIEF = NO
|
||||
INHERIT_DOCS = NO
|
||||
SEPARATE_MEMBER_PAGES = NO
|
||||
TAB_SIZE = 4
|
||||
ALIASES =
|
||||
OPTIMIZE_OUTPUT_FOR_C = YES
|
||||
OPTIMIZE_OUTPUT_JAVA = NO
|
||||
OPTIMIZE_FOR_FORTRAN = NO
|
||||
OPTIMIZE_OUTPUT_VHDL = NO
|
||||
EXTENSION_MAPPING =
|
||||
BUILTIN_STL_SUPPORT = NO
|
||||
CPP_CLI_SUPPORT = NO
|
||||
SIP_SUPPORT = NO
|
||||
IDL_PROPERTY_SUPPORT = YES
|
||||
DISTRIBUTE_GROUP_DOC = NO
|
||||
SUBGROUPING = YES
|
||||
TYPEDEF_HIDES_STRUCT = NO
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the input files
|
||||
#---------------------------------------------------------------------------
|
||||
#INPUT = etk
|
||||
INPUT_ENCODING = UTF-8
|
||||
FILE_PATTERNS = *.c \
|
||||
*.cpp \
|
||||
*.h \
|
||||
*.hxx
|
||||
RECURSIVE = YES
|
||||
EXCLUDE =
|
||||
EXCLUDE_SYMLINKS = NO
|
||||
EXCLUDE_PATTERNS =
|
||||
EXCLUDE_SYMBOLS =
|
||||
EXAMPLE_PATH =
|
||||
EXAMPLE_PATTERNS =
|
||||
EXAMPLE_RECURSIVE = NO
|
||||
IMAGE_PATH = data/dox/
|
||||
INPUT_FILTER =
|
||||
FILTER_PATTERNS =
|
||||
FILTER_SOURCE_FILES = NO
|
||||
#---------------------------------------------------------------------------
|
||||
# Build related configuration options
|
||||
#---------------------------------------------------------------------------
|
||||
EXTRACT_ALL = YES
|
||||
EXTRACT_PRIVATE = YES
|
||||
EXTRACT_STATIC = YES
|
||||
EXTRACT_LOCAL_CLASSES = YES
|
||||
EXTRACT_LOCAL_METHODS = YES
|
||||
EXTRACT_ANON_NSPACES = YES
|
||||
HIDE_UNDOC_MEMBERS = NO
|
||||
HIDE_UNDOC_CLASSES = NO
|
||||
HIDE_FRIEND_COMPOUNDS = NO
|
||||
HIDE_IN_BODY_DOCS = NO
|
||||
INTERNAL_DOCS = YES
|
||||
CASE_SENSE_NAMES = YES
|
||||
HIDE_SCOPE_NAMES = NO
|
||||
SHOW_INCLUDE_FILES = YES
|
||||
INLINE_INFO = YES
|
||||
SORT_MEMBER_DOCS = YES
|
||||
SORT_BRIEF_DOCS = NO
|
||||
SORT_MEMBERS_CTORS_1ST = NO
|
||||
SORT_GROUP_NAMES = NO
|
||||
SORT_BY_SCOPE_NAME = NO
|
||||
GENERATE_TODOLIST = YES
|
||||
GENERATE_TESTLIST = YES
|
||||
GENERATE_BUGLIST = YES
|
||||
GENERATE_DEPRECATEDLIST= YES
|
||||
ENABLED_SECTIONS =
|
||||
MAX_INITIALIZER_LINES = 30
|
||||
SHOW_USED_FILES = YES
|
||||
SHOW_FILES = YES
|
||||
SHOW_NAMESPACES = YES
|
||||
FILE_VERSION_FILTER =
|
||||
LAYOUT_FILE =
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to warning and progress messages
|
||||
#---------------------------------------------------------------------------
|
||||
QUIET = NO
|
||||
WARNINGS = YES
|
||||
WARN_IF_UNDOCUMENTED = YES
|
||||
WARN_IF_DOC_ERROR = YES
|
||||
WARN_NO_PARAMDOC = NO
|
||||
WARN_FORMAT = "$file($line): $text"
|
||||
WARN_LOGFILE = "doxygen.log"
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to source browsing
|
||||
#---------------------------------------------------------------------------
|
||||
SOURCE_BROWSER = NO
|
||||
INLINE_SOURCES = NO
|
||||
STRIP_CODE_COMMENTS = YES
|
||||
REFERENCED_BY_RELATION = NO
|
||||
REFERENCES_RELATION = NO
|
||||
REFERENCES_LINK_SOURCE = YES
|
||||
USE_HTAGS = NO
|
||||
VERBATIM_HEADERS = NO
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the alphabetical class index
|
||||
#---------------------------------------------------------------------------
|
||||
ALPHABETICAL_INDEX = YES
|
||||
COLS_IN_ALPHA_INDEX = 5
|
||||
IGNORE_PREFIX =
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the HTML output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_HTML = YES
|
||||
HTML_OUTPUT = html
|
||||
HTML_FILE_EXTENSION = .html
|
||||
HTML_HEADER =
|
||||
HTML_FOOTER =
|
||||
#HTML_STYLESHEET = data/dox/doxygen.css
|
||||
HTML_DYNAMIC_SECTIONS = NO
|
||||
GENERATE_DOCSET = NO
|
||||
DOCSET_FEEDNAME = "Doxygen generated docs"
|
||||
DOCSET_BUNDLE_ID = org.doxygen.Project
|
||||
GENERATE_HTMLHELP = NO
|
||||
CHM_FILE =
|
||||
HHC_LOCATION =
|
||||
GENERATE_CHI = NO
|
||||
CHM_INDEX_ENCODING =
|
||||
BINARY_TOC = NO
|
||||
TOC_EXPAND = YES
|
||||
GENERATE_QHP = NO
|
||||
QCH_FILE =
|
||||
QHP_NAMESPACE =
|
||||
QHP_VIRTUAL_FOLDER = doc
|
||||
QHP_CUST_FILTER_NAME =
|
||||
QHP_CUST_FILTER_ATTRS =
|
||||
QHP_SECT_FILTER_ATTRS =
|
||||
QHG_LOCATION =
|
||||
DISABLE_INDEX = NO
|
||||
ENUM_VALUES_PER_LINE = 1
|
||||
GENERATE_TREEVIEW = YES
|
||||
USE_INLINE_TREES = NO
|
||||
TREEVIEW_WIDTH = 250
|
||||
FORMULA_FONTSIZE = 10
|
||||
SEARCHENGINE = YES
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the LaTeX output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_LATEX = NO
|
||||
LATEX_OUTPUT = latex
|
||||
LATEX_CMD_NAME = latex
|
||||
MAKEINDEX_CMD_NAME = makeindex
|
||||
COMPACT_LATEX = NO
|
||||
PAPER_TYPE = a4wide
|
||||
EXTRA_PACKAGES =
|
||||
LATEX_HEADER =
|
||||
PDF_HYPERLINKS = NO
|
||||
USE_PDFLATEX = NO
|
||||
LATEX_BATCHMODE = NO
|
||||
LATEX_HIDE_INDICES = NO
|
||||
LATEX_SOURCE_CODE = NO
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the RTF output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_RTF = NO
|
||||
RTF_OUTPUT = rtf
|
||||
COMPACT_RTF = NO
|
||||
RTF_HYPERLINKS = NO
|
||||
RTF_STYLESHEET_FILE =
|
||||
RTF_EXTENSIONS_FILE =
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the man page output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_MAN = NO
|
||||
MAN_OUTPUT = man
|
||||
MAN_EXTENSION = .3
|
||||
MAN_LINKS = NO
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the XML output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_XML = NO
|
||||
XML_OUTPUT = xml
|
||||
XML_SCHEMA =
|
||||
XML_DTD =
|
||||
XML_PROGRAMLISTING = YES
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options for the AutoGen Definitions output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_AUTOGEN_DEF = NO
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the Perl module output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_PERLMOD = NO
|
||||
PERLMOD_LATEX = NO
|
||||
PERLMOD_PRETTY = YES
|
||||
PERLMOD_MAKEVAR_PREFIX =
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the preprocessor
|
||||
#---------------------------------------------------------------------------
|
||||
ENABLE_PREPROCESSING = YES
|
||||
MACRO_EXPANSION = YES
|
||||
EXPAND_ONLY_PREDEF = YES
|
||||
SEARCH_INCLUDES = YES
|
||||
INCLUDE_PATH =
|
||||
INCLUDE_FILE_PATTERNS =
|
||||
PREDEFINED =
|
||||
EXPAND_AS_DEFINED =
|
||||
SKIP_FUNCTION_MACROS = NO
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration::additions related to external references
|
||||
#---------------------------------------------------------------------------
|
||||
TAGFILES =
|
||||
#GENERATE_TAGFILE =
|
||||
ALLEXTERNALS = NO
|
||||
EXTERNAL_GROUPS = YES
|
||||
PERL_PATH = /usr/bin/perl
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the dot tool
|
||||
#---------------------------------------------------------------------------
|
||||
CLASS_DIAGRAMS = YES
|
||||
MSCGEN_PATH =
|
||||
HIDE_UNDOC_RELATIONS = YES
|
||||
HAVE_DOT = YES
|
||||
DOT_FONTNAME = FreeSans
|
||||
DOT_FONTSIZE = 10
|
||||
DOT_FONTPATH =
|
||||
CLASS_GRAPH = NO
|
||||
COLLABORATION_GRAPH = NO
|
||||
GROUP_GRAPHS = NO
|
||||
UML_LOOK = YES
|
||||
TEMPLATE_RELATIONS = YES
|
||||
INCLUDE_GRAPH = NO
|
||||
INCLUDED_BY_GRAPH = NO
|
||||
CALL_GRAPH = NO
|
||||
CALLER_GRAPH = NO
|
||||
GRAPHICAL_HIERARCHY = NO
|
||||
DIRECTORY_GRAPH = NO
|
||||
DOT_IMAGE_FORMAT = svg
|
||||
#DOT_PATH = /usr/bin/dot
|
||||
DOTFILE_DIRS =
|
||||
MAX_DOT_GRAPH_WIDTH = 1024
|
||||
MAX_DOT_GRAPH_HEIGHT = 1024
|
||||
DOT_GRAPH_MAX_NODES = 50
|
||||
MAX_DOT_GRAPH_DEPTH = 0
|
||||
DOT_TRANSPARENT = YES
|
||||
DOT_MULTI_TARGETS = NO
|
||||
GENERATE_LEGEND = YES
|
||||
DOT_CLEANUP = YES
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration::additions related to the search engine
|
||||
#---------------------------------------------------------------------------
|
||||
SEARCHENGINE = YES
|
145
doxy/__init__.py
Executable file
145
doxy/__init__.py
Executable file
@ -0,0 +1,145 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
##
|
||||
## @author Edouard DUPIN
|
||||
##
|
||||
## @copyright 2012, Edouard DUPIN, all right reserved
|
||||
##
|
||||
## @license APACHE v2.0 (see license file)
|
||||
##
|
||||
import os
|
||||
import sys
|
||||
import fnmatch
|
||||
# Local import
|
||||
from . import target
|
||||
from . import tools
|
||||
from . import debug
|
||||
from . import module
|
||||
from . import env
|
||||
is_init = False
|
||||
|
||||
|
||||
def filter_name_and_file(root, list_files, filter):
|
||||
# filter elements:
|
||||
tmp_list = fnmatch.filter(list_files, filter)
|
||||
out = []
|
||||
for elem in tmp_list:
|
||||
if os.path.isfile(os.path.join(root, elem)) == True:
|
||||
out.append(elem);
|
||||
return out;
|
||||
|
||||
def filter_path(root, list_files):
|
||||
out = []
|
||||
for elem in list_files:
|
||||
if len(elem) == 0 \
|
||||
or elem[0] == '.':
|
||||
continue
|
||||
if os.path.isdir(os.path.join(root, elem)) == True:
|
||||
out.append(elem);
|
||||
return out;
|
||||
|
||||
def import_path_local(path, limit_sub_folder, exclude_path = [], base_name = ""):
|
||||
out = []
|
||||
debug.verbose("doxy files: " + str(path) + " [START]")
|
||||
if limit_sub_folder == 0:
|
||||
debug.debug("Subparsing limitation append ...")
|
||||
return []
|
||||
try:
|
||||
list_files = os.listdir(path)
|
||||
except:
|
||||
# an error occure, maybe read error ...
|
||||
debug.warning("error when getting subdirectory of '" + str(path) + "'")
|
||||
return []
|
||||
if path in exclude_path:
|
||||
debug.debug("find '" + str(path) + "' in exclude_path=" + str(exclude_path))
|
||||
return []
|
||||
# filter elements:
|
||||
tmp_list_doxy_file = filter_name_and_file(path, list_files, base_name + "*.py")
|
||||
debug.verbose("doxy files: " + str(path) + " : " + str(tmp_list_doxy_file))
|
||||
# Import the module:
|
||||
for filename in tmp_list_doxy_file:
|
||||
out.append(os.path.join(path, filename))
|
||||
debug.extreme_verbose(" Find a file : '" + str(out[-1]) + "'")
|
||||
need_parse_sub_folder = True
|
||||
rm_value = -1
|
||||
# check if we need to parse sub_folder
|
||||
if len(tmp_list_doxy_file) != 0:
|
||||
need_parse_sub_folder = False
|
||||
# check if the file "doxy_parse_sub.py" is present ==> parse SubFolder (force and add +1 in the resursing
|
||||
if base_name + "ParseSubFolders.txt" in list_files:
|
||||
debug.debug("find SubParser ... " + str(base_name + "ParseSubFolders.txt") + " " + path)
|
||||
data_file_sub = tools.file_read_data(os.path.join(path, base_name + "ParseSubFolders.txt"))
|
||||
if data_file_sub == "":
|
||||
debug.debug(" Empty file Load all subfolder in the worktree in '" + str(path) + "'")
|
||||
need_parse_sub_folder = True
|
||||
rm_value = 0
|
||||
else:
|
||||
list_sub = data_file_sub.split("\n")
|
||||
debug.debug(" Parse selected folders " + str(list_sub) + " no parse local folder directory")
|
||||
need_parse_sub_folder = False
|
||||
for folder in list_sub:
|
||||
if folder == "" \
|
||||
or folder == "/":
|
||||
continue;
|
||||
tmp_out = import_path_local(os.path.join(path, folder),
|
||||
1,
|
||||
exclude_path,
|
||||
base_name)
|
||||
# add all the elements:
|
||||
for elem in tmp_out:
|
||||
out.append(elem)
|
||||
if need_parse_sub_folder == True:
|
||||
list_folders = filter_path(path, list_files)
|
||||
for folder in list_folders:
|
||||
tmp_out = import_path_local(os.path.join(path, folder),
|
||||
limit_sub_folder - rm_value,
|
||||
exclude_path,
|
||||
base_name)
|
||||
# add all the elements:
|
||||
for elem in tmp_out:
|
||||
out.append(elem)
|
||||
return out
|
||||
|
||||
|
||||
def init():
|
||||
global is_init;
|
||||
if is_init == True:
|
||||
return
|
||||
sys.path.append(tools.get_run_path())
|
||||
# create the list of basic folder:
|
||||
basic_folder_list = []
|
||||
basic_folder_list.append([tools.get_current_path(__file__), True])
|
||||
# Import all sub path without out and archive
|
||||
for elem_path in os.listdir("."):
|
||||
if os.path.isdir(elem_path) == False:
|
||||
continue
|
||||
if elem_path == "out" :
|
||||
continue
|
||||
debug.debug("Automatic load path: '" + elem_path + "'")
|
||||
basic_folder_list.append([elem_path, False])
|
||||
|
||||
# create in a single path the basic list of doxy files (all start with doxy and end with .py)
|
||||
exclude_path = env.get_exclude_search_path()
|
||||
limit_sub_folder = env.get_parse_depth()
|
||||
list_of_doxy_files = []
|
||||
for elem_path, is_system in basic_folder_list:
|
||||
if is_system == True:
|
||||
limit_sub_folder_tmp = 999999
|
||||
else:
|
||||
limit_sub_folder_tmp = limit_sub_folder
|
||||
tmp_out = import_path_local(elem_path,
|
||||
limit_sub_folder_tmp,
|
||||
exclude_path,
|
||||
env.get_build_system_base_name())
|
||||
# add all the elements:
|
||||
for elem in tmp_out:
|
||||
list_of_doxy_files.append(elem)
|
||||
|
||||
debug.debug("Files specific doxy: ")
|
||||
for elem_path in list_of_doxy_files:
|
||||
debug.debug(" " + elem_path)
|
||||
# simply import element from the basic list of files (single parse ...)
|
||||
module.import_path(list_of_doxy_files)
|
||||
is_init = True
|
||||
|
||||
|
262
doxy/arg.py
Normal file
262
doxy/arg.py
Normal file
@ -0,0 +1,262 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
##
|
||||
## @author Edouard DUPIN
|
||||
##
|
||||
## @copyright 2012, Edouard DUPIN, all right reserved
|
||||
##
|
||||
## @license APACHE v2.0 (see license file)
|
||||
##
|
||||
import sys
|
||||
# Local import
|
||||
from . import debug
|
||||
|
||||
class ArgElement:
|
||||
def __init__(self, option, value=""):
|
||||
self.option = option;
|
||||
self.arg = value;
|
||||
|
||||
def get_option_name(self):
|
||||
return self.option
|
||||
|
||||
def get_arg(self):
|
||||
return self.arg
|
||||
|
||||
def display(self):
|
||||
if len(self.arg)==0:
|
||||
debug.info("option : " + self.option)
|
||||
elif len(self.option)==0:
|
||||
debug.info("element : " + self.arg)
|
||||
else:
|
||||
debug.info("option : " + self.option + ":" + self.arg)
|
||||
|
||||
|
||||
class ArgDefine:
|
||||
def __init__(self,
|
||||
smallOption="", # like v for -v
|
||||
bigOption="", # like verbose for --verbose
|
||||
list=[], # ["val", "description"]
|
||||
desc="",
|
||||
haveParam=False):
|
||||
self.option_small = smallOption;
|
||||
self.option_big = bigOption;
|
||||
self.list = list;
|
||||
if len(self.list)!=0:
|
||||
self.have_param = True
|
||||
else:
|
||||
if True==haveParam:
|
||||
self.have_param = True
|
||||
else:
|
||||
self.have_param = False
|
||||
self.description = desc;
|
||||
|
||||
def get_option_small(self):
|
||||
return self.option_small
|
||||
|
||||
def get_option_big(self):
|
||||
return self.option_big
|
||||
|
||||
def need_parameters(self):
|
||||
return self.have_param
|
||||
|
||||
def get_porperties(self):
|
||||
return ""
|
||||
|
||||
def check_availlable(self, argument):
|
||||
if len(self.list)==0:
|
||||
return True
|
||||
for element,desc in self.list:
|
||||
if element == argument:
|
||||
return True
|
||||
return False
|
||||
|
||||
def display(self):
|
||||
color = debug.get_color_set()
|
||||
if self.option_small != "" and self.option_big != "":
|
||||
print(" " + color['red'] + "-" + self.option_small + "" + color['default'] + " / " + color['red'] + "--" + self.option_big + color['default'])
|
||||
elif self.option_small != "":
|
||||
print(" " + color['red'] + "-" + self.option_small + color['default'])
|
||||
elif self.option_big != "":
|
||||
print(" " + color['red'] + "--" + self.option_big + color['default'])
|
||||
else:
|
||||
print(" ???? ==> internal error ...")
|
||||
if self.description != "":
|
||||
print(" " + self.description)
|
||||
if len(self.list)!=0:
|
||||
hasDescriptiveElement=False
|
||||
for val,desc in self.list:
|
||||
if desc!="":
|
||||
hasDescriptiveElement=True
|
||||
break;
|
||||
if hasDescriptiveElement==True:
|
||||
for val,desc in self.list:
|
||||
print(" " + val + " : " + desc)
|
||||
else:
|
||||
tmpElementPrint = ""
|
||||
for val,desc in self.list:
|
||||
if len(tmpElementPrint)!=0:
|
||||
tmpElementPrint += " / "
|
||||
tmpElementPrint += val
|
||||
print(" { " + tmpElementPrint + " }")
|
||||
|
||||
def parse(self, argList, currentID):
|
||||
return currentID;
|
||||
|
||||
|
||||
class ArgSection:
|
||||
def __init__(self,
|
||||
sectionName="",
|
||||
desc=""):
|
||||
self.section = sectionName;
|
||||
self.description = desc;
|
||||
|
||||
def get_option_small(self):
|
||||
return ""
|
||||
|
||||
def get_option_big(self):
|
||||
return ""
|
||||
|
||||
def get_porperties(self):
|
||||
color = debug.get_color_set()
|
||||
return " [" + color['blue'] + self.section + color['default'] + "]"
|
||||
|
||||
def display(self):
|
||||
color = debug.get_color_set()
|
||||
print(" [" + color['blue'] + self.section + color['default'] + "] : " + self.description)
|
||||
|
||||
def parse(self, argList, currentID):
|
||||
return currentID;
|
||||
|
||||
|
||||
class doxyArg:
|
||||
def __init__(self):
|
||||
self.listProperties = []
|
||||
|
||||
def add(self, argument):
|
||||
self.listProperties.append(argument) #ArgDefine(smallOption, bigOption, haveParameter, parameterList, description));
|
||||
|
||||
def add_section(self, sectionName, sectionDesc):
|
||||
self.listProperties.append(ArgSection(sectionName, sectionDesc))
|
||||
|
||||
def parse(self):
|
||||
listArgument = [] # composed of list element
|
||||
NotparseNextElement=False
|
||||
for iii in range(1, len(sys.argv)):
|
||||
# special case of parameter in some elements
|
||||
if NotparseNextElement==True:
|
||||
NotparseNextElement = False
|
||||
continue
|
||||
debug.verbose("parse [" + str(iii) + "]=" + sys.argv[iii])
|
||||
argument = sys.argv[iii]
|
||||
optionList = argument.split("=")
|
||||
debug.verbose(str(optionList))
|
||||
if type(optionList) == type(str()):
|
||||
option = optionList
|
||||
else:
|
||||
option = optionList[0]
|
||||
optionParam = argument[len(option)+1:]
|
||||
debug.verbose(option)
|
||||
argumentFound=False;
|
||||
if option[:2]=="--":
|
||||
# big argument
|
||||
for prop in self.listProperties:
|
||||
if prop.get_option_big()=="":
|
||||
continue
|
||||
if prop.get_option_big() == option[2:]:
|
||||
# find it
|
||||
debug.verbose("find argument 2 : " + option[2:])
|
||||
if prop.need_parameters()==True:
|
||||
internalSub = option[2+len(prop.get_option_big()):]
|
||||
if len(internalSub)!=0:
|
||||
if len(optionParam)!=0:
|
||||
# wrong argument ...
|
||||
debug.warning("maybe wrong argument for : '" + prop.get_option_big() + "' cmdLine='" + argument + "'")
|
||||
prop.display()
|
||||
continue
|
||||
optionParam = internalSub
|
||||
if len(optionParam)==0:
|
||||
#Get the next parameters
|
||||
if len(sys.argv) > iii+1:
|
||||
optionParam = sys.argv[iii+1]
|
||||
NotparseNextElement=True
|
||||
else :
|
||||
# missing arguments
|
||||
debug.warning("parsing argument error : '" + prop.get_option_big() + "' Missing : subParameters ... cmdLine='" + argument + "'")
|
||||
prop.display()
|
||||
exit(-1)
|
||||
if prop.check_availlable(optionParam)==False:
|
||||
debug.warning("argument error : '" + prop.get_option_big() + "' SubParameters not availlable ... cmdLine='" + argument + "' option='" + optionParam + "'")
|
||||
prop.display()
|
||||
exit(-1)
|
||||
listArgument.append(ArgElement(prop.get_option_big(),optionParam))
|
||||
argumentFound = True
|
||||
else:
|
||||
if len(optionParam)!=0:
|
||||
debug.warning("parsing argument error : '" + prop.get_option_big() + "' need no subParameters : '" + optionParam + "' cmdLine='" + argument + "'")
|
||||
prop.display()
|
||||
listArgument.append(ArgElement(prop.get_option_big()))
|
||||
argumentFound = True
|
||||
break;
|
||||
if False==argumentFound:
|
||||
debug.error("UNKNOW argument : '" + argument + "'")
|
||||
elif option[:1]=="-":
|
||||
# small argument
|
||||
for prop in self.listProperties:
|
||||
if prop.get_option_small()=="":
|
||||
continue
|
||||
if prop.get_option_small() == option[1:1+len(prop.get_option_small())]:
|
||||
# find it
|
||||
debug.verbose("find argument 1 : " + option[1:1+len(prop.get_option_small())])
|
||||
if prop.need_parameters()==True:
|
||||
internalSub = option[1+len(prop.get_option_small()):]
|
||||
if len(internalSub)!=0:
|
||||
if len(optionParam)!=0:
|
||||
# wrong argument ...
|
||||
debug.warning("maybe wrong argument for : '" + prop.get_option_big() + "' cmdLine='" + argument + "'")
|
||||
prop.display()
|
||||
continue
|
||||
optionParam = internalSub
|
||||
if len(optionParam)==0:
|
||||
#Get the next parameters
|
||||
if len(sys.argv) > iii+1:
|
||||
optionParam = sys.argv[iii+1]
|
||||
NotparseNextElement=True
|
||||
else :
|
||||
# missing arguments
|
||||
debug.warning("parsing argument error : '" + prop.get_option_big() + "' Missing : subParameters cmdLine='" + argument + "'")
|
||||
prop.display()
|
||||
exit(-1)
|
||||
if prop.check_availlable(optionParam)==False:
|
||||
debug.warning("argument error : '" + prop.get_option_big() + "' SubParameters not availlable ... cmdLine='" + argument + "' option='" + optionParam + "'")
|
||||
prop.display()
|
||||
exit(-1)
|
||||
listArgument.append(ArgElement(prop.get_option_big(),optionParam))
|
||||
argumentFound = True
|
||||
else:
|
||||
if len(optionParam)!=0:
|
||||
debug.warning("parsing argument error : '" + prop.get_option_big() + "' need no subParameters : '" + optionParam + "' cmdLine='" + argument + "'")
|
||||
prop.display()
|
||||
listArgument.append(ArgElement(prop.get_option_big()))
|
||||
argumentFound = True
|
||||
break;
|
||||
|
||||
if argumentFound==False:
|
||||
#unknow element ... ==> just add in the list ...
|
||||
debug.verbose("unknow argument : " + argument)
|
||||
listArgument.append(ArgElement("", argument))
|
||||
|
||||
#for argument in listArgument:
|
||||
# argument.display()
|
||||
#exit(0)
|
||||
return listArgument;
|
||||
|
||||
|
||||
|
||||
def display(self):
|
||||
print("usage:")
|
||||
listOfPropertiesArg = "";
|
||||
for element in self.listProperties :
|
||||
listOfPropertiesArg += element.get_porperties()
|
||||
print(" " + sys.argv[0] + listOfPropertiesArg + " ...")
|
||||
for element in self.listProperties :
|
||||
element.display()
|
181
doxy/debug.py
Normal file
181
doxy/debug.py
Normal file
@ -0,0 +1,181 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
##
|
||||
## @author Edouard DUPIN
|
||||
##
|
||||
## @copyright 2012, Edouard DUPIN, all right reserved
|
||||
##
|
||||
## @license APACHE v2.0 (see license file)
|
||||
##
|
||||
|
||||
import os
|
||||
import threading
|
||||
import re
|
||||
|
||||
debug_level=3
|
||||
debug_color=False
|
||||
|
||||
color_default= ""
|
||||
color_red = ""
|
||||
color_green = ""
|
||||
color_yellow = ""
|
||||
color_blue = ""
|
||||
color_purple = ""
|
||||
color_cyan = ""
|
||||
|
||||
|
||||
debug_lock = threading.Lock()
|
||||
|
||||
def set_level(id):
|
||||
global debug_level
|
||||
debug_level = id
|
||||
#print "SetDebug level at " + str(debug_level)
|
||||
|
||||
def get_level():
|
||||
global debug_level
|
||||
return debug_level
|
||||
|
||||
def enable_color():
|
||||
global debug_color
|
||||
debug_color = True
|
||||
global color_default
|
||||
color_default= "\033[00m"
|
||||
global color_red
|
||||
color_red = "\033[31m"
|
||||
global color_green
|
||||
color_green = "\033[32m"
|
||||
global color_yellow
|
||||
color_yellow = "\033[33m"
|
||||
global color_blue
|
||||
color_blue = "\033[01;34m"
|
||||
global color_purple
|
||||
color_purple = "\033[35m"
|
||||
global color_cyan
|
||||
color_cyan = "\033[36m"
|
||||
|
||||
def disable_color():
|
||||
global debug_color
|
||||
debug_color = True
|
||||
global color_default
|
||||
color_default= ""
|
||||
global color_red
|
||||
color_red = ""
|
||||
global color_green
|
||||
color_green = ""
|
||||
global color_yellow
|
||||
color_yellow = ""
|
||||
global color_blue
|
||||
color_blue = ""
|
||||
global color_purple
|
||||
color_purple = ""
|
||||
global color_cyan
|
||||
color_cyan = ""
|
||||
|
||||
def extreme_verbose(input, force=False):
|
||||
global debug_lock
|
||||
global debug_level
|
||||
if debug_level >= 6 \
|
||||
or force == True:
|
||||
debug_lock.acquire()
|
||||
print(color_blue + input + color_default)
|
||||
debug_lock.release()
|
||||
|
||||
def verbose(input, force=False):
|
||||
global debug_lock
|
||||
global debug_level
|
||||
if debug_level >= 5 \
|
||||
or force == True:
|
||||
debug_lock.acquire()
|
||||
print(color_blue + input + color_default)
|
||||
debug_lock.release()
|
||||
|
||||
def debug(input, force=False):
|
||||
global debug_lock
|
||||
global debug_level
|
||||
if debug_level >= 4 \
|
||||
or force == True:
|
||||
debug_lock.acquire()
|
||||
print(color_green + input + color_default)
|
||||
debug_lock.release()
|
||||
|
||||
def info(input, force=False):
|
||||
global debug_lock
|
||||
global debug_level
|
||||
if debug_level >= 3 \
|
||||
or force == True:
|
||||
debug_lock.acquire()
|
||||
print(input + color_default)
|
||||
debug_lock.release()
|
||||
|
||||
def warning(input, force=False):
|
||||
global debug_lock
|
||||
global debug_level
|
||||
if debug_level >= 2 \
|
||||
or force == True:
|
||||
debug_lock.acquire()
|
||||
print(color_purple + "[WARNING] " + input + color_default)
|
||||
debug_lock.release()
|
||||
|
||||
def todo(input, force=False):
|
||||
global debug_lock
|
||||
global debug_level
|
||||
if debug_level >= 3 \
|
||||
or force == True:
|
||||
debug_lock.acquire()
|
||||
print(color_purple + "[TODO] " + input + color_default)
|
||||
debug_lock.release()
|
||||
|
||||
def error(input, force=False, crash=True):
|
||||
global debug_lock
|
||||
global debug_level
|
||||
if debug_level >= 1 \
|
||||
or force == True:
|
||||
debug_lock.acquire()
|
||||
print(color_red + "[ERROR] " + input + color_default)
|
||||
debug_lock.release()
|
||||
if crash == True:
|
||||
exit(-1)
|
||||
|
||||
def print_element(type, lib, dir, name, force=False):
|
||||
global debug_lock
|
||||
global debug_level
|
||||
if debug_level >= 3 \
|
||||
or force == True:
|
||||
debug_lock.acquire()
|
||||
print(color_cyan + type + color_default + " : " + color_yellow + lib + color_default + " " + dir + " " + color_blue + name + color_default)
|
||||
debug_lock.release()
|
||||
|
||||
def print_compilator(myString):
|
||||
global debug_color
|
||||
global debug_lock
|
||||
if debug_color == True:
|
||||
myString = myString.replace('\\n', '\n')
|
||||
myString = myString.replace('\\t', '\t')
|
||||
myString = myString.replace('error:', color_red+'error:'+color_default)
|
||||
myString = myString.replace('warning:', color_purple+'warning:'+color_default)
|
||||
myString = myString.replace('note:', color_green+'note:'+color_default)
|
||||
myString = re.sub(r'([/\w_-]+\.\w+):', r'-COLORIN-\1-COLOROUT-:', myString)
|
||||
myString = myString.replace('-COLORIN-', color_yellow)
|
||||
myString = myString.replace('-COLOROUT-', color_default)
|
||||
|
||||
debug_lock.acquire()
|
||||
print(myString)
|
||||
debug_lock.release()
|
||||
|
||||
def get_color_set() :
|
||||
global color_default
|
||||
global color_red
|
||||
global color_green
|
||||
global color_yellow
|
||||
global color_blue
|
||||
global color_purple
|
||||
global color_cyan
|
||||
return {
|
||||
"default": color_default,
|
||||
"red": color_red,
|
||||
"green": color_green,
|
||||
"yellow": color_yellow,
|
||||
"blue": color_blue,
|
||||
"purple": color_purple,
|
||||
"cyan": color_cyan,
|
||||
}
|
2381
doxy/default_doxy_file.dox
Normal file
2381
doxy/default_doxy_file.dox
Normal file
File diff suppressed because it is too large
Load Diff
202
doxy/doxygen-bootstrapped/LICENSE
Normal file
202
doxy/doxygen-bootstrapped/LICENSE
Normal file
@ -0,0 +1,202 @@
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "{}"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright {yyyy} {name of copyright owner}
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
42
doxy/doxygen-bootstrapped/README.md
Normal file
42
doxy/doxygen-bootstrapped/README.md
Normal file
@ -0,0 +1,42 @@
|
||||
doxygen-bootstrapped
|
||||
===================
|
||||
|
||||
Customize doxygen (v1.8.9) output to use the twitter bootstrap framework (v3.3.1)
|
||||
|
||||
[Demo](https://biogearsengine.com/documentation/index.html)
|
||||
|
||||
This started as work done by CoActionOS and was extended further here.
|
||||
[Credit](http://coactionos.com/embedded%20design%20tips/2014/01/07/Tips-Integrating-Doxygen-and-Bootstrap/)
|
||||
|
||||
# Customizing Doxygen
|
||||
Doxygen provides a handful of ways to [customize the output](http://www.stack.nl/~dimitri/doxygen/manual/customize.html). The simplest way is to customize the HTML output.
|
||||
|
||||
Doxygen allows you to customize the HTML output by modifying a master HTML header, footer and stylesheet. You can then include additional stylesheets and javascript files. The following command will generate the default Doxygen files.
|
||||
|
||||
`doxygen -w html header.html footer.html customdoxygen.css`
|
||||
|
||||
Modifying these files alone is not enough to get good Twitter Bootstrap integration. Bootstrap requires that certain classes be applied within the HTML. For example, a Bootstrap “table” needs to have a class called “table” in order to apply the Bootstrap table formatting. We just need to augment the default HTML with these Bootstrap classes. To do this, we use the provided doxy-boot.js javascript file.
|
||||
|
||||
Also, you can augment doxygen’s default stylesheet with a customdoxygen.css stylesheet. This is where you would place any custom styling such as sticky footers.
|
||||
|
||||
# How to Integrate
|
||||
|
||||
To integrate this into your own project tell your doxyfile to use these 4 files in the HTML section (see the example site for an example of each file):
|
||||
|
||||
* HTML_HEADER=header.html
|
||||
* Adds a Bootstrap navbar
|
||||
* Wraps the content in a Bootstrap container/row
|
||||
* HTML_FOOTER=footer.html
|
||||
* Closes the extra divs opened in the header.html
|
||||
* HTML\_EXTRA_STYLESHEET=customdoxygen.css
|
||||
* Adds additional styling such as a sticky footer
|
||||
* HTML\_EXTRA_FILES=doxy-boot.js
|
||||
* Where the magic happens to augment the HTML with bootstrap
|
||||
|
||||
NOTE: The header.html file needs to include the Bootstrap css/javascript for this to work. This is where you can specify your own bootstrap compilation. These files will need to be manually added to the html directory, added as additional files in the doxyfile HTML\_EXTRA_FILES section or referenced externally (see example site header.html).
|
||||
|
||||
See the example-site directory for a minimal working example.
|
||||
|
||||
## Todo List
|
||||
* Menu is not correctly displayed when Doxygen sidebar is enabled.
|
||||
* Class index is incorrectly displayed.
|
353
doxy/doxygen-bootstrapped/customdoxygen.css
Normal file
353
doxy/doxygen-bootstrapped/customdoxygen.css
Normal file
@ -0,0 +1,353 @@
|
||||
h1, .h1, h2, .h2, h3, .h3{
|
||||
font-weight: 200 !important;
|
||||
}
|
||||
|
||||
#navrow1, #navrow2, #navrow3, #navrow4, #navrow5{
|
||||
border-bottom: 1px solid #EEEEEE;
|
||||
}
|
||||
|
||||
.adjust-right {
|
||||
margin-left: 30px !important;
|
||||
font-size: 1.15em !important;
|
||||
}
|
||||
.navbar{
|
||||
border: 0px solid #222 !important;
|
||||
}
|
||||
|
||||
|
||||
/* Sticky footer styles
|
||||
-------------------------------------------------- */
|
||||
html,
|
||||
body {
|
||||
height: 100%;
|
||||
/* The html and body elements cannot have any padding or margin. */
|
||||
}
|
||||
|
||||
/* Wrapper for page content to push down footer */
|
||||
#wrap {
|
||||
min-height: 100%;
|
||||
height: auto;
|
||||
/* Negative indent footer by its height */
|
||||
margin: 0 auto -60px;
|
||||
/* Pad bottom by footer height */
|
||||
padding: 0 0 60px;
|
||||
}
|
||||
|
||||
/* Set the fixed height of the footer here */
|
||||
#footer {
|
||||
font-size: 0.9em;
|
||||
padding: 8px 0px;
|
||||
background-color: #f5f5f5;
|
||||
}
|
||||
|
||||
.footer-row {
|
||||
line-height: 44px;
|
||||
}
|
||||
|
||||
#footer > .container {
|
||||
padding-left: 15px;
|
||||
padding-right: 15px;
|
||||
}
|
||||
|
||||
.footer-follow-icon {
|
||||
margin-left: 3px;
|
||||
text-decoration: none !important;
|
||||
}
|
||||
|
||||
.footer-follow-icon img {
|
||||
width: 20px;
|
||||
}
|
||||
|
||||
.footer-link {
|
||||
padding-top: 5px;
|
||||
display: inline-block;
|
||||
color: #999999;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.footer-copyright {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
|
||||
@media (min-width: 992px) {
|
||||
.footer-row {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.footer-icons {
|
||||
text-align: right;
|
||||
}
|
||||
}
|
||||
@media (max-width: 991px) {
|
||||
.footer-row {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.footer-icons {
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
/* DOXYGEN Code Styles
|
||||
----------------------------------- */
|
||||
|
||||
|
||||
a.qindex {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
a.qindexHL {
|
||||
font-weight: bold;
|
||||
background-color: #9CAFD4;
|
||||
color: #ffffff;
|
||||
border: 1px double #869DCA;
|
||||
}
|
||||
|
||||
.contents a.qindexHL:visited {
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
a.code, a.code:visited, a.line, a.line:visited {
|
||||
color: #4665A2;
|
||||
}
|
||||
|
||||
a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited {
|
||||
color: #4665A2;
|
||||
}
|
||||
|
||||
/* @end */
|
||||
|
||||
dl.el {
|
||||
margin-left: -1cm;
|
||||
}
|
||||
|
||||
pre.fragment {
|
||||
border: 1px solid #C4CFE5;
|
||||
background-color: #FBFCFD;
|
||||
padding: 4px 6px;
|
||||
margin: 4px 8px 4px 2px;
|
||||
overflow: auto;
|
||||
word-wrap: break-word;
|
||||
font-size: 9pt;
|
||||
line-height: 125%;
|
||||
font-family: monospace, fixed;
|
||||
font-size: 105%;
|
||||
}
|
||||
|
||||
div.fragment {
|
||||
padding: 4px 6px;
|
||||
margin: 4px 8px 4px 2px;
|
||||
border: 1px solid #C4CFE5;
|
||||
}
|
||||
|
||||
div.line {
|
||||
font-family: monospace, fixed;
|
||||
font-size: 13px;
|
||||
min-height: 13px;
|
||||
line-height: 1.0;
|
||||
text-wrap: unrestricted;
|
||||
white-space: -moz-pre-wrap; /* Moz */
|
||||
white-space: -pre-wrap; /* Opera 4-6 */
|
||||
white-space: -o-pre-wrap; /* Opera 7 */
|
||||
white-space: pre-wrap; /* CSS3 */
|
||||
word-wrap: break-word; /* IE 5.5+ */
|
||||
text-indent: -53px;
|
||||
padding-left: 53px;
|
||||
padding-bottom: 0px;
|
||||
margin: 0px;
|
||||
-webkit-transition-property: background-color, box-shadow;
|
||||
-webkit-transition-duration: 0.5s;
|
||||
-moz-transition-property: background-color, box-shadow;
|
||||
-moz-transition-duration: 0.5s;
|
||||
-ms-transition-property: background-color, box-shadow;
|
||||
-ms-transition-duration: 0.5s;
|
||||
-o-transition-property: background-color, box-shadow;
|
||||
-o-transition-duration: 0.5s;
|
||||
transition-property: background-color, box-shadow;
|
||||
transition-duration: 0.5s;
|
||||
}
|
||||
|
||||
div.line.glow {
|
||||
background-color: cyan;
|
||||
box-shadow: 0 0 10px cyan;
|
||||
}
|
||||
|
||||
|
||||
span.lineno {
|
||||
padding-right: 4px;
|
||||
text-align: right;
|
||||
border-right: 2px solid #0F0;
|
||||
background-color: #E8E8E8;
|
||||
white-space: pre;
|
||||
}
|
||||
span.lineno a {
|
||||
background-color: #D8D8D8;
|
||||
}
|
||||
|
||||
span.lineno a:hover {
|
||||
background-color: #C8C8C8;
|
||||
}
|
||||
|
||||
div.groupHeader {
|
||||
margin-left: 16px;
|
||||
margin-top: 12px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
div.groupText {
|
||||
margin-left: 16px;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/* @group Code Colorization */
|
||||
|
||||
span.keyword {
|
||||
color: #008000
|
||||
}
|
||||
|
||||
span.keywordtype {
|
||||
color: #604020
|
||||
}
|
||||
|
||||
span.keywordflow {
|
||||
color: #e08000
|
||||
}
|
||||
|
||||
span.comment {
|
||||
color: #800000
|
||||
}
|
||||
|
||||
span.preprocessor {
|
||||
color: #806020
|
||||
}
|
||||
|
||||
span.stringliteral {
|
||||
color: #002080
|
||||
}
|
||||
|
||||
span.charliteral {
|
||||
color: #008080
|
||||
}
|
||||
|
||||
span.vhdldigit {
|
||||
color: #ff00ff
|
||||
}
|
||||
|
||||
span.vhdlchar {
|
||||
color: #000000
|
||||
}
|
||||
|
||||
span.vhdlkeyword {
|
||||
color: #700070
|
||||
}
|
||||
|
||||
span.vhdllogic {
|
||||
color: #ff0000
|
||||
}
|
||||
|
||||
blockquote {
|
||||
background-color: #F7F8FB;
|
||||
border-left: 2px solid #9CAFD4;
|
||||
margin: 0 24px 0 4px;
|
||||
padding: 0 12px 0 16px;
|
||||
}
|
||||
|
||||
/*---------------- Search Box */
|
||||
|
||||
#search-box {
|
||||
margin: 10px 0px;
|
||||
}
|
||||
#search-box .close {
|
||||
display: none;
|
||||
position: absolute;
|
||||
right: 0px;
|
||||
padding: 6px 12px;
|
||||
z-index: 5;
|
||||
}
|
||||
|
||||
/*---------------- Search results window */
|
||||
|
||||
#search-results-window {
|
||||
display: none;
|
||||
}
|
||||
|
||||
iframe#MSearchResults {
|
||||
width: 100%;
|
||||
height: 15em;
|
||||
}
|
||||
|
||||
.SRChildren {
|
||||
padding-left: 3ex; padding-bottom: .5em
|
||||
}
|
||||
.SRPage .SRChildren {
|
||||
display: none;
|
||||
}
|
||||
a.SRScope {
|
||||
display: block;
|
||||
}
|
||||
a.SRSymbol:focus, a.SRSymbol:active,
|
||||
a.SRScope:focus, a.SRScope:active {
|
||||
text-decoration: underline;
|
||||
}
|
||||
span.SRScope {
|
||||
padding-left: 4px;
|
||||
}
|
||||
.SRResult {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* class and file list */
|
||||
.directory .icona,
|
||||
.directory .arrow {
|
||||
height: auto;
|
||||
}
|
||||
.directory .icona .icon {
|
||||
height: 16px;
|
||||
}
|
||||
.directory .icondoc {
|
||||
background-position: 0px 0px;
|
||||
height: 20px;
|
||||
}
|
||||
.directory .iconfopen {
|
||||
background-position: 0px 0px;
|
||||
}
|
||||
.directory td.entry {
|
||||
padding: 7px 8px 6px 8px;
|
||||
}
|
||||
|
||||
.table > tbody > tr > td.memSeparator {
|
||||
line-height: 0;
|
||||
}
|
||||
.memItemLeft, .memTemplItemLeft {
|
||||
white-space: normal;
|
||||
}
|
||||
|
||||
/* enumerations */
|
||||
.panel-body thead > tr {
|
||||
background-color: #e0e0e0;
|
||||
}
|
||||
|
||||
/* todo lists */
|
||||
.todoname,
|
||||
.todoname a {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* Class title */
|
||||
.summary {
|
||||
margin-top: 25px;
|
||||
}
|
||||
.page-header {
|
||||
margin: 20px 0px !important;
|
||||
}
|
||||
.page-header .title {
|
||||
display: inline-block;
|
||||
}
|
||||
.page-header .pull-right {
|
||||
margin-top: 0.3em;
|
||||
margin-left: 0.5em;
|
||||
}
|
||||
.page-header .label {
|
||||
font-size: 50%;
|
||||
}
|
260
doxy/doxygen-bootstrapped/doxy-boot.js
Normal file
260
doxy/doxygen-bootstrapped/doxy-boot.js
Normal file
@ -0,0 +1,260 @@
|
||||
$( document ).ready(function() {
|
||||
|
||||
$("div.headertitle").addClass("page-header");
|
||||
$("div.title").addClass("h1");
|
||||
|
||||
$('li > a[href="index.html"] > span').before("<i class='fa fa-cog'></i> ");
|
||||
$('li > a[href="modules.html"] > span').before("<i class='fa fa-square'></i> ");
|
||||
$('li > a[href="namespaces.html"] > span').before("<i class='fa fa-bars'></i> ");
|
||||
$('li > a[href="annotated.html"] > span').before("<i class='fa fa-list-ul'></i> ");
|
||||
$('li > a[href="classes.html"] > span').before("<i class='fa fa-book'></i> ");
|
||||
$('li > a[href="inherits.html"] > span').before("<i class='fa fa-sitemap'></i> ");
|
||||
$('li > a[href="functions.html"] > span').before("<i class='fa fa-list'></i> ");
|
||||
$('li > a[href="functions_func.html"] > span').before("<i class='fa fa-list'></i> ");
|
||||
$('li > a[href="functions_vars.html"] > span').before("<i class='fa fa-list'></i> ");
|
||||
$('li > a[href="functions_enum.html"] > span').before("<i class='fa fa-list'></i> ");
|
||||
$('li > a[href="functions_eval.html"] > span').before("<i class='fa fa-list'></i> ");
|
||||
$('img[src="ftv2ns.png"]').replaceWith('<span class="label label-danger">N</span> ');
|
||||
$('img[src="ftv2cl.png"]').replaceWith('<span class="label label-danger">C</span> ');
|
||||
|
||||
$("ul.tablist").addClass("nav nav-pills nav-justified");
|
||||
$("ul.tablist").css("margin-top", "0.5em");
|
||||
$("ul.tablist").css("margin-bottom", "0.5em");
|
||||
$("li.current").addClass("active");
|
||||
$("iframe").attr("scrolling", "yes");
|
||||
|
||||
$("#nav-path > ul").addClass("breadcrumb");
|
||||
|
||||
$("table.params").addClass("table");
|
||||
$("div.ingroups").wrapInner("<small></small>");
|
||||
$("div.levels").css("margin", "0.5em");
|
||||
$("div.levels > span").addClass("btn btn-default btn-xs");
|
||||
$("div.levels > span").css("margin-right", "0.25em");
|
||||
|
||||
$("table.directory").addClass("table table-striped");
|
||||
$("div.summary > a").addClass("btn btn-default btn-xs");
|
||||
$("table.fieldtable").addClass("table");
|
||||
$(".fragment").addClass("well");
|
||||
$(".memitem").addClass("panel panel-default");
|
||||
$(".memproto").addClass("panel-heading");
|
||||
$(".memdoc").addClass("panel-body");
|
||||
$("span.mlabel").addClass("label label-info");
|
||||
|
||||
$("table.memberdecls").addClass("table");
|
||||
$("[class^=memitem]").addClass("active");
|
||||
|
||||
$("div.ah").addClass("btn btn-default");
|
||||
$("span.mlabels").addClass("pull-right");
|
||||
$("table.mlabels").css("width", "100%")
|
||||
$("td.mlabels-right").addClass("pull-right");
|
||||
|
||||
$("div.ttc").addClass("panel panel-primary");
|
||||
$("div.ttname").addClass("panel-heading");
|
||||
$("div.ttname a").css("color", 'white');
|
||||
$("div.ttdef,div.ttdoc,div.ttdeci").addClass("panel-body");
|
||||
|
||||
$('div.fragment.well div.line:first').css('margin-top', '15px');
|
||||
$('div.fragment.well div.line:last').css('margin-bottom', '15px');
|
||||
|
||||
$('table.doxtable').removeClass('doxtable').addClass('table table-striped table-bordered').each(function(){
|
||||
$(this).prepend('<thead></thead>');
|
||||
$(this).find('tbody > tr:first').prependTo($(this).find('thead'));
|
||||
|
||||
$(this).find('td > span.success').parent().addClass('success');
|
||||
$(this).find('td > span.warning').parent().addClass('warning');
|
||||
$(this).find('td > span.danger').parent().addClass('danger');
|
||||
});
|
||||
|
||||
|
||||
|
||||
if($('div.fragment.well div.ttc').length > 0)
|
||||
{
|
||||
$('div.fragment.well div.line:first').parent().removeClass('fragment well');
|
||||
}
|
||||
|
||||
$('table.memberdecls').find('.memItemRight').each(function(){
|
||||
$(this).contents().appendTo($(this).siblings('.memItemLeft'));
|
||||
$(this).siblings('.memItemLeft').attr('align', 'left');
|
||||
});
|
||||
|
||||
function getOriginalWidthOfImg(img_element) {
|
||||
var t = new Image();
|
||||
t.src = (img_element.getAttribute ? img_element.getAttribute("src") : false) || img_element.src;
|
||||
return t.width;
|
||||
}
|
||||
|
||||
$('div.dyncontent').find('img').each(function(){
|
||||
if(getOriginalWidthOfImg($(this)[0]) > $('#content>div.container').width())
|
||||
$(this).css('width', '100%');
|
||||
});
|
||||
|
||||
|
||||
/* responsive search box */
|
||||
|
||||
$('#MSearchBox').parent().remove();
|
||||
|
||||
var nav_container = $('<div class="row"></div>');
|
||||
$('#navrow1').parent().prepend(nav_container);
|
||||
|
||||
var left_nav = $('<div class="col-md-9"></div>');
|
||||
for (i = 0; i < 6; i++) {
|
||||
var navrow = $('#navrow' + i + ' > ul.tablist').detach();
|
||||
left_nav.append(navrow);
|
||||
$('#navrow' + i).remove();
|
||||
}
|
||||
var right_nav = $('<div class="col-md-3"></div>').append('\
|
||||
<div id="search-box" class="input-group">\
|
||||
<div class="input-group-btn">\
|
||||
<button aria-expanded="false" type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">\
|
||||
<span class="glyphicon glyphicon-search"></span> <span class="caret"></span>\
|
||||
</button>\
|
||||
<ul class="dropdown-menu">\
|
||||
</ul>\
|
||||
</div>\
|
||||
<button id="search-close" type="button" class="close" aria-label="Close"><span aria-hidden="true">×</span></button>\
|
||||
<input id="search-field" class="form-control" accesskey="S" onkeydown="searchBox.OnSearchFieldChange(event);" placeholder="Search ..." type="text">\
|
||||
</div>');
|
||||
$(nav_container).append(left_nav);
|
||||
$(nav_container).append(right_nav);
|
||||
|
||||
$('#MSearchSelectWindow .SelectionMark').remove();
|
||||
var search_selectors = $('#MSearchSelectWindow .SelectItem');
|
||||
for (var i = 0; i < search_selectors.length; i += 1) {
|
||||
var element_a = $('<a href="#"></a>').text($(search_selectors[i]).text());
|
||||
|
||||
element_a.click(function(){
|
||||
$('#search-box .dropdown-menu li').removeClass('active');
|
||||
$(this).parent().addClass('active');
|
||||
searchBox.OnSelectItem($('#search-box li a').index(this));
|
||||
searchBox.Search();
|
||||
return false;
|
||||
});
|
||||
|
||||
var element = $('<li></li>').append(element_a);
|
||||
$('#search-box .dropdown-menu').append(element);
|
||||
}
|
||||
$('#MSearchSelectWindow').remove();
|
||||
|
||||
$('#search-box .close').click(function (){
|
||||
searchBox.CloseResultsWindow();
|
||||
});
|
||||
|
||||
$('body').append('<div id="MSearchClose"></div>');
|
||||
$('body').append('<div id="MSearchBox"></div>');
|
||||
$('body').append('<div id="MSearchSelectWindow"></div>');
|
||||
|
||||
searchBox.searchLabel = '';
|
||||
searchBox.DOMSearchField = function() {
|
||||
return document.getElementById("search-field");
|
||||
}
|
||||
searchBox.DOMSearchClose = function(){
|
||||
return document.getElementById("search-close");
|
||||
}
|
||||
|
||||
|
||||
/* search results */
|
||||
var results_iframe = $('#MSearchResults').detach();
|
||||
$('#MSearchResultsWindow')
|
||||
.attr('id', 'search-results-window')
|
||||
.addClass('panel panel-default')
|
||||
.append(
|
||||
'<div class="panel-heading">\
|
||||
<h3 class="panel-title">Search Results</h3>\
|
||||
</div>\
|
||||
<div class="panel-body"></div>'
|
||||
);
|
||||
$('#search-results-window .panel-body').append(results_iframe);
|
||||
|
||||
searchBox.DOMPopupSearchResultsWindow = function() {
|
||||
return document.getElementById("search-results-window");
|
||||
}
|
||||
|
||||
function update_search_results_window() {
|
||||
$('#search-results-window').removeClass('panel-default panel-success panel-warning panel-danger')
|
||||
var status = $('#MSearchResults').contents().find('.SRStatus:visible');
|
||||
if (status.length > 0) {
|
||||
switch(status.attr('id')) {
|
||||
case 'Loading':
|
||||
case 'Searching':
|
||||
$('#search-results-window').addClass('panel-warning');
|
||||
break;
|
||||
case 'NoMatches':
|
||||
$('#search-results-window').addClass('panel-danger');
|
||||
break;
|
||||
default:
|
||||
$('#search-results-window').addClass('panel-default');
|
||||
}
|
||||
} else {
|
||||
$('#search-results-window').addClass('panel-success');
|
||||
}
|
||||
}
|
||||
$('#MSearchResults').load(function() {
|
||||
$('#MSearchResults').contents().find('link[href="search.css"]').attr('href','../doxygen.css');
|
||||
$('#MSearchResults').contents().find('head').append(
|
||||
'<link href="../customdoxygen.css" rel="stylesheet" type="text/css">');
|
||||
|
||||
update_search_results_window();
|
||||
|
||||
// detect status changes (only for search with external search backend)
|
||||
var observer = new MutationObserver(function(mutations) {
|
||||
update_search_results_window();
|
||||
});
|
||||
var config = { attributes: true};
|
||||
|
||||
var targets = $('#MSearchResults').contents().find('.SRStatus');
|
||||
for (i = 0; i < targets.length; i++) {
|
||||
observer.observe(targets[i], config);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
/* enumerations */
|
||||
$('table.fieldtable').removeClass('fieldtable').addClass('table table-striped table-bordered').each(function(){
|
||||
$(this).prepend('<thead></thead>');
|
||||
$(this).find('tbody > tr:first').prependTo($(this).find('thead'));
|
||||
|
||||
$(this).find('td > span.success').parent().addClass('success');
|
||||
$(this).find('td > span.warning').parent().addClass('warning');
|
||||
$(this).find('td > span.danger').parent().addClass('danger');
|
||||
});
|
||||
|
||||
/* todo list */
|
||||
var todoelements = $('.contents > .textblock > dl.reflist > dt, .contents > .textblock > dl.reflist > dd');
|
||||
for (var i = 0; i < todoelements.length; i += 2) {
|
||||
$('.contents > .textblock').append(
|
||||
'<div class="panel panel-default active">'
|
||||
+ "<div class=\"panel-heading todoname\">" + $(todoelements[i]).html() + "</div>"
|
||||
+ "<div class=\"panel-body\">" + $(todoelements[i+1]).html() + "</div>"
|
||||
+ '</div>');
|
||||
}
|
||||
$('.contents > .textblock > dl').remove();
|
||||
|
||||
|
||||
$(".memitem").removeClass('memitem');
|
||||
$(".memproto").removeClass('memproto');
|
||||
$(".memdoc").removeClass('memdoc');
|
||||
$("span.mlabel").removeClass('mlabel');
|
||||
$("table.memberdecls").removeClass('memberdecls');
|
||||
$("[class^=memitem]").removeClass('memitem');
|
||||
$("span.mlabels").removeClass('mlabels');
|
||||
$("table.mlabels").removeClass('mlabels');
|
||||
$("td.mlabels-right").removeClass('mlabels-right');
|
||||
$(".navpath").removeClass('navpath');
|
||||
$("li.navelem").removeClass('navelem');
|
||||
$("a.el").removeClass('el');
|
||||
$("div.ah").removeClass('ah');
|
||||
$("div.header").removeClass("header");
|
||||
|
||||
$('.mdescLeft').each(function(){
|
||||
if($(this).html()==" ") {
|
||||
$(this).siblings('.mdescRight').attr('colspan', 2);
|
||||
$(this).remove();
|
||||
}
|
||||
});
|
||||
$('td.memItemLeft').each(function(){
|
||||
if($(this).siblings('.memItemRight').html()=="") {
|
||||
$(this).attr('colspan', 2);
|
||||
$(this).siblings('.memItemRight').remove();
|
||||
}
|
||||
});
|
||||
});
|
3
doxy/doxygen-bootstrapped/example-site/.gitignore
vendored
Normal file
3
doxy/doxygen-bootstrapped/example-site/.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
# Ignore generated Doxygen
|
||||
Docs/html/*
|
||||
!Docs/html/doxy-boot.js
|
260
doxy/doxygen-bootstrapped/example-site/Docs/html/doxy-boot.js
Normal file
260
doxy/doxygen-bootstrapped/example-site/Docs/html/doxy-boot.js
Normal file
@ -0,0 +1,260 @@
|
||||
$( document ).ready(function() {
|
||||
|
||||
$("div.headertitle").addClass("page-header");
|
||||
$("div.title").addClass("h1");
|
||||
|
||||
$('li > a[href="index.html"] > span').before("<i class='fa fa-cog'></i> ");
|
||||
$('li > a[href="modules.html"] > span').before("<i class='fa fa-square'></i> ");
|
||||
$('li > a[href="namespaces.html"] > span').before("<i class='fa fa-bars'></i> ");
|
||||
$('li > a[href="annotated.html"] > span').before("<i class='fa fa-list-ul'></i> ");
|
||||
$('li > a[href="classes.html"] > span').before("<i class='fa fa-book'></i> ");
|
||||
$('li > a[href="inherits.html"] > span').before("<i class='fa fa-sitemap'></i> ");
|
||||
$('li > a[href="functions.html"] > span').before("<i class='fa fa-list'></i> ");
|
||||
$('li > a[href="functions_func.html"] > span').before("<i class='fa fa-list'></i> ");
|
||||
$('li > a[href="functions_vars.html"] > span').before("<i class='fa fa-list'></i> ");
|
||||
$('li > a[href="functions_enum.html"] > span').before("<i class='fa fa-list'></i> ");
|
||||
$('li > a[href="functions_eval.html"] > span').before("<i class='fa fa-list'></i> ");
|
||||
$('img[src="ftv2ns.png"]').replaceWith('<span class="label label-danger">N</span> ');
|
||||
$('img[src="ftv2cl.png"]').replaceWith('<span class="label label-danger">C</span> ');
|
||||
|
||||
$("ul.tablist").addClass("nav nav-pills nav-justified");
|
||||
$("ul.tablist").css("margin-top", "0.5em");
|
||||
$("ul.tablist").css("margin-bottom", "0.5em");
|
||||
$("li.current").addClass("active");
|
||||
$("iframe").attr("scrolling", "yes");
|
||||
|
||||
$("#nav-path > ul").addClass("breadcrumb");
|
||||
|
||||
$("table.params").addClass("table");
|
||||
$("div.ingroups").wrapInner("<small></small>");
|
||||
$("div.levels").css("margin", "0.5em");
|
||||
$("div.levels > span").addClass("btn btn-default btn-xs");
|
||||
$("div.levels > span").css("margin-right", "0.25em");
|
||||
|
||||
$("table.directory").addClass("table table-striped");
|
||||
$("div.summary > a").addClass("btn btn-default btn-xs");
|
||||
$("table.fieldtable").addClass("table");
|
||||
$(".fragment").addClass("well");
|
||||
$(".memitem").addClass("panel panel-default");
|
||||
$(".memproto").addClass("panel-heading");
|
||||
$(".memdoc").addClass("panel-body");
|
||||
$("span.mlabel").addClass("label label-info");
|
||||
|
||||
$("table.memberdecls").addClass("table");
|
||||
$("[class^=memitem]").addClass("active");
|
||||
|
||||
$("div.ah").addClass("btn btn-default");
|
||||
$("span.mlabels").addClass("pull-right");
|
||||
$("table.mlabels").css("width", "100%")
|
||||
$("td.mlabels-right").addClass("pull-right");
|
||||
|
||||
$("div.ttc").addClass("panel panel-primary");
|
||||
$("div.ttname").addClass("panel-heading");
|
||||
$("div.ttname a").css("color", 'white');
|
||||
$("div.ttdef,div.ttdoc,div.ttdeci").addClass("panel-body");
|
||||
|
||||
$('div.fragment.well div.line:first').css('margin-top', '15px');
|
||||
$('div.fragment.well div.line:last').css('margin-bottom', '15px');
|
||||
|
||||
$('table.doxtable').removeClass('doxtable').addClass('table table-striped table-bordered').each(function(){
|
||||
$(this).prepend('<thead></thead>');
|
||||
$(this).find('tbody > tr:first').prependTo($(this).find('thead'));
|
||||
|
||||
$(this).find('td > span.success').parent().addClass('success');
|
||||
$(this).find('td > span.warning').parent().addClass('warning');
|
||||
$(this).find('td > span.danger').parent().addClass('danger');
|
||||
});
|
||||
|
||||
|
||||
|
||||
if($('div.fragment.well div.ttc').length > 0)
|
||||
{
|
||||
$('div.fragment.well div.line:first').parent().removeClass('fragment well');
|
||||
}
|
||||
|
||||
$('table.memberdecls').find('.memItemRight').each(function(){
|
||||
$(this).contents().appendTo($(this).siblings('.memItemLeft'));
|
||||
$(this).siblings('.memItemLeft').attr('align', 'left');
|
||||
});
|
||||
|
||||
function getOriginalWidthOfImg(img_element) {
|
||||
var t = new Image();
|
||||
t.src = (img_element.getAttribute ? img_element.getAttribute("src") : false) || img_element.src;
|
||||
return t.width;
|
||||
}
|
||||
|
||||
$('div.dyncontent').find('img').each(function(){
|
||||
if(getOriginalWidthOfImg($(this)[0]) > $('#content>div.container').width())
|
||||
$(this).css('width', '100%');
|
||||
});
|
||||
|
||||
|
||||
/* responsive search box */
|
||||
|
||||
$('#MSearchBox').parent().remove();
|
||||
|
||||
var nav_container = $('<div class="row"></div>');
|
||||
$('#navrow1').parent().prepend(nav_container);
|
||||
|
||||
var left_nav = $('<div class="col-md-9"></div>');
|
||||
for (i = 0; i < 6; i++) {
|
||||
var navrow = $('#navrow' + i + ' > ul.tablist').detach();
|
||||
left_nav.append(navrow);
|
||||
$('#navrow' + i).remove();
|
||||
}
|
||||
var right_nav = $('<div class="col-md-3"></div>').append('\
|
||||
<div id="search-box" class="input-group">\
|
||||
<div class="input-group-btn">\
|
||||
<button aria-expanded="false" type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">\
|
||||
<span class="glyphicon glyphicon-search"></span> <span class="caret"></span>\
|
||||
</button>\
|
||||
<ul class="dropdown-menu">\
|
||||
</ul>\
|
||||
</div>\
|
||||
<button id="search-close" type="button" class="close" aria-label="Close"><span aria-hidden="true">×</span></button>\
|
||||
<input id="search-field" class="form-control" accesskey="S" onkeydown="searchBox.OnSearchFieldChange(event);" placeholder="Search ..." type="text">\
|
||||
</div>');
|
||||
$(nav_container).append(left_nav);
|
||||
$(nav_container).append(right_nav);
|
||||
|
||||
$('#MSearchSelectWindow .SelectionMark').remove();
|
||||
var search_selectors = $('#MSearchSelectWindow .SelectItem');
|
||||
for (var i = 0; i < search_selectors.length; i += 1) {
|
||||
var element_a = $('<a href="#"></a>').text($(search_selectors[i]).text());
|
||||
|
||||
element_a.click(function(){
|
||||
$('#search-box .dropdown-menu li').removeClass('active');
|
||||
$(this).parent().addClass('active');
|
||||
searchBox.OnSelectItem($('#search-box li a').index(this));
|
||||
searchBox.Search();
|
||||
return false;
|
||||
});
|
||||
|
||||
var element = $('<li></li>').append(element_a);
|
||||
$('#search-box .dropdown-menu').append(element);
|
||||
}
|
||||
$('#MSearchSelectWindow').remove();
|
||||
|
||||
$('#search-box .close').click(function (){
|
||||
searchBox.CloseResultsWindow();
|
||||
});
|
||||
|
||||
$('body').append('<div id="MSearchClose"></div>');
|
||||
$('body').append('<div id="MSearchBox"></div>');
|
||||
$('body').append('<div id="MSearchSelectWindow"></div>');
|
||||
|
||||
searchBox.searchLabel = '';
|
||||
searchBox.DOMSearchField = function() {
|
||||
return document.getElementById("search-field");
|
||||
}
|
||||
searchBox.DOMSearchClose = function(){
|
||||
return document.getElementById("search-close");
|
||||
}
|
||||
|
||||
|
||||
/* search results */
|
||||
var results_iframe = $('#MSearchResults').detach();
|
||||
$('#MSearchResultsWindow')
|
||||
.attr('id', 'search-results-window')
|
||||
.addClass('panel panel-default')
|
||||
.append(
|
||||
'<div class="panel-heading">\
|
||||
<h3 class="panel-title">Search Results</h3>\
|
||||
</div>\
|
||||
<div class="panel-body"></div>'
|
||||
);
|
||||
$('#search-results-window .panel-body').append(results_iframe);
|
||||
|
||||
searchBox.DOMPopupSearchResultsWindow = function() {
|
||||
return document.getElementById("search-results-window");
|
||||
}
|
||||
|
||||
function update_search_results_window() {
|
||||
$('#search-results-window').removeClass('panel-default panel-success panel-warning panel-danger')
|
||||
var status = $('#MSearchResults').contents().find('.SRStatus:visible');
|
||||
if (status.length > 0) {
|
||||
switch(status.attr('id')) {
|
||||
case 'Loading':
|
||||
case 'Searching':
|
||||
$('#search-results-window').addClass('panel-warning');
|
||||
break;
|
||||
case 'NoMatches':
|
||||
$('#search-results-window').addClass('panel-danger');
|
||||
break;
|
||||
default:
|
||||
$('#search-results-window').addClass('panel-default');
|
||||
}
|
||||
} else {
|
||||
$('#search-results-window').addClass('panel-success');
|
||||
}
|
||||
}
|
||||
$('#MSearchResults').load(function() {
|
||||
$('#MSearchResults').contents().find('link[href="search.css"]').attr('href','../doxygen.css');
|
||||
$('#MSearchResults').contents().find('head').append(
|
||||
'<link href="../customdoxygen.css" rel="stylesheet" type="text/css">');
|
||||
|
||||
update_search_results_window();
|
||||
|
||||
// detect status changes (only for search with external search backend)
|
||||
var observer = new MutationObserver(function(mutations) {
|
||||
update_search_results_window();
|
||||
});
|
||||
var config = { attributes: true};
|
||||
|
||||
var targets = $('#MSearchResults').contents().find('.SRStatus');
|
||||
for (i = 0; i < targets.length; i++) {
|
||||
observer.observe(targets[i], config);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
/* enumerations */
|
||||
$('table.fieldtable').removeClass('fieldtable').addClass('table table-striped table-bordered').each(function(){
|
||||
$(this).prepend('<thead></thead>');
|
||||
$(this).find('tbody > tr:first').prependTo($(this).find('thead'));
|
||||
|
||||
$(this).find('td > span.success').parent().addClass('success');
|
||||
$(this).find('td > span.warning').parent().addClass('warning');
|
||||
$(this).find('td > span.danger').parent().addClass('danger');
|
||||
});
|
||||
|
||||
/* todo list */
|
||||
var todoelements = $('.contents > .textblock > dl.reflist > dt, .contents > .textblock > dl.reflist > dd');
|
||||
for (var i = 0; i < todoelements.length; i += 2) {
|
||||
$('.contents > .textblock').append(
|
||||
'<div class="panel panel-default active">'
|
||||
+ "<div class=\"panel-heading todoname\">" + $(todoelements[i]).html() + "</div>"
|
||||
+ "<div class=\"panel-body\">" + $(todoelements[i+1]).html() + "</div>"
|
||||
+ '</div>');
|
||||
}
|
||||
$('.contents > .textblock > dl').remove();
|
||||
|
||||
|
||||
$(".memitem").removeClass('memitem');
|
||||
$(".memproto").removeClass('memproto');
|
||||
$(".memdoc").removeClass('memdoc');
|
||||
$("span.mlabel").removeClass('mlabel');
|
||||
$("table.memberdecls").removeClass('memberdecls');
|
||||
$("[class^=memitem]").removeClass('memitem');
|
||||
$("span.mlabels").removeClass('mlabels');
|
||||
$("table.mlabels").removeClass('mlabels');
|
||||
$("td.mlabels-right").removeClass('mlabels-right');
|
||||
$(".navpath").removeClass('navpath');
|
||||
$("li.navelem").removeClass('navelem');
|
||||
$("a.el").removeClass('el');
|
||||
$("div.ah").removeClass('ah');
|
||||
$("div.header").removeClass("header");
|
||||
|
||||
$('.mdescLeft').each(function(){
|
||||
if($(this).html()==" ") {
|
||||
$(this).siblings('.mdescRight').attr('colspan', 2);
|
||||
$(this).remove();
|
||||
}
|
||||
});
|
||||
$('td.memItemLeft').each(function(){
|
||||
if($(this).siblings('.memItemRight').html()=="") {
|
||||
$(this).attr('colspan', 2);
|
||||
$(this).siblings('.memItemRight').remove();
|
||||
}
|
||||
});
|
||||
});
|
2435
doxy/doxygen-bootstrapped/example-site/Doxyfile
Normal file
2435
doxy/doxygen-bootstrapped/example-site/Doxyfile
Normal file
File diff suppressed because it is too large
Load Diff
20
doxy/doxygen-bootstrapped/example-site/README.md
Normal file
20
doxy/doxygen-bootstrapped/example-site/README.md
Normal file
@ -0,0 +1,20 @@
|
||||
# Example project
|
||||
|
||||
This is a minimal working example to get you started.
|
||||
|
||||
## How to run this example
|
||||
|
||||
Run:
|
||||
|
||||
doxygen Doxyfile
|
||||
|
||||
within this folder and the documentation for this minimal example will be generated in Doc/html.
|
||||
|
||||
## How to Integrate
|
||||
|
||||
This example uses the provided header and footer as well as the root projects customdoxygen.css and doxyboot.js files.
|
||||
|
||||
* HTML_HEADER=header.html
|
||||
* HTML_FOOTER=footer.html
|
||||
* HTML\_EXTRA_STYLESHEET=../customdoxygen.css
|
||||
* HTML\_EXTRA_FILES=../doxy-boot.js
|
26
doxy/doxygen-bootstrapped/example-site/footer.html
Normal file
26
doxy/doxygen-bootstrapped/example-site/footer.html
Normal file
@ -0,0 +1,26 @@
|
||||
<!-- HTML footer for doxygen 1.8.8-->
|
||||
<!-- start footer part -->
|
||||
<!--BEGIN GENERATE_TREEVIEW-->
|
||||
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
|
||||
<ul>
|
||||
$navpath
|
||||
<li class="footer">$generatedby
|
||||
<a href="http://www.doxygen.org/index.html">
|
||||
<img class="footer" src="$relpath^doxygen.png" alt="doxygen"/></a> $doxygenversion </li>
|
||||
</ul>
|
||||
</div>
|
||||
<!--END GENERATE_TREEVIEW-->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!--BEGIN !GENERATE_TREEVIEW-->
|
||||
<hr class="footer"/><address class="footer"><small>
|
||||
$generatedby  <a href="http://www.doxygen.org/index.html">
|
||||
<img class="footer" src="$relpath^doxygen.png" alt="doxygen"/>
|
||||
</a> $doxygenversion
|
||||
</small></address>
|
||||
<!--END !GENERATE_TREEVIEW-->
|
||||
</body>
|
||||
</html>
|
42
doxy/doxygen-bootstrapped/example-site/header.html
Normal file
42
doxy/doxygen-bootstrapped/example-site/header.html
Normal file
@ -0,0 +1,42 @@
|
||||
<!-- HTML header for doxygen 1.8.8-->
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<!-- For Mobile Devices -->
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
|
||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
||||
<meta name="generator" content="Doxygen $doxygenversion"/>
|
||||
|
||||
<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
|
||||
|
||||
<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
|
||||
<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->
|
||||
<!--<link href="$relpath^tabs.css" rel="stylesheet" type="text/css"/>-->
|
||||
<script type="text/javascript" src="$relpath^dynsections.js"></script>
|
||||
$treeview
|
||||
$search
|
||||
$mathjax
|
||||
<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
|
||||
$extrastylesheet
|
||||
|
||||
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css">
|
||||
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/js/bootstrap.min.js"></script>
|
||||
<script type="text/javascript" src="$relpath^doxy-boot.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<nav class="navbar navbar-default" role="navigation">
|
||||
<div class="container">
|
||||
<div class="navbar-header">
|
||||
<a class="navbar-brand">$projectname $projectnumber</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
||||
<div class="content" id="content">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-sm-12 panel panel-default" style="padding-bottom: 15px;">
|
||||
<div style="margin-bottom: 15px;">
|
||||
<!-- end header part -->
|
80
doxy/doxygen-bootstrapped/example-site/src/example.cpp
Normal file
80
doxy/doxygen-bootstrapped/example-site/src/example.cpp
Normal file
@ -0,0 +1,80 @@
|
||||
/**
|
||||
* @file example.cpp
|
||||
*
|
||||
* example file, inspired from
|
||||
* https://www.star.bnl.gov/public/comp/sofi/doxygen/docblocks.html
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief A test class.
|
||||
*
|
||||
* A more elaborate class description.
|
||||
*
|
||||
* @todo add some functionality
|
||||
*/
|
||||
class Test {
|
||||
public:
|
||||
|
||||
/**
|
||||
* @brief An enum.
|
||||
*
|
||||
* More detailed enum description.
|
||||
*/
|
||||
enum TEnum {
|
||||
TVal1, /**< enum value TVal1. */
|
||||
TVal2, /**< enum value TVal2. */
|
||||
TVal3 /**< enum value TVal3. */
|
||||
} * enumPtr, /**< enum pointer. Details. */
|
||||
enumVar; /**< enum variable. Details. */
|
||||
|
||||
/**
|
||||
* @brief A constructor.
|
||||
*
|
||||
* A more elaborate description of the constructor.
|
||||
*/
|
||||
Test();
|
||||
|
||||
/**
|
||||
* @brief A destructor.
|
||||
*
|
||||
* A more elaborate description of the destructor.
|
||||
* @warning beware of destruction!
|
||||
*/
|
||||
~Test();
|
||||
|
||||
/**
|
||||
* @brief a normal member taking two arguments and returning an integer value.
|
||||
* @param a an integer argument.
|
||||
* @param s a constant character pointer.
|
||||
* @see Test()
|
||||
* @see ~Test()
|
||||
* @see testMeToo()
|
||||
* @see publicVar()
|
||||
* @return The test results
|
||||
*/
|
||||
int testMe(int a, const char *s);
|
||||
|
||||
/**
|
||||
* @brief A pure virtual member.
|
||||
* @see testMe()
|
||||
* @param c1 the first argument.
|
||||
* @param c2 the second argument.
|
||||
*/
|
||||
virtual void testMeToo(char c1, char c2) = 0;
|
||||
|
||||
/**
|
||||
* @brief a public variable.
|
||||
*
|
||||
* Details.
|
||||
*
|
||||
* @note A small note.
|
||||
*/
|
||||
int publicVar;
|
||||
|
||||
/**
|
||||
* @brief a function variable.
|
||||
*
|
||||
* Details.
|
||||
*/
|
||||
int (*handler)(int a, int b);
|
||||
};
|
161
doxy/env.py
Normal file
161
doxy/env.py
Normal file
@ -0,0 +1,161 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
##
|
||||
## @author Edouard DUPIN
|
||||
##
|
||||
## @copyright 2012, Edouard DUPIN, all right reserved
|
||||
##
|
||||
## @license APACHE v2.0 (see license file)
|
||||
##
|
||||
|
||||
# Local import
|
||||
from . import debug
|
||||
|
||||
|
||||
|
||||
force_mode=False
|
||||
|
||||
def set_force_mode(val):
|
||||
global force_mode
|
||||
if val==1:
|
||||
force_mode = 1
|
||||
else:
|
||||
force_mode = 0
|
||||
|
||||
def get_force_mode():
|
||||
global force_mode
|
||||
return force_mode
|
||||
|
||||
force_optimisation=False
|
||||
|
||||
def set_force_optimisation(val):
|
||||
global force_optimisation
|
||||
if val==1:
|
||||
force_optimisation = 1
|
||||
else:
|
||||
force_optimisation = 0
|
||||
|
||||
def get_force_optimisation():
|
||||
global force_optimisation
|
||||
return force_optimisation
|
||||
|
||||
parse_depth = 9999999
|
||||
|
||||
def set_parse_depth(val):
|
||||
global parse_depth
|
||||
parse_depth = val
|
||||
debug.debug("Set depth search element: " + str(parse_depth))
|
||||
|
||||
def get_parse_depth():
|
||||
global parse_depth
|
||||
return parse_depth
|
||||
|
||||
exclude_search_path = []
|
||||
|
||||
def set_exclude_search_path(val):
|
||||
global exclude_search_path
|
||||
exclude_search_path = val
|
||||
debug.debug("Set depth search element: " + str(exclude_search_path))
|
||||
|
||||
def get_exclude_search_path():
|
||||
global exclude_search_path
|
||||
return exclude_search_path
|
||||
|
||||
|
||||
build_system_base_name = "doxy"
|
||||
|
||||
def set_build_system_base_name(val):
|
||||
global build_system_base_name
|
||||
build_system_base_name = val
|
||||
debug.debug("Set basename: '" + str(build_system_base_name) + "'")
|
||||
|
||||
def get_build_system_base_name():
|
||||
global build_system_base_name
|
||||
return build_system_base_name
|
||||
|
||||
|
||||
def end_with(name, list):
|
||||
for appl in list:
|
||||
#debug.info("pppppppp : " + str([name[-len(appl):], appl]))
|
||||
if name[-len(appl):] == appl:
|
||||
return True
|
||||
return False
|
||||
|
||||
print_pretty_mode = True
|
||||
|
||||
def print_pretty(my_string, force=False):
|
||||
global print_pretty_mode
|
||||
if print_pretty_mode == True \
|
||||
or force == True:
|
||||
if my_string[len(my_string)-1] == ' ':
|
||||
tmpcmdLine = my_string[:len(my_string)-1]
|
||||
else:
|
||||
tmpcmdLine = my_string
|
||||
cmdApplication = tmpcmdLine.split(' ')[0]
|
||||
tmpcmdLine = tmpcmdLine.replace(' ', '\n\t')
|
||||
tmpcmdLine = tmpcmdLine.replace('\n\t\n\t', '\n\t')
|
||||
tmpcmdLine = tmpcmdLine.replace('\n\t\n\t', '\n\t')
|
||||
tmpcmdLine = tmpcmdLine.replace('\n\t\n\t', '\n\t')
|
||||
baseElementList = []
|
||||
if end_with(cmdApplication, ["javac"]) == True:
|
||||
baseElementList = [
|
||||
"-d",
|
||||
"-D",
|
||||
"-classpath",
|
||||
"-sourcepath"
|
||||
]
|
||||
elif end_with(cmdApplication, ["java"]) == True:
|
||||
baseElementList = [
|
||||
"-z",
|
||||
"-f",
|
||||
"-rf"
|
||||
]
|
||||
elif end_with(cmdApplication, ["jarsigner"]) == True:
|
||||
baseElementList = [
|
||||
"-sigalg",
|
||||
"-digestalg",
|
||||
"-storepass",
|
||||
"-keypass"
|
||||
]
|
||||
elif end_with(cmdApplication, ["jar"]) == True:
|
||||
baseElementList = [
|
||||
"cf",
|
||||
"-C"
|
||||
]
|
||||
elif end_with(cmdApplication, ["aapt"]) == True:
|
||||
baseElementList = [
|
||||
"-M",
|
||||
"-F",
|
||||
"-I",
|
||||
"-S",
|
||||
"-J"
|
||||
]
|
||||
elif end_with(cmdApplication, ["g++", "gcc", "clang", "clang++", "ar", "ld", "ranlib"]) == True:
|
||||
baseElementList = [
|
||||
"-o",
|
||||
"-D",
|
||||
"-I",
|
||||
"-L",
|
||||
"-framework",
|
||||
"-isysroot",
|
||||
"-arch",
|
||||
"-keystore",
|
||||
"-sigalg",
|
||||
"-digestalg",
|
||||
"-target",
|
||||
"-gcc-toolchain",
|
||||
"-current_version",
|
||||
"-compatibility_version"
|
||||
]
|
||||
|
||||
for element in baseElementList:
|
||||
tmpcmdLine = tmpcmdLine.replace(element+'\n\t', element+' ')
|
||||
for element in ["<", "<<", ">", ">>"]:
|
||||
tmpcmdLine = tmpcmdLine.replace(element+'\n\t', element+' ')
|
||||
tmpcmdLine = tmpcmdLine.replace('\n\t', ' \\\n\t')
|
||||
|
||||
return tmpcmdLine
|
||||
else:
|
||||
return my_string
|
||||
|
||||
|
131
doxy/heritage.py
Normal file
131
doxy/heritage.py
Normal file
@ -0,0 +1,131 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
##
|
||||
## @author Edouard DUPIN
|
||||
##
|
||||
## @copyright 2012, Edouard DUPIN, all right reserved
|
||||
##
|
||||
## @license APACHE v2.0 (see license file)
|
||||
##
|
||||
import sys
|
||||
import copy
|
||||
# Local import
|
||||
from . import debug
|
||||
|
||||
|
||||
def append_to_list(list_out, elem):
|
||||
if type(elem) == str:
|
||||
if elem not in list_out:
|
||||
list_out.append(elem)
|
||||
else:
|
||||
# mulyiple imput in the list ...
|
||||
for element in elem:
|
||||
if element not in list_out:
|
||||
list_out.append(element)
|
||||
|
||||
|
||||
|
||||
class HeritageList:
|
||||
def __init__(self, heritage = None):
|
||||
self.flags = {}
|
||||
self.path = {}
|
||||
self.list_heritage = []
|
||||
if heritage != None:
|
||||
self.add_heritage(heritage)
|
||||
|
||||
def add_heritage(self, heritage):
|
||||
if type(heritage) == type(None) \
|
||||
or heritage.name == "":
|
||||
return
|
||||
for element in self.list_heritage:
|
||||
if element.name == heritage.name:
|
||||
return
|
||||
self.list_heritage.append(heritage)
|
||||
self.regenerate_tree()
|
||||
|
||||
def add_heritage_list(self, heritage_list):
|
||||
if type(heritage_list) == type(None):
|
||||
return
|
||||
for herit in heritage_list.list_heritage:
|
||||
find = False
|
||||
for element in self.list_heritage:
|
||||
if element.name == herit.name:
|
||||
find = True
|
||||
if find == False:
|
||||
self.list_heritage.append(herit)
|
||||
self.regenerate_tree()
|
||||
|
||||
def regenerate_tree(self):
|
||||
self.flags = {}
|
||||
self.path = {}
|
||||
# reorder heritage list :
|
||||
listHeritage = self.list_heritage
|
||||
self.list_heritage = []
|
||||
# first step : add all lib with no dependency:
|
||||
for herit in listHeritage:
|
||||
if len(herit.depends) == 0:
|
||||
self.list_heritage.append(herit)
|
||||
listHeritage.remove(herit)
|
||||
while len(listHeritage) > 0:
|
||||
currentHeritageSize = len(listHeritage)
|
||||
debug.verbose("list heritage = " + str([[x.name, x.depends] for x in listHeritage]))
|
||||
# Add element only when all dependence are resolved
|
||||
for herit in listHeritage:
|
||||
listDependsName = [y.name for y in self.list_heritage]
|
||||
if all(x in listDependsName for x in herit.depends) == True:
|
||||
listHeritage.remove(herit)
|
||||
self.list_heritage.append(herit)
|
||||
if currentHeritageSize == len(listHeritage):
|
||||
debug.warning("Not resolve dependency between the library ==> can be a cyclic dependency !!!")
|
||||
for herit in listHeritage:
|
||||
self.list_heritage.append(herit)
|
||||
listHeritage = []
|
||||
debug.warning("new heritage list:")
|
||||
for element in self.list_heritage:
|
||||
debug.warning(" " + element.name + " " + str(element.depends))
|
||||
debug.verbose("new heritage list:")
|
||||
for element in self.list_heritage:
|
||||
debug.verbose(" " + element.name + " " + str(element.depends))
|
||||
for element in reversed(self.list_heritage):
|
||||
for ppp in element.path:
|
||||
value = element.path[ppp]
|
||||
if ppp not in self.path:
|
||||
self.path[ppp] = value
|
||||
else:
|
||||
append_to_list(self.path[ppp], value)
|
||||
|
||||
def __repr__(self):
|
||||
return "{doxy:HeritageList:" + str(self.list_heritage) + "}"
|
||||
|
||||
class heritage:
|
||||
def __init__(self, module, target):
|
||||
self.name = ""
|
||||
self.depends = []
|
||||
## Remove all variable to prevent error of multiple definition
|
||||
self.path = {}
|
||||
self.include = ""
|
||||
# update is set at true when data are newly created ==> force upper element to update
|
||||
self.hasBeenUpdated=False
|
||||
|
||||
if type(module) != type(None):
|
||||
# all the parameter that the upper classe need when build
|
||||
self.name = module.name
|
||||
self.depends = copy.deepcopy(module.depends)
|
||||
|
||||
def add_depends(self, elements):
|
||||
self.depends.append(elements)
|
||||
|
||||
def need_update(self, list):
|
||||
self.hasBeenUpdated=True
|
||||
|
||||
def add_sub(self, other):
|
||||
if type(other) == type(None):
|
||||
debug.verbose("input of the heriatege class is None !!!")
|
||||
return
|
||||
if other.hasBeenUpdated == True:
|
||||
self.hasBeenUpdated = True
|
||||
|
||||
def __repr__(self):
|
||||
return "{doxy:Heritage:" + str(self.name) + " ... }"
|
||||
|
||||
|
245
doxy/module.py
Normal file
245
doxy/module.py
Normal file
@ -0,0 +1,245 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
##
|
||||
## @author Edouard DUPIN
|
||||
##
|
||||
## @copyright 2012, Edouard DUPIN, all right reserved
|
||||
##
|
||||
## @license APACHE v2.0 (see license file)
|
||||
##
|
||||
|
||||
import sys
|
||||
import os
|
||||
import copy
|
||||
import inspect
|
||||
import fnmatch
|
||||
# Local import
|
||||
from . import tools
|
||||
from . import debug
|
||||
from . import heritage
|
||||
from . import multiprocess
|
||||
from . import env
|
||||
|
||||
class Module:
|
||||
##
|
||||
## @brief Module class represent all system needed for a specific
|
||||
## module like
|
||||
## - type (bin/lib ...)
|
||||
## - dependency
|
||||
## - flags
|
||||
## - files
|
||||
## - ...
|
||||
##
|
||||
def __init__(self, file, module_name):
|
||||
## Remove all variable to prevent error of multiple deffinition of the module ...
|
||||
debug.verbose("Create a new module : '" + module_name + "'")
|
||||
self.origin_file=''
|
||||
self.origin_path=''
|
||||
# Name of the module
|
||||
self.name=module_name
|
||||
# Dependency list:
|
||||
self.depends = []
|
||||
self.version = [0,0]
|
||||
self.full_name = "No Title"
|
||||
self.website = ""
|
||||
self.website_source = ""
|
||||
self.path = tools.get_current_path(self.origin_file)
|
||||
|
||||
# The module has been already build ...
|
||||
self.isbuild = False
|
||||
self.origin_file = file;
|
||||
self.origin_path = tools.get_current_path(self.origin_file)
|
||||
self.local_heritage = heritage.heritage(self, None)
|
||||
self.sub_heritage_list = None
|
||||
|
||||
def __repr__(self):
|
||||
return "{doxy.Module:" + str(self.name) + "}"
|
||||
|
||||
|
||||
# call here to build the module
|
||||
def build(self, target, package_name):
|
||||
# ckeck if not previously build
|
||||
if target.is_module_build(self.name) == True:
|
||||
if self.sub_heritage_list == None:
|
||||
self.local_heritage = heritage.heritage(self, target)
|
||||
return copy.deepcopy(self.sub_heritage_list)
|
||||
# create the package heritage
|
||||
self.local_heritage = heritage.heritage(self, target)
|
||||
|
||||
# build dependency before
|
||||
list_sub_file_needed_to_build = []
|
||||
self.sub_heritage_list = heritage.HeritageList()
|
||||
# optionnal dependency :
|
||||
for dep in self.depends:
|
||||
debug.debug("module: '" + str(self.name) + "' request: '" + dep + "'")
|
||||
inherit_list = target.build(dep, package_name)
|
||||
# add at the heritage list :
|
||||
self.sub_heritage_list.add_heritage_list(inherit_list)
|
||||
package_version_string = tools.version_to_string(self.version);
|
||||
debug.print_element("Module", self.name, "-", package_version_string)
|
||||
|
||||
filename_dox = os.path.join(target.get_final_path(), self.name + ".dox")
|
||||
|
||||
debug.debug("Create doxygen file: '" + filename_dox + "'")
|
||||
data = tools.file_read_data(os.path.join(tools.get_current_path(__file__), "default_doxy_file.dox"))
|
||||
data += "\n"
|
||||
data += "# -----------------------------------\n"
|
||||
data += "# -- doxy footer and header\n"
|
||||
data += "# -----------------------------------\n"
|
||||
data += "HTML_HEADER = " + os.path.join(tools.get_current_path(__file__), "doxygen-bootstrapped", "example-site", "header.html") + "\n"
|
||||
data += "HTML_FOOTER = " + os.path.join(tools.get_current_path(__file__), "doxygen-bootstrapped", "example-site", "footer.html") + "\n"
|
||||
data += "HTML_EXTRA_STYLESHEET = " + os.path.join(tools.get_current_path(__file__), "doxygen-bootstrapped", "customdoxygen.css") + "\n"
|
||||
data += "HTML_EXTRA_FILES = " + os.path.join(tools.get_current_path(__file__), "doxygen-bootstrapped", "doxy-boot.js") + "\n"
|
||||
data += "\n"
|
||||
data += "# -----------------------------------\n"
|
||||
data += "# -- doxy auto-added section\n"
|
||||
data += "# -----------------------------------\n"
|
||||
data += 'PROJECT_NAME = "' + str(self.full_name) + '"\n'
|
||||
data += 'OUTPUT_DIRECTORY = "' + str(os.path.join(target.get_final_path(), self.name)) + '"\n'
|
||||
data += 'GENERATE_TAGFILE = "' + str(os.path.join(target.get_final_path(), self.name + ".tag")) + '"\n'
|
||||
if type(self.path) == list:
|
||||
data += 'INPUT = \n'
|
||||
for elem in self.path:
|
||||
data += 'INPUT += "' + str(elem) + '"\n'
|
||||
else:
|
||||
data += 'INPUT = "' + str(self.path) + '"\n'
|
||||
if len(self.sub_heritage_list.list_heritage) > 0:
|
||||
data += 'TAGFILES ='
|
||||
for element in self.sub_heritage_list.list_heritage:
|
||||
data += " \\\n"
|
||||
data += ' ' + os.path.join(target.get_final_path(), element.name + ".tag")
|
||||
data += '=' + os.path.join(target.get_final_path(), element.name, "html")
|
||||
|
||||
|
||||
tools.file_write_data(filename_dox, data)
|
||||
multiprocess.run_command("doxygen " + filename_dox)
|
||||
debug.debug("heritage: " + str(self.sub_heritage_list))
|
||||
self.sub_heritage_list.add_heritage(self.local_heritage)
|
||||
# return local dependency ...
|
||||
return copy.deepcopy(self.sub_heritage_list)
|
||||
|
||||
# call here to clean the module
|
||||
def clean(self, target):
|
||||
# remove path of the lib ... for this targer
|
||||
pathbuild = os.path.join(target.get_final_path(), self.name)
|
||||
debug.info("remove path : '" + pathbuild + "'")
|
||||
tools.remove_path_and_sub_path(pathbuild)
|
||||
|
||||
|
||||
def set_version(self, val):
|
||||
self.version = val
|
||||
|
||||
def set_title(self, val):
|
||||
self.full_name = val
|
||||
|
||||
def set_website(self, val):
|
||||
self.website = val
|
||||
|
||||
def set_website_sources(self, val):
|
||||
self.website_source = val
|
||||
|
||||
def set_path(self, val):
|
||||
self.path = val
|
||||
|
||||
def add_module_depend(self, list):
|
||||
tools.list_append_to(self.depends, list, True)
|
||||
|
||||
def print_list(self, description, input_list):
|
||||
if type(input_list) == list:
|
||||
if len(input_list) > 0:
|
||||
print(' ' + str(description))
|
||||
for elem in input_list:
|
||||
print(' ' + str(elem))
|
||||
else:
|
||||
print(' ' + str(description))
|
||||
print(' ' + str(input_list))
|
||||
|
||||
def display(self):
|
||||
print('-----------------------------------------------')
|
||||
print(' package : "' + self.name + "'")
|
||||
print('-----------------------------------------------')
|
||||
print(' version:"' + str(self.version) + "'")
|
||||
print(' full name:"' + str(self.full_name) + "'")
|
||||
print(' path:"' + str(self.origin_path) + "'")
|
||||
print(' website:"' + str(self.website) + "'")
|
||||
print(' website source:"' + str(self.website_source) + "'")
|
||||
print(' path:"' + str(self.path) + "'")
|
||||
self.print_list('depends',self.depends)
|
||||
|
||||
return True
|
||||
|
||||
|
||||
module_list=[]
|
||||
__start_module_name="_"
|
||||
|
||||
def import_path(path_list):
|
||||
global module_list
|
||||
global_base = env.get_build_system_base_name()
|
||||
debug.debug("MODULE: Init with Files list:")
|
||||
for elem in path_list:
|
||||
sys.path.append(os.path.dirname(elem))
|
||||
# Get file name:
|
||||
filename = os.path.basename(elem)
|
||||
# Remove .py at the end:
|
||||
filename = filename[:-3]
|
||||
# Remove global base name:
|
||||
filename = filename[len(global_base):]
|
||||
# Check if it start with the local patern:
|
||||
if filename[:len(__start_module_name)] != __start_module_name:
|
||||
debug.extreme_verbose("MODULE: NOT-Integrate: '" + filename + "' from '" + elem + "' ==> rejected")
|
||||
continue
|
||||
# Remove local patern
|
||||
module_name = filename[len(__start_module_name):]
|
||||
debug.verbose("MODULE: Integrate: '" + module_name + "' from '" + elem + "'")
|
||||
module_list.append([module_name, elem])
|
||||
debug.verbose("New list module: ")
|
||||
for elem in module_list:
|
||||
debug.verbose(" " + str(elem[0]))
|
||||
|
||||
def exist(target, name):
|
||||
global module_list
|
||||
for mod in module_list:
|
||||
if mod[0] == name:
|
||||
return True
|
||||
return False
|
||||
|
||||
def load_module(target, name):
|
||||
global module_list
|
||||
for mod in module_list:
|
||||
if mod[0] == name:
|
||||
sys.path.append(os.path.dirname(mod[1]))
|
||||
debug.verbose("import module : '" + env.get_build_system_base_name() + __start_module_name + name + "'")
|
||||
the_module_file = mod[1]
|
||||
the_module = __import__(env.get_build_system_base_name() + __start_module_name + name)
|
||||
# configure the module:
|
||||
if "create" in dir(the_module):
|
||||
tmp_element = the_module.create(target, name)
|
||||
else:
|
||||
debug.warning(" no function 'create' in the module : " + mod[0] + " from:'" + mod[1] + "'")
|
||||
continue
|
||||
# check if create has been done corectly
|
||||
if tmp_element == None:
|
||||
debug.debug("Request load module '" + name + "' not define for this platform")
|
||||
else:
|
||||
target.add_module(tmp_element)
|
||||
return tmp_element
|
||||
|
||||
def list_all_module():
|
||||
global module_list
|
||||
tmpListName = []
|
||||
for mod in module_list:
|
||||
tmpListName.append(mod[0])
|
||||
return tmpListName
|
||||
|
||||
def list_all_module_with_desc():
|
||||
global module_list
|
||||
tmpList = []
|
||||
for mod in module_list:
|
||||
sys.path.append(os.path.dirname(mod[1]))
|
||||
the_module = __import__(env.get_build_system_base_name() + __start_module_name + mod[0])
|
||||
tmpList.append({
|
||||
"name":mod[0],
|
||||
"description":" "
|
||||
})
|
||||
return tmpList
|
||||
|
66
doxy/multiprocess.py
Normal file
66
doxy/multiprocess.py
Normal file
@ -0,0 +1,66 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
##
|
||||
## @author Edouard DUPIN
|
||||
##
|
||||
## @copyright 2012, Edouard DUPIN, all right reserved
|
||||
##
|
||||
## @license APACHE v2.0 (see license file)
|
||||
##
|
||||
|
||||
import sys
|
||||
import threading
|
||||
import time
|
||||
import sys
|
||||
import os
|
||||
import subprocess
|
||||
import shlex
|
||||
# Local import
|
||||
from . import debug
|
||||
from . import tools
|
||||
from . import env
|
||||
|
||||
|
||||
|
||||
def run_command(cmd_line, store_cmd_line="", store_output_file=""):
|
||||
global error_occured
|
||||
global exit_flag
|
||||
global current_id_execution
|
||||
global error_execution
|
||||
# prepare command line:
|
||||
args = shlex.split(cmd_line)
|
||||
debug.verbose("cmd = " + str(args))
|
||||
try:
|
||||
# create the subprocess
|
||||
p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
except subprocess.CalledProcessError as e:
|
||||
debug.error("subprocess.CalledProcessError : TODO ...")
|
||||
except:
|
||||
debug.error("Exception on : " + str(args))
|
||||
# launch the subprocess:
|
||||
output, err = p.communicate()
|
||||
if sys.version_info >= (3, 0):
|
||||
output = output.decode("utf-8")
|
||||
err = err.decode("utf-8")
|
||||
# store error if needed:
|
||||
tools.store_warning(store_output_file, output, err)
|
||||
# Check error :
|
||||
if p.returncode == 0:
|
||||
debug.debug(env.print_pretty(cmd_line))
|
||||
if output != "":
|
||||
debug.print_compilator(output)
|
||||
if err != "":
|
||||
debug.print_compilator(err)
|
||||
else:
|
||||
# if No ID : Not in a multiprocess mode ==> just stop here
|
||||
debug.debug(env.print_pretty(cmd_line), force=True)
|
||||
debug.print_compilator(output)
|
||||
debug.print_compilator(err)
|
||||
if p.returncode == 2:
|
||||
debug.error("can not compile file ... [keyboard interrrupt]")
|
||||
else:
|
||||
debug.error("can not compile file ... ret : " + str(p.returncode))
|
||||
debug.verbose("done 3")
|
||||
# write cmd line only after to prevent errors ...
|
||||
tools.store_command(cmd_line, store_cmd_line)
|
||||
|
172
doxy/target.py
Normal file
172
doxy/target.py
Normal file
@ -0,0 +1,172 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
##
|
||||
## @author Edouard DUPIN
|
||||
##
|
||||
## @copyright 2012, Edouard DUPIN, all right reserved
|
||||
##
|
||||
## @license APACHE v2.0 (see license file)
|
||||
##
|
||||
|
||||
import sys
|
||||
import os
|
||||
import inspect
|
||||
import fnmatch
|
||||
import datetime
|
||||
# Local import
|
||||
from . import debug
|
||||
from . import heritage
|
||||
from . import tools
|
||||
from . import module
|
||||
from . import multiprocess
|
||||
from . import env
|
||||
|
||||
class Target:
|
||||
def __init__(self, config):
|
||||
self.config = config
|
||||
debug.info("=================================");
|
||||
debug.info("== Target ==");
|
||||
debug.info("=================================");
|
||||
self.path_out = "out/doc/" + self.config["mode"] + "/"
|
||||
self.module_list = []
|
||||
self.build_done = []
|
||||
|
||||
def __repr__(self):
|
||||
return "{doxy.Target}"
|
||||
##
|
||||
## @brief Get the fianal path ==> contain all the generated packages
|
||||
## @return The path of the pa
|
||||
##
|
||||
def get_final_path(self):
|
||||
return os.path.join(tools.get_run_path(), self.path_out)
|
||||
|
||||
def is_module_build(self, my_module):
|
||||
for mod in self.build_done:
|
||||
if mod == my_module:
|
||||
return True
|
||||
self.build_done.append(my_module)
|
||||
return False
|
||||
|
||||
def add_module(self, newModule):
|
||||
debug.debug("Add nodule for Taget : " + newModule.name)
|
||||
self.module_list.append(newModule)
|
||||
|
||||
def get_module(self, name):
|
||||
for mod in self.module_list:
|
||||
if mod.name == name:
|
||||
return mod
|
||||
debug.error("the module '" + str(name) + "'does not exist/already build")
|
||||
return None
|
||||
|
||||
def clean(self, name):
|
||||
for mod in self.module_list:
|
||||
if mod.name == name:
|
||||
mod.clean(self)
|
||||
return
|
||||
debug.error("request to clean an un-existant module name : '" + name + "'")
|
||||
|
||||
def load_if_needed(self, name):
|
||||
for elem in self.module_list:
|
||||
if elem.name == name:
|
||||
return True
|
||||
# try to find in the local Modules:
|
||||
exist = module.exist(self, name)
|
||||
if exist == True:
|
||||
module.load_module(self, name)
|
||||
return True;
|
||||
# we did not find the module ...
|
||||
return False;
|
||||
|
||||
def load_all(self):
|
||||
listOfAllTheModule = module.list_all_module()
|
||||
for modName in listOfAllTheModule:
|
||||
self.load_if_needed(modName)
|
||||
|
||||
def project_add_module(self, name, projectMng, addedModule):
|
||||
for mod in self.module_list:
|
||||
if mod.name == name:
|
||||
mod.ext_project_add_module(self, projectMng, addedModule)
|
||||
return
|
||||
|
||||
def build(self, name, packagesName=None, actions=[]):
|
||||
if len(name.split("?")) != 1\
|
||||
or len(name.split("@")) != 1:
|
||||
debug.error("need update")
|
||||
if actions == "":
|
||||
actions = ["build"]
|
||||
if actions == []:
|
||||
actions = ["build"]
|
||||
if type(actions) == str:
|
||||
actions = [actions]
|
||||
if name == "dump":
|
||||
debug.info("dump all")
|
||||
self.load_all()
|
||||
for mod in self.module_list:
|
||||
mod.display()
|
||||
return
|
||||
if name == "all":
|
||||
debug.info("build all")
|
||||
self.load_all()
|
||||
for mod in self.module_list:
|
||||
mod.build(self, None)
|
||||
elif name == "clean":
|
||||
debug.info("clean all")
|
||||
self.load_all()
|
||||
for mod in self.module_list:
|
||||
mod.clean(self)
|
||||
else:
|
||||
module_name = name
|
||||
action_list = actions
|
||||
debug.verbose("plop: " + str(action_list))
|
||||
for action_name in action_list:
|
||||
debug.verbose("requested : " + module_name + "?" + action_name + " [START]")
|
||||
ret = None;
|
||||
present = self.load_if_needed(module_name)
|
||||
if present == False:
|
||||
ret = [heritage.HeritageList(), False]
|
||||
else:
|
||||
for mod in self.module_list:
|
||||
if mod.name == module_name:
|
||||
if action_name[:4] == "dump":
|
||||
debug.info("dump module '" + module_name + "'")
|
||||
if len(action_name) > 4:
|
||||
debug.warning("action 'dump' does not support options ... : '" + action_name + "'")
|
||||
ret = mod.display()
|
||||
break
|
||||
elif action_name[:5] == "clean":
|
||||
debug.info("clean module '" + module_name + "'")
|
||||
if len(action_name) > 5:
|
||||
debug.warning("action 'clean' does not support options ... : '" + action_name + "'")
|
||||
ret = mod.clean(self)
|
||||
break
|
||||
elif action_name[:5] == "build":
|
||||
if len(action_name) > 5:
|
||||
debug.warning("action 'build' does not support options ... : '" + action_name + "'")
|
||||
debug.debug("build module '" + module_name + "'")
|
||||
ret = mod.build(self, None)
|
||||
break
|
||||
if ret == None:
|
||||
ret = [heritage.HeritageList(), False]
|
||||
break
|
||||
if ret == None:
|
||||
debug.error("not know module name : '" + module_name + "' to '" + action_name + "' it")
|
||||
debug.verbose("requested : " + module_name + "?" + action_name + " [STOP]")
|
||||
if len(action_list) == 1:
|
||||
return ret
|
||||
|
||||
##
|
||||
## @brief convert a s list of string in a string separated by a ","
|
||||
## @param[in] list List of element to transform
|
||||
## @return The requested string
|
||||
##
|
||||
def generate_list_separate_coma(self, list):
|
||||
result = ""
|
||||
fistTime = True
|
||||
for elem in list:
|
||||
if fistTime == True:
|
||||
fistTime = False
|
||||
else:
|
||||
result += ","
|
||||
result += elem
|
||||
return result
|
||||
|
247
doxy/tools.py
Normal file
247
doxy/tools.py
Normal file
@ -0,0 +1,247 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
##
|
||||
## @author Edouard DUPIN
|
||||
##
|
||||
## @copyright 2012, Edouard DUPIN, all right reserved
|
||||
##
|
||||
## @license APACHE v2.0 (see license file)
|
||||
##
|
||||
|
||||
import os
|
||||
import shutil
|
||||
import errno
|
||||
import fnmatch
|
||||
import stat
|
||||
# Local import
|
||||
from . import debug
|
||||
from . import env
|
||||
|
||||
"""
|
||||
|
||||
"""
|
||||
def get_run_path():
|
||||
return os.getcwd()
|
||||
|
||||
"""
|
||||
|
||||
"""
|
||||
def get_current_path(file):
|
||||
return os.path.dirname(os.path.realpath(file))
|
||||
|
||||
def create_directory_of_file(file):
|
||||
path = os.path.dirname(file)
|
||||
try:
|
||||
os.stat(path)
|
||||
except:
|
||||
os.makedirs(path)
|
||||
|
||||
def get_list_sub_path(path):
|
||||
# TODO : os.listdir(path)
|
||||
for dirname, dirnames, filenames in os.walk(path):
|
||||
return dirnames
|
||||
return []
|
||||
|
||||
def remove_path_and_sub_path(path):
|
||||
if os.path.isdir(path):
|
||||
debug.verbose("remove path : '" + path + "'")
|
||||
shutil.rmtree(path)
|
||||
|
||||
def remove_file(path):
|
||||
if os.path.isfile(path):
|
||||
os.remove(path)
|
||||
elif os.path.islink(path):
|
||||
os.remove(path)
|
||||
|
||||
def file_size(path):
|
||||
if not os.path.isfile(path):
|
||||
return 0
|
||||
statinfo = os.stat(path)
|
||||
return statinfo.st_size
|
||||
|
||||
def file_read_data(path, binary=False):
|
||||
if not os.path.isfile(path):
|
||||
return ""
|
||||
if binary == True:
|
||||
file = open(path, "rb")
|
||||
else:
|
||||
file = open(path, "r")
|
||||
data_file = file.read()
|
||||
file.close()
|
||||
return data_file
|
||||
|
||||
def version_to_string(version):
|
||||
version_ID = ""
|
||||
for id in version:
|
||||
if len(version_ID) != 0:
|
||||
if type(id) == str:
|
||||
version_ID += "-"
|
||||
else:
|
||||
version_ID += "."
|
||||
version_ID += str(id)
|
||||
return version_ID
|
||||
|
||||
##
|
||||
## @brief Write data in a specific path.
|
||||
## @param[in] path Path of the data might be written.
|
||||
## @param[in] data Data To write in the file.
|
||||
## @param[in] only_if_new (default: False) Write data only if data is different.
|
||||
## @return True Something has been copied
|
||||
## @return False Nothing has been copied
|
||||
##
|
||||
def file_write_data(path, data, only_if_new=False):
|
||||
if only_if_new == True:
|
||||
old_data = file_read_data(path)
|
||||
if old_data == data:
|
||||
return False
|
||||
#real write of data:
|
||||
create_directory_of_file(path)
|
||||
file = open(path, "w")
|
||||
file.write(data)
|
||||
file.close()
|
||||
return True
|
||||
|
||||
def list_to_str(list):
|
||||
if type(list) == type(str()):
|
||||
return list + " "
|
||||
else:
|
||||
result = ""
|
||||
# mulyiple imput in the list ...
|
||||
for elem in list:
|
||||
result += list_to_str(elem)
|
||||
return result
|
||||
|
||||
def add_prefix(prefix,list):
|
||||
if type(list) == type(None):
|
||||
return ""
|
||||
if type(list) == type(str()):
|
||||
return prefix+list
|
||||
else:
|
||||
if len(list)==0:
|
||||
return ''
|
||||
else:
|
||||
result=[]
|
||||
for elem in list:
|
||||
result.append(prefix+elem)
|
||||
return result
|
||||
|
||||
##
|
||||
## @brief Clean a path from all un-needed element in a directory
|
||||
## @param[in] path Path to clean
|
||||
## @param[in] normal_list List of all files/path in the path
|
||||
## @return True Something has been removed
|
||||
## @return False Nothing has been removed
|
||||
##
|
||||
def clean_directory(path, normal_list):
|
||||
has_file_removed = False
|
||||
# get a list of all element in the path:
|
||||
for root, dirnames, filenames in os.walk(path):
|
||||
for file in filenames:
|
||||
file_name = os.path.join(root, file)
|
||||
if file_name not in normal_list:
|
||||
debug.print_element("remove file ", os.path.relpath(file_name), "==>", "---")
|
||||
os.remove(file_name)
|
||||
has_file_removed = True
|
||||
return has_file_removed
|
||||
|
||||
def filter_extention(list_files, extentions, invert=False):
|
||||
out = []
|
||||
for file in list_files:
|
||||
in_list = False
|
||||
for ext in extentions:
|
||||
if file[-len(ext):] == ext:
|
||||
in_list = True
|
||||
if in_list == True \
|
||||
and invert == False:
|
||||
out.append(file)
|
||||
elif in_list == False \
|
||||
and invert == True:
|
||||
out.append(file)
|
||||
return out
|
||||
|
||||
|
||||
def move_if_needed(src, dst):
|
||||
if not os.path.isfile(src):
|
||||
debug.error("request move if needed, but file does not exist: '" + str(src) + "' to '" + str(dst) + "'")
|
||||
return
|
||||
src_data = file_read_data(src)
|
||||
if os.path.isfile(dst):
|
||||
# file exist ==> must check ...
|
||||
dst_data = file_read_data(dst)
|
||||
if src_data == dst_data:
|
||||
# nothing to do ...
|
||||
return
|
||||
file_write_data(dst, src_data)
|
||||
remove_file(src)
|
||||
|
||||
def store_command(cmd_line, file):
|
||||
# write cmd line only after to prevent errors ...
|
||||
if file == "" \
|
||||
or file == None:
|
||||
return;
|
||||
debug.verbose("create cmd file: " + file)
|
||||
# Create directory:
|
||||
create_directory_of_file(file)
|
||||
# Store the command Line:
|
||||
file2 = open(file, "w")
|
||||
file2.write(cmd_line)
|
||||
file2.flush()
|
||||
file2.close()
|
||||
|
||||
def store_warning(file, output, err):
|
||||
# write warning line only after to prevent errors ...
|
||||
if file == "" \
|
||||
or file == None:
|
||||
return;
|
||||
if env.get_warning_mode() == False:
|
||||
debug.verbose("remove warning file: " + file)
|
||||
# remove file if exist...
|
||||
remove_file(file);
|
||||
return;
|
||||
debug.verbose("create warning file: " + file)
|
||||
# Create directory:
|
||||
create_directory_of_file(file)
|
||||
# Store the command Line:
|
||||
file2 = open(file, "w")
|
||||
file2.write("===== output =====\n")
|
||||
file2.write(output)
|
||||
file2.write("\n\n")
|
||||
file2.write("===== error =====\n")
|
||||
file2.write(err)
|
||||
file2.write("\n\n")
|
||||
file2.flush()
|
||||
file2.close()
|
||||
|
||||
|
||||
## List tools:
|
||||
def list_append_and_check(listout, newElement, order):
|
||||
for element in listout:
|
||||
if element==newElement:
|
||||
return
|
||||
listout.append(newElement)
|
||||
if order == True:
|
||||
if type(newElement) is not dict:
|
||||
listout.sort()
|
||||
|
||||
def list_append_to(out_list, in_list, order=False):
|
||||
if type(in_list) == str:
|
||||
list_append_and_check(out_list, in_list, order)
|
||||
elif type(in_list) == list:
|
||||
# mulyiple imput in the list ...
|
||||
for elem in in_list:
|
||||
list_append_and_check(out_list, elem, order)
|
||||
elif type(in_list) == dict:
|
||||
list_append_and_check(out_list, in_list, order)
|
||||
else:
|
||||
debug.warning("can not add in list other than {list/dict/str} : " + str(type(in_list)))
|
||||
|
||||
def list_append_to_2(listout, module, list, order=False):
|
||||
# sepcial cse of bool
|
||||
if type(list) == bool:
|
||||
listout[module] = list
|
||||
return
|
||||
# add list in the Map
|
||||
if module not in listout:
|
||||
listout[module] = []
|
||||
# add elements...
|
||||
list_append_to(listout[module], list, order)
|
45
setup.py
Executable file
45
setup.py
Executable file
@ -0,0 +1,45 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
##
|
||||
## @author Edouard DUPIN
|
||||
##
|
||||
## @copyright 2012, Edouard DUPIN, all right reserved
|
||||
##
|
||||
## @license APACHE v2.0 (see license file)
|
||||
##
|
||||
|
||||
from setuptools import setup
|
||||
|
||||
def readme():
|
||||
with open('README.rst') as f:
|
||||
return f.read()
|
||||
|
||||
# https://pypi.python.org/pypi?%3Aaction=list_classifiers
|
||||
setup(name='doxy',
|
||||
version='0.1.0',
|
||||
description='Doxy is a simple wrapper over doxygen to generate multiple documentation for c++ library',
|
||||
long_description=readme(),
|
||||
url='http://github.com/HeeroYui/doxy',
|
||||
author='Edouard DUPIN',
|
||||
author_email='yui.heero@gmail.com',
|
||||
license='APACHE-2',
|
||||
packages=['doxy'],
|
||||
classifiers=[
|
||||
'Development Status :: 4 - Beta',
|
||||
'License :: OSI Approved :: Apache Software License',
|
||||
'Programming Language :: Python',
|
||||
'Topic :: Software Development :: Compilers',
|
||||
],
|
||||
keywords='documentation over doxygen',
|
||||
scripts=['bin/doxy'],
|
||||
# Does not work on MacOs
|
||||
#data_file=[
|
||||
# ('/etc/bash_completion.d', ['bash-autocompletion/lutin']),
|
||||
#],
|
||||
include_package_data = True,
|
||||
zip_safe=False)
|
||||
|
||||
#To developp: sudo ./setup.py install
|
||||
# sudo ./setup.py develop
|
||||
#TO register all in pip: ./setup.py register sdist upload
|
||||
|
Loading…
Reference in New Issue
Block a user