Skip to content

Commit

Permalink
rewrite cmake files
Browse files Browse the repository at this point in the history
  • Loading branch information
spacemeowx2 committed Jan 9, 2019
1 parent c330b67 commit fd32507
Show file tree
Hide file tree
Showing 17 changed files with 142 additions and 122 deletions.
92 changes: 6 additions & 86 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,11 @@ cmake_minimum_required(VERSION 3.0)
project (SwitchLanPlay)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")

execute_process(COMMAND git describe --tags
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
OUTPUT_VARIABLE LANPLAY_VERSION
OUTPUT_STRIP_TRAILING_WHITESPACE)
# add external libraries
include(external/external.cmake)

if (LANPLAY_VERSION STREQUAL "")
set(LANPLAY_VERSION v0.0.7)
MESSAGE("git describe --tags output is empty, set version to ${LANPLAY_VERSION}")
endif()

add_compile_options(
"-Wall"
"-Wno-unused-function"
"-DLANPLAY_VERSION=\"${LANPLAY_VERSION}\""
)
set(CMAKE_C_FLAGS_DEBUG
"-g3 -ggdb -g"
)
Expand All @@ -37,76 +26,7 @@ elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
add_definitions(-DLANPLAY_DARWIN)
endif()

include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
lwip/custom
lwip/src/include
src
uvw
)
add_subdirectory(base)
add_subdirectory(lwip)

if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
include_directories(
/usr/local/opt/libuv/include
)
link_directories(
/usr/local/opt/libuv/lib
)
endif()



if (WIN32)
include(ExternalProject)
ExternalProject_Add(
winpcap
PREFIX ${CMAKE_BINARY_DIR}/winpcap
URL "https://www.winpcap.org/install/bin/WpdPack_4_1_2.zip"
URL_MD5 "bae2236af062b0900ad1416b2c4878b9"
CONFIGURE_COMMAND "" BUILD_COMMAND "" INSTALL_DIR "" INSTALL_COMMAND ""
# LOG_DOWNLOAD ON
)
ExternalProject_Get_Property(winpcap SOURCE_DIR)
set(PCAP_ROOT_DIR ${SOURCE_DIR})
set(PCAP_INCLUDE_DIR ${SOURCE_DIR}/Include)
set(PCAP_LIBRARY ${SOURCE_DIR}/Lib/x64/wpcap.lib ${SOURCE_DIR}/Lib/wpcap.lib)
message("PCAP_ROOT_DIR = ${PCAP_ROOT_DIR} INCLUDE = ${PCAP_INCLUDE_DIR}")
else()
include(cmake/FindPCAP.cmake)
endif()

set(SOURCE_FILES
base/debug.c
base/llog.c

src/main.c
src/packet.c
src/arp.c
src/helper.c
src/lan-client.c
src/gateway.cpp
src/proxy_direct.cpp
src/proxy_socks5.cpp
src/ipv4/ipv4.c
src/ipv4/tcp.c
src/ipv4/udp.c
src/ipv4/icmp.c

src/uv_lwip.c
)

add_executable(lan-play ${SOURCE_FILES})
target_link_libraries(lan-play lwip_lib ${PCAP_LIBRARY})
include_directories(lan-play ${PCAP_INCLUDE_DIR})

if (WIN32)
add_dependencies(lan-play winpcap)
target_link_libraries(lan-play libuv.a ws2_32.lib iphlpapi.lib psapi userenv.lib)
# https://stackoverflow.com/questions/13768515/how-to-do-static-linking-of-libwinpthread-1-dll-in-mingw
target_link_libraries(lan-play -static-libgcc -static-libstdc++ -Wl,-Bstatic -lstdc++ -lpthread -Wl,-Bdynamic)
else()
target_link_libraries(lan-play uv pthread)
endif()

INSTALL(TARGETS lan-play RUNTIME DESTINATION bin)
add_subdirectory(uv_lwip)
add_subdirectory(src)
6 changes: 6 additions & 0 deletions base/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
set(BASE_SOURCES
debug.c
llog.c
)
add_library(base STATIC ${BASE_SOURCES})
target_include_directories(base PUBLIC include)
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
2 changes: 1 addition & 1 deletion base/llog.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#include <string.h>
#include "llog.h"
#include <base/llog.h>

