History

Added cross compilation to CMake build system.

Brings it more into line with make based system. I've tested on 32- and 64-bit Windows, but not yet Linux.

James Lyon committed 13 years ago

Commit e7a7efe1 parent 5c35ba66 files · +263 −112Browse files

Unified · Split

6 files
  1. CMakeLists.txt +221 −88
  2. config.h.in +1 −0
  3. config.texi.in +1 −0
  4. lib/libtcc1.c +3 −7
  5. tests/CMakeLists.txt +22 −17
  6. tests/tcctest.py +15 −0
CMakeLists.txt+221−88
@@ -2,20 +2,19 @@ project(tcc C) · 1 unmodified line
22 cmake_minimum_required(VERSION 2.6)
33 enable_testing()
44
5−set(CMAKE_USE_RELATIVE_PATHS ON)
6−
5+# Detect native platform
76 if(WIN32)
87 set(BUILD_SHARED_LIBS ON)
98 if(CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM")
10− set(TCC_TARGET_DEFAULT "WinCE")
9+ set(TCC_NATIVE_TARGET "WinCE")
1110 elseif(CMAKE_SIZEOF_VOID_P EQUAL 8)
12− set(TCC_TARGET_DEFAULT "Win64")
11+ set(TCC_NATIVE_TARGET "Win64")
1312 else()
14− set(TCC_TARGET_DEFAULT "Win32")
13+ set(TCC_NATIVE_TARGET "Win32")
1514 endif()
1615 else()
1716 if(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm")
18− set(TCC_TARGET_DEFAULT "ARM")
17+ set(TCC_NATIVE_TARGET "ARM")
1918 if(CMAKE_SYSTEM_PROCESSOR MATCHES "^armv5")
2019 set(TCC_ARM_VERSION_DEFAULT 5)
2120 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^armv6")
@@ -26,108 +25,242 @@ else() · 4 unmodified lines
2625 set(TCC_ARM_VERSION_DEFAULT 4)
2726 endif()
2827 elseif(CMAKE_SIZEOF_VOID_P EQUAL 8)
29− set(TCC_TARGET_DEFAULT "x86_64")
28+ set(TCC_NATIVE_TARGET "x86_64")
3029 else()
31− set(TCC_TARGET_DEFAULT "i386")
30+ set(TCC_NATIVE_TARGET "i386")
3231 endif()
3332 endif()
3433
35−set(TCC_TARGET_LIST "Win32" "Win64" "WinCE" "i386" "x86_64" "ARM" "C67")
36−set(TCC_TARGET ${TCC_TARGET_DEFAULT} CACHE STRING "Target OS")
37−set_property(CACHE TCC_TARGET PROPERTY STRINGS ${TCC_TARGET_LIST})
34+if(WIN32)
35+ set(EXE_PATH ".")
36+ set(TCC_LIB_PATH lib)
37+ set(NATIVE_LIB_PATH)
38+ set(DOC_PATH doc)
39+else()
40+ set(EXE_PATH bin)
41+ set(TCC_LIB_PATH lib/tcc)
42+ set(NATIVE_LIB_PATH lib)
43+ set(DOC_PATH share/doc/tcc)
44+endif()
3845
39−set(TCC_ARM_VERSION ${TCC_ARM_VERSION_DEFAULT} CACHE STRING "ARM target CPU version")
40−set_property(CACHE TCC_ARM_VERSION PROPERTY STRINGS 4 5 6 7)
41−set(TCC_ARM_EABI OFF CACHE BOOL "Enable EABI on ARM")
42−set(TCC_ARM_VFP OFF CACHE BOOL "Enable VFP on ARM")
43−set(TCC_ARM_HARDFLOAT OFF CACHE BOOL "Enable hardware floating point on ARM")
46+# Use two variables to keep CMake configuration variable names consistent
47+set(TCC_BCHECK OFF CACHE BOOL "Enable bounds checking")
48+set(CONFIG_TCC_BCHECK ${TCC_BCHECK})
4449
45−set(I386_SOURCES i386-gen.c i386-asm.c i386-asm.h i386-tok.h)
46−set(X86_64_SOURCES x86_64-gen.c i386-asm.c x86_64-asm.h)
50+set(TCC_BUILD_NATIVE ON CACHE BOOL "Build native compiler")
51+set(TCC_BUILD_I386 OFF CACHE BOOL "Build i386 cross compiler")
52+set(TCC_BUILD_X64 OFF CACHE BOOL "Build x86-64 cross compiler")
53+set(TCC_BUILD_WIN32 OFF CACHE BOOL "Build Windows i386 cross compiler")
54+set(TCC_BUILD_WIN64 OFF CACHE BOOL "Build Windows x86-64 cross compiler")
55+set(TCC_BUILD_WINCE OFF CACHE BOOL "Build Windows CE cross compiler")
56+set(TCC_BUILD_ARM_FPA OFF CACHE BOOL "Build arm-fpa cross compiler")
57+set(TCC_BUILD_ARM_FPA_LD OFF CACHE BOOL "Build arm-fpa-ld cross compiler")
58+set(TCC_BUILD_ARM_VFP OFF CACHE BOOL "Build arm-vfp cross compiler")
59+set(TCC_BUILD_ARM_EABI OFF CACHE BOOL "Build ARM EABI cross compiler")
60+set(TCC_BUILD_ARM_EABIHF OFF CACHE BOOL "Build ARM EABI hardware float cross compiler")
61+set(TCC_BUILD_ARM OFF CACHE BOOL "Build ARM cross compiler")
62+set(TCC_BUILD_C67 OFF CACHE BOOL "Build C67 cross compiler")
4763
48−if(TCC_TARGET STREQUAL "Win32")
49− set(TCC_TARGET_FLAGS -DTCC_TARGET_I386 -DTCC_TARGET_PE)
50− set(LIBTCC_TARGET_SOURCES ${I386_SOURCES} tccpe.c)
51−elseif(TCC_TARGET STREQUAL "Win64")
52− set(TCC_TARGET_FLAGS -DTCC_TARGET_X86_64 -DTCC_TARGET_PE)
53− set(LIBTCC_TARGET_SOURCES ${X86_64_SOURCES} tccpe.c)
54−elseif(TCC_TARGET STREQUAL "WinCE")
55− set(TCC_TARGET_FLAGS -DTCC_TARGET_ARM
56− -DTCC_ARM_VERSION=${TCC_ARM_VERSION})
57− set(LIBTCC_TARGET_SOURCES arm-gen.c tccpe.c)
58−elseif(TCC_TARGET STREQUAL "i386")
59− set(TCC_TARGET_FLAGS -DTCC_TARGET_I386)
60− set(LIBTCC_TARGET_SOURCES ${I386_SOURCES})
61−elseif(TCC_TARGET STREQUAL "x86-64")
62− set(TCC_TARGET_FLAGS -DTCC_TARGET_X86_64)
63− set(LIBTCC_TARGET_SOURCES ${X86_64_SOURCES})
64−elseif(TCC_TARGET STREQUAL "ARM")
65− set(TCC_TARGET_FLAGS -DTCC_TARGET_ARM
66− -DTCC_ARM_VERSION=${TCC_ARM_VERSION}
67− -DTCC_ARM_EABI=${TCC_ARM_EABI}
68− -DTCC_ARM_VFP=${TCC_ARM_VFP}
69− -DTCC_ARM_HARDFLOAT=${TCC_ARM_HARDFLOAT})
70− set(LIBTCC_TARGET_SOURCES arm-gen.c)
71−elseif(TCC_TARGET STREQUAL "C67")
72− set(TCC_TARGET_FLAGS -DTCC_TARGET_C67)
73− set(LIBTCC_TARGET_SOURCES c67-gen.c tcccoff.c)
74−else()
75− message(FATAL_ERROR "Unrecognised target in TCC_TARGET, must be one of ${TCC_TARGET_LIST}")
76−endif()
64+set(TCC_ARM_VERSION ${TCC_ARM_VERSION_DEFAULT} CACHE STRING "ARM target CPU version")
65+set_property(CACHE TCC_ARM_VERSION PROPERTY STRINGS 4 5 6 7)
7766
78−add_definitions(${TCC_TARGET_FLAGS})
7967 file(STRINGS "VERSION" TCC_VERSION)
8068 list(GET TCC_VERSION 0 TCC_VERSION)
8169 include_directories(${CMAKE_BINARY_DIR})
8270 configure_file(config.h.in config.h)
71+configure_file(config.texi.in config.texi)
8372
84−add_library(libtcc
85−libtcc.c tccpp.c tccgen.c tccelf.c tccasm.c tccrun.c
86−tcc.h config.h libtcc.h tcctok.h
87−${LIBTCC_TARGET_SOURCES}
88−)
89−set_target_properties(libtcc PROPERTIES PREFIX "")
73+# Utility variables
74+set(I386_SOURCES i386-gen.c i386-asm.c i386-asm.h i386-tok.h)
75+set(X86_64_SOURCES x86_64-gen.c i386-asm.c x86_64-asm.h)
76+set(ARM_SOURCES arm_gen.c)
9077
91−add_executable(tcc tcc.c)
92−target_link_libraries(tcc libtcc)
93−set(TCC_CFLAGS -I${CMAKE_SOURCE_DIR}/include ${CMAKE_C_FLAGS})
94−if(TCC_TARGET MATCHES "^Win")
95− set(TCC_CFLAGS ${TCC_CFLAGS} -I${CMAKE_SOURCE_DIR}/win32/include)
78+set(LIBTCC1_I386_SOURCES lib/alloca86.S lib/alloca86-bt.S)
79+set(LIBTCC1_WIN_SOURCES win32/lib/crt1.c win32/lib/wincrt1.c win32/lib/dllcrt1.c win32/lib/dllmain.c win32/lib/chkstk.S)
80+if(NOT WIN32)
81+ set(LIBTCC1_I386_SOURCES ${LIBTCC1_I386_SOURCES} lib/bcheck.c)
9682 endif()
9783
98−add_executable(tiny_impdef win32/tools/tiny_impdef.c)
99−add_executable(tiny_libmaker win32/tools/tiny_libmaker.c)
84+if(WIN32)
85+ add_executable(tiny_impdef win32/tools/tiny_impdef.c)
86+endif()
87+add_executable(tiny_libmaker_32 win32/tools/tiny_libmaker.c)
88+set_target_properties(tiny_libmaker_32 PROPERTIES COMPILE_DEFINITIONS TCC_TARGET_I386)
89+add_executable(tiny_libmaker_64 win32/tools/tiny_libmaker.c)
90+set_target_properties(tiny_libmaker_64 PROPERTIES COMPILE_DEFINITIONS TCC_TARGET_X86_64)
10091
101−set(LIBTCC1_I386_SOURCES lib/alloca86.S lib/alloca86-bt.S lib/bcheck.c)
102−set(LIBTCC1_WIN_SOURCES win32/lib/crt1.c win32/lib/wincrt1.c win32/lib/dllcrt1.c win32/lib/dllmain.c win32/lib/chkstk.S)
92+macro(make_libtcc1 prefix xcc xar defs includes sources)
93+ set(libtcc1_prefix)
94+ if("${prefix}" STRGREATER "")
95+ set(libtcc1_prefix ${prefix}-)
96+ endif()
97+ set(libtcc1_flags -I${CMAKE_SOURCE_DIR}/include)
98+ foreach(i ${defs})
99+ set(libtcc1_flags ${libtcc1_flags} -D${i})
100+ endforeach()
101+ foreach(i ${includes})
102+ set(libtcc1_flags ${libtcc1_flags} -I${CMAKE_SOURCE_DIR}/${i})
103+ endforeach()
104+ set(libtcc1_objects)
105+ foreach(libtcc1_c lib/libtcc1.c ${sources})
106+ string(REGEX MATCH "[^/]+$" libtcc1_o ${libtcc1_c})
107+ string(REGEX MATCH "^[^.]+" libtcc1_o ${libtcc1_o})
108+ set(libtcc1_o ${libtcc1_prefix}${libtcc1_o}.o)
109+ add_custom_command(OUTPUT ${libtcc1_o}
110+ COMMAND ${xcc} ${libtcc1_flags} -c ${CMAKE_SOURCE_DIR}/${libtcc1_c} -o ${libtcc1_o}
111+ DEPENDS ${xcc} ${CMAKE_SOURCE_DIR}/${libtcc1_c}
112+ )
113+ list(APPEND libtcc1_objects ${libtcc1_o})
114+ endforeach()
115+ add_custom_command(OUTPUT ${libtcc1_prefix}libtcc1.a
116+ COMMAND ${xar} ${libtcc1_prefix}libtcc1.a ${libtcc1_objects}
117+ DEPENDS ${xar} ${libtcc1_objects}
118+ )
119+ add_custom_target(${libtcc1_prefix}libtcc1 ALL DEPENDS ${libtcc1_prefix}libtcc1.a)
120+ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${libtcc1_prefix}libtcc1.a
121+ DESTINATION ${TCC_LIB_PATH}/${prefix} RENAME libtcc1.a)
122+endmacro()
103123
104−if(TCC_TARGET STREQUAL "Win32")
105− set(LIBTCC1_SOURCES ${LIBTCC1_I386_SOURCES} ${LIBTCC1_WIN_SOURCES})
106−elseif(TCC_TARGET STREQUAL "Win64")
107− set(LIBTCC1_SOURCES lib/alloca86_64.S ${LIBTCC1_WIN_SOURCES})
108−elseif(TCC_TARGET STREQUAL "i386")
109− set(LIBTCC1_SOURCES ${LIBTCC1_I386_SOURCES})
110−elseif(TCC_TARGET STREQUAL "x86-64")
111− set(LIBTCC1_SOURCES lib/alloca86_64.S)
112−endif()
124+macro(make_tcc native_name cross_name cross_enabled definitions tcc_sources libtcc_ar libtcc_sources libtcc_includes)
125+ if (xx${native_name} STREQUAL xx${TCC_NATIVE_TARGET})
126+ set(TCC_NATIVE_FLAGS)
127+ foreach(make_tcc_def ${definitions})
128+ set(TCC_NATIVE_FLAGS ${TCC_NATIVE_FLAGS} -D${make_tcc_def})
129+ endforeach()
130+
131+ if (TCC_BUILD_NATIVE)
132+ add_library(libtcc
133+ libtcc.c
134+ tccpp.c
135+ tccgen.c
136+ tccelf.c
137+ tccasm.c
138+ tccrun.c
139+ tcc.h
140+ libtcc.h
141+ tcctok.h
142+ ${tcc_sources}
143+ )
144+ set_target_properties(libtcc PROPERTIES OUTPUT_NAME tcc PREFIX lib LINK_FLAGS "-Wl,--output-def,libtcc.def")
145+ add_executable(tcc tcc.c)
146+ target_link_libraries(tcc libtcc)
147+ install(TARGETS tcc libtcc RUNTIME DESTINATION ${EXE_PATH} LIBRARY DESTINATION ${NATIVE_LIB_PATH})
148+ set_target_properties(tcc libtcc PROPERTIES COMPILE_DEFINITIONS "${definitions}")
149+
150+ if("${libtcc_sources}" STRGREATER "")
151+ make_libtcc1("" tcc "${libtcc_ar}" "${definitions}" "${libtcc_includes}" "${libtcc_sources}")
152+ endif()
153+ endif()
154+ endif()
155+
156+ if(${cross_enabled})
157+ add_executable(${cross_name}-tcc tcc.c)
158+ set_target_properties(${cross_name}-tcc PROPERTIES COMPILE_DEFINITIONS "ONE_SOURCE;${definitions}")
159+ install(TARGETS ${cross_name}-tcc RUNTIME DESTINATION ${EXE_PATH})
160+
161+ if("${libtcc_sources}" STRGREATER "")
162+ make_libtcc1(${cross_name} "${cross_name}-tcc" "${libtcc_ar}" "${definitions}" "${libtcc_includes}" "${libtcc_sources}")
163+ endif()
164+ endif()
165+endmacro()
166+
167+make_tcc("Win32" i386-win32 TCC_BUILD_WIN32
168+ "TCC_TARGET_I386;TCC_TARGET_PE"
169+ "${I386_SOURCES};tccpe.c"
170+ tiny_libmaker_32 "${LIBTCC1_I386_SOURCES};${LIBTCC1_WIN_SOURCES}" "win32/include;win32/include/winapi"
171+)
172+make_tcc("Win64" x86_64-win32 TCC_BUILD_WIN64
173+ "TCC_TARGET_X86_64;TCC_TARGET_PE"
174+ "${X86_64_SOURCES};tccpe.c"
175+ tiny_libmaker_64 "lib/alloca86_64.S;${LIBTCC1_WIN_SOURCES}" "win32/include;win32/include/winapi"
176+)
177+make_tcc("WinCE" arm-win32 TCC_BUILD_WINCE
178+ "TCC_TARGET_ARM;TCC_ARM_VERSION=${TCC_ARM_VERSION};TCC_TARGET_PE"
179+ "${ARM_SOURCES};tccpe.c"
180+ "" "" ""
181+)
182+make_tcc("i386" i386 TCC_BUILD_I386
183+ TCC_TARGET_I386
184+ "${I386_SOURCES}"
185+ tiny_libmaker_32 "${LIBTCC1_I386_SOURCES}" ""
186+)
187+make_tcc("x86_64" x86_64 TCC_BUILD_X64
188+ TCC_TARGET_X86_64
189+ "${X86_64_SOURCES}"
190+ tiny_libmaker_64 "lib/alloca86_64.S" ""
191+)
192+set(ARM_DEFINITIONS TCC_TARGET_ARM TCC_ARM_VERSION=${TCC_ARM_VERSION})
193+make_tcc("ARM" arm TCC_BUILD_ARM
194+ "${ARM_DEFINITIONS};WITHOUT_LIBTCC"
195+ "${ARM_SOURCES}"
196+ "" "" ""
197+)
198+make_tcc("" arm-eabihf TCC_BUILD_ARM_EABIHF
199+ "${ARM_DEFINITIONS};TCC_ARM_EABI;TCC_ARM_HARDFLOAT"
200+ "${ARM_SOURCES}"
201+ "" "" ""
202+)
203+make_tcc("" arm-eabi TCC_BUILD_ARM_EABI
204+ "${ARM_DEFINITIONS};TCC_ARM_EABI"
205+ "${ARM_SOURCES}"
206+ "" "" ""
207+)
208+make_tcc("" arm-fpa TCC_BUILD_ARM_FPA
209+ "${ARM_DEFINITIONS}"
210+ "${ARM_SOURCES}"
211+ "" "" ""
212+)
213+make_tcc("" arm-fpa-ld TCC_BUILD_ARM_FPA_LD
214+ "${ARM_DEFINITIONS};LDOUBLE_SIZE=12"
215+ "${ARM_SOURCES}"
216+ "" "" ""
217+)
218+make_tcc("" arm-vfp TCC_BUILD_ARM_VFP
219+ "${ARM_DEFINITIONS};TCC_ARM_VFP"
220+ "${ARM_SOURCES}"
221+ "" "" ""
222+)
223+make_tcc("" c67 TCC_BUILD_C67
224+ TCC_TARGET_C67
225+ "c67-gen.c;tcccoff.c"
226+ "" "" ""
227+)
228+
229+add_subdirectory(tests)
113230
114−if (TCC_TARGET MATCHES "^Win")
115− set(XCC tcc ${TCC_CFLAGS} ${TCC_TARGET_FLAGS} -B${CMAKE_SOURCE_DIR}/win32)
116− set(XAR tiny_libmaker${CMAKE_EXECUTABLE_SUFFIX})
117− set(XDEPENDS tiny_libmaker)
231+find_program(MAKEINFO NAMES makeinfo PATHS C:/MinGW/MSYS/1.0/bin)
232+if(MAKEINFO)
233+ add_custom_command(OUTPUT tcc-doc.html
234+ COMMAND ${MAKEINFO} --no-split --html -o tcc-doc.html ${CMAKE_CURRENT_SOURCE_DIR}/tcc-doc.texi
235+ DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tcc-doc.texi
236+ )
237+ set(TCC_DOC_FILES tcc-doc.html)
238+ if(NOT WIN32)
239+ add_custom_command(OUTPUT tcc-doc.info
240+ COMMAND ${MAKEINFO} -o tcc-doc.info ${CMAKE_CURRENT_SOURCE_DIR}/tcc-doc.texi
241+ DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tcc-doc.texi
242+ )
243+ set(TCC_DOC_FILES ${TCC_DOC_FILES} tcc-doc.info)
244+ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/tcc-doc.info DESTINATION share/info)
245+ endif()
246+ add_custom_target(tcc-doc ALL DEPENDS ${TCC_DOC_FILES})
247+ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/tcc-doc.html DESTINATION ${DOC_PATH})
118248 endif()
119249
120−if(LIBTCC1_SOURCES)
121− list(APPEND LIBTCC1_SOURCES lib/libtcc1.c)
122− foreach(LIBTCC1_C ${LIBTCC1_SOURCES})
123− string(REGEX MATCH "[^/]+$" LIBTCC1_O ${LIBTCC1_C})
124− string(REGEX MATCH "^[^.]+" LIBTCC1_O ${LIBTCC1_O})
125− set(LIBTCC1_O ${LIBTCC1_O}.o)
126− add_custom_command(OUTPUT ${LIBTCC1_O} COMMAND ${XCC} -c ${CMAKE_SOURCE_DIR}/${LIBTCC1_C} -o ${LIBTCC1_O} DEPENDS ${CMAKE_SOURCE_DIR}/${LIBTCC1_C})
127− list(APPEND LIBTCC1_OBJECTS ${LIBTCC1_O})
128− endforeach()
129− add_custom_command(OUTPUT libtcc1.a COMMAND ${XAR} libtcc1.a ${LIBTCC1_OBJECTS} DEPENDS ${LIBTCC1_OBJECTS} ${XDEPENDS})
130− add_custom_target(libtcc1 ALL DEPENDS libtcc1.a)
250+if(WIN32)
251+ file(GLOB WIN32_DEFS win32/lib/*.def)
252+ install(FILES ${WIN32_DEFS} DESTINATION lib)
253+ install(DIRECTORY include/ DESTINATION include)
254+ install(DIRECTORY win32/include/ DESTINATION include)
255+ install(DIRECTORY win32/examples/ DESTINATION examples)
256+ install(FILES win32/tcc-win32.txt DESTINATION doc)
257+ install(FILES ${CMAKE_BINARY_DIR}/libtcc.def DESTINATION libtcc)
258+ install(FILES ${CMAKE_BINARY_DIR}/libtcc.dll.a DESTINATION libtcc RENAME libtcc.a)
259+ install(FILES libtcc.h DESTINATION libtcc)
260+else()
261+ install(FILES libtcc.h DESTINATION include)
262+ install(DIRECTORY include/ DESTINATION lib/tcc/include)
263+ install(DIRECTORY win32/include/ DESTINATION lib/tcc/win32/include)
264+ install(DIRECTORY include/ DESTINATION lib/tcc/win32/include)
131265 endif()
132266
133−add_subdirectory(tests)
config.h.in+1−0
@@ -3,3 +3,4 @@ · 2 unmodified lines
33
44 #cmakedefine CONFIG_WIN32
55 #cmakedefine CONFIG_WIN64
6+#cmakedefine CONFIG_TCC_BCHECK
config.texi.in+1−0
@@ -0,0 +1 @@
1+@set VERSION ${TCC_VERSION}
lib/libtcc1.c+3−7
@@ -607,13 +607,9 @@ unsigned long long __fixunsxfdi (long double a1) · 606 unmodified lines
607607
608608 #if defined(__x86_64__) && !defined(_WIN64)
609609
610−/* helper functions for stdarg.h */
611−
612−#include <stdlib.h>
613−#ifndef __TINYC__
614−/* gives "incompatible types for redefinition of __va_arg" below */
615−#include <stdio.h>
616−#endif
610+/* Avoid including stdlib.h because it is not easily available when
611+ cross compiling */
612+extern void *malloc(unsigned long long);
617613
618614 enum __va_arg_type {
619615 __va_gen_reg, __va_float_reg, __va_stack
tests/CMakeLists.txt+22−17
@@ -1,5 +1,10 @@
11 include_directories(${CMAKE_SOURCE_DIR})
22
3+set(TCC_CFLAGS -I${CMAKE_SOURCE_DIR})
4+if(WIN32)
5+ set(TCC_CFLAGS ${TCC_CFLAGS} -I${CMAKE_SOURCE_DIR}/include -I${CMAKE_SOURCE_DIR}/win32/include)
6+endif()
7+
38 add_executable(abitest-cc abitest.c)
49 target_link_libraries(abitest-cc libtcc)
510 add_test(NAME abitest-cc WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMAND abitest-cc lib_path=${CMAKE_BINARY_DIR} include=${CMAKE_SOURCE_DIR}/include)
@@ -13,26 +18,26 @@ add_test(NAME abitest-tcc WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMAND ${CMAKE_ · 7 unmodified lines
1318
1419 add_executable(tcctest-cc tcctest.c)
1520 target_link_libraries(tcctest-cc libtcc)
16−set_target_properties(tcctest-cc PROPERTIES INCLUDE_DIRECTORIES "${CMAKE_BINARY_DIR};${CMAKE_SOURCE_DIR}/include" COMPILE_FLAGS -std=gnu99)
17−
18−set(TCC_TEST_CFLAGS ${TCC_CFLAGS} -B${CMAKE_BINARY_DIR} -I${CMAKE_BINARY_DIR})
21+set_target_properties(tcctest-cc PROPERTIES COMPILE_FLAGS -std=gnu99)
1922 if(WIN32)
20− set(TCC_TEST_CFLAGS ${TCC_TEST_CFLAGS} -I${CMAKE_SOURCE_DIR}/win32/include/winapi)
23+ set_target_properties(tcctest-cc PROPERTIES INCLUDE_DIRECTORIES "${CMAKE_BINARY_DIR};${CMAKE_SOURCE_DIR}/include")
2124 endif()
22−set(TCC_TEST_SOURCE ${TCC_TEST_CFLAGS} -run ${CMAKE_CURRENT_SOURCE_DIR}/tcctest.c)
23−set(TCC_TEST_RUN ${TCC_TEST_CFLAGS} ${TCC_TARGET_FLAGS} -DONE_SOURCE -run ${CMAKE_SOURCE_DIR}/tcc.c)
2425
25−add_custom_command(OUTPUT tcctest.ref COMMAND tcctest-cc > tcctest.ref)
26−add_custom_command(OUTPUT tcctest.1 COMMAND tcc ${TCC_TEST_SOURCE} > tcctest.1)
27−add_custom_command(OUTPUT tcctest.2 COMMAND tcc ${TCC_TEST_RUN} ${TCC_TEST_SOURCE} > tcctest.2)
28−add_custom_command(OUTPUT tcctest.3 COMMAND tcc ${TCC_TEST_RUN} ${TCC_TEST_RUN} ${TCC_TEST_SOURCE} > tcctest.3)
29−add_custom_target(tcctest-ref ALL DEPENDS tcctest.ref tcctest.1 tcctest.2 tcctest.3)
30−
31−find_program(DIFF diff C:/MinGW/msys/1.0/bin)
32−
33−add_test(test1 ${DIFF} tcctest.ref tcctest.1)
34−add_test(test2 ${DIFF} tcctest.ref tcctest.2)
35−add_test(test3 ${DIFF} tcctest.ref tcctest.3)
26+find_package(PythonInterp)
27+if(PYTHONINTERP_FOUND)
28+ set(TCC_TEST_CFLAGS ${TCC_CFLAGS} -B${CMAKE_BINARY_DIR} -I${CMAKE_BINARY_DIR})
29+ if(WIN32)
30+ set(TCC_TEST_CFLAGS ${TCC_TEST_CFLAGS} -I${CMAKE_SOURCE_DIR}/win32/include/winapi)
31+ endif()
32+ set(TCC_TEST_SOURCE ${TCC_TEST_CFLAGS} -run ${CMAKE_CURRENT_SOURCE_DIR}/tcctest.c)
33+ set(TCC_TEST_RUN ${TCC_TEST_CFLAGS} ${TCC_NATIVE_FLAGS} -DONE_SOURCE -run ${CMAKE_SOURCE_DIR}/tcc.c)
34+ get_property(TCC TARGET tcc PROPERTY LOCATION)
35+ get_property(TCCTESTCC TARGET tcctest-cc PROPERTY LOCATION)
36+ set(TCCTEST_PY ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tcctest.py ${TCCTESTCC} ${TCC})
37+ add_test(test1 ${TCCTEST_PY} ${TCC_TEST_SOURCE})
38+ add_test(test2 ${TCCTEST_PY} ${TCC_TEST_RUN} ${TCC_TEST_SOURCE})
39+ add_test(test3 ${TCCTEST_PY} ${TCC_TEST_RUN} ${TCC_TEST_RUN} ${TCC_TEST_SOURCE})
40+endif()
3641
3742 set(MORETESTS
3843 00_assignment
tests/tcctest.py+15−0
@@ -0,0 +1,15 @@
1+import subprocess
2+import sys
3+import difflib
4+
5+def main():
6+ reference = subprocess.check_output([sys.argv[1]])
7+ compare = subprocess.check_output(sys.argv[2:])
8+ failed = False
9+ for line in difflib.unified_diff(reference.split('\n'), compare.split('\n'), fromfile='cc', tofile='tcc', lineterm=''):
10+ failed = True
11+ print line
12+ sys.exit(1 if failed else 0)
13+
14+if __name__ == '__main__':
15+ main()

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t