{"id":21020200,"url":"https://github.com/bringhurst/orcm","last_synced_at":"2026-04-21T16:01:51.228Z","repository":{"id":137018878,"uuid":"1843216","full_name":"bringhurst/orcm","owner":"bringhurst","description":null,"archived":false,"fork":false,"pushed_at":"2011-06-03T16:14:51.000Z","size":1180,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-01-01T18:40:46.242Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bringhurst.png","metadata":{"files":{"readme":"README","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2011-06-03T16:11:11.000Z","updated_at":"2013-09-29T05:06:08.000Z","dependencies_parsed_at":"2023-05-27T08:15:57.391Z","dependency_job_id":null,"html_url":"https://github.com/bringhurst/orcm","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/bringhurst/orcm","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bringhurst%2Forcm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bringhurst%2Forcm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bringhurst%2Forcm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bringhurst%2Forcm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bringhurst","download_url":"https://codeload.github.com/bringhurst/orcm/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bringhurst%2Forcm/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32099196,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-21T11:25:29.218Z","status":"ssl_error","status_checked_at":"2026-04-21T11:25:28.499Z","response_time":128,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-19T10:36:08.524Z","updated_at":"2026-04-21T16:01:51.211Z","avatar_url":"https://github.com/bringhurst.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"-*- text -*-\n\nopenrcm is a fairly straightforward AC/AM/LT project.  Its output is a\ntop-level libopenrcm.la (libopenrcm.so/dylib/etc).  \n\n* Its AC usage is minimal.  It's not really checking for much; it's\n  mainly calling the magic macros to setup various tools (AC, AM, LT).\n  AC's role in openrcm is 99% relegated to the contents of\n  configure.ac.  \n\n  The one notable thing that configure.ac does is look for\n  opal/mca/mca.h (i.e., Open MPI's \"mca.h\") and libopen-rte.  I have\n  been configuring Open MPI --with-devel-headers and then configuring\n  openrcm with\n\n  ./configure CPPFLAGS=-I/path/to/openmpi/prefix/include/openmpi \\\n        LDFLAGS=-L/path/to/openmpi/prefix\n\n  Specifically, OMPI's --with-devel-headers installs all of its\n  headers under $prefix/include/openmpi.  If the openrcm configure\n  script can't find opal/mca/mca.h, it'll error/abort.  Similarly, if\n  it can't \"-lopen-rte\" successfully, it'll error/abort.\n\n  Note that libopenrcm.so is installed with a built-in rpath dependency to\n  libopen-rte.so, so you should be able to create openrcm apps with\n  just \"-lopenrcm\" (meaning that it'll automatically link in libopen-rte\n  and libopen-pal automatically -- no need to be specifically\n  mentioned on the link command line).\n\n* Its AM usage is very straightforward -- I made *no* optimizations\n  (especially as compared to OMPI's AM usage).  As such, if the \"make\"\n  process gets too long, there are a bunch of things that can be done\n  to speed up the process.  But in the name of simplicity (and because\n  the openrcm code base is much smaller than OMPI's code base), I did\n  zero optimizations to start with.  They can always be added later.\n  AM's role in openrcm is to have a Makefile.am in every single\n  directory.  It provides the entire \"make\" infrastructure, including\n  all the common targets (\"make all\", \"make clean\", \"make install\",\n  etc.).  Its Makefiles support VPATH building and parallel builds.\n\n* Its LT usage is also trivially straightforward: the use of the\n  LTLIBRARIES suffix in Makefile.am files will automatically invoke\n  the right Libtool magic to build libraries.  The use of\n  \"noinst_LTLIBRARIES\" a) tells AM to not install a given library (but\n  build it anyway) and b) tells AM/LT that that library will be\n  slurped up into a higher-level library in a higher-level directory.\n\nI defaulted to building dynamic libraries only under the assumption\nthat multiple processes running on the same processor on the OPENRCM will\nbe using libopenrcm.  As such, libopenrcm.so will only be loaded into memory\n*once* by the OS, and will therefore save RAM.\n\nI also defaulted to slurping all components into libopenrcm.so\n(vs. building individual DSOs that are dlopen'ed at run-time).  This\nalso is a space-saving technique (DSOs consume multiples of 1MB of RAM\nwhen dlopen'ed, IIRC...?  Packing them all together in a shared\nlibrary is much more efficient).\n\nI moved all source code under the \"src\" tree (arbitrarily; feel free\nto move it wherever you want).  src/mca is the MCA tree root for\nopenrcm; under there is the same conventions that we use in OMPI:\nsrc/mca/\u003cframework\u003e/\u003ccomponent\u003e.\n\nThere is a top-level VERSION file that controls the openrcm version;\nit's identical to OMPI's VERSION file and usage.  If you don't need\nthis, it's easy to remove (and have a single, hard-coded version\nnumber in configure.ac).\n\nNote that the use of SUBDIRS in Makefile.am tells AM which\nsubdirectories to traverse.  ORDER IS IMPORTANT!  The subdirectories\nare traversed left-to-right.\n\nSee mca/Makefile.am for some specific comments and suggestions about\nhow to use AM / write Makefile.am's.\n\nThis project has two dummy frameworks and two dummy components each:\n\nFramework: foo\n  Component: aaa\n  Component: bbb\nFramework: bar\n  Component: ccc\n  Component: ddd\n\nAll of the component methods mainly opal_output their __func__ names,\njust so that you can see them invoked.  The component open/close\nfunctions are minimally functional as examples.\n\nThe autogen.sh is a single line (woot).  It has none of the complexity\nof OMPI's autogen.sh, but that comes at a cost: to add a framework\nand/or a component, you have to perform a bunch of manual steps.  I\nalso assumed that all frameworks and components will always build;\nthere is no conditional logic to decide at autogen.sh- or\nconfigure-time build a component or not.  The logic and automation\nfrom Open MPI's configure/build can selectively be added if you\nwant/need specific features.\n\nTO ADD A FRAMEWORK:\n-------------------\n\nmkdir -p mca/\u003cframework\u003e/base\ncreate mca/\u003cframework\u003e/base/Makefile.am:\n  - have it create libmca_\u003cframework\u003e_base.la\ncreate mca/\u003cframework\u003e/base/components.h:\n  - create openrcm_\u003cframework\u003e_base_components array (empty)\ncreate mca/\u003cframework\u003e/\u003cframework\u003e.h\n  - define openrcm_\u003cframework\u003e_base_component_\u003cversion\u003e_t struct\n  - define openrcm_\u003cframework\u003e_base_module_\u003cversion\u003e_t struct\ncreate mca/\u003cframework\u003e/Makefile.am:\n  - have it create libmca_\u003cframework\u003e.la\n  - have libmca_\u003cframework\u003e.la slurp in base/libmca_\u003cframework\u003e_base.la\nadd the 2 new Makefiles to AC_CONFIG_FILES in configure.ac\nedit mca/Makefile.am:\n  - add \u003cframework\u003e to SUBDIRS\n  - have it slurp in the new libmca_\u003cframework\u003e.la\nadd relevant calls to \u003cframework\u003e open/close/whatever in your C source code\nre-run autogen.sh and configure and make\n\nTO ADD A COMPONENT:\n-------------------\n\nmkdir mca/\u003cframework\u003e/\u003ccomponent\u003e\ncreate mca/\u003cframework\u003e/\u003ccomponent\u003e/Makefile.am:\n  - have it create libmca_\u003cframework\u003e_\u003ccomponent\u003e.la\nedit mca/\u003cframework\u003e/Makefile.am:\n  - add \u003ccomponent\u003e to SUBDIRS\n  - have libmca_\u003cframework\u003e.la slurp in \n    \u003ccomponent\u003e/libmca_\u003cframework\u003e_\u003ccomponent\u003e.la\nadd mca/\u003cframework\u003e/\u003ccomponent\u003e/Makefile to AC_CONFIG_FILES in configure.ac\nedit mca/\u003cframework\u003e/base/public.h\n  - extern const openrcm_\u003cframework\u003e_base_component_t *openrcm_\u003cframework\u003e_base_components[];\nedit the open function in mca/\u003cframework\u003e/base\n  - add #include for your component that externs its component struct\n  - add mca_\u003cframework\u003e_\u003ccomponent\u003e_component to\n    openrcm_\u003cframework\u003e_base_components[] array\nre-run autogen.sh and configure and make\n\nThis is off the top of my head, so try it yourself and add in any\nsteps that I forgot to list.  :-)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbringhurst%2Forcm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbringhurst%2Forcm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbringhurst%2Forcm/lists"}