Update to gcc 12.2 and clang 15.0.0 main
authorBernie Innocenti <bernie@codewiz.org>
Mon, 3 Oct 2022 02:14:14 +0000 (19:14 -0700)
committerBernie Innocenti <bernie@codewiz.org>
Mon, 3 Oct 2022 02:14:14 +0000 (19:14 -0700)
.gitignore [new file with mode: 0644]
Makefile
compile_flags.txt [new file with mode: 0644]
helloworld.cc
main.cc

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..cef70c1
--- /dev/null
@@ -0,0 +1,3 @@
+build
+gcm.cache
+hellomodules
index 764d97e4a9542ea415ac7d5ad212a1a771aafdfa..faff6265b525751fa789a5f5662c92be5468de1f 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,25 +1,58 @@
-#CXXFLAGS = -fmodules-ts -std=c++20
-#CXX = g++
+BUILD_DIR := build
+PREBUILT_DIR := $(BUILD_DIR)/prebuilt
+DIRS := $(BUILD_DIR) $(PREBUILT_DIR)
+
+#USE_CLANG := YES
+
+ifdef USE_CLANG
+
+CXX := clang++
+CXXFLAGS := \
+       -std=c++2b -stdlib=libc++ \
+       -fimplicit-modules -fimplicit-module-maps \
+       -fprebuilt-module-path=$(PREBUILT_DIR) \
+       -fmodules-cache-path=$(PREBUILT_DIR)
+#      -fmodule-map-file=/usr/include/c++/v1/module.modulemap
+#      -fbuiltin-module-map
+
+MODFLAGS := -Xclang -emit-module-interface
+
+else # COMPILER != clang
+
+CXX := g++
+CXXFLAGS := -std=c++2b -fmodules-ts
+MODFLAGS :=
+
+# libstdc++ 12.2 does not bundle pre-built modules:
+# g++ -std=c++2b -fmodules-ts -fmodule-header=system -x c++-system-header string iostream
+
+endif
 
 
-CXX = clang++
-CXXFLAGS = -std=c++20 -fimplicit-modules -fprebuilt-module-path=. -fmodules-cache-path=foo
 
 APP = hellomodules
 
 APP = hellomodules
-OBJS = main.o helloworld.o
-MODS = helloworld.pcm
+SRCS = main.cc helloworld.cc
+MODS = helloworld
 
 
-all: $(APP)
+OBJS = $(patsubst %.cc, build/%.o, $(SRCS))
+PCMS = $(patsubst %, $(PREBUILT_DIR)/%.pcm, $(MODS))
+
+all: $(DIRS) $(APP)
 
 clean:
        rm -f $(APP)
        rm -f $(OBJS)
 
 clean:
        rm -f $(APP)
        rm -f $(OBJS)
-       rm -f $(MODS)
+       rm -f $(PCMS)
+       rm -rf $(PREBUILT_DIR)
+       rm -rf gcm.cache
+
+$(DIRS):
+       mkdir -p $(DIRS)
 
 
-$(APP): $(OBJS)
-       $(CXX) $(CXXFLAGS) -o $@ $?
+$(APP): $(OBJS) $(PCMS)
+       $(CXX) $(CXXFLAGS) -o $@ $(OBJS)
 
 
-main.o: main.cc $(MODS)
-helloworld.o: helloworld.cc
+$(BUILD_DIR)/%.o: %.cc $(PCMS)
+       $(CXX) $(CXXFLAGS) -o $@ -c $<
 
 
-helloworld.pcm: helloworld.cc
-       $(CXX) $(CXXFLAGS) -Xclang -emit-module-interface -c helloworld.cc -o helloworld.pcm
+$(PREBUILT_DIR)/%.pcm: %.cc
+       $(CXX) $(MODFLAGS) $(CXXFLAGS) -o $@ -c $<
diff --git a/compile_flags.txt b/compile_flags.txt
new file mode 100644 (file)
index 0000000..82dcf06
--- /dev/null
@@ -0,0 +1,6 @@
+-std=c++2b
+-stdlib=libc++
+-fimplicit-modules
+-fimplicit-module-maps
+-fprebuilt-module-path=build/prebuilt
+-fmodules-cache-path=build/prebuilt
index c2075f04f4af2252bae7d5e9f1e9a73489f7cc79..0e4312dcce6c060c60136935c6b22ea52cee143e 100644 (file)
@@ -1,12 +1,15 @@
 module;
 
 module;
 
-#include <iostream>
-
 export module helloworld;
 
 export module helloworld;
 
+import <string>;
+import <iostream>;
+
 export class HelloWorld {
 public:
 export class HelloWorld {
 public:
-    void hello() {
-        std::cout << "hello\n";
+    std::string hello() {
+        std::cout << "hello, ";
+        std::string s = "world!";
+        return s;
     }
 };
     }
 };
diff --git a/main.cc b/main.cc
index 9221a3526e26d7f9b468c2a5fbf87a0a34cda42e..03bce8213a7d369334eb8488f6e75f229c4ec422 100644 (file)
--- a/main.cc
+++ b/main.cc
@@ -1,13 +1,15 @@
-//#include <string>
-
 import helloworld;
 import helloworld;
-//import <string>;
 
 
-int main() {
-    //std::string s = "foo";
+#ifdef __clang__
+    import std;
+#else  // not yet in GCC 12.2 :-(
+    import <string>;
+    import <iostream>;
+#endif
 
 
+int main() {
     helloworld:HelloWorld h;
     helloworld:HelloWorld h;
-    h.hello();
-
+    std::string s = h.hello();
+    std::cout << s << '\n';
     return 0;
 }
     return 0;
 }