Rewrite to use CMake

Now the project is at least installable.

Added a LICENSE file.

Likely about to implement Lua plugins.
This commit is contained in:
Přemysl Eric Janouch 2015-01-17 15:54:49 +01:00
parent 77509ceb56
commit 7cb6fcdaff
7 changed files with 167 additions and 42 deletions

125
CMakeLists.txt Normal file
View File

@ -0,0 +1,125 @@
project (ponymap C)
cmake_minimum_required (VERSION 2.8.5)
# Moar warnings
if ("${CMAKE_C_COMPILER_ID}" MATCHES "GNU" OR CMAKE_COMPILER_IS_GNUC)
# -Wunused-function is pretty annoying here, as everything is static
set (CMAKE_C_FLAGS "-std=c99 -Wall -Wextra -Wno-unused-function")
endif ("${CMAKE_C_COMPILER_ID}" MATCHES "GNU" OR CMAKE_COMPILER_IS_GNUC)
# Build options
option (WITH_LUA "Enable experimental support for Lua 5.3 plugins" ON)
# Version
set (project_VERSION_MAJOR "0")
set (project_VERSION_MINOR "1")
set (project_VERSION_PATCH "0")
set (project_VERSION "${project_VERSION_MAJOR}")
set (project_VERSION "${project_VERSION}.${project_VERSION_MINOR}")
set (project_VERSION "${project_VERSION}.${project_VERSION_PATCH}")
# Dependencies
find_package (Curses)
find_package (PkgConfig REQUIRED)
pkg_check_modules (jansson REQUIRED jansson)
pkg_check_modules (libssl REQUIRED libssl)
pkg_check_modules (ncursesw ncursesw)
if (ncursesw_FOUND)
set (project_libraries ${ncursesw_LIBRARIES})
include_directories (${ncursesw_INCLUDE_DIRS})
elseif (CURSES_FOUND)
set (project_libraries ${CURSES_LIBRARY})
include_directories (${CURSES_INCLUDE_DIR})
else (CURSES_FOUND)
message (SEND_ERROR "Curses not found")
endif (ncursesw_FOUND)
if (WITH_LUA)
pkg_search_module (lua REQUIRED lua5.3 lua-5.3 lua=5.3)
list (APPEND project_libraries ${lua_LIBRARIES})
include_directories (${lua_INCLUDE_DIRS})
endif (WITH_LUA)
# -lpthread is only there for debugging (gdb & errno)
# -lrt is only for glibc < 2.17
list (APPEND project_libraries
${libssl_LIBRARIES} ${jansson_LIBRARIES} rt dl pthread)
include_directories (${libssl_INCLUDE_DIRS} ${jansson_INCLUDE_DIRS})
# Project source files
set (project_sources ${PROJECT_NAME}.c siphash.c)
set (project_headers ${PROJECT_BINARY_DIR}/config.h)
# Generate a configuration file
include (GNUInstallDirs)
set (plugin_dir ${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME})
configure_file (${PROJECT_SOURCE_DIR}/config.h.in ${PROJECT_BINARY_DIR}/config.h)
include_directories (${PROJECT_SOURCE_DIR} ${PROJECT_BINARY_DIR})
# Build and install the main executable
add_executable (${PROJECT_NAME} ${project_sources} ${project_headers})
target_link_libraries (${PROJECT_NAME} ${project_libraries})
install (TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_BINDIR})
install (FILES LICENSE DESTINATION ${CMAKE_INSTALL_DOCDIR})
# Build the HTTP plugin
add_library (plugin-http SHARED plugins/http.c plugin-api.h
http-parser/http_parser.c http-parser/http_parser.h)
target_link_libraries (plugin-http ${project_libraries})
set_target_properties (plugin-http PROPERTIES OUTPUT_NAME http PREFIX "")
install (TARGETS plugin-http DESTINATION ${plugin_dir})
# Build the other plugins
foreach (plugin irc ssh)
set (target plugin-${plugin})
add_library (${target} SHARED plugins/${plugin}.c plugin-api.h)
target_link_libraries (${target} ${project_libraries})
set_target_properties (${target} PROPERTIES OUTPUT_NAME ${plugin} PREFIX "")
install (TARGETS ${target} DESTINATION ${plugin_dir})
endforeach (plugin)
# Generate documentation from program help
find_program (HELP2MAN_EXECUTABLE help2man)
if (NOT HELP2MAN_EXECUTABLE)
message (FATAL_ERROR "help2man not found")
endif (NOT HELP2MAN_EXECUTABLE)
foreach (page ${PROJECT_NAME})
set (page_output "${PROJECT_BINARY_DIR}/${page}.1")
list (APPEND project_MAN_PAGES "${page_output}")
add_custom_command (OUTPUT ${page_output}
COMMAND ${HELP2MAN_EXECUTABLE} -N
"${PROJECT_BINARY_DIR}/${page}" -o ${page_output}
DEPENDS ${PROJECT_NAME}
COMMENT "Generating man page for ${page}" VERBATIM)
endforeach (page)
add_custom_target (docs ALL DEPENDS ${project_MAN_PAGES})
foreach (page ${project_MAN_PAGES})
string (REGEX MATCH "\\.([0-9])" manpage_suffix "${page}")
install (FILES "${page}"
DESTINATION "${CMAKE_INSTALL_MANDIR}/man${CMAKE_MATCH_1}")
endforeach (page)
# CPack
set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "Experimental network scanner")
set (CPACK_PACKAGE_VERSION ${project_VERSION})
set (CPACK_PACKAGE_VENDOR "Premysl Janouch")
set (CPACK_PACKAGE_CONTACT "Přemysl Janouch <p.janouch@gmail.com>")
set (CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE")
set (CPACK_GENERATOR "TGZ;ZIP")
set (CPACK_PACKAGE_FILE_NAME
"${PROJECT_NAME}-${project_VERSION}-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}")
set (CPACK_PACKAGE_INSTALL_DIRECTORY "${PROJECT_NAME}-${project_VERSION}")
set (CPACK_SOURCE_GENERATOR "TGZ;ZIP")
set (CPACK_SOURCE_IGNORE_FILES "/\\\\.git;/build;/CMakeLists.txt.user")
set (CPACK_SOURCE_PACKAGE_FILE_NAME "${PROJECT_NAME}-${project_VERSION}")
set (CPACK_SET_DESTDIR TRUE)
include (CPack)

14
LICENSE Normal file
View File

@ -0,0 +1,14 @@
Copyright (c) 2014 - 2015, Přemysl Janouch <p.janouch@gmail.com>
All rights reserved.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

View File

@ -1,30 +0,0 @@
SHELL = /bin/sh
# -Wunused-function is pretty annoying here, as everything is static
CFLAGS = -std=c99 -Wall -Wextra -Wpedantic -Wno-unused-function -ggdb
# -lpthread is only there for debugging (gdb & errno)
# -lrt is only for glibc < 2.17
LDFLAGS = `pkg-config --libs libssl jansson` -lpthread -lrt -ldl -lcurses
LDFLAGS_PLUGIN = $(LDFLAGS) -shared -fPIC
.PHONY: all clean
.SUFFIXES:
targets = ponymap ponymap.1 plugins/http.so plugins/irc.so plugins/ssh.so
all: $(targets)
clean:
rm -f $(targets)
ponymap: ponymap.c utils.c plugin-api.h siphash.c
$(CC) ponymap.c siphash.c -o $@ $(CFLAGS) $(LDFLAGS)
ponymap.1: ponymap
help2man -No $@ ./$<
plugins/%.so: plugins/%.c utils.c plugin-api.h
$(CC) $< -o $@ $(CFLAGS) $(LDFLAGS_PLUGIN)
plugins/http.so: plugins/http.c utils.c plugin-api.h \
http-parser/http_parser.c http-parser/http_parser.h
$(CC) $< http-parser/http_parser.c -o $@ $(CFLAGS) $(LDFLAGS_PLUGIN)

22
README
View File

@ -17,21 +17,29 @@ the maximum number of concurrent connections.
Building and Running
--------------------
Build dependencies: GCC/Clang, GNU make, help2man, pkg-config, openssl, Jansson
Build dependencies: CMake, pkg-config, help2man, curses, openssl, Jansson,
lua = 5.3 (optional)
$ git clone https://github.com/pjanouch/ponymap.git
$ git submodule init
$ git submodule update
$ mkdir build
$ cd build
$ cmake .. -DCMAKE_BUILD_TYPE=Debug -DWITH_LUA=NO
$ make
That is all, no installation is required, or supported for that matter.
To install the application, you can do either the usual:
$ make install
First you might want to generate a configuration file:
$ ./ponymap --write-default-config
Or you can try telling CMake to make a package for you. For Debian it is:
$ cpack -G DEB
# dpkg -i ponymap-*.deb
After making any necessary edits to the file (there are comments to aid you in
doing that), simply run the appropriate program with no arguments to retrieve
a usage text.
Note that for versions of CMake before 2.8.9, you need to prefix cpack with
`fakeroot' or file ownership will end up wrong.
Having the program installed, simply run it with no arguments to retrieve
a usage text. Have fun scanning.
Author's Notes
--------------

10
config.h.in Normal file
View File

@ -0,0 +1,10 @@
#ifndef CONFIG_H
#define CONFIG_H
#define PROGRAM_NAME "${CMAKE_PROJECT_NAME}"
#define PROGRAM_VERSION "${project_VERSION}"
#cmakedefine WITH_LUA
#define PLUGIN_DIR "${CMAKE_INSTALL_PREFIX}/${plugin_dir}"
#endif // ! CONFIG_H

View File

@ -39,8 +39,7 @@
static struct config_item g_config_table[] =
{
// TODO: set the default to the installation directory
{ "plugin_dir", NULL, "Where to search for plugins" },
{ "plugin_dir", PLUGIN_DIR, "Where to search for plugins" },
{ NULL, NULL, NULL }
};

View File

@ -18,12 +18,11 @@
*
*/
#define PROGRAM_NAME "ponymap"
#define PROGRAM_VERSION "alpha"
#define _POSIX_C_SOURCE 199309L
#define _XOPEN_SOURCE 600
#include "config.h"
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>