diff --git a/.git_pre_commit_hook.sh b/.git_pre_commit_hook.sh new file mode 100755 index 00000000..17ef6262 --- /dev/null +++ b/.git_pre_commit_hook.sh @@ -0,0 +1,21 @@ +#!/bin/sh + +ABORT="\033[31mAbort:\033[00m" +SUCCESS="\033[32mSuccess:\033[00m" +INFO="\033[33mInfo:\033[00m" + +BRANCH_NAME=$(git symbolic-ref -q --short HEAD) + +if [ -z $BRANCH_NAME ] +then + echo $ABORT "You are not on any branch." + exit 1 +fi + +if [ $BRANCH_NAME == "master" ] +then + echo $ABORT "Commiting to master is prohibited." + exit 1 +fi + +exit 0 diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..c5bacfb7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +build/ +lib/ +bin/Debug/ +bin/Release/ \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..1e2e768e --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,115 @@ +cmake_minimum_required(VERSION 2.8.9) + +include(cmake/add_files.cmake) + + +# Variables -------------------------------------------------------------------- + +set(PROJECT_NAME masterproject) + +set(APP_PROJECT_NAME "${PROJECT_NAME}_app") +set(LIB_PROJECT_NAME "${PROJECT_NAME}_lib") +set(TEST_PROJECT_NAME "${PROJECT_NAME}_test") + + +# Settings --------------------------------------------------------------------- + +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/lib) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/lib) + +if (UNIX) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin/${CMAKE_BUILD_TYPE}) +else () + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin) +endif () + + +# Project ---------------------------------------------------------------------- + +project(${PROJECT_NAME}) + + +# Qt --------------------------------------------------------------------------- + +# Find includes in corresponding build directories +set(CMAKE_INCLUDE_CURRENT_DIR ON) +# Instruct CMake to run moc automatically when needed. +set(CMAKE_AUTOMOC ON) + +# Find the QtWidgets library +set(CMAKE_PREFIX_PATH "$ENV{QT_DIR}/") + +find_package(Qt5Widgets) + + +# Lib -------------------------------------------------------------------------- + +add_subdirectory(src/lib) + +add_library(${LIB_PROJECT_NAME} ${LIB_FILES}) + +set_target_properties( ${LIB_PROJECT_NAME} + PROPERTIES DEBUG_OUTPUT_NAME ${PROJECT_NAME}_d + RELEASE_OUTPUT_NAME ${PROJECT_NAME}) + + +# App -------------------------------------------------------------------------- + + +add_subdirectory(src/app) +include_directories(src/lib) + +add_executable(${APP_PROJECT_NAME} ${APP_FILES}) + +target_link_libraries(${APP_PROJECT_NAME} ${LIB_PROJECT_NAME}) + +# Use the Widgets module from Qt 5. +qt5_use_modules(${APP_PROJECT_NAME} Widgets) + + +# CxxTest ---------------------------------------------------------------------- + +add_subdirectory(src/test) + +set(CXXTEST_INCLUDE_DIR $ENV{CXX_TEST_DIR}) +set(CXXTEST_PYTHON_TESTGEN_EXECUTABLE ${CXXTEST_INCLUDE_DIR}/bin/cxxtestgen) +set(TESTGEN_FILE ${CMAKE_CURRENT_BINARY_DIR}/temptests.cpp) + +find_package(CxxTest) + +if (CXXTEST_FOUND) + + include_directories(${CXXTEST_INCLUDE_DIR}) + +endif (CXXTEST_FOUND) + +find_package(PythonInterp REQUIRED) + +add_executable (${TEST_PROJECT_NAME} ${TESTGEN_FILE}) + +target_link_libraries(${TEST_PROJECT_NAME} ${LIB_PROJECT_NAME}) + +if (WIN32) + + add_custom_command(TARGET ${TEST_PROJECT_NAME} + PRE_BUILD + COMMAND ${PYTHON_EXECUTABLE} ${CXXTEST_PYTHON_TESTGEN_EXECUTABLE} --runner=ParenPrinter -o ${TESTGEN_FILE} ${PROJECT_SOURCE_DIR}/src/test/*.h + COMMENT "Generating unittest code with cxxtestgen") + + add_custom_command(TARGET ${TEST_PROJECT_NAME} + POST_BUILD + COMMAND $(OutDir)$(TargetName)$(TargetExt) + COMMENT "Running unittest code") + +elseif (UNIX) + + add_custom_command(OUTPUT ${TESTGEN_FILE} + PRE_BUILD + COMMAND ${PYTHON_EXECUTABLE} ${CXXTEST_PYTHON_TESTGEN_EXECUTABLE} --runner=ParenPrinter -o ${TESTGEN_FILE} ${PROJECT_SOURCE_DIR}/src/test/*.h + COMMENT "Generating unittest code with cxxtestgen") + + add_custom_target(gen DEPENDS ${TESTGEN_FILE}) + + add_dependencies(${TEST_PROJECT_NAME} gen) + +endif () diff --git a/README.md b/README.md index b0b5637c..ddcf14c7 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,18 @@ -### Masterproject ### +### Masterproject -#### Setup #### +#### Setup + +##### External Software + +* QT 5.2.1 +* CxxTest 4.3 + +##### Environment Variables + +* QT_DIR - ...\Qt\Qt5.2.1\5.2.1\\ +* CXX_TEST_DIR - .../cxxtest-4.3/ + +##### Settings Run setup script: $ ./script/setup.sh - -Or - -Define commit message template: -$ git config commit.template .git_commit_template.txt - -Enable git commandline colors: -$ git config color.ui true diff --git a/cmake/add_files.cmake b/cmake/add_files.cmake new file mode 100644 index 00000000..e0a04d0c --- /dev/null +++ b/cmake/add_files.cmake @@ -0,0 +1,29 @@ +# +# Defines a list of files with a given name, prepends the relative path to the +# source dir to each file if available and passes the list to PARENT_SCOPE. +# +# Usage: +# add_files( +# NAME_OF_FILES +# file1.cpp +# file2.cpp +# ... +# ) +# +macro(add_files var_name) + file (RELATIVE_PATH _relPath "${CMAKE_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}") + + foreach (_src ${ARGN}) + if (_relPath) + list (APPEND ${var_name} "${CMAKE_SOURCE_DIR}/${_relPath}/${_src}") + else() + list (APPEND ${var_name} "${CMAKE_SOURCE_DIR}/${_src}") + endif() + endforeach() + + if (_relPath) + set(${var_name} ${${var_name}} PARENT_SCOPE) + else() + set(${var_name} ${${var_name}}) + endif() +endmacro() diff --git a/script/clean.sh b/script/clean.sh new file mode 100755 index 00000000..919a7f8b --- /dev/null +++ b/script/clean.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +SUCCESS="\033[32mSuccess:\033[00m" + +# Enter masterproject directory +MY_PATH=`dirname "$0"` +cd $MY_PATH/.. + +# Remove folders and contents +rm -rf build +rm -rf lib +rm -rf bin/Debug +rm -rf bin/Release + +echo $SUCCESS "clean complete" diff --git a/script/debug.sh b/script/debug.sh new file mode 100755 index 00000000..2f920def --- /dev/null +++ b/script/debug.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +# Determine path to script +MY_PATH=`dirname "$0"` + +cd $MY_PATH/.. + +# Build and run target +make -C build/Debug "$1" && bin/Debug/"$1" diff --git a/script/git-publish.sh b/script/git-publish.sh new file mode 100755 index 00000000..9b0026b1 --- /dev/null +++ b/script/git-publish.sh @@ -0,0 +1,100 @@ +#!/bin/sh + +ABORT="\033[31mAbort:\033[00m" +SUCCESS="\033[32mSuccess:\033[00m" +INFO="\033[33mInfo:\033[00m" + +echo $INFO "Checking index" + +# check clean index +if [[ -n $(git diff HEAD) ]] +then + echo $ABORT "You have uncommited changes." + exit 1 +fi + +BRANCH_NAME=$(git symbolic-ref -q --short HEAD) +PUBLISH_BRANCH_NAME=_publish_"$BRANCH_NAME"_ + +echo $INFO "Checking branch $BRANCH_NAME" + +# check if on branch +if [ -z $BRANCH_NAME ] +then + echo $ABORT "You are not on any branch." + exit 1 +fi + +# check if on master +if [ $BRANCH_NAME == "master" ] +then + echo $ABORT "You are on master. Use this script only from a feature branch." + exit 1 +fi + +git checkout -q master +git remote update &>/dev/null + +echo $INFO "Checking master" + +# check if master is up to date +if [[ -n $(git diff origin/master) ]] +then + echo $ABORT "Your master is not up-to-date. Run 'sync.sh' to update your master, then run 'git rebase master' to update branch $BRANCH_NAME." + git checkout -q $BRANCH_NAME + exit 1 +fi + +MASTER_HEAD_COMMIT=$(git rev-parse HEAD) +BASE_COMMIT=$(git merge-base $BRANCH_NAME master) + +git checkout -q $BRANCH_NAME + +BRANCH_HEAD_COMMIT=$(git rev-parse HEAD) + +# check if feature has commits +if [ $BRANCH_HEAD_COMMIT == $MASTER_HEAD_COMMIT ] +then + echo $ABORT "Your feature branch has no commits." + exit 1 +fi + +# check if feature is not behind master +if [ $BASE_COMMIT != $MASTER_HEAD_COMMIT ] +then + echo $ABORT "Your feature branch is behind master. Use 'git rebase master' to update your feature branch." + exit 1 +fi + +# switch to temporary branch for squashing +git checkout -q -b $PUBLISH_BRANCH_NAME + +echo $INFO "Squashing commits" +git reset --soft $BASE_COMMIT +git commit + +if [ $? != 0 ] +then + git checkout -q $BRANCH_NAME + git branch -q -D $PUBLISH_BRANCH_NAME + exit 1 +fi + +echo $INFO "Rebasing on master" +git checkout -q master +git rebase -q $PUBLISH_BRANCH_NAME +git branch -q -d $PUBLISH_BRANCH_NAME + +echo $INFO "Uploading to origin master" +git push origin master + +if [ $? != 0 ] +then + git reset --hard -q HEAD^ + git checkout -q $BRANCH_NAME + echo $ABORT "Pushing to origin master has failed, there are new remote changes. Run 'sync.sh' to update your master, then run 'git rebase master' to update branch $BRANCH_NAME." + exit 1 +fi + +echo $SUCCESS "Published branch $BRANCH_NAME successfully" +exit 0 diff --git a/script/git-sync-master.sh b/script/git-sync-master.sh new file mode 100755 index 00000000..bd4481fd --- /dev/null +++ b/script/git-sync-master.sh @@ -0,0 +1,69 @@ +#!/bin/sh + +ABORT="\033[31mAbort:\033[00m" +ALERT="\033[31mAlert:\033[00m" +SUCCESS="\033[32mSuccess:\033[00m" +INFO="\033[33mInfo:\033[00m" + +BRANCH_NAME=$(git symbolic-ref -q --short HEAD) + +# check if on branch +if [ -z $BRANCH_NAME ] +then + echo $ABORT "You are not on any branch." + exit 1 +fi + +# switch to master +echo $INFO "Switching to master" + +git checkout -q master + +if [ $? != 0 ] +then + echo $ABORT "Switching to master failed." + exit 1 +fi + +# check clean index +echo $INFO "Checking index" + +if [[ -n $(git diff HEAD) ]] +then + echo $ABORT "You have uncommited changes on master." + git checkout -q "$BRANCH_NAME" + exit 1 +fi + +# fetch remote changes +echo $INFO "Fetching changes" + +git fetch -q origin master + +if [ $? != 0 ] +then + echo $ABORT "Fetching from origin master failed." + git checkout -q "$BRANCH_NAME" + exit 1 +fi + +if [[ -z $(git diff origin/master) ]] +then + echo $SUCCESS "Your master is already up-to-date." + git checkout -q "$BRANCH_NAME" + exit 0 +fi + +# rebase master to origin/master +git rebase -q origin/master + +if [ $? != 0 ] +then + echo $ALERT "Rebasing on master caused conflicts. This should never happen. Follow the instructions above to resolve them then use 'git push origin master' to update the remote." + exit 1 +fi + +git checkout -q "$BRANCH_NAME" + +echo $SUCCESS "Updated master" +exit 0 diff --git a/script/release.sh b/script/release.sh new file mode 100755 index 00000000..7e5fc735 --- /dev/null +++ b/script/release.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +# Determine path to script +MY_PATH=`dirname "$0"` + +cd $MY_PATH/.. + +# Build and run target +make -C build/Release "$1" && bin/Release/"$1" diff --git a/script/setup.sh b/script/setup.sh index cf8b661a..c878a2a2 100755 --- a/script/setup.sh +++ b/script/setup.sh @@ -1,9 +1,56 @@ #!/bin/sh -# Define commit message template: +ABORT="\033[31mAbort:\033[00m" +SUCCESS="\033[32mSuccess:\033[00m" +INFO="\033[33mInfo:\033[00m" + +# Determine current platform +PLATFORM='unknown' +if [ "$(uname)" == "Darwin" ]; then + PLATFORM='MacOS' +elif [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then + PLATFORM='Linux' +elif [ "$(expr substr $(uname -s) 1 10)" == "MINGW32_NT" ]; then + PLATFORM='Windows' +fi + +# Enter masterproject directory +MY_PATH=`dirname "$0"` +cd $MY_PATH/.. + +# git settings +echo $INFO "install git settings" + git config commit.template .git_commit_template.txt - -# Enable git commandline colors: git config color.ui true +cp .git_pre_commit_hook.sh .git/hooks/pre-commit -echo "setup complete" + +# Create Debug and Release folders +echo $INFO "create build folders" + +mkdir -p build +mkdir -p lib +mkdir -p bin/Debug +mkdir -p bin/Release + +# Copy necessary dynamic libraries to bin folder +if [ $PLATFORM == "Windows" ]; then + echo $INFO "copy dynamic libraries" + cp -u setup/dynamic_libraries/windows/Debug/* bin/Debug + cp -u setup/dynamic_libraries/windows/Release/* bin/Release +fi + +# Setup both Debug and Release configuration +if [ $PLATFORM == "Linux" ] || [ $PLATFORM == "MacOS" ]; then + mkdir -p build/Debug + mkdir -p build/Release + + echo $INFO "run cmake with Debug configuration" + cd build/Debug && cmake -DCMAKE_BUILD_TYPE="Debug" ../.. + + echo $INFO "run cmake with Release configuration" + cd ../Release && cmake -DCMAKE_BUILD_TYPE="Release" ../.. +fi + +echo $SUCCESS "setup complete" diff --git a/setup/dynamic_libraries/windows/Debug/Qt5Cored.dll b/setup/dynamic_libraries/windows/Debug/Qt5Cored.dll new file mode 100644 index 00000000..94d35e9a Binary files /dev/null and b/setup/dynamic_libraries/windows/Debug/Qt5Cored.dll differ diff --git a/setup/dynamic_libraries/windows/Debug/Qt5Guid.dll b/setup/dynamic_libraries/windows/Debug/Qt5Guid.dll new file mode 100644 index 00000000..5d4f2db1 Binary files /dev/null and b/setup/dynamic_libraries/windows/Debug/Qt5Guid.dll differ diff --git a/setup/dynamic_libraries/windows/Debug/Qt5Widgetsd.dll b/setup/dynamic_libraries/windows/Debug/Qt5Widgetsd.dll new file mode 100644 index 00000000..cbb3d5d4 Binary files /dev/null and b/setup/dynamic_libraries/windows/Debug/Qt5Widgetsd.dll differ diff --git a/setup/dynamic_libraries/windows/Debug/icudt51.dll b/setup/dynamic_libraries/windows/Debug/icudt51.dll new file mode 100644 index 00000000..756ce1ae Binary files /dev/null and b/setup/dynamic_libraries/windows/Debug/icudt51.dll differ diff --git a/setup/dynamic_libraries/windows/Debug/icuin51.dll b/setup/dynamic_libraries/windows/Debug/icuin51.dll new file mode 100644 index 00000000..403c1a5d Binary files /dev/null and b/setup/dynamic_libraries/windows/Debug/icuin51.dll differ diff --git a/setup/dynamic_libraries/windows/Debug/icuuc51.dll b/setup/dynamic_libraries/windows/Debug/icuuc51.dll new file mode 100644 index 00000000..48d6c281 Binary files /dev/null and b/setup/dynamic_libraries/windows/Debug/icuuc51.dll differ diff --git a/setup/dynamic_libraries/windows/Debug/libEGLd.dll b/setup/dynamic_libraries/windows/Debug/libEGLd.dll new file mode 100644 index 00000000..72e3e60c Binary files /dev/null and b/setup/dynamic_libraries/windows/Debug/libEGLd.dll differ diff --git a/setup/dynamic_libraries/windows/Debug/libGLESv2d.dll b/setup/dynamic_libraries/windows/Debug/libGLESv2d.dll new file mode 100644 index 00000000..1f15927d Binary files /dev/null and b/setup/dynamic_libraries/windows/Debug/libGLESv2d.dll differ diff --git a/setup/dynamic_libraries/windows/Release/Qt5Core.dll b/setup/dynamic_libraries/windows/Release/Qt5Core.dll new file mode 100644 index 00000000..4fe842d4 Binary files /dev/null and b/setup/dynamic_libraries/windows/Release/Qt5Core.dll differ diff --git a/setup/dynamic_libraries/windows/Release/Qt5Gui.dll b/setup/dynamic_libraries/windows/Release/Qt5Gui.dll new file mode 100644 index 00000000..29bb452d Binary files /dev/null and b/setup/dynamic_libraries/windows/Release/Qt5Gui.dll differ diff --git a/setup/dynamic_libraries/windows/Release/Qt5Widgets.dll b/setup/dynamic_libraries/windows/Release/Qt5Widgets.dll new file mode 100644 index 00000000..42563618 Binary files /dev/null and b/setup/dynamic_libraries/windows/Release/Qt5Widgets.dll differ diff --git a/setup/dynamic_libraries/windows/Release/icudt51.dll b/setup/dynamic_libraries/windows/Release/icudt51.dll new file mode 100644 index 00000000..756ce1ae Binary files /dev/null and b/setup/dynamic_libraries/windows/Release/icudt51.dll differ diff --git a/setup/dynamic_libraries/windows/Release/icuin51.dll b/setup/dynamic_libraries/windows/Release/icuin51.dll new file mode 100644 index 00000000..403c1a5d Binary files /dev/null and b/setup/dynamic_libraries/windows/Release/icuin51.dll differ diff --git a/setup/dynamic_libraries/windows/Release/icuuc51.dll b/setup/dynamic_libraries/windows/Release/icuuc51.dll new file mode 100644 index 00000000..48d6c281 Binary files /dev/null and b/setup/dynamic_libraries/windows/Release/icuuc51.dll differ diff --git a/setup/dynamic_libraries/windows/Release/libEGL.dll b/setup/dynamic_libraries/windows/Release/libEGL.dll new file mode 100644 index 00000000..af72f2cf Binary files /dev/null and b/setup/dynamic_libraries/windows/Release/libEGL.dll differ diff --git a/setup/dynamic_libraries/windows/Release/libGLESv2.dll b/setup/dynamic_libraries/windows/Release/libGLESv2.dll new file mode 100644 index 00000000..4c933636 Binary files /dev/null and b/setup/dynamic_libraries/windows/Release/libGLESv2.dll differ diff --git a/src/app/CMakeLists.txt b/src/app/CMakeLists.txt new file mode 100644 index 00000000..8262d281 --- /dev/null +++ b/src/app/CMakeLists.txt @@ -0,0 +1,4 @@ +add_files( + APP_FILES + main.cpp +) diff --git a/src/app/main.cpp b/src/app/main.cpp new file mode 100644 index 00000000..d4c5efd4 --- /dev/null +++ b/src/app/main.cpp @@ -0,0 +1,16 @@ +#include +#include + +#include "utility.h" + +int main(int argv, char **args) +{ + hello(); + + QApplication app(argv, args); + + QTextEdit textEdit; + textEdit.show(); + + return app.exec(); +} \ No newline at end of file diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt new file mode 100644 index 00000000..a3497391 --- /dev/null +++ b/src/lib/CMakeLists.txt @@ -0,0 +1,5 @@ +add_files( + LIB_FILES + utility.h + utility.cpp +) diff --git a/src/lib/utility.cpp b/src/lib/utility.cpp new file mode 100644 index 00000000..86e3c891 --- /dev/null +++ b/src/lib/utility.cpp @@ -0,0 +1,13 @@ +#include "utility.h" + +#include + +void hello() +{ + std::cout << "hello world!" << std::endl; +} + +int one() +{ + return 1; +} diff --git a/src/lib/utility.h b/src/lib/utility.h new file mode 100644 index 00000000..23f2eb8d --- /dev/null +++ b/src/lib/utility.h @@ -0,0 +1,3 @@ +void hello(); + +int one(); diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt new file mode 100644 index 00000000..e8e9a26a --- /dev/null +++ b/src/test/CMakeLists.txt @@ -0,0 +1,4 @@ +add_files( + TEST_FILES + UtilityTestSuite.h +) diff --git a/src/test/UtilityTestSuite.h b/src/test/UtilityTestSuite.h new file mode 100644 index 00000000..bdfbfaa1 --- /dev/null +++ b/src/test/UtilityTestSuite.h @@ -0,0 +1,12 @@ +#include + +#include "utility.h" + +class UtilityTestSuite: public CxxTest::TestSuite +{ +public: + void test_one_returns_the_number_one(void) + { + TS_ASSERT_EQUALS(one(), 1); + } +};