diff --git a/CMakeLists.txt b/CMakeLists.txt index 43041c6c4..c30ae0cdb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,6 +8,8 @@ project(obs-studio) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/") +include(ObsHelpers) + if(NOT _one_time_action_done) if(MSVC) file(GENERATE @@ -18,8 +20,6 @@ if(NOT _one_time_action_done) set(_one_time_action_done TRUE CACHE INTERNAL "") endif() -include(ObsHelpers) - if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE RelWithDebInfo) endif() @@ -52,19 +52,23 @@ if(APPLE) set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) endif() -add_subdirectory(deps) -add_subdirectory(libobs) +if(NOT INSTALLER_RUN) + add_subdirectory(deps) + add_subdirectory(libobs) -if(WIN32) - add_subdirectory(libobs-d3d11) - add_subdirectory(libobs-d3d9) + if(WIN32) + add_subdirectory(libobs-d3d11) + add_subdirectory(libobs-d3d9) + endif() + + add_subdirectory(libobs-opengl) + add_subdirectory(obs) + add_subdirectory(plugins) + add_subdirectory(test) +else() + obs_generate_multiarch_installer() endif() -add_subdirectory(libobs-opengl) -add_subdirectory(obs) -add_subdirectory(plugins) -add_subdirectory(test) - obs_install_additional() # CPack Configuration @@ -81,8 +85,17 @@ set(CPACK_PACKAGE_VERSION_MINOR "0") set(CPACK_PACKAGE_VERSION_PATCH "1") set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "OBS Studio - Multi-platform broadcasting software") -set(CPACK_PACKAGE_EXECUTABLES "obs;OBS Studio") -set(CPACK_CREATE_DESKTOP_LINKS "obs") +if(INSTALLER_RUN) + set(CPACK_PACKAGE_EXECUTABLES + "${OBS_EXECUTABLE32_DESTINATION}/obs" "OBS Studio (32bit)" + "${OBS_EXECUTABLE64_DESTINATION}/obs" "OBS Studio (64bit)") + set(CPACK_CREATE_DESKTOP_LINKS + "${OBS_EXECUTABLE32_DESTINATION}/obs" + "${OBS_EXECUTABLE64_DESTINATION}/obs") +else() + set(CPACK_PACKAGE_EXECUTABLES "${OBS_EXECUTABLE_DESTINATION}/obs;OBS Studio") + set(CPACK_CREATE_DESKTOP_LINKS "${OBS_EXECUTABLE_DESTINATION}/obs") +endif() set(CPACK_BUNDLE_NAME "OBS Studio") set(CPACK_BUNDLE_PLIST "${CMAKE_SOURCE_DIR}/cmake/osxbundle/Info.plist") @@ -93,7 +106,13 @@ set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON) set(CPACK_NSIS_EXECUTABLES_DIRECTORY ".") set(CPACK_NSIS_MODIFY_PATH ON) -if(CMAKE_SIZEOF_VOID_P EQUAL 8) +if(INSTALLER_RUN) + SET(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "OBSStudio") + SET(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES") +elseif(CMAKE_SIZEOF_VOID_P EQUAL 8) + if(WIN32) + set(CPACK_PACKAGE_NAME "OBS Studio (64bit)") + endif() SET(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "OBSStudio64") SET(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64") else() diff --git a/cmake/ALL_BUILD.vcxproj.user.in b/cmake/ALL_BUILD.vcxproj.user.in index b6358272b..152321459 100644 --- a/cmake/ALL_BUILD.vcxproj.user.in +++ b/cmake/ALL_BUILD.vcxproj.user.in @@ -1,43 +1,43 @@  - $(SolutionDir)rundir\$(Configuration)\obs.exe - $(SolutionDir)rundir\$(Configuration) + $(SolutionDir)rundir\$(Configuration)\bin\64bit\obs.exe + $(SolutionDir)rundir\$(Configuration)\bin\64bit WindowsLocalDebugger - $(SolutionDir)rundir\$(Configuration)\obs.exe - $(SolutionDir)rundir\$(Configuration) + $(SolutionDir)rundir\$(Configuration)\bin\64bit\obs.exe + $(SolutionDir)rundir\$(Configuration)\bin\64bit WindowsLocalDebugger - $(SolutionDir)rundir\$(Configuration)\obs.exe - $(SolutionDir)rundir\$(Configuration) + $(SolutionDir)rundir\$(Configuration)\bin\64bit\obs.exe + $(SolutionDir)rundir\$(Configuration)\bin\64bit WindowsLocalDebugger - $(SolutionDir)rundir\$(Configuration)\obs.exe - $(SolutionDir)rundir\$(Configuration) + $(SolutionDir)rundir\$(Configuration)\bin\64bit\obs.exe + $(SolutionDir)rundir\$(Configuration)\bin\64bit WindowsLocalDebugger - $(SolutionDir)rundir\$(Configuration)\obs.exe - $(SolutionDir)rundir\$(Configuration) + $(SolutionDir)rundir\$(Configuration)\bin\32bit\obs.exe + $(SolutionDir)rundir\$(Configuration)\bin\32bit WindowsLocalDebugger - $(SolutionDir)rundir\$(Configuration)\obs.exe - $(SolutionDir)rundir\$(Configuration) + $(SolutionDir)rundir\$(Configuration)\bin\32bit\obs.exe + $(SolutionDir)rundir\$(Configuration)\bin\32bit WindowsLocalDebugger - $(SolutionDir)rundir\$(Configuration)\obs.exe - $(SolutionDir)rundir\$(Configuration) + $(SolutionDir)rundir\$(Configuration)\bin\32bit\obs.exe + $(SolutionDir)rundir\$(Configuration)\bin\32bit WindowsLocalDebugger - $(SolutionDir)rundir\$(Configuration)\obs.exe - $(SolutionDir)rundir\$(Configuration) + $(SolutionDir)rundir\$(Configuration)\bin\32bit\obs.exe + $(SolutionDir)rundir\$(Configuration)\bin\32bit WindowsLocalDebugger \ No newline at end of file diff --git a/cmake/Modules/ObsHelpers.cmake b/cmake/Modules/ObsHelpers.cmake index a99fbfb3f..1b312ad65 100644 --- a/cmake/Modules/ObsHelpers.cmake +++ b/cmake/Modules/ObsHelpers.cmake @@ -1,28 +1,56 @@ set(OBS_OUTPUT_DIR "${CMAKE_BINARY_DIR}/rundir") -set(OBS_EXECUTABLE_DESTINATION "bin") -set(OBS_LIBRARY_DESTINATION "lib") -set(OBS_PLUGIN_DESTINATION "lib/obs-plugins") -set(OBS_DATA_DESTINATION "share/obs") - -if(WIN32 OR APPLE) - set(_struct_def FALSE) +if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(_lib_suffix 64) else() - set(_struct_def TRUE) + set(_lib_suffix 32) endif() +if(WIN32 OR APPLE) + set(_struct_def FALSE) +else() + set(_struct_def TRUE) +endif() + +option(INSTALLER_RUN "Build a multiarch installer, needs to run indenepdently after both archs have compiled" FALSE) option(UNIX_STRUCTURE "Build with standard unix filesystem structure" ${_struct_def}) +if(INSTALLER_RUN AND NOT DEFINED ENV{obsInstallerTempDir}) + message(FATAL_ERROR "Environment variable obsInstallerTempDir is needed for multiarch installer generation") +endif() + if(NOT UNIX_STRUCTURE) - set(OBS_EXECUTABLE_DESTINATION ".") - set(OBS_LIBRARY_DESTINATION ".") - set(OBS_PLUGIN_DESTINATION "obs-plugins") + set(OBS_EXECUTABLE_DESTINATION "bin/${_lib_suffix}bit") + set(OBS_EXECUTABLE32_DESTINATION "bin/32bit") + set(OBS_EXECUTABLE64_DESTINATION "bin/64bit") + set(OBS_LIBRARY_DESTINATION "bin/${_lib_suffix}bit") + set(OBS_LIBRARY32_DESTINATION "lib32") + set(OBS_LIBRARY64_DESTINATION "lib64") + set(OBS_PLUGIN_DESTINATION "obs-plugins/${_lib_suffix}bit") + set(OBS_PLUGIN32_DESTINATION "obs-plugins/32bit") + set(OBS_PLUGIN64_DESTINATION "obs-plugins/64bit") set(OBS_DATA_DESTINATION "data") + add_definitions(-DOBS_DATA_PATH="../../${OBS_DATA_DESTINATION}") else() + set(OBS_EXECUTABLE_DESTINATION "bin") + set(OBS_EXECUTABLE32_DESTINATION "bin32") + set(OBS_EXECUTABLE64_DESTINATION "bin64") + set(OBS_LIBRARY_DESTINATION "lib") + set(OBS_LIBRARY32_DESTINATION "lib32") + set(OBS_LIBRARY64_DESTINATION "lib64") + set(OBS_PLUGIN_DESTINATION "lib/obs-plugins") + set(OBS_PLUGIN32_DESTINATION "lib32/obs-plugins") + set(OBS_PLUGIN64_DESTINATION "lib64/obs-plugins") + set(OBS_DATA_DESTINATION "share/obs") + add_definitions(-DOBS_DATA_PATH="${OBS_DATA_DESTINATION}") add_definitions(-DOBS_INSTALL_PREFIX="${CMAKE_INSTALL_PREFIX}/") endif() -add_definitions(-DOBS_DATA_PATH="${OBS_DATA_DESTINATION}") +function(obs_generate_multiarch_installer) + install(DIRECTORY "$ENV{obsInstallerTempDir}/" + DESTINATION "." + USE_SOURCE_PERMISSIONS) +endfunction() function(obs_install_additional) set(addfdir "${CMAKE_SOURCE_DIR}/additional_install_files") @@ -38,36 +66,94 @@ function(obs_install_additional) install(DIRECTORY "${addfdir}/misc/" DESTINATION "." - USE_SOURCE_PERMISSIONS) + USE_SOURCE_PERMISSIONS + PATTERN ".gitignore" EXCLUDE) install(DIRECTORY "${addfdir}/data/" DESTINATION "${OBS_DATA_DESTINATION}" - USE_SOURCE_PERMISSIONS) - install(DIRECTORY "${addfdir}/libs${_lib_suffix}/" - DESTINATION "${OBS_LIBRARY_DESTINATION}" - USE_SOURCE_PERMISSIONS) - install(DIRECTORY "${addfdir}/exec${_lib_suffix}/" - DESTINATION "${OBS_EXECUTABLE_DESTINATION}" - USE_SOURCE_PERMISSIONS) + USE_SOURCE_PERMISSIONS + PATTERN ".gitignore" EXCLUDE) + + if(INSTALLER_RUN) + install(DIRECTORY "${addfdir}/libs32/" + DESTINATION "${OBS_LIBRARY32_DESTINATION}" + USE_SOURCE_PERMISSIONS + PATTERN ".gitignore" EXCLUDE) + install(DIRECTORY "${addfdir}/exec32/" + DESTINATION "${OBS_EXECUTABLE32_DESTINATION}" + USE_SOURCE_PERMISSIONS + PATTERN ".gitignore" EXCLUDE) + install(DIRECTORY "${addfdir}/libs64/" + DESTINATION "${OBS_LIBRARY64_DESTINATION}" + USE_SOURCE_PERMISSIONS + PATTERN ".gitignore" EXCLUDE) + install(DIRECTORY "${addfdir}/exec64/" + DESTINATION "${OBS_EXECUTABLE64_DESTINATION}" + USE_SOURCE_PERMISSIONS + PATTERN ".gitignore" EXCLUDE) + else() + install(DIRECTORY "${addfdir}/libs${_lib_suffix}/" + DESTINATION "${OBS_LIBRARY_DESTINATION}" + USE_SOURCE_PERMISSIONS + PATTERN ".gitignore" EXCLUDE) + install(DIRECTORY "${addfdir}/exec${_lib_suffix}/" + DESTINATION "${OBS_EXECUTABLE_DESTINATION}" + USE_SOURCE_PERMISSIONS + PATTERN ".gitignore" EXCLUDE) + endif() endfunction() macro(install_obs_core target) + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(_lib_suffix 64) + else() + set(_lib_suffix 32) + endif() + install(TARGETS ${target} LIBRARY DESTINATION "${OBS_LIBRARY_DESTINATION}" RUNTIME DESTINATION "${OBS_EXECUTABLE_DESTINATION}") add_custom_command(TARGET ${target} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy - "$" "${OBS_OUTPUT_DIR}/$/$" + COMMAND "${CMAKE_COMMAND}" -E copy + "$" "${OBS_OUTPUT_DIR}/$/bin/${_lib_suffix}bit/$" VERBATIM) + + if(DEFINED ENV{obsInstallerTempDir}) + get_property(target_type TARGET ${target} PROPERTY TYPE) + + if("${target_type}" STREQUAL "EXECUTABLE") + set(tmp_target_dir "${OBS_EXECUTABLE_DESTINATION}") + else() + set(tmp_target_dir "${OBS_LIBRARY_DESTINATION}") + endif() + + add_custom_command(TARGET ${target} POST_BUILD + COMMAND "${CMAKE_COMMAND}" -E copy + "$" "$ENV{obsInstallerTempDir}/${tmp_target_dir}/$" + VERBATIM) + endif() endmacro() macro(install_obs_plugin target) + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(_lib_suffix 64) + else() + set(_lib_suffix 32) + endif() + install(TARGETS ${target} LIBRARY DESTINATION "${OBS_PLUGIN_DESTINATION}" RUNTIME DESTINATION "${OBS_PLUGIN_DESTINATION}") add_custom_command(TARGET ${target} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy - "$" "${OBS_OUTPUT_DIR}/$/obs-plugins/$" + COMMAND "${CMAKE_COMMAND}" -E copy + "$" "${OBS_OUTPUT_DIR}/$/obs-plugins/${_lib_suffix}bit/$" VERBATIM) + + if(DEFINED ENV{obsInstallerTempDir}) + add_custom_command(TARGET ${target} POST_BUILD + COMMAND "${CMAKE_COMMAND}" -E copy + "$" "$ENV{obsInstallerTempDir}/${OBS_PLUGIN_DESTINATION}/$" + VERBATIM) + endif() endmacro() macro(install_obs_data target datadir datadest) @@ -75,9 +161,16 @@ macro(install_obs_data target datadir datadest) DESTINATION "${OBS_DATA_DESTINATION}/${datadest}" USE_SOURCE_PERMISSIONS) add_custom_command(TARGET ${target} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_directory + COMMAND "${CMAKE_COMMAND}" -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/${datadir}" "${OBS_OUTPUT_DIR}/$/data/${datadest}" VERBATIM) + + if(CMAKE_SIZEOF_VOID_P EQUAL 8 AND DEFINED ENV{obsInstallerTempDir}) + add_custom_command(TARGET ${target} POST_BUILD + COMMAND "${CMAKE_COMMAND}" -E copy_directory + "${CMAKE_CURRENT_SOURCE_DIR}/${datadir}" "$ENV{obsInstallerTempDir}/${OBS_DATA_DESTINATION}/${datadest}" + VERBATIM) + endif() endmacro() macro(install_obs_plugin_data target datadir) diff --git a/libobs/obs-cocoa.c b/libobs/obs-cocoa.c index 062834ece..4a84fb96d 100644 --- a/libobs/obs-cocoa.c +++ b/libobs/obs-cocoa.c @@ -25,7 +25,9 @@ // support both foo.so and libfoo.so for now static const char *plugin_patterns[] = { OBS_INSTALL_PREFIX "obs-plugins/%s.so", - OBS_INSTALL_PREFIX "obs-plugins/lib%s.so" + OBS_INSTALL_PREFIX "obs-plugins/lib%s.so", + "../../obs-plugins/64bit/%s.so", + "../../obs-plugins/64bit/lib%s.so" }; static const int plugin_patterns_size = diff --git a/libobs/obs-nix.c b/libobs/obs-nix.c index 1f89fa869..c6927e323 100644 --- a/libobs/obs-nix.c +++ b/libobs/obs-nix.c @@ -28,7 +28,7 @@ static inline bool check_path(const char* data, const char *path, dstr_copy(output, path); dstr_cat(output, data); - blog(LOG_INFO, "Attempting path: %s\n", output->array); + blog(LOG_INFO, "Attempting path: %s\n", output->array); return access(output->array, R_OK) == 0; } @@ -39,8 +39,8 @@ static inline bool check_lib_path(const char* data, const char *path, bool result = false; struct dstr tmp; - dstr_init_copy(&tmp, "lib"); - dstr_cat(&tmp, data); + dstr_init_copy(&tmp, "lib"); + dstr_cat(&tmp, data); dstr_cat(&tmp, ".so"); result = check_path(tmp.array, path, output); @@ -58,12 +58,18 @@ char *find_plugin(const char *plugin) struct dstr output; dstr_init(&output); - if (check_lib_path(plugin, "obs-plugins/", &output)) - return output.array; + if(sizeof(void*) == 4) + { + if (check_lib_path(plugin, "../../obs-plugins/32bit/", &output)) + return output.array; + } - if (check_lib_path(plugin, OBS_INSTALL_PREFIX "lib/obs-plugins/", - &output)) - return output.array; + if (OBS_INSTALL_PREFIX [0] != 0) + { + if (check_lib_path(plugin, OBS_INSTALL_PREFIX "lib/obs-plugins/", + &output)) + return output.array; + } dstr_free(&output); return NULL; @@ -81,9 +87,12 @@ char *find_libobs_data_file(const char *file) if (check_path(file, OBS_DATA_PATH "/libobs/", &output)) return output.array; - if (check_path(file, OBS_INSTALL_PREFIX OBS_DATA_PATH "/libobs/", - &output)) - return output.array; + if (OBS_INSTALL_PREFIX [0] != 0) + { + if (check_path(file, OBS_INSTALL_PREFIX OBS_DATA_PATH "/libobs/", + &output)) + return output.array; + } dstr_free(&output); return NULL; @@ -95,16 +104,19 @@ char *find_libobs_data_file(const char *file) */ char *obs_find_plugin_file(const char *file) { - struct dstr output; - dstr_init(&output); + struct dstr output; + dstr_init(&output); - if (check_path(file, OBS_DATA_PATH "/obs-plugins/", &output)) - return output.array; + if (check_path(file, OBS_DATA_PATH "/obs-plugins/", &output)) + return output.array; - if (check_path(file, OBS_INSTALL_PREFIX OBS_DATA_PATH "/obs-plugins/", - &output)) - return output.array; + if (OBS_INSTALL_PREFIX [0] != 0) + { + if (check_path(file, OBS_INSTALL_PREFIX OBS_DATA_PATH "/obs-plugins/", + &output)) + return output.array; + } - dstr_free(&output); - return NULL; + dstr_free(&output); + return NULL; } diff --git a/libobs/obs-windows.c b/libobs/obs-windows.c index 286aeed25..a428752cc 100644 --- a/libobs/obs-windows.c +++ b/libobs/obs-windows.c @@ -24,7 +24,11 @@ char *find_plugin(const char *plugin) { struct dstr path; - dstr_init_copy(&path, OBS_INSTALL_PREFIX "obs-plugins/"); +#ifdef _WIN64 + dstr_init_copy(&path, "../../obs-plugins/64bit/"); +#else + dstr_init_copy(&path, "../../obs-plugins/32bit/"); +#endif dstr_cat(&path, plugin); return path.array; } @@ -33,7 +37,7 @@ char *find_plugin(const char *plugin) char *find_libobs_data_file(const char *file) { struct dstr path; - dstr_init_copy(&path, OBS_INSTALL_PREFIX OBS_DATA_PATH "/libobs/"); + dstr_init_copy(&path, "../../data/libobs/"); dstr_cat(&path, file); return path.array; } @@ -42,7 +46,7 @@ char *find_libobs_data_file(const char *file) char *obs_find_plugin_file(const char *file) { struct dstr path; - dstr_init_copy(&path, OBS_INSTALL_PREFIX OBS_DATA_PATH "/obs-plugins/"); + dstr_init_copy(&path, "../../data/obs-plugins/"); dstr_cat(&path, file); return path.array; } diff --git a/libobs/util/c99defs.h b/libobs/util/c99defs.h index 373325c08..c68a7c831 100644 --- a/libobs/util/c99defs.h +++ b/libobs/util/c99defs.h @@ -69,7 +69,7 @@ typedef int64_t off64_t; #endif /* _MSC_VER */ #ifndef OBS_DATA_PATH -#define OBS_DATA_PATH "data" +#define OBS_DATA_PATH "../../data" #endif #ifndef OBS_INSTALL_PREFIX diff --git a/obs/platform-x11.cpp b/obs/platform-x11.cpp index c86299907..86c2551a6 100644 --- a/obs/platform-x11.cpp +++ b/obs/platform-x11.cpp @@ -40,7 +40,7 @@ static inline bool check_path(const char* data, const char *path, return (access(output.c_str(), R_OK) == 0); } -#define INSTALL_DATA_PATH OBS_INSTALL_PREFIX "/" OBS_DATA_PATH "/obs-studio/" +#define INSTALL_DATA_PATH OBS_INSTALL_PREFIX OBS_DATA_PATH "/obs-studio/" bool GetDataFilePath(const char *data, string &output) {