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