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 @@
1project(tcc C)
2cmake_minimum_required(VERSION 2.6)
3enable_testing()
4
5set(CMAKE_USE_RELATIVE_PATHS ON)
6
7if(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()
16else()
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()
33endif()
34
35set(TCC_TARGET_LIST "Win32" "Win64" "WinCE" "i386" "x86_64" "ARM" "C67")
36set(TCC_TARGET ${TCC_TARGET_DEFAULT} CACHE STRING "Target OS")
37set_property(CACHE TCC_TARGET PROPERTY STRINGS ${TCC_TARGET_LIST})
38
39set(TCC_ARM_VERSION ${TCC_ARM_VERSION_DEFAULT} CACHE STRING "ARM target CPU version")
40set_property(CACHE TCC_ARM_VERSION PROPERTY STRINGS 4 5 6 7)
41set(TCC_ARM_EABI OFF CACHE BOOL "Enable EABI on ARM")
42set(TCC_ARM_VFP OFF CACHE BOOL "Enable VFP on ARM")
43set(TCC_ARM_HARDFLOAT OFF CACHE BOOL "Enable hardware floating point on ARM")
44
45set(I386_SOURCES i386-gen.c i386-asm.c i386-asm.h i386-tok.h)
46set(X86_64_SOURCES x86_64-gen.c i386-asm.c x86_64-asm.h)
47
48if(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)
52elseif(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)
56elseif(TCC_TARGET STREQUAL "WinCE")
57 set(TCC_TARGET_ARM ON)
58 set(LIBTCC_TARGET_SOURCES arm-gen.c tccpe.c)
59elseif(TCC_TARGET STREQUAL "i386")
60 set(TCC_TARGET_I386 ON)
61 set(LIBTCC_TARGET_SOURCES ${I386_SOURCES})
62elseif(TCC_TARGET STREQUAL "x86-64")
63 set(TCC_TARGET_X86_64 ON)
64 set(LIBTCC_TARGET_SOURCES ${X86_64_SOURCES})
65elseif(TCC_TARGET STREQUAL "ARM")
66 set(TCC_TARGET_ARM ON)
67 set(LIBTCC_TARGET_SOURCES arm-gen.c)
68elseif(TCC_TARGET STREQUAL "C67")
69 set(TCC_TARGET_C67 ON)
70 set(LIBTCC_TARGET_SOURCES c67-gen.c tcccoff.c)
71else()
72 message(FATAL_ERROR "Unrecognised target in TCC_TARGET, must be one of ${TCC_TARGET_LIST}")
73endif()
74
75file(STRINGS "VERSION" TCC_VERSION)
76list(GET TCC_VERSION 0 TCC_VERSION)
77include_directories(${CMAKE_BINARY_DIR})
78configure_file(config.h.in config.h)
79
80add_library(libtcc
81libtcc.c tccpp.c tccgen.c tccelf.c tccasm.c tccrun.c
82tcc.h config.h libtcc.h tcctok.h
83${LIBTCC_TARGET_SOURCES}
84)
85set_target_properties(libtcc PROPERTIES PREFIX "")
86
87add_executable(tcc tcc.c)
88target_link_libraries(tcc libtcc)
89set(TCC_CFLAGS -I${CMAKE_SOURCE_DIR}/include)
90if(TCC_TARGET MATCHES "^Win")
91 set(TCC_CFLAGS ${TCC_CFLAGS} -I${CMAKE_SOURCE_DIR}/win32/include)
92endif()
93
94add_executable(tiny_impdef win32/tools/tiny_impdef.c)
95add_executable(tiny_libmaker win32/tools/tiny_libmaker.c)
96
97set(LIBTCC1_I386_SOURCES lib/alloca86.S lib/alloca86-bt.S lib/bcheck.c)
98set(LIBTCC1_WIN_SOURCES win32/lib/crt1.c win32/lib/wincrt1.c win32/lib/dllcrt1.c win32/lib/dllmain.c win32/lib/chkstk.S)
99
100if(TCC_TARGET STREQUAL "Win32")
101 set(LIBTCC1_SOURCES ${LIBTCC1_I386_SOURCES} ${LIBTCC1_WIN_SOURCES})
102elseif(TCC_TARGET STREQUAL "Win64")
103 set(LIBTCC1_SOURCES lib/alloca86_64.S ${LIBTCC1_WIN_SOURCES})
104elseif(TCC_TARGET STREQUAL "i386")
105 set(LIBTCC1_SOURCES ${LIBTCC1_I386_SOURCES})
106elseif(TCC_TARGET STREQUAL "x86-64")
107 set(LIBTCC1_SOURCES lib/alloca86_64.S)
108endif()
109
110if (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)
114endif()
115
116if(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)
127endif()
128
129add_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
80/********************************************************/80/********************************************************/
81 81
82#ifdef _WIN3282#ifdef _WIN32
83// GCC appears to use '/' for relative paths and '\\' for absolute paths on Windows
83static char *normalize_slashes(char *path)84static char *normalize_slashes(char *path)
84{85{
85 char *p;86 char *p;
86 for (p = path; *p; ++p)87 if (path[1] == ':') {
87 if (*p == '\\')88 for (p = path+2; *p; ++p)
88 *p = '/';89 if (*p == '/')
90 *p = '\\';
91 } else {
92 for (p = path; *p; ++p)
93 if (*p == '\\')
94 *p = '/';
95 }
89 return path;96 return path;
90}97}
91 98
tccgen.c+1−1
@@ -3712,7 +3712,7 @@ ST_FUNC void unary(void) · 3711 unmodified lines
3712 }3712 }
3713 }3713 }
3714 break;3714 break;
3715#ifdef TCC_TARGET_X86_643715#if defined(TCC_TARGET_X86_64) && !defined(TCC_TARGET_PE)
3716 case TOK_builtin_va_arg_types:3716 case TOK_builtin_va_arg_types:
3717 {3717 {
3718 CType type;3718 CType type;
tests/CMakeLists.txt+98−0
@@ -0,0 +1,98 @@
1include_directories(${CMAKE_SOURCE_DIR})
2
3add_executable(abitest-cc abitest.c)
4target_link_libraries(abitest-cc libtcc)
5add_test(NAME abitest-cc WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMAND abitest-cc lib_path=${CMAKE_BINARY_DIR} include=${CMAKE_SOURCE_DIR}/include)
6
7set(ABITEST_TCC abitest-tcc${CMAKE_EXECUTABLE_SUFFIX})
8get_property(LIBTCC_LIB TARGET libtcc PROPERTY LOCATION)
9add_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)
10add_custom_target(abitest-tcc-exe ALL DEPENDS ${ABITEST_TCC})
11
12add_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
14add_executable(tcctest-cc tcctest.c)
15target_link_libraries(tcctest-cc libtcc)
16set_target_properties(tcctest-cc PROPERTIES INCLUDE_DIRECTORIES "${CMAKE_BINARY_DIR};${CMAKE_SOURCE_DIR}/include" COMPILE_FLAGS -std=gnu99)
17
18set(TCC_TEST_CFLAGS ${TCC_CFLAGS} -B${CMAKE_BINARY_DIR} -I${CMAKE_BINARY_DIR})
19if(WIN32)
20 set(TCC_TEST_CFLAGS ${TCC_TEST_CFLAGS} -I${CMAKE_SOURCE_DIR}/win32/include/winapi)
21endif()
22set(TCC_TEST_SOURCE ${TCC_TEST_CFLAGS} -run ${CMAKE_CURRENT_SOURCE_DIR}/tcctest.c)
23set(TCC_TEST_RUN ${TCC_TEST_CFLAGS} -DONE_SOURCE -run ${CMAKE_SOURCE_DIR}/tcc.c)
24
25add_custom_command(OUTPUT tcctest.ref COMMAND tcctest-cc > tcctest.ref)
26add_custom_command(OUTPUT tcctest.1 COMMAND tcc ${TCC_TEST_SOURCE} > tcctest.1)
27add_custom_command(OUTPUT tcctest.2 COMMAND tcc ${TCC_TEST_RUN} ${TCC_TEST_SOURCE} > tcctest.2)
28add_custom_command(OUTPUT tcctest.3 COMMAND tcc ${TCC_TEST_RUN} ${TCC_TEST_RUN} ${TCC_TEST_SOURCE} > tcctest.3)
29add_custom_target(tcctest-ref ALL DEPENDS tcctest.ref tcctest.1 tcctest.2 tcctest.3)
30
31find_program(DIFF diff C:/MinGW/msys/1.0/bin)
32
33add_test(test1 ${DIFF} tcctest.ref tcctest.1)
34add_test(test2 ${DIFF} tcctest.ref tcctest.2)
35add_test(test3 ${DIFF} tcctest.ref tcctest.3)
36
37set(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)
91if(WIN32)
92 list(REMOVE_ITEM MORETESTS 24_math_library)
93 list(REMOVE_ITEM MORETESTS 28_strings)
94endif()
95foreach(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)
98endforeach()

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