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.
Unified · Split
| @@ -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) | ||
| @@ -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 | ||
| @@ -80,12 +80,19 @@ ST_FUNC void asm_global_instr(void) · 79 unmodified lines | |||
| 80 | /********************************************************/ | 80 | /********************************************************/ |
| 81 | 81 | ||
| 82 | #ifdef _WIN32 | 82 | #ifdef _WIN32 |
| 83 | // GCC appears to use '/' for relative paths and '\\' for absolute paths on Windows | ||
| 83 | static char *normalize_slashes(char *path) | 84 | static 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 | ||
| @@ -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_64 | 3715 | #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; |
| @@ -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() | ||