mirror of https://github.com/ARMmbed/mbed-os.git
Added Netbeans Exporter
parent
b025ea16d6
commit
1b30df938c
|
|
@ -33,6 +33,7 @@ from tools.export import embitz, coide, kds, simplicity, atmelstudio, mcuxpresso
|
|||
from tools.export import sw4stm32, e2studio, zip, cmsis, uvision, cdt, vscode
|
||||
from tools.export import gnuarmeclipse
|
||||
from tools.export import qtcreator
|
||||
from tools.export import nb
|
||||
from tools.targets import TARGET_NAMES
|
||||
|
||||
EXPORTERS = {
|
||||
|
|
@ -57,11 +58,15 @@ EXPORTERS = {
|
|||
'eclipse_iar' : cdt.EclipseIAR,
|
||||
'eclipse_armc5' : cdt.EclipseArmc5,
|
||||
'gnuarmeclipse': gnuarmeclipse.GNUARMEclipse,
|
||||
#'netbeans': nb.Netbeans,
|
||||
'mcuxpresso': mcuxpresso.MCUXpresso,
|
||||
'qtcreator': qtcreator.QtCreator,
|
||||
'vscode_gcc_arm' : vscode.VSCodeGcc,
|
||||
'vscode_iar' : vscode.VSCodeIAR,
|
||||
'vscode_armc5' : vscode.VSCodeArmc5
|
||||
'vscode_armc5' : vscode.VSCodeArmc5,
|
||||
'netbeans_gcc_arm' : nb.NetbeansGcc,
|
||||
'netbeans_iar' : nb.NetbeansIAR,
|
||||
'netbeans_armc5' : nb.NetbeansArmc5
|
||||
}
|
||||
|
||||
ERROR_MESSAGE_UNSUPPORTED_TOOLCHAIN = """
|
||||
|
|
|
|||
|
|
@ -0,0 +1,190 @@
|
|||
import re
|
||||
import os
|
||||
import copy
|
||||
|
||||
from os.path import relpath, join, exists
|
||||
from os import makedirs
|
||||
|
||||
from tools.export.makefile import Makefile, GccArm, Armc5, IAR
|
||||
|
||||
|
||||
class Netbeans(Makefile):
|
||||
"""Generic Netbeans project. Intended to be subclassed by classes that
|
||||
specify a type of Makefile.
|
||||
"""
|
||||
|
||||
@property
|
||||
def flags(self):
|
||||
"""Returns a dictionary of toolchain flags.
|
||||
Keys of the dictionary are:
|
||||
cxx_flags - c++ flags
|
||||
c_flags - c flags
|
||||
ld_flags - linker flags
|
||||
asm_flags - assembler flags
|
||||
common_flags - common options
|
||||
|
||||
The difference from the parent function is that it does not
|
||||
add macro definitions, since they are passed separately.
|
||||
"""
|
||||
|
||||
config_header = self.toolchain.get_config_header()
|
||||
flags = {key + "_flags": copy.deepcopy(value) for key, value
|
||||
in self.toolchain.flags.iteritems()}
|
||||
if config_header:
|
||||
config_header = relpath(config_header,
|
||||
self.resources.file_basepath[config_header])
|
||||
flags['c_flags'] += self.toolchain.get_config_option(config_header)
|
||||
flags['cxx_flags'] += self.toolchain.get_config_option(
|
||||
config_header)
|
||||
return flags
|
||||
|
||||
def generate(self):
|
||||
"""Generate Makefile, configurations.xml & project.xml Netbeans project file
|
||||
"""
|
||||
super(Netbeans, self).generate()
|
||||
|
||||
defines = [] # list of tuples ('D'/'U', [key, value]) (value is optional)
|
||||
forced_includes = [] # list of strings
|
||||
sources = [] # list of strings
|
||||
headers = [] # list of strings
|
||||
|
||||
next_is_include = False
|
||||
for f in self.flags['c_flags'] + self.flags['cxx_flags']:
|
||||
f = f.strip()
|
||||
if next_is_include:
|
||||
forced_includes.append(f)
|
||||
next_is_include = False
|
||||
continue
|
||||
if f.startswith('-D'):
|
||||
defines.append(('D', f[2:].split('=', 1)))
|
||||
elif f.startswith('-U'):
|
||||
defines.append(('U', [f[2:]]))
|
||||
elif f == "-include":
|
||||
next_is_include = True
|
||||
|
||||
# Convert all Backslashes to Forward Slashes
|
||||
self.resources.win_to_unix()
|
||||
|
||||
for r_type in ['c_sources', 's_sources', 'cpp_sources']:
|
||||
sources.extend(getattr(self.resources, r_type))
|
||||
|
||||
for r_type in ['headers']:
|
||||
headers.extend(getattr(self.resources, r_type))
|
||||
|
||||
starting_dot = re.compile(r'(^[.]/|^[.]$)')
|
||||
sources = [starting_dot.sub('', field) for field in sources]
|
||||
headers = [starting_dot.sub('', field) for field in headers]
|
||||
include_paths = [starting_dot.sub('', field) for field in self.resources.inc_dirs]
|
||||
|
||||
headers.sort()
|
||||
sources.sort()
|
||||
|
||||
headers_output = create_netbeans_file_list(headers)
|
||||
sources_output = create_netbeans_file_list(sources)
|
||||
ctx = {
|
||||
'name': self.project_name,
|
||||
'elf_location': join('BUILD', self.project_name) + '.elf',
|
||||
'c_symbols': self.toolchain.get_symbols(),
|
||||
'asm_symbols': self.toolchain.get_symbols(True),
|
||||
'c_flags': self.flags['c_flags'],
|
||||
'cxx_flags': self.flags['cxx_flags'],
|
||||
'ld_flags': self.flags['ld_flags'],
|
||||
'asm_flags': self.flags['asm_flags'],
|
||||
'common_flags': self.flags['common_flags'],
|
||||
'target': self.target,
|
||||
'include_paths': include_paths,
|
||||
'sources': sources,
|
||||
'headers': headers,
|
||||
'headers_folder': headers_output,
|
||||
'sources_folder': sources_output,
|
||||
'load_exe': str(self.LOAD_EXE).lower()
|
||||
}
|
||||
|
||||
if not exists(join(self.export_dir, 'nbproject')):
|
||||
makedirs(join(self.export_dir, 'nbproject'))
|
||||
|
||||
self.gen_file('nb/configurations.tmpl', ctx, 'nbproject/configurations.xml')
|
||||
self.gen_file('nb/project.tmpl', ctx, 'nbproject/project.xml')
|
||||
self.gen_file('nb/mbedignore.tmpl', ctx, '.mbedignore')
|
||||
|
||||
|
||||
def create_netbeans_file_list(file_list):
|
||||
output = []
|
||||
prev_dir = ''
|
||||
folder_count = 1
|
||||
for idx, item in enumerate(file_list):
|
||||
cur_dir = os.path.dirname(item)
|
||||
dir_temp = os.path.normpath(cur_dir)
|
||||
prev_dir_temp = os.path.normpath(prev_dir)
|
||||
dir_list = dir_temp.split(os.sep)
|
||||
prev_dir_list = prev_dir_temp.split(os.sep)
|
||||
dir_depth = len(dir_list)
|
||||
|
||||
# print 'PREV_DIR: ' + str(prev_dir_list)
|
||||
|
||||
# print 'CURR_DIR: ' + str(dir_list)
|
||||
|
||||
# Current File is in Directory: Compare the given dir with previous Dir
|
||||
if cur_dir and prev_dir != cur_dir:
|
||||
# evaluate all matched items (from current and previous list)
|
||||
matched = []
|
||||
for element in dir_list:
|
||||
if element in prev_dir_list:
|
||||
matched.append(element)
|
||||
|
||||
# calculate difference between matched and length
|
||||
diff = dir_depth - len(matched)
|
||||
|
||||
# print 'MATCHED: ' + str(matched)
|
||||
|
||||
# if previous dir was not root
|
||||
if prev_dir != '':
|
||||
# if the elements count is not equal we calculate the difference
|
||||
if len(dir_list) != len(prev_dir_list):
|
||||
dir_depth_prev = len(prev_dir_list)
|
||||
delta = dir_depth_prev - len(matched)
|
||||
|
||||
for i in range(dir_depth_prev - delta, dir_depth_prev):
|
||||
output.append('</logicalFolder>')
|
||||
|
||||
# if the elements count is equal, we subtract the matched length from the total length
|
||||
else:
|
||||
for i in range(len(matched), len(dir_list)):
|
||||
output.append('</logicalFolder>')
|
||||
|
||||
for i in range(dir_depth - diff, dir_depth):
|
||||
output.append('<logicalFolder name="f' + str(folder_count) + '" displayName="' + str(
|
||||
dir_list[i]) + '" projectFiles="true">')
|
||||
folder_count += 1
|
||||
|
||||
# Current File is in root
|
||||
else:
|
||||
# Close Tag if we are in root and the previous dir wasn't
|
||||
if cur_dir == '' and prev_dir != '':
|
||||
for i in range(0, len(prev_dir_list)):
|
||||
output.append('</logicalFolder>')
|
||||
|
||||
# Save the Current Dir
|
||||
prev_dir = cur_dir
|
||||
output.append('<itemPath>' + str(item) + '</itemPath>')
|
||||
# if last iteration close all open tags
|
||||
if idx == len(file_list) - 1 and cur_dir != '':
|
||||
for i in range(0, len(dir_list)):
|
||||
output.append('</logicalFolder>')
|
||||
|
||||
return output
|
||||
|
||||
|
||||
class NetbeansGcc(Netbeans, GccArm):
|
||||
LOAD_EXE = True
|
||||
NAME = "Netbeans-GCC-ARM"
|
||||
|
||||
|
||||
class NetbeansArmc5(Netbeans, Armc5):
|
||||
LOAD_EXE = False
|
||||
NAME = "Netbeans-Armc5"
|
||||
|
||||
|
||||
class NetbeansIAR(Netbeans, IAR):
|
||||
LOAD_EXE = True
|
||||
NAME = "Netbeans-IAR"
|
||||
|
|
@ -0,0 +1,205 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<configurationDescriptor version="100">
|
||||
<logicalFolder name="root" displayName="root" projectFiles="true" kind="ROOT">
|
||||
|
||||
|
||||
<logicalFolder name="HeaderFiles"
|
||||
displayName="Header Files"
|
||||
projectFiles="true">
|
||||
{% for header in headers_folder -%}
|
||||
{{ header }}
|
||||
{% endfor %}
|
||||
</logicalFolder>
|
||||
<logicalFolder name="ResourceFiles"
|
||||
displayName="Resource Files"
|
||||
projectFiles="true">
|
||||
</logicalFolder>
|
||||
<logicalFolder name="SourceFiles"
|
||||
displayName="Source Files"
|
||||
projectFiles="true">
|
||||
{% for source in sources_folder -%}
|
||||
{{ source }}
|
||||
{% endfor %}
|
||||
</logicalFolder>
|
||||
<logicalFolder name="TestFiles"
|
||||
displayName="Test Files"
|
||||
projectFiles="false"
|
||||
kind="TEST_LOGICAL_FOLDER">
|
||||
</logicalFolder>
|
||||
<logicalFolder name="ExternalFiles"
|
||||
displayName="Important Files"
|
||||
projectFiles="false"
|
||||
kind="IMPORTANT_FILES_FOLDER">
|
||||
<itemPath>Makefile</itemPath>
|
||||
</logicalFolder>
|
||||
</logicalFolder>
|
||||
<projectmakefile>Makefile</projectmakefile>
|
||||
<confs>
|
||||
<conf name="Debug" type="1">
|
||||
<toolsSet>
|
||||
<compilerSet>default</compilerSet>
|
||||
<dependencyChecking>true</dependencyChecking>
|
||||
<rebuildPropChanged>false</rebuildPropChanged>
|
||||
</toolsSet>
|
||||
<compileType>
|
||||
<cTool>
|
||||
<incDir>
|
||||
{% for include in include_paths -%}
|
||||
<pElem>{{ include }}</pElem>
|
||||
{% endfor %}
|
||||
</incDir>
|
||||
<commandLine>
|
||||
{% for flag in c_flags -%}
|
||||
{{ flag }}
|
||||
{% endfor %}
|
||||
</commandLine>
|
||||
<preprocessorList>
|
||||
{% for symbol in c_symbols -%}
|
||||
<Elem>{{ symbol }}</Elem>
|
||||
{% endfor %}
|
||||
</preprocessorList>
|
||||
</cTool>
|
||||
<ccTool>
|
||||
<incDir>
|
||||
{% for include in include_paths -%}
|
||||
<pElem>{{ include }}</pElem>
|
||||
{% endfor %}
|
||||
</incDir>
|
||||
<commandLine>
|
||||
{% for flag in cxx_flags -%}
|
||||
{{ flag }}
|
||||
{% endfor %}
|
||||
</commandLine>
|
||||
<preprocessorList>
|
||||
{% for symbol in c_symbols -%}
|
||||
<Elem>{{ symbol }}</Elem>
|
||||
{% endfor %}
|
||||
</preprocessorList>
|
||||
</ccTool>
|
||||
<fortranCompilerTool>
|
||||
<developmentMode>5</developmentMode>
|
||||
</fortranCompilerTool>
|
||||
<asmTool>
|
||||
<developmentMode>5</developmentMode>
|
||||
<incDir>
|
||||
{% for include in include_paths -%}
|
||||
<pElem>{{ include }}</pElem>
|
||||
{% endfor %}
|
||||
</incDir>
|
||||
<commandLine>
|
||||
{% for flag in asm_flags -%}
|
||||
{{ flag }}
|
||||
{% endfor %}
|
||||
</commandLine>
|
||||
<preprocessorList>
|
||||
{% for symbol in asm_symbols -%}
|
||||
<Elem>{{ symbol }}</Elem>
|
||||
{% endfor %}
|
||||
</preprocessorList>
|
||||
</asmTool>
|
||||
<linkerTool>
|
||||
<commandLine>
|
||||
{% for flag in ld_flags -%}
|
||||
{{ flag }}
|
||||
{% endfor %}
|
||||
</commandLine>
|
||||
</linkerTool>
|
||||
|
||||
</compileType>
|
||||
{% for h in headers -%}
|
||||
<item path="{{h}}" ex="false" tool="3" flavor2="0">
|
||||
</item>
|
||||
{% endfor %}
|
||||
{% for s in sources -%}
|
||||
<item path="{{s}}" ex="false" tool="1" flavor2="0">
|
||||
</item>
|
||||
{% endfor %}
|
||||
|
||||
<item path="main.cpp" ex="false" tool="1" flavor2="0">
|
||||
</item>
|
||||
</conf>
|
||||
<conf name="Release" type="1">
|
||||
<toolsSet>
|
||||
<compilerSet>default</compilerSet>
|
||||
<dependencyChecking>true</dependencyChecking>
|
||||
<rebuildPropChanged>false</rebuildPropChanged>
|
||||
</toolsSet>
|
||||
<compileType>
|
||||
{% for h in headers -%}
|
||||
<item path="{{h}}" ex="false" tool="3" flavor2="0">
|
||||
</item>
|
||||
{% endfor %}
|
||||
{% for s in sources -%}
|
||||
<item path="{{s}}" ex="false" tool="1" flavor2="0">
|
||||
</item>
|
||||
{% endfor %}
|
||||
<cTool>
|
||||
<developmentMode>5</developmentMode>
|
||||
<incDir>
|
||||
{% for include in include_paths -%}
|
||||
<pElem>{{ include }}</pElem>
|
||||
{% endfor %}
|
||||
</incDir>
|
||||
<commandLine>
|
||||
{% for flag in c_flags -%}
|
||||
{{ flag }}
|
||||
{% endfor %}
|
||||
</commandLine>
|
||||
<preprocessorList>
|
||||
{% for symbol in c_symbols -%}
|
||||
<Elem>{{ symbol }}</Elem>
|
||||
{% endfor %}
|
||||
</preprocessorList>
|
||||
</cTool>
|
||||
<ccTool>
|
||||
<developmentMode>5</developmentMode>
|
||||
<incDir>
|
||||
{% for include in include_paths -%}
|
||||
<pElem>{{ include }}</pElem>
|
||||
{% endfor %}
|
||||
</incDir>
|
||||
<commandLine>
|
||||
{% for flag in cxx_flags -%}
|
||||
{{ flag }}
|
||||
{% endfor %}
|
||||
</commandLine>
|
||||
<preprocessorList>
|
||||
{% for symbol in c_symbols -%}
|
||||
<Elem>{{ symbol }}</Elem>
|
||||
{% endfor %}
|
||||
</preprocessorList>
|
||||
</ccTool>
|
||||
<fortranCompilerTool>
|
||||
<developmentMode>5</developmentMode>
|
||||
</fortranCompilerTool>
|
||||
<asmTool>
|
||||
<developmentMode>5</developmentMode>
|
||||
<incDir>
|
||||
{% for include in include_paths -%}
|
||||
<pElem>{{ include }}</pElem>
|
||||
{% endfor %}
|
||||
</incDir>
|
||||
<commandLine>
|
||||
{% for flag in asm_flags -%}
|
||||
{{ flag }}
|
||||
{% endfor %}
|
||||
</commandLine>
|
||||
<preprocessorList>
|
||||
{% for symbol in asm_symbols -%}
|
||||
<Elem>{{ symbol }}</Elem>
|
||||
{% endfor %}
|
||||
</preprocessorList>
|
||||
</asmTool>
|
||||
<linkerTool>
|
||||
<commandLine>
|
||||
{% for flag in ld_flags -%}
|
||||
{{ flag }}
|
||||
{% endfor %}
|
||||
</commandLine>
|
||||
</linkerTool>
|
||||
</compileType>
|
||||
<item path="main.cpp" ex="false" tool="1" flavor2="0">
|
||||
</item>
|
||||
</conf>
|
||||
</confs>
|
||||
</configurationDescriptor>
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
nbproject/private/*.cpp
|
||||
nbproject/private/*.c
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://www.netbeans.org/ns/project/1">
|
||||
<type>org.netbeans.modules.cnd.makeproject</type>
|
||||
<configuration>
|
||||
<data xmlns="http://www.netbeans.org/ns/make-project/1">
|
||||
<name>{{name}}</name>
|
||||
<c-extensions/>
|
||||
<cpp-extensions>cpp</cpp-extensions>
|
||||
<header-extensions/>
|
||||
<sourceEncoding>UTF-8</sourceEncoding>
|
||||
<make-dep-projects/>
|
||||
<sourceRootList/>
|
||||
<confList>
|
||||
<confElem>
|
||||
<name>Debug</name>
|
||||
<type>1</type>
|
||||
</confElem>
|
||||
<confElem>
|
||||
<name>Release</name>
|
||||
<type>1</type>
|
||||
</confElem>
|
||||
</confList>
|
||||
<formatting>
|
||||
<project-formatting-style>false</project-formatting-style>
|
||||
</formatting>
|
||||
</data>
|
||||
</configuration>
|
||||
</project>
|
||||
Loading…
Reference in New Issue