Implement packaging for windows

This commit is contained in:
Nikita Lisitsa 2020-09-19 11:51:51 +03:00
parent d3fb1a5b12
commit ae282d796c
7 changed files with 125 additions and 69 deletions

View file

@ -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)

View file

@ -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)

100
package/CMakeLists.txt Normal file
View file

@ -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} $<TARGET_FILE:${target}>
COMMAND chrpath -r . $<TARGET_FILE:${target}>
COMMAND zip ${CMAKE_CURRENT_SOURCE_DIR}/${target}-${PSEMEK_PACKAGE_SUFFIX}.zip -j $<TARGET_FILE:${target}> ${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} $<TARGET_FILE:${target}>
)
if(UNIX AND (NOT APPLE))
add_custom_command(TARGET ${target} POST_BUILD
COMMAND chrpath -r . $<TARGET_FILE:${target}>
)
endif()
add_custom_command(TARGET ${target} POST_BUILD
COMMAND zip ${CMAKE_CURRENT_SOURCE_DIR}/${target}-${PSEMEK_PACKAGE_SUFFIX}.zip -j $<TARGET_FILE:${target}> ${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()

View file

@ -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

12
package/bin/psemek-package-win Executable file
View file

@ -0,0 +1,12 @@
#!/usr/bin/env bash
if [ "$#" -ne 1 ]; then
echo "Usage: psemek-package-win <project-dir>"
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

View file

@ -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} $<TARGET_FILE:${target}>
COMMAND chrpath -r . $<TARGET_FILE:${target}>
COMMAND zip ${CMAKE_CURRENT_SOURCE_DIR}/${target}-${PSEMEK_PACKAGE_SUFFIX}.zip -j $<TARGET_FILE:${target}> ${PSEMEK_COPY_FILES}
)
endif()
endfunction()

View file

@ -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}")