From ae282d796cb4f1cfb37747e216b7c500d48e3745 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Sat, 19 Sep 2020 11:51:51 +0300 Subject: [PATCH] Implement packaging for windows --- CMakeLists.txt | 1 + libs/gfx/source/gl.cpp | 6 +- package/CMakeLists.txt | 100 ++++++++++++++++++ .../bin/psemek-package-linux | 2 +- package/bin/psemek-package-win | 12 +++ tools/package/CMakeLists.txt | 62 ----------- tools/resource/CMakeLists.txt | 11 +- 7 files changed, 125 insertions(+), 69 deletions(-) create mode 100644 package/CMakeLists.txt rename {tools/package => package}/bin/psemek-package-linux (61%) create mode 100755 package/bin/psemek-package-win delete mode 100644 tools/package/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 90218e7a..ff1b5340 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,6 +16,7 @@ if((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") OR (CMAKE_CXX_COMPILER_ID STREQUAL "Cl list(APPEND PSEMEK_CXX_FLAGS -Wall -Werror -Wextra -pedantic) endif() +add_subdirectory(package) add_subdirectory(tools) add_subdirectory(libs) diff --git a/libs/gfx/source/gl.cpp b/libs/gfx/source/gl.cpp index 47cbb9c5..7d6bb2b3 100644 --- a/libs/gfx/source/gl.cpp +++ b/libs/gfx/source/gl.cpp @@ -59,16 +59,16 @@ static int TestPointer(const PROC pTest) return 1; } -static PROC WinGetProcAddress(const char *name) +static void *WinGetProcAddress(const char *name) { HMODULE glMod = NULL; PROC pFunc = wglGetProcAddress((LPCSTR)name); if(TestPointer(pFunc)) { - return pFunc; + return (void*)pFunc; } glMod = GetModuleHandleA("OpenGL32.dll"); - return (PROC)GetProcAddress(glMod, (LPCSTR)name); + return (void*)GetProcAddress(glMod, (LPCSTR)name); } #define IntGetProcAddress(name) WinGetProcAddress(name) diff --git a/package/CMakeLists.txt b/package/CMakeLists.txt new file mode 100644 index 00000000..5f0c6d14 --- /dev/null +++ b/package/CMakeLists.txt @@ -0,0 +1,100 @@ +option(PSEMEK_PACKAGE_MODE "Enable packaging mode" OFF) + +if(PSEMEK_PACKAGE_MODE) + if(WIN32) + set(PSEMEK_PACKAGE_SUFFIX_RAW win) + elseif(UNIX AND (NOT APPLE)) + set(PSEMEK_PACKAGE_SUFFIX_RAW linux) + elseif(UNIX AND APPLE) + set(PSEMEK_PACKAGE_SUFFIX_RAW mac) + else() + message(FATAL "Uknown system for packaging") + endif() + set(PSEMEK_PACKAGE_SUFFIX ${PSEMEK_PACKAGE_SUFFIX_RAW} CACHE INTERNAL "Packaging suffix" FORCE) + + set(PSEMEK_PACKAGE_LINK_FLAGS_RAW) + if((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") OR (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")) + list(APPEND PSEMEK_PACKAGE_LINK_FLAGS_RAW "-static-libgcc" "-static-libstdc++") + endif() + set(PSEMEK_PACKAGE_LINK_FLAGS ${PSEMEK_PACKAGE_LINK_FLAGS_RAW} CACHE INTERNAL "Packaging CXX flags" FORCE) + + set(PSEMEK_COPY_FILES_RAW) +endif() + +function(psemek_add_executable_impl target build link_psemek package) + if(${build}) + add_executable(${target} ${ARGN}) + + if(${link_psemek}) + target_link_libraries(${target} PUBLIC psemek) + endif() + + if(${package}) + target_link_options(${target} PUBLIC ${PSEMEK_PACKAGE_LINK_FLAGS}) + + set_target_properties(${target} PROPERTIES + BUILD_RPATH "." + ) + + add_custom_command(TARGET ${target} POST_BUILD + COMMAND ${CMAKE_STRIP} $ + COMMAND chrpath -r . $ + COMMAND zip ${CMAKE_CURRENT_SOURCE_DIR}/${target}-${PSEMEK_PACKAGE_SUFFIX}.zip -j $ ${PSEMEK_PACKAGE_COPY_FILES} + ) + endif() + endif() +endfunction() + +function(psemek_add_executable target) + if((NOT PSEMEK_PACKAGE_MODE) OR PSEMEK_PACKAGE_TARGET) + add_executable(${target} ${ARGN}) + + target_link_libraries(${target} PUBLIC psemek) + + if(PSEMEK_PACKAGE_MODE) + target_link_options(${target} PUBLIC ${PSEMEK_PACKAGE_LINK_FLAGS}) + + if(UNIX AND (NOT APPLE)) + set_target_properties(${target} PROPERTIES + BUILD_RPATH "." + ) + endif() + + add_custom_command(TARGET ${target} POST_BUILD + COMMAND ${CMAKE_STRIP} $ + ) + + if(UNIX AND (NOT APPLE)) + add_custom_command(TARGET ${target} POST_BUILD + COMMAND chrpath -r . $ + ) + endif() + + add_custom_command(TARGET ${target} POST_BUILD + COMMAND zip ${CMAKE_CURRENT_SOURCE_DIR}/${target}-${PSEMEK_PACKAGE_SUFFIX}.zip -j $ ${PSEMEK_PACKAGE_COPY_FILES} + ) + endif() + endif() +endfunction() + +function(psemek_add_build_tool target link_psemek) + if((NOT PSEMEK_PACKAGE_MODE) OR PSEMEK_PACKAGE_HOST) + add_executable(${target} ${ARGN}) + + if(${link_psemek}) + target_link_libraries(${target} PUBLIC psemek) + endif() + + if(PSEMEK_PACKAGE_MODE) + install(TARGETS ${target} RUNTIME DESTINATION bin) + endif() + else() + find_file(_LOCATION ${target} PATHS "${PSEMEK_PACKAGE_TOOLS_PATH}/bin") + message(STATUS "Found ${target}: ${_LOCATION}") + if(NOT _LOCATION) + message(FATAL "Could not locate ${target} build tool in ${PSEMEK_PACKAGE_TOOLS_PATH}") + endif() + add_executable(${target} IMPORTED GLOBAL) + set_target_properties(${target} PROPERTIES IMPORTED_LOCATION ${_LOCATION}) + endif() +endfunction() diff --git a/tools/package/bin/psemek-package-linux b/package/bin/psemek-package-linux similarity index 61% rename from tools/package/bin/psemek-package-linux rename to package/bin/psemek-package-linux index aa766bbd..257b1adf 100755 --- a/tools/package/bin/psemek-package-linux +++ b/package/bin/psemek-package-linux @@ -7,6 +7,6 @@ fi PROJECT_DIR=`realpath "${1}"` -docker run -u 1000 -v "${PROJECT_DIR}":/home/work-source psemek:package-linux /home/package.sh +docker run -u 1000 -v "${PROJECT_DIR}":/home/work-source lisyarus/psemek:package-linux /home/package.sh echo Packaging finished diff --git a/package/bin/psemek-package-win b/package/bin/psemek-package-win new file mode 100755 index 00000000..9b77820a --- /dev/null +++ b/package/bin/psemek-package-win @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +if [ "$#" -ne 1 ]; then + echo "Usage: psemek-package-win " + exit 0 +fi + +PROJECT_DIR=`realpath "${1}"` + +docker run -u 1000 -v "${PROJECT_DIR}":/home/work-source lisyarus/psemek:package-win /home/package.sh + +echo Packaging finished diff --git a/tools/package/CMakeLists.txt b/tools/package/CMakeLists.txt deleted file mode 100644 index 07afcb42..00000000 --- a/tools/package/CMakeLists.txt +++ /dev/null @@ -1,62 +0,0 @@ -option(PSEMEK_PACKAGE_MODE "Enable packaging mode" OFF) -set(PSEMEK_PACKAGE_ROOT "" CACHE PATH "Packaging environment root") - -if(PSEMEK_PACKAGE_MODE) - - if(WIN32) - set(PSEMEK_PACKAGE_SUFFIX_RAW win) - elseif(UNIX AND (NOT APPLE)) - set(PSEMEK_PACKAGE_SUFFIX_RAW linux) - elseif(UNIX AND APPLE) - set(PSEMEK_PACKAGE_SUFFIX_RAW mac) - else() - message(FATAL "Uknown system for packaging") - endif() - set(PSEMEK_PACKAGE_SUFFIX ${PSEMEK_PACKAGE_SUFFIX_RAW} CACHE INTERNAL "Packaging suffix" FORCE) - - set(PSEMEK_PACKAGE_LINK_FLAGS_RAW) - if((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") OR (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")) - list(APPEND PSEMEK_PACKAGE_LINK_FLAGS_RAW "-static-libgcc" "-static-libstdc++") - endif() - set(PSEMEK_PACKAGE_LINK_FLAGS ${PSEMEK_PACKAGE_LINK_FLAGS_RAW} CACHE INTERNAL "Packaging CXX flags" FORCE) - - set(PSEMEK_COPY_FILES_RAW) - - # SDL2 - find_package(SDL2 REQUIRED) - list(LENGTH SDL2_LIBRARIES SDL2_LIBRARIES_COUNT) - if(NOT (SDL2_LIBRARIES_COUNT EQUAL 1)) - message(FATAL "SDL2_LIBRARIES contains more than 1 entry: ${SDL2_LIBRARIES}") - message(FATAL "Aborting packaging") - endif() - list(APPEND PSEMEK_COPY_FILES_RAW ${SDL2_LIBRARIES}) - - set(PSEMEK_COPY_FILES_DIR "${CMAKE_CURRENT_BINARY_DIR}/copy_files") - set(PSEMEK_COPY_FILES_ABSOLUTE) - foreach(FILE ${PSEMEK_COPY_FILES_RAW}) - get_filename_component(REALPATH "${FILE}" REALPATH) - get_filename_component(NAME "${REALPATH}" NAME) - configure_file("${REALPATH}" "${PSEMEK_COPY_FILES_DIR}/${NAME}" COPYONLY) - list(APPEND PSEMEK_COPY_FILES_ABSOLUTE "${PSEMEK_COPY_FILES_DIR}/${NAME}") - endforeach() - set(PSEMEK_COPY_FILES ${PSEMEK_COPY_FILES_ABSOLUTE} CACHE INTERNAL "List of external files to copy into the package" FORCE) - -endif() - -function(psemek_package_target target) - if(PSEMEK_PACKAGE_MODE) - - target_link_options(${target} PUBLIC ${PSEMEK_PACKAGE_LINK_FLAGS}) - - set_target_properties(${target} PROPERTIES - BUILD_RPATH "." - ) - - add_custom_command(TARGET ${target} POST_BUILD - COMMAND ${CMAKE_STRIP} $ - COMMAND chrpath -r . $ - COMMAND zip ${CMAKE_CURRENT_SOURCE_DIR}/${target}-${PSEMEK_PACKAGE_SUFFIX}.zip -j $ ${PSEMEK_COPY_FILES} - ) - - endif() -endfunction() diff --git a/tools/resource/CMakeLists.txt b/tools/resource/CMakeLists.txt index 1eab7bcf..c0a147d7 100644 --- a/tools/resource/CMakeLists.txt +++ b/tools/resource/CMakeLists.txt @@ -1,4 +1,4 @@ -add_executable(resource-compiler compiler.cpp) +psemek_add_build_tool(psemek-resource-compiler FALSE compiler.cpp) function(psemek_add_resources TARGET) get_target_property(OUT_DIR ${TARGET} BINARY_DIR) @@ -19,9 +19,14 @@ function(psemek_add_resources TARGET) set(OUT_HEADER "${OUT_DIR}/resource/include/${NAME}.hpp") set(OUT_SOURCE "${OUT_DIR}/resource/source/${NAME}.cpp") + set(_DEPEND_TARGET psemek-resource-compiler) + if(PSEMEK_PACKAGE_MODE AND (NOT PSEMEK_PACKAGE_HOST)) + set(_DEPEND_TARGET) + endif() + add_custom_command(OUTPUT "${OUT_HEADER}" "${OUT_SOURCE}" - COMMAND resource-compiler "${FILE}" ${NAME} "${OUT_HEADER}" "${OUT_SOURCE}" - DEPENDS resource-compiler "${FILE}" + COMMAND psemek-resource-compiler "${FILE}" ${NAME} "${OUT_HEADER}" "${OUT_SOURCE}" + DEPENDS psemek-resource-compiler "${FILE}" WORKING_DIRECTORY "${INPUT_DIR}") target_sources(${TARGET} PRIVATE "${OUT_HEADER}" "${OUT_SOURCE}")