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 | 82 | #ifdef _WIN32 |
| 83 | +// GCC appears to use '/' for relative paths and '\\' for absolute paths on Windows | |
| 83 | 84 | static char *normalize_slashes(char *path) |
| 84 | 85 | { |
| 85 | 86 | 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 | + } | |
| 89 | 96 | return path; |
| 90 | 97 | } |
| 91 | 98 | |
| @@ -3712,7 +3712,7 @@ ST_FUNC void unary(void) · 3711 unmodified lines | ||
| 3712 | 3712 | } |
| 3713 | 3713 | } |
| 3714 | 3714 | break; |
| 3715 | −#ifdef TCC_TARGET_X86_64 | |
| 3715 | +#if defined(TCC_TARGET_X86_64) && !defined(TCC_TARGET_PE) | |
| 3716 | 3716 | case TOK_builtin_va_arg_types: |
| 3717 | 3717 | { |
| 3718 | 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() | |