mirror of
https://github.com/atom/atom.git
synced 2026-04-28 03:01:47 -04:00
Stripped-down standalone build that runs w/ normal GYP
This commit is contained in:
@@ -1,10 +0,0 @@
|
||||
#include <stdio.h>
|
||||
|
||||
#ifdef _WIN32
|
||||
__declspec(dllexport)
|
||||
#endif
|
||||
void module_main(void)
|
||||
{
|
||||
fprintf(stdout, "Hello from lib1.c\n");
|
||||
fflush(stdout);
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
#include <stdio.h>
|
||||
|
||||
#ifdef _WIN32
|
||||
__declspec(dllexport)
|
||||
#endif
|
||||
void module_main(void)
|
||||
{
|
||||
fprintf(stdout, "Hello from lib2.c\n");
|
||||
fflush(stdout);
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
# Copyright (c) 2009 Google Inc. All rights reserved.
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
{
|
||||
'target_defaults': {
|
||||
'conditions': [
|
||||
['OS=="win"', {
|
||||
'defines': ['PLATFORM_WIN'],
|
||||
}],
|
||||
['OS=="mac"', {
|
||||
'defines': ['PLATFORM_MAC'],
|
||||
}],
|
||||
['OS=="linux"', {
|
||||
'defines': ['PLATFORM_LINUX'],
|
||||
# Support 64-bit shared libs (also works fine for 32-bit).
|
||||
'cflags': ['-fPIC'],
|
||||
'libraries': ['-ldl'],
|
||||
}],
|
||||
],
|
||||
},
|
||||
'targets': [
|
||||
{
|
||||
'target_name': 'program',
|
||||
'type': 'executable',
|
||||
'dependencies': [
|
||||
'lib1',
|
||||
'lib2',
|
||||
],
|
||||
'sources': [
|
||||
'program.c',
|
||||
],
|
||||
},
|
||||
{
|
||||
'target_name': 'lib1',
|
||||
'type': 'loadable_module',
|
||||
'product_name': 'lib1',
|
||||
'product_prefix': '',
|
||||
'xcode_settings': {'OTHER_LDFLAGS': ['-dynamiclib'], 'MACH_O_TYPE': ''},
|
||||
'sources': [
|
||||
'lib1.c',
|
||||
],
|
||||
},
|
||||
{
|
||||
'target_name': 'lib2',
|
||||
'product_name': 'lib2',
|
||||
'product_prefix': '',
|
||||
'type': 'loadable_module',
|
||||
'xcode_settings': {'OTHER_LDFLAGS': ['-dynamiclib'], 'MACH_O_TYPE': ''},
|
||||
'sources': [
|
||||
'lib2.c',
|
||||
],
|
||||
},
|
||||
],
|
||||
}
|
||||
@@ -1,111 +0,0 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#if defined(PLATFORM_WIN)
|
||||
#include <windows.h>
|
||||
#elif defined(PLATFORM_MAC) || defined(PLATFORM_LINUX)
|
||||
#include <dlfcn.h>
|
||||
#include <libgen.h>
|
||||
#include <string.h>
|
||||
#include <sys/param.h>
|
||||
#define MAX_PATH PATH_MAX
|
||||
#endif
|
||||
|
||||
#if defined(PLATFORM_WIN)
|
||||
#define MODULE_SUFFIX ".dll"
|
||||
#elif defined(PLATFORM_MAC)
|
||||
#define MODULE_SUFFIX ".so"
|
||||
#elif defined(PLATFORM_LINUX)
|
||||
#define MODULE_SUFFIX ".so"
|
||||
#endif
|
||||
|
||||
typedef void (*module_symbol)(void);
|
||||
char bin_path[MAX_PATH + 1];
|
||||
|
||||
|
||||
void CallModule(const char* module) {
|
||||
char module_path[MAX_PATH + 1];
|
||||
const char* module_function = "module_main";
|
||||
module_symbol funcptr;
|
||||
#if defined(PLATFORM_WIN)
|
||||
HMODULE dl;
|
||||
char drive[_MAX_DRIVE];
|
||||
char dir[_MAX_DIR];
|
||||
|
||||
if (_splitpath_s(bin_path, drive, _MAX_DRIVE, dir, _MAX_DIR,
|
||||
NULL, 0, NULL, 0)) {
|
||||
fprintf(stderr, "Failed to split executable path.\n");
|
||||
return;
|
||||
}
|
||||
if (_makepath_s(module_path, MAX_PATH, drive, dir, module, MODULE_SUFFIX)) {
|
||||
fprintf(stderr, "Failed to calculate module path.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
dl = LoadLibrary(module_path);
|
||||
if (!dl) {
|
||||
fprintf(stderr, "Failed to open module: %s\n", module_path);
|
||||
return;
|
||||
}
|
||||
|
||||
funcptr = (module_symbol) GetProcAddress(dl, module_function);
|
||||
if (!funcptr) {
|
||||
fprintf(stderr, "Failed to find symbol: %s\n", module_function);
|
||||
return;
|
||||
}
|
||||
funcptr();
|
||||
|
||||
FreeLibrary(dl);
|
||||
#elif defined(PLATFORM_MAC) || defined(PLATFORM_LINUX)
|
||||
void* dl;
|
||||
char* path_copy = strdup(bin_path);
|
||||
char* bin_dir = dirname(path_copy);
|
||||
int path_size = snprintf(module_path, MAX_PATH, "%s/%s%s", bin_dir, module,
|
||||
MODULE_SUFFIX);
|
||||
free(path_copy);
|
||||
if (path_size < 0 || path_size > MAX_PATH) {
|
||||
fprintf(stderr, "Failed to calculate module path.\n");
|
||||
return;
|
||||
}
|
||||
module_path[path_size] = 0;
|
||||
|
||||
dl = dlopen(module_path, RTLD_LAZY);
|
||||
if (!dl) {
|
||||
fprintf(stderr, "Failed to open module: %s\n", module_path);
|
||||
return;
|
||||
}
|
||||
|
||||
funcptr = dlsym(dl, module_function);
|
||||
if (!funcptr) {
|
||||
fprintf(stderr, "Failed to find symbol: %s\n", module_function);
|
||||
return;
|
||||
}
|
||||
funcptr();
|
||||
|
||||
dlclose(dl);
|
||||
#endif
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
fprintf(stdout, "Hello from program.c\n");
|
||||
fflush(stdout);
|
||||
|
||||
#if defined(PLATFORM_WIN)
|
||||
if (!GetModuleFileName(NULL, bin_path, MAX_PATH)) {
|
||||
fprintf(stderr, "Failed to determine executable path.\n");
|
||||
return;
|
||||
}
|
||||
#elif defined(PLATFORM_MAC) || defined(PLATFORM_LINUX)
|
||||
// Using argv[0] should be OK here since we control how the tests run, and
|
||||
// can avoid exec and such issues that make it unreliable.
|
||||
if (!realpath(argv[0], bin_path)) {
|
||||
fprintf(stderr, "Failed to determine executable path (%s).\n", argv[0]);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
CallModule("lib1");
|
||||
CallModule("lib2");
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user