From 6e5cab971f3babbf9038dcd549e6410323caeb15 Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 13 Aug 2019 01:06:08 +0100 Subject: [PATCH] make windows fixes --- .travis.yml | 6 ++++++ CMakeLists.txt | 25 ++++++++++++------------- cmake/cross_compile.cmake | 6 ++++-- cmake/win32.cmake | 9 +++++++-- contrib/cross/mingw.cmake | 34 +++++++++++----------------------- contrib/cross/mingw32.cmake | 33 +++++++++++---------------------- contrib/cross/mingw_core.cmake | 24 ++++++++++++++++++++++++ 7 files changed, 75 insertions(+), 62 deletions(-) create mode 100644 contrib/cross/mingw_core.cmake diff --git a/.travis.yml b/.travis.yml index c9122674f..773160b02 100644 --- a/.travis.yml +++ b/.travis.yml @@ -82,6 +82,12 @@ matrix: dist: xenial env: DOCKER_FILE=docker/gcc-trunk.Dockerfile services: docker + - os: osx + osx_image: xcode10.2 + env: MAKE_TARGET=windows + - os: osx + osx_image: xcode10.2 + env: MAKE_TARGET=windows-release env: global: diff --git a/CMakeLists.txt b/CMakeLists.txt index 65c14df80..f9cadc03e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -173,22 +173,21 @@ if(STATIC_LINK_RUNTIME) else() add_compile_options(-static) endif() + if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") link_libraries( -static -static-libstdc++ -pthread -flto ) + elseif(NOT CMAKE_CROSSCOMPILING) + # this is messing with release builds + add_compile_options(-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0) + set(CMAKE_AR "gcc-ar") + set(CMAKE_C_ARCHIVE_CREATE " qcs ") + set(CMAKE_C_ARCHIVE_FINISH "true") + set(CMAKE_CXX_ARCHIVE_CREATE " qcs ") + set(CMAKE_CXX_ARCHIVE_FINISH "true") + link_libraries( -flto -static-libstdc++ -static-libgcc -static -Wl,--whole-archive -lpthread -Wl,--no-whole-archive ) else() - if(NOT CMAKE_CROSSCOMPILING) - # this is messing with release builds - add_compile_options(-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0) - set(CMAKE_AR "gcc-ar") - set(CMAKE_C_ARCHIVE_CREATE " qcs ") - set(CMAKE_C_ARCHIVE_FINISH "true") - set(CMAKE_CXX_ARCHIVE_CREATE " qcs ") - set(CMAKE_CXX_ARCHIVE_FINISH "true") - link_libraries( -flto -static-libstdc++ -static-libgcc -static -Wl,--whole-archive -lpthread -Wl,--no-whole-archive ) - else() - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libstdc++ -static-libgcc -static -Wl,--whole-archive -lpthread -Wl,--no-whole-archive" ) - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}") - endif() + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libstdc++ -static-libgcc -static -Wl,--whole-archive -lpthread -Wl,--no-whole-archive" ) + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}") endif() else() link_libraries( -static-libstdc++ -static-libgcc ) diff --git a/cmake/cross_compile.cmake b/cmake/cross_compile.cmake index 1539f3b19..7b3e74799 100644 --- a/cmake/cross_compile.cmake +++ b/cmake/cross_compile.cmake @@ -4,8 +4,10 @@ if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options(-Wno-unused-command-line-argument -Wno-c++11-narrowing) add_compile_options($<$:-Wno-bad-function-cast>) if (NO_LIBGCC) - set(CMAKE_CXX_STANDARD_LIBRARIES "-lunwind -lpsapi ${CMAKE_CXX_STANDARD_LIBRARIES}") - set(CMAKE_C_STANDARD_LIBRARIES "-lunwind -lpsapi ${CMAKE_C_STANDARD_LIBRARIES}") + find_library(UNWIND_LIB unwind) + link_libraries(${UNWIND_LIB}) + find_library(PSAPI_LIB psapi) + link_libraries(${PSAPI_LIB}) endif(NO_LIBGCC) else() # found it. this is GNU only diff --git a/cmake/win32.cmake b/cmake/win32.cmake index dc8040722..52956bd99 100644 --- a/cmake/win32.cmake +++ b/cmake/win32.cmake @@ -21,7 +21,9 @@ if(NOT MSVC_VERSION) # GNU ld sees fit to merge *all* the .ident sections in object files # to .r[o]data section one after the other! add_compile_options(-fno-ident -Wa,-mbig-obj) - link_libraries( -lshlwapi -ldbghelp ) + find_library(shlwapi_lib shlwapi) + find_library(dbghelp_lib dbghelp) + link_libraries( ${shlwapi_lib} ${dbghelp_lib} ) add_definitions(-DWINVER=0x0500 -D_WIN32_WINNT=0x0500) # Wait a minute, if we're not Microsoft C++, nor a Clang paired with Microsoft C++, # then the only possible option has to be GNU or a GNU-linked Clang! @@ -33,7 +35,10 @@ endif() get_filename_component(LIBTUNTAP_IMPL ${TT_ROOT}/tuntap-windows.c ABSOLUTE) get_filename_component(EV_SRC "llarp/ev/ev_win32.cpp" ABSOLUTE) add_definitions(-DWIN32_LEAN_AND_MEAN -DWIN32 -DWINVER=0x0500) -set(EXE_LIBS ${STATIC_LIB} ${FS_LIB} ws2_32 iphlpapi) + +find_library(ws2_32_lib ws2_32) +find_library(iphlpapi_lib iphlpapi) +set(EXE_LIBS ${STATIC_LIB} ${FS_LIB} ${ws2_32_lib} ${iphlpapi_lib}) if(RELEASE_MOTTO) add_definitions(-DLLARP_RELEASE_MOTTO="${RELEASE_MOTTO}") diff --git a/contrib/cross/mingw.cmake b/contrib/cross/mingw.cmake index 9521c8009..0a591fb53 100644 --- a/contrib/cross/mingw.cmake +++ b/contrib/cross/mingw.cmake @@ -1,28 +1,16 @@ set(CMAKE_SYSTEM_NAME Windows) set(TOOLCHAIN_PREFIX x86_64-w64-mingw32) set(TOOLCHAIN_SUFFIX "") +set(WIN64_CROSS_COMPILE ON) -add_definitions("-DWINNT_CROSS_COMPILE") - -# target environment on the build host system -# second one is for non-root installs -set(CMAKE_FIND_ROOT_PATH /usr/${TOOLCHAIN_PREFIX} /usr/local/opt/mingw-w64/toolchain-x86_64/ /opt/mingw64 /home/$ENV{USER}/mingw32 /home/$ENV{USER}/mingw64 /home/$ENV{USER}/mingw64/${TOOLCHAIN_PREFIX} /home/$ENV{USER}/mingw32/${TOOLCHAIN_PREFIX}) - -# modify default behavior of FIND_XXX() commands -set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) -set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) -set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) - -# cross compilers to use -if($ENV{COMPILER} MATCHES "clang") - set(USING_CLANG ON) - set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-clang) - set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}-clang++) -else() - set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc${TOOLCHAIN_SUFFIX}) - set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}-g++${TOOLCHAIN_SUFFIX}) - add_compile_options("-Wa,-mbig-obj") -endif() +set(TOOLCHAIN_PATHS + /usr/${TOOLCHAIN_PREFIX} + /usr/local/opt/mingw-w64/toolchain-x86_64 + /usr/local/opt/mingw-w64/toolchain-x86_64/x86_64-w64-mingw32 + /opt/mingw64 + /home/$ENV{USER}/mingw32 + /home/$ENV{USER}/mingw64 + /home/$ENV{USER}/mingw64/${TOOLCHAIN_PREFIX} + /home/$ENV{USER}/mingw32/${TOOLCHAIN_PREFIX}) -set(CMAKE_RC_COMPILER ${TOOLCHAIN_PREFIX}-windres) -set(WIN64_CROSS_COMPILE ON) +include("${CMAKE_CURRENT_LIST_DIR}/mingw_core.cmake") diff --git a/contrib/cross/mingw32.cmake b/contrib/cross/mingw32.cmake index 6a853511f..3e1e490ff 100644 --- a/contrib/cross/mingw32.cmake +++ b/contrib/cross/mingw32.cmake @@ -1,26 +1,15 @@ set(CMAKE_SYSTEM_NAME Windows) set(TOOLCHAIN_PREFIX i686-w64-mingw32) +set(TOOLCHAIN_SUFFIX "") +set(WOW64_CROSS_COMPILE ON) -add_definitions("-DWINNT_CROSS_COMPILE") - -# target environment on the build host system -# second one is for non-root installs -set(CMAKE_FIND_ROOT_PATH /usr/${TOOLCHAIN_PREFIX} /opt/mingw32 /home/$ENV{USER}/mingw32 /home/$ENV{USER}/mingw32/${TOOLCHAIN_PREFIX}) - -# modify default behavior of FIND_XXX() commands -set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) -set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) -set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) - -# cross compilers to use -if($ENV{COMPILER} MATCHES "clang") -set(USING_CLANG ON) -set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-clang) -set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}-clang++) -else() -set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc) -set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}-g++) -endif() +set(TOOLCHAIN_PATHS + /usr/${TOOLCHAIN_PREFIX} + /usr/local/opt/mingw-w64/toolchain-i686 + /usr/local/opt/mingw-w64/toolchain-i686/i686-w64-mingw32 + /opt/mingw32 + /home/$ENV{USER}/mingw32 + /home/$ENV{USER}/mingw32/${TOOLCHAIN_PREFIX} +) -set(CMAKE_RC_COMPILER ${TOOLCHAIN_PREFIX}-windres) -set(WOW64_CROSS_COMPILE ON) +include("${CMAKE_CURRENT_LIST_DIR}/mingw_core.cmake") diff --git a/contrib/cross/mingw_core.cmake b/contrib/cross/mingw_core.cmake new file mode 100644 index 000000000..c636e7ba5 --- /dev/null +++ b/contrib/cross/mingw_core.cmake @@ -0,0 +1,24 @@ +# target environment on the build host system +# second one is for non-root installs +set(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_PATHS}) + +add_definitions("-DWINNT_CROSS_COMPILE") + +# modify default behavior of FIND_XXX() commands +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + +# cross compilers to use +if($ENV{COMPILER} MATCHES "clang") + set(USING_CLANG ON) + set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-clang) + set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}-clang++) +else() + set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc${TOOLCHAIN_SUFFIX}) + set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}-g++${TOOLCHAIN_SUFFIX}) + add_compile_options("-Wa,-mbig-obj") +endif() + +set(CMAKE_RC_COMPILER ${TOOLCHAIN_PREFIX}-windres)