forked from pavelliavonau/cmakeconverter
/
dependencies.py
112 lines (106 loc) · 5.21 KB
/
dependencies.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# -*- coding: utf-8 -*-
import os
import ntpath as path
import message as msg
import re
class Dependencies(object):
"""
Dependencies : find and write dependencies of project, additionnal directories...
"""
def __init__(self, data):
self.cmake = data['cmake']
self.tree = data['vcxproj']['tree']
self.ns = data['vcxproj']['ns']
self.dependencies = data['dependencies']
def write_include_dir(self):
"""
Include Directories : Add include directories required for compilation.
"""
incl_dir = self.tree.find('//ns:ItemGroup/ns:ClCompile/ns:AdditionalIncludeDirectories', namespaces=self.ns)
if incl_dir is not None:
self.cmake.write('# Include directories \n')
inc_dir = incl_dir.text.replace('$(ProjectDir)', './')
for i in inc_dir.split(';'):
i = i.replace('\\', '/')
i = re.sub(r'\$\((.+?)\)', r'$ENV{\1}', i)
self.cmake.write('include_directories(' + i + ')\n')
msg.send('Include Directories found : ' + i, 'warn')
self.cmake.write('\n')
else:
msg.send('Include Directories not found for this project.', 'warn')
def write_dependencies(self):
"""
Dependencies : Add subdirectories or link directories for external libraries.
"""
references = self.tree.xpath('//ns:ProjectReference', namespaces=self.ns)
if references:
self.cmake.write('################### Dependencies ##################\n'
'# Add Dependencies to project. #\n'
'###################################################\n\n')
self.cmake.write('option(BUILD_DEPENDS \n' +
' "Build other CMake project." \n' +
' ON \n' +
')\n\n')
self.cmake.write('# Dependencies : disable BUILD_DEPENDS to link with lib already build.\n')
if self.dependencies is None:
self.cmake.write('if(BUILD_DEPENDS)\n')
for ref in references:
reference = str(ref.get('Include'))
self.cmake.write(
' add_subdirectory(platform/cmake/' + os.path.splitext(path.basename(reference))[0] +
' ${CMAKE_BINARY_DIR}/' + os.path.splitext(path.basename(reference))[0] + ')\n')
else:
self.cmake.write('if(BUILD_DEPENDS)\n')
d = 1
for ref in self.dependencies:
self.cmake.write(
' add_subdirectory(' + ref + ' ${CMAKE_BINARY_DIR}/lib' + str(d) + ')\n')
msg.send('Add manually dependencies : ' + ref + '. Will be build in "lib' + str(d) + '/" !', 'warn')
d += 1
self.cmake.write('else()\n')
for ref in references:
reference = str(ref.get('Include'))
self.cmake.write(' link_directories(dependencies/' + os.path.splitext(path.basename(reference))[
0] + '/build/)\n')
self.cmake.write('endif()\n\n')
else:
msg.send('No link needed.', '')
def link_dependencies(self):
"""
Link : Add command to link dependencies to project.
"""
references = self.tree.xpath('//ns:ProjectReference', namespaces=self.ns)
if references:
self.cmake.write('# Link with other dependencies.\n')
self.cmake.write('target_link_libraries(${PROJECT_NAME} ')
for ref in references:
reference = str(ref.get('Include'))
lib = os.path.splitext(path.basename(reference))[0]
if lib == 'g3log':
lib += 'ger'
self.cmake.write(lib + ' ')
message = 'External librairy found : ' + os.path.splitext(path.basename(reference))[0]
msg.send(message, '')
self.cmake.write(')\n')
try:
if self.tree.xpath('//ns:AdditionalDependencies', namespaces=self.ns)[0] is not None:
depend = self.tree.xpath('//ns:AdditionalDependencies', namespaces=self.ns)[0]
listdepends = depend.text.replace('%(AdditionalDependencies)', '')
if listdepends != '':
msg.send('Additional Dependencies = ' + listdepends, 'ok')
windepends = []
for d in listdepends.split(';'):
if d != '%(AdditionalDependencies)':
if os.path.splitext(d)[1] == '.lib':
windepends.append(d)
if windepends is not None:
self.cmake.write('if(MSVC)\n')
self.cmake.write(' target_link_libraries(${PROJECT_NAME} ')
for dep in windepends:
self.cmake.write(dep + ' ')
self.cmake.write(')\n')
self.cmake.write('endif(MSVC)\n')
except IndexError:
msg.send('No dependencies', '')
else:
msg.send('No dependencies.', '')