@@ -17,79 +17,129 @@ def GenerateCFiles(env,project):
1717 info = utils .ProjectInfo (env )
1818
1919 CC = os .path .join (rtconfig .EXEC_PATH , rtconfig .CC ).replace ('\\ ' , "/" )
20- CXX = os .path .join (rtconfig .EXEC_PATH , rtconfig .CXX ).replace ('\\ ' , "/" )
20+ if 'CXX' in dir (rtconfig ):
21+ CXX = os .path .join (rtconfig .EXEC_PATH , rtconfig .CXX ).replace ('\\ ' , "/" )
22+ else :
23+ CXX = ''
2124 AS = os .path .join (rtconfig .EXEC_PATH , rtconfig .AS ).replace ('\\ ' , "/" )
2225 AR = os .path .join (rtconfig .EXEC_PATH , rtconfig .AR ).replace ('\\ ' , "/" )
2326 LINK = os .path .join (rtconfig .EXEC_PATH , rtconfig .LINK ).replace ('\\ ' , "/" )
24- SIZE = os .path .join (rtconfig .EXEC_PATH , rtconfig .SIZE ).replace ('\\ ' , "/" )
25- OBJDUMP = os .path .join (rtconfig .EXEC_PATH , rtconfig .OBJDUMP ).replace ('\\ ' , "/" )
26- OBJCOPY = os .path .join (rtconfig .EXEC_PATH , rtconfig .OBJCPY ).replace ('\\ ' , "/" )
27+ if rtconfig .PLATFORM == 'gcc' :
28+ SIZE = os .path .join (rtconfig .EXEC_PATH , rtconfig .SIZE ).replace ('\\ ' , "/" )
29+ OBJDUMP = os .path .join (rtconfig .EXEC_PATH , rtconfig .OBJDUMP ).replace ('\\ ' , "/" )
30+ OBJCOPY = os .path .join (rtconfig .EXEC_PATH , rtconfig .OBJCPY ).replace ('\\ ' , "/" )
31+ elif rtconfig .CROSS_TOOL == 'keil' :
32+ FROMELF = os .path .join (rtconfig .EXEC_PATH , 'fromelf' ).replace ('\\ ' , "/" )
33+
34+ CFLAGS = rtconfig .CFLAGS .replace ('\\ ' , "/" ).replace ('\" ' , "\\ \" " )
35+ if 'CXXFLAGS' in dir (rtconfig ):
36+ CXXFLAGS = rtconfig .CXXFLAGS .replace ('\\ ' , "/" ).replace ('\" ' , "\\ \" " )
37+ else :
38+ CXXFLAGS = CFLAGS
39+ AFLAGS = rtconfig .AFLAGS .replace ('\\ ' , "/" ).replace ('\" ' , "\\ \" " )
40+ LFLAGS = rtconfig .LFLAGS .replace ('\\ ' , "/" ).replace ('\" ' , "\\ \" " )
2741
2842 if "win32" in sys .platform :
2943 CC += ".exe"
30- CXX += ".exe"
44+ if CXX != '' :
45+ CXX += ".exe"
3146 AS += ".exe"
3247 AR += ".exe"
3348 LINK += ".exe"
34- SIZE += ".exe"
35- OBJDUMP += ".exe"
36- OBJCOPY += ".exe"
49+ if rtconfig .PLATFORM == 'gcc' :
50+ SIZE += ".exe"
51+ OBJDUMP += ".exe"
52+ OBJCOPY += ".exe"
53+ elif rtconfig .CROSS_TOOL == 'keil' :
54+ FROMELF += ".exe"
55+
56+ if not os .path .exists (CC ) or not os .path .exists (AS ) or not os .path .exists (AR ) or not os .path .exists (LINK ):
57+ print ("'Cannot found toolchain directory, please check RTT_CC and RTT_EXEC_PATH'" )
58+ sys .exit (- 1 )
3759
3860 cm_file = open ('CMakeLists.txt' , 'w' )
3961 if cm_file :
4062 cm_file .write ("CMAKE_MINIMUM_REQUIRED(VERSION 3.10)\n \n " )
4163
4264 cm_file .write ("SET(CMAKE_SYSTEM_NAME Generic)\n " )
65+ cm_file .write ("SET(CMAKE_SYSTEM_PROCESSOR " + rtconfig .CPU + ")\n " )
4366 cm_file .write ("#SET(CMAKE_VERBOSE_MAKEFILE ON)\n \n " )
4467
4568 cm_file .write ("SET(CMAKE_C_COMPILER \" " + CC + "\" )\n " )
46- cm_file .write ("SET(CMAKE_CXX_COMPILER \" " + CXX + "\" )\n " )
4769 cm_file .write ("SET(CMAKE_ASM_COMPILER \" " + AS + "\" )\n " )
48- cm_file .write ("SET(CMAKE_OBJCOPY \" " + OBJCOPY + "\" )\n " )
49- cm_file .write ("SET(CMAKE_SIZE \" " + SIZE + "\" )\n \n " )
50-
51-
52- cm_file .write ("SET(CMAKE_C_FLAGS \" " + rtconfig .CFLAGS .replace ('\\ ' , "/" ) + "\" )\n " )
53- cm_file .write ("SET(CMAKE_CXX_FLAGS \" " + rtconfig .CXXFLAGS .replace ('\\ ' , "/" ) + "\" )\n " )
54- cm_file .write ("SET(CMAKE_ASM_FLAGS \" " + rtconfig .AFLAGS .replace ('\\ ' , "/" ) + "\" )\n " )
55- cm_file .write ("SET(CMAKE_EXE_LINKER_FLAGS \" " + re .sub ('-T(\s*)' , '-T ${CMAKE_SOURCE_DIR}/' ,rtconfig .LFLAGS .replace ('\\ ' , "/" )) + "\" )\n \n " )
56-
57- cm_file .write ("SET(CMAKE_CXX_STANDARD 14)\n " )
58- cm_file .write ("PROJECT(rtthread C CXX ASM)\n " )
59-
70+ cm_file .write ("SET(CMAKE_C_FLAGS \" " + CFLAGS + "\" )\n " )
71+ cm_file .write ("SET(CMAKE_ASM_FLAGS \" " + AFLAGS + "\" )\n " )
72+ cm_file .write ("SET(CMAKE_C_COMPILER_WORKS TRUE)\n \n " )
73+
74+ if CXX != '' :
75+ cm_file .write ("SET(CMAKE_CXX_COMPILER \" " + CXX + "\" )\n " )
76+ cm_file .write ("SET(CMAKE_CXX_FLAGS \" " + CXXFLAGS + "\" )\n " )
77+ cm_file .write ("SET(CMAKE_CXX_COMPILER_WORKS TRUE)\n \n " )
78+
79+ if rtconfig .PLATFORM == 'gcc' :
80+ cm_file .write ("SET(CMAKE_OBJCOPY \" " + OBJCOPY + "\" )\n " )
81+ cm_file .write ("SET(CMAKE_SIZE \" " + SIZE + "\" )\n \n " )
82+ elif rtconfig .CROSS_TOOL == 'keil' :
83+ cm_file .write ("SET(CMAKE_FROMELF \" " + FROMELF + "\" )\n \n " )
84+
85+ LINKER_FLAGS = ''
86+ LINKER_LIBS = ''
87+ if rtconfig .PLATFORM == 'gcc' :
88+ LINKER_FLAGS += '-T'
89+ elif rtconfig .CROSS_TOOL == 'keil' :
90+ LINKER_FLAGS += '--scatter'
91+ for group in project :
92+ if 'LIBPATH' in group .keys ():
93+ for f in group ['LIBPATH' ]:
94+ LINKER_LIBS += ' --userlibpath ' + f .replace ("\\ " , "/" )
95+ for group in project :
96+ if 'LIBS' in group .keys ():
97+ for f in group ['LIBS' ]:
98+ LINKER_LIBS += ' ' + f .replace ("\\ " , "/" ) + '.lib'
99+ cm_file .write ("SET(CMAKE_EXE_LINKER_FLAGS \" " + re .sub (LINKER_FLAGS + '(\s*)' , LINKER_FLAGS + ' ${CMAKE_SOURCE_DIR}/' , LFLAGS ) + LINKER_LIBS + "\" )\n \n " )
100+
101+ if CXX != '' :
102+ cm_file .write ("SET(CMAKE_CXX_STANDARD 14)\n " )
103+ cm_file .write ("PROJECT(rtthread C CXX ASM)\n " )
104+ else :
105+ cm_file .write ("PROJECT(rtthread C ASM)\n " )
106+
60107 cm_file .write ("INCLUDE_DIRECTORIES(\n " )
61108 for i in info ['CPPPATH' ]:
62- cm_file .write ( "\t " + i .replace ("\\ " , "/" ) + "\n " )
109+ cm_file .write ( "\t " + i .replace ("\\ " , "/" ) + "\n " )
63110 cm_file .write (")\n \n " )
64111
65-
66112 cm_file .write ("ADD_DEFINITIONS(\n " )
67113 for i in info ['CPPDEFINES' ]:
68- cm_file .write ("\t -D" + i + "\n " )
114+ cm_file .write ("\t -D" + i + "\n " )
69115 cm_file .write (")\n \n " )
70116
71117 cm_file .write ("SET(PROJECT_SOURCES\n " )
72118 for group in project :
73119 for f in group ['src' ]:
74120 cm_file .write ( "\t " + os .path .normpath (f .rfile ().abspath ).replace ("\\ " , "/" ) + "\n " )
75121 cm_file .write (")\n \n " )
76-
77- cm_file .write ("LINK_DIRECTORIES(\n " )
78- for group in project :
79- if 'LIBPATH' in group .keys ():
80- for f in group ['LIBPATH' ]:
81- cm_file .write ( "\t " + f .replace ("\\ " , "/" ) + "\n " )
82- cm_file .write (")\n \n " )
83-
84- cm_file .write ("LINK_LIBRARIES(\n " )
85- for group in project :
86- if 'LIBS' in group .keys ():
87- for f in group ['LIBS' ]:
88- cm_file .write ( "\t " + "{}\n " .format (f .replace ("\\ " , "/" )))
89- cm_file .write (")\n \n " )
90122
91- cm_file .write ("ADD_EXECUTABLE(${CMAKE_PROJECT_NAME}.elf ${PROJECT_SOURCES})\n " )
92- cm_file .write ("ADD_CUSTOM_COMMAND(TARGET ${CMAKE_PROJECT_NAME}.elf POST_BUILD \n COMMAND ${CMAKE_OBJCOPY} -O binary ${CMAKE_PROJECT_NAME}.elf ${CMAKE_PROJECT_NAME}.bin COMMAND ${CMAKE_SIZE} ${CMAKE_PROJECT_NAME}.elf)" )
123+ if rtconfig .PLATFORM == 'gcc' :
124+ cm_file .write ("LINK_DIRECTORIES(\n " )
125+ for group in project :
126+ if 'LIBPATH' in group .keys ():
127+ for f in group ['LIBPATH' ]:
128+ cm_file .write ( "\t " + f .replace ("\\ " , "/" ) + "\n " )
129+ cm_file .write (")\n \n " )
130+
131+ cm_file .write ("LINK_LIBRARIES(\n " )
132+ for group in project :
133+ if 'LIBS' in group .keys ():
134+ for f in group ['LIBS' ]:
135+ cm_file .write ( "\t " + "{}\n " .format (f .replace ("\\ " , "/" )))
136+ cm_file .write (")\n \n " )
137+
138+ cm_file .write ("ADD_EXECUTABLE(${CMAKE_PROJECT_NAME}.elf ${PROJECT_SOURCES})\n " )
139+ cm_file .write ("ADD_CUSTOM_COMMAND(TARGET ${CMAKE_PROJECT_NAME}.elf POST_BUILD \n COMMAND ${CMAKE_OBJCOPY} -O binary ${CMAKE_PROJECT_NAME}.elf ${CMAKE_PROJECT_NAME}.bin COMMAND ${CMAKE_SIZE} ${CMAKE_PROJECT_NAME}.elf)" )
140+ elif rtconfig .CROSS_TOOL == 'keil' :
141+ cm_file .write ("ADD_EXECUTABLE(${CMAKE_PROJECT_NAME} ${PROJECT_SOURCES})\n " )
142+ cm_file .write ("ADD_CUSTOM_COMMAND(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD \n COMMAND ${CMAKE_FROMELF} --bin ${CMAKE_PROJECT_NAME}.elf --output ${CMAKE_PROJECT_NAME}.bin COMMAND ${CMAKE_FROMELF} -z ${CMAKE_PROJECT_NAME}.elf)" )
93143
94144 cm_file .close ()
95145
0 commit comments