An attempt to fix xcode-ide-integration
Added more Xcode specific files to .gitignore. Made some properties common in gbuil-to-ide to avoid code duplication/bugs. Xcode projects are broken for now. Change-Id: I9530435ffe54158ae68ddae0581ac68f968af235 Reviewed-on: https://gerrit.libreoffice.org/15694 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Michael Stahl <mstahl@redhat.com>
This commit is contained in:
parent
b7c8c337d4
commit
80bbca88d3
2 changed files with 60 additions and 55 deletions
18
.gitignore
vendored
18
.gitignore
vendored
|
@ -97,10 +97,22 @@ __pycache__
|
|||
.DS_Store
|
||||
|
||||
# Xcode specific
|
||||
build
|
||||
project.xcworkspace
|
||||
build/
|
||||
*.pbxuser
|
||||
!default.pbxuser
|
||||
*.mode1v3
|
||||
!default.mode1v3
|
||||
*.mode2v3
|
||||
!default.mode2v3
|
||||
*.perspectivev3
|
||||
!default.perspectivev3
|
||||
xcuserdata
|
||||
*.xuserstate
|
||||
*.xcuserstate
|
||||
*.xccheckout
|
||||
*.moved-aside
|
||||
DerivedData
|
||||
*.xcodeproj
|
||||
*.xcworkspace
|
||||
|
||||
# MSVS specific
|
||||
*/Debug
|
||||
|
|
|
@ -103,7 +103,7 @@ class GbuildParser:
|
|||
|
||||
def __init__(self):
|
||||
(self.makecmd, self.srcdir, self.builddir, self.instdir, self.libs,
|
||||
self.exes, self.libnames, self.exenames) = ('', '', '', '', [], [], {}, {})
|
||||
self.exes, self.libnames, self.exenames, self.target_by_path, self.target_by_location) = ('', '', '', '', [], [], {}, {}, {}, {})
|
||||
|
||||
def __mapping_to_dict(self, mapping):
|
||||
mapping_dict = {}
|
||||
|
@ -215,6 +215,21 @@ class GbuildParser:
|
|||
self.exenames = self.__mapping_to_dict(exenamesmatch.group(1))
|
||||
continue
|
||||
state = GbuildParserState()
|
||||
|
||||
for target in set(self.libs) | set(self.exes):
|
||||
if target.location not in self.target_by_location:
|
||||
self.target_by_location[target.location] = set()
|
||||
self.target_by_location[target.location] |= set([target])
|
||||
for cxx in target.cxxobjects:
|
||||
path = '/'.join(cxx.split('/')[:-1])
|
||||
if path not in self.target_by_path:
|
||||
self.target_by_path[path] = set()
|
||||
self.target_by_path[path] |= set([target])
|
||||
for path in self.target_by_path:
|
||||
if len(self.target_by_path[path]) > 1:
|
||||
print('fdo#70422: multiple target use dir %s: %s' % (
|
||||
path, ', '.join([target.short_name() for target in self.target_by_path[path]])))
|
||||
|
||||
return self
|
||||
|
||||
|
||||
|
@ -462,40 +477,26 @@ VersionControl=kdevgit
|
|||
def write_includepaths(self, path):
|
||||
includedirfile = open(os.path.join(path, '.kdev_include_paths'), 'w')
|
||||
include = set()
|
||||
for target in self.target_by_path[path]:
|
||||
for target in self.gbuildparser.target_by_path[path]:
|
||||
include |= set(target.include)
|
||||
includedirfile.write('\n'.join(include))
|
||||
includedirfile.close()
|
||||
|
||||
def __init__(self, gbuildparser, ide):
|
||||
IdeIntegrationGenerator.__init__(self, gbuildparser, ide)
|
||||
self.target_by_location = {}
|
||||
self.target_by_path = {}
|
||||
for target in set(self.gbuildparser.libs) | set(self.gbuildparser.exes):
|
||||
if target.location not in self.target_by_location:
|
||||
self.target_by_location[target.location] = set()
|
||||
self.target_by_location[target.location] |= set([target])
|
||||
for cxx in target.cxxobjects:
|
||||
path = '/'.join(cxx.split('/')[:-1])
|
||||
if path not in self.target_by_path:
|
||||
self.target_by_path[path] = set()
|
||||
self.target_by_path[path] |= set([target])
|
||||
for path in self.target_by_path:
|
||||
if len(self.target_by_path[path]) > 1:
|
||||
print('fdo#70422: multiple target use dir %s: %s' % (
|
||||
path, ', '.join([target.short_name() for target in self.target_by_path[path]])))
|
||||
|
||||
|
||||
def emit(self):
|
||||
for path in self.target_by_path:
|
||||
for path in self.gbuildparser.target_by_path:
|
||||
self.write_includepaths(path)
|
||||
for location in self.target_by_location:
|
||||
for location in self.gbuildparser.target_by_location:
|
||||
for f in os.listdir(location):
|
||||
if f.endswith('.kdev4'):
|
||||
try:
|
||||
os.remove(os.path.join(location, f))
|
||||
except OSError:
|
||||
shutil.rmtree(os.path.join(location, f))
|
||||
for location in self.target_by_location:
|
||||
for location in self.gbuildparser.target_by_location:
|
||||
modulename = os.path.split(location)[1]
|
||||
self.write_modulestub(location, modulename)
|
||||
self.write_modulebeef(location, modulename)
|
||||
|
@ -601,10 +602,11 @@ class XcodeIntegrationGenerator(IdeIntegrationGenerator):
|
|||
'sourceTree': '<group>'}
|
||||
return result
|
||||
|
||||
def build_source_list(self, modulename):
|
||||
self.sourceList = {}
|
||||
def build_source_list(self, module):
|
||||
self.sourceRefList = {}
|
||||
for i in self.gbuildparser.libs[modulename].cxxobjects:
|
||||
self.sourceList = {}
|
||||
|
||||
for i in module.cxxobjects:
|
||||
ref = self.generate_id()
|
||||
self.sourceList[self.generate_id()] = ref
|
||||
self.sourceRefList[ref] = {'lastKnownFileType': 'sourcecode.cpp.cpp',
|
||||
|
@ -618,7 +620,7 @@ class XcodeIntegrationGenerator(IdeIntegrationGenerator):
|
|||
'runOnlyForDeploymentPostprocessing': 0}
|
||||
return result
|
||||
|
||||
def generate_project(self, modulename):
|
||||
def generate_project(self, target):
|
||||
self.rootObjectId = self.generate_id()
|
||||
self.mainGroupId = self.generate_id()
|
||||
self.subMainGroupId = self.generate_id()
|
||||
|
@ -626,14 +628,14 @@ class XcodeIntegrationGenerator(IdeIntegrationGenerator):
|
|||
self.productRefGroupId = self.generate_id()
|
||||
self.productGroupId = self.generate_id()
|
||||
self.targetId = self.generate_id()
|
||||
self.build_source_list(modulename)
|
||||
self.build_source_list(target)
|
||||
self.sourcesBuildPhaseId = self.generate_id()
|
||||
objects = {self.rootObjectId: self.generate_root_object(modulename),
|
||||
self.targetId: self.generate_target(modulename),
|
||||
self.mainGroupId: self.generate_main_group(modulename),
|
||||
self.subMainGroupId: self.generate_sub_main_group(modulename),
|
||||
self.productGroupId: self.generate_product_group(modulename),
|
||||
self.sourcesBuildPhaseId: self.generate_sources_build_phase(modulename)
|
||||
objects = {self.rootObjectId: self.generate_root_object(target),
|
||||
self.targetId: self.generate_target(target),
|
||||
self.mainGroupId: self.generate_main_group(target),
|
||||
self.subMainGroupId: self.generate_sub_main_group(target),
|
||||
self.productGroupId: self.generate_product_group(target),
|
||||
self.sourcesBuildPhaseId: self.generate_sources_build_phase(target)
|
||||
}
|
||||
for i in self.sourceList.keys():
|
||||
ref = self.sourceList[i]
|
||||
|
@ -651,28 +653,26 @@ class XcodeIntegrationGenerator(IdeIntegrationGenerator):
|
|||
|
||||
# For some reverse-engineered documentation on the project.pbxproj format,
|
||||
# see http://www.monobjc.net/xcode-project-file-format.html .
|
||||
def write_xcodeproj(self, moduledir, modulename):
|
||||
xcodeprojdir = os.path.join(moduledir, '%s.xcodeproj' % modulename)
|
||||
def write_xcodeproj(self, moduledir, target):
|
||||
xcodeprojdir = os.path.join(moduledir, '%s.xcodeproj' % target.name)
|
||||
try:
|
||||
os.mkdir(xcodeprojdir)
|
||||
except:
|
||||
pass
|
||||
self.write_dict_to_plist(self.generate_project(modulename),
|
||||
self.write_dict_to_plist(self.generate_project(target),
|
||||
open(os.path.join(xcodeprojdir, 'project.pbxproj'), 'w'))
|
||||
|
||||
def __init__(self, gbuildparser, ide):
|
||||
IdeIntegrationGenerator.__init__(self, gbuildparser, ide)
|
||||
self.target_by_location = {}
|
||||
for target in set(self.gbuildparser.libs) | set(self.gbuildparser.exes):
|
||||
if target.location not in self.target_by_location:
|
||||
self.target_by_location[target.location] = set()
|
||||
self.target_by_location[target.location] |= set([target])
|
||||
|
||||
def emit(self):
|
||||
for location in self.target_by_location:
|
||||
modulename = os.path.split(location)[1]
|
||||
self.write_xcodeproj(location, modulename)
|
||||
|
||||
self.rootlocation = './'
|
||||
for location in self.gbuildparser.target_by_location:
|
||||
module = location.split('/')[-1]
|
||||
module_directory = os.path.join(self.rootlocation, module)
|
||||
for target in self.gbuildparser.target_by_location[location]:
|
||||
# project_path = os.path.join(module_directory, '%s.pbxroj' % target.name)
|
||||
self.write_xcodeproj(location, target)
|
||||
|
||||
class VisualStudioIntegrationGenerator(IdeIntegrationGenerator):
|
||||
|
||||
|
@ -697,13 +697,6 @@ class VisualStudioIntegrationGenerator(IdeIntegrationGenerator):
|
|||
'rebuild': self.module_make_command('clean unitcheck slowcheck subsequentcheck')
|
||||
}
|
||||
}
|
||||
self.target_by_location = {}
|
||||
for target in set(self.gbuildparser.libs) | set(self.gbuildparser.exes):
|
||||
if target.is_empty():
|
||||
continue
|
||||
if target.location not in self.target_by_location:
|
||||
self.target_by_location[target.location] = set()
|
||||
self.target_by_location[target.location] |= set([target])
|
||||
|
||||
def retrieve_toolset(self, ide):
|
||||
ide_toolset_map = {'vs2012': 'v110', 'vs2013': 'v120'}
|
||||
|
@ -721,11 +714,11 @@ class VisualStudioIntegrationGenerator(IdeIntegrationGenerator):
|
|||
|
||||
def emit(self):
|
||||
all_projects = []
|
||||
for location in self.target_by_location:
|
||||
for location in self.gbuildparser.target_by_location:
|
||||
projects = []
|
||||
module = location.split('/')[-1]
|
||||
module_directory = os.path.join(self.solution_directory, module)
|
||||
for target in self.target_by_location[location]:
|
||||
for target in self.gbuildparser.target_by_location[location]:
|
||||
project_path = os.path.join(module_directory, '%s.vcxproj' % target.name)
|
||||
project_guid = self.write_project(project_path, target)
|
||||
p = VisualStudioIntegrationGenerator.Project(project_guid, target, project_path)
|
||||
|
|
Loading…
Reference in a new issue