static char *llog_level_names[] = { NULL, "ERROR", "WARNING", "NOTICE", "INFO", "DEBUG" };
void LLog_log(int level, const char *fmt, ...)
Expand Down
91 changes: 56 additions & 35 deletions cmake/FindPCAP.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -19,53 +19,74 @@
# library e.g. required by pf_ring's libpcap)
# HAVE_PF_RING If a found version of libpcap supports PF_RING

find_path(PCAP_ROOT_DIR
NAMES include/pcap.h
)
# Download winpcap
if (WIN32)
include(ExternalProject)
ExternalProject_Add(
winpcap
PREFIX ${CMAKE_BINARY_DIR}/winpcap
URL "https://www.winpcap.org/install/bin/WpdPack_4_1_2.zip"
URL_MD5 "bae2236af062b0900ad1416b2c4878b9"
CONFIGURE_COMMAND "" BUILD_COMMAND "" INSTALL_DIR "" INSTALL_COMMAND ""
# LOG_DOWNLOAD ON
)
ExternalProject_Get_Property(winpcap SOURCE_DIR)
set(PCAP_ROOT_DIR ${SOURCE_DIR})
set(PCAP_INCLUDE_DIR ${PCAP_ROOT_DIR}/Include)
set(PCAP_LIBRARY ${PCAP_ROOT_DIR}/Lib/x64/wpcap.lib ${PCAP_ROOT_DIR}/Lib/wpcap.lib)
message("PCAP_ROOT_DIR = ${PCAP_ROOT_DIR} INCLUDE = ${PCAP_INCLUDE_DIR}")
else()
find_path(PCAP_ROOT_DIR
NAMES include/pcap.h
)

find_path(PCAP_INCLUDE_DIR
NAMES pcap.h
HINTS ${PCAP_ROOT_DIR}/include
)
find_path(PCAP_INCLUDE_DIR
NAMES pcap.h
HINTS ${PCAP_ROOT_DIR}/include
)

find_library(PCAP_LIBRARY
NAMES pcap
HINTS ${PCAP_ROOT_DIR}/lib
)

find_library(PCAP_LIBRARY
NAMES pcap
HINTS ${PCAP_ROOT_DIR}/lib
)
endif()

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(PCAP DEFAULT_MSG
PCAP_LIBRARY
PCAP_INCLUDE_DIR
)

include(CheckCSourceCompiles)
set(CMAKE_REQUIRED_LIBRARIES ${PCAP_LIBRARY})
check_c_source_compiles("int main() { return 0; }" PCAP_LINKS_SOLO)
set(CMAKE_REQUIRED_LIBRARIES)
if (!WIN32)
include(CheckCSourceCompiles)
set(CMAKE_REQUIRED_LIBRARIES ${PCAP_LIBRARY})
check_c_source_compiles("int main() { return 0; }" PCAP_LINKS_SOLO)
set(CMAKE_REQUIRED_LIBRARIES)

# check if linking against libpcap also needs to link against a thread library
if (NOT PCAP_LINKS_SOLO)
find_package(Threads)
if (THREADS_FOUND)
set(CMAKE_REQUIRED_LIBRARIES ${PCAP_LIBRARY} ${CMAKE_THREAD_LIBS_INIT})
check_c_source_compiles("int main() { return 0; }" PCAP_NEEDS_THREADS)
set(CMAKE_REQUIRED_LIBRARIES)
endif ()
if (THREADS_FOUND AND PCAP_NEEDS_THREADS)
set(_tmp ${PCAP_LIBRARY} ${CMAKE_THREAD_LIBS_INIT})
list(REMOVE_DUPLICATES _tmp)
set(PCAP_LIBRARY ${_tmp}
CACHE STRING "Libraries needed to link against libpcap" FORCE)
else ()
message(FATAL_ERROR "Couldn't determine how to link against libpcap")
# check if linking against libpcap also needs to link against a thread library
if (NOT PCAP_LINKS_SOLO)
find_package(Threads)
if (THREADS_FOUND)
set(CMAKE_REQUIRED_LIBRARIES ${PCAP_LIBRARY} ${CMAKE_THREAD_LIBS_INIT})
check_c_source_compiles("int main() { return 0; }" PCAP_NEEDS_THREADS)
set(CMAKE_REQUIRED_LIBRARIES)
endif ()
if (THREADS_FOUND AND PCAP_NEEDS_THREADS)
set(_tmp ${PCAP_LIBRARY} ${CMAKE_THREAD_LIBS_INIT})
list(REMOVE_DUPLICATES _tmp)
set(PCAP_LIBRARY ${_tmp}
CACHE STRING "Libraries needed to link against libpcap" FORCE)
else ()
message(FATAL_ERROR "Couldn't determine how to link against libpcap")
endif ()
endif ()
endif ()

