From bab334acd4d687b400c4cecb7975a0d69021d154 Mon Sep 17 00:00:00 2001 From: David Chisnall Date: Wed, 1 Aug 2018 13:21:23 +0100 Subject: [PATCH] Fix cmake configuration for Windows builds. --- CMakeLists.txt | 49 ++++++++++++++++++++++++++++++++------------- Test/CMakeLists.txt | 4 +++- 2 files changed, 38 insertions(+), 15 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6393de9..21a62d3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,15 +9,21 @@ macro(install_symlink filepath sympath) install(CODE "message(\"-- Symlinking: ${sympath} -> ${filepath}\")") endmacro(install_symlink) -set(CMAKE_C_FLAGS_DEBUG "/Z7 -O0 -Xclang -fno-inline ${CMAKE_C_FLAGS_DEBUG}") -set(CMAKE_SHARED_LINKER_FLAGS "/DEBUG /INCREMENTAL:NO ${CMAKE_SHARED_LINKER_FLAGS}") +set(CMAKE_C_FLAGS_DEBUG "-O0 -Xclang -fno-inline ${CMAKE_C_FLAGS_DEBUG}") set(CMAKE_C_FLAGS_RELEASE "-O3 ${CMAKE_C_FLAGS_RELEASE}") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") set(libobjc_VERSION 4.6) -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /EHas -Xclang -fexceptions -Xclang -fobjc-exceptions") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHas") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Xclang -fexceptions -Xclang -fobjc-exceptions") +if (MSVC) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /EHas") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHas") + set(CMAKE_C_FLAGS_DEBUG "/Z7 ${CMAKE_C_FLAGS_DEBUG}") + set(CMAKE_SHARED_LINKER_FLAGS "/DEBUG /INCREMENTAL:NO ${CMAKE_SHARED_LINKER_FLAGS}") + set(CMAKE_EXE_LINKER_FLAGS "/DEBUG /INCREMENTAL:NO ${CMAKE_EXE_LINKER_FLAGS}") + set(objc_LINK_FLAGS "/DEBUG /INCREMENTAL:NO ${objc_LINK_FLAGS}") +endif() # Build configuration add_definitions( -DGNUSTEP -D__OBJC_RUNTIME_INTERNAL__=1) @@ -208,18 +214,33 @@ set(ENABLE_OBJCXX true CACHE BOOL set(CXXRT_IS_STDLIB false) -add_custom_command(OUTPUT block_trampolines.obj - COMMAND ${CMAKE_C_COMPILER} -c "${CMAKE_SOURCE_DIR}/block_trampolines.S" -o "${CMAKE_BINARY_DIR}/block_trampolines.obj" - MAIN_DEPENDENCY block_trampolines.S -) -add_custom_command(OUTPUT objc_msgSend.obj - COMMAND ${CMAKE_C_COMPILER} -c "${CMAKE_SOURCE_DIR}/objc_msgSend.S" -o "${CMAKE_BINARY_DIR}/objc_msgSend.obj" - MAIN_DEPENDENCY objc_msgSend.S - DEPENDS objc_msgSend.aarch64.S objc_msgSend.arm.S objc_msgSend.mips.S objc_msgSend.x86-32.S objc_msgSend.x86-64.S -) +if(WIN32) + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(ASM_TARGET -m64) + else() + set(ASM_TARGET -m32) + endif() +endif() + + +if (MSVC) + # CMake is completely broken when you try to build assembly files on Windows. + add_custom_command(OUTPUT block_trampolines.obj + COMMAND echo ${CMAKE_C_COMPILER} ${ASM_TARGET} -c "${CMAKE_SOURCE_DIR}/block_trampolines.S" -o "${CMAKE_BINARY_DIR}/block_trampolines.obj" + COMMAND ${CMAKE_C_COMPILER} ${ASM_TARGET} -c "${CMAKE_SOURCE_DIR}/block_trampolines.S" -o "${CMAKE_BINARY_DIR}/block_trampolines.obj" + MAIN_DEPENDENCY block_trampolines.S + ) + add_custom_command(OUTPUT objc_msgSend.obj + COMMAND echo ${CMAKE_C_COMPILER} ${ASM_TARGET} -c "${CMAKE_SOURCE_DIR}/objc_msgSend.S" -o "${CMAKE_BINARY_DIR}/objc_msgSend.obj" + COMMAND ${CMAKE_C_COMPILER} ${ASM_TARGET} -c "${CMAKE_SOURCE_DIR}/objc_msgSend.S" -o "${CMAKE_BINARY_DIR}/objc_msgSend.obj" + MAIN_DEPENDENCY objc_msgSend.S + DEPENDS objc_msgSend.aarch64.S objc_msgSend.arm.S objc_msgSend.mips.S objc_msgSend.x86-32.S objc_msgSend.x86-64.S + ) + set(libobjc_ASM_OBJS block_trampolines.obj objc_msgSend.obj) +endif() -add_library(objc SHARED ${libobjc_C_SRCS} ${libobjc_ASM_SRCS} ${libobjc_OBJC_SRCS} block_trampolines.obj objc_msgSend.obj) +add_library(objc SHARED ${libobjc_C_SRCS} ${libobjc_ASM_SRCS} ${libobjc_OBJC_SRCS} ${libobjc_ASM_OBJS}) if (ENABLE_OBJCXX) if (WIN32) diff --git a/Test/CMakeLists.txt b/Test/CMakeLists.txt index 10628b4..f9d2e51 100644 --- a/Test/CMakeLists.txt +++ b/Test/CMakeLists.txt @@ -54,6 +54,8 @@ set(TESTS if (WIN32) else () + # Don't run the tests that are specific to Itanium-style exceptions on + # Windows. list(APPEND TESTS BoxedForeignException.m ForeignException.m @@ -97,7 +99,7 @@ function(addtest_flags TEST_NAME FLAGS TEST_SOURCE) set_target_properties(${TEST_NAME} PROPERTIES INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}" COMPILE_FLAGS "-Xclang -fblocks ${FLAGS}" - LINK_FLAGS "/INCREMENTAL:NO" + LINK_FLAGS ${INCREMENTAL} LINKER_LANGUAGE C ) set_property(TEST ${TEST_NAME} PROPERTY