History

Added CMake build system (to facilitate Win64 builds)

Win32 build and tests work under CMake, however I haven't added install code yet. Win64 build fails due to chkstk.S failing to assemble.

James Lyon committed 13 years ago

Commit 8a81f9e1 parent 05fa2e75 files · +254 −4Browse files

Unified · Split

5 files
  1. CMakeLists.txt +129 −0
  2. config.h.in +16 −0
  3. libtcc.c +10 −3
  4. tccgen.c +1 −1
  5. tests/CMakeLists.txt +98 −0
CMakeLists.txt+129−0
@@ -0,0 +1,129 @@
1+project(tcc C)
2+cmake_minimum_required(VERSION 2.6)
3+enable_testing()
4+
5+set(CMAKE_USE_RELATIVE_PATHS ON)
6+
7+if(WIN32)
8+ set(BUILD_SHARED_LIBS ON)
9+ if(CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM")
10+ set(TCC_TARGET_DEFAULT "WinCE")
11+ elseif(CMAKE_SIZEOF_VOID_P EQUAL 8)
12+ set(TCC_TARGET_DEFAULT "Win64")
13+ else()
14+ set(TCC_TARGET_DEFAULT "Win32")
15+ endif()
16+else()
17+ if(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm")
18+ set(TCC_TARGET_DEFAULT "ARM")
19+ if(CMAKE_SYSTEM_PROCESSOR MATCHES "^armv5")
20+ set(TCC_ARM_VERSION_DEFAULT 5)
21+ elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^armv6")
22+ set(TCC_ARM_VERSION_DEFAULT 6)
23+ elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^armv7")
24+ set(TCC_ARM_VERSION_DEFAULT 7)
25+ else()
26+ set(TCC_ARM_VERSION_DEFAULT 4)
27+ endif()
28+ elseif(CMAKE_SIZEOF_VOID_P EQUAL 8)
29+ set(TCC_TARGET_DEFAULT "x86_64")
30+ else()
31+ set(TCC_TARGET_DEFAULT "i386")
32+ endif()
33+endif()
34+
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})
38+
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")
44+
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)
47+
48+if(TCC_TARGET STREQUAL "Win32")
49+ set(TCC_TARGET_I386 ON)
50+ set(TCC_TARGET_PE ON)
51+ set(LIBTCC_TARGET_SOURCES ${I386_SOURCES} tccpe.c)
52+elseif(TCC_TARGET STREQUAL "Win64")
53+ set(TCC_TARGET_PE ON)
54+ set(TCC_TARGET_X86_64 ON)
55+ set(LIBTCC_TARGET_SOURCES ${X86_64_SOURCES} tccpe.c)
56+elseif(TCC_TARGET STREQUAL "WinCE")
57+ set(TCC_TARGET_ARM ON)
58+ set(LIBTCC_TARGET_SOURCES arm-gen.c tccpe.c)
59+elseif(TCC_TARGET STREQUAL "i386")
60+ set(TCC_TARGET_I386 ON)
61+ set(LIBTCC_TARGET_SOURCES ${I386_SOURCES})
62+elseif(TCC_TARGET STREQUAL "x86-64")
63+ set(TCC_TARGET_X86_64 ON)
64+ set(LIBTCC_TARGET_SOURCES ${X86_64_SOURCES})
65+elseif(TCC_TARGET STREQUAL "ARM")
66+ set(TCC_TARGET_ARM ON)
67+ set(LIBTCC_TARGET_SOURCES arm-gen.c)
68+elseif(TCC_TARGET STREQUAL "C67")
69+ set(TCC_TARGET_C67 ON)
70+ set(LIBTCC_TARGET_SOURCES c67-gen.c tcccoff.c)
71+else()
72+ message(FATAL_ERROR "Unrecognised target in TCC_TARGET, must be one of ${TCC_TARGET_LIST}")
73+endif()
74+
75+file(STRINGS "VERSION" TCC_VERSION)
76+list(GET TCC_VERSION 0 TCC_VERSION)
77+include_directories(${CMAKE_BINARY_DIR})
78+configure_file(config.h.in config.h)
79+
80+add_library(libtcc
81+libtcc.c tccpp.c tccgen.c tccelf.c tccasm.c tccrun.c
82+tcc.h config.h libtcc.h tcctok.h
83+${LIBTCC_TARGET_SOURCES}
84+)
85+set_target_properties(libtcc PROPERTIES PREFIX "")
86+
87+add_executable(tcc tcc.c)
88+target_link_libraries(tcc libtcc)
89+set(TCC_CFLAGS -I${CMAKE_SOURCE_DIR}/include)
90+if(TCC_TARGET MATCHES "^Win")
91+ set(TCC_CFLAGS ${TCC_CFLAGS} -I${CMAKE_SOURCE_DIR}/win32/include)
92+endif()
93+
94+add_executable(tiny_impdef win32/tools/tiny_impdef.c)
95+add_executable(tiny_libmaker win32/tools/tiny_libmaker.c)
96+
97+set(LIBTCC1_I386_SOURCES lib/alloca86.S lib/alloca86-bt.S lib/bcheck.c)
98+set(LIBTCC1_WIN_SOURCES win32/lib/crt1.c win32/lib/wincrt1.c win32/lib/dllcrt1.c win32/lib/dllmain.c win32/lib/chkstk.S)
99+
100+if(TCC_TARGET STREQUAL "Win32")
101+ set(LIBTCC1_SOURCES ${LIBTCC1_I386_SOURCES} ${LIBTCC1_WIN_SOURCES})
102+elseif(TCC_TARGET STREQUAL "Win64")
103+ set(LIBTCC1_SOURCES lib/alloca86_64.S ${LIBTCC1_WIN_SOURCES})
104+elseif(TCC_TARGET STREQUAL "i386")
105+ set(LIBTCC1_SOURCES ${LIBTCC1_I386_SOURCES})
106+elseif(TCC_TARGET STREQUAL "x86-64")
107+ set(LIBTCC1_SOURCES lib/alloca86_64.S)
108+endif()
109+
110+if (TCC_TARGET MATCHES "^Win")
111+ set(XCC tcc ${TCC_CFLAGS} -B${CMAKE_SOURCE_DIR}/win32)
112+ set(XAR tiny_libmaker${CMAKE_EXECUTABLE_SUFFIX})
113+ set(XDEPENDS tiny_libmaker)
114+endif()
115+
116+if(LIBTCC1_SOURCES)
117+ list(APPEND LIBTCC1_SOURCES lib/libtcc1.c)
118+ foreach(LIBTCC1_C ${LIBTCC1_SOURCES})
119+ string(REGEX MATCH "[^/]+$" LIBTCC1_O ${LIBTCC1_C})
120+ string(REGEX MATCH "^[^.]+" LIBTCC1_O ${LIBTCC1_O})
121+ set(LIBTCC1_O ${LIBTCC1_O}.o)
122+ add_custom_command(OUTPUT ${LIBTCC1_O} COMMAND ${XCC} -c ${CMAKE_SOURCE_DIR}/${LIBTCC1_C} -o ${LIBTCC1_O})
123+ list(APPEND LIBTCC1_OBJECTS ${LIBTCC1_O})
124+ endforeach()
125+ add_custom_command(OUTPUT libtcc1.a COMMAND ${XAR} libtcc1.a ${LIBTCC1_OBJECTS} DEPENDS ${LIBTCC1_OBJECTS} ${XDEPENDS})
126+ add_custom_target(libtcc1 ALL DEPENDS libtcc1.a)
127+endif()
128+
129+add_subdirectory(tests)
config.h.in+16−0
@@ -0,0 +1,16 @@
1+#define CONFIG_TCCDIR "${CMAKE_INSTALL_PREFIX}"
2+#define TCC_VERSION "${TCC_VERSION}"
3+
4+#cmakedefine CONFIG_WIN32
5+#cmakedefine CONFIG_WIN64
6+
7+#cmakedefine TCC_TARGET_I386
8+#cmakedefine TCC_TARGET_X86_64
9+#cmakedefine TCC_TARGET_ARM
10+#cmakedefine TCC_TARGET_C67
11+
12+#cmakedefine TCC_TARGET_PE
13+#define TCC_ARM_VERSION ${TCC_ARM_VERSION}
14+#cmakedefine TCC_ARM_VFP
15+#cmakedefine TCC_ARM_EABI
16+#cmakedefine TCC_ARM_HARDFLOAT
libtcc.c+10−3
@@ -80,12 +80,19 @@ ST_FUNC void asm_global_instr(void) · 79 unmodified lines
8080 /********************************************************/
8181
8282 #ifdef _WIN32
83+// GCC appears to use '/' for relative paths and '\\' for absolute paths on Windows
8384 static char *normalize_slashes(char *path)
8485 {
8586 char *p;
86− for (p = path; *p; ++p)
87− if (*p == '\\')
88− *p = '/';
87+ if (path[1] == ':') {
88+ for (p = path+2; *p; ++p)
89+ if (*p == '/')
90+ *p = '\\';
91+ } else {
92+ for (p = path; *p; ++p)
93+ if (*p == '\\')
94+ *p = '/';
95+ }
8996 return path;
9097 }
9198
tccgen.c+1−1
@@ -3712,7 +3712,7 @@ ST_FUNC void unary(void) · 3711 unmodified lines
37123712 }
37133713 }
37143714 break;
3715−#ifdef TCC_TARGET_X86_64
3715+#if defined(TCC_TARGET_X86_64) && !defined(TCC_TARGET_PE)
37163716 case TOK_builtin_va_arg_types:
37173717 {
37183718 CType type;
tests/CMakeLists.txt+98−0
@@ -0,0 +1,98 @@
1+include_directories(${CMAKE_SOURCE_DIR})
2+
3+add_executable(abitest-cc abitest.c)
4+target_link_libraries(abitest-cc libtcc)
5+add_test(NAME abitest-cc WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMAND abitest-cc lib_path=${CMAKE_BINARY_DIR} include=${CMAKE_SOURCE_DIR}/include)
6+
7+set(ABITEST_TCC abitest-tcc${CMAKE_EXECUTABLE_SUFFIX})
8+get_property(LIBTCC_LIB TARGET libtcc PROPERTY LOCATION)
9+add_custom_command(OUTPUT ${ABITEST_TCC} COMMAND tcc ${TCC_CFLAGS} -I${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/abitest.c ${LIBTCC_LIB} -o ${ABITEST_TCC} DEPENDS abitest.c)
10+add_custom_target(abitest-tcc-exe ALL DEPENDS ${ABITEST_TCC})
11+
12+add_test(NAME abitest-tcc WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMAND ${CMAKE_CURRENT_BINARY_DIR}/${ABITEST_TCC} lib_path=${CMAKE_BINARY_DIR} include=${CMAKE_SOURCE_DIR}/include)
13+
14+add_executable(tcctest-cc tcctest.c)
15+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})
19+if(WIN32)
20+ set(TCC_TEST_CFLAGS ${TCC_TEST_CFLAGS} -I${CMAKE_SOURCE_DIR}/win32/include/winapi)
21+endif()
22+set(TCC_TEST_SOURCE ${TCC_TEST_CFLAGS} -run ${CMAKE_CURRENT_SOURCE_DIR}/tcctest.c)
23+set(TCC_TEST_RUN ${TCC_TEST_CFLAGS} -DONE_SOURCE -run ${CMAKE_SOURCE_DIR}/tcc.c)
24+
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)
36+
37+set(MORETESTS
38+ 00_assignment
39+ 01_comment
40+ 02_printf
41+ 03_struct
42+ 04_for
43+ 05_array
44+ 06_case
45+ 07_function
46+ 08_while
47+ 09_do_while
48+ 10_pointer
49+ 11_precedence
50+ 12_hashdefine
51+ 13_integer_literals
52+ 14_if
53+ 15_recursion
54+ 16_nesting
55+ 17_enum
56+ 18_include
57+ 19_pointer_arithmetic
58+ 20_pointer_comparison
59+ 21_char_array
60+ 22_floating_point
61+ 23_type_coercion
62+ 24_math_library
63+ 25_quicksort
64+ 26_character_constants
65+ 27_sizeof
66+ 28_strings
67+ 29_array_address
68+ 31_args
69+ 32_led
70+ 33_ternary_op
71+ 35_sizeof
72+ 36_array_initialisers
73+ 37_sprintf
74+ 38_multiple_array_index
75+ 39_typedef
76+ 40_stdio
77+ 41_hashif
78+ 42_function_pointer
79+ 43_void_param
80+ 44_scoped_declarations
81+ 45_empty_for
82+ 47_switch_return
83+ 48_nested_break
84+ 49_bracket_evaluation
85+ 50_logical_second_arg
86+ 51_static
87+ 52_unnamed_enum
88+ 54_goto
89+ 55_lshift_type
90+)
91+if(WIN32)
92+ list(REMOVE_ITEM MORETESTS 24_math_library)
93+ list(REMOVE_ITEM MORETESTS 28_strings)
94+endif()
95+foreach(testfile ${MORETESTS})
96+ add_test(NAME ${testfile} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/tests2
97+ COMMAND tcc ${TCC_CFLAGS} -run ${testfile}.c - arg1 arg2 arg3 arg4 | ${DIFF} - ${testfile}.expect)
98+endforeach()

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