include(CheckFunctionExists)
set(CMAKE_REQUIRED_LIBRARIES ${PCAP_LIBRARY})
check_function_exists(pcap_get_pfring_id HAVE_PF_RING)
set(CMAKE_REQUIRED_LIBRARIES)
include(CheckFunctionExists)
set(CMAKE_REQUIRED_LIBRARIES ${PCAP_LIBRARY})
check_function_exists(pcap_get_pfring_id HAVE_PF_RING)
set(CMAKE_REQUIRED_LIBRARIES)
endif()

mark_as_advanced(
PCAP_ROOT_DIR
Expand Down
11 changes: 11 additions & 0 deletions external/external.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
message(STATUS "Installing libuv via submodule")
execute_process(COMMAND git submodule update --init -- external/libuv
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
add_subdirectory(external/libuv)
target_include_directories(uv_a INTERFACE external/libuv/include)

message(STATUS "Installing uvw via submodule")
execute_process(COMMAND git submodule update --init -- external/uvw
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
add_subdirectory(external/uvw)
include_directories(external/uvw/src)
5 changes: 5 additions & 0 deletions lwip/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,8 @@ set(LWIP_SOURCES
src/core/ipv6/ip6_frag.c
)
add_library(lwip_lib STATIC ${LWIP_SOURCES})
target_link_libraries(lwip_lib base)
target_include_directories(lwip_lib PUBLIC
custom
src/include
)
54 changes: 54 additions & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
execute_process(COMMAND git describe --tags
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
OUTPUT_VARIABLE LANPLAY_VERSION
OUTPUT_STRIP_TRAILING_WHITESPACE)

if (LANPLAY_VERSION STREQUAL "")
set(LANPLAY_VERSION v0.0.7)
MESSAGE("git describe --tags output is empty, set version to ${LANPLAY_VERSION}")
endif()

set(src
main.c
packet.c
arp.c
helper.c
lan-client.c
gateway.cpp
proxy_direct.cpp
proxy_socks5.cpp
ipv4/ipv4.c
ipv4/tcp.c
ipv4/udp.c
ipv4/icmp.c
)

add_executable(lan-play ${src})

target_compile_options(
lan-play
PRIVATE "-Wall"
PRIVATE "-Wno-unused-function"
PRIVATE "-DLANPLAY_VERSION=\"${LANPLAY_VERSION}\""
)

set_target_properties(lan-play PROPERTIES CXX_STANDARD 14)

target_link_libraries(lan-play base)
target_link_libraries(lan-play uv_lwip)
target_link_libraries(lan-play uv_a)

find_package(PCAP REQUIRED)
target_link_libraries(lan-play ${PCAP_LIBRARY})
target_include_directories(lan-play PRIVATE ${PCAP_INCLUDE_DIR})

if (WIN32)
add_dependencies(lan-play winpcap)
target_link_libraries(lan-play ws2_32.lib iphlpapi.lib psapi userenv.lib)
# https://stackoverflow.com/questions/13768515/how-to-do-static-linking-of-libwinpthread-1-dll-in-mingw
target_link_libraries(lan-play -static-libgcc -static-libstdc++ -Wl,-Bstatic -lstdc++ -lpthread -Wl,-Bdynamic)
else()
target_link_libraries(lan-play pthread)
endif()

INSTALL(TARGETS lan-play RUNTIME DESTINATION bin)
3 changes: 3 additions & 0 deletions uv_lwip/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
add_library(uv_lwip STATIC uv_lwip.c)
target_link_libraries(uv_lwip base lwip_lib)
target_include_directories(lwip_lib PUBLIC .)
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

0 comments on commit fd32507

Please sign in to comment.