diff --git a/make/gcc-linux.mk b/make/gcc-linux.mk index d34ecf04..490b314c 100644 --- a/make/gcc-linux.mk +++ b/make/gcc-linux.mk @@ -22,10 +22,10 @@ endef # --- Required rule definitions --- -# 1 2 -# Usage: $(call compile,src,includes) +# 1 2 3 +# Usage: $(call compile,src,includes,xflags) define compile - $(CXX) $(CPPFLAGS) $(CXXFLAGS) \ + $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(3)\ $(call depflags,$(basename $(call src_to_obj,$(1)))) \ $(foreach I,$(2),-I$(I)) \ -c $(1) -o $(call src_to_obj,$(1)) diff --git a/make/libtool.mk b/make/libtool.mk index e68bea4c..34b0fe2c 100644 --- a/make/libtool.mk +++ b/make/libtool.mk @@ -37,10 +37,10 @@ endif # --- Required rule definitions --- -# 1 2 -# Usage: $(call compile,src,includes) +# 1 2 3 +# Usage: $(call compile,src,includes,xflags) define compile - $(CXX) $(CXXFLAGS) \ + $(CXX) $(CXXFLAGS) $(3) \ $(call depflags,$(basename $(call src_to_obj,$(1)))) \ $(foreach I,$(2),-I$(I)) \ $(CPPFLAGS) \ diff --git a/make/mingw.mk b/make/mingw.mk index fbfbee9e..235149ff 100644 --- a/make/mingw.mk +++ b/make/mingw.mk @@ -15,10 +15,10 @@ endef # --- Required rule definitions --- -# 1 2 -# Usage: $(call compile,src,includes) +# 1 2 3 +# Usage: $(call compile,src,includes,xflags) define compile - $(CXX) $(CPPFLAGS) $(CXXFLAGS) \ + $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(3) \ $(call depflags,$(basename $(call src_to_obj,$(1)))) \ $(foreach I,$(2),-I$(I)) \ -c $(1) -o $(call src_to_obj,$(1)) diff --git a/make/msvc.mk b/make/msvc.mk index 4af234c3..1dafbcf0 100644 --- a/make/msvc.mk +++ b/make/msvc.mk @@ -24,10 +24,10 @@ clean:: # --- Required rule definitions --- -# 1 2 -# Usage: $(call compile,src,includes) +# 1 2 3 +# Usage: $(call compile,src,includes,xflags) define compile - cl -nologo -O2 -Zi -Gy -EHsc -MD -TP -GR $(CPPFLAGS) $(CXXFLAGS) \ + cl -nologo -O2 -Zi -Gy -EHsc -MD -TP -GR $(CPPFLAGS) $(CXXFLAGS) $(3) \ $(foreach I,$(2),-I$(I)) \ -c $(1) -Fo$(call src_to_obj,$(1)) endef diff --git a/qpdf/build.mk b/qpdf/build.mk index 21e7bb17..40de3617 100644 --- a/qpdf/build.mk +++ b/qpdf/build.mk @@ -18,6 +18,9 @@ TC_SRCS_qpdf = $(wildcard libqpdf/*.cc) $(wildcard qpdf/*.cc) # ----- +XCXXFLAGS_qpdf_qpdf := $(WINDOWS_WMAIN_COMPILE) +XLDFLAGS_qpdf_qpdf := $(WINDOWS_WMAIN_LINK) + $(foreach B,$(BINS_qpdf),$(eval \ OBJS_$(B) = $(call src_to_obj,qpdf/$(B).cc))) $(foreach B,$(CBINS_qpdf),$(eval \ @@ -29,7 +32,7 @@ endif $(foreach B,$(BINS_qpdf),$(eval \ $(OBJS_$(B)): qpdf/$(OUTPUT_DIR)/%.$(OBJ): qpdf/$(B).cc ; \ - $(call compile,qpdf/$(B).cc,$(INCLUDES_qpdf)))) + $(call compile,qpdf/$(B).cc,$(INCLUDES_qpdf),$(XCXXFLAGS_qpdf_$(B))))) $(foreach B,$(CBINS_qpdf),$(eval \ $(OBJS_$(B)): qpdf/$(OUTPUT_DIR)/%.$(OBJ): qpdf/$(B).c ; \ @@ -37,4 +40,4 @@ $(foreach B,$(CBINS_qpdf),$(eval \ $(foreach B,$(BINS_qpdf) $(CBINS_qpdf),$(eval \ qpdf/$(OUTPUT_DIR)/$(call binname,$(B)): $(OBJS_$(B)) ; \ - $(call makebin,$(OBJS_$(B)),$$@,$(LDFLAGS_libqpdf) $(LDFLAGS),$(LIBS_libqpdf) $(LIBS)))) + $(call makebin,$(OBJS_$(B)),$$@,$(LDFLAGS_libqpdf) $(LDFLAGS) $(XLDFLAGS_qpdf_$(B)),$(LIBS_libqpdf) $(LIBS)))) diff --git a/qpdf/qpdf.cc b/qpdf/qpdf.cc index 81ccdd0f..be6e7f56 100644 --- a/qpdf/qpdf.cc +++ b/qpdf/qpdf.cc @@ -4268,7 +4268,7 @@ static void write_outfile(QPDF& pdf, Options& o) } } -int main(int argc, char* argv[]) +int realmain(int argc, char* argv[]) { whoami = QUtil::getWhoami(argv[0]); QUtil::setLineBuf(stdout); @@ -4336,3 +4336,47 @@ int main(int argc, char* argv[]) return 0; } + +#ifdef WINDOWS_WMAIN + +extern "C" +int wmain(int argc, wchar_t* argv[]) +{ + // If wmain is supported, argv contains UTF-16-encoded strings + // with a 16-bit wchar_t. Convert this to UTF-8-encoded strings + // for compatibility with other systems. That way the rest of + // qpdf.cc can just act like arguments are UTF-8. + std::vector > utf8_argv; + for (int i = 0; i < argc; ++i) + { + std::string utf16; + for (size_t j = 0; j < wcslen(argv[i]); ++j) + { + unsigned short codepoint = static_cast(argv[i][j]); + utf16.append(1, static_cast(codepoint >> 8)); + utf16.append(1, static_cast(codepoint & 0xff)); + } + std::string utf8 = QUtil::utf16_to_utf8(utf16); + utf8_argv.push_back( + PointerHolder(true, QUtil::copy_string(utf8.c_str()))); + } + PointerHolder utf8_argv_ph = + PointerHolder(true, new char*[1+utf8_argv.size()]); + char** new_argv = utf8_argv_ph.getPointer(); + for (size_t i = 0; i < utf8_argv.size(); ++i) + { + new_argv[i] = utf8_argv.at(i).getPointer(); + } + argc = static_cast(utf8_argv.size()); + new_argv[argc] = 0; + return realmain(argc, new_argv); +} + +#else + +int main(int argc, char* argv[]) +{ + return realmain(argc, argv); +} + +#